kildclient-2.11.1/0000755000175000017500000000000011570463456010732 500000000000000kildclient-2.11.1/INSTALL0000644000175000017500000003633211324777651011714 00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 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. 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. kildclient-2.11.1/po/0000755000175000017500000000000011570463465011350 500000000000000kildclient-2.11.1/po/LINGUAS0000644000175000017500000000005311570463465012313 00000000000000#Set of available languages pt_BR eo sv de kildclient-2.11.1/po/kildclient.pot0000644000175000017500000017671311570463465014155 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-05-29 12:33-0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: src/main.c:76 msgid "Outputs version information and exits" msgstr "" #: src/main.c:78 msgid "Directory to store settings and saved worlds" msgstr "" #: src/main.c:78 msgid "DIR" msgstr "" #: src/main.c:80 msgid "" "Dumps all data received from (after decompression, if appropriate) to the " "file" msgstr "" #: src/main.c:81 src/main.c:84 msgid "FILE" msgstr "" #: src/main.c:83 msgid "Dumps all data received (possibly compressed) to the file" msgstr "" #. Parse command-line options #: src/main.c:122 msgid "[WORLD...]" msgstr "" #: src/main.c:129 #, c-format msgid "Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" msgstr "" #: src/main.c:134 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "" #: src/main.c:141 #, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "" #: src/main.c:287 msgid "There is one open world. Do you really want to quit?" msgstr "" #: src/main.c:293 #, c-format msgid "There are %d open worlds. Do you really want to quit?" msgstr "" #: src/main.c:296 msgid "Really Quit KildClient?" msgstr "" #: src/main.c:298 msgid "Don't quit" msgstr "" #: src/net.c:150 msgid "" "You're attempting to connect to a world that uses SSL, but this version of " "KildClient has been built without SSL support. Try to connect without SSL?" msgstr "" #: src/net.c:151 msgid "KildClient Question" msgstr "" #: src/net.c:153 msgid "Connect without SSL" msgstr "" #: src/net.c:154 msgid "Do not connect" msgstr "" #: src/net.c:168 msgid "This version of KildClient does not have SSL support." msgstr "" #: src/net.c:238 src/proxy.c:206 #, c-format msgid "Resolving proxy host %s..." msgstr "" #: src/net.c:241 #, c-format msgid "Resolving host %s..." msgstr "" #: src/net.c:272 src/proxy.c:224 msgid "Could not start name-resolution thread." msgstr "" #: src/net.c:324 src/proxy.c:190 #, c-format msgid "Could not resolve host %s: %s" msgstr "" #: src/net.c:352 #, c-format msgid "Attempting to connect to host %s (%s) port %s..." msgstr "" #: src/net.c:355 #, c-format msgid "Attempting to connect to proxy host %s (%s) port %s..." msgstr "" #: src/net.c:374 #, c-format msgid "Could not create socket: %s" msgstr "" #: src/net.c:377 #, c-format msgid "Could not create socket: error #%d" msgstr "" #: src/net.c:397 #, c-format msgid "Could not connect to host %s port %s: %s" msgstr "" #: src/net.c:407 #, c-format msgid "Could not connect to host %s port %s: Error #%d" msgstr "" #: src/net.c:463 #, c-format msgid "Unable to connect to host %s: %s." msgstr "" #: src/net.c:466 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "" #: src/net.c:508 src/net.c:526 #, c-format msgid "Unable to connect to host %s: Error #%d." msgstr "" #: src/net.c:511 src/net.c:529 #, c-format msgid "Unable to connect to proxy host %s: Error #%d." msgstr "" #: src/net.c:563 #, c-format msgid "Performing SSL handshake..." msgstr "" #: src/net.c:613 #, c-format msgid "SSL Handshake failed: %s" msgstr "" #: src/net.c:655 #, c-format msgid "SSL Handshake took too long." msgstr "" #: src/net.c:684 src/net.c:1510 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "" #: src/net.c:687 src/net.c:1513 #, c-format msgid "Connected to host %s port %s, via proxy %s (%s) port %s." msgstr "" #: src/net.c:694 src/net.c:1485 src/net.c:1520 msgid " SSL enabled." msgstr "" #: src/net.c:712 src/perlscript.c:3069 #, c-format msgid "Logging to file %s.\n" msgstr "" #: src/net.c:858 #, c-format msgid "Disconnected from host %s." msgstr "" #: src/net.c:931 src/net.c:940 #, c-format msgid "Disconnected from host %s: %s." msgstr "" #: src/net.c:951 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "" #: src/net.c:1473 #, c-format msgid "Connected to host %s (%s) port %s, MCCP version %d enabled." msgstr "" #: src/net.c:1477 #, c-format msgid "" "Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d " "enabled." msgstr "" #: src/net.c:1598 src/we_logging.c:135 msgid "Not connected." msgstr "" #. success #: src/proxy.c:61 msgid "general failure" msgstr "" #: src/proxy.c:62 msgid "connection not allowed by ruleset" msgstr "" #: src/proxy.c:63 msgid "network unreachable" msgstr "" #: src/proxy.c:64 msgid "host unreachable" msgstr "" #: src/proxy.c:65 msgid "connection refused by destination host" msgstr "" #: src/proxy.c:66 msgid "TTL expired" msgstr "" #: src/proxy.c:67 msgid "command not supported / protocol error" msgstr "" #: src/proxy.c:68 msgid "address type not supported" msgstr "" #: src/proxy.c:241 #, c-format msgid "Connected to proxy server %s port %s, sending request..." msgstr "" #: src/proxy.c:296 src/proxy.c:425 src/proxy.c:470 src/proxy.c:544 msgid "Error while reading from proxy host." msgstr "" #: src/proxy.c:317 msgid "request rejected or failed" msgstr "" #: src/proxy.c:321 msgid "request failed because identd could not be reached" msgstr "" #: src/proxy.c:325 msgid "" "request failed because client's identd could not confirm the user ID string " "in the request" msgstr "" #: src/proxy.c:329 src/proxy.c:570 #, c-format msgid "Proxy request failed: %s." msgstr "" #: src/proxy.c:346 #, c-format msgid "Connected to proxy server %s port %s, negotiating authentication..." msgstr "" #: src/proxy.c:440 msgid "No acceptable proxy authentication methods." msgstr "" #: src/proxy.c:488 msgid "Proxy authentication failed." msgstr "" #. Should never happen #: src/proxy.c:531 msgid "Unrecognized response from proxy host." msgstr "" #: src/proxy.c:565 msgid "unknown reason code" msgstr "" #: src/proxy.c:586 #, c-format msgid "Sending proxy authentication credentials..." msgstr "" #: src/proxy.c:625 #, c-format msgid "Sending connection request..." msgstr "" #: src/mainwindow.c:173 src/mainwindow.c:550 src/mainwindow.c:815 #: src/worldgui.c:1127 src/worldselector.c:195 src/worldeditor.c:182 #: src/we_general.c:344 src/we_generic_guied.c:83 src/we_triggers.c:85 #: src/we_triggers.c:555 src/we_triggers.c:753 src/we_aliases.c:78 #: src/we_aliases.c:457 src/we_macros.c:81 src/we_macros.c:422 #: src/we_timers.c:78 src/we_timers.c:459 src/we_hooks.c:89 src/we_hooks.c:609 #: src/we_vars.c:78 src/we_vars.c:380 src/prefs.c:109 src/triggers.c:585 #: src/multilinesend.c:95 src/cmdhistory.c:209 src/cmdhistory.c:454 #, c-format msgid "Error loading UI from XML file: %s" msgstr "" #: src/mainwindow.c:610 src/mainwindow.c:611 msgid "Not connected" msgstr "" #: src/mainwindow.c:751 msgid ": Not yet active" msgstr "" #: src/mainwindow.c:756 msgid ": Expired" msgstr "" #: src/mainwindow.c:768 src/dlgStatistics.glade:81 src/dlgStatistics.glade:346 msgid "None" msgstr "" #: src/worldgui.c:227 msgid "_Find:" msgstr "" #: src/worldgui.c:241 msgid "Find Next" msgstr "" #: src/worldgui.c:273 msgid "Click to clear the command input area." msgstr "" #: src/worldgui.c:374 msgid "No world" msgstr "" #: src/worldgui.c:448 msgid "KildClient ready" msgstr "" #: src/worldgui.c:455 msgid "0 lines" msgstr "" #: src/worldgui.c:910 msgid "Are you sure you want to close this world?" msgstr "" #: src/worldgui.c:911 msgid "Really close?" msgstr "" #. Keep Open is RESPONSE_NO because of NO close. But we use #. STOCK_YES to pass a positive image. #: src/worldgui.c:914 msgid "Keep _open" msgstr "" #: src/worldgui.c:1058 #, c-format msgid "Error setting spell checker: %s\n" msgstr "" #: src/worldgui.c:1062 msgid "Spell checking support not included in this build." msgstr "" #: src/worldgui.c:1341 msgid "Click to open link; right-click for more options." msgstr "" #: src/worldgui.c:1503 msgid "Not found" msgstr "" #: src/ansitextview.c:438 msgid "1 line" msgstr "" #: src/ansitextview.c:440 #, c-format msgid "%d lines" msgstr "" #: src/worldselector.c:140 src/worldselector.c:690 #, c-format msgid "Could not load world from file '%s': %s" msgstr "" #: src/worldselector.c:143 src/worldselector.c:693 src/worlds.c:2284 #: src/we_generic_guied.c:312 src/we_generic_guied.c:401 src/prefs.c:451 #: src/prefs.c:530 msgid "KildClient Error" msgstr "" #: src/worldselector.c:496 #, c-format msgid "Could not open world '%s': %s\n" msgstr "" #: src/worldselector.c:538 #, c-format msgid "Invalid argument '%s'\n" msgstr "" #: src/worldselector.c:811 msgid "Disconnected" msgstr "" #: src/worldselector.c:814 src/worldselector.c:821 msgid "Reconnect" msgstr "" #: src/worldselector.c:815 src/worldselector.c:822 msgid "Connect to another world" msgstr "" #: src/worldselector.c:816 msgid "Offline" msgstr "" #: src/worlds.c:690 msgid "Unnamed world" msgstr "" #: src/worlds.c:747 #, c-format msgid "Could not open file: %s" msgstr "" #: src/worlds.c:810 #, c-format msgid "Invalid top-level element '%s'" msgstr "" #: src/worlds.c:1624 #, c-format msgid "Internal error: element '%s' ends when in START mode" msgstr "" #: src/worlds.c:1898 #, c-format msgid "Invalid key code '%s'" msgstr "" #: src/worlds.c:1917 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "" #: src/worlds.c:1930 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "" #: src/worlds.c:2281 src/we_generic_guied.c:309 src/prefs.c:448 #, c-format msgid "Could not open file '%s': %s" msgstr "" #: src/worlds.c:2440 #, c-format msgid "Disconnected from world %s" msgstr "" #: src/worldeditor.c:247 msgid "General" msgstr "" #: src/worldeditor.c:255 src/worldeditor.c:259 msgid "Display" msgstr "" #: src/worldeditor.c:256 msgid "Here you can set options to configure the appearance of KildClient." msgstr "" #: src/worldeditor.c:267 msgid "Main Window" msgstr "" #: src/worldeditor.c:275 msgid "Colors" msgstr "" #: src/worldeditor.c:283 msgid "Status Bar" msgstr "" #: src/worldeditor.c:291 msgid "Input" msgstr "" #: src/worldeditor.c:299 msgid "Logging" msgstr "" #: src/worldeditor.c:305 src/worldeditor.c:309 msgid "Automation" msgstr "" #: src/worldeditor.c:306 msgid "" "Here you can set options to configure the automation features of KildClient, " "such as triggers, aliases, plugins, etc." msgstr "" #: src/worldeditor.c:317 msgid "Scripting" msgstr "" #: src/worldeditor.c:325 msgid "Plugins" msgstr "" #: src/worldeditor.c:336 src/kildclient.glade:1808 msgid "Triggers" msgstr "" #: src/worldeditor.c:347 src/kildclient.glade:1822 msgid "Aliases" msgstr "" #: src/worldeditor.c:358 src/kildclient.glade:1838 msgid "Macros" msgstr "" #: src/worldeditor.c:369 src/kildclient.glade:1854 msgid "Timers" msgstr "" #: src/worldeditor.c:380 msgid "Hooks" msgstr "" #: src/worldeditor.c:391 msgid "Variables" msgstr "" #: src/worldeditor.c:400 msgid "Protocols" msgstr "" #: src/worldeditor.c:408 msgid "Miscellaneous" msgstr "" #: src/worldeditor.c:416 msgid "Advanced" msgstr "" #: src/we_general.c:75 msgid "Character" msgstr "" #: src/we_general.c:83 msgid "Password" msgstr "" #: src/we_general.c:383 msgid "You must specify the name." msgstr "" #: src/we_general.c:384 src/we_general.c:397 src/we_triggers.c:638 #: src/we_triggers.c:652 src/we_aliases.c:519 src/we_aliases.c:532 #: src/we_macros.c:479 src/we_macros.c:492 src/we_macros.c:505 #: src/we_timers.c:518 src/we_timers.c:531 src/we_hooks.c:661 #: src/we_vars.c:408 src/we_vars.c:420 src/we_vars.c:440 #: src/permanentvariables.c:131 src/cmdhistory.c:278 src/cmdhistory.c:290 #: src/cmdhistory.c:484 src/cmdhistory.c:517 src/cmdhistory.c:574 msgid "KildClient Warning" msgstr "" #: src/we_general.c:396 msgid "You must specify the password." msgstr "" #: src/we_general.c:438 msgid "character" msgstr "" #: src/we_logging.c:124 #, c-format msgid "Logging to file %s." msgstr "" #: src/we_logging.c:130 msgid "Logging is disabled." msgstr "" #: src/we_logging.c:227 msgid "Logging not started" msgstr "" #: src/we_logging.c:257 msgid "Select log file" msgstr "" #: src/we_plugins.c:126 src/we_plugins.c:343 src/we_triggers.c:227 #: src/we_aliases.c:208 src/we_macros.c:211 src/we_timers.c:208 #: src/we_hooks.c:330 src/perlscript.c:3195 msgid "Name" msgstr "" #: src/we_plugins.c:138 src/we_plugins.c:385 src/perlscript.c:3196 msgid "Description" msgstr "" #: src/we_plugins.c:150 src/we_plugins.c:371 msgid "Author" msgstr "" #: src/we_plugins.c:163 msgid "File" msgstr "" #: src/we_plugins.c:211 src/we_plugins.c:467 msgid "Error Loading Plugin" msgstr "" #: src/we_plugins.c:329 src/we_triggers.c:213 src/we_aliases.c:194 #: src/we_macros.c:197 src/we_timers.c:194 src/we_hooks.c:316 msgid "Enabled" msgstr "" #: src/we_plugins.c:357 msgid "Version" msgstr "" #: src/we_plugins.c:445 msgid "Always load this plugin at _startup" msgstr "" #: src/we_plugins.c:507 msgid "The help is displayed in main window." msgstr "" #: src/we_plugins.c:508 msgid "KildClient Information" msgstr "" #: src/we_plugins.c:509 msgid "_Do not display this message again" msgstr "" #: src/we_plugins.c:581 msgid "Load plugin" msgstr "" #: src/we_generic_guied.c:96 msgid "Export" msgstr "" #: src/we_generic_guied.c:363 msgid "Import" msgstr "" #: src/we_generic_guied.c:398 #, c-format msgid "Could not import file '%s': %s" msgstr "" #: src/we_generic_guied.c:952 #, c-format msgid "Do you really want to delete the %s?" msgstr "" #: src/we_generic_guied.c:959 #, c-format msgid "Do you really want to delete %d %s?" msgstr "" #: src/we_generic_guied.c:963 src/we_vars.c:292 msgid "Confirm deletion" msgstr "" #: src/we_generic_guied.c:964 msgid "Do not delete" msgstr "" #: src/we_generic_guied.c:972 msgid "Delete" msgstr "" #: src/we_triggers.c:132 src/dlgTestTriggers.glade:7 msgid "Test Triggers" msgstr "" #: src/we_triggers.c:241 src/we_aliases.c:222 src/triggers.c:449 #: src/aliases.c:171 msgid "Pattern" msgstr "" #: src/we_triggers.c:259 src/we_aliases.c:240 msgid "I. Case" msgstr "" #: src/we_triggers.c:273 src/we_macros.c:239 src/we_timers.c:248 #: src/we_hooks.c:344 src/triggers.c:450 src/macros.c:147 src/timers.c:205 msgid "Action" msgstr "" #: src/we_triggers.c:291 msgid "Gag" msgstr "" #: src/we_triggers.c:309 msgid "Gag Log" msgstr "" #: src/we_triggers.c:327 msgid "Keep Exec" msgstr "" #: src/we_triggers.c:345 msgid "Rewriter" msgstr "" #: src/we_triggers.c:363 msgid "Style" msgstr "" #: src/we_triggers.c:377 src/we_aliases.c:286 src/we_macros.c:253 #: src/we_timers.c:280 src/we_hooks.c:358 msgid "Plugin" msgstr "" #: src/we_triggers.c:473 share/kildclient.pl:233 share/kildclient.pl:236 #: share/kildclient.pl:443 share/kildclient.pl:518 share/kildclient.pl:721 msgid "trigger" msgstr "" #: src/we_triggers.c:473 share/kildclient.pl:443 msgid "triggers" msgstr "" #: src/we_triggers.c:637 src/we_aliases.c:518 msgid "You must specify the pattern." msgstr "" #: src/we_triggers.c:651 msgid "" "You must specify the action, unless the trigger is a gag or changes the " "style." msgstr "" #: src/we_aliases.c:254 src/aliases.c:172 msgid "Substitution" msgstr "" #: src/we_aliases.c:272 msgid "Eval as Perl" msgstr "" #: src/we_aliases.c:382 share/kildclient.pl:246 share/kildclient.pl:249 #: share/kildclient.pl:449 share/kildclient.pl:524 share/kildclient.pl:733 msgid "alias" msgstr "" #: src/we_aliases.c:382 share/kildclient.pl:449 msgid "aliases" msgstr "" #: src/we_aliases.c:531 msgid "You must specify the substitution." msgstr "" #: src/we_macros.c:225 src/macros.c:146 msgid "Key" msgstr "" #: src/we_macros.c:349 share/kildclient.pl:259 share/kildclient.pl:262 #: share/kildclient.pl:455 share/kildclient.pl:530 share/kildclient.pl:745 msgid "macro" msgstr "" #: src/we_macros.c:349 share/kildclient.pl:455 msgid "macros" msgstr "" #: src/we_macros.c:478 msgid "You must specify the key." msgstr "" #: src/we_macros.c:491 msgid "Invalid key code." msgstr "" #: src/we_macros.c:504 src/we_timers.c:530 src/we_hooks.c:660 msgid "You must specify the action." msgstr "" #: src/we_timers.c:221 msgid "Interval" msgstr "" #: src/we_timers.c:234 msgid "Count" msgstr "" #: src/we_timers.c:266 msgid "Temp" msgstr "" #: src/we_timers.c:383 share/kildclient.pl:272 share/kildclient.pl:275 #: share/kildclient.pl:461 share/kildclient.pl:536 share/kildclient.pl:757 msgid "timer" msgstr "" #: src/we_timers.c:383 share/kildclient.pl:461 msgid "timers" msgstr "" #: src/we_timers.c:517 msgid "The interval must be positive." msgstr "" #. The manually added combo for selecting which hook #: src/we_hooks.c:132 msgid "_Event:" msgstr "" #: src/we_hooks.c:536 share/kildclient.pl:286 share/kildclient.pl:289 #: share/kildclient.pl:467 share/kildclient.pl:543 share/kildclient.pl:770 msgid "hook" msgstr "" #: src/we_hooks.c:536 share/kildclient.pl:467 msgid "hooks" msgstr "" #: src/we_vars.c:283 msgid "Do you really want to make the variable temporary?" msgstr "" #: src/we_vars.c:289 #, c-format msgid "Do you really want to make %d variables temporary?" msgstr "" #: src/we_vars.c:293 msgid "Keep permanent" msgstr "" #: src/we_vars.c:301 msgid "Make temporary" msgstr "" #: src/we_vars.c:407 msgid "You must specify a variable name." msgstr "" #: src/we_vars.c:419 #, c-format msgid "" "Only scalar ($), array (@) and hash (%%) variables can be made permanent." msgstr "" #: src/we_vars.c:438 #, c-format msgid "%s is already permanent." msgstr "" #: src/prefs.c:401 #, c-format msgid "Invalid window size specification in config file.\n" msgstr "" #: src/prefs.c:421 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "" #: src/prefs.c:527 #, c-format msgid "Could not create directory '%s': %s" msgstr "" #: src/parser.c:148 msgid "" "Warning: Trying to send a very long command line. Perhaps a recursive alias " "definition?" msgstr "" #: src/triggers.c:448 #, c-format msgid "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" msgstr "" #: src/triggers.c:470 src/triggers.c:471 src/triggers.c:472 src/triggers.c:473 #: src/triggers.c:474 src/triggers.c:475 src/triggers.c:476 src/aliases.c:192 #: src/aliases.c:193 src/aliases.c:194 src/macros.c:169 src/timers.c:228 #: src/timers.c:229 src/hooks.c:188 src/perlscript.c:3215 msgid "y" msgstr "" #: src/triggers.c:470 src/triggers.c:471 src/triggers.c:472 src/triggers.c:473 #: src/triggers.c:474 src/triggers.c:475 src/triggers.c:476 src/aliases.c:192 #: src/aliases.c:193 src/aliases.c:194 src/macros.c:169 src/timers.c:228 #: src/timers.c:229 src/hooks.c:188 src/perlscript.c:3215 msgid "n" msgstr "" #: src/triggers.c:668 msgid "No" msgstr "" #: src/triggers.c:668 msgid "Yes" msgstr "" #: src/aliases.c:170 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "" #: src/macros.c:145 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "" #: src/timers.c:197 msgid "Num Ena Temp Int " msgstr "" #: src/timers.c:201 msgid "Count " msgstr "" #: src/permanentvariables.c:127 #, c-format msgid "" "Could not open file '%s': %s\n" "Variables were not saved." msgstr "" #: src/hooks.c:62 #, c-format msgid "hook: hook '%s' not found\n" msgstr "" #: src/hooks.c:78 src/hooks.c:211 msgid "No such hook" msgstr "" #: src/hooks.c:160 src/hooks.c:206 msgid "Hook not found" msgstr "" #: src/hooks.c:173 #, c-format msgid "Hooks for '%s':\n" msgstr "" #: src/hooks.c:174 msgid "Num Ena Action" msgstr "" #: src/hooks.c:216 #, c-format msgid "" "Hook number %d for event %s\n" " Name: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" #: src/hooks.c:222 src/perlscript.c:1532 src/perlscript.c:2033 #: src/perlscript.c:2343 src/perlscript.c:2625 msgid "Not set" msgstr "" #: src/hooks.c:224 src/perlscript.c:1535 src/perlscript.c:1536 #: src/perlscript.c:1537 src/perlscript.c:1538 src/perlscript.c:1539 #: src/perlscript.c:1540 src/perlscript.c:1541 src/perlscript.c:2036 #: src/perlscript.c:2037 src/perlscript.c:2038 src/perlscript.c:2346 #: src/perlscript.c:2629 src/perlscript.c:2630 src/perlscript.c:3253 msgid "yes" msgstr "" #: src/hooks.c:224 src/perlscript.c:1535 src/perlscript.c:1536 #: src/perlscript.c:1537 src/perlscript.c:1538 src/perlscript.c:1539 #: src/perlscript.c:1540 src/perlscript.c:1541 src/perlscript.c:2036 #: src/perlscript.c:2037 src/perlscript.c:2038 src/perlscript.c:2346 #: src/perlscript.c:2629 src/perlscript.c:2630 src/perlscript.c:3253 msgid "no" msgstr "" #: src/log.c:97 msgid "File name not specified." msgstr "" #: src/log.c:161 msgid "Could not open log file." msgstr "" #: src/plugins.c:104 src/plugins.c:161 #, c-format msgid "Failed loading file %s: %s" msgstr "" #: src/cmdhistory.c:277 msgid "No command selected." msgstr "" #: src/cmdhistory.c:289 msgid "More than one command selected." msgstr "" #: src/cmdhistory.c:483 msgid "Enter some text to search for." msgstr "" #: src/cmdhistory.c:516 msgid "Use the Find button to find the first result." msgstr "" #: src/cmdhistory.c:573 msgid "Command not found." msgstr "" #: src/perlscript.c:430 src/perlscript.c:436 src/perlscript.c:443 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "" #: src/perlscript.c:585 src/perlscript.c:602 src/perlscript.c:664 #: src/perlscript.c:697 src/perlscript.c:1075 src/perlscript.c:1101 #: src/perlscript.c:1151 src/perlscript.c:1171 src/perlscript.c:1194 #: src/perlscript.c:1222 src/perlscript.c:1231 src/perlscript.c:1773 #: src/perlscript.c:1782 src/perlscript.c:1962 src/perlscript.c:2133 #: src/perlscript.c:2142 src/perlscript.c:2422 src/perlscript.c:2431 #: src/perlscript.c:2700 src/perlscript.c:2754 src/perlscript.c:2799 #: src/perlscript.c:2864 src/perlscript.c:2875 src/perlscript.c:2967 #: src/perlscript.c:3300 src/kcwin.c:98 #, c-format msgid "%s: Too few arguments" msgstr "" #: src/perlscript.c:630 #, c-format msgid "%s: Argument must be numeric" msgstr "" #: src/perlscript.c:678 src/perlscript.c:710 #, c-format msgid "%s: No such world" msgstr "" #: src/perlscript.c:745 msgid "World saved." msgstr "" #: src/perlscript.c:969 src/perlscript.c:984 src/perlscript.c:994 #, c-format msgid "%s: This is an internal function, do not call directly." msgstr "" #: src/perlscript.c:973 src/perlscript.c:1353 src/perlscript.c:1884 #: src/perlscript.c:2258 src/perlscript.c:2453 src/perlscript.c:2928 #, c-format msgid "%s: Wrong argument type" msgstr "" #: src/perlscript.c:1245 src/perlscript.c:1515 msgid "No such trigger" msgstr "" #: src/perlscript.c:1263 src/perlscript.c:1814 src/perlscript.c:2187 #: src/perlscript.c:2887 #, c-format msgid "%s: Too many string arguments" msgstr "" #: src/perlscript.c:1286 src/perlscript.c:1837 #, c-format msgid "%s: pattern given twice, using the named attribute one" msgstr "" #: src/perlscript.c:1298 src/perlscript.c:2236 src/perlscript.c:2907 #, c-format msgid "%s: action given twice, using the named attribute one" msgstr "" #: src/perlscript.c:1344 src/perlscript.c:1875 src/perlscript.c:2249 #: src/perlscript.c:2920 #, c-format msgid "%s: Wrong type of reference" msgstr "" #: src/perlscript.c:1364 #, c-format msgid "%s: pattern not specified, not creating" msgstr "" #: src/perlscript.c:1373 #, c-format msgid "%s: action not specified, and isn't gag, not creating" msgstr "" #: src/perlscript.c:1403 msgid "Trigger added." msgstr "" #: src/perlscript.c:1409 msgid "Trigger modified." msgstr "" #: src/perlscript.c:1434 #, c-format msgid "%s: invalid target" msgstr "" #: src/perlscript.c:1444 #, c-format msgid "%s: invalid fg color" msgstr "" #: src/perlscript.c:1454 #, c-format msgid "%s: invalid bg color" msgstr "" #: src/perlscript.c:1464 #, c-format msgid "%s: invalid underline style" msgstr "" #: src/perlscript.c:1520 #, c-format msgid "" "Trigger number %d\n" " Name: %s\n" " Pattern: %s\n" " Action: %s\n" " Enabled: %s\n" " Ignore case: %s\n" " Gag output: %s\n" " Gag in log: %s\n" " Keep executing: %s\n" " Rewriter: %s\n" " Change style: %s\n" msgstr "" #: src/perlscript.c:1544 #, c-format msgid "" " Target: %d\n" " Foreground: %d\n" " Background: %d\n" " Italics: %d\n" " Striked-thru: %d\n" " Underline: %d\n" msgstr "" #: src/perlscript.c:1796 src/perlscript.c:2020 msgid "No such alias" msgstr "" #: src/perlscript.c:1849 #, c-format msgid "%s: substitution given twice, using the named attribute one" msgstr "" #: src/perlscript.c:1895 msgid "alias: not creating alias without pattern" msgstr "" #: src/perlscript.c:1903 msgid "alias: not creating alias without substitution" msgstr "" #: src/perlscript.c:1932 msgid "Alias added." msgstr "" #: src/perlscript.c:1937 msgid "Alias modified." msgstr "" #: src/perlscript.c:2025 #, c-format msgid "" "Alias number %d\n" " Name: %s\n" " Pattern: %s\n" " Substitution: %s\n" " Ignore case: %s\n" " Eval as Perl: %s\n" " Enabled: %s\n" msgstr "" #: src/perlscript.c:2105 msgid "Press a key to get its keycode." msgstr "" #: src/perlscript.c:2157 msgid "macro: No such macro" msgstr "" #: src/perlscript.c:2176 src/perlscript.c:2224 #, c-format msgid "%s: Invalid key code" msgstr "" #: src/perlscript.c:2213 #, c-format msgid "%s: keycode given twice, using the named attribute one" msgstr "" #: src/perlscript.c:2269 #, c-format msgid "%s: keycode not specified, not creating" msgstr "" #: src/perlscript.c:2276 src/perlscript.c:2537 #, c-format msgid "%s: action not specified, not creating" msgstr "" #: src/perlscript.c:2295 msgid "Macro added." msgstr "" #: src/perlscript.c:2300 msgid "Macro modified." msgstr "" #: src/perlscript.c:2331 msgid "No such macro" msgstr "" #: src/perlscript.c:2337 #, c-format msgid "" "Macro number %d\n" " Name: %s\n" " Key Code: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" #: src/perlscript.c:2447 msgid "timer: No such timer" msgstr "" #: src/perlscript.c:2472 #, c-format msgid "%s: interval must be numeric" msgstr "" #: src/perlscript.c:2485 #, c-format msgid "%s: count must be numeric" msgstr "" #: src/perlscript.c:2516 #, c-format msgid "%s: interval not specified, not creating" msgstr "" #: src/perlscript.c:2577 msgid "Timer added." msgstr "" #: src/perlscript.c:2582 msgid "Timer modified." msgstr "" #: src/perlscript.c:2612 msgid "No such timer" msgstr "" #: src/perlscript.c:2617 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %d\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" #: src/perlscript.c:2708 #, c-format msgid "" "%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent" msgstr "" #: src/perlscript.c:2717 #, c-format msgid "%s: %s is already permanent" msgstr "" #: src/perlscript.c:2731 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "" #: src/perlscript.c:2773 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "" #: src/perlscript.c:2777 #, c-format msgid "%s: %s is not permanent" msgstr "" #: src/perlscript.c:2830 msgid "Permanent variables" msgstr "" #: src/perlscript.c:2942 msgid "Hook defined." msgstr "" #: src/perlscript.c:2946 msgid "Hook modified." msgstr "" #: src/perlscript.c:3052 msgid "Logging stopped." msgstr "" #: src/perlscript.c:3194 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "" #: src/perlscript.c:3237 msgid "No such plugin" msgstr "" #: src/perlscript.c:3242 #, c-format msgid "" "Plugin number %d\n" " Name: %s\n" " Version: %s\n" " Description: %s\n" " Author: %s\n" " Enabled: %s\n" msgstr "" #: src/kildclient.glade:176 msgid "_Import" msgstr "" #: src/kildclient.glade:225 msgid "E_xport" msgstr "" #: src/kildclient.glade:274 msgid "Edit Alias" msgstr "" #: src/kildclient.glade:293 src/kildclient.glade:536 src/kildclient.glade:875 #: src/kildclient.glade:1170 src/kildclient.glade:1441 #: src/kildclient.glade:1687 src/dlgEditWorld.glade:92 #: src/dlgEditWorld.glade:3305 msgid "_Name:" msgstr "" #: src/kildclient.glade:306 src/kildclient.glade:549 msgid "_Pattern:" msgstr "" #: src/kildclient.glade:321 msgid "_Substitution:" msgstr "" #: src/kildclient.glade:336 msgid "Enter optionally a descriptive name for the alias" msgstr "" #: src/kildclient.glade:350 msgid "Enter the pattern to match against typed commands" msgstr "" #: src/kildclient.glade:365 msgid "Enter the substitution to be executed" msgstr "" #: src/kildclient.glade:378 msgid "E_val substitution as Perl statement" msgstr "" #: src/kildclient.glade:382 msgid "Check to have the substitution be executed in a s///e construction" msgstr "" #: src/kildclient.glade:396 src/kildclient.glade:638 src/kildclient.glade:978 #: src/kildclient.glade:1226 src/kildclient.glade:1421 msgid "_Enabled" msgstr "" #: src/kildclient.glade:400 msgid "Check to make the alias enabled; only enabled aliases are tried" msgstr "" #: src/kildclient.glade:416 src/kildclient.glade:712 src/kildclient.glade:1072 #: src/kildclient.glade:1292 src/kildclient.glade:1496 msgid "Note:" msgstr "" #: src/kildclient.glade:430 src/kildclient.glade:726 src/kildclient.glade:1086 #: src/kildclient.glade:1306 src/kildclient.glade:1510 msgid "" "This object belongs to a plugin. Changes made here will not be saved " "in the plugin." msgstr "" #: src/kildclient.glade:445 src/kildclient.glade:741 msgid "_Ignore case when matching" msgstr "" #: src/kildclient.glade:516 src/kildclient.glade:2030 msgid "Enter optionally a descriptive name for the trigger" msgstr "" #: src/kildclient.glade:517 msgid "Edit Trigger" msgstr "" #: src/kildclient.glade:564 src/kildclient.glade:932 src/kildclient.glade:1246 #: src/kildclient.glade:1393 msgid "_Action:" msgstr "" #: src/kildclient.glade:592 msgid "Enter the pattern to match against received lines" msgstr "" #: src/kildclient.glade:607 msgid "Enter the action that will be run when a match happens" msgstr "" #: src/kildclient.glade:620 msgid "Omit (_gag) from output" msgstr "" #: src/kildclient.glade:624 msgid "Check to make the matched line not be printed in the main output window" msgstr "" #: src/kildclient.glade:642 msgid "Check to make the trigger enabled; only enabled triggers are tried" msgstr "" #: src/kildclient.glade:656 msgid "Omit (gag) from _log file" msgstr "" #: src/kildclient.glade:660 msgid "Check to make the matched line not be printed in the log file" msgstr "" #: src/kildclient.glade:674 msgid "_Keep executing other triggers after this this one matches" msgstr "" #: src/kildclient.glade:678 msgid "" "Check to make this trigger not prevent further triggers from being tried, if " "it matches" msgstr "" #: src/kildclient.glade:692 msgid "_Rewriter trigger" msgstr "" #: src/kildclient.glade:696 msgid "Check to make this trigger a rewriter trigger" msgstr "" #: src/kildclient.glade:763 msgid "C_hange style" msgstr "" #: src/kildclient.glade:779 msgid "C_onfigure..." msgstr "" #: src/kildclient.glade:856 msgid "Edit Timer" msgstr "" #: src/kildclient.glade:888 msgid "_Interval:" msgstr "" #: src/kildclient.glade:903 msgid "Enter optionally a descriptive name for the timer" msgstr "" #: src/kildclient.glade:917 msgid "Enter the action to be executed whenever the timer fires" msgstr "" #: src/kildclient.glade:947 msgid "_Repeat count:" msgstr "" #: src/kildclient.glade:960 msgid "" "_Temporary (will be deleted automatically when its repeat count reaches 0)" msgstr "" #: src/kildclient.glade:964 msgid "Check to have the timer deleted after its repeat count has reached 0" msgstr "" #: src/kildclient.glade:982 msgid "Check to make the timer enabled; only enabled timers are run" msgstr "" #: src/kildclient.glade:1002 msgid "Specify the interval, in seconds, between timer activations" msgstr "" #: src/kildclient.glade:1015 msgid "seconds" msgstr "" #: src/kildclient.glade:1039 msgid "" "Specify how many times this timer should run before being disabled or deleted" msgstr "" #: src/kildclient.glade:1052 msgid "(-1 to repeat indefinitely)" msgstr "" #: src/kildclient.glade:1151 msgid "Edit Macro" msgstr "" #: src/kildclient.glade:1183 msgid "_Key:" msgstr "" #: src/kildclient.glade:1198 msgid "Enter optionally a descriptive name for the macro" msgstr "" #: src/kildclient.glade:1212 msgid "Press the key that will be used to run the macro" msgstr "" #: src/kildclient.glade:1230 msgid "Check to make the macro enabled; only enabled macros are run" msgstr "" #: src/kildclient.glade:1261 msgid "Enter the action to be run when the key is pressed" msgstr "" #: src/kildclient.glade:1276 msgid "" "Press the key that will be used to activate the macro while the cursor is in " "the text box." msgstr "" #: src/kildclient.glade:1374 msgid "Edit Hook" msgstr "" #: src/kildclient.glade:1408 msgid "Enter the action to be run when the event happens" msgstr "" #: src/kildclient.glade:1425 msgid "Check to make the hook enabled; only enabled hooks are run" msgstr "" #: src/kildclient.glade:1456 msgid "Enter optionally a descriptive name for the hook" msgstr "" #: src/kildclient.glade:1472 msgid "Event:" msgstr "" #: src/kildclient.glade:1575 msgid "Permenent variable" msgstr "" #: src/kildclient.glade:1592 msgid "_Name of variable to make permanent:" msgstr "" #: src/kildclient.glade:1606 msgid "" "Enter the name of a scalar ($), array (@) or hash (%) variable whose " "contents are to be saved between sessions of the World" msgstr "" #: src/kildclient.glade:1668 msgid "Edit Character Information" msgstr "" #: src/kildclient.glade:1700 msgid "Enter the character's name for automatic login" msgstr "" #: src/kildclient.glade:1714 msgid "_Password:" msgstr "" #: src/kildclient.glade:1729 msgid "Enter the character's password for automatic login" msgstr "" #: src/kildclient.glade:1870 msgid "Permanent Variables" msgstr "" #: src/kildclient.glade:1886 msgid "OnConnect Hooks" msgstr "" #: src/kildclient.glade:1902 msgid "OnDisconnect Hooks" msgstr "" #: src/kildclient.glade:1920 msgid "OnReceivedText Hooks" msgstr "" #: src/kildclient.glade:1938 msgid "OnSentCommand Hooks" msgstr "" #: src/kildclient.glade:1956 msgid "OnGetFocus Hooks" msgstr "" #: src/kildclient.glade:1974 msgid "OnLoseFocus Hooks" msgstr "" #: src/kildclient.glade:1992 msgid "OnCloseConnected Hooks" msgstr "" #: src/kildclient.glade:2019 msgid "_Items to export" msgstr "" #: src/kildclient.glade:2031 msgid "Change Style" msgstr "" #: src/kildclient.glade:2050 msgid "_Background:" msgstr "" #: src/kildclient.glade:2064 msgid "_Italic:" msgstr "" #: src/kildclient.glade:2077 src/kildclient.glade:2123 msgid "" "Do not change\n" "No\n" "Yes" msgstr "" #: src/kildclient.glade:2093 msgid "_Underline:" msgstr "" #: src/kildclient.glade:2106 msgid "" "Do not change\n" "None\n" "Single\n" "Double" msgstr "" #: src/kildclient.glade:2139 msgid "_Striked-thru:" msgstr "" #: src/kildclient.glade:2153 msgid "_Foreground:" msgstr "" #: src/kildclient.glade:2167 msgid "_Apply to:" msgstr "" #: src/kildclient.glade:2181 msgid "The whole line" msgstr "" #: src/kildclient.glade:2196 msgid "The whole matched text" msgstr "" #: src/kildclient.glade:2216 msgid "The matched substring number" msgstr "" #: src/kildclient.glade:2259 src/kildclient.glade:2290 msgid "" "Do not change\n" "Black\n" "Red\n" "Green\n" "Yellow\n" "Blue\n" "Magenta\n" "Cyan\n" "White\n" "Default\n" "Black (bold)\n" "Red (bold)\n" "Green (bold)\n" "Yellow (bold)\n" "Blue (bold)\n" "Magenta (bold)\n" "Cyan (bold)\n" "White (bold)\n" "Default (bold)\n" msgstr "" #: src/wndmain.glade:20 msgid "_World" msgstr "" #: src/wndmain.glade:37 msgid "_Reconnect" msgstr "" #: src/wndmain.glade:45 msgid "_Disconnect" msgstr "" #: src/wndmain.glade:53 msgid "Connect to _Another" msgstr "" #: src/wndmain.glade:74 msgid "_Edit..." msgstr "" #: src/wndmain.glade:91 msgid "S_tatistics..." msgstr "" #: src/wndmain.glade:103 src/wndmain.glade:238 msgid "_Previous" msgstr "" #: src/wndmain.glade:118 src/wndmain.glade:247 msgid "_Next" msgstr "" #: src/wndmain.glade:151 msgid "_Edit" msgstr "" #: src/wndmain.glade:209 msgid "Find Ne_xt" msgstr "" #: src/wndmain.glade:222 msgid "_Input" msgstr "" #: src/wndmain.glade:256 msgid "Find Previous" msgstr "" #: src/wndmain.glade:265 msgid "Find N_ext" msgstr "" #: src/wndmain.glade:274 msgid "Command _History..." msgstr "" #: src/wndmain.glade:288 msgid "_Multi-line Send..." msgstr "" #: src/wndmain.glade:302 msgid "_Test Triggers..." msgstr "" #: src/wndmain.glade:314 msgid "_Preferences" msgstr "" #: src/wndmain.glade:322 msgid "Disable _Triggers" msgstr "" #: src/wndmain.glade:331 msgid "Disable _Aliases" msgstr "" #: src/wndmain.glade:340 msgid "Disable _Macros" msgstr "" #: src/wndmain.glade:349 msgid "Disable T_imers" msgstr "" #: src/wndmain.glade:363 msgid "_Debug Matches" msgstr "" #: src/wndmain.glade:390 msgid "Edit Default _World..." msgstr "" #: src/wndmain.glade:402 msgid "_Display" msgstr "" #: src/wndmain.glade:411 msgid "_Split Window" msgstr "" #: src/wndmain.glade:424 msgid "_Help" msgstr "" #: src/wndmain.glade:430 msgid "_Manual" msgstr "" #: src/wndmain.glade:447 msgid "_About" msgstr "" #: src/dlgSelectWorld.glade:7 msgid "Connect to" msgstr "" #: src/dlgSelectWorld.glade:19 msgid "_Select a saved world:" msgstr "" #: src/dlgSelectWorld.glade:116 msgid "Or connect d_irectly:" msgstr "" #: src/dlgSelectWorld.glade:141 src/dlgEditWorld.glade:107 msgid "_Host:" msgstr "" #: src/dlgSelectWorld.glade:154 src/dlgEditWorld.glade:124 msgid "_Port:" msgstr "" #: src/dlgPreferences.glade:6 msgid "Preferences" msgstr "" #: src/dlgPreferences.glade:33 msgid "Colors used by KildClient" msgstr "" #: src/dlgPreferences.glade:65 msgid "_Informative messages:" msgstr "" #: src/dlgPreferences.glade:77 src/dlgPreferences.glade:117 msgid "" "Black\n" "Red\n" "Green\n" "Yellow\n" "Blue\n" "Magenta\n" "Cyan\n" "White\n" "Default\n" "Black (bold)\n" "Red (bold)\n" "Green (bold)\n" "Yellow (bold)\n" "Blue (bold)\n" "Magenta (bold)\n" "Cyan (bold)\n" "White (bold)\n" "Default (bold)\n" msgstr "" #: src/dlgPreferences.glade:105 msgid "_Command echo:" msgstr "" #: src/dlgPreferences.glade:168 msgid "Window configuration" msgstr "" #: src/dlgPreferences.glade:200 msgid "_Tab position:" msgstr "" #: src/dlgPreferences.glade:212 msgid "" "Left\n" "Right\n" "Top\n" "Bottom" msgstr "" #: src/dlgPreferences.glade:226 msgid "_Hide tabs if only one world is open" msgstr "" #: src/dlgPreferences.glade:231 msgid "" "If this is checked, when there is only one open world no tabs will be shown" msgstr "" #: src/dlgPreferences.glade:242 msgid "_Flash window when new text is received" msgstr "" #: src/dlgPreferences.glade:280 msgid "Appearance" msgstr "" #: src/dlgPreferences.glade:302 msgid "Sending Delays" msgstr "" #: src/dlgPreferences.glade:334 msgid "Enter the default parameters for sending multiple lines or commands:" msgstr "" #: src/dlgPreferences.glade:349 msgid "_Number of lines/commands to send at once:" msgstr "" #: src/dlgPreferences.glade:386 msgid "_Delay between each group of lines/commands:" msgstr "" #: src/dlgPreferences.glade:442 msgid "Sending" msgstr "" #: src/dlgPreferences.glade:465 msgid "Web Browser" msgstr "" #: src/dlgPreferences.glade:498 msgid "Specify the command used to launch a web browser" msgstr "" #: src/dlgPreferences.glade:512 msgid "" "Enter the command to run a web browser. %s will be substituted by the web " "page address." msgstr "" #: src/dlgPreferences.glade:548 msgid "Audio Player" msgstr "" #: src/dlgPreferences.glade:581 msgid "Specify the command used to play sound files." msgstr "" #: src/dlgPreferences.glade:595 msgid "" "Enter the command to run an audio player program. %s will be substituted by " "the file path." msgstr "" #: src/dlgPreferences.glade:627 msgid "External Programs" msgstr "" #: src/dlgPreferences.glade:651 src/dlgEditWorld.glade:245 msgid "Proxy" msgstr "" #: src/dlgPreferences.glade:686 src/dlgEditWorld.glade:280 msgid "Proxy _type:" msgstr "" #: src/dlgPreferences.glade:698 src/dlgEditWorld.glade:292 msgid "" "Use global settings\n" "No proxy\n" "SOCKS4\n" "SOCKS5" msgstr "" #: src/dlgPreferences.glade:775 src/dlgEditWorld.glade:368 msgid "Pass_word:" msgstr "" #: src/dlgPreferences.glade:791 src/dlgEditWorld.glade:384 msgid "Server _port:" msgstr "" #: src/dlgPreferences.glade:805 src/dlgEditWorld.glade:398 msgid "_Username:" msgstr "" #: src/dlgPreferences.glade:819 src/dlgEditWorld.glade:412 msgid "Server _address:" msgstr "" #: src/dlgPreferences.glade:857 msgid "Proxy" msgstr "" #: src/dlgStatistics.glade:7 msgid "Statistics" msgstr "" #: src/dlgStatistics.glade:25 src/dlgStatistics.glade:40 #: src/dlgStatistics.glade:210 src/dlgStatistics.glade:361 #: src/dlgStatistics.glade:495 src/dlgStatistics.glade:510 #: src/dlgStatistics.glade:525 src/dlgStatistics.glade:540 #: src/dlgStatistics.glade:555 src/dlgStatistics.glade:583 #: src/dlgStatistics.glade:624 src/dlgStatistics.glade:639 #: src/dlgStatistics.glade:667 src/dlgStatistics.glade:708 #: src/dlgStatistics.glade:723 msgid "N/A" msgstr "" #: src/dlgStatistics.glade:55 msgid "Proxy port:" msgstr "" #: src/dlgStatistics.glade:68 msgid "Proxy host:" msgstr "" #: src/dlgStatistics.glade:96 msgid "Proxy type:" msgstr "" #: src/dlgStatistics.glade:109 msgid "World name:" msgstr "" #: src/dlgStatistics.glade:120 msgid "Host:" msgstr "" #: src/dlgStatistics.glade:133 msgid "Port:" msgstr "" #: src/dlgStatistics.glade:146 msgid "Connection time:" msgstr "" #: src/dlgStatistics.glade:159 msgid "Idle time:" msgstr "" #: src/dlgStatistics.glade:184 msgid "Compression used:" msgstr "" #: src/dlgStatistics.glade:197 msgid "Bytes received (compressed):" msgstr "" #: src/dlgStatistics.glade:225 msgid "Bytes received (decompressed):" msgstr "" #: src/dlgStatistics.glade:238 msgid "Compression ratio:" msgstr "" #: src/dlgStatistics.glade:251 msgid "Lines received:" msgstr "" #: src/dlgStatistics.glade:402 msgid "Key exchange:" msgstr "" #: src/dlgStatistics.glade:415 msgid "SSL protocol used:" msgstr "" #: src/dlgStatistics.glade:428 msgid "Compression algorithm:" msgstr "" #: src/dlgStatistics.glade:441 msgid "Certificate type:" msgstr "" #: src/dlgStatistics.glade:454 msgid "Cipher:" msgstr "" #: src/dlgStatistics.glade:467 msgid "MAC:" msgstr "" #: src/dlgStatistics.glade:480 msgid "SSL not supported in this version" msgstr "" #: src/dlgStatistics.glade:570 msgid "Hostname:" msgstr "" #: src/dlgStatistics.glade:598 msgid "Valid since:" msgstr "" #: src/dlgStatistics.glade:611 msgid "Expiration:" msgstr "" #: src/dlgStatistics.glade:654 msgid "Fingerprint:" msgstr "" #: src/dlgStatistics.glade:682 msgid "Subject's DN:" msgstr "" #: src/dlgStatistics.glade:695 msgid "Issuer's DN:" msgstr "" #: src/dlgAbout.glade:12 msgid "A mud client with powerful features and support for Perl Scripting" msgstr "" #: src/dlgAbout.glade:14 msgid "Visit http://kildclient.sf.net" msgstr "" #: src/dlgAbout.glade:15 msgid "" "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." msgstr "" #: src/dlgEditWorld.glade:7 msgid "Edit World" msgstr "" #: src/dlgEditWorld.glade:60 msgid "Connection" msgstr "" #: src/dlgEditWorld.glade:141 msgid "Enter a descriptive name for the World" msgstr "" #: src/dlgEditWorld.glade:159 msgid "Enter the host to connect to" msgstr "" #: src/dlgEditWorld.glade:179 msgid "Enter the port used when connecting" msgstr "" #: src/dlgEditWorld.glade:197 msgid "Use _SSL" msgstr "" #: src/dlgEditWorld.glade:452 msgid "Auto-login" msgstr "" #: src/dlgEditWorld.glade:488 msgid "Connection _Style:" msgstr "" #: src/dlgEditWorld.glade:501 msgid "" "No auto-login\n" "diku (char, pass)\n" "lp (CONNECT char pass)" msgstr "" #: src/dlgEditWorld.glade:519 msgid "Ch_aracters in this mud:" msgstr "" #: src/dlgEditWorld.glade:680 src/dlgEditWorld.glade:2009 #: src/dlgEditWorld.glade:2852 msgid "Font" msgstr "" #: src/dlgEditWorld.glade:713 msgid "Select the font used in the _main screen:" msgstr "" #: src/dlgEditWorld.glade:729 msgid "Select the font used in the main output screen" msgstr "" #: src/dlgEditWorld.glade:740 msgid "Use _bold font for highlighted colors (instead of just highlighting)" msgstr "" #: src/dlgEditWorld.glade:745 msgid "" "Check if you want the highlighted ANSI colors to be displayed in bold also" msgstr "" #: src/dlgEditWorld.glade:782 msgid "Word Wrap" msgstr "" #: src/dlgEditWorld.glade:812 msgid "_Wrap lines at word boundaries" msgstr "" #: src/dlgEditWorld.glade:817 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "" #: src/dlgEditWorld.glade:836 msgid "_Indent wrapped lines by" msgstr "" #: src/dlgEditWorld.glade:865 msgid "pixels" msgstr "" #: src/dlgEditWorld.glade:883 msgid "Wrap lines at full _screen width" msgstr "" #: src/dlgEditWorld.glade:902 msgid "Maximum line width in _characters:" msgstr "" #: src/dlgEditWorld.glade:964 msgid "Tooltips" msgstr "" #: src/dlgEditWorld.glade:995 msgid "Display _tooltips with the time when the line was received" msgstr "" #: src/dlgEditWorld.glade:1000 msgid "" "Check if you want tooltips to be displayed showing the time when a line was " "received if you leave the mouse over the line for a short while" msgstr "" #: src/dlgEditWorld.glade:1058 msgid "Ansi Colors" msgstr "" #: src/dlgEditWorld.glade:1374 msgid "_Black" msgstr "" #: src/dlgEditWorld.glade:1391 msgid "R_ed" msgstr "" #: src/dlgEditWorld.glade:1410 msgid "_Green" msgstr "" #: src/dlgEditWorld.glade:1429 msgid "_Yellow" msgstr "" #: src/dlgEditWorld.glade:1448 msgid "B_lue" msgstr "" #: src/dlgEditWorld.glade:1467 msgid "_Magenta" msgstr "" #: src/dlgEditWorld.glade:1486 msgid "C_yan" msgstr "" #: src/dlgEditWorld.glade:1505 msgid "_White" msgstr "" #: src/dlgEditWorld.glade:1524 msgid "Bl_ack (Bold)" msgstr "" #: src/dlgEditWorld.glade:1541 msgid "Re_d (Bold)" msgstr "" #: src/dlgEditWorld.glade:1560 msgid "G_reen (Bold)" msgstr "" #: src/dlgEditWorld.glade:1579 msgid "Yell_ow (Bold)" msgstr "" #: src/dlgEditWorld.glade:1598 msgid "Bl_ue (Bold)" msgstr "" #: src/dlgEditWorld.glade:1617 msgid "Magen_ta (Bold)" msgstr "" #: src/dlgEditWorld.glade:1636 msgid "Cya_n (Bold)" msgstr "" #: src/dlgEditWorld.glade:1655 msgid "W_hite (Bold)" msgstr "" #: src/dlgEditWorld.glade:1720 msgid "Default Colors" msgstr "" #: src/dlgEditWorld.glade:1767 msgid "_Foreground" msgstr "" #: src/dlgEditWorld.glade:1801 msgid "Bac_kground" msgstr "" #: src/dlgEditWorld.glade:1835 msgid "Bold Foreground" msgstr "" #: src/dlgEditWorld.glade:1873 msgid "Bold Background" msgstr "" #: src/dlgEditWorld.glade:1916 msgid "Revert to default colors" msgstr "" #: src/dlgEditWorld.glade:1947 msgid "Re_vert to default colors" msgstr "" #: src/dlgEditWorld.glade:1952 msgid "Click to revert all colors to their built-in defaults" msgstr "" #: src/dlgEditWorld.glade:2042 msgid "Select the font used in the _status bar:" msgstr "" #: src/dlgEditWorld.glade:2058 msgid "Select the font used in the status bar" msgstr "" #: src/dlgEditWorld.glade:2093 msgid "Time Display" msgstr "" #: src/dlgEditWorld.glade:2125 msgid "C_onnected time:" msgstr "" #: src/dlgEditWorld.glade:2156 src/dlgEditWorld.glade:2256 msgid "Do not display" msgstr "" #: src/dlgEditWorld.glade:2161 msgid "Select if you do not want the connection time to be displayed" msgstr "" #: src/dlgEditWorld.glade:2175 src/dlgEditWorld.glade:2275 msgid "Display as hours, minutes and seconds" msgstr "" #: src/dlgEditWorld.glade:2180 msgid "" "Select if you want the connection time to be displayed in hours, minutes and " "seconds" msgstr "" #: src/dlgEditWorld.glade:2194 src/dlgEditWorld.glade:2294 msgid "Display as seconds" msgstr "" #: src/dlgEditWorld.glade:2199 msgid "Select if you want the connection time to be displayed in seconds" msgstr "" #: src/dlgEditWorld.glade:2226 msgid "_Idle time:" msgstr "" #: src/dlgEditWorld.glade:2261 msgid "Select if you do not want the idle time to be displayed" msgstr "" #: src/dlgEditWorld.glade:2280 msgid "" "Select if you want the idle time to be displayed in hours, minutes and " "seconds" msgstr "" #: src/dlgEditWorld.glade:2299 msgid "Select if you want the idle time to be displayed in seconds" msgstr "" #: src/dlgEditWorld.glade:2313 msgid "Only _reset idle time counter when a command is entered directly" msgstr "" #: src/dlgEditWorld.glade:2318 msgid "" "Check to make the idle time counter reset only when a command is entered " "directly by typing it in the command entry box. If not checked, if a command " "is sent because of a timer, of a hook, etc, the idle timer is also reset." msgstr "" #: src/dlgEditWorld.glade:2387 msgid "Command Entry" msgstr "" #: src/dlgEditWorld.glade:2417 msgid "_Keep last typed command in command entry box" msgstr "" #: src/dlgEditWorld.glade:2422 msgid "" "Check to have the last command kept in the command entry box, so that you " "can repeat commands only by pressing ENTER" msgstr "" #: src/dlgEditWorld.glade:2434 msgid "_Echo sent commands in main window" msgstr "" #: src/dlgEditWorld.glade:2439 msgid "Check to have the sent commands echoed in the main output window" msgstr "" #: src/dlgEditWorld.glade:2451 msgid "_Store commands between sessions" msgstr "" #: src/dlgEditWorld.glade:2456 msgid "Check to have the command history saved in a file between sessions" msgstr "" #: src/dlgEditWorld.glade:2468 msgid "Never _hide the typed text" msgstr "" #: src/dlgEditWorld.glade:2473 msgid "" "Check this if the text you type is displayed as black dots in the input box." msgstr "" #: src/dlgEditWorld.glade:2489 msgid "_Number of commands to save in history:" msgstr "" #: src/dlgEditWorld.glade:2503 msgid "Specify the number of commands that are saved and can be later recalled" msgstr "" #: src/dlgEditWorld.glade:2526 msgid "C_ommand separator:" msgstr "" #: src/dlgEditWorld.glade:2540 msgid "Specify the separator for commands typed in the command entry box" msgstr "" #: src/dlgEditWorld.glade:2558 msgid "Use single-_line input bar" msgstr "" #: src/dlgEditWorld.glade:2594 msgid "Enable _auto-completion" msgstr "" #: src/dlgEditWorld.glade:2599 msgid "Check to enable command auto-completion (based on previous commands)" msgstr "" #: src/dlgEditWorld.glade:2617 msgid "Acti_vate auto-completion only after" msgstr "" #: src/dlgEditWorld.glade:2631 msgid "" "Specify the number of characters that must be typed for command completion " "to start" msgstr "" #: src/dlgEditWorld.glade:2645 msgid "characters have been entered" msgstr "" #: src/dlgEditWorld.glade:2670 msgid "Use _multi-line input bar" msgstr "" #: src/dlgEditWorld.glade:2711 msgid "N_umber of lines:" msgstr "" #: src/dlgEditWorld.glade:2746 msgid "S_pell check typed text" msgstr "" #: src/dlgEditWorld.glade:2779 msgid "Language code:" msgstr "" #: src/dlgEditWorld.glade:2803 msgid "(Leave blank for default based on locale)" msgstr "" #: src/dlgEditWorld.glade:2885 msgid "Select the font used in the command _entry box:" msgstr "" #: src/dlgEditWorld.glade:2901 msgid "Select the font used in the command entry box" msgstr "" #: src/dlgEditWorld.glade:2935 msgid "Flood prevention" msgstr "" #: src/dlgEditWorld.glade:2970 msgid "Do not allow the _same command to be sent" msgstr "" #: src/dlgEditWorld.glade:2975 msgid "" "Check to prevent more than a given number of equal commands to be sent in a " "row (which can disconnect your character in some muds)" msgstr "" #: src/dlgEditWorld.glade:2990 msgid "Specify the maximum number of equal commands that can be sent in a row" msgstr "" #: src/dlgEditWorld.glade:3004 msgid "_times in a row" msgstr "" #: src/dlgEditWorld.glade:3028 msgid "Se_nd this command:" msgstr "" #: src/dlgEditWorld.glade:3042 msgid "" "Enter a command to be sent whenever the specified maximum number of equal " "commands would be sent" msgstr "" #: src/dlgEditWorld.glade:3104 msgid "Logging Status" msgstr "" #: src/dlgEditWorld.glade:3152 msgid "St_art" msgstr "" #: src/dlgEditWorld.glade:3195 msgid "_Include the last" msgstr "" #: src/dlgEditWorld.glade:3200 msgid "Select to include lines from the main window in the log file." msgstr "" #: src/dlgEditWorld.glade:3214 msgid "Inform number of lines to include in the log." msgstr "" #: src/dlgEditWorld.glade:3229 msgid "lines of the scrollback buffer in the log" msgstr "" #: src/dlgEditWorld.glade:3268 src/dlgEditWorld.glade:4377 msgid "File" msgstr "" #: src/dlgEditWorld.glade:3348 msgid "" "Note: You can use strftime() escapes to create different files based on the " "date and time that logging starts. Also, %Kw represents the World name and " "%Kc the character name used in auto-logon." msgstr "" #: src/dlgEditWorld.glade:3381 msgid "Options" msgstr "" #: src/dlgEditWorld.glade:3411 msgid "A_utomatically start logging when connected" msgstr "" #: src/dlgEditWorld.glade:3417 msgid "" "If this is selected, logging will be automatically started whenever you " "connect to the world." msgstr "" #: src/dlgEditWorld.glade:3427 msgid "Prefix lines with _date and/or time" msgstr "" #: src/dlgEditWorld.glade:3433 msgid "" "Select this if you want to prefix each line in the log file with the date " "and/or time it was received." msgstr "" #: src/dlgEditWorld.glade:3461 msgid "_Format:" msgstr "" #: src/dlgEditWorld.glade:3474 msgid "" "The default is to prefix lines with the date and time, but you can configure " "the format with strftime() escape sequences. See the manual for a " "description of those." msgstr "" #: src/dlgEditWorld.glade:3483 msgid "Revert to _default" msgstr "" #: src/dlgEditWorld.glade:3549 msgid "Scripting" msgstr "" #: src/dlgEditWorld.glade:3585 msgid "_Perl file to load:" msgstr "" #: src/dlgEditWorld.glade:3608 src/dlgMLSend.glade:80 msgid "_Clear" msgstr "" #: src/dlgEditWorld.glade:3675 msgid "Plugins Currently Loaded" msgstr "" #: src/dlgEditWorld.glade:3754 msgid "_Load" msgstr "" #: src/dlgEditWorld.glade:3821 msgid "Plugins Loaded on Startup" msgstr "" #: src/dlgEditWorld.glade:3987 msgid "MCCP (for compression)" msgstr "" #: src/dlgEditWorld.glade:4017 msgid "_Enable if server proposes after connecting" msgstr "" #: src/dlgEditWorld.glade:4033 msgid "Enable if server proposes at _any time" msgstr "" #: src/dlgEditWorld.glade:4049 msgid "_Disable" msgstr "" #: src/dlgEditWorld.glade:4110 msgid "Scrolling" msgstr "" #: src/dlgEditWorld.glade:4141 msgid "Scroll on _output" msgstr "" #: src/dlgEditWorld.glade:4146 msgid "" "Check to have the main window scroll to the end whenever new output comes" msgstr "" #: src/dlgEditWorld.glade:4161 msgid "_Lines to save in scrollback buffer:" msgstr "" #: src/dlgEditWorld.glade:4175 msgid "" "Specify the number of lines of output that can be seen with by scrolling the " "window" msgstr "" #: src/dlgEditWorld.glade:4217 msgid "Name display" msgstr "" #: src/dlgEditWorld.glade:4247 msgid "Identify as 'World name'" msgstr "" #: src/dlgEditWorld.glade:4260 msgid "Identify as 'World name - Character'" msgstr "" #: src/dlgEditWorld.glade:4273 msgid "Identify as 'Character - World name'" msgstr "" #: src/dlgEditWorld.glade:4290 msgid "Custom: " msgstr "" #: src/dlgEditWorld.glade:4323 msgid "" "Use %Kw to represent the World's name, and %Kc to represent the auto-logon " "character name" msgstr "" #: src/dlgEditWorld.glade:4411 msgid "_File:" msgstr "" #: src/dlgEditWorld.glade:4442 msgid "" "You can leave this field blank, and a file name will be automatically " "generated. Only edit this field if you know what you are doing." msgstr "" #: src/dlgEditWorld.glade:4475 msgid "Character Set" msgstr "" #: src/dlgEditWorld.glade:4504 msgid "Character _set:" msgstr "" #: src/dlgEditWorld.glade:4549 msgid "Graphical Editors" msgstr "" #: src/dlgEditWorld.glade:4579 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "" #: src/dlgEditWorld.glade:4584 src/dlgEditWorld.glade:4675 msgid "" "If not checked, objects such as triggers, aliases, etc. will be deleted " "directly without asking for confirmation when you press the Delete button." msgstr "" #: src/dlgEditWorld.glade:4597 msgid "_Show items defined by plugins" msgstr "" #: src/dlgEditWorld.glade:4602 msgid "" "If checked, triggers, aliases, macros and timers defined in plugins will " "appear in the corresponding World Editor sections." msgstr "" #: src/dlgEditWorld.glade:4640 msgid "TCP Keep Alive" msgstr "" #: src/dlgEditWorld.glade:4670 msgid "Enable TCP _Keep Alive packets" msgstr "" #: src/dlgEditWorld.glade:4689 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "" #: src/dlgEditWorld.glade:4722 msgid "Input" msgstr "" #: src/dlgEditWorld.glade:4752 msgid "_Disable up and down arrow keys for history navigation" msgstr "" #: src/dlgEditWorld.glade:4757 msgid "" "If checked, the up and down arrow keys are not used for navigating between " "saved commands. (You'll have to use Alt+up and Alt+down.)" msgstr "" #: src/dlgTestTriggers.glade:24 msgid "Enter _line to be matched against the triggers:" msgstr "" #: src/dlgTestTriggers.glade:41 msgid "" "The text entered here will be matched against triggers as if it were a line " "coming from the MUD" msgstr "" #: src/dlgTestTriggers.glade:51 src/dlgMLSend.glade:321 #: src/dlgCmdHistory.glade:241 msgid "_Send" msgstr "" #: src/dlgTestTriggers.glade:56 msgid "Click the run the triggers against the line." msgstr "" #: src/dlgTestTriggers.glade:90 msgid "Number of triggers that matched:" msgstr "" #: src/dlgTestTriggers.glade:119 msgid "Commands that would be sent:" msgstr "" #: src/dlgTestTriggers.glade:151 msgid "This is what would be printed in the main screen:" msgstr "" #: src/dlgTestTriggers.glade:163 msgid "" "This is what would be printed in the main screen. If empty, the line has " "been gaged. It can be different from the original line because of rewriter " "triggers." msgstr "" #: src/dlgTestTriggers.glade:180 msgid "Would this line be included in the log file?" msgstr "" #: src/dlgMLSend.glade:7 msgid "Multi-line send" msgstr "" #: src/dlgMLSend.glade:20 msgid "Send this text _initially:" msgstr "" #: src/dlgMLSend.glade:42 src/dlgMLSend.glade:127 msgid "Enter some text to be sent to the World" msgstr "" #: src/dlgMLSend.glade:55 msgid "Then send the _contents of this file:" msgstr "" #: src/dlgMLSend.glade:105 msgid "_Finally, send this text:" msgstr "" #: src/dlgMLSend.glade:150 msgid "Add this to the _beginning of each line:" msgstr "" #: src/dlgMLSend.glade:165 msgid "Specify some text to be prepended to each sent line" msgstr "" #: src/dlgMLSend.glade:179 msgid "Add this to the _end of each line:" msgstr "" #: src/dlgMLSend.glade:194 msgid "Specify some text to be appended to each sent line" msgstr "" #: src/dlgMLSend.glade:210 msgid "_Delay" msgstr "" #: src/dlgMLSend.glade:224 msgid "Specify the delay between sending the group of lines" msgstr "" #: src/dlgMLSend.glade:239 msgid "seconds e_ach" msgstr "" #: src/dlgMLSend.glade:253 msgid "Specify how many lines are sent at once" msgstr "" #: src/dlgMLSend.glade:267 msgid "line(s)" msgstr "" #: src/dlgMLSend.glade:285 msgid "_Keep dialog open after sending" msgstr "" #: src/dlgCmdHistory.glade:7 msgid "Command History" msgstr "" #: src/dlgCmdHistory.glade:51 msgid "Find a command containing a given search term" msgstr "" #: src/dlgCmdHistory.glade:63 msgid "Find _next" msgstr "" #: src/dlgCmdHistory.glade:69 msgid "Find the next command with the same match text" msgstr "" #: src/dlgCmdHistory.glade:107 msgid "Dela_y" msgstr "" #: src/dlgCmdHistory.glade:120 msgid "Specify the delay between sending the group of commands" msgstr "" #: src/dlgCmdHistory.glade:135 msgid "sec_onds each" msgstr "" #: src/dlgCmdHistory.glade:149 msgid "Specify how many commands are sent at once" msgstr "" #: src/dlgCmdHistory.glade:163 msgid "commands(s)" msgstr "" #: src/dlgCmdHistory.glade:184 msgid "Newest commands are on the top" msgstr "" #: src/dlgCmdHistory.glade:205 msgid "_Recall" msgstr "" #: src/dlgCmdHistory.glade:211 msgid "Put the selected command in the command entry box" msgstr "" #: src/dlgCmdHistory.glade:223 msgid "Rec_all & Close" msgstr "" #: src/dlgCmdHistory.glade:229 msgid "Put the selected command in the command entry box and close this dialog" msgstr "" #: src/dlgCmdHistory.glade:247 msgid "Send the selected command(s) to the mud" msgstr "" #: src/dlgCmdHistory.glade:259 msgid "S_end & Close" msgstr "" #: src/dlgCmdHistory.glade:265 msgid "Send the selected command(s) to the mud and close the dialog" msgstr "" #: src/dlgCmdHistory.glade:305 msgid "Find Command" msgstr "" #: src/dlgCmdHistory.glade:321 msgid "_Text to find:" msgstr "" #: src/dlgCmdHistory.glade:334 msgid "Enter the text to search for" msgstr "" #: src/dlgCmdHistory.glade:353 msgid "Search direction:" msgstr "" #: src/dlgCmdHistory.glade:367 msgid "_Downwards" msgstr "" #: src/dlgCmdHistory.glade:383 msgid "_Upwards" msgstr "" #: src/mnuPopupURL.glade:8 msgid "Open Link" msgstr "" #: src/mnuPopupURL.glade:23 msgid "Copy Link Address" msgstr "" #: share/kildclient.pl:76 share/kildclient.pl:97 share/kildclient.pl:117 #: share/kildclient.pl:182 share/kildclient.pl:433 share/kildclient.pl:511 #: share/kildclient.pl:589 share/kildclient.pl:602 share/kildclient.pl:615 #: share/kildclient.pl:628 share/kildclient.pl:641 share/kildclient.pl:654 #: share/kildclient.pl:667 share/kildclient.pl:680 share/kildclient.pl:694 #: share/kildclient.pl:708 share/kildclient.pl:718 share/kildclient.pl:730 #: share/kildclient.pl:742 share/kildclient.pl:754 share/kildclient.pl:767 #: share/kildclient.pl:983 share/kildclient.pl:1016 #, perl-format msgid "%s: Too few arguments." msgstr "" #: share/kildclient.pl:207 share/kildclient.pl:567 #, perl-format msgid "No such %s" msgstr "" #: share/kildclient.pl:298 share/kildclient.pl:316 share/kildclient.pl:334 #: share/kildclient.pl:352 share/kildclient.pl:370 #, perl-format msgid "%s: Wrong number of arguments." msgstr "" #: share/kildclient.pl:403 share/kildclient.pl:411 share/kildclient.pl:489 #: share/kildclient.pl:497 #, perl-format msgid "No such %s." msgstr "" #: share/kildclient.pl:425 #, perl-format msgid "No %s deleted." msgstr "" #: share/kildclient.pl:427 #, perl-format msgid "One %s deleted." msgstr "" #: share/kildclient.pl:429 #, perl-format msgid "%d %s deleted." msgstr "" #: share/kildclient.pl:506 #, perl-format msgid "Successfully moved %s." msgstr "" #: share/kildclient.pl:798 msgid "Could not open file." msgstr "" #: share/kildclient.pl:828 msgid "Unknown" msgstr "" #: share/kildclient.pl:835 msgid "Invalid plugin file." msgstr "" #: share/kildclient.pl:866 msgid "Plugin already loaded. Try enabling it." msgstr "" #: share/kildclient.pl:868 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "" #: share/kildclient.pl:878 #, perl-format msgid "Error in plugin file: %s" msgstr "" #: share/kildclient.pl:890 msgid "Cannot load a plugin in another world." msgstr "" #: share/kildclient.pl:895 share/kildclient.pl:915 msgid "Plugin not specified" msgstr "" #: share/kildclient.pl:902 share/kildclient.pl:933 msgid "Plugin not loaded." msgstr "" #: share/kildclient.pl:905 #, perl-format msgid "Plugin '%s' loaded." msgstr "" #: share/kildclient.pl:921 #, perl-format msgid "Could not load plugin %s" msgstr "" #: share/kildclient.pl:997 msgid "Plugin enabled." msgstr "" #: share/kildclient.pl:1030 msgid "Plugin disabled." msgstr "" #: share/kildclient.pl:1150 msgid "Cannot open help file." msgstr "" #: share/kildclient.pl:1168 msgid "Help topic not found." msgstr "" #: share/kildclient.pl:1174 msgid "" "Warning: the getwindowsize() function is deprecated and will be removed." msgstr "" #: share/kildclient.pl:1175 msgid "Use $window->getsize() instead." msgstr "" #: share/kildclient.pl:1180 msgid "Warning: the minimize() function is deprecated and will be removed." msgstr "" #: share/kildclient.pl:1181 msgid "Use $window->minimize() instead." msgstr "" #: share/kildclient.pl:1186 msgid "Warning: the path() function is deprecated and will be removed." msgstr "" #: share/kildclient.pl:1187 msgid "Use $world->path() instead." msgstr "" kildclient-2.11.1/po/de.po0000644000175000017500000026116611570463465012234 00000000000000# Copyright (C) 2009-2011 Rene Kuettner , Eduardo M Kalinowski # This file is licensed under the same license as the KildClient package. # msgid "" msgstr "" "Project-Id-Version: KildClient 2.11.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-05-29 12:33-0300\n" "PO-Revision-Date: 2011-02-13 15:41-0200\n" "Last-Translator: Rene Kuettner \n" "Language-Team: German\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/main.c:76 msgid "Outputs version information and exits" msgstr "Zeigt Versionsinformationen an und beendet das Programm" #: src/main.c:78 msgid "Directory to store settings and saved worlds" msgstr "Verzeichnis, in dem die Einstellungen und Welten gespeichert werden" #: src/main.c:78 msgid "DIR" msgstr "Verzeichnis" #: src/main.c:80 msgid "" "Dumps all data received from (after decompression, if appropriate) to the " "file" msgstr "" "Schreibt alle empfangenen Daten (gegebenenfalls nach der Dekompression) in " "die Datei" #: src/main.c:81 src/main.c:84 msgid "FILE" msgstr "DATEI" #: src/main.c:83 msgid "Dumps all data received (possibly compressed) to the file" msgstr "" "Schreibt alle empfangenen Daten (wenn möglich dekomprimiert) in die Datei" #. Parse command-line options #: src/main.c:122 msgid "[WORLD...]" msgstr "[WELT...\\" #: src/main.c:129 #, c-format msgid "Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" msgstr "Geschrieben von Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" #: src/main.c:134 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "Kann Datendatei %s nicht öffnen: %s\n" #: src/main.c:141 #, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "Kann Rohdatendatei %s nicht öffnen: %s\n" #: src/main.c:287 msgid "There is one open world. Do you really want to quit?" msgstr "Eine Welt ist noch verbunden. Soll trotzdem beendet werden?" #: src/main.c:293 #, c-format msgid "There are %d open worlds. Do you really want to quit?" msgstr "Es sind noch %d Welten verbunden. Soll trotzdem beendet werden?" #: src/main.c:296 msgid "Really Quit KildClient?" msgstr "Soll KildClient wirklich beendet werden?" #: src/main.c:298 msgid "Don't quit" msgstr "Nicht beenden" #: src/net.c:150 msgid "" "You're attempting to connect to a world that uses SSL, but this version of " "KildClient has been built without SSL support. Try to connect without SSL?" msgstr "" "Es wird versucht mit einer Welt zu verbinden, die SSL verwendet. Diese " "Version von Kildclient wurde aber ohne SSL-Unterstützung erstellt. Soll die " "Verbindung ohne SSL-Verschlüsselung versucht werden?" #: src/net.c:151 msgid "KildClient Question" msgstr "Frage - KildClient" #: src/net.c:153 msgid "Connect without SSL" msgstr "Ohne SSL-Verschlüsselung verbinden" #: src/net.c:154 msgid "Do not connect" msgstr "Nicht verbinden" #: src/net.c:168 msgid "This version of KildClient does not have SSL support." msgstr "" "Diese Version von KildClient enthält keine Unterstützung für SSL-" "Verschlüsselung." #: src/net.c:238 src/proxy.c:206 #, c-format msgid "Resolving proxy host %s..." msgstr "Löse Proxy-Hostnamen %s auf..." #: src/net.c:241 #, c-format msgid "Resolving host %s..." msgstr "Löse Hostnamen %s auf..." #: src/net.c:272 src/proxy.c:224 msgid "Could not start name-resolution thread." msgstr "Der Thread für die Namensauflösung konnte nicht gestartet werden." #: src/net.c:324 src/proxy.c:190 #, c-format msgid "Could not resolve host %s: %s" msgstr "Kann Hostnamen %s nicht auflösen: %s" #: src/net.c:352 #, c-format msgid "Attempting to connect to host %s (%s) port %s..." msgstr "Versuche eine Verbindung zu %s (%s) an Port %s herzustellen..." #: src/net.c:355 #, c-format msgid "Attempting to connect to proxy host %s (%s) port %s..." msgstr "Versuche eine Verbindung zum Proxy %s (%s) an Port %s herzustellen..." #: src/net.c:374 #, c-format msgid "Could not create socket: %s" msgstr "Kann Socket nicht erzeugen: %s" #: src/net.c:377 #, c-format msgid "Could not create socket: error #%d" msgstr "Kann Socket nicht erzeugen: Fehler #%d" #: src/net.c:397 #, c-format msgid "Could not connect to host %s port %s: %s" msgstr "Kann nicht mit %s an Port %s verbinden: %s" #: src/net.c:407 #, c-format msgid "Could not connect to host %s port %s: Error #%d" msgstr "Kann nicht mit %s an Port %s verbinden: Fehler #%d" #: src/net.c:463 #, c-format msgid "Unable to connect to host %s: %s." msgstr "Kann nicht mit %s verbinden: %s" #: src/net.c:466 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "Kann nicht mit Proxy %s verbinden: %s" #: src/net.c:508 src/net.c:526 #, c-format msgid "Unable to connect to host %s: Error #%d." msgstr "Kann nicht mit %s verbinden: Fehler #%d." #: src/net.c:511 src/net.c:529 #, c-format msgid "Unable to connect to proxy host %s: Error #%d." msgstr "Kann nicht mit Proxy %s verbinden: Fehler #%d." #: src/net.c:563 #, c-format msgid "Performing SSL handshake..." msgstr "SSL-Handshake wird ausgeführt..." #: src/net.c:613 #, c-format msgid "SSL Handshake failed: %s" msgstr "SSL-Handshake schlug fehl: %s" #: src/net.c:655 #, c-format msgid "SSL Handshake took too long." msgstr "" #: src/net.c:684 src/net.c:1510 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "Verbunden mit %s (%s) an Port %s." #: src/net.c:687 src/net.c:1513 #, c-format msgid "Connected to host %s port %s, via proxy %s (%s) port %s." msgstr "Verbunden mit %s an Port %s über Proxy %s (%s) an Port %s." #: src/net.c:694 src/net.c:1485 src/net.c:1520 msgid " SSL enabled." msgstr "SSL eingeschaltet." #: src/net.c:712 src/perlscript.c:3069 #, c-format msgid "Logging to file %s.\n" msgstr "Verwende Protokolldatei %s.\n" #: src/net.c:858 #, c-format msgid "Disconnected from host %s." msgstr "Verbindung mit %s wurde getrennt." #: src/net.c:931 src/net.c:940 #, c-format msgid "Disconnected from host %s: %s." msgstr "Verbindung mit %s wurde getrennt: %s." #: src/net.c:951 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "Verbindung mit %s wurde getrennt: Fehler #%d." #: src/net.c:1473 #, c-format msgid "Connected to host %s (%s) port %s, MCCP version %d enabled." msgstr "Verbunden mit %s (%s) an Port %s. Verwende MCCP Version %d." #: src/net.c:1477 #, c-format msgid "" "Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d " "enabled." msgstr "" "Verbunden mit %s an Port %s, über Proxy %s (%s) an Port %s. Verwende MCCP " "version %d." #: src/net.c:1598 src/we_logging.c:135 msgid "Not connected." msgstr "Nicht verbunden." #. success #: src/proxy.c:61 msgid "general failure" msgstr "Allgemeiner Fehler" #: src/proxy.c:62 msgid "connection not allowed by ruleset" msgstr "Die Regeln verbieten die Verbindung" #: src/proxy.c:63 msgid "network unreachable" msgstr "Netzwerk nicht erreichbar" #: src/proxy.c:64 msgid "host unreachable" msgstr "Gegenstelle nicht erreichbar" #: src/proxy.c:65 msgid "connection refused by destination host" msgstr "Verbindung wurde von der Gegenstelle abgelehnt" #: src/proxy.c:66 msgid "TTL expired" msgstr "TTL abgelaufen" #: src/proxy.c:67 msgid "command not supported / protocol error" msgstr "Befehl wird nicht unterstützt / Protokollfehler" #: src/proxy.c:68 msgid "address type not supported" msgstr "Addresstyp wird nicht unterstützt" #: src/proxy.c:241 #, c-format msgid "Connected to proxy server %s port %s, sending request..." msgstr "Verbunden mit Proxyserver %s an Port %s, sende Anfrage...." #: src/proxy.c:296 src/proxy.c:425 src/proxy.c:470 src/proxy.c:544 msgid "Error while reading from proxy host." msgstr "Fehler beim Lesen vom Proxyserver." #: src/proxy.c:317 msgid "request rejected or failed" msgstr "Anfrage wurde abgelehnt oder schlug fehl" #: src/proxy.c:321 msgid "request failed because identd could not be reached" msgstr "Anfrage fehlgeschlagen, da der IDENT-Server nicht erreichbar war" #: src/proxy.c:325 msgid "" "request failed because client's identd could not confirm the user ID string " "in the request" msgstr "" "Anfrage fehlgeschlagen, da der IDENT-Server die Benutzeridentifikation nicht " "bestätigt hat" #: src/proxy.c:329 src/proxy.c:570 #, c-format msgid "Proxy request failed: %s." msgstr "Proxy-Anfrage fehlgeschlagen: %s." #: src/proxy.c:346 #, c-format msgid "Connected to proxy server %s port %s, negotiating authentication..." msgstr "Verbunden mit Proxyserver %s an Port %s, Authentifizierung läuft..." #: src/proxy.c:440 msgid "No acceptable proxy authentication methods." msgstr "" "Es sind keine akzeptablen Authentifizierungsmethoden beim Proxy verfügbar." #: src/proxy.c:488 msgid "Proxy authentication failed." msgstr "Die Authentifizierung am Proxy ist fehlgeschlagen." #. Should never happen #: src/proxy.c:531 msgid "Unrecognized response from proxy host." msgstr "Unverständliche Antwort vom Proxyserver." #: src/proxy.c:565 msgid "unknown reason code" msgstr "Unbekannter Grund." #: src/proxy.c:586 #, c-format msgid "Sending proxy authentication credentials..." msgstr "Sende Authentifizierungsdaten an den Proxyserver..." #: src/proxy.c:625 #, c-format msgid "Sending connection request..." msgstr "Sending Verbindungsanfrage..." #: src/mainwindow.c:173 src/mainwindow.c:550 src/mainwindow.c:815 #: src/worldgui.c:1127 src/worldselector.c:195 src/worldeditor.c:182 #: src/we_general.c:344 src/we_generic_guied.c:83 src/we_triggers.c:85 #: src/we_triggers.c:555 src/we_triggers.c:753 src/we_aliases.c:78 #: src/we_aliases.c:457 src/we_macros.c:81 src/we_macros.c:422 #: src/we_timers.c:78 src/we_timers.c:459 src/we_hooks.c:89 src/we_hooks.c:609 #: src/we_vars.c:78 src/we_vars.c:380 src/prefs.c:109 src/triggers.c:585 #: src/multilinesend.c:95 src/cmdhistory.c:209 src/cmdhistory.c:454 #, c-format msgid "Error loading UI from XML file: %s" msgstr "" #: src/mainwindow.c:610 src/mainwindow.c:611 msgid "Not connected" msgstr "Nicht verbunden" #: src/mainwindow.c:751 msgid ": Not yet active" msgstr ": Noch nicht aktiv" #: src/mainwindow.c:756 msgid ": Expired" msgstr ": Abgelaufen" #: src/mainwindow.c:768 src/dlgStatistics.glade:81 src/dlgStatistics.glade:346 msgid "None" msgstr "Keine" #: src/worldgui.c:227 msgid "_Find:" msgstr "_Suchen:" #: src/worldgui.c:241 msgid "Find Next" msgstr "Weitersuchen" #: src/worldgui.c:273 msgid "Click to clear the command input area." msgstr "Klicken um die Befehlseingabe zu löschen." #: src/worldgui.c:374 msgid "No world" msgstr "Keine Welt" #: src/worldgui.c:448 msgid "KildClient ready" msgstr "KildClient bereit" #: src/worldgui.c:455 msgid "0 lines" msgstr "0 Zeilen" #: src/worldgui.c:910 msgid "Are you sure you want to close this world?" msgstr "Soll diese Welt wirklich geschlossen werden?" #: src/worldgui.c:911 msgid "Really close?" msgstr "Wirklich schließen?" #. Keep Open is RESPONSE_NO because of NO close. But we use #. STOCK_YES to pass a positive image. #: src/worldgui.c:914 msgid "Keep _open" msgstr "_Offen halten" #: src/worldgui.c:1058 #, c-format msgid "Error setting spell checker: %s\n" msgstr "Fehler beim Setzen der Rechtschreibkorrektur: %s\n" #: src/worldgui.c:1062 msgid "Spell checking support not included in this build." msgstr "Die Unterstützung für die Rechtschreibprüfung ist nicht verfügbar." #: src/worldgui.c:1341 msgid "Click to open link; right-click for more options." msgstr "Klicken um den Link zu öffnen; Rechtsklick für weitere Optionen." #: src/worldgui.c:1503 msgid "Not found" msgstr "Nicht gefunden" #: src/ansitextview.c:438 msgid "1 line" msgstr "1 Zeile" #: src/ansitextview.c:440 #, c-format msgid "%d lines" msgstr "%d Zeilen" #: src/worldselector.c:140 src/worldselector.c:690 #, c-format msgid "Could not load world from file '%s': %s" msgstr "Kann Weltdatei '%s' nicht laden: %s" #: src/worldselector.c:143 src/worldselector.c:693 src/worlds.c:2284 #: src/we_generic_guied.c:312 src/we_generic_guied.c:401 src/prefs.c:451 #: src/prefs.c:530 msgid "KildClient Error" msgstr "Fehler - KildClient" #: src/worldselector.c:496 #, c-format msgid "Could not open world '%s': %s\n" msgstr "Kann Welt '%s' nicht öffnen: %s\n" #: src/worldselector.c:538 #, c-format msgid "Invalid argument '%s'\n" msgstr "Ungültiges Argument '%s'\n" #: src/worldselector.c:811 msgid "Disconnected" msgstr "Verbindung getrennt" #: src/worldselector.c:814 src/worldselector.c:821 msgid "Reconnect" msgstr "Erneut verbinden" #: src/worldselector.c:815 src/worldselector.c:822 msgid "Connect to another world" msgstr "Mit einer anderen Welt verbinden" #: src/worldselector.c:816 msgid "Offline" msgstr "Offline bleiben" #: src/worlds.c:690 msgid "Unnamed world" msgstr "Namenlose Welt" #: src/worlds.c:747 #, c-format msgid "Could not open file: %s" msgstr "Kann Datei nicht öffnen: %s" #: src/worlds.c:810 #, fuzzy, c-format msgid "Invalid top-level element '%s'" msgstr "Ungültiges Attribut '%s' für das Element '%s'" #: src/worlds.c:1624 #, c-format msgid "Internal error: element '%s' ends when in START mode" msgstr "" "Interner Fehler: Element '%s' endet obwohl der Beginn eines neuen Elements " "erwartet wird" #: src/worlds.c:1898 #, c-format msgid "Invalid key code '%s'" msgstr "Schlüsselwert '%s' ist ungültig" #: src/worlds.c:1917 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "Element '%s' ist innerhalb des Elements '%s' nicht erlaubt" #: src/worlds.c:1930 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "Ungültiges Attribut '%s' für das Element '%s'" #: src/worlds.c:2281 src/we_generic_guied.c:309 src/prefs.c:448 #, c-format msgid "Could not open file '%s': %s" msgstr "Kann Datei '%s' nicht öffnen: %s" #: src/worlds.c:2440 #, c-format msgid "Disconnected from world %s" msgstr "Verbindung zur Welt %s getrennt" #: src/worldeditor.c:247 msgid "General" msgstr "Allgemein" #: src/worldeditor.c:255 src/worldeditor.c:259 msgid "Display" msgstr "Anzeige" #: src/worldeditor.c:256 msgid "Here you can set options to configure the appearance of KildClient." msgstr "Hier kann das Erscheinungsbild von KildClient angepasst werden." #: src/worldeditor.c:267 msgid "Main Window" msgstr "Hauptfenster" #: src/worldeditor.c:275 msgid "Colors" msgstr "Farben" #: src/worldeditor.c:283 msgid "Status Bar" msgstr "Statuszeile" #: src/worldeditor.c:291 msgid "Input" msgstr "Eingabe" #: src/worldeditor.c:299 msgid "Logging" msgstr "Protokollierung" #: src/worldeditor.c:305 src/worldeditor.c:309 msgid "Automation" msgstr "Automatisierung" #: src/worldeditor.c:306 msgid "" "Here you can set options to configure the automation features of KildClient, " "such as triggers, aliases, plugins, etc." msgstr "" "Hier können Automatisierungsfunktionen von KildClient wie Trigger, Aliase " "oder Plugins eingestellt werden." #: src/worldeditor.c:317 msgid "Scripting" msgstr "Skripte" #: src/worldeditor.c:325 msgid "Plugins" msgstr "Plugins" #: src/worldeditor.c:336 src/kildclient.glade:1808 msgid "Triggers" msgstr "Trigger" #: src/worldeditor.c:347 src/kildclient.glade:1822 msgid "Aliases" msgstr "Aliase" #: src/worldeditor.c:358 src/kildclient.glade:1838 msgid "Macros" msgstr "Makros" #: src/worldeditor.c:369 src/kildclient.glade:1854 msgid "Timers" msgstr "Timer" #: src/worldeditor.c:380 msgid "Hooks" msgstr "Hooks" #: src/worldeditor.c:391 msgid "Variables" msgstr "Variablen" #: src/worldeditor.c:400 msgid "Protocols" msgstr "Netzwerk" #: src/worldeditor.c:408 msgid "Miscellaneous" msgstr "Verschiedenes" #: src/worldeditor.c:416 msgid "Advanced" msgstr "Erweitert" #: src/we_general.c:75 msgid "Character" msgstr "Charakter" #: src/we_general.c:83 msgid "Password" msgstr "Passwort" #: src/we_general.c:383 msgid "You must specify the name." msgstr "Ein Name muss angegeben werden." #: src/we_general.c:384 src/we_general.c:397 src/we_triggers.c:638 #: src/we_triggers.c:652 src/we_aliases.c:519 src/we_aliases.c:532 #: src/we_macros.c:479 src/we_macros.c:492 src/we_macros.c:505 #: src/we_timers.c:518 src/we_timers.c:531 src/we_hooks.c:661 #: src/we_vars.c:408 src/we_vars.c:420 src/we_vars.c:440 #: src/permanentvariables.c:131 src/cmdhistory.c:278 src/cmdhistory.c:290 #: src/cmdhistory.c:484 src/cmdhistory.c:517 src/cmdhistory.c:574 msgid "KildClient Warning" msgstr "Warnung - KildClient" #: src/we_general.c:396 msgid "You must specify the password." msgstr "Ein Passwort muss angegeben werden.." #: src/we_general.c:438 msgid "character" msgstr "Charakter" #: src/we_logging.c:124 #, c-format msgid "Logging to file %s." msgstr "Protokolliere in Datei %s." #: src/we_logging.c:130 msgid "Logging is disabled." msgstr "Die Protokollierung ist ausgeschaltet." #: src/we_logging.c:227 msgid "Logging not started" msgstr "Die Protokollierung ist nicht gestartet." #: src/we_logging.c:257 msgid "Select log file" msgstr "Auswahl der Protokolldatei" #: src/we_plugins.c:126 src/we_plugins.c:343 src/we_triggers.c:227 #: src/we_aliases.c:208 src/we_macros.c:211 src/we_timers.c:208 #: src/we_hooks.c:330 src/perlscript.c:3195 msgid "Name" msgstr "Name" #: src/we_plugins.c:138 src/we_plugins.c:385 src/perlscript.c:3196 msgid "Description" msgstr "Beschreibung" #: src/we_plugins.c:150 src/we_plugins.c:371 msgid "Author" msgstr "Autor" #: src/we_plugins.c:163 msgid "File" msgstr "Datei" #: src/we_plugins.c:211 src/we_plugins.c:467 msgid "Error Loading Plugin" msgstr "Fehler beim Laden eines Plugins" #: src/we_plugins.c:329 src/we_triggers.c:213 src/we_aliases.c:194 #: src/we_macros.c:197 src/we_timers.c:194 src/we_hooks.c:316 msgid "Enabled" msgstr "Aktiviert" #: src/we_plugins.c:357 msgid "Version" msgstr "Version" #: src/we_plugins.c:445 msgid "Always load this plugin at _startup" msgstr "Dieses Plugin beim Programmstart _laden" #: src/we_plugins.c:507 msgid "The help is displayed in main window." msgstr "Die Hilfe wird im Hauptfenster angezeigt." #: src/we_plugins.c:508 msgid "KildClient Information" msgstr "Information - KildClient" #: src/we_plugins.c:509 msgid "_Do not display this message again" msgstr "Diese Meldung _nicht noch einmal anzeigen" #: src/we_plugins.c:581 msgid "Load plugin" msgstr "Plugin laden" #: src/we_generic_guied.c:96 msgid "Export" msgstr "Exportieren" #: src/we_generic_guied.c:363 msgid "Import" msgstr "Importieren" #: src/we_generic_guied.c:398 #, c-format msgid "Could not import file '%s': %s" msgstr "Kann Datei '%s' nicht importieren: %s" #: src/we_generic_guied.c:952 #, c-format msgid "Do you really want to delete the %s?" msgstr "Soll %s wirklich gelöscht werden?" #: src/we_generic_guied.c:959 #, c-format msgid "Do you really want to delete %d %s?" msgstr "Sollen %d %s wirklich gelöscht werden?" #: src/we_generic_guied.c:963 src/we_vars.c:292 msgid "Confirm deletion" msgstr "Löschvorgang bestätigen" #: src/we_generic_guied.c:964 msgid "Do not delete" msgstr "Nicht löschen" #: src/we_generic_guied.c:972 msgid "Delete" msgstr "Löschen" #: src/we_triggers.c:132 src/dlgTestTriggers.glade:7 msgid "Test Triggers" msgstr "Trigger testen" #: src/we_triggers.c:241 src/we_aliases.c:222 src/triggers.c:449 #: src/aliases.c:171 msgid "Pattern" msgstr "Muster" #: src/we_triggers.c:259 src/we_aliases.c:240 msgid "I. Case" msgstr "I. Fall" #: src/we_triggers.c:273 src/we_macros.c:239 src/we_timers.c:248 #: src/we_hooks.c:344 src/triggers.c:450 src/macros.c:147 src/timers.c:205 msgid "Action" msgstr "Aktion" #: src/we_triggers.c:291 msgid "Gag" msgstr "Gag" #: src/we_triggers.c:309 msgid "Gag Log" msgstr "Gag Protokoll" #: src/we_triggers.c:327 msgid "Keep Exec" msgstr "_Ausführung beibehalten" #: src/we_triggers.c:345 msgid "Rewriter" msgstr "Rewriter" #: src/we_triggers.c:363 msgid "Style" msgstr "Stil" #: src/we_triggers.c:377 src/we_aliases.c:286 src/we_macros.c:253 #: src/we_timers.c:280 src/we_hooks.c:358 msgid "Plugin" msgstr "Plugin" #: src/we_triggers.c:473 share/kildclient.pl:233 share/kildclient.pl:236 #: share/kildclient.pl:443 share/kildclient.pl:518 share/kildclient.pl:721 msgid "trigger" msgstr "Trigger" #: src/we_triggers.c:473 share/kildclient.pl:443 msgid "triggers" msgstr "Trigger" #: src/we_triggers.c:637 src/we_aliases.c:518 msgid "You must specify the pattern." msgstr "Das Muster muss angegeben werden." #: src/we_triggers.c:651 msgid "" "You must specify the action, unless the trigger is a gag or changes the " "style." msgstr "" "So lange der Trigger kein Gag ist oder den einen Stil ändert, muss eine " "Aktion angegeben werden." #: src/we_aliases.c:254 src/aliases.c:172 msgid "Substitution" msgstr "Ersetzen" #: src/we_aliases.c:272 msgid "Eval as Perl" msgstr "Als Perl-Code auführen" #: src/we_aliases.c:382 share/kildclient.pl:246 share/kildclient.pl:249 #: share/kildclient.pl:449 share/kildclient.pl:524 share/kildclient.pl:733 msgid "alias" msgstr "Alias" #: src/we_aliases.c:382 share/kildclient.pl:449 msgid "aliases" msgstr "Aliase" #: src/we_aliases.c:531 msgid "You must specify the substitution." msgstr "Die Ersetzung muss angegeben werden." #: src/we_macros.c:225 src/macros.c:146 msgid "Key" msgstr "Schlüssel" #: src/we_macros.c:349 share/kildclient.pl:259 share/kildclient.pl:262 #: share/kildclient.pl:455 share/kildclient.pl:530 share/kildclient.pl:745 msgid "macro" msgstr "Makro" #: src/we_macros.c:349 share/kildclient.pl:455 msgid "macros" msgstr "Makros" #: src/we_macros.c:478 msgid "You must specify the key." msgstr "Der Schlüssel muss angegeben werden." #: src/we_macros.c:491 msgid "Invalid key code." msgstr "Ungültiger Schlüsselcode." #: src/we_macros.c:504 src/we_timers.c:530 src/we_hooks.c:660 msgid "You must specify the action." msgstr "Die Aktion muss angegeben werden." #: src/we_timers.c:221 msgid "Interval" msgstr "Interval" #: src/we_timers.c:234 msgid "Count" msgstr "Anzahl" #: src/we_timers.c:266 msgid "Temp" msgstr "Temporär" #: src/we_timers.c:383 share/kildclient.pl:272 share/kildclient.pl:275 #: share/kildclient.pl:461 share/kildclient.pl:536 share/kildclient.pl:757 msgid "timer" msgstr "Timer" #: src/we_timers.c:383 share/kildclient.pl:461 msgid "timers" msgstr "Timer" #: src/we_timers.c:517 msgid "The interval must be positive." msgstr "Der Interval muss positiv sein." #. The manually added combo for selecting which hook #: src/we_hooks.c:132 msgid "_Event:" msgstr "_Ereignis:" #: src/we_hooks.c:536 share/kildclient.pl:286 share/kildclient.pl:289 #: share/kildclient.pl:467 share/kildclient.pl:543 share/kildclient.pl:770 msgid "hook" msgstr "Hook" #: src/we_hooks.c:536 share/kildclient.pl:467 msgid "hooks" msgstr "Hooks" #: src/we_vars.c:283 msgid "Do you really want to make the variable temporary?" msgstr "Soll die Veriable wirklich zu einer temporären umgewandelt werden?" #: src/we_vars.c:289 #, c-format msgid "Do you really want to make %d variables temporary?" msgstr "Sollen %d Variablen wirklich in temporäre umgewandelt werden?" #: src/we_vars.c:293 msgid "Keep permanent" msgstr "Permanent behalten" #: src/we_vars.c:301 msgid "Make temporary" msgstr "In temporäre Variable umwandeln" #: src/we_vars.c:407 msgid "You must specify a variable name." msgstr "Ein Variablenname muss angegeben werden." #: src/we_vars.c:419 #, c-format msgid "" "Only scalar ($), array (@) and hash (%%) variables can be made permanent." msgstr "" "Nur Skalar ($), Array (@) und Hash (%%) -Variablen können permanent sein." #: src/we_vars.c:438 #, c-format msgid "%s is already permanent." msgstr "%s ist bereits permanent." #: src/prefs.c:401 #, c-format msgid "Invalid window size specification in config file.\n" msgstr "Ungültige Fenstergröße in der Konfigurationsdatei.\n" #: src/prefs.c:421 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "Unbekannte Direktive '%s' in der Konfigurationsdatei.\n" #: src/prefs.c:527 #, c-format msgid "Could not create directory '%s': %s" msgstr "Kann Verzeichnis '%s' nicht erstellen: %s" #: src/parser.c:148 msgid "" "Warning: Trying to send a very long command line. Perhaps a recursive alias " "definition?" msgstr "" "Warnung: Es soll eine sehr lange Kommandozeile gesendet werden. Wurde ein " "Alias rekursiv definiert?" #: src/triggers.c:448 #, c-format msgid "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" msgstr "" #: src/triggers.c:470 src/triggers.c:471 src/triggers.c:472 src/triggers.c:473 #: src/triggers.c:474 src/triggers.c:475 src/triggers.c:476 src/aliases.c:192 #: src/aliases.c:193 src/aliases.c:194 src/macros.c:169 src/timers.c:228 #: src/timers.c:229 src/hooks.c:188 src/perlscript.c:3215 msgid "y" msgstr "j" #: src/triggers.c:470 src/triggers.c:471 src/triggers.c:472 src/triggers.c:473 #: src/triggers.c:474 src/triggers.c:475 src/triggers.c:476 src/aliases.c:192 #: src/aliases.c:193 src/aliases.c:194 src/macros.c:169 src/timers.c:228 #: src/timers.c:229 src/hooks.c:188 src/perlscript.c:3215 msgid "n" msgstr "n" #: src/triggers.c:668 msgid "No" msgstr "Nein" #: src/triggers.c:668 msgid "Yes" msgstr "Ja" #: src/aliases.c:170 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "" #: src/macros.c:145 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "" #: src/timers.c:197 msgid "Num Ena Temp Int " msgstr "" #: src/timers.c:201 msgid "Count " msgstr "Zähler " #: src/permanentvariables.c:127 #, c-format msgid "" "Could not open file '%s': %s\n" "Variables were not saved." msgstr "" "Kann Datei '%s' nicht öffnen: %s\n" "Variablen wurden nicht gesichert." #: src/hooks.c:62 #, c-format msgid "hook: hook '%s' not found\n" msgstr "Hook: Hook '%s' nicht gefunden\n" #: src/hooks.c:78 src/hooks.c:211 msgid "No such hook" msgstr "Es existiert kein solcher Hook." #: src/hooks.c:160 src/hooks.c:206 msgid "Hook not found" msgstr "Hook nicht gefunden" #: src/hooks.c:173 #, c-format msgid "Hooks for '%s':\n" msgstr "Hooks für '%s':\n" #: src/hooks.c:174 msgid "Num Ena Action" msgstr "" #: src/hooks.c:216 #, c-format msgid "" "Hook number %d for event %s\n" " Name: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Hook Nummer %d für das Ereignis %s\n" " Name: %s\n" " Aktion: %s\n" " Aktiv: %s\n" #: src/hooks.c:222 src/perlscript.c:1532 src/perlscript.c:2033 #: src/perlscript.c:2343 src/perlscript.c:2625 msgid "Not set" msgstr "Nicht definiert" #: src/hooks.c:224 src/perlscript.c:1535 src/perlscript.c:1536 #: src/perlscript.c:1537 src/perlscript.c:1538 src/perlscript.c:1539 #: src/perlscript.c:1540 src/perlscript.c:1541 src/perlscript.c:2036 #: src/perlscript.c:2037 src/perlscript.c:2038 src/perlscript.c:2346 #: src/perlscript.c:2629 src/perlscript.c:2630 src/perlscript.c:3253 msgid "yes" msgstr "Ja" #: src/hooks.c:224 src/perlscript.c:1535 src/perlscript.c:1536 #: src/perlscript.c:1537 src/perlscript.c:1538 src/perlscript.c:1539 #: src/perlscript.c:1540 src/perlscript.c:1541 src/perlscript.c:2036 #: src/perlscript.c:2037 src/perlscript.c:2038 src/perlscript.c:2346 #: src/perlscript.c:2629 src/perlscript.c:2630 src/perlscript.c:3253 msgid "no" msgstr "Nein" #: src/log.c:97 msgid "File name not specified." msgstr "Dateiname nicht angegeben." #: src/log.c:161 msgid "Could not open log file." msgstr "Kann Protokolldatei nicht öffnen." #: src/plugins.c:104 src/plugins.c:161 #, c-format msgid "Failed loading file %s: %s" msgstr "Fehler beim Laden der Datei %s: %s" #: src/cmdhistory.c:277 msgid "No command selected." msgstr "Es ist kein Befehl ausgewählt." #: src/cmdhistory.c:289 msgid "More than one command selected." msgstr "Es ist mehr als ein Befehl ausgewählt." #: src/cmdhistory.c:483 msgid "Enter some text to search for." msgstr "Geben Sie den Text ein, nach dem gesucht werden soll." #: src/cmdhistory.c:516 msgid "Use the Find button to find the first result." msgstr "Verwenden Sie den Suchknopf, um das erste Vorkommen zu suchen." #: src/cmdhistory.c:573 msgid "Command not found." msgstr "Befehl nicht gefunden." #: src/perlscript.c:430 src/perlscript.c:436 src/perlscript.c:443 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "Ungültiger Funktionsaufruf: Syntax ist $world->FUNKTION" #: src/perlscript.c:585 src/perlscript.c:602 src/perlscript.c:664 #: src/perlscript.c:697 src/perlscript.c:1075 src/perlscript.c:1101 #: src/perlscript.c:1151 src/perlscript.c:1171 src/perlscript.c:1194 #: src/perlscript.c:1222 src/perlscript.c:1231 src/perlscript.c:1773 #: src/perlscript.c:1782 src/perlscript.c:1962 src/perlscript.c:2133 #: src/perlscript.c:2142 src/perlscript.c:2422 src/perlscript.c:2431 #: src/perlscript.c:2700 src/perlscript.c:2754 src/perlscript.c:2799 #: src/perlscript.c:2864 src/perlscript.c:2875 src/perlscript.c:2967 #: src/perlscript.c:3300 src/kcwin.c:98 #, c-format msgid "%s: Too few arguments" msgstr "%s: Zu wenig Argumente" #: src/perlscript.c:630 #, c-format msgid "%s: Argument must be numeric" msgstr "%s: Das Argument muss numerisch sein" #: src/perlscript.c:678 src/perlscript.c:710 #, c-format msgid "%s: No such world" msgstr "%s: Keine solche Welt gefunden" #: src/perlscript.c:745 msgid "World saved." msgstr "Welt gesichert." #: src/perlscript.c:969 src/perlscript.c:984 src/perlscript.c:994 #, c-format msgid "%s: This is an internal function, do not call directly." msgstr "" "%s: Dies ist eine interne Funktion, die nicht direkt aufgerufen werden " "sollte." #: src/perlscript.c:973 src/perlscript.c:1353 src/perlscript.c:1884 #: src/perlscript.c:2258 src/perlscript.c:2453 src/perlscript.c:2928 #, c-format msgid "%s: Wrong argument type" msgstr "%s: Falscher Argumenttyp" #: src/perlscript.c:1245 src/perlscript.c:1515 msgid "No such trigger" msgstr "Kein solcher Trigger" #: src/perlscript.c:1263 src/perlscript.c:1814 src/perlscript.c:2187 #: src/perlscript.c:2887 #, c-format msgid "%s: Too many string arguments" msgstr "%s: Zu viele String-Argumente" #: src/perlscript.c:1286 src/perlscript.c:1837 #, c-format msgid "%s: pattern given twice, using the named attribute one" msgstr "%s: Das Muster wurde zweimal mit Attribut eins angegeben" #: src/perlscript.c:1298 src/perlscript.c:2236 src/perlscript.c:2907 #, c-format msgid "%s: action given twice, using the named attribute one" msgstr "%s: Die Aktion wurde zweimal mit dem Attribut eins angegeben" #: src/perlscript.c:1344 src/perlscript.c:1875 src/perlscript.c:2249 #: src/perlscript.c:2920 #, c-format msgid "%s: Wrong type of reference" msgstr "%s: Falscher Referenztyp" #: src/perlscript.c:1364 #, c-format msgid "%s: pattern not specified, not creating" msgstr "%s: Muster ist nicht definiert. Erzeuge nichts." #: src/perlscript.c:1373 #, c-format msgid "%s: action not specified, and isn't gag, not creating" msgstr "%s: Aktion ist nicht definiert und kein Gag. Erzeuge nichts." #: src/perlscript.c:1403 msgid "Trigger added." msgstr "Trigger hinzugefügt." #: src/perlscript.c:1409 msgid "Trigger modified." msgstr "Triger wurde verändert." #: src/perlscript.c:1434 #, c-format msgid "%s: invalid target" msgstr "%s: ungültiges Ziel" #: src/perlscript.c:1444 #, c-format msgid "%s: invalid fg color" msgstr "%s: Ungültige Vordergrundfarbe" #: src/perlscript.c:1454 #, c-format msgid "%s: invalid bg color" msgstr "%s: Ungültige Hintergrundfarbe" #: src/perlscript.c:1464 #, c-format msgid "%s: invalid underline style" msgstr "%s: Ungültiger Stil für Unterstreichungen" #: src/perlscript.c:1520 #, c-format msgid "" "Trigger number %d\n" " Name: %s\n" " Pattern: %s\n" " Action: %s\n" " Enabled: %s\n" " Ignore case: %s\n" " Gag output: %s\n" " Gag in log: %s\n" " Keep executing: %s\n" " Rewriter: %s\n" " Change style: %s\n" msgstr "" "Trigger Nummer %d\n" " Name: %s\n" " Muster: %s\n" " Aktion: %s\n" " Aktiv: %s\n" " Ignoriere Groß-/Kleinschreibung: %s\n" " Gag-Ausgabe: %s\n" " Gag ins Protkoll: %s\n" " Ausführung beibehalten: %s\n" " Rewriter: %s\n" " Stiländerung: %s\n" #: src/perlscript.c:1544 #, c-format msgid "" " Target: %d\n" " Foreground: %d\n" " Background: %d\n" " Italics: %d\n" " Striked-thru: %d\n" " Underline: %d\n" msgstr "" " Ziel: %d\n" " Vordergrund: %d\n" " Hintergrund: %d\n" " Kursiv: %d\n" " Durchgestrichen: %d\n" " Unterstrichen: %d\n" #: src/perlscript.c:1796 src/perlscript.c:2020 msgid "No such alias" msgstr "Kein solcher Alias." #: src/perlscript.c:1849 #, c-format msgid "%s: substitution given twice, using the named attribute one" msgstr "%s: Ersetzung zweimal mit dem Attribut eins angegeben" #: src/perlscript.c:1895 msgid "alias: not creating alias without pattern" msgstr "alias: Alias wird ohne Muster nicht erzeugt" #: src/perlscript.c:1903 msgid "alias: not creating alias without substitution" msgstr "alias: Alias wird ohne Ersetzung nicht erzeugt" #: src/perlscript.c:1932 msgid "Alias added." msgstr "Alias hinzugefügt" #: src/perlscript.c:1937 msgid "Alias modified." msgstr "Alias geändert." #: src/perlscript.c:2025 #, c-format msgid "" "Alias number %d\n" " Name: %s\n" " Pattern: %s\n" " Substitution: %s\n" " Ignore case: %s\n" " Eval as Perl: %s\n" " Enabled: %s\n" msgstr "" "Alias Nummer %d\n" " Name: %s\n" " Muster: %s\n" " Ersetzung: %s\n" " Ignoriere Groß-/Kleinschreibung: %s\n" " Als Perl-Code ausführen: %s\n" " Aktiv: %s\n" #: src/perlscript.c:2105 msgid "Press a key to get its keycode." msgstr "Drücken Sie eine Taste um deren Tastencode zu erhalten." #: src/perlscript.c:2157 msgid "macro: No such macro" msgstr "Makro: Kein solches Makro vorhanden" #: src/perlscript.c:2176 src/perlscript.c:2224 #, c-format msgid "%s: Invalid key code" msgstr "%s: Ungültiger Tastencode" #: src/perlscript.c:2213 #, c-format msgid "%s: keycode given twice, using the named attribute one" msgstr "%s: Tastencode wurde zweimal mit dem Attribut eins angegeben" #: src/perlscript.c:2269 #, c-format msgid "%s: keycode not specified, not creating" msgstr "%s: Tastencode nicht angegeben. Wird nicht erzeugt." #: src/perlscript.c:2276 src/perlscript.c:2537 #, c-format msgid "%s: action not specified, not creating" msgstr "%s: Aktion nicht angegeben. Wird nicht erzeugt." #: src/perlscript.c:2295 msgid "Macro added." msgstr "Makro hinzugefügt." #: src/perlscript.c:2300 msgid "Macro modified." msgstr "Makro geändert." #: src/perlscript.c:2331 msgid "No such macro" msgstr "Kein solches Makro vorhanden." #: src/perlscript.c:2337 #, c-format msgid "" "Macro number %d\n" " Name: %s\n" " Key Code: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Makro Nummer %d\n" " Name: %s\n" " Tastencode: %s\n" " Aktion: %s\n" " Aktiv: %s\n" #: src/perlscript.c:2447 msgid "timer: No such timer" msgstr "Timer: Kein solcher Timer vorhanden." #: src/perlscript.c:2472 #, c-format msgid "%s: interval must be numeric" msgstr "%s: Interval muss numerisch sein" #: src/perlscript.c:2485 #, c-format msgid "%s: count must be numeric" msgstr "%s: Anzahl muss numerisch sein" #: src/perlscript.c:2516 #, c-format msgid "%s: interval not specified, not creating" msgstr "%s: Interval nicht angegeben. Wird nicht erzeugt." #: src/perlscript.c:2577 msgid "Timer added." msgstr "Timer hinzugefügt." #: src/perlscript.c:2582 msgid "Timer modified." msgstr "Timer geändert." #: src/perlscript.c:2612 msgid "No such timer" msgstr "Kein solcher Timer vorhanden." #: src/perlscript.c:2617 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %d\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" "Timer Nummer %d\n" " Name: %s\n" " Interval: %d\n" " Wiederholungen: %d\n" " Aktion: %s\n" " Aktiv: %s\n" " Temporär: %s\n" #: src/perlscript.c:2708 #, c-format msgid "" "%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent" msgstr "" "%s: Nur Skalar ($), Array (@) und Hash (%%) -Variablen können permanent sein" #: src/perlscript.c:2717 #, c-format msgid "%s: %s is already permanent" msgstr "%s: %s ist schon permanent" #: src/perlscript.c:2731 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "%s: Variable '%s' in permanente Variable umgewandelt.\n" #: src/perlscript.c:2773 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "%s: Variable '%s' in permanente Variable umgewandelt.\n" #: src/perlscript.c:2777 #, c-format msgid "%s: %s is not permanent" msgstr "%s: %s ist nicht permanent" #: src/perlscript.c:2830 msgid "Permanent variables" msgstr "Permanente Variablen" #: src/perlscript.c:2942 msgid "Hook defined." msgstr "Hook definiert." #: src/perlscript.c:2946 msgid "Hook modified." msgstr "Hook geändert." #: src/perlscript.c:3052 msgid "Logging stopped." msgstr "Protokollierung gestoppt." #: src/perlscript.c:3194 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "" #: src/perlscript.c:3237 msgid "No such plugin" msgstr "Kein solches Plugin gefunden." #: src/perlscript.c:3242 #, c-format msgid "" "Plugin number %d\n" " Name: %s\n" " Version: %s\n" " Description: %s\n" " Author: %s\n" " Enabled: %s\n" msgstr "" "Plugin Nummer %d\n" " Name: %s\n" " Version: %s\n" " Beschreibung: %s\n" " Autor: %s\n" " Aktiv: %s\n" #: src/kildclient.glade:176 msgid "_Import" msgstr "_Importieren" #: src/kildclient.glade:225 msgid "E_xport" msgstr "_Exportieren" #: src/kildclient.glade:274 msgid "Edit Alias" msgstr "Alias bearbeiten" #: src/kildclient.glade:293 src/kildclient.glade:536 src/kildclient.glade:875 #: src/kildclient.glade:1170 src/kildclient.glade:1441 #: src/kildclient.glade:1687 src/dlgEditWorld.glade:92 #: src/dlgEditWorld.glade:3305 msgid "_Name:" msgstr "_Name:" #: src/kildclient.glade:306 src/kildclient.glade:549 msgid "_Pattern:" msgstr "_Muster:" #: src/kildclient.glade:321 msgid "_Substitution:" msgstr "_Ersetzung:" #: src/kildclient.glade:336 msgid "Enter optionally a descriptive name for the alias" msgstr "Geben Sie optional einen beschreibenden Namen für das Alias ein" #: src/kildclient.glade:350 msgid "Enter the pattern to match against typed commands" msgstr "Geben Sie das Muster ein, auf das in eingegebene Befehlen geprüft wird" #: src/kildclient.glade:365 msgid "Enter the substitution to be executed" msgstr "Geben Sie die auszuführende Ersetzung ein" #: src/kildclient.glade:378 msgid "E_val substitution as Perl statement" msgstr "Ersetzung als Perl-Code e_valuieren" #: src/kildclient.glade:382 msgid "Check to have the substitution be executed in a s///e construction" msgstr "" "Wählen, wenn die Ersetzung in einer s///e Konstruktion ausgeführt werden soll" #: src/kildclient.glade:396 src/kildclient.glade:638 src/kildclient.glade:978 #: src/kildclient.glade:1226 src/kildclient.glade:1421 msgid "_Enabled" msgstr "_Aktiv" #: src/kildclient.glade:400 msgid "Check to make the alias enabled; only enabled aliases are tried" msgstr "" "Wählen, um das Alias zu aktivieren (nur aktivierte Aliase haben einen Effekt)" #: src/kildclient.glade:416 src/kildclient.glade:712 src/kildclient.glade:1072 #: src/kildclient.glade:1292 src/kildclient.glade:1496 msgid "Note:" msgstr "Hinweis:" #: src/kildclient.glade:430 src/kildclient.glade:726 src/kildclient.glade:1086 #: src/kildclient.glade:1306 src/kildclient.glade:1510 msgid "" "This object belongs to a plugin. Changes made here will not be saved " "in the plugin." msgstr "" "Dieses Objekt gehört zu einem Plugin. Änderungen, die hier gemacht werden, " "werden nicht im Plugin gespeichert." #: src/kildclient.glade:445 src/kildclient.glade:741 msgid "_Ignore case when matching" msgstr "Groß-/Kleinschreibung beim Mustervergleich _ignorieren" #: src/kildclient.glade:516 src/kildclient.glade:2030 msgid "Enter optionally a descriptive name for the trigger" msgstr "Geben Sie optional einen beschreibenden Namen für den Trigger ein" #: src/kildclient.glade:517 msgid "Edit Trigger" msgstr "Trigger bearbeiten" #: src/kildclient.glade:564 src/kildclient.glade:932 src/kildclient.glade:1246 #: src/kildclient.glade:1393 msgid "_Action:" msgstr "_Aktion:" #: src/kildclient.glade:592 msgid "Enter the pattern to match against received lines" msgstr "Geben Sie das Muster ein, das gegen empfangene Zeilen geprüft wird" #: src/kildclient.glade:607 msgid "Enter the action that will be run when a match happens" msgstr "" "Geben Sie eine Aktion ein, die ausgeführt wird, wenn ein Muster gefunden wird" #: src/kildclient.glade:620 msgid "Omit (_gag) from output" msgstr "Passende Zeilen nicht ausgeben" #: src/kildclient.glade:624 msgid "Check to make the matched line not be printed in the main output window" msgstr "" "Wählen, wenn Zeilen, auf die das Muster passt, nicht angezeigt werden soll" #: src/kildclient.glade:642 msgid "Check to make the trigger enabled; only enabled triggers are tried" msgstr "" "Wählen, um den Trigger zu aktivieren (nur aktive Trigger haben einen Effekt)" #: src/kildclient.glade:656 msgid "Omit (gag) from _log file" msgstr "Passende Zeilen nicht ins Protokoll schreiben" #: src/kildclient.glade:660 msgid "Check to make the matched line not be printed in the log file" msgstr "" "Wählen, wenn die Zeile, auf die das Muster passt, nicht im Protokoll " "auftauchen soll" #: src/kildclient.glade:674 msgid "_Keep executing other triggers after this this one matches" msgstr "Auch bei Auslösung _weitere Trigger ausführen" #: src/kildclient.glade:678 msgid "" "Check to make this trigger not prevent further triggers from being tried, if " "it matches" msgstr "" "Wählen, wenn weitere Trigger ausgeführt werden sollen, auch wenn dieser " "Trigger ausgelöst wurde" #: src/kildclient.glade:692 msgid "_Rewriter trigger" msgstr "_Rewriter Trigger" #: src/kildclient.glade:696 msgid "Check to make this trigger a rewriter trigger" msgstr "Wählen, wenn dieser Trigger ein Rewriter-Trigger sein soll" #: src/kildclient.glade:763 msgid "C_hange style" msgstr "Stil ä_ndern" #: src/kildclient.glade:779 msgid "C_onfigure..." msgstr "_Einstellen..." #: src/kildclient.glade:856 msgid "Edit Timer" msgstr "Timer bearbeiten" #: src/kildclient.glade:888 msgid "_Interval:" msgstr "_Interval:" #: src/kildclient.glade:903 msgid "Enter optionally a descriptive name for the timer" msgstr "Geben Sie optional einen beschreibenden Namen für den Timer ein" #: src/kildclient.glade:917 msgid "Enter the action to be executed whenever the timer fires" msgstr "" "Geben Sie eine Aktion ein, die immer ausgeführt werden soll, wenn ein Timer " "ausgelöst wurde" #: src/kildclient.glade:947 msgid "_Repeat count:" msgstr "_Wiederholungen:" #: src/kildclient.glade:960 msgid "" "_Temporary (will be deleted automatically when its repeat count reaches 0)" msgstr "_Temporär (wird gelöscht, sobald der Wiederholungszähler 0 erreicht)" #: src/kildclient.glade:964 msgid "Check to have the timer deleted after its repeat count has reached 0" msgstr "" "Wählen, wenn der Timer gelöscht werden soll, sobald sein Wiederholungszähler " "0 geworden ist" #: src/kildclient.glade:982 msgid "Check to make the timer enabled; only enabled timers are run" msgstr "" "Wählen, um den Timer zu aktivieren (nur aktive Timer haben einen Effekt)" #: src/kildclient.glade:1002 msgid "Specify the interval, in seconds, between timer activations" msgstr "" "Geben Sie das Interval in Sekunden ein zwischen dem die Timer ausgelöst " "werden" #: src/kildclient.glade:1015 msgid "seconds" msgstr "Sekunden" #: src/kildclient.glade:1039 msgid "" "Specify how many times this timer should run before being disabled or deleted" msgstr "" "Geben Sie an, wie oft ein Timer ausgeführt werden soll, bevor er gelöscht " "oder deaktiviert wird" #: src/kildclient.glade:1052 msgid "(-1 to repeat indefinitely)" msgstr "(-1 für unbegrenzt viele Wiederholungen)" #: src/kildclient.glade:1151 msgid "Edit Macro" msgstr "Makro bearbeiten" #: src/kildclient.glade:1183 msgid "_Key:" msgstr "_Taste:" #: src/kildclient.glade:1198 msgid "Enter optionally a descriptive name for the macro" msgstr "Geben Sie optional einen beschreibenden Namen für das Makro an" #: src/kildclient.glade:1212 msgid "Press the key that will be used to run the macro" msgstr "Drücken Sie die Taste, die diesem Makro zugeordnet werden soll" #: src/kildclient.glade:1230 msgid "Check to make the macro enabled; only enabled macros are run" msgstr "" "Wählen, um das Makro zu aktivieren (nur aktivierte Makros haben einen Effekt)" #: src/kildclient.glade:1261 msgid "Enter the action to be run when the key is pressed" msgstr "" "Geben Sie die Aktion ein, die ausgeführt werden soll, wenn die Taste " "gedrückt wird" #: src/kildclient.glade:1276 msgid "" "Press the key that will be used to activate the macro while the cursor is in " "the text box." msgstr "" "Drücken Sie die Taste, die das Makro aktiviert, solange sich der Cursor in " "der Textbox befindet." #: src/kildclient.glade:1374 msgid "Edit Hook" msgstr "Hook bearbeiten" #: src/kildclient.glade:1408 msgid "Enter the action to be run when the event happens" msgstr "" "Geben Sie die Aktion ein, die ausgeführt werden soll, wenn ein Ereignis " "stattfindet" #: src/kildclient.glade:1425 msgid "Check to make the hook enabled; only enabled hooks are run" msgstr "" "Wählen, um den Hook zu aktivieren (nur aktivierte Hooks haben einen Effekt)" #: src/kildclient.glade:1456 msgid "Enter optionally a descriptive name for the hook" msgstr "Geben Sie optional einen beschreibenden Namen für den Hook an" #: src/kildclient.glade:1472 msgid "Event:" msgstr "Ereignis:" #: src/kildclient.glade:1575 msgid "Permenent variable" msgstr "Permanente Variable" #: src/kildclient.glade:1592 msgid "_Name of variable to make permanent:" msgstr "_Name der permanenten Variable:" #: src/kildclient.glade:1606 msgid "" "Enter the name of a scalar ($), array (@) or hash (%) variable whose " "contents are to be saved between sessions of the World" msgstr "" "Geben Sie den Namen einer Skalar ($), Array (@) oder Hash (%) Variable an, " "deren Inhalt beim beenden gespeichert werden soll." #: src/kildclient.glade:1668 msgid "Edit Character Information" msgstr "Charakter-Informationen bearbeiten" #: src/kildclient.glade:1700 msgid "Enter the character's name for automatic login" msgstr "Geben Sie den Namen des Charakters für das automatische Login an" #: src/kildclient.glade:1714 msgid "_Password:" msgstr "Pas_swort:" #: src/kildclient.glade:1729 msgid "Enter the character's password for automatic login" msgstr "Geben Sie das Passwort des Charakters für das automatische Login an" #: src/kildclient.glade:1870 msgid "Permanent Variables" msgstr "Permanente Variablen" #: src/kildclient.glade:1886 msgid "OnConnect Hooks" msgstr "" #: src/kildclient.glade:1902 msgid "OnDisconnect Hooks" msgstr "" #: src/kildclient.glade:1920 msgid "OnReceivedText Hooks" msgstr "" #: src/kildclient.glade:1938 msgid "OnSentCommand Hooks" msgstr "" #: src/kildclient.glade:1956 msgid "OnGetFocus Hooks" msgstr "" #: src/kildclient.glade:1974 msgid "OnLoseFocus Hooks" msgstr "" #: src/kildclient.glade:1992 msgid "OnCloseConnected Hooks" msgstr "" #: src/kildclient.glade:2019 msgid "_Items to export" msgstr "Zu exportierende _Elemente" #: src/kildclient.glade:2031 msgid "Change Style" msgstr "Stil ändern" #: src/kildclient.glade:2050 msgid "_Background:" msgstr "_Hintergrund:" #: src/kildclient.glade:2064 msgid "_Italic:" msgstr "_Kursiv:" #: src/kildclient.glade:2077 src/kildclient.glade:2123 msgid "" "Do not change\n" "No\n" "Yes" msgstr "" "Nicht ändern\n" "Nein\n" "Ja" #: src/kildclient.glade:2093 msgid "_Underline:" msgstr "_Unterstreichen:" #: src/kildclient.glade:2106 msgid "" "Do not change\n" "None\n" "Single\n" "Double" msgstr "" "Nicht ändern\n" "Keine\n" "Einfach\n" "Doppelt" #: src/kildclient.glade:2139 msgid "_Striked-thru:" msgstr "_Durchgestrichen:" #: src/kildclient.glade:2153 msgid "_Foreground:" msgstr "V_ordergrund:" #: src/kildclient.glade:2167 msgid "_Apply to:" msgstr "_Anwenden auf:" #: src/kildclient.glade:2181 msgid "The whole line" msgstr "Ganze Zeilen" #: src/kildclient.glade:2196 msgid "The whole matched text" msgstr "Ganzer zutreffender Text" #: src/kildclient.glade:2216 msgid "The matched substring number" msgstr "Zutreffender Teil Nummer" #: src/kildclient.glade:2259 src/kildclient.glade:2290 msgid "" "Do not change\n" "Black\n" "Red\n" "Green\n" "Yellow\n" "Blue\n" "Magenta\n" "Cyan\n" "White\n" "Default\n" "Black (bold)\n" "Red (bold)\n" "Green (bold)\n" "Yellow (bold)\n" "Blue (bold)\n" "Magenta (bold)\n" "Cyan (bold)\n" "White (bold)\n" "Default (bold)\n" msgstr "" "Nicht ändern\n" "Schwarz\n" "Rot\n" "Grün\n" "Gelb\n" "Blau\n" "Magenta\n" "Zyan\n" "Weiß\n" "Standard\n" "Schwarz (fett)\n" "Rot (fett)\n" "Grün (fett)\n" "Gelb (fett)\n" "Blau (fett)\n" "Magenta (fett)\n" "Zyan (fett)\n" "Weiß (fett)\n" "Standard (fett)\n" #: src/wndmain.glade:20 msgid "_World" msgstr "_Welt" #: src/wndmain.glade:37 msgid "_Reconnect" msgstr "_Erneut verbinden" #: src/wndmain.glade:45 msgid "_Disconnect" msgstr "_Verbindung trennen" #: src/wndmain.glade:53 msgid "Connect to _Another" msgstr "Zu _anderer Welt verbinden" #: src/wndmain.glade:74 msgid "_Edit..." msgstr "_Bearbeiten..." #: src/wndmain.glade:91 msgid "S_tatistics..." msgstr "S_tatistiken..." #: src/wndmain.glade:103 src/wndmain.glade:238 msgid "_Previous" msgstr "_Vorherige" #: src/wndmain.glade:118 src/wndmain.glade:247 msgid "_Next" msgstr "_Nächste" #: src/wndmain.glade:151 msgid "_Edit" msgstr "_Bearbeiten" #: src/wndmain.glade:209 msgid "Find Ne_xt" msgstr "_Weitersuchen" #: src/wndmain.glade:222 msgid "_Input" msgstr "_Eingabe" #: src/wndmain.glade:256 msgid "Find Previous" msgstr "Vorherige suchen" #: src/wndmain.glade:265 msgid "Find N_ext" msgstr "Nächste suchen" #: src/wndmain.glade:274 msgid "Command _History..." msgstr "Befehls_historie..." #: src/wndmain.glade:288 msgid "_Multi-line Send..." msgstr "_Mehrzeiliges Senden..." #: src/wndmain.glade:302 msgid "_Test Triggers..." msgstr "Trigger _testen..." #: src/wndmain.glade:314 msgid "_Preferences" msgstr "_Einstellungen" #: src/wndmain.glade:322 msgid "Disable _Triggers" msgstr "_Trigger deaktivieren" #: src/wndmain.glade:331 msgid "Disable _Aliases" msgstr "_Aliase deaktivieren" #: src/wndmain.glade:340 msgid "Disable _Macros" msgstr "_Makros deaktivieren" #: src/wndmain.glade:349 msgid "Disable T_imers" msgstr "T_imers deaktivieren" #: src/wndmain.glade:363 msgid "_Debug Matches" msgstr "" #: src/wndmain.glade:390 msgid "Edit Default _World..." msgstr "Voreingestellte _Welt bearbeiten..." #: src/wndmain.glade:402 msgid "_Display" msgstr "_Anzeige" #: src/wndmain.glade:411 msgid "_Split Window" msgstr "" #: src/wndmain.glade:424 msgid "_Help" msgstr "_Hilfe" #: src/wndmain.glade:430 msgid "_Manual" msgstr "Hand_buch" #: src/wndmain.glade:447 msgid "_About" msgstr "Ü_ber" #: src/dlgSelectWorld.glade:7 msgid "Connect to" msgstr "Verbinde zu" #: src/dlgSelectWorld.glade:19 msgid "_Select a saved world:" msgstr "_Eine bekannte Welt wählen:" #: src/dlgSelectWorld.glade:116 msgid "Or connect d_irectly:" msgstr "_Direkt verbinden:" #: src/dlgSelectWorld.glade:141 src/dlgEditWorld.glade:107 msgid "_Host:" msgstr "_Server:" #: src/dlgSelectWorld.glade:154 src/dlgEditWorld.glade:124 msgid "_Port:" msgstr "_Port:" #: src/dlgPreferences.glade:6 msgid "Preferences" msgstr "Einstellungen" #: src/dlgPreferences.glade:33 msgid "Colors used by KildClient" msgstr "Farben, die von KildClient verwendet werden" #: src/dlgPreferences.glade:65 msgid "_Informative messages:" msgstr "_Informative Meldungen:" #: src/dlgPreferences.glade:77 src/dlgPreferences.glade:117 msgid "" "Black\n" "Red\n" "Green\n" "Yellow\n" "Blue\n" "Magenta\n" "Cyan\n" "White\n" "Default\n" "Black (bold)\n" "Red (bold)\n" "Green (bold)\n" "Yellow (bold)\n" "Blue (bold)\n" "Magenta (bold)\n" "Cyan (bold)\n" "White (bold)\n" "Default (bold)\n" msgstr "" "Schwarz\n" "Rot\n" "Grün\n" "Gelb\n" "Blau\n" "Magenta\n" "Zyan\n" "Weiß\n" "Standard\n" "Schwarz (fett)\n" "Rot (fett)\n" "Grün (fett)\n" "Gelb (fett)\n" "Blau (fett)\n" "Magenta (fett)\n" "Zyan (fett)\n" "Weiß (fett)\n" "Standard (fett)\n" #: src/dlgPreferences.glade:105 msgid "_Command echo:" msgstr "Befehls-_Echo:" #: src/dlgPreferences.glade:168 msgid "Window configuration" msgstr "Fensterkonfiguration" #: src/dlgPreferences.glade:200 msgid "_Tab position:" msgstr "_Tab-Position:" #: src/dlgPreferences.glade:212 msgid "" "Left\n" "Right\n" "Top\n" "Bottom" msgstr "" "Rechts\n" "Links\n" "Oben\n" "Unten" #: src/dlgPreferences.glade:226 msgid "_Hide tabs if only one world is open" msgstr "_Verstecke Tabs, wenn nur eine Welt geöffnet ist" #: src/dlgPreferences.glade:231 msgid "" "If this is checked, when there is only one open world no tabs will be shown" msgstr "" "Wenn diese Einstellung aktiv und nur eine Welt offen ist, werden keine Tabs " "angezeigt" #: src/dlgPreferences.glade:242 msgid "_Flash window when new text is received" msgstr "Fenster _Blinken lassen, wenn neuer Text empfangen wurde" #: src/dlgPreferences.glade:280 msgid "Appearance" msgstr "Erscheinungsbild" #: src/dlgPreferences.glade:302 msgid "Sending Delays" msgstr "Sendeverzögerungen" #: src/dlgPreferences.glade:334 msgid "Enter the default parameters for sending multiple lines or commands:" msgstr "Standardeinstellungen für das Senden mehrerer Zeilen oder Kommandos:" #: src/dlgPreferences.glade:349 msgid "_Number of lines/commands to send at once:" msgstr "_Anzahl an Zeilen/Kommandos, die auf einmal gesendet werden können:" #: src/dlgPreferences.glade:386 msgid "_Delay between each group of lines/commands:" msgstr "_Verzögerung in Sekunden zwischen dem Senden:" #: src/dlgPreferences.glade:442 msgid "Sending" msgstr "Senden" #: src/dlgPreferences.glade:465 msgid "Web Browser" msgstr "Web Browser" #: src/dlgPreferences.glade:498 msgid "Specify the command used to launch a web browser" msgstr "" "Geben Sie das Kommando an, mit dem der Webbrowser gestartet werden kann" #: src/dlgPreferences.glade:512 msgid "" "Enter the command to run a web browser. %s will be substituted by the web " "page address." msgstr "" "Geben Sie den Befehl an, mit dem der Webbrowser gestartet werden kann. %s " "wird durch die Webseiten-Adresse ersetzt." #: src/dlgPreferences.glade:548 msgid "Audio Player" msgstr "" #: src/dlgPreferences.glade:581 msgid "Specify the command used to play sound files." msgstr "" "Geben Sie den Befehl an, mit dem Klangdateien abgespielt werden können." #: src/dlgPreferences.glade:595 msgid "" "Enter the command to run an audio player program. %s will be substituted by " "the file path." msgstr "" "Befehl, mit dem Klangdateien abgespielt werden können. %s wird durch den " "Dateipfad ersetzt." #: src/dlgPreferences.glade:627 msgid "External Programs" msgstr "Externe Programme" #: src/dlgPreferences.glade:651 src/dlgEditWorld.glade:245 msgid "Proxy" msgstr "Proxy" #: src/dlgPreferences.glade:686 src/dlgEditWorld.glade:280 msgid "Proxy _type:" msgstr "Proxyserver_typ:" #: src/dlgPreferences.glade:698 src/dlgEditWorld.glade:292 msgid "" "Use global settings\n" "No proxy\n" "SOCKS4\n" "SOCKS5" msgstr "" "Systemeinstellungen verwenden\n" "Keinen Proxyserver verwenden\n" "SOCKS4\n" "SOCKS5" #: src/dlgPreferences.glade:775 src/dlgEditWorld.glade:368 msgid "Pass_word:" msgstr "Pass_wort:" #: src/dlgPreferences.glade:791 src/dlgEditWorld.glade:384 msgid "Server _port:" msgstr "Serverport:" #: src/dlgPreferences.glade:805 src/dlgEditWorld.glade:398 msgid "_Username:" msgstr "Ben_utzername:" #: src/dlgPreferences.glade:819 src/dlgEditWorld.glade:412 msgid "Server _address:" msgstr "Serveradresse:" #: src/dlgPreferences.glade:857 msgid "Proxy" msgstr "Proxyserver" #: src/dlgStatistics.glade:7 msgid "Statistics" msgstr "Statistiken" #: src/dlgStatistics.glade:25 src/dlgStatistics.glade:40 #: src/dlgStatistics.glade:210 src/dlgStatistics.glade:361 #: src/dlgStatistics.glade:495 src/dlgStatistics.glade:510 #: src/dlgStatistics.glade:525 src/dlgStatistics.glade:540 #: src/dlgStatistics.glade:555 src/dlgStatistics.glade:583 #: src/dlgStatistics.glade:624 src/dlgStatistics.glade:639 #: src/dlgStatistics.glade:667 src/dlgStatistics.glade:708 #: src/dlgStatistics.glade:723 msgid "N/A" msgstr "k/A" #: src/dlgStatistics.glade:55 msgid "Proxy port:" msgstr "Proxy-Port:" #: src/dlgStatistics.glade:68 msgid "Proxy host:" msgstr "Proxyserver:" #: src/dlgStatistics.glade:96 msgid "Proxy type:" msgstr "Typ des Proxyservers:" #: src/dlgStatistics.glade:109 msgid "World name:" msgstr "Weltname:" #: src/dlgStatistics.glade:120 msgid "Host:" msgstr "Server:" #: src/dlgStatistics.glade:133 msgid "Port:" msgstr "Port:" #: src/dlgStatistics.glade:146 msgid "Connection time:" msgstr "Verbindungszeit:" #: src/dlgStatistics.glade:159 msgid "Idle time:" msgstr "Untätigkeitszeit:" #: src/dlgStatistics.glade:184 msgid "Compression used:" msgstr "Verwendete Kompression:" #: src/dlgStatistics.glade:197 msgid "Bytes received (compressed):" msgstr "Empfangene Bytes (komprimiert):" #: src/dlgStatistics.glade:225 msgid "Bytes received (decompressed):" msgstr "Empfangene Bytes (unkomprimiert):" #: src/dlgStatistics.glade:238 msgid "Compression ratio:" msgstr "Kompressionsrate:" #: src/dlgStatistics.glade:251 msgid "Lines received:" msgstr "Empfangene Zeilen:" #: src/dlgStatistics.glade:402 msgid "Key exchange:" msgstr "Schlüsselaustausch:" #: src/dlgStatistics.glade:415 msgid "SSL protocol used:" msgstr "Verwendetes SSL Protokoll:" #: src/dlgStatistics.glade:428 msgid "Compression algorithm:" msgstr "Kompressionsalgorithmus:" #: src/dlgStatistics.glade:441 msgid "Certificate type:" msgstr "Typ des Zertifikats:" #: src/dlgStatistics.glade:454 msgid "Cipher:" msgstr "Chiffre:" #: src/dlgStatistics.glade:467 msgid "MAC:" msgstr "MAC:" #: src/dlgStatistics.glade:480 msgid "SSL not supported in this version" msgstr "SSL wird in dieser Version nicht unterstützt" #: src/dlgStatistics.glade:570 msgid "Hostname:" msgstr "Hostname:" #: src/dlgStatistics.glade:598 msgid "Valid since:" msgstr "Gültig seit:" #: src/dlgStatistics.glade:611 msgid "Expiration:" msgstr "Läuft ab:" #: src/dlgStatistics.glade:654 msgid "Fingerprint:" msgstr "Fingerabdruck:" #: src/dlgStatistics.glade:682 msgid "Subject's DN:" msgstr "Dienst DN:" #: src/dlgStatistics.glade:695 msgid "Issuer's DN:" msgstr "Aussteller DN:" #: src/dlgAbout.glade:12 msgid "A mud client with powerful features and support for Perl Scripting" msgstr "Ein mächtiger MUD-Client mit Unterstützung für Perl Skripte" #: src/dlgAbout.glade:14 msgid "Visit http://kildclient.sf.net" msgstr "Besuchen Sie http://kildclient.sf.net" #: src/dlgAbout.glade:15 msgid "" "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." msgstr "" "Dieses Programm ist freie Software. Sie können es unter den Bedingungen der " "GNU General Public License, wie von der Free Software Foundation " "veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 2 " "der Lizenz oder (nach Ihrer Option) jeder späteren Version." #: src/dlgEditWorld.glade:7 msgid "Edit World" msgstr "Welt bearbeiten" #: src/dlgEditWorld.glade:60 msgid "Connection" msgstr "Verbindung" #: src/dlgEditWorld.glade:141 msgid "Enter a descriptive name for the World" msgstr "Geben Sie einen beschreibenden Namen der Welt an" #: src/dlgEditWorld.glade:159 msgid "Enter the host to connect to" msgstr "Server zu dem die Verbindung hergestellt werden soll" #: src/dlgEditWorld.glade:179 msgid "Enter the port used when connecting" msgstr "Port zu dem am Server verbunden werden soll" #: src/dlgEditWorld.glade:197 msgid "Use _SSL" msgstr "_SSL-Verschlüsselung verwenden" #: src/dlgEditWorld.glade:452 msgid "Auto-login" msgstr "Automatische Anmeldung" #: src/dlgEditWorld.glade:488 msgid "Connection _Style:" msgstr "_Art der Verbindung:" #: src/dlgEditWorld.glade:501 msgid "" "No auto-login\n" "diku (char, pass)\n" "lp (CONNECT char pass)" msgstr "" "Keine automatische Anmeldung\n" "diku (Charaktername, Passwort)\n" "lp (CONNECT Charakter Passwort)" #: src/dlgEditWorld.glade:519 msgid "Ch_aracters in this mud:" msgstr "_Charaktere in diesem MUD:" #: src/dlgEditWorld.glade:680 src/dlgEditWorld.glade:2009 #: src/dlgEditWorld.glade:2852 msgid "Font" msgstr "Schrift" #: src/dlgEditWorld.glade:713 msgid "Select the font used in the _main screen:" msgstr "Wähle eine Schriftart für das Hauptfenster:" #: src/dlgEditWorld.glade:729 msgid "Select the font used in the main output screen" msgstr "Wähle eine Schrift für die Hauptausgabe" #: src/dlgEditWorld.glade:740 msgid "Use _bold font for highlighted colors (instead of just highlighting)" msgstr "" "Fettschrift für leuchtende Farben verwenden (statt einfacher Aufhellung)" #: src/dlgEditWorld.glade:745 msgid "" "Check if you want the highlighted ANSI colors to be displayed in bold also" msgstr "" "Aktiviere diese Einstellung, wenn leuchtende ANSI Farben auch in Fettschrift " "dargestellt werden dürfen" #: src/dlgEditWorld.glade:782 msgid "Word Wrap" msgstr "Zeilenumbruch" #: src/dlgEditWorld.glade:812 msgid "_Wrap lines at word boundaries" msgstr "Zeilen am _Wortende umbrechen" #: src/dlgEditWorld.glade:817 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "Zeilen am Wortende umbrechen" #: src/dlgEditWorld.glade:836 msgid "_Indent wrapped lines by" msgstr "" #: src/dlgEditWorld.glade:865 msgid "pixels" msgstr "" #: src/dlgEditWorld.glade:883 msgid "Wrap lines at full _screen width" msgstr "" #: src/dlgEditWorld.glade:902 msgid "Maximum line width in _characters:" msgstr "" #: src/dlgEditWorld.glade:964 msgid "Tooltips" msgstr "" #: src/dlgEditWorld.glade:995 msgid "Display _tooltips with the time when the line was received" msgstr "" #: src/dlgEditWorld.glade:1000 msgid "" "Check if you want tooltips to be displayed showing the time when a line was " "received if you leave the mouse over the line for a short while" msgstr "" #: src/dlgEditWorld.glade:1058 msgid "Ansi Colors" msgstr "ANSI Farben" #: src/dlgEditWorld.glade:1374 msgid "_Black" msgstr "_Schwarz" #: src/dlgEditWorld.glade:1391 msgid "R_ed" msgstr "_Rot" #: src/dlgEditWorld.glade:1410 msgid "_Green" msgstr "_Grün" #: src/dlgEditWorld.glade:1429 msgid "_Yellow" msgstr "Gel_b" #: src/dlgEditWorld.glade:1448 msgid "B_lue" msgstr "_Blau" #: src/dlgEditWorld.glade:1467 msgid "_Magenta" msgstr "_Magenta" #: src/dlgEditWorld.glade:1486 msgid "C_yan" msgstr "C_yan" #: src/dlgEditWorld.glade:1505 msgid "_White" msgstr "_Weiß" #: src/dlgEditWorld.glade:1524 msgid "Bl_ack (Bold)" msgstr "Schwar_z (Fett)" #: src/dlgEditWorld.glade:1541 msgid "Re_d (Bold)" msgstr "R_ot (Fett)" #: src/dlgEditWorld.glade:1560 msgid "G_reen (Bold)" msgstr "Grü_n (Fett)" #: src/dlgEditWorld.glade:1579 msgid "Yell_ow (Bold)" msgstr "Ge_lb (Fett)" #: src/dlgEditWorld.glade:1598 msgid "Bl_ue (Bold)" msgstr "Bl_au (Fett)" #: src/dlgEditWorld.glade:1617 msgid "Magen_ta (Bold)" msgstr "Magen_ta (Fett)" #: src/dlgEditWorld.glade:1636 msgid "Cya_n (Bold)" msgstr "_Cyan (Fett)" #: src/dlgEditWorld.glade:1655 msgid "W_hite (Bold)" msgstr "We_iß (Fett)" #: src/dlgEditWorld.glade:1720 msgid "Default Colors" msgstr "Standardfarben" #: src/dlgEditWorld.glade:1767 msgid "_Foreground" msgstr "_Vordergrund" #: src/dlgEditWorld.glade:1801 msgid "Bac_kground" msgstr "_Hintergrund" #: src/dlgEditWorld.glade:1835 msgid "Bold Foreground" msgstr "_Fetter Vordergrund" #: src/dlgEditWorld.glade:1873 msgid "Bold Background" msgstr "Fetter Hintergrund" #: src/dlgEditWorld.glade:1916 msgid "Revert to default colors" msgstr "Standardfarben zurücksetzen" #: src/dlgEditWorld.glade:1947 msgid "Re_vert to default colors" msgstr "Auf Standardfarben _zurücksetzen" #: src/dlgEditWorld.glade:1952 msgid "Click to revert all colors to their built-in defaults" msgstr "All Farben auf die eingebauten Standardeinstellungen zurücksetzen" #: src/dlgEditWorld.glade:2042 msgid "Select the font used in the _status bar:" msgstr "Wähle eine Schriftart für die Statuszeile:" #: src/dlgEditWorld.glade:2058 msgid "Select the font used in the status bar" msgstr "Schriftart, die in der Statuszeile verwendet wird" #: src/dlgEditWorld.glade:2093 msgid "Time Display" msgstr "Zeitanzeige" #: src/dlgEditWorld.glade:2125 msgid "C_onnected time:" msgstr "Verbindun_gszeit:" #: src/dlgEditWorld.glade:2156 src/dlgEditWorld.glade:2256 msgid "Do not display" msgstr "Nicht anzeigen" #: src/dlgEditWorld.glade:2161 msgid "Select if you do not want the connection time to be displayed" msgstr "Wählen, falls die Anzeige der Verbindungszeit nicht gewünscht ist" #: src/dlgEditWorld.glade:2175 src/dlgEditWorld.glade:2275 msgid "Display as hours, minutes and seconds" msgstr "Zeige Stunden, Minuten und Sekunden" #: src/dlgEditWorld.glade:2180 msgid "" "Select if you want the connection time to be displayed in hours, minutes and " "seconds" msgstr "" "Wählen, wenn die Verbindungszeit in Stunden, Minuten und Sekunden angezeigt " "werden soll" #: src/dlgEditWorld.glade:2194 src/dlgEditWorld.glade:2294 msgid "Display as seconds" msgstr "In Sekunden anzeigen" #: src/dlgEditWorld.glade:2199 msgid "Select if you want the connection time to be displayed in seconds" msgstr "Wählen, wenn die Verbindungszeit in Sekunden angezeigt werden soll" #: src/dlgEditWorld.glade:2226 msgid "_Idle time:" msgstr "_Untätigkeitszeit:" #: src/dlgEditWorld.glade:2261 msgid "Select if you do not want the idle time to be displayed" msgstr "Wählen, wenn die Untätigkeitszeit nicht angezeigt werden soll" #: src/dlgEditWorld.glade:2280 msgid "" "Select if you want the idle time to be displayed in hours, minutes and " "seconds" msgstr "" "Wählen, wenn die Untätigkeitszeit in Stunden, Minuten und Sekunden angezeigt " "werden soll" #: src/dlgEditWorld.glade:2299 msgid "Select if you want the idle time to be displayed in seconds" msgstr "Wählen, wenn die Untätigkeitszeit in Sekunden angezeigt werden soll" #: src/dlgEditWorld.glade:2313 msgid "Only _reset idle time counter when a command is entered directly" msgstr "Untätigkeitszeit nur bei direkter Eingabe eines Befehls _zurücksetzen" #: src/dlgEditWorld.glade:2318 msgid "" "Check to make the idle time counter reset only when a command is entered " "directly by typing it in the command entry box. If not checked, if a command " "is sent because of a timer, of a hook, etc, the idle timer is also reset." msgstr "" "Wählen, um die Untätigkeitszeit nur zurückzusetzen, wenn ein Kommando " "eingegeben wird. Wenn diese Einstellung nicht gewählt ist, kann die " "Untätigkeitszeit auch durch Hooks, Timer etc. zurückgesetzt werden." #: src/dlgEditWorld.glade:2387 msgid "Command Entry" msgstr "Befehlseingabe" #: src/dlgEditWorld.glade:2417 msgid "_Keep last typed command in command entry box" msgstr "_Letzten Befehl in der Befehlseingabe belassen" #: src/dlgEditWorld.glade:2422 msgid "" "Check to have the last command kept in the command entry box, so that you " "can repeat commands only by pressing ENTER" msgstr "" "Wählen, um die den letzten Befehl in der Eingabezeile zu erhalten, so dass " "er durch drücken der ENTER-Taste noch einmal gesendet werden kann" #: src/dlgEditWorld.glade:2434 msgid "_Echo sent commands in main window" msgstr "Befehls_echo (gesendete Befehle in der Hauptausgabe wiedergeben)" #: src/dlgEditWorld.glade:2439 msgid "Check to have the sent commands echoed in the main output window" msgstr "Wählen, um gesendete Befehle in der Hauptausgabe wiederzugeben (echo)" #: src/dlgEditWorld.glade:2451 msgid "_Store commands between sessions" msgstr "_Befehlshistorie beim Beenden in einer Datei ablegen" #: src/dlgEditWorld.glade:2456 msgid "Check to have the command history saved in a file between sessions" msgstr "Wählen, um die Befehlshistorie beim Beenden in einer Datei abzulegen" #: src/dlgEditWorld.glade:2468 msgid "Never _hide the typed text" msgstr "Eingaben _niemals verstecken (auch nicht bei Passworten)" #: src/dlgEditWorld.glade:2473 msgid "" "Check this if the text you type is displayed as black dots in the input box." msgstr "Wählen, wenn der eingegeben Text in schwarzen Punkten erscheint." #: src/dlgEditWorld.glade:2489 msgid "_Number of commands to save in history:" msgstr "Anzahl an Befehlen, die in der Historie gespeichert werden sollen:" #: src/dlgEditWorld.glade:2503 msgid "Specify the number of commands that are saved and can be later recalled" msgstr "" "Geben Sie die Anzahl an Befehlen an, die in am Ende gesichert und beim " "nächsten Mal wieder aufgerufen werden können" #: src/dlgEditWorld.glade:2526 msgid "C_ommand separator:" msgstr "_Trennzeichen für Befehle:" #: src/dlgEditWorld.glade:2540 msgid "Specify the separator for commands typed in the command entry box" msgstr "" "Geben Sie das Trennzeichen an, das für Befehle in der Befehlseingabe " "verwendet werden soll" #: src/dlgEditWorld.glade:2558 msgid "Use single-_line input bar" msgstr "_Einzeilige Befehlseingabe verwenden" #: src/dlgEditWorld.glade:2594 msgid "Enable _auto-completion" msgstr "Befehls-_Autovervollständigung aktivieren" #: src/dlgEditWorld.glade:2599 msgid "Check to enable command auto-completion (based on previous commands)" msgstr "" "Wählen, um die automatische Befehlskomplettierung zu aktivieren (basierend " "auf vorherigen Befehlen)" #: src/dlgEditWorld.glade:2617 msgid "Acti_vate auto-completion only after" msgstr "Autovervollständigung benötigt mindestens" #: src/dlgEditWorld.glade:2631 msgid "" "Specify the number of characters that must be typed for command completion " "to start" msgstr "Minimal Anzahl an Zeichen für die Autovervollständigung" #: src/dlgEditWorld.glade:2645 msgid "characters have been entered" msgstr "eingegebene Zeichen" #: src/dlgEditWorld.glade:2670 msgid "Use _multi-line input bar" msgstr "Mehrzeilige Befehlseingabe verwenden" #: src/dlgEditWorld.glade:2711 msgid "N_umber of lines:" msgstr "_Anzahl an Zeilen:" #: src/dlgEditWorld.glade:2746 msgid "S_pell check typed text" msgstr "_Reichtschreibprüfung aktivieren" #: src/dlgEditWorld.glade:2779 msgid "Language code:" msgstr "Sprachen-Code:" #: src/dlgEditWorld.glade:2803 msgid "(Leave blank for default based on locale)" msgstr "(Leer lassen, um die Systemeinstellung zu verwenden)" #: src/dlgEditWorld.glade:2885 msgid "Select the font used in the command _entry box:" msgstr "Schriftart, die in der Befehlseingabe verwendet werden soll:" #: src/dlgEditWorld.glade:2901 msgid "Select the font used in the command entry box" msgstr "Schriftart für die Befehlseingabe" #: src/dlgEditWorld.glade:2935 msgid "Flood prevention" msgstr "Überlaufschutz" #: src/dlgEditWorld.glade:2970 msgid "Do not allow the _same command to be sent" msgstr "Verbiete das _Senden ab" #: src/dlgEditWorld.glade:2975 msgid "" "Check to prevent more than a given number of equal commands to be sent in a " "row (which can disconnect your character in some muds)" msgstr "" "Wählen, um zu verhindern, dass mehr als die angegebene Anzahl an gleichen " "Befehlen am Stück gesendet werden (was bei einigen MUDs zum Trennen der " "Verbindung führen kann)" #: src/dlgEditWorld.glade:2990 msgid "Specify the maximum number of equal commands that can be sent in a row" msgstr "" "Geben Sie die maximale Anzahl an gleichen Befehlen an, die auf einen Schlag " "gesendet werden dürfen" #: src/dlgEditWorld.glade:3004 msgid "_times in a row" msgstr "_gleichen Befehlen pro Zeile" #: src/dlgEditWorld.glade:3028 msgid "Se_nd this command:" msgstr "Se_nde diesen Befehl:" #: src/dlgEditWorld.glade:3042 msgid "" "Enter a command to be sent whenever the specified maximum number of equal " "commands would be sent" msgstr "" "Geben Sie einen Befehl an, der immer dann gesendet wird, wenn die maximale " "Anzahl an zu sendenden gleichen Befehlen gesendet würde" #: src/dlgEditWorld.glade:3104 msgid "Logging Status" msgstr "Protokollierung" #: src/dlgEditWorld.glade:3152 msgid "St_art" msgstr "S_tart" #: src/dlgEditWorld.glade:3195 msgid "_Include the last" msgstr "_Protokolliere die letzten" #: src/dlgEditWorld.glade:3200 msgid "Select to include lines from the main window in the log file." msgstr "Wählen, um Zeilen aus dem Hauptfenster ins Protokoll zu schreiben." #: src/dlgEditWorld.glade:3214 msgid "Inform number of lines to include in the log." msgstr "Anzahl an Zeilen, die das Protokoll umfassen darf." #: src/dlgEditWorld.glade:3229 msgid "lines of the scrollback buffer in the log" msgstr "Zeilen des Ausgabepuffers" #: src/dlgEditWorld.glade:3268 src/dlgEditWorld.glade:4377 msgid "File" msgstr "Datei" #: src/dlgEditWorld.glade:3348 msgid "" "Note: You can use strftime() escapes to create different files based on the " "date and time that logging starts. Also, %Kw represents the World name and " "%Kc the character name used in auto-logon." msgstr "" "Hinweis: strftime() Formatinformationen können verwendet werden, um " "verschiedene Dateinamen nach Datum und Zeit des Beginns der Protokollierung " "zu erzeugen. Zusätzlich repräsentiert %Kw den Weltnamen und %Kc den Namen " "des Charakters, der für die automatische Anmeldung eingetragen ist." #: src/dlgEditWorld.glade:3381 msgid "Options" msgstr "Optionen" #: src/dlgEditWorld.glade:3411 msgid "A_utomatically start logging when connected" msgstr "Protokollierung beim Herstellen einer Verbindung _automatisch starten" #: src/dlgEditWorld.glade:3417 msgid "" "If this is selected, logging will be automatically started whenever you " "connect to the world." msgstr "" "Wählen, um die Protokollierung automatisch immer dann zu starten, wenn eine " "Verbindung zu einer Welt hergestellt wird." #: src/dlgEditWorld.glade:3427 msgid "Prefix lines with _date and/or time" msgstr "Datum und Zeit Protokolleinträgen _voranstellen" #: src/dlgEditWorld.glade:3433 msgid "" "Select this if you want to prefix each line in the log file with the date " "and/or time it was received." msgstr "" "Wählen, wenn jeder Zeile im Protokoll Datum und Zeit vorangestellt werden " "sollen." #: src/dlgEditWorld.glade:3461 msgid "_Format:" msgstr "_Format:" #: src/dlgEditWorld.glade:3474 msgid "" "The default is to prefix lines with the date and time, but you can configure " "the format with strftime() escape sequences. See the manual for a " "description of those." msgstr "" "Standardmäßig werden alle Zeilen mit Datum und Uhrzeit beginnend angezeigt. " "Es kann aber wie bei strftime() ein benutzerdefiniertes Format eingestellt " "werden (Siehe Handbuch für eine Beschreibung)." #: src/dlgEditWorld.glade:3483 msgid "Revert to _default" msgstr "Auf Standard _zurücksetzen" #: src/dlgEditWorld.glade:3549 msgid "Scripting" msgstr "Skripte" #: src/dlgEditWorld.glade:3585 msgid "_Perl file to load:" msgstr "_Perl Skript, das geladen werden soll:" #: src/dlgEditWorld.glade:3608 src/dlgMLSend.glade:80 msgid "_Clear" msgstr "_Zurücksetzen" #: src/dlgEditWorld.glade:3675 msgid "Plugins Currently Loaded" msgstr "Geladene Plugins" #: src/dlgEditWorld.glade:3754 msgid "_Load" msgstr "_Laden" #: src/dlgEditWorld.glade:3821 msgid "Plugins Loaded on Startup" msgstr "Plugins geladen beim Programmstart" #: src/dlgEditWorld.glade:3987 msgid "MCCP (for compression)" msgstr "MCCP (für Kompression)" #: src/dlgEditWorld.glade:4017 msgid "_Enable if server proposes after connecting" msgstr "_Aktivieren, wenn der Server es direkt nach dem Verbinden anbietet" #: src/dlgEditWorld.glade:4033 msgid "Enable if server proposes at _any time" msgstr "_Zu jeder Zeit aktivieren, wenn der Server es anbietet" #: src/dlgEditWorld.glade:4049 msgid "_Disable" msgstr "_Deaktivieren" #: src/dlgEditWorld.glade:4110 msgid "Scrolling" msgstr "Bildlauf" #: src/dlgEditWorld.glade:4141 msgid "Scroll on _output" msgstr "Beim _Empfang automatisch scrollen" #: src/dlgEditWorld.glade:4146 msgid "" "Check to have the main window scroll to the end whenever new output comes" msgstr "" "Wählen, wenn immer zur letzten Zeile gescrollt werden soll, sobald neuer " "Text empfangen wurde" #: src/dlgEditWorld.glade:4161 msgid "_Lines to save in scrollback buffer:" msgstr "_Zeilenanzahl, die im Puffer gespeichert werden soll:" #: src/dlgEditWorld.glade:4175 msgid "" "Specify the number of lines of output that can be seen with by scrolling the " "window" msgstr "Anzahl der Zeilen, die im Speicher gehalten werden sollen" #: src/dlgEditWorld.glade:4217 msgid "Name display" msgstr "Namensanzeige" #: src/dlgEditWorld.glade:4247 msgid "Identify as 'World name'" msgstr "Identifizieren als 'Weltname'" #: src/dlgEditWorld.glade:4260 msgid "Identify as 'World name - Character'" msgstr "Identifizieren als 'Weltname - Charakter'" #: src/dlgEditWorld.glade:4273 msgid "Identify as 'Character - World name'" msgstr "Identifizieren als 'Charakter - Weltname'" #: src/dlgEditWorld.glade:4290 msgid "Custom: " msgstr "Benutzerdefiniert: " #: src/dlgEditWorld.glade:4323 msgid "" "Use %Kw to represent the World's name, and %Kc to represent the auto-logon " "character name" msgstr "" "Verwenden Sie %Kw um den Weltnamen und %Kc um den Charakternamen zu " "repräsentieren" #: src/dlgEditWorld.glade:4411 msgid "_File:" msgstr "_Datei:" #: src/dlgEditWorld.glade:4442 msgid "" "You can leave this field blank, and a file name will be automatically " "generated. Only edit this field if you know what you are doing." msgstr "" "Wird dieses Feld leer gelassen, wird automatisch ein Dateiname generiert. " "Nur bearbeiten, wenn man sicher ist, was man tut!" #: src/dlgEditWorld.glade:4475 msgid "Character Set" msgstr "Zeichensatz" #: src/dlgEditWorld.glade:4504 msgid "Character _set:" msgstr "_Zeichensatz:" #: src/dlgEditWorld.glade:4549 msgid "Graphical Editors" msgstr "Editor" #: src/dlgEditWorld.glade:4579 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "_Nachfragen, wenn Objekte wie Trigger oder Alias gelöscht werden" #: src/dlgEditWorld.glade:4584 src/dlgEditWorld.glade:4675 msgid "" "If not checked, objects such as triggers, aliases, etc. will be deleted " "directly without asking for confirmation when you press the Delete button." msgstr "" "Wenn nicht gewählt werden Objekte wie Trigger, Aliase etc. direkt ohne " "Nachfrage gelöscht, wenn der Löschen-Knopf betätigt wird." #: src/dlgEditWorld.glade:4597 msgid "_Show items defined by plugins" msgstr "_Zeige in Plugins definierte Objekte" #: src/dlgEditWorld.glade:4602 msgid "" "If checked, triggers, aliases, macros and timers defined in plugins will " "appear in the corresponding World Editor sections." msgstr "" "Wenn gewählt werden Trigger, Aliase, Makros und Plugins, die in Plugins " "definiert sind, in den entsprechenden Abschnitten des Welt-Editors angezeigt." #: src/dlgEditWorld.glade:4640 msgid "TCP Keep Alive" msgstr "" #: src/dlgEditWorld.glade:4670 msgid "Enable TCP _Keep Alive packets" msgstr "" #: src/dlgEditWorld.glade:4689 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "" #: src/dlgEditWorld.glade:4722 msgid "Input" msgstr "Eingabe" #: src/dlgEditWorld.glade:4752 msgid "_Disable up and down arrow keys for history navigation" msgstr "" #: src/dlgEditWorld.glade:4757 msgid "" "If checked, the up and down arrow keys are not used for navigating between " "saved commands. (You'll have to use Alt+up and Alt+down.)" msgstr "" #: src/dlgTestTriggers.glade:24 msgid "Enter _line to be matched against the triggers:" msgstr "_Zeile auf die die Trigger angewendet werden sollen:" #: src/dlgTestTriggers.glade:41 msgid "" "The text entered here will be matched against triggers as if it were a line " "coming from the MUD" msgstr "" "Die Trigger werden auf den Text, der hier eingegeben wird, angewendet als " "wäre er vom MUD empfangen worden" #: src/dlgTestTriggers.glade:51 src/dlgMLSend.glade:321 #: src/dlgCmdHistory.glade:241 msgid "_Send" msgstr "_Senden" #: src/dlgTestTriggers.glade:56 msgid "Click the run the triggers against the line." msgstr "Klicken um die Trigger auf die Zeile anzuwenden." #: src/dlgTestTriggers.glade:90 msgid "Number of triggers that matched:" msgstr "Anzahl der Trigger, die ausgelöst wurden:" #: src/dlgTestTriggers.glade:119 msgid "Commands that would be sent:" msgstr "Befehle die gesendet worden wären:" #: src/dlgTestTriggers.glade:151 msgid "This is what would be printed in the main screen:" msgstr "Diese Ausgabe wäre im Hauptfenster erschienen:" #: src/dlgTestTriggers.glade:163 msgid "" "This is what would be printed in the main screen. If empty, the line has " "been gaged. It can be different from the original line because of rewriter " "triggers." msgstr "" "Diese Ausgabe wäre im Hauptfenster erschienen. Wenn die Ausgabe leer ist " "wurde die Zeile gaged. Sie kann verschieden von der ursprünglichen Zeile " "sein, wenn Rewriter Trigger angewendet wurden." #: src/dlgTestTriggers.glade:180 msgid "Would this line be included in the log file?" msgstr "Wäre diese Zeile im Protokoll erschienen?" #: src/dlgMLSend.glade:7 msgid "Multi-line send" msgstr "Mehrzeilig senden" #: src/dlgMLSend.glade:20 msgid "Send this text _initially:" msgstr "Sende diesen Text _zuerst:" #: src/dlgMLSend.glade:42 src/dlgMLSend.glade:127 msgid "Enter some text to be sent to the World" msgstr "Geben Sie den Text ein, der an die Welt gesendet wird" #: src/dlgMLSend.glade:55 msgid "Then send the _contents of this file:" msgstr "Dann sende den Inhalt dieser _Datei:" #: src/dlgMLSend.glade:105 msgid "_Finally, send this text:" msgstr "Sende _schließlich diesen Text:" #: src/dlgMLSend.glade:150 msgid "Add this to the _beginning of each line:" msgstr "_Füge dies am Anfang jeder Zeile an:" #: src/dlgMLSend.glade:165 msgid "Specify some text to be prepended to each sent line" msgstr "Text, der an jede gesendete Zeile angehangen wird" #: src/dlgMLSend.glade:179 msgid "Add this to the _end of each line:" msgstr "Füge dies am _Ende jeder Zeile an:" #: src/dlgMLSend.glade:194 msgid "Specify some text to be appended to each sent line" msgstr "Text, der an jede gesendete Zeile angehangen wird" #: src/dlgMLSend.glade:210 msgid "_Delay" msgstr "_Verzögerung" #: src/dlgMLSend.glade:224 msgid "Specify the delay between sending the group of lines" msgstr "Verzögerung beim Senden mehrerer Zeilen" #: src/dlgMLSend.glade:239 msgid "seconds e_ach" msgstr "_Sekunden alle" #: src/dlgMLSend.glade:253 msgid "Specify how many lines are sent at once" msgstr "Anzahl der Zeilen, die auf einmal gesendet werden" #: src/dlgMLSend.glade:267 msgid "line(s)" msgstr "Zeile(n)" #: src/dlgMLSend.glade:285 msgid "_Keep dialog open after sending" msgstr "Dialog nach dem Senden _geöffnet lassen" #: src/dlgCmdHistory.glade:7 msgid "Command History" msgstr "Befehlshistorie" #: src/dlgCmdHistory.glade:51 msgid "Find a command containing a given search term" msgstr "Suche einen Befehl mit einem gegebenen Suchbegriff" #: src/dlgCmdHistory.glade:63 msgid "Find _next" msgstr "_Weitersuchen" #: src/dlgCmdHistory.glade:69 msgid "Find the next command with the same match text" msgstr "Weiteren Befehl mit diesem Suchbegriff suchen" #: src/dlgCmdHistory.glade:107 msgid "Dela_y" msgstr "_Verzögerung" #: src/dlgCmdHistory.glade:120 msgid "Specify the delay between sending the group of commands" msgstr "Geben Sie eine Verzögerung für das Senden einer Gruppe von Befehlen an" #: src/dlgCmdHistory.glade:135 msgid "sec_onds each" msgstr "_Sekunden alle" #: src/dlgCmdHistory.glade:149 msgid "Specify how many commands are sent at once" msgstr "Geben Sie an, wieviele Befehle auf einen Schlag gesendet werden dürfen" #: src/dlgCmdHistory.glade:163 msgid "commands(s)" msgstr "Befehl(e)" #: src/dlgCmdHistory.glade:184 msgid "Newest commands are on the top" msgstr "Der neueste Befehl ist oben" #: src/dlgCmdHistory.glade:205 msgid "_Recall" msgstr "Erneut aufrufen" #: src/dlgCmdHistory.glade:211 msgid "Put the selected command in the command entry box" msgstr "Ausgewählten Befehl in die Befehlseingabe schreiben" #: src/dlgCmdHistory.glade:223 msgid "Rec_all & Close" msgstr "Erneut aufrufen und schließen" #: src/dlgCmdHistory.glade:229 msgid "Put the selected command in the command entry box and close this dialog" msgstr "" "Ausgewählten Befehl in die Befehlseingabe schreiben und diesen Dialog " "schließen" #: src/dlgCmdHistory.glade:247 msgid "Send the selected command(s) to the mud" msgstr "Sende den/die gewählte(n) Befehl(e) zum MUD" #: src/dlgCmdHistory.glade:259 msgid "S_end & Close" msgstr "S_enden & Schließen" #: src/dlgCmdHistory.glade:265 msgid "Send the selected command(s) to the mud and close the dialog" msgstr "Sende den/die gewählte(n) Befehl(e) zum MUD und schließe diesen Dialog" #: src/dlgCmdHistory.glade:305 msgid "Find Command" msgstr "Suche Befehl" #: src/dlgCmdHistory.glade:321 msgid "_Text to find:" msgstr "Zu suchender _Text:" #: src/dlgCmdHistory.glade:334 msgid "Enter the text to search for" msgstr "Geben Sie den Text ein, der gesucht werden soll" #: src/dlgCmdHistory.glade:353 msgid "Search direction:" msgstr "Suchrichtung:" #: src/dlgCmdHistory.glade:367 msgid "_Downwards" msgstr "_Abwärts" #: src/dlgCmdHistory.glade:383 msgid "_Upwards" msgstr "_Aufwärts" #: src/mnuPopupURL.glade:8 msgid "Open Link" msgstr "Link öffnen" #: src/mnuPopupURL.glade:23 msgid "Copy Link Address" msgstr "Linkadresse kopieren" #: share/kildclient.pl:76 share/kildclient.pl:97 share/kildclient.pl:117 #: share/kildclient.pl:182 share/kildclient.pl:433 share/kildclient.pl:511 #: share/kildclient.pl:589 share/kildclient.pl:602 share/kildclient.pl:615 #: share/kildclient.pl:628 share/kildclient.pl:641 share/kildclient.pl:654 #: share/kildclient.pl:667 share/kildclient.pl:680 share/kildclient.pl:694 #: share/kildclient.pl:708 share/kildclient.pl:718 share/kildclient.pl:730 #: share/kildclient.pl:742 share/kildclient.pl:754 share/kildclient.pl:767 #: share/kildclient.pl:983 share/kildclient.pl:1016 #, perl-format msgid "%s: Too few arguments." msgstr "%s: Zu wenig Argumente." #: share/kildclient.pl:207 share/kildclient.pl:567 #, perl-format msgid "No such %s" msgstr "Kein %s vorhanden" #: share/kildclient.pl:298 share/kildclient.pl:316 share/kildclient.pl:334 #: share/kildclient.pl:352 share/kildclient.pl:370 #, perl-format msgid "%s: Wrong number of arguments." msgstr "%s: Falsche Anzahl an Argumenten." #: share/kildclient.pl:403 share/kildclient.pl:411 share/kildclient.pl:489 #: share/kildclient.pl:497 #, perl-format msgid "No such %s." msgstr "Kein %s vorhanden." #: share/kildclient.pl:425 #, perl-format msgid "No %s deleted." msgstr "Kein %s gelöscht." #: share/kildclient.pl:427 #, perl-format msgid "One %s deleted." msgstr "Ein %s gelöscht." #: share/kildclient.pl:429 #, perl-format msgid "%d %s deleted." msgstr "%d %s gelöscht." #: share/kildclient.pl:506 #, perl-format msgid "Successfully moved %s." msgstr "%s erfolgreich verschoben." #: share/kildclient.pl:798 msgid "Could not open file." msgstr "Kann Datei nicht öffnen." #: share/kildclient.pl:828 msgid "Unknown" msgstr "Unbekannt" #: share/kildclient.pl:835 msgid "Invalid plugin file." msgstr "Ungültige Plugin-Datei." #: share/kildclient.pl:866 msgid "Plugin already loaded. Try enabling it." msgstr "Plugin ist bereits geladen. Versuchen Sie es zu aktivieren." #: share/kildclient.pl:868 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "Version %s dieses Plugins bereits geladen." #: share/kildclient.pl:878 #, perl-format msgid "Error in plugin file: %s" msgstr "Fehler in der Plugin-Datei: %s" #: share/kildclient.pl:890 msgid "Cannot load a plugin in another world." msgstr "Kann kein Plugin in einer anderen Welt laden." #: share/kildclient.pl:895 share/kildclient.pl:915 msgid "Plugin not specified" msgstr "Kein Plugin angegeben." #: share/kildclient.pl:902 share/kildclient.pl:933 msgid "Plugin not loaded." msgstr "Plugin ist nicht geladen." #: share/kildclient.pl:905 #, perl-format msgid "Plugin '%s' loaded." msgstr "Plugin '%s' geladen." #: share/kildclient.pl:921 #, perl-format msgid "Could not load plugin %s" msgstr "Kann Plugin %s nicht laden" #: share/kildclient.pl:997 msgid "Plugin enabled." msgstr "Plugin aktiviert." #: share/kildclient.pl:1030 msgid "Plugin disabled." msgstr "Plugin deaktiviert." #: share/kildclient.pl:1150 msgid "Cannot open help file." msgstr "Kann Hilfe-Datei nicht öffnen." #: share/kildclient.pl:1168 msgid "Help topic not found." msgstr "Hilfethema nicht gefunden." #: share/kildclient.pl:1174 msgid "" "Warning: the getwindowsize() function is deprecated and will be removed." msgstr "Warnung: die Funktion getwindowsize() ist veraltet und wird entfernt!" #: share/kildclient.pl:1175 msgid "Use $window->getsize() instead." msgstr "Verwenden Sie stattdessen $window->getsize()." #: share/kildclient.pl:1180 msgid "Warning: the minimize() function is deprecated and will be removed." msgstr "Warnung: Die Funktion minimize() ist veraltet und wird bald entfernt." #: share/kildclient.pl:1181 msgid "Use $window->minimize() instead." msgstr "Verwenden Sie stattdessen $window->minimize()." #: share/kildclient.pl:1186 msgid "Warning: the path() function is deprecated and will be removed." msgstr "Warnung: Die Funktion path() ist veraltet und wird bald entfernt." #: share/kildclient.pl:1187 msgid "Use $world->path() instead." msgstr "Verwenden Sie stattdessen $world->path()." #~ msgid "Unknown element '%s'" #~ msgstr "Unbekanntes Element '%s'" kildclient-2.11.1/po/ChangeLog0000644000175000017500000000006711570463465013045 00000000000000Please see the ChangeLog file in the parent directory. kildclient-2.11.1/po/sv.po0000644000175000017500000024153511570463465012272 00000000000000# KildClient messages in Swedish # Copyright (C) 2004-2011 Eduardo M Kalinowski, Niklas Grahn # This file is distributed under the same license as the KildClient package. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: KildClient-2.11.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-05-29 12:33-0300\n" "PO-Revision-Date: 2010-06-21 10:28-0300\n" "Last-Translator: Niklas Grahn \n" "Language-Team: Niklas Grahn \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Swedish\n" "X-Poedit-Country: SWEDEN\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/main.c:76 msgid "Outputs version information and exits" msgstr "Matar ut versionsinformation och avslutar" #: src/main.c:78 msgid "Directory to store settings and saved worlds" msgstr "Katalog för att lagra inställningar och sparade världar i" #: src/main.c:78 msgid "DIR" msgstr "KAT" #: src/main.c:80 msgid "" "Dumps all data received from (after decompression, if appropriate) to the " "file" msgstr "" #: src/main.c:81 src/main.c:84 msgid "FILE" msgstr "FIL" #: src/main.c:83 msgid "Dumps all data received (possibly compressed) to the file" msgstr "Dumpar alla mottagna data (möjligen komprimerade) till filen" #. Parse command-line options #: src/main.c:122 msgid "[WORLD...]" msgstr "[VÄRLD...]" #: src/main.c:129 #, c-format msgid "Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" msgstr "Skrivet av Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" #: src/main.c:134 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "Kunde inte öppna dumpfil %s: %s\n" #: src/main.c:141 #, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "Kunde inte öppna rÃ¥ dumpfil %s: %s\n" #: src/main.c:287 msgid "There is one open world. Do you really want to quit?" msgstr "Det finns en öppen värld. Vill du verkligen avsluta?" #: src/main.c:293 #, c-format msgid "There are %d open worlds. Do you really want to quit?" msgstr "Det finns %d öppna världar. Vill du verkligen avsluta?" #: src/main.c:296 msgid "Really Quit KildClient?" msgstr "Vill du verkligen avsluta KildClient?" #: src/main.c:298 msgid "Don't quit" msgstr "Avsluta inte" #: src/net.c:150 msgid "" "You're attempting to connect to a world that uses SSL, but this version of " "KildClient has been built without SSL support. Try to connect without SSL?" msgstr "" "Du försöker ansluta till en värld som använder SSL, men denna version av " "KildClient har kompilerats utan SSL-stöd. Försök ansluta utan SSL?" #: src/net.c:151 msgid "KildClient Question" msgstr "KildClient-frÃ¥ga" #: src/net.c:153 msgid "Connect without SSL" msgstr "Anslut utan SSL" #: src/net.c:154 msgid "Do not connect" msgstr "Anslut inte" #: src/net.c:168 msgid "This version of KildClient does not have SSL support." msgstr "Denna version av KildClient har inte SSL-stöd." #: src/net.c:238 src/proxy.c:206 #, c-format msgid "Resolving proxy host %s..." msgstr "SlÃ¥r upp proxyvärd %s..." #: src/net.c:241 #, c-format msgid "Resolving host %s..." msgstr "SlÃ¥r upp värd %s..." #: src/net.c:272 src/proxy.c:224 msgid "Could not start name-resolution thread." msgstr "" #: src/net.c:324 src/proxy.c:190 #, c-format msgid "Could not resolve host %s: %s" msgstr "Kunde inte slÃ¥ upp värd %s: %s" #: src/net.c:352 #, c-format msgid "Attempting to connect to host %s (%s) port %s..." msgstr "Försöker ansluta till värd %s (%s) port %s..." #: src/net.c:355 #, c-format msgid "Attempting to connect to proxy host %s (%s) port %s..." msgstr "Försöker ansluta till proxyvärd %s (%s) port %s..." #: src/net.c:374 #, c-format msgid "Could not create socket: %s" msgstr "Kunde inte skapa sockel: %s" #: src/net.c:377 #, c-format msgid "Could not create socket: error #%d" msgstr "Kunde inte skapa sockel: fel #%d" #: src/net.c:397 #, c-format msgid "Could not connect to host %s port %s: %s" msgstr "Kunde inte ansluta till värd %s port %s: %s" #: src/net.c:407 #, c-format msgid "Could not connect to host %s port %s: Error #%d" msgstr "Kunde inte ansluta till värd %s port %s: Fel #%d" #: src/net.c:463 #, c-format msgid "Unable to connect to host %s: %s." msgstr "Kunde inte ansluta till värd %s: %s." #: src/net.c:466 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "Kunde inte ansluta till proxyvärd %s: %s." #: src/net.c:508 src/net.c:526 #, c-format msgid "Unable to connect to host %s: Error #%d." msgstr "Kunde inte ansluta till värd %s: Fel #%d." #: src/net.c:511 src/net.c:529 #, c-format msgid "Unable to connect to proxy host %s: Error #%d." msgstr "Kunde inte ansluta till proxyvärd %s: Fel #%d." #: src/net.c:563 #, c-format msgid "Performing SSL handshake..." msgstr "" #: src/net.c:613 #, c-format msgid "SSL Handshake failed: %s" msgstr "" #: src/net.c:655 #, c-format msgid "SSL Handshake took too long." msgstr "" #: src/net.c:684 src/net.c:1510 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "Ansluten till värd %s (%s) port %s." #: src/net.c:687 src/net.c:1513 #, c-format msgid "Connected to host %s port %s, via proxy %s (%s) port %s." msgstr "Ansluten till värd %s port %s, via proxy %s (%s) port %s." #: src/net.c:694 src/net.c:1485 src/net.c:1520 msgid " SSL enabled." msgstr " SSL avktiverat." #: src/net.c:712 src/perlscript.c:3069 #, c-format msgid "Logging to file %s.\n" msgstr "Loggar till fil %s.\n" #: src/net.c:858 #, c-format msgid "Disconnected from host %s." msgstr "FrÃ¥nkopplad frÃ¥n värd %s." #: src/net.c:931 src/net.c:940 #, c-format msgid "Disconnected from host %s: %s." msgstr "FrÃ¥nkopplad frÃ¥n värd %s: %s." #: src/net.c:951 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "FrÃ¥nkopplad frÃ¥n värd %s: fel #%d." #: src/net.c:1473 #, c-format msgid "Connected to host %s (%s) port %s, MCCP version %d enabled." msgstr "Ansluten till värd %s (%s) port %s, MCCP-version %d aktiverad." #: src/net.c:1477 #, c-format msgid "" "Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d " "enabled." msgstr "" "Ansluten till värd %s port %s, via proxy %s (%s) port %s, MCCP-version %d " "aktiverad." #: src/net.c:1598 src/we_logging.c:135 msgid "Not connected." msgstr "Inte ansluten." #. success #: src/proxy.c:61 msgid "general failure" msgstr "" #: src/proxy.c:62 msgid "connection not allowed by ruleset" msgstr "" #: src/proxy.c:63 msgid "network unreachable" msgstr "nätverk oÃ¥tkomligt" #: src/proxy.c:64 msgid "host unreachable" msgstr "värd oÃ¥tkomlig" #: src/proxy.c:65 msgid "connection refused by destination host" msgstr "anslutning vägrades av mÃ¥lvärd" #: src/proxy.c:66 msgid "TTL expired" msgstr "TTL har utgÃ¥tt" #: src/proxy.c:67 msgid "command not supported / protocol error" msgstr "kommando stöds inte / protokollfel" #: src/proxy.c:68 msgid "address type not supported" msgstr "adresstyp stöds inte" #: src/proxy.c:241 #, c-format msgid "Connected to proxy server %s port %s, sending request..." msgstr "Ansluten till proxyserver %s port %s, skickar begäran..." #: src/proxy.c:296 src/proxy.c:425 src/proxy.c:470 src/proxy.c:544 msgid "Error while reading from proxy host." msgstr "" #: src/proxy.c:317 msgid "request rejected or failed" msgstr "begäran nekades eller misslyckades" #: src/proxy.c:321 msgid "request failed because identd could not be reached" msgstr "" #: src/proxy.c:325 msgid "" "request failed because client's identd could not confirm the user ID string " "in the request" msgstr "" #: src/proxy.c:329 src/proxy.c:570 #, c-format msgid "Proxy request failed: %s." msgstr "Proxybegäran misslyckades: %s." #: src/proxy.c:346 #, c-format msgid "Connected to proxy server %s port %s, negotiating authentication..." msgstr "Ansluten till proxyserver %s port %s, förhandlar om autentisering..." #: src/proxy.c:440 msgid "No acceptable proxy authentication methods." msgstr "Inga acceptabla metoder för proxyautentisering." #: src/proxy.c:488 msgid "Proxy authentication failed." msgstr "Proxyautentisering misslyckades." #. Should never happen #: src/proxy.c:531 msgid "Unrecognized response from proxy host." msgstr "Okänt svar frÃ¥n proxyvärd." #: src/proxy.c:565 msgid "unknown reason code" msgstr "" #: src/proxy.c:586 #, c-format msgid "Sending proxy authentication credentials..." msgstr "Skickar referenser för proxyautentisering..." #: src/proxy.c:625 #, c-format msgid "Sending connection request..." msgstr "Skickar anslutningsbegäran..." #: src/mainwindow.c:173 src/mainwindow.c:550 src/mainwindow.c:815 #: src/worldgui.c:1127 src/worldselector.c:195 src/worldeditor.c:182 #: src/we_general.c:344 src/we_generic_guied.c:83 src/we_triggers.c:85 #: src/we_triggers.c:555 src/we_triggers.c:753 src/we_aliases.c:78 #: src/we_aliases.c:457 src/we_macros.c:81 src/we_macros.c:422 #: src/we_timers.c:78 src/we_timers.c:459 src/we_hooks.c:89 src/we_hooks.c:609 #: src/we_vars.c:78 src/we_vars.c:380 src/prefs.c:109 src/triggers.c:585 #: src/multilinesend.c:95 src/cmdhistory.c:209 src/cmdhistory.c:454 #, fuzzy, c-format msgid "Error loading UI from XML file: %s" msgstr "Fel i filen för insticksmodul: %s" #: src/mainwindow.c:610 src/mainwindow.c:611 msgid "Not connected" msgstr "Inte ansluten" #: src/mainwindow.c:751 msgid ": Not yet active" msgstr ": Inte ännu aktiv" #: src/mainwindow.c:756 msgid ": Expired" msgstr ": UtgÃ¥tt" #: src/mainwindow.c:768 src/dlgStatistics.glade:81 src/dlgStatistics.glade:346 msgid "None" msgstr "Ingen" #: src/worldgui.c:227 msgid "_Find:" msgstr "_Sök:" #: src/worldgui.c:241 msgid "Find Next" msgstr "Sök nästa" #: src/worldgui.c:273 msgid "Click to clear the command input area." msgstr "Klicka för att tömma kommandoinmatningsrutan." #: src/worldgui.c:374 msgid "No world" msgstr "Ingen värld" #: src/worldgui.c:448 msgid "KildClient ready" msgstr "KildClient redo" #: src/worldgui.c:455 msgid "0 lines" msgstr "0 rader" #: src/worldgui.c:910 msgid "Are you sure you want to close this world?" msgstr "Är du säker pÃ¥ att du vill stänga denna värld?" #: src/worldgui.c:911 msgid "Really close?" msgstr "Vill du verkligen stänga?" #. Keep Open is RESPONSE_NO because of NO close. But we use #. STOCK_YES to pass a positive image. #: src/worldgui.c:914 msgid "Keep _open" msgstr "BehÃ¥ll _öppen" #: src/worldgui.c:1058 #, c-format msgid "Error setting spell checker: %s\n" msgstr "Fel uppstod vid inställning av stavningskontrollerare: %s\n" #: src/worldgui.c:1062 msgid "Spell checking support not included in this build." msgstr "Stöd för stavningskontroll är inte inkluderat i denna version." #: src/worldgui.c:1341 msgid "Click to open link; right-click for more options." msgstr "Klicka för att öppna länk; högerklicka för fler alternativ." #: src/worldgui.c:1503 msgid "Not found" msgstr "Hittades inte" #: src/ansitextview.c:438 msgid "1 line" msgstr "1 rad" #: src/ansitextview.c:440 #, c-format msgid "%d lines" msgstr "%d rader" #: src/worldselector.c:140 src/worldselector.c:690 #, c-format msgid "Could not load world from file '%s': %s" msgstr "Kunde inte läsa in värld frÃ¥n fil '%s': %s" #: src/worldselector.c:143 src/worldselector.c:693 src/worlds.c:2284 #: src/we_generic_guied.c:312 src/we_generic_guied.c:401 src/prefs.c:451 #: src/prefs.c:530 msgid "KildClient Error" msgstr "KildClient-fel" #: src/worldselector.c:496 #, c-format msgid "Could not open world '%s': %s\n" msgstr "Kunde inte öppna värld '%s': %s\n" #: src/worldselector.c:538 #, fuzzy, c-format msgid "Invalid argument '%s'\n" msgstr "Ogiltigt attribut '%s' för element '%s'" #: src/worldselector.c:811 msgid "Disconnected" msgstr "FrÃ¥nkopplad" #: src/worldselector.c:814 src/worldselector.c:821 msgid "Reconnect" msgstr "Ã…teranslut" #: src/worldselector.c:815 src/worldselector.c:822 msgid "Connect to another world" msgstr "Anslut till en annan värld" #: src/worldselector.c:816 msgid "Offline" msgstr "FrÃ¥nkopplad" #: src/worlds.c:690 msgid "Unnamed world" msgstr "Namnlös värld" #: src/worlds.c:747 #, c-format msgid "Could not open file: %s" msgstr "Kunde inte öppna fil: %s" #: src/worlds.c:810 #, fuzzy, c-format msgid "Invalid top-level element '%s'" msgstr "Ogiltigt attribut '%s' för element '%s'" #: src/worlds.c:1624 #, c-format msgid "Internal error: element '%s' ends when in START mode" msgstr "Internt fel: element '%s' slutar i START-läge" #: src/worlds.c:1898 #, c-format msgid "Invalid key code '%s'" msgstr "" #: src/worlds.c:1917 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "Element '%s' är inte tillÃ¥tet inuti element '%s'" #: src/worlds.c:1930 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "Ogiltigt attribut '%s' för element '%s'" #: src/worlds.c:2281 src/we_generic_guied.c:309 src/prefs.c:448 #, c-format msgid "Could not open file '%s': %s" msgstr "Kunde inte öppna fil '%s: %s" #: src/worlds.c:2440 #, c-format msgid "Disconnected from world %s" msgstr "FrÃ¥nkopplad frÃ¥n värld %s" #: src/worldeditor.c:247 msgid "General" msgstr "Allmänt" #: src/worldeditor.c:255 src/worldeditor.c:259 msgid "Display" msgstr "Skärm" #: src/worldeditor.c:256 msgid "Here you can set options to configure the appearance of KildClient." msgstr "" "Här kan du justera inställningar för att konfigurera KildClients utseende." #: src/worldeditor.c:267 msgid "Main Window" msgstr "Huvudfönster" #: src/worldeditor.c:275 msgid "Colors" msgstr "Färger" #: src/worldeditor.c:283 msgid "Status Bar" msgstr "Statusmätare" #: src/worldeditor.c:291 msgid "Input" msgstr "Inmatning" #: src/worldeditor.c:299 msgid "Logging" msgstr "Loggning" #: src/worldeditor.c:305 src/worldeditor.c:309 msgid "Automation" msgstr "Automatisering" #: src/worldeditor.c:306 msgid "" "Here you can set options to configure the automation features of KildClient, " "such as triggers, aliases, plugins, etc." msgstr "" "Här kan du justera inställningar för att konfigurera KildClients " "automatiserande funktioner sÃ¥ som triggers, alias, insticksmoduler etcetera." #: src/worldeditor.c:317 msgid "Scripting" msgstr "Skriptning" #: src/worldeditor.c:325 msgid "Plugins" msgstr "Insticksmoduler" #: src/worldeditor.c:336 src/kildclient.glade:1808 msgid "Triggers" msgstr "" #: src/worldeditor.c:347 src/kildclient.glade:1822 msgid "Aliases" msgstr "Alias" #: src/worldeditor.c:358 src/kildclient.glade:1838 msgid "Macros" msgstr "Makrotar" #: src/worldeditor.c:369 src/kildclient.glade:1854 msgid "Timers" msgstr "Tidur" #: src/worldeditor.c:380 msgid "Hooks" msgstr "" #: src/worldeditor.c:391 msgid "Variables" msgstr "Variabler" #: src/worldeditor.c:400 msgid "Protocols" msgstr "Protokoll" #: src/worldeditor.c:408 msgid "Miscellaneous" msgstr "Diverse" #: src/worldeditor.c:416 msgid "Advanced" msgstr "Avancerat" #: src/we_general.c:75 msgid "Character" msgstr "Karaktär" #: src/we_general.c:83 msgid "Password" msgstr "Lösenord" #: src/we_general.c:383 msgid "You must specify the name." msgstr "Du mÃ¥ste ange namnet." #: src/we_general.c:384 src/we_general.c:397 src/we_triggers.c:638 #: src/we_triggers.c:652 src/we_aliases.c:519 src/we_aliases.c:532 #: src/we_macros.c:479 src/we_macros.c:492 src/we_macros.c:505 #: src/we_timers.c:518 src/we_timers.c:531 src/we_hooks.c:661 #: src/we_vars.c:408 src/we_vars.c:420 src/we_vars.c:440 #: src/permanentvariables.c:131 src/cmdhistory.c:278 src/cmdhistory.c:290 #: src/cmdhistory.c:484 src/cmdhistory.c:517 src/cmdhistory.c:574 msgid "KildClient Warning" msgstr "KildClient-varning" #: src/we_general.c:396 msgid "You must specify the password." msgstr "Du mÃ¥ste ange lösenordet." #: src/we_general.c:438 msgid "character" msgstr "karaktär" #: src/we_logging.c:124 #, c-format msgid "Logging to file %s." msgstr "Loggar till filen %s." #: src/we_logging.c:130 msgid "Logging is disabled." msgstr "Loggning är inaktiverad." #: src/we_logging.c:227 msgid "Logging not started" msgstr "Loggning har inte startat" #: src/we_logging.c:257 msgid "Select log file" msgstr "Markera loggfil" #: src/we_plugins.c:126 src/we_plugins.c:343 src/we_triggers.c:227 #: src/we_aliases.c:208 src/we_macros.c:211 src/we_timers.c:208 #: src/we_hooks.c:330 src/perlscript.c:3195 msgid "Name" msgstr "Namn" #: src/we_plugins.c:138 src/we_plugins.c:385 src/perlscript.c:3196 msgid "Description" msgstr "Beskrivning" #: src/we_plugins.c:150 src/we_plugins.c:371 msgid "Author" msgstr "Upphovsman" #: src/we_plugins.c:163 msgid "File" msgstr "Fil" #: src/we_plugins.c:211 src/we_plugins.c:467 msgid "Error Loading Plugin" msgstr "Fel vid inläsning av insticksmodul" #: src/we_plugins.c:329 src/we_triggers.c:213 src/we_aliases.c:194 #: src/we_macros.c:197 src/we_timers.c:194 src/we_hooks.c:316 msgid "Enabled" msgstr "Aktiverat(d)" #: src/we_plugins.c:357 msgid "Version" msgstr "Version" #: src/we_plugins.c:445 msgid "Always load this plugin at _startup" msgstr "Läs alltid in denna insticksmodul vid _uppstart" #: src/we_plugins.c:507 msgid "The help is displayed in main window." msgstr "Hjälpen visas i huvudfönstret." #: src/we_plugins.c:508 msgid "KildClient Information" msgstr "KildClient-information" #: src/we_plugins.c:509 msgid "_Do not display this message again" msgstr "_Visa inte detta meddelande igen" #: src/we_plugins.c:581 msgid "Load plugin" msgstr "Läs in insticksmodul" #: src/we_generic_guied.c:96 msgid "Export" msgstr "Exportera" #: src/we_generic_guied.c:363 msgid "Import" msgstr "Importera" #: src/we_generic_guied.c:398 #, c-format msgid "Could not import file '%s': %s" msgstr "Kunde inte importera fil '%s': %s" #: src/we_generic_guied.c:952 #, c-format msgid "Do you really want to delete the %s?" msgstr "Vill du verkligen ta bort filen %s?" #: src/we_generic_guied.c:959 #, c-format msgid "Do you really want to delete %d %s?" msgstr "Vill du verkligen ta bort %d %s?" #: src/we_generic_guied.c:963 src/we_vars.c:292 msgid "Confirm deletion" msgstr "Bekräfta borttagelse" #: src/we_generic_guied.c:964 msgid "Do not delete" msgstr "Ta inte bort" #: src/we_generic_guied.c:972 msgid "Delete" msgstr "Ta bort" #: src/we_triggers.c:132 src/dlgTestTriggers.glade:7 msgid "Test Triggers" msgstr "" #: src/we_triggers.c:241 src/we_aliases.c:222 src/triggers.c:449 #: src/aliases.c:171 msgid "Pattern" msgstr "Mönster" #: src/we_triggers.c:259 src/we_aliases.c:240 msgid "I. Case" msgstr "" #: src/we_triggers.c:273 src/we_macros.c:239 src/we_timers.c:248 #: src/we_hooks.c:344 src/triggers.c:450 src/macros.c:147 src/timers.c:205 msgid "Action" msgstr "Ã…tgärd" #: src/we_triggers.c:291 msgid "Gag" msgstr "" #: src/we_triggers.c:309 msgid "Gag Log" msgstr "" #: src/we_triggers.c:327 msgid "Keep Exec" msgstr "" #: src/we_triggers.c:345 msgid "Rewriter" msgstr "" #: src/we_triggers.c:363 msgid "Style" msgstr "Stil" #: src/we_triggers.c:377 src/we_aliases.c:286 src/we_macros.c:253 #: src/we_timers.c:280 src/we_hooks.c:358 msgid "Plugin" msgstr "Insticksmodul" #: src/we_triggers.c:473 share/kildclient.pl:233 share/kildclient.pl:236 #: share/kildclient.pl:443 share/kildclient.pl:518 share/kildclient.pl:721 msgid "trigger" msgstr "" #: src/we_triggers.c:473 share/kildclient.pl:443 msgid "triggers" msgstr "" #: src/we_triggers.c:637 src/we_aliases.c:518 msgid "You must specify the pattern." msgstr "Du mÃ¥ste ange mönstret." #: src/we_triggers.c:651 msgid "" "You must specify the action, unless the trigger is a gag or changes the " "style." msgstr "" #: src/we_aliases.c:254 src/aliases.c:172 msgid "Substitution" msgstr "" #: src/we_aliases.c:272 msgid "Eval as Perl" msgstr "Eval som Perl" #: src/we_aliases.c:382 share/kildclient.pl:246 share/kildclient.pl:249 #: share/kildclient.pl:449 share/kildclient.pl:524 share/kildclient.pl:733 msgid "alias" msgstr "alias" #: src/we_aliases.c:382 share/kildclient.pl:449 msgid "aliases" msgstr "alias" #: src/we_aliases.c:531 msgid "You must specify the substitution." msgstr "" #: src/we_macros.c:225 src/macros.c:146 msgid "Key" msgstr "Tangent" #: src/we_macros.c:349 share/kildclient.pl:259 share/kildclient.pl:262 #: share/kildclient.pl:455 share/kildclient.pl:530 share/kildclient.pl:745 msgid "macro" msgstr "makro" #: src/we_macros.c:349 share/kildclient.pl:455 msgid "macros" msgstr "makrotar" #: src/we_macros.c:478 msgid "You must specify the key." msgstr "Du mÃ¥ste ange tangenten." #: src/we_macros.c:491 msgid "Invalid key code." msgstr "" #: src/we_macros.c:504 src/we_timers.c:530 src/we_hooks.c:660 msgid "You must specify the action." msgstr "Du mÃ¥ste ange Ã¥tgärden." #: src/we_timers.c:221 msgid "Interval" msgstr "Intervall" #: src/we_timers.c:234 msgid "Count" msgstr "Antal" #: src/we_timers.c:266 msgid "Temp" msgstr "" #: src/we_timers.c:383 share/kildclient.pl:272 share/kildclient.pl:275 #: share/kildclient.pl:461 share/kildclient.pl:536 share/kildclient.pl:757 msgid "timer" msgstr "tidur" #: src/we_timers.c:383 share/kildclient.pl:461 msgid "timers" msgstr "tidur" #: src/we_timers.c:517 msgid "The interval must be positive." msgstr "Intervallet mÃ¥ste vara positivt." #. The manually added combo for selecting which hook #: src/we_hooks.c:132 msgid "_Event:" msgstr "_Händelse:" #: src/we_hooks.c:536 share/kildclient.pl:286 share/kildclient.pl:289 #: share/kildclient.pl:467 share/kildclient.pl:543 share/kildclient.pl:770 msgid "hook" msgstr "" #: src/we_hooks.c:536 share/kildclient.pl:467 msgid "hooks" msgstr "" #: src/we_vars.c:283 msgid "Do you really want to make the variable temporary?" msgstr "Vill du verkligen göra variabeln temporär?" #: src/we_vars.c:289 #, c-format msgid "Do you really want to make %d variables temporary?" msgstr "Vill du verkligen göra %d variabler temporära?" #: src/we_vars.c:293 msgid "Keep permanent" msgstr "BehÃ¥ll permanent" #: src/we_vars.c:301 msgid "Make temporary" msgstr "Gör temporär" #: src/we_vars.c:407 msgid "You must specify a variable name." msgstr "Du mÃ¥ste ange ett namn pÃ¥ variabeln." #: src/we_vars.c:419 #, c-format msgid "" "Only scalar ($), array (@) and hash (%%) variables can be made permanent." msgstr "" #: src/we_vars.c:438 #, c-format msgid "%s is already permanent." msgstr "%s är redan permanent." #: src/prefs.c:401 #, c-format msgid "Invalid window size specification in config file.\n" msgstr "Ogiltig angivelse för fönsterstorlek i konfigurationsfil.\n" #: src/prefs.c:421 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "Okänd katalog '%s' i konfigurationsfil.\n" #: src/prefs.c:527 #, c-format msgid "Could not create directory '%s': %s" msgstr "Kunde inte skapa katalog '%s': %s" #: src/parser.c:148 msgid "" "Warning: Trying to send a very long command line. Perhaps a recursive alias " "definition?" msgstr "" #: src/triggers.c:448 #, c-format msgid "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" msgstr "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" #: src/triggers.c:470 src/triggers.c:471 src/triggers.c:472 src/triggers.c:473 #: src/triggers.c:474 src/triggers.c:475 src/triggers.c:476 src/aliases.c:192 #: src/aliases.c:193 src/aliases.c:194 src/macros.c:169 src/timers.c:228 #: src/timers.c:229 src/hooks.c:188 src/perlscript.c:3215 msgid "y" msgstr "j" #: src/triggers.c:470 src/triggers.c:471 src/triggers.c:472 src/triggers.c:473 #: src/triggers.c:474 src/triggers.c:475 src/triggers.c:476 src/aliases.c:192 #: src/aliases.c:193 src/aliases.c:194 src/macros.c:169 src/timers.c:228 #: src/timers.c:229 src/hooks.c:188 src/perlscript.c:3215 msgid "n" msgstr "n" #: src/triggers.c:668 msgid "No" msgstr "Nej" #: src/triggers.c:668 msgid "Yes" msgstr "Ja" #: src/aliases.c:170 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "Num Eval Ena IgC %-*.*s %-*.*s\n" #: src/macros.c:145 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "Num Ena %-*.*s %-*.*s\n" #: src/timers.c:197 msgid "Num Ena Temp Int " msgstr "" #: src/timers.c:201 msgid "Count " msgstr "Antal" #: src/permanentvariables.c:127 #, c-format msgid "" "Could not open file '%s': %s\n" "Variables were not saved." msgstr "" "Kunde inte öppna fil '%s': %s\n" "Variabler sparades inte." #: src/hooks.c:62 #, c-format msgid "hook: hook '%s' not found\n" msgstr "hook: hook '%s' hittades inte\n" #: src/hooks.c:78 src/hooks.c:211 msgid "No such hook" msgstr "" #: src/hooks.c:160 src/hooks.c:206 msgid "Hook not found" msgstr "" #: src/hooks.c:173 #, c-format msgid "Hooks for '%s':\n" msgstr "Hooks for '%s':\n" #: src/hooks.c:174 msgid "Num Ena Action" msgstr "" #: src/hooks.c:216 #, c-format msgid "" "Hook number %d for event %s\n" " Name: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Hook number %d for event %s\n" " Namn: %s\n" " Ã…tgärd: %s\n" " Aktiverat: %s\n" #: src/hooks.c:222 src/perlscript.c:1532 src/perlscript.c:2033 #: src/perlscript.c:2343 src/perlscript.c:2625 msgid "Not set" msgstr "Inte inställt" #: src/hooks.c:224 src/perlscript.c:1535 src/perlscript.c:1536 #: src/perlscript.c:1537 src/perlscript.c:1538 src/perlscript.c:1539 #: src/perlscript.c:1540 src/perlscript.c:1541 src/perlscript.c:2036 #: src/perlscript.c:2037 src/perlscript.c:2038 src/perlscript.c:2346 #: src/perlscript.c:2629 src/perlscript.c:2630 src/perlscript.c:3253 msgid "yes" msgstr "ja" #: src/hooks.c:224 src/perlscript.c:1535 src/perlscript.c:1536 #: src/perlscript.c:1537 src/perlscript.c:1538 src/perlscript.c:1539 #: src/perlscript.c:1540 src/perlscript.c:1541 src/perlscript.c:2036 #: src/perlscript.c:2037 src/perlscript.c:2038 src/perlscript.c:2346 #: src/perlscript.c:2629 src/perlscript.c:2630 src/perlscript.c:3253 msgid "no" msgstr "nej" #: src/log.c:97 msgid "File name not specified." msgstr "Filnamnet är inte angivet." #: src/log.c:161 msgid "Could not open log file." msgstr "Kunde inte öppna loggfil." #: src/plugins.c:104 src/plugins.c:161 #, c-format msgid "Failed loading file %s: %s" msgstr "Misslyckades med att läsa in fil %s: %s" #: src/cmdhistory.c:277 msgid "No command selected." msgstr "Inget kommando markerat." #: src/cmdhistory.c:289 msgid "More than one command selected." msgstr "Fler än ett kommando markerat." #: src/cmdhistory.c:483 msgid "Enter some text to search for." msgstr "Skriv in lite text att söka efter." #: src/cmdhistory.c:516 msgid "Use the Find button to find the first result." msgstr "Använd sök-knappen för att hitta det första resultatet." #: src/cmdhistory.c:573 msgid "Command not found." msgstr "Kommando hittades inte." #: src/perlscript.c:430 src/perlscript.c:436 src/perlscript.c:443 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "" #: src/perlscript.c:585 src/perlscript.c:602 src/perlscript.c:664 #: src/perlscript.c:697 src/perlscript.c:1075 src/perlscript.c:1101 #: src/perlscript.c:1151 src/perlscript.c:1171 src/perlscript.c:1194 #: src/perlscript.c:1222 src/perlscript.c:1231 src/perlscript.c:1773 #: src/perlscript.c:1782 src/perlscript.c:1962 src/perlscript.c:2133 #: src/perlscript.c:2142 src/perlscript.c:2422 src/perlscript.c:2431 #: src/perlscript.c:2700 src/perlscript.c:2754 src/perlscript.c:2799 #: src/perlscript.c:2864 src/perlscript.c:2875 src/perlscript.c:2967 #: src/perlscript.c:3300 src/kcwin.c:98 #, c-format msgid "%s: Too few arguments" msgstr "%s: För fÃ¥ argument" #: src/perlscript.c:630 #, c-format msgid "%s: Argument must be numeric" msgstr "%s: Argumentet mÃ¥ste vara numeriskt" #: src/perlscript.c:678 src/perlscript.c:710 #, c-format msgid "%s: No such world" msgstr "%s: Ingen sÃ¥dan värld" #: src/perlscript.c:745 msgid "World saved." msgstr "Värld sparad." #: src/perlscript.c:969 src/perlscript.c:984 src/perlscript.c:994 #, c-format msgid "%s: This is an internal function, do not call directly." msgstr "" #: src/perlscript.c:973 src/perlscript.c:1353 src/perlscript.c:1884 #: src/perlscript.c:2258 src/perlscript.c:2453 src/perlscript.c:2928 #, c-format msgid "%s: Wrong argument type" msgstr "%s: Fel argumentstyp" #: src/perlscript.c:1245 src/perlscript.c:1515 msgid "No such trigger" msgstr "" #: src/perlscript.c:1263 src/perlscript.c:1814 src/perlscript.c:2187 #: src/perlscript.c:2887 #, c-format msgid "%s: Too many string arguments" msgstr "" #: src/perlscript.c:1286 src/perlscript.c:1837 #, c-format msgid "%s: pattern given twice, using the named attribute one" msgstr "" #: src/perlscript.c:1298 src/perlscript.c:2236 src/perlscript.c:2907 #, c-format msgid "%s: action given twice, using the named attribute one" msgstr "" #: src/perlscript.c:1344 src/perlscript.c:1875 src/perlscript.c:2249 #: src/perlscript.c:2920 #, c-format msgid "%s: Wrong type of reference" msgstr "%s: Fel referenstyp" #: src/perlscript.c:1364 #, c-format msgid "%s: pattern not specified, not creating" msgstr "%s: mönstret är inte angivet, skapar inte" #: src/perlscript.c:1373 #, c-format msgid "%s: action not specified, and isn't gag, not creating" msgstr "" #: src/perlscript.c:1403 msgid "Trigger added." msgstr "" #: src/perlscript.c:1409 msgid "Trigger modified." msgstr "" #: src/perlscript.c:1434 #, c-format msgid "%s: invalid target" msgstr "%s: ogiltigt mÃ¥l" #: src/perlscript.c:1444 #, c-format msgid "%s: invalid fg color" msgstr "%s: ogiltig förgrundsfärg" #: src/perlscript.c:1454 #, c-format msgid "%s: invalid bg color" msgstr "%s: ogiltig bakgrundsfärg" #: src/perlscript.c:1464 #, c-format msgid "%s: invalid underline style" msgstr "%s: ogiltig understreckstil" #: src/perlscript.c:1520 #, c-format msgid "" "Trigger number %d\n" " Name: %s\n" " Pattern: %s\n" " Action: %s\n" " Enabled: %s\n" " Ignore case: %s\n" " Gag output: %s\n" " Gag in log: %s\n" " Keep executing: %s\n" " Rewriter: %s\n" " Change style: %s\n" msgstr "" "Trigger number %d\n" " Namn: %s\n" " Mönster: %s\n" " Ã…tgärd: %s\n" " Aktiverat: %s\n" " Ignorera skiftläge: %s\n" " Gag output: %s\n" " Gag in log: %s\n" " Fortsätt verkställa: %s\n" " Rewriter: %s\n" " Byt stil: %s\n" #: src/perlscript.c:1544 #, c-format msgid "" " Target: %d\n" " Foreground: %d\n" " Background: %d\n" " Italics: %d\n" " Striked-thru: %d\n" " Underline: %d\n" msgstr "" " MÃ¥l: %d\n" " Förgrund: %d\n" " Bakgrund: %d\n" " Kursiv: %d\n" " Genomstrykning: %d\n" " Understreck: %d\n" #: src/perlscript.c:1796 src/perlscript.c:2020 msgid "No such alias" msgstr "Inget sÃ¥dant alias" #: src/perlscript.c:1849 #, c-format msgid "%s: substitution given twice, using the named attribute one" msgstr "" #: src/perlscript.c:1895 msgid "alias: not creating alias without pattern" msgstr "alias: skapar inte alias utan mönster" #: src/perlscript.c:1903 msgid "alias: not creating alias without substitution" msgstr "" #: src/perlscript.c:1932 msgid "Alias added." msgstr "Alias tillagt." #: src/perlscript.c:1937 msgid "Alias modified." msgstr "Alias modifierat." #: src/perlscript.c:2025 #, c-format msgid "" "Alias number %d\n" " Name: %s\n" " Pattern: %s\n" " Substitution: %s\n" " Ignore case: %s\n" " Eval as Perl: %s\n" " Enabled: %s\n" msgstr "" "Aliasnummer %d\n" " Namn: %s\n" " Mönster: %s\n" " Substitution: %s\n" " Ignorera skiftläge: %s\n" " Eval som Perl: %s\n" " Aktiverat: %s\n" #: src/perlscript.c:2105 msgid "Press a key to get its keycode." msgstr "" #: src/perlscript.c:2157 msgid "macro: No such macro" msgstr "makro: Inget sÃ¥dant makro" #: src/perlscript.c:2176 src/perlscript.c:2224 #, c-format msgid "%s: Invalid key code" msgstr "" #: src/perlscript.c:2213 #, c-format msgid "%s: keycode given twice, using the named attribute one" msgstr "" #: src/perlscript.c:2269 #, c-format msgid "%s: keycode not specified, not creating" msgstr "" #: src/perlscript.c:2276 src/perlscript.c:2537 #, c-format msgid "%s: action not specified, not creating" msgstr "%s: Ã¥tgärden är inte angiven, skapar inte" #: src/perlscript.c:2295 msgid "Macro added." msgstr "Makro tillagt." #: src/perlscript.c:2300 msgid "Macro modified." msgstr "Makro modifierat." #: src/perlscript.c:2331 msgid "No such macro" msgstr "Inget sÃ¥dant makro" #: src/perlscript.c:2337 #, c-format msgid "" "Macro number %d\n" " Name: %s\n" " Key Code: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Makronummer %d\n" " Namn: %s\n" " Key Code: %s\n" " Ã…tgärd: %s\n" " Aktiverat: %s\n" #: src/perlscript.c:2447 msgid "timer: No such timer" msgstr "tidur: Inget sÃ¥dant tidur" #: src/perlscript.c:2472 #, c-format msgid "%s: interval must be numeric" msgstr "%s: intervall mÃ¥ste vara numeriskt" #: src/perlscript.c:2485 #, c-format msgid "%s: count must be numeric" msgstr "%s: antal mÃ¥ste vara numeriskt" #: src/perlscript.c:2516 #, c-format msgid "%s: interval not specified, not creating" msgstr "%s: intervallet är inte angivet, skapar inte" #: src/perlscript.c:2577 msgid "Timer added." msgstr "Tidur tillaggt." #: src/perlscript.c:2582 msgid "Timer modified." msgstr "Tidur modifierat." #: src/perlscript.c:2612 msgid "No such timer" msgstr "Inget sÃ¥dant tidur" #: src/perlscript.c:2617 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %d\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" "Tidursnummer %d\n" " Namn: %s\n" " Intervall: %d\n" " Antal upprepningar: %d\n" " Ã…tgärd: %s\n" " Aktiverat: %s\n" " Temporärt: %s\n" #: src/perlscript.c:2708 #, c-format msgid "" "%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent" msgstr "" #: src/perlscript.c:2717 #, c-format msgid "%s: %s is already permanent" msgstr "%s: %s är redan permanent" #: src/perlscript.c:2731 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "%s: Variabel '%s' gjord permanent.\n" #: src/perlscript.c:2773 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "%s: Variabel '%s' gjord temporär.\n" #: src/perlscript.c:2777 #, c-format msgid "%s: %s is not permanent" msgstr "%s: %s är inte permanent" #: src/perlscript.c:2830 msgid "Permanent variables" msgstr "Permanenta variabler" #: src/perlscript.c:2942 msgid "Hook defined." msgstr "" #: src/perlscript.c:2946 msgid "Hook modified." msgstr "" #: src/perlscript.c:3052 msgid "Logging stopped." msgstr "Loggning stoppad." #: src/perlscript.c:3194 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "Num Ena %-*.*s Version %-*.*s\n" #: src/perlscript.c:3237 msgid "No such plugin" msgstr "Ingen sÃ¥dan insticksmodul" #: src/perlscript.c:3242 #, c-format msgid "" "Plugin number %d\n" " Name: %s\n" " Version: %s\n" " Description: %s\n" " Author: %s\n" " Enabled: %s\n" msgstr "" "Insticksmodulsnummer %d\n" " Namn: %s\n" " Version: %s\n" " Beskrivning: %s\n" " Upphovsman: %s\n" " Aktiverad: %s\n" #: src/kildclient.glade:176 msgid "_Import" msgstr "_Importera" #: src/kildclient.glade:225 msgid "E_xport" msgstr "E_xportera" #: src/kildclient.glade:274 msgid "Edit Alias" msgstr "Redigera alias" #: src/kildclient.glade:293 src/kildclient.glade:536 src/kildclient.glade:875 #: src/kildclient.glade:1170 src/kildclient.glade:1441 #: src/kildclient.glade:1687 src/dlgEditWorld.glade:92 #: src/dlgEditWorld.glade:3305 msgid "_Name:" msgstr "_Namn:" #: src/kildclient.glade:306 src/kildclient.glade:549 msgid "_Pattern:" msgstr "_Mönster:" #: src/kildclient.glade:321 msgid "_Substitution:" msgstr "" #: src/kildclient.glade:336 msgid "Enter optionally a descriptive name for the alias" msgstr "Skriv in, om du vill, ett beskrivande namn för alias" #: src/kildclient.glade:350 msgid "Enter the pattern to match against typed commands" msgstr "" #: src/kildclient.glade:365 msgid "Enter the substitution to be executed" msgstr "" #: src/kildclient.glade:378 msgid "E_val substitution as Perl statement" msgstr "" #: src/kildclient.glade:382 msgid "Check to have the substitution be executed in a s///e construction" msgstr "" #: src/kildclient.glade:396 src/kildclient.glade:638 src/kildclient.glade:978 #: src/kildclient.glade:1226 src/kildclient.glade:1421 msgid "_Enabled" msgstr "_Aktiverat(d)" #: src/kildclient.glade:400 msgid "Check to make the alias enabled; only enabled aliases are tried" msgstr "Markera för att aktivera alias; bara aktiverade alias försökes med" #: src/kildclient.glade:416 src/kildclient.glade:712 src/kildclient.glade:1072 #: src/kildclient.glade:1292 src/kildclient.glade:1496 msgid "Note:" msgstr "Observera:" #: src/kildclient.glade:430 src/kildclient.glade:726 src/kildclient.glade:1086 #: src/kildclient.glade:1306 src/kildclient.glade:1510 msgid "" "This object belongs to a plugin. Changes made here will not be saved " "in the plugin." msgstr "" "Detta objekt tillhör en insticksmodul. Ändringar gjorda här kommer inte att sparas i insticksmodulen." #: src/kildclient.glade:445 src/kildclient.glade:741 msgid "_Ignore case when matching" msgstr "" #: src/kildclient.glade:516 src/kildclient.glade:2030 msgid "Enter optionally a descriptive name for the trigger" msgstr "" #: src/kildclient.glade:517 msgid "Edit Trigger" msgstr "" #: src/kildclient.glade:564 src/kildclient.glade:932 src/kildclient.glade:1246 #: src/kildclient.glade:1393 msgid "_Action:" msgstr "_Ã…tgärd:" #: src/kildclient.glade:592 msgid "Enter the pattern to match against received lines" msgstr "" #: src/kildclient.glade:607 msgid "Enter the action that will be run when a match happens" msgstr "" #: src/kildclient.glade:620 msgid "Omit (_gag) from output" msgstr "" #: src/kildclient.glade:624 msgid "Check to make the matched line not be printed in the main output window" msgstr "" "Markera för att göra sÃ¥ att den matchade raden inte skrivs ut i " "huvudfönstret för utmatning" #: src/kildclient.glade:642 msgid "Check to make the trigger enabled; only enabled triggers are tried" msgstr "" #: src/kildclient.glade:656 msgid "Omit (gag) from _log file" msgstr "" #: src/kildclient.glade:660 msgid "Check to make the matched line not be printed in the log file" msgstr "" #: src/kildclient.glade:674 msgid "_Keep executing other triggers after this this one matches" msgstr "" #: src/kildclient.glade:678 msgid "" "Check to make this trigger not prevent further triggers from being tried, if " "it matches" msgstr "" #: src/kildclient.glade:692 msgid "_Rewriter trigger" msgstr "" #: src/kildclient.glade:696 msgid "Check to make this trigger a rewriter trigger" msgstr "" #: src/kildclient.glade:763 msgid "C_hange style" msgstr "B_yt stil" #: src/kildclient.glade:779 msgid "C_onfigure..." msgstr "K_onfigurera..." #: src/kildclient.glade:856 msgid "Edit Timer" msgstr "Redigera tidur" #: src/kildclient.glade:888 msgid "_Interval:" msgstr "_Intervall:" #: src/kildclient.glade:903 msgid "Enter optionally a descriptive name for the timer" msgstr "Skriv in, om du vill, ett beskrivande namn för tiduret" #: src/kildclient.glade:917 msgid "Enter the action to be executed whenever the timer fires" msgstr "" #: src/kildclient.glade:947 msgid "_Repeat count:" msgstr "_Antal upprepningar:" #: src/kildclient.glade:960 msgid "" "_Temporary (will be deleted automatically when its repeat count reaches 0)" msgstr "" "_Temporärt (kommer att tas bort automatiskt när dess antal upprepningar nÃ¥r " "noll)" #: src/kildclient.glade:964 msgid "Check to have the timer deleted after its repeat count has reached 0" msgstr "" "Markera för att ta bort tiduret efter att dess antal upprepningar nÃ¥tt noll" #: src/kildclient.glade:982 msgid "Check to make the timer enabled; only enabled timers are run" msgstr "Markera för att aktivera tiduret; bara aktiverade tidur körs" #: src/kildclient.glade:1002 msgid "Specify the interval, in seconds, between timer activations" msgstr "Ange intervallet, i sekunder, mellan tidursaktiveringar" #: src/kildclient.glade:1015 msgid "seconds" msgstr "sekund(er)" #: src/kildclient.glade:1039 msgid "" "Specify how many times this timer should run before being disabled or deleted" msgstr "" "Ange hur mÃ¥nga gÃ¥nger detta tidur bör köras innan det inaktiveras eller tas " "bort" #: src/kildclient.glade:1052 msgid "(-1 to repeat indefinitely)" msgstr "" #: src/kildclient.glade:1151 msgid "Edit Macro" msgstr "Redigera makro" #: src/kildclient.glade:1183 msgid "_Key:" msgstr "_Tangent:" #: src/kildclient.glade:1198 msgid "Enter optionally a descriptive name for the macro" msgstr "Skriv in, om du vill, ett beskrivande namn för makrot" #: src/kildclient.glade:1212 msgid "Press the key that will be used to run the macro" msgstr "Tryck tangenten som kommer att användas för att köra makrot" #: src/kildclient.glade:1230 msgid "Check to make the macro enabled; only enabled macros are run" msgstr "Markera för att aktivera makrot; bara aktiverade makrotar körs" #: src/kildclient.glade:1261 msgid "Enter the action to be run when the key is pressed" msgstr "Skriv in Ã¥tgärden som ska vidtas dÃ¥ tangenten trycks ned" #: src/kildclient.glade:1276 msgid "" "Press the key that will be used to activate the macro while the cursor is in " "the text box." msgstr "" "Tryck tangenten som ska användas för att aktivera makrot dÃ¥ markören " "befinner sig i textrutan." #: src/kildclient.glade:1374 msgid "Edit Hook" msgstr "" #: src/kildclient.glade:1408 msgid "Enter the action to be run when the event happens" msgstr "Skriv in Ã¥tgärden som ska vidtas dÃ¥ händelsen inträffar" #: src/kildclient.glade:1425 msgid "Check to make the hook enabled; only enabled hooks are run" msgstr "" #: src/kildclient.glade:1456 msgid "Enter optionally a descriptive name for the hook" msgstr "" #: src/kildclient.glade:1472 msgid "Event:" msgstr "Händelse:" #: src/kildclient.glade:1575 msgid "Permenent variable" msgstr "Permanent variabel" #: src/kildclient.glade:1592 msgid "_Name of variable to make permanent:" msgstr "_Variabelns namn som ska göras permanent:" #: src/kildclient.glade:1606 msgid "" "Enter the name of a scalar ($), array (@) or hash (%) variable whose " "contents are to be saved between sessions of the World" msgstr "" #: src/kildclient.glade:1668 msgid "Edit Character Information" msgstr "Redigera karaktärsinformation" #: src/kildclient.glade:1700 msgid "Enter the character's name for automatic login" msgstr "Skriv in karaktärens namn för automatisk inloggning" #: src/kildclient.glade:1714 msgid "_Password:" msgstr "_Lösenord:" #: src/kildclient.glade:1729 msgid "Enter the character's password for automatic login" msgstr "Skriv in karaktärens lösenord för automatisk inloggning" #: src/kildclient.glade:1870 msgid "Permanent Variables" msgstr "Permanenta variabler" #: src/kildclient.glade:1886 msgid "OnConnect Hooks" msgstr "" #: src/kildclient.glade:1902 msgid "OnDisconnect Hooks" msgstr "" #: src/kildclient.glade:1920 msgid "OnReceivedText Hooks" msgstr "" #: src/kildclient.glade:1938 msgid "OnSentCommand Hooks" msgstr "" #: src/kildclient.glade:1956 msgid "OnGetFocus Hooks" msgstr "" #: src/kildclient.glade:1974 msgid "OnLoseFocus Hooks" msgstr "" #: src/kildclient.glade:1992 msgid "OnCloseConnected Hooks" msgstr "" #: src/kildclient.glade:2019 msgid "_Items to export" msgstr "_Objekt att exportera" #: src/kildclient.glade:2031 msgid "Change Style" msgstr "Byt stil" #: src/kildclient.glade:2050 msgid "_Background:" msgstr "_Bakgrund:" #: src/kildclient.glade:2064 msgid "_Italic:" msgstr "_Kursiv:" #: src/kildclient.glade:2077 src/kildclient.glade:2123 msgid "" "Do not change\n" "No\n" "Yes" msgstr "" "Ändra inte\n" "Nej\n" "Ja" #: src/kildclient.glade:2093 msgid "_Underline:" msgstr "_Understreck:" #: src/kildclient.glade:2106 msgid "" "Do not change\n" "None\n" "Single\n" "Double" msgstr "" "Ändra inte\n" "Ingen\n" "Enskild\n" "BÃ¥da" #: src/kildclient.glade:2139 msgid "_Striked-thru:" msgstr "_Genomstrykt:" #: src/kildclient.glade:2153 msgid "_Foreground:" msgstr "_Förgrund:" #: src/kildclient.glade:2167 msgid "_Apply to:" msgstr "_Tillämpa pÃ¥:" #: src/kildclient.glade:2181 msgid "The whole line" msgstr "Hela raden" #: src/kildclient.glade:2196 msgid "The whole matched text" msgstr "" #: src/kildclient.glade:2216 msgid "The matched substring number" msgstr "" #: src/kildclient.glade:2259 src/kildclient.glade:2290 msgid "" "Do not change\n" "Black\n" "Red\n" "Green\n" "Yellow\n" "Blue\n" "Magenta\n" "Cyan\n" "White\n" "Default\n" "Black (bold)\n" "Red (bold)\n" "Green (bold)\n" "Yellow (bold)\n" "Blue (bold)\n" "Magenta (bold)\n" "Cyan (bold)\n" "White (bold)\n" "Default (bold)\n" msgstr "" #: src/wndmain.glade:20 msgid "_World" msgstr "_Värld" #: src/wndmain.glade:37 msgid "_Reconnect" msgstr "_Ã…teranslut" #: src/wndmain.glade:45 msgid "_Disconnect" msgstr "_FrÃ¥nkoppla" #: src/wndmain.glade:53 msgid "Connect to _Another" msgstr "Anslut till _en annan" #: src/wndmain.glade:74 msgid "_Edit..." msgstr "_Redigera..." #: src/wndmain.glade:91 msgid "S_tatistics..." msgstr "S_tatistik..." #: src/wndmain.glade:103 src/wndmain.glade:238 msgid "_Previous" msgstr "_FöregÃ¥ende" #: src/wndmain.glade:118 src/wndmain.glade:247 msgid "_Next" msgstr "_Nästa" #: src/wndmain.glade:151 msgid "_Edit" msgstr "_Redigera" #: src/wndmain.glade:209 msgid "Find Ne_xt" msgstr "Sök n_ästa" #: src/wndmain.glade:222 msgid "_Input" msgstr "_Inmatning" #: src/wndmain.glade:256 msgid "Find Previous" msgstr "Sök föregÃ¥ende" #: src/wndmain.glade:265 msgid "Find N_ext" msgstr "Sök n_ästa" #: src/wndmain.glade:274 msgid "Command _History..." msgstr "Kommando_historia" #: src/wndmain.glade:288 msgid "_Multi-line Send..." msgstr "" #: src/wndmain.glade:302 msgid "_Test Triggers..." msgstr "" #: src/wndmain.glade:314 msgid "_Preferences" msgstr "_Inställningar" #: src/wndmain.glade:322 msgid "Disable _Triggers" msgstr "" #: src/wndmain.glade:331 msgid "Disable _Aliases" msgstr "Inaktivera _alias" #: src/wndmain.glade:340 msgid "Disable _Macros" msgstr "Inaktivera _makrotar" #: src/wndmain.glade:349 msgid "Disable T_imers" msgstr "Inaktivera t_idur" #: src/wndmain.glade:363 msgid "_Debug Matches" msgstr "" #: src/wndmain.glade:390 msgid "Edit Default _World..." msgstr "Redigera standard_värld..." #: src/wndmain.glade:402 msgid "_Display" msgstr "_Skärm" #: src/wndmain.glade:411 #, fuzzy msgid "_Split Window" msgstr "Huvudfönster" #: src/wndmain.glade:424 msgid "_Help" msgstr "_Hjälp" #: src/wndmain.glade:430 msgid "_Manual" msgstr "_Handbok" #: src/wndmain.glade:447 msgid "_About" msgstr "_Om" #: src/dlgSelectWorld.glade:7 msgid "Connect to" msgstr "Anslut till" #: src/dlgSelectWorld.glade:19 msgid "_Select a saved world:" msgstr "_Markera en sparad värld:" #: src/dlgSelectWorld.glade:116 msgid "Or connect d_irectly:" msgstr "Eller anslut d_irekt:" #: src/dlgSelectWorld.glade:141 src/dlgEditWorld.glade:107 msgid "_Host:" msgstr "_Värd:" #: src/dlgSelectWorld.glade:154 src/dlgEditWorld.glade:124 msgid "_Port:" msgstr "_Port:" #: src/dlgPreferences.glade:6 msgid "Preferences" msgstr "Inställningar" #: src/dlgPreferences.glade:33 msgid "Colors used by KildClient" msgstr "Färger som används av KildClient" #: src/dlgPreferences.glade:65 msgid "_Informative messages:" msgstr "_Informativa meddelanden:" #: src/dlgPreferences.glade:77 src/dlgPreferences.glade:117 msgid "" "Black\n" "Red\n" "Green\n" "Yellow\n" "Blue\n" "Magenta\n" "Cyan\n" "White\n" "Default\n" "Black (bold)\n" "Red (bold)\n" "Green (bold)\n" "Yellow (bold)\n" "Blue (bold)\n" "Magenta (bold)\n" "Cyan (bold)\n" "White (bold)\n" "Default (bold)\n" msgstr "" #: src/dlgPreferences.glade:105 msgid "_Command echo:" msgstr "" #: src/dlgPreferences.glade:168 msgid "Window configuration" msgstr "Fönsterkonfiguration" #: src/dlgPreferences.glade:200 msgid "_Tab position:" msgstr "_Flikposition" #: src/dlgPreferences.glade:212 msgid "" "Left\n" "Right\n" "Top\n" "Bottom" msgstr "" "Vänster\n" "Höger\n" "Överkant\n" "Nederkant" #: src/dlgPreferences.glade:226 msgid "_Hide tabs if only one world is open" msgstr "_Dölj flikar om bara en värld är öppen" #: src/dlgPreferences.glade:231 msgid "" "If this is checked, when there is only one open world no tabs will be shown" msgstr "" "Om detta markeras kommer inga flikar att visas om det bara finns en öppen " "värld" #: src/dlgPreferences.glade:242 msgid "_Flash window when new text is received" msgstr "_LÃ¥t fönstret blinka när ny text mottages" #: src/dlgPreferences.glade:280 msgid "Appearance" msgstr "Utseende" #: src/dlgPreferences.glade:302 msgid "Sending Delays" msgstr "Sändningsfördröjningar" #: src/dlgPreferences.glade:334 msgid "Enter the default parameters for sending multiple lines or commands:" msgstr "" "Skriv in standardparametrarna för sändning av flera rader eller kommandon:" #: src/dlgPreferences.glade:349 msgid "_Number of lines/commands to send at once:" msgstr "_Antal rader/kommandon som ska skickas pÃ¥ en gÃ¥ng:" #: src/dlgPreferences.glade:386 msgid "_Delay between each group of lines/commands:" msgstr "_Fördröjning mellan varje grupp av rader/kommandon:" #: src/dlgPreferences.glade:442 msgid "Sending" msgstr "Skickar" #: src/dlgPreferences.glade:465 msgid "Web Browser" msgstr "Webbläsare" #: src/dlgPreferences.glade:498 msgid "Specify the command used to launch a web browser" msgstr "Ange kommandot som ska användas för att starta en webbläsare" #: src/dlgPreferences.glade:512 msgid "" "Enter the command to run a web browser. %s will be substituted by the web " "page address." msgstr "" "Skriv in kommandot som ska användas för att köra en webbläsare. %s kommer " "att ersättas av webbsideadressen." #: src/dlgPreferences.glade:548 msgid "Audio Player" msgstr "Ljuduppspelare" #: src/dlgPreferences.glade:581 msgid "Specify the command used to play sound files." msgstr "Ange kommandot som ska användas för att spela upp ljudfiler." #: src/dlgPreferences.glade:595 msgid "" "Enter the command to run an audio player program. %s will be substituted by " "the file path." msgstr "" "Skriv in kommandot som ska användas för att köra ett ljuduppspelarprogram. " "%s kommer att ersättas av sökvägen för fil." #: src/dlgPreferences.glade:627 msgid "External Programs" msgstr "Externa program" #: src/dlgPreferences.glade:651 src/dlgEditWorld.glade:245 msgid "Proxy" msgstr "Proxy" #: src/dlgPreferences.glade:686 src/dlgEditWorld.glade:280 msgid "Proxy _type:" msgstr "Proxy_typ:" #: src/dlgPreferences.glade:698 src/dlgEditWorld.glade:292 msgid "" "Use global settings\n" "No proxy\n" "SOCKS4\n" "SOCKS5" msgstr "" "Använd allmänna inställningar\n" "Ingen proxy\n" "SOCKS4\n" "SOCKS5" #: src/dlgPreferences.glade:775 src/dlgEditWorld.glade:368 msgid "Pass_word:" msgstr "Lösen_ord:" #: src/dlgPreferences.glade:791 src/dlgEditWorld.glade:384 msgid "Server _port:" msgstr "Server_port:" #: src/dlgPreferences.glade:805 src/dlgEditWorld.glade:398 msgid "_Username:" msgstr "_Användarnamn:" #: src/dlgPreferences.glade:819 src/dlgEditWorld.glade:412 msgid "Server _address:" msgstr "Server_adress:" #: src/dlgPreferences.glade:857 msgid "Proxy" msgstr "Proxy" #: src/dlgStatistics.glade:7 msgid "Statistics" msgstr "Statistik" #: src/dlgStatistics.glade:25 src/dlgStatistics.glade:40 #: src/dlgStatistics.glade:210 src/dlgStatistics.glade:361 #: src/dlgStatistics.glade:495 src/dlgStatistics.glade:510 #: src/dlgStatistics.glade:525 src/dlgStatistics.glade:540 #: src/dlgStatistics.glade:555 src/dlgStatistics.glade:583 #: src/dlgStatistics.glade:624 src/dlgStatistics.glade:639 #: src/dlgStatistics.glade:667 src/dlgStatistics.glade:708 #: src/dlgStatistics.glade:723 msgid "N/A" msgstr "Inte tillgängligt" #: src/dlgStatistics.glade:55 msgid "Proxy port:" msgstr "Proxyport:" #: src/dlgStatistics.glade:68 msgid "Proxy host:" msgstr "Proxyvärd:" #: src/dlgStatistics.glade:96 msgid "Proxy type:" msgstr "Proxytyp:" #: src/dlgStatistics.glade:109 msgid "World name:" msgstr "Namn pÃ¥ värld:" #: src/dlgStatistics.glade:120 msgid "Host:" msgstr "Värd:" #: src/dlgStatistics.glade:133 msgid "Port:" msgstr "Port:" #: src/dlgStatistics.glade:146 msgid "Connection time:" msgstr "Anslutningstid:" #: src/dlgStatistics.glade:159 msgid "Idle time:" msgstr "Passiv tid:" #: src/dlgStatistics.glade:184 msgid "Compression used:" msgstr "Använd komprimering:" #: src/dlgStatistics.glade:197 msgid "Bytes received (compressed):" msgstr "Antal mottagna byte (komprimerade):" #: src/dlgStatistics.glade:225 msgid "Bytes received (decompressed):" msgstr "Antal mottagna byte (okomprimerade):" #: src/dlgStatistics.glade:238 msgid "Compression ratio:" msgstr "KomprimeringsförhÃ¥llande:" #: src/dlgStatistics.glade:251 msgid "Lines received:" msgstr "Antal mottagna rader:" #: src/dlgStatistics.glade:402 msgid "Key exchange:" msgstr "" #: src/dlgStatistics.glade:415 msgid "SSL protocol used:" msgstr "SSL-protokoll använt:" #: src/dlgStatistics.glade:428 msgid "Compression algorithm:" msgstr "Komprimeringsalgoritm:" #: src/dlgStatistics.glade:441 msgid "Certificate type:" msgstr "" #: src/dlgStatistics.glade:454 msgid "Cipher:" msgstr "" #: src/dlgStatistics.glade:467 msgid "MAC:" msgstr "MAC:" #: src/dlgStatistics.glade:480 msgid "SSL not supported in this version" msgstr "SSL stöds inte i denna version" #: src/dlgStatistics.glade:570 msgid "Hostname:" msgstr "Värdnamn:" #: src/dlgStatistics.glade:598 msgid "Valid since:" msgstr "Giltigt sedan:" #: src/dlgStatistics.glade:611 msgid "Expiration:" msgstr "Utlöper:" #: src/dlgStatistics.glade:654 msgid "Fingerprint:" msgstr "Fingeravtryck:" #: src/dlgStatistics.glade:682 msgid "Subject's DN:" msgstr "" #: src/dlgStatistics.glade:695 msgid "Issuer's DN:" msgstr "" #: src/dlgAbout.glade:12 msgid "A mud client with powerful features and support for Perl Scripting" msgstr "En mudklient med kraftfulla funktioner och stöd för Perlskriptning" #: src/dlgAbout.glade:14 msgid "Visit http://kildclient.sf.net" msgstr "Besök http://kildclient.sf.net" #: src/dlgAbout.glade:15 msgid "" "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." msgstr "" "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." #: src/dlgEditWorld.glade:7 msgid "Edit World" msgstr "Redigera värld" #: src/dlgEditWorld.glade:60 msgid "Connection" msgstr "Anslutning" #: src/dlgEditWorld.glade:141 msgid "Enter a descriptive name for the World" msgstr "Skriv in ett beskrivande namn för Världen" #: src/dlgEditWorld.glade:159 msgid "Enter the host to connect to" msgstr "Skriv in värden att ansluta till" #: src/dlgEditWorld.glade:179 msgid "Enter the port used when connecting" msgstr "Skriv in porten som ska användas vid anslutning" #: src/dlgEditWorld.glade:197 msgid "Use _SSL" msgstr "Använd _SSL" #: src/dlgEditWorld.glade:452 msgid "Auto-login" msgstr "Automatisk inloggning" #: src/dlgEditWorld.glade:488 msgid "Connection _Style:" msgstr "Anslutnings_stil:" #: src/dlgEditWorld.glade:501 msgid "" "No auto-login\n" "diku (char, pass)\n" "lp (CONNECT char pass)" msgstr "" "Ingen automatisk inloggning\n" "diku (char, pass)\n" "lp (CONNECT char pass)" #: src/dlgEditWorld.glade:519 msgid "Ch_aracters in this mud:" msgstr "Ka_raktärer i denna mud:" #: src/dlgEditWorld.glade:680 src/dlgEditWorld.glade:2009 #: src/dlgEditWorld.glade:2852 msgid "Font" msgstr "Typsnitt" #: src/dlgEditWorld.glade:713 msgid "Select the font used in the _main screen:" msgstr "Markera typsnittet som ska användas i huvud_fönstret:" #: src/dlgEditWorld.glade:729 msgid "Select the font used in the main output screen" msgstr "Markera typsnittet som ska användas i huvudskärmen för utmatning" #: src/dlgEditWorld.glade:740 msgid "Use _bold font for highlighted colors (instead of just highlighting)" msgstr "" "Använd _fet typsnitt för markerade färger (istället för bara färgmarkering)" #: src/dlgEditWorld.glade:745 msgid "" "Check if you want the highlighted ANSI colors to be displayed in bold also" msgstr "" "Markera om du vill att de färgmarkerade ANSI-färgerna även ska visas i " "fetstil" #: src/dlgEditWorld.glade:782 msgid "Word Wrap" msgstr "Radbrytning" #: src/dlgEditWorld.glade:812 msgid "_Wrap lines at word boundaries" msgstr "" #: src/dlgEditWorld.glade:817 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "" #: src/dlgEditWorld.glade:836 msgid "_Indent wrapped lines by" msgstr "" #: src/dlgEditWorld.glade:865 msgid "pixels" msgstr "" #: src/dlgEditWorld.glade:883 msgid "Wrap lines at full _screen width" msgstr "" #: src/dlgEditWorld.glade:902 msgid "Maximum line width in _characters:" msgstr "" #: src/dlgEditWorld.glade:964 msgid "Tooltips" msgstr "" #: src/dlgEditWorld.glade:995 msgid "Display _tooltips with the time when the line was received" msgstr "" #: src/dlgEditWorld.glade:1000 msgid "" "Check if you want tooltips to be displayed showing the time when a line was " "received if you leave the mouse over the line for a short while" msgstr "" #: src/dlgEditWorld.glade:1058 msgid "Ansi Colors" msgstr "Ansifärger" #: src/dlgEditWorld.glade:1374 msgid "_Black" msgstr "_Svart" #: src/dlgEditWorld.glade:1391 msgid "R_ed" msgstr "R_öd" #: src/dlgEditWorld.glade:1410 msgid "_Green" msgstr "_Grön" #: src/dlgEditWorld.glade:1429 msgid "_Yellow" msgstr "_Gul" #: src/dlgEditWorld.glade:1448 msgid "B_lue" msgstr "B_lÃ¥" #: src/dlgEditWorld.glade:1467 msgid "_Magenta" msgstr "_Magenta" #: src/dlgEditWorld.glade:1486 msgid "C_yan" msgstr "C_yan" #: src/dlgEditWorld.glade:1505 msgid "_White" msgstr "_Vit" #: src/dlgEditWorld.glade:1524 msgid "Bl_ack (Bold)" msgstr "Sv_art (fet)" #: src/dlgEditWorld.glade:1541 msgid "Re_d (Bold)" msgstr "R_öd (fet)" #: src/dlgEditWorld.glade:1560 msgid "G_reen (Bold)" msgstr "G_rön (fet)" #: src/dlgEditWorld.glade:1579 msgid "Yell_ow (Bold)" msgstr "Gu_l (fet)" #: src/dlgEditWorld.glade:1598 msgid "Bl_ue (Bold)" msgstr "Bl_Ã¥ (fet)" #: src/dlgEditWorld.glade:1617 msgid "Magen_ta (Bold)" msgstr "Magen_ta (fet)" #: src/dlgEditWorld.glade:1636 msgid "Cya_n (Bold)" msgstr "Cya_n (fet)" #: src/dlgEditWorld.glade:1655 msgid "W_hite (Bold)" msgstr "V_it (fet)" #: src/dlgEditWorld.glade:1720 msgid "Default Colors" msgstr "Standardfärger" #: src/dlgEditWorld.glade:1767 msgid "_Foreground" msgstr "_Förgrund" #: src/dlgEditWorld.glade:1801 msgid "Bac_kground" msgstr "Ba_kgrund" #: src/dlgEditWorld.glade:1835 msgid "Bold Foreground" msgstr "Fet förgrund" #: src/dlgEditWorld.glade:1873 msgid "Bold Background" msgstr "Fet bakgrund" #: src/dlgEditWorld.glade:1916 msgid "Revert to default colors" msgstr "Ã…tergÃ¥ till standardfärger" #: src/dlgEditWorld.glade:1947 msgid "Re_vert to default colors" msgstr "Ã…t_erställ till standardfärger" #: src/dlgEditWorld.glade:1952 msgid "Click to revert all colors to their built-in defaults" msgstr "" "Klicka för att lÃ¥ta alla färger Ã¥tergÃ¥ till deras inbyggda standardvärden" #: src/dlgEditWorld.glade:2042 msgid "Select the font used in the _status bar:" msgstr "Markera typsnittet som ska användas i _statusmätaren:" #: src/dlgEditWorld.glade:2058 msgid "Select the font used in the status bar" msgstr "Markera typsnittet som ska användas i statusmätaren" #: src/dlgEditWorld.glade:2093 msgid "Time Display" msgstr "Tidsangivelse" #: src/dlgEditWorld.glade:2125 msgid "C_onnected time:" msgstr "A_nsluten tid:" #: src/dlgEditWorld.glade:2156 src/dlgEditWorld.glade:2256 msgid "Do not display" msgstr "Visa inte" #: src/dlgEditWorld.glade:2161 msgid "Select if you do not want the connection time to be displayed" msgstr "Välj om du vill att anslutningstiden inte ska visas" #: src/dlgEditWorld.glade:2175 src/dlgEditWorld.glade:2275 msgid "Display as hours, minutes and seconds" msgstr "Visa som timmar, minuter och sekunder" #: src/dlgEditWorld.glade:2180 msgid "" "Select if you want the connection time to be displayed in hours, minutes and " "seconds" msgstr "" "Välj om du vill att anslutningstiden ska visas i timmar, minuter och sekunder" #: src/dlgEditWorld.glade:2194 src/dlgEditWorld.glade:2294 msgid "Display as seconds" msgstr "Visa som sekunder" #: src/dlgEditWorld.glade:2199 msgid "Select if you want the connection time to be displayed in seconds" msgstr "Välj om du vill att anslutningstiden ska visas i sekunder" #: src/dlgEditWorld.glade:2226 msgid "_Idle time:" msgstr "_Tid passiv:" #: src/dlgEditWorld.glade:2261 msgid "Select if you do not want the idle time to be displayed" msgstr "Välj om du vill att den passiva tiden inte ska visas" #: src/dlgEditWorld.glade:2280 msgid "" "Select if you want the idle time to be displayed in hours, minutes and " "seconds" msgstr "" "Välj om du vill att den passiva tiden ska visas i timmar, minuter och " "sekunder" #: src/dlgEditWorld.glade:2299 msgid "Select if you want the idle time to be displayed in seconds" msgstr "Välj om du vill att den passiva tiden ska visas i sekunder" #: src/dlgEditWorld.glade:2313 msgid "Only _reset idle time counter when a command is entered directly" msgstr "" "_Ã…terställ räknaren för passiv tid bara när ett kommando skrivs in direkt" #: src/dlgEditWorld.glade:2318 msgid "" "Check to make the idle time counter reset only when a command is entered " "directly by typing it in the command entry box. If not checked, if a command " "is sent because of a timer, of a hook, etc, the idle timer is also reset." msgstr "" #: src/dlgEditWorld.glade:2387 msgid "Command Entry" msgstr "Kommandoinmatning" #: src/dlgEditWorld.glade:2417 msgid "_Keep last typed command in command entry box" msgstr "_BehÃ¥ll senast skrivna kommando i kommandoinmatningsrutan" #: src/dlgEditWorld.glade:2422 msgid "" "Check to have the last command kept in the command entry box, so that you " "can repeat commands only by pressing ENTER" msgstr "" "Markera för att behÃ¥lla det senaste kommandot i kommandoinmatningsrutan, sÃ¥ " "att du kan upprepa kommandon genom att bara trycka RETUR" #: src/dlgEditWorld.glade:2434 msgid "_Echo sent commands in main window" msgstr "" #: src/dlgEditWorld.glade:2439 msgid "Check to have the sent commands echoed in the main output window" msgstr "" #: src/dlgEditWorld.glade:2451 msgid "_Store commands between sessions" msgstr "_Lagra kommandon mellan sessioner" #: src/dlgEditWorld.glade:2456 msgid "Check to have the command history saved in a file between sessions" msgstr "Markera för att spara kommandohistoriken i en fil mellan sessioner" #: src/dlgEditWorld.glade:2468 msgid "Never _hide the typed text" msgstr "Dölj _aldrig den skrivna texten" #: src/dlgEditWorld.glade:2473 msgid "" "Check this if the text you type is displayed as black dots in the input box." msgstr "" "Markera detta om texten du skriver visas som svarta punkter i " "inmatningsrutan." #: src/dlgEditWorld.glade:2489 msgid "_Number of commands to save in history:" msgstr "_Antal kommandon att spara i historiken:" #: src/dlgEditWorld.glade:2503 msgid "Specify the number of commands that are saved and can be later recalled" msgstr "Ange antalet kommandon som ska sparas och som senare kan Ã¥terkallas" #: src/dlgEditWorld.glade:2526 msgid "C_ommand separator:" msgstr "K_ommandoseparator:" #: src/dlgEditWorld.glade:2540 msgid "Specify the separator for commands typed in the command entry box" msgstr "" #: src/dlgEditWorld.glade:2558 msgid "Use single-_line input bar" msgstr "" #: src/dlgEditWorld.glade:2594 msgid "Enable _auto-completion" msgstr "Aktivera _automatisk komplettering" #: src/dlgEditWorld.glade:2599 msgid "Check to enable command auto-completion (based on previous commands)" msgstr "" "Markera för att aktivera automatisk komplettering (baserad pÃ¥ föregÃ¥ende " "kommandon)" #: src/dlgEditWorld.glade:2617 msgid "Acti_vate auto-completion only after" msgstr "A_ktivera bara automatisk komplettering efter att" #: src/dlgEditWorld.glade:2631 msgid "" "Specify the number of characters that must be typed for command completion " "to start" msgstr "" "Ange antalet tecken som mÃ¥ste skrivas in för att kommandokomplettering ska " "startas" #: src/dlgEditWorld.glade:2645 msgid "characters have been entered" msgstr "tecken har skrivits in" #: src/dlgEditWorld.glade:2670 msgid "Use _multi-line input bar" msgstr "" #: src/dlgEditWorld.glade:2711 msgid "N_umber of lines:" msgstr "A_ntal rader:" #: src/dlgEditWorld.glade:2746 msgid "S_pell check typed text" msgstr "S_tavninskontrollera skriven text" #: src/dlgEditWorld.glade:2779 msgid "Language code:" msgstr "SprÃ¥kkod:" #: src/dlgEditWorld.glade:2803 msgid "(Leave blank for default based on locale)" msgstr "(lämna tomt för standard baserad pÃ¥ lokal)" #: src/dlgEditWorld.glade:2885 msgid "Select the font used in the command _entry box:" msgstr "Markera typsnittet som ska användas i kommando_inmatningsrutan:" #: src/dlgEditWorld.glade:2901 msgid "Select the font used in the command entry box" msgstr "Markera typsnittet som ska användas i kommandoinmatningsrutan" #: src/dlgEditWorld.glade:2935 msgid "Flood prevention" msgstr "Förhindra massutskick" #: src/dlgEditWorld.glade:2970 msgid "Do not allow the _same command to be sent" msgstr "TillÃ¥t inte att _samma kommando skickas" #: src/dlgEditWorld.glade:2975 msgid "" "Check to prevent more than a given number of equal commands to be sent in a " "row (which can disconnect your character in some muds)" msgstr "" #: src/dlgEditWorld.glade:2990 msgid "Specify the maximum number of equal commands that can be sent in a row" msgstr "Ange det maximala antalet samma rader som kan skickas i rad" #: src/dlgEditWorld.glade:3004 msgid "_times in a row" msgstr "_gÃ¥nger i rad" #: src/dlgEditWorld.glade:3028 msgid "Se_nd this command:" msgstr "Ski_cka detta kommando:" #: src/dlgEditWorld.glade:3042 msgid "" "Enter a command to be sent whenever the specified maximum number of equal " "commands would be sent" msgstr "" #: src/dlgEditWorld.glade:3104 msgid "Logging Status" msgstr "Loggningstatus" #: src/dlgEditWorld.glade:3152 msgid "St_art" msgstr "Sta_rta" #: src/dlgEditWorld.glade:3195 msgid "_Include the last" msgstr "" #: src/dlgEditWorld.glade:3200 msgid "Select to include lines from the main window in the log file." msgstr "" #: src/dlgEditWorld.glade:3214 #, fuzzy msgid "Inform number of lines to include in the log." msgstr "Skulle denna rad inkluderas i loggfilen?" #: src/dlgEditWorld.glade:3229 #, fuzzy msgid "lines of the scrollback buffer in the log" msgstr "_Rader att spara i rullningsbuffert:" #: src/dlgEditWorld.glade:3268 src/dlgEditWorld.glade:4377 msgid "File" msgstr "Fil" #: src/dlgEditWorld.glade:3348 msgid "" "Note: You can use strftime() escapes to create different files based on the " "date and time that logging starts. Also, %Kw represents the World name and " "%Kc the character name used in auto-logon." msgstr "" #: src/dlgEditWorld.glade:3381 msgid "Options" msgstr "Alternativ" #: src/dlgEditWorld.glade:3411 msgid "A_utomatically start logging when connected" msgstr "S_tarta loggning automatiskt vid anslutning" #: src/dlgEditWorld.glade:3417 msgid "" "If this is selected, logging will be automatically started whenever you " "connect to the world." msgstr "" "Om detta markeras kommer loggning att pÃ¥börjas automatiskt varje gÃ¥ng du " "ansluter till världen." #: src/dlgEditWorld.glade:3427 msgid "Prefix lines with _date and/or time" msgstr "" #: src/dlgEditWorld.glade:3433 msgid "" "Select this if you want to prefix each line in the log file with the date " "and/or time it was received." msgstr "" #: src/dlgEditWorld.glade:3461 msgid "_Format:" msgstr "_Format:" #: src/dlgEditWorld.glade:3474 msgid "" "The default is to prefix lines with the date and time, but you can configure " "the format with strftime() escape sequences. See the manual for a " "description of those." msgstr "" #: src/dlgEditWorld.glade:3483 msgid "Revert to _default" msgstr "Ã…tergÃ¥ till _standard" #: src/dlgEditWorld.glade:3549 msgid "Scripting" msgstr "Skriptning" #: src/dlgEditWorld.glade:3585 msgid "_Perl file to load:" msgstr "_Perlfil att läsa in:" #: src/dlgEditWorld.glade:3608 src/dlgMLSend.glade:80 msgid "_Clear" msgstr "_Töm" #: src/dlgEditWorld.glade:3675 msgid "Plugins Currently Loaded" msgstr "" #: src/dlgEditWorld.glade:3754 msgid "_Load" msgstr "" #: src/dlgEditWorld.glade:3821 msgid "Plugins Loaded on Startup" msgstr "" #: src/dlgEditWorld.glade:3987 msgid "MCCP (for compression)" msgstr "MCCP (för komprimering)" #: src/dlgEditWorld.glade:4017 msgid "_Enable if server proposes after connecting" msgstr "" #: src/dlgEditWorld.glade:4033 msgid "Enable if server proposes at _any time" msgstr "" #: src/dlgEditWorld.glade:4049 msgid "_Disable" msgstr "_Inaktivera" #: src/dlgEditWorld.glade:4110 msgid "Scrolling" msgstr "Rullning" #: src/dlgEditWorld.glade:4141 msgid "Scroll on _output" msgstr "Rulla vid _utmatning" #: src/dlgEditWorld.glade:4146 msgid "" "Check to have the main window scroll to the end whenever new output comes" msgstr "" "Markera för att lÃ¥ta huvudfönstret rulla till slutet varje gÃ¥ng ny utmatning " "mottages" #: src/dlgEditWorld.glade:4161 msgid "_Lines to save in scrollback buffer:" msgstr "_Rader att spara i rullningsbuffert:" #: src/dlgEditWorld.glade:4175 msgid "" "Specify the number of lines of output that can be seen with by scrolling the " "window" msgstr "Ange antalet utmatningsrader som kan ses genom att rulla fönstret" #: src/dlgEditWorld.glade:4217 msgid "Name display" msgstr "Tidsangivelse" #: src/dlgEditWorld.glade:4247 msgid "Identify as 'World name'" msgstr "" #: src/dlgEditWorld.glade:4260 msgid "Identify as 'World name - Character'" msgstr "" #: src/dlgEditWorld.glade:4273 msgid "Identify as 'Character - World name'" msgstr "" #: src/dlgEditWorld.glade:4290 msgid "Custom: " msgstr "" #: src/dlgEditWorld.glade:4323 msgid "" "Use %Kw to represent the World's name, and %Kc to represent the auto-logon " "character name" msgstr "" #: src/dlgEditWorld.glade:4411 msgid "_File:" msgstr "_Fil:" #: src/dlgEditWorld.glade:4442 msgid "" "You can leave this field blank, and a file name will be automatically " "generated. Only edit this field if you know what you are doing." msgstr "" "Du kan lämna detta fält tomt, och ett filnamn kommer att genereras " "automatiskt. Redigera bara detta fält om du vet vad du gör." #: src/dlgEditWorld.glade:4475 msgid "Character Set" msgstr "Teckenkodning" #: src/dlgEditWorld.glade:4504 msgid "Character _set:" msgstr "Tecken_kodning:" #: src/dlgEditWorld.glade:4549 msgid "Graphical Editors" msgstr "Grafiska redigerare" #: src/dlgEditWorld.glade:4579 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "" #: src/dlgEditWorld.glade:4584 src/dlgEditWorld.glade:4675 msgid "" "If not checked, objects such as triggers, aliases, etc. will be deleted " "directly without asking for confirmation when you press the Delete button." msgstr "" #: src/dlgEditWorld.glade:4597 msgid "_Show items defined by plugins" msgstr "" #: src/dlgEditWorld.glade:4602 msgid "" "If checked, triggers, aliases, macros and timers defined in plugins will " "appear in the corresponding World Editor sections." msgstr "" #: src/dlgEditWorld.glade:4640 msgid "TCP Keep Alive" msgstr "" #: src/dlgEditWorld.glade:4670 msgid "Enable TCP _Keep Alive packets" msgstr "" #: src/dlgEditWorld.glade:4689 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "" #: src/dlgEditWorld.glade:4722 msgid "Input" msgstr "Inmatning" #: src/dlgEditWorld.glade:4752 msgid "_Disable up and down arrow keys for history navigation" msgstr "" #: src/dlgEditWorld.glade:4757 msgid "" "If checked, the up and down arrow keys are not used for navigating between " "saved commands. (You'll have to use Alt+up and Alt+down.)" msgstr "" #: src/dlgTestTriggers.glade:24 msgid "Enter _line to be matched against the triggers:" msgstr "" #: src/dlgTestTriggers.glade:41 msgid "" "The text entered here will be matched against triggers as if it were a line " "coming from the MUD" msgstr "" #: src/dlgTestTriggers.glade:51 src/dlgMLSend.glade:321 #: src/dlgCmdHistory.glade:241 msgid "_Send" msgstr "_Skicka" #: src/dlgTestTriggers.glade:56 msgid "Click the run the triggers against the line." msgstr "" #: src/dlgTestTriggers.glade:90 msgid "Number of triggers that matched:" msgstr "" #: src/dlgTestTriggers.glade:119 msgid "Commands that would be sent:" msgstr "Kommandon som skulle bli skickade:" #: src/dlgTestTriggers.glade:151 msgid "This is what would be printed in the main screen:" msgstr "Detta är vad som skulle skrivas ut i huvudfönstret:" #: src/dlgTestTriggers.glade:163 msgid "" "This is what would be printed in the main screen. If empty, the line has " "been gaged. It can be different from the original line because of rewriter " "triggers." msgstr "" #: src/dlgTestTriggers.glade:180 msgid "Would this line be included in the log file?" msgstr "Skulle denna rad inkluderas i loggfilen?" #: src/dlgMLSend.glade:7 msgid "Multi-line send" msgstr "" #: src/dlgMLSend.glade:20 msgid "Send this text _initially:" msgstr "Skicka _först denna text:" #: src/dlgMLSend.glade:42 src/dlgMLSend.glade:127 msgid "Enter some text to be sent to the World" msgstr "Skriv in lite text som ska skickas till Världen" #: src/dlgMLSend.glade:55 msgid "Then send the _contents of this file:" msgstr "Skicka sedan _innehÃ¥llet i denna fil:" #: src/dlgMLSend.glade:105 msgid "_Finally, send this text:" msgstr "Skicka _till sist denna text:" #: src/dlgMLSend.glade:150 msgid "Add this to the _beginning of each line:" msgstr "Lägg till detta till _början av varje rad:" #: src/dlgMLSend.glade:165 msgid "Specify some text to be prepended to each sent line" msgstr "" #: src/dlgMLSend.glade:179 msgid "Add this to the _end of each line:" msgstr "Lägg till detta till _slutet av varje rad:" #: src/dlgMLSend.glade:194 msgid "Specify some text to be appended to each sent line" msgstr "" #: src/dlgMLSend.glade:210 msgid "_Delay" msgstr "_Fördröj" #: src/dlgMLSend.glade:224 msgid "Specify the delay between sending the group of lines" msgstr "" #: src/dlgMLSend.glade:239 msgid "seconds e_ach" msgstr "sekunder v_ar" #: src/dlgMLSend.glade:253 msgid "Specify how many lines are sent at once" msgstr "Ange hur mÃ¥nga rader som ska skickas pÃ¥ en gÃ¥ng" #: src/dlgMLSend.glade:267 msgid "line(s)" msgstr ":a/e rad" #: src/dlgMLSend.glade:285 msgid "_Keep dialog open after sending" msgstr "_BehÃ¥ll dialogrutan öppen efter sändning" #: src/dlgCmdHistory.glade:7 msgid "Command History" msgstr "Kommandohistoria" #: src/dlgCmdHistory.glade:51 msgid "Find a command containing a given search term" msgstr "Sök ett kommando innehÃ¥llandes en given sökterm" #: src/dlgCmdHistory.glade:63 msgid "Find _next" msgstr "Sök _nästa" #: src/dlgCmdHistory.glade:69 msgid "Find the next command with the same match text" msgstr "" #: src/dlgCmdHistory.glade:107 msgid "Dela_y" msgstr "Fördrö_j" #: src/dlgCmdHistory.glade:120 msgid "Specify the delay between sending the group of commands" msgstr "" #: src/dlgCmdHistory.glade:135 msgid "sec_onds each" msgstr "sek_under var" #: src/dlgCmdHistory.glade:149 msgid "Specify how many commands are sent at once" msgstr "Ange hur mÃ¥nga kommandon som ska skickas pÃ¥ en gÃ¥ng" #: src/dlgCmdHistory.glade:163 msgid "commands(s)" msgstr "kommando(n)" #: src/dlgCmdHistory.glade:184 msgid "Newest commands are on the top" msgstr "" #: src/dlgCmdHistory.glade:205 msgid "_Recall" msgstr "_Ã…terkalla" #: src/dlgCmdHistory.glade:211 msgid "Put the selected command in the command entry box" msgstr "Placera det valda kommandot i kommandoinmatningsrutan" #: src/dlgCmdHistory.glade:223 msgid "Rec_all & Close" msgstr "Ã…ter_kalla & stäng" #: src/dlgCmdHistory.glade:229 msgid "Put the selected command in the command entry box and close this dialog" msgstr "" "Placera det valda kommandot i kommandoinmatningsrutan och stäng denna " "dialogruta" #: src/dlgCmdHistory.glade:247 msgid "Send the selected command(s) to the mud" msgstr "Skicka det(de) valda kommandot(na) till muden " #: src/dlgCmdHistory.glade:259 msgid "S_end & Close" msgstr "S_kicka och stäng" #: src/dlgCmdHistory.glade:265 msgid "Send the selected command(s) to the mud and close the dialog" msgstr "Skicka det(de) valda kommandot(na) till muden och stäng fönstret" #: src/dlgCmdHistory.glade:305 msgid "Find Command" msgstr "Sök kommando" #: src/dlgCmdHistory.glade:321 msgid "_Text to find:" msgstr "_Text att söka efter:" #: src/dlgCmdHistory.glade:334 msgid "Enter the text to search for" msgstr "Skriv in texten att söka efter" #: src/dlgCmdHistory.glade:353 msgid "Search direction:" msgstr "Sökväg:" #: src/dlgCmdHistory.glade:367 msgid "_Downwards" msgstr "_NedÃ¥t" #: src/dlgCmdHistory.glade:383 msgid "_Upwards" msgstr "_UppÃ¥t" #: src/mnuPopupURL.glade:8 msgid "Open Link" msgstr "Öppna länk" #: src/mnuPopupURL.glade:23 msgid "Copy Link Address" msgstr "Kopiera länkadress" #: share/kildclient.pl:76 share/kildclient.pl:97 share/kildclient.pl:117 #: share/kildclient.pl:182 share/kildclient.pl:433 share/kildclient.pl:511 #: share/kildclient.pl:589 share/kildclient.pl:602 share/kildclient.pl:615 #: share/kildclient.pl:628 share/kildclient.pl:641 share/kildclient.pl:654 #: share/kildclient.pl:667 share/kildclient.pl:680 share/kildclient.pl:694 #: share/kildclient.pl:708 share/kildclient.pl:718 share/kildclient.pl:730 #: share/kildclient.pl:742 share/kildclient.pl:754 share/kildclient.pl:767 #: share/kildclient.pl:983 share/kildclient.pl:1016 #, perl-format msgid "%s: Too few arguments." msgstr "%s: För fÃ¥ argument." #: share/kildclient.pl:207 share/kildclient.pl:567 #, perl-format msgid "No such %s" msgstr "Inget sÃ¥dant %s" #: share/kildclient.pl:298 share/kildclient.pl:316 share/kildclient.pl:334 #: share/kildclient.pl:352 share/kildclient.pl:370 #, perl-format msgid "%s: Wrong number of arguments." msgstr "%s: Fel antal argument." #: share/kildclient.pl:403 share/kildclient.pl:411 share/kildclient.pl:489 #: share/kildclient.pl:497 #, perl-format msgid "No such %s." msgstr "Inget sÃ¥dant %s." #: share/kildclient.pl:425 #, perl-format msgid "No %s deleted." msgstr "Ingen %s borttagen." #: share/kildclient.pl:427 #, perl-format msgid "One %s deleted." msgstr "En %s borttagen." #: share/kildclient.pl:429 #, perl-format msgid "%d %s deleted." msgstr "%d %s borttagen." #: share/kildclient.pl:506 #, perl-format msgid "Successfully moved %s." msgstr "Flyttade framgÃ¥ngsrikt %s." #: share/kildclient.pl:798 msgid "Could not open file." msgstr "Kunde inte öppna fil." #: share/kildclient.pl:828 msgid "Unknown" msgstr "Okänd" #: share/kildclient.pl:835 msgid "Invalid plugin file." msgstr "Ogiltig fil för insticksmodul." #: share/kildclient.pl:866 msgid "Plugin already loaded. Try enabling it." msgstr "Insticksmodul redan inläst. Försök aktivera den." #: share/kildclient.pl:868 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "Version %s av denna insticksmodul är redan inläst." #: share/kildclient.pl:878 #, perl-format msgid "Error in plugin file: %s" msgstr "Fel i filen för insticksmodul: %s" #: share/kildclient.pl:890 msgid "Cannot load a plugin in another world." msgstr "Kan inte läsa in insticksmodul i en annan värld." #: share/kildclient.pl:895 share/kildclient.pl:915 msgid "Plugin not specified" msgstr "Insticksmodulen är inte angiven" #: share/kildclient.pl:902 share/kildclient.pl:933 msgid "Plugin not loaded." msgstr "Insticksmodul inte inläst." #: share/kildclient.pl:905 #, perl-format msgid "Plugin '%s' loaded." msgstr "Insticksmodul '%s' inläst." #: share/kildclient.pl:921 #, perl-format msgid "Could not load plugin %s" msgstr "Kunde inte läsa in insticksmodul %s" #: share/kildclient.pl:997 msgid "Plugin enabled." msgstr "Insticksmodul aktiverad." #: share/kildclient.pl:1030 msgid "Plugin disabled." msgstr "Insticksmodul inaktiverad." #: share/kildclient.pl:1150 msgid "Cannot open help file." msgstr "Kan inte öppna hjälpfil." #: share/kildclient.pl:1168 msgid "Help topic not found." msgstr "Hjälprubrik hittades inte." #: share/kildclient.pl:1174 msgid "" "Warning: the getwindowsize() function is deprecated and will be removed." msgstr "Varning: funktionen getwindowsize() avrÃ¥des och kommer att tas bort." #: share/kildclient.pl:1175 msgid "Use $window->getsize() instead." msgstr "Använd $windows->getsize() istället." #: share/kildclient.pl:1180 msgid "Warning: the minimize() function is deprecated and will be removed." msgstr "Varning: funktionen minimize() avrÃ¥des och kommer att tas bort." #: share/kildclient.pl:1181 msgid "Use $window->minimize() instead." msgstr "Använd $windows->minimize() istället." #: share/kildclient.pl:1186 msgid "Warning: the path() function is deprecated and will be removed." msgstr "Varning: funktionen path() avrÃ¥des och kommer att tas bort." #: share/kildclient.pl:1187 msgid "Use $world->path() instead." msgstr "Använd $world->path() istället." #~ msgid "Unknown element '%s'" #~ msgstr "Okänt element '%s'" #~ msgid "C_onnect" #~ msgstr "A_nslut" #~ msgid "Could not find a world named '%s'\n" #~ msgstr "Kunde inte hitta en värld med namnet '%s'\n" #~ msgid "Do not change" #~ msgstr "Ändra inte" #~ msgid "Black" #~ msgstr "Svart" #~ msgid "Red" #~ msgstr "Röd" #~ msgid "Green" #~ msgstr "Grön" #~ msgid "Yellow" #~ msgstr "Gul" #~ msgid "Blue" #~ msgstr "BlÃ¥" #~ msgid "Magenta" #~ msgstr "Magenta" #~ msgid "Cyan" #~ msgstr "Cyan" #~ msgid "White" #~ msgstr "Vit" #~ msgid "Default" #~ msgstr "Standard" #~ msgid "%s (Bold)" #~ msgstr "%s (Fet)" #~ msgid "Enable _word wrapping" #~ msgstr "Aktivera _radbrytning" kildclient-2.11.1/po/de.gmo0000644000175000017500000016763411570463465012405 00000000000000Þ•šì‹¼)è7~é7 h8v8…8Ž8§8Ã8Û8ø8 9L97l9¤9º9Ñ9"ï9":5:M:l:5ˆ:5¾:&ô:;5;(R;{;;¥;¸;6Ô;' <63<'j<;’<Î<)ê<== #=-=>=Q=c= x=™=®=À= Ö=â= ú=> >,>B>`> t>>> °> Ñ>Þ>þ>? ?6?J?]?y?BŠ?+Í?$ù?@(%@"N@q@ z@‡@‚—@A#"A FA*QA0|A6­AäA ëAöA üA B B­#BÑBáBñBC -C;C OC]CnC&tC›C²CÄC ÝC êCôC8DJ=DLˆDDÕDBEt]EIÒE@FB]FD F?åF:%Gß`G<@H=}HG»H<IB@I-ƒIW±I‚ JŒJ,”J&ÁJ1èJ5KPKWKgK{KŽK«KÂKÕKçK øKLL0L;DL"€LQ£L8õLC.M8rM«M¾MÏM(áM/ N#:N^N"zNN¼N'ÕN ýNO6;OrO‡OŸO$¸OÝOüO'PBPHPOP XPePiPpP wP,ƒP°PÀPÑPáP óPQQ%:Q`Q{Q%ƒQ©Q)¼Q»æQ¢R ·RØR çRõR#S$(S2MS2€S ³S9¾SNøS$GTlT tTTšT ±T »T ÆT ÑT ÞT,éTU&.UUU/]U`U&îU1V0GV1xV1ªV3ÜV'W8W6WW8ŽW1ÇW2ùW.,X2[XWŽXZæXDAY†Y{£Y1Z1QZ#ƒZ%§ZÍZêZÿZ [$9[ ^[k[ r[~[…[—[œ[·[¼[ Õ[ â[ í[ ø[ \ \-\.I\ x\ …\“\—\Ÿ\§\C½\u] w]…]”]F£]ê]ð]^ ^^$^$>^c^ |^{‡^’_K–_]â_@`-G`u`4{`°`¹`'Ð`1ø`*a@aRa2ga ša §a ±a¼aËa ÏaÝaîabb,b=bLbbb rb~b†b›b¯bÀbÔbéb îbûbL cXc_c oc{c Šc˜c¸cÈcÌcÞcãcþcd d+/d6[d’d §d ²d ¾d Ìd Ùdçd ödeee "e0e ?eIeÁQe f4f’Q’d’‚’2•’È’Þ’ð’ ““*“ 9“G“V“m“Œ“¡“±“Á“)Ù“ ”#”4”C”S”n””””°”>Å”E•+J•v•%}•#£• Ǖѕä•öõ•ì–'ó–—,,—>Y—E˜—Þ—ä—ô— ú—˜ ˜¯$˜Ô˜ç˜û˜!™ =™K™g™v™ˆ™-Ž™¼™Ü™ñ™ š š #š1šgNšA¶šdøšE]›Ž£›^2œF‘œOØœ^(N‡LÖÓ#žN÷žUFŸKœŸIèŸM2 ;€ b¼ ¬¡Ì¡0Õ¡*¢B1¢Bt¢·¢¾¢΢â¢#ù¢£6£H£`£ z£†£ ¡£#£;æ£!"¤VD¤;›¤Dפ:¥W¥l¥}¥*’¥2½¥)ð¥¦&9¦%`¦†¦#¡¦%Ŧ!ë¦C §Q§k§"ˆ§(«§!Ô§%ö§C¨`¨g¨p¨ „¨ ‘¨ ¨«¨ ´¨CÁ¨©©/©D©Z©!n©%©-¶©ä©ª# ª0ªEª½]ª«#1«U«e«t«'ƒ«"««>ΫC ¬ Q¬J_¬Tª¬#ÿ¬ #­0­"A­#d­ˆ­˜­©­º­Í­:Ý­*®6C® z®4„®ƒ¹®0=¯@n¯>¯¯?î¯@.°Bo°5²°5è°N±]m±T˱T ²Au²D·²sü²\p³Eͳ4´}H´CÆ´G µ+Rµ*~µ/©µÙµùµ1¶"J¶m¶ …¶ ¶ 𶦶¸¶"¾¶á¶ç¶ ·· · -·:· K·2Y·-Œ·º· É·×· Û· é·ó·?¸kN¸º¸ʸÚ¸Qî¸@¹F¹X¹ `¹j¹)r¹)œ¹ƹä¹–÷¹„ŽºU»wi» á»2í» ¼X(¼¼м/¥¼8Õ¼!½0½L½6e½œ½«½ ĽÒ½ å½ð½¾¾2¾E¾Z¾l¾{¾“¾ ¦¾³¾&þ(꾿-¿H¿e¿j¿~¿X¿è¿ï¿ ÿ¿ À -À';ÀcÀuÀyÀŒÀ8‘ÀÊÀæÀëÀKþÀ[JÁ¦ÁÆÁØÁëÁÿÁÂ=Â[Ây ŽÂ™ÂŸÂ¯ÂÀÂÏÂ!ßÂ*Ä,Ä<Ä-[ĉÄG›ÄJãÄ .Å;Å7NÅ †Å‘ÅšÅ!¡ÅÃÅØÅíÅÆÆ;ÆYÆmÆÆ™Æp°Æ!Ç)Ç /Ç0=Ç8nÇa§Ç? ÈIÈ RÈ^È2oÈ ¢È ¯È!»ÈÝÈ4óÈQ(ÉzÉ É!‹É(­ÉÖÉëÉ ÊÊ5ÊUÊqÊzÊ-˜ÊÆÊáÊ!öÊË(Ë"0ËSË iËCwË?»ËXûËCTÌZ˜ÌEóÌ9Í-TÍ,‚Í<¯Í"ìÍ)Î19ÎRkÎC¾Î,ÏH/ÏxϓϚÏ3¸ÏìÏ ûÏGÐ1OÐaÐ1ãÐ1ÑGGÑHÑHØÑ(!ÒOJÒcšÒ9þÒu8Ó9®Ó[èÓFDÔ‹Ô ’Ô žÔªÔ ¯ÔºÔÃÔÞÔ íÔ÷ÔÈÕ)ÏÕùÕÖk2Ö žÖ«Ö$ÄÖ?éÖ;)×Âe×/(ØwXØÐØUêÙ@ÚTÚeÚõÚûÚÛ‘*Û¼ÜÄÜ(äÜ% Ý.3Ý bÝ6lÝ£Ý)²Ý-ÜÝ. Þ)9ÞScÞ·ÞI×Þ$!ßHFß$ß>´ß óß à à*à%>à dàcràEÖàEáAbá ¤á®á*¾áAéá +â8â{;â(·âaàâ!Bã%dãŠã$ªã!Ïã$ñãÉä àäêäñäúäA å KåYåbåqå €å.Žå ½åËåßå)èå æ@æ ]æiæBxæ»æ ÂæÍæ Õæöæ8ÿæ 8ç EçSç\çcç1jçœç¥ç7¹ç ñçþçè1è :èEèNè(iè/’è.Âèñè5ùè/é6é ?éIéaéé ˆéB’éDÕé ê%ê&.êUê\ê kêvê†ê˜ê©ê»êØê$àê4ë:ë LëXëGgë¯ëÂëÖë çëòëììì,ì2ì"Oìrì+xì.¤ìÓì Úìäì0øì )í#3í.Wí†í™íží¾íÄíáíêíî# î.î5î7îQî[Vî@²î(óîï+ï4ïCï$Iïnïtï|ï„ï—ï™ïP—Ñ\’f-²ëÈ×]˜|ï^ЈœV¿G”š‚eÁEµzû¶»HA š}§Z›ccèI@胠ý98£Ñb˜Á’Îwõ±2bn|[Æ `‰Œš,"“ü%ìÖŒCæ(T¥3¿¸ù*.#䫯Aú­ofK`¤¨þjù?Ê<>7|TjÕ˜â{çº2÷[`;+Ž€ªÿŸÔ=.7¾WU1fí¹×cÂB«^ŽÇGB™(ƒôÂDUam»5³N#†iV+QC¨vï\z O –Är™+Jž­öAm D¢I à&Ÿ5E…œ®Š © €þå8Ô&·¯!ûö? ÷Zp]‘R—ÝM¬¦y;…SÌoàYt<ð JxYÏ96ºóRq–@{ã a™L_Þ”[sKE=Sß”Šu•òól *ZÜÿÛX°³yß!M"~È—“r@ݪÖiÊç‹M‘ uXáxF…‰€í·'YO½$xÉ›^T´ÐÎeL0!´ÉÕ•I–kÍÍ /®5s¥r:38Sk¼ÓWñhzHhpyê À*O¦6'‚¤•7WX¼ÅaB4dV#Ò)„(¢‹Q_‡j‡©î°<Dý†NQ&ì øëÆê%Äå-tÃá"p_ˆl>æ:Ø/v¸}¶/i9qð¹RÓ':é±,Úk‡Üˆò4Ù¾ü\%ÌØé~µlm-údã¡P„‚nÅÇ ÏÀ,²âÛ£ôoh?6gn>ägËebPg‹2N=Ùv‰$’4q)0¬HuJUG)½ŽK10d¡sŒ„. F$ÞÒ†øw~;{FõCt ŠîÃL]3§“}ËñÚ‘ƒ1wž Target: %d Foreground: %d Background: %d Italics: %d Striked-thru: %d Underline: %d SSL enabled.%d %s deleted.%d lines%s is already permanent.%s: %s is already permanent%s: %s is not permanent%s: Argument must be numeric%s: Invalid key code%s: No such world%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent%s: This is an internal function, do not call directly.%s: Too few arguments%s: Too few arguments.%s: Too many string arguments%s: Variable '%s' made permanent. %s: Variable '%s' made temporary. %s: Wrong argument type%s: Wrong number of arguments.%s: Wrong type of reference%s: action given twice, using the named attribute one%s: action not specified, and isn't gag, not creating%s: action not specified, not creating%s: count must be numeric%s: interval must be numeric%s: interval not specified, not creating%s: invalid bg color%s: invalid fg color%s: invalid target%s: invalid underline style%s: keycode given twice, using the named attribute one%s: keycode not specified, not creating%s: pattern given twice, using the named attribute one%s: pattern not specified, not creating%s: substitution given twice, using the named attribute one(-1 to repeat indefinitely)(Leave blank for default based on locale)0 lines1 line: Expired: Not yet activeAnsi ColorsAuto-loginCharacter SetColors used by KildClientCommand EntryConnectionDefault ColorsFileFlood preventionFontGraphical EditorsInputLogging StatusMCCP (for compression)Name displayNote:OptionsPlugins Currently LoadedPlugins Loaded on StartupProxyRevert to default colorsScriptingScrollingSending DelaysTime DisplayWeb BrowserWindow configurationWord WrapA mud client with powerful features and support for Perl ScriptingA_utomatically start logging when connectedActi_vate auto-completion only afterActionAdd this to the _beginning of each line:Add this to the _end of each line:AdvancedAlias added.Alias modified.Alias number %d Name: %s Pattern: %s Substitution: %s Ignore case: %s Eval as Perl: %s Enabled: %s AliasesAlways load this plugin at _startupAppearanceAre you sure you want to close this world?Attempting to connect to host %s (%s) port %s...Attempting to connect to proxy host %s (%s) port %s...AuthorAutomationB_lueBac_kgroundBl_ack (Bold)Bl_ue (Bold)Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) Bold BackgroundBold ForegroundBytes received (compressed):Bytes received (decompressed):C_hange styleC_ommand separator:C_onfigure...C_onnected time:C_yanCannot load a plugin in another world.Cannot open help file.Certificate type:Ch_aracters in this mud:Change StyleCharacterCharacter _set:Check if you want lines to be wrapped at word boundariesCheck if you want the highlighted ANSI colors to be displayed in bold alsoCheck this if the text you type is displayed as black dots in the input box.Check to enable command auto-completion (based on previous commands)Check to have the command history saved in a file between sessionsCheck to have the last command kept in the command entry box, so that you can repeat commands only by pressing ENTERCheck to have the main window scroll to the end whenever new output comesCheck to have the sent commands echoed in the main output windowCheck to have the substitution be executed in a s///e constructionCheck to have the timer deleted after its repeat count has reached 0Check to make the alias enabled; only enabled aliases are triedCheck to make the hook enabled; only enabled hooks are runCheck to make the idle time counter reset only when a command is entered directly by typing it in the command entry box. If not checked, if a command is sent because of a timer, of a hook, etc, the idle timer is also reset.Check to make the macro enabled; only enabled macros are runCheck to make the matched line not be printed in the log fileCheck to make the matched line not be printed in the main output windowCheck to make the timer enabled; only enabled timers are runCheck to make the trigger enabled; only enabled triggers are triedCheck to make this trigger a rewriter triggerCheck to make this trigger not prevent further triggers from being tried, if it matchesCheck to prevent more than a given number of equal commands to be sent in a row (which can disconnect your character in some muds)Cipher:Click the run the triggers against the line.Click to clear the command input area.Click to open link; right-click for more options.Click to revert all colors to their built-in defaultsColorsCommand HistoryCommand _History...Command not found.Commands that would be sent:Compression algorithm:Compression ratio:Compression used:Confirm deletionConnect toConnect to _AnotherConnect to another worldConnect without SSLConnected to host %s (%s) port %s, MCCP version %d enabled.Connected to host %s (%s) port %s.Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d enabled.Connected to host %s port %s, via proxy %s (%s) port %s.Connected to proxy server %s port %s, negotiating authentication...Connected to proxy server %s port %s, sending request...Connection _Style:Connection time:Copy Link AddressCould not connect to host %s port %s: %sCould not connect to host %s port %s: Error #%dCould not create directory '%s': %sCould not create socket: %sCould not create socket: error #%dCould not import file '%s': %sCould not load plugin %sCould not load world from file '%s': %sCould not open dump file %s: %s Could not open file '%s': %sCould not open file '%s': %s Variables were not saved.Could not open file.Could not open file: %sCould not open log file.Could not open raw dump file %s: %s Could not open world '%s': %s Could not resolve host %s: %sCould not start name-resolution thread.CountCount Custom: Cya_n (Bold)DIRDela_yDeleteDescriptionDirectory to store settings and saved worldsDisable T_imersDisable _AliasesDisable _MacrosDisable _TriggersDisconnectedDisconnected from host %s.Disconnected from host %s: %s.Disconnected from host %s: error #%d.Disconnected from world %sDisplayDisplay as hours, minutes and secondsDisplay as secondsDo not allow the _same command to be sentDo not change Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) Do not change No YesDo not change None Single DoubleDo not connectDo not deleteDo not displayDo you really want to delete %d %s?Do you really want to delete the %s?Do you really want to make %d variables temporary?Do you really want to make the variable temporary?Don't quitDumps all data received (possibly compressed) to the fileDumps all data received from (after decompression, if appropriate) to the fileE_val substitution as Perl statementE_xportEdit AliasEdit Character InformationEdit Default _World...Edit HookEdit MacroEdit TimerEdit TriggerEdit WorldElement '%s' not allowed inside element '%s'Enable _auto-completionEnable if server proposes at _any timeEnabledEnter _line to be matched against the triggers:Enter a command to be sent whenever the specified maximum number of equal commands would be sentEnter a descriptive name for the WorldEnter optionally a descriptive name for the aliasEnter optionally a descriptive name for the hookEnter optionally a descriptive name for the macroEnter optionally a descriptive name for the timerEnter optionally a descriptive name for the triggerEnter some text to be sent to the WorldEnter some text to search for.Enter the action that will be run when a match happensEnter the action to be executed whenever the timer firesEnter the action to be run when the event happensEnter the action to be run when the key is pressedEnter the character's name for automatic loginEnter the character's password for automatic loginEnter the command to run a web browser. %s will be substituted by the web page address.Enter the command to run an audio player program. %s will be substituted by the file path.Enter the default parameters for sending multiple lines or commands:Enter the host to connect toEnter the name of a scalar ($), array (@) or hash (%) variable whose contents are to be saved between sessions of the WorldEnter the pattern to match against received linesEnter the pattern to match against typed commandsEnter the port used when connectingEnter the substitution to be executedEnter the text to search forError Loading PluginError in plugin file: %sError setting spell checker: %s Error while reading from proxy host.Eval as PerlEvent:Expiration:ExportExternal ProgramsFILEFailed loading file %s: %sFileFile name not specified.Find CommandFind N_extFind Ne_xtFind NextFind PreviousFind _nextFind a command containing a given search termFind the next command with the same match textFingerprint:G_reen (Bold)GagGag LogGeneralHelp topic not found.Here you can set options to configure the appearance of KildClient.Here you can set options to configure the automation features of KildClient, such as triggers, aliases, plugins, etc.Hook defined.Hook modified.Hook not foundHook number %d for event %s Name: %s Action: %s Enabled: %s HooksHooks for '%s': Host:Hostname:I. CaseIdentify as 'Character - World name'Identify as 'World name - Character'Identify as 'World name'Idle time:If checked, triggers, aliases, macros and timers defined in plugins will appear in the corresponding World Editor sections.If not checked, objects such as triggers, aliases, etc. will be deleted directly without asking for confirmation when you press the Delete button.If this is checked, when there is only one open world no tabs will be shownIf this is selected, logging will be automatically started whenever you connect to the world.ImportInform number of lines to include in the log.InputInternal error: element '%s' ends when in START modeIntervalInvalid argument '%s' Invalid attribute '%s' for element '%s'Invalid function call: syntax is $world->FUNCTIONInvalid key code '%s'Invalid key code.Invalid plugin file.Invalid window size specification in config file. Issuer's DN:Keep ExecKeep _openKeep permanentKeyKey exchange:KildClient ErrorKildClient InformationKildClient QuestionKildClient WarningKildClient readyLanguage code:Left Right Top BottomLines received:Load pluginLoggingLogging is disabled.Logging not startedLogging stopped.Logging to file %s.Logging to file %s. MAC:Macro added.Macro modified.Macro number %d Name: %s Key Code: %s Action: %s Enabled: %s MacrosMagen_ta (Bold)Main WindowMake temporaryMiscellaneousMore than one command selected.Multi-line sendN/AN_umber of lines:NameNever _hide the typed textNewest commands are on the topNoNo %s deleted.No acceptable proxy authentication methods.No auto-login diku (char, pass) lp (CONNECT char pass)No command selected.No such %sNo such %s.No such aliasNo such hookNo such macroNo such pluginNo such timerNo such triggerNo worldNoneNot connectedNot connected.Not foundNot setNote: You can use strftime() escapes to create different files based on the date and time that logging starts. Also, %Kw represents the World name and %Kc the character name used in auto-logon.Number of triggers that matched:OfflineOmit (_gag) from outputOmit (gag) from _log fileOne %s deleted.Only _reset idle time counter when a command is entered directlyOnly scalar ($), array (@) and hash (%%) variables can be made permanent.Open LinkOr connect d_irectly:Outputs version information and exitsPass_word:PasswordPatternPerforming SSL handshake...Permanent VariablesPermanent variablesPermenent variablePluginPlugin '%s' loaded.Plugin already loaded. Try enabling it.Plugin disabled.Plugin enabled.Plugin not loaded.Plugin not specifiedPlugin number %d Name: %s Version: %s Description: %s Author: %s Enabled: %s PluginsPort:PreferencesPrefix lines with _date and/or timePress a key to get its keycode.Press the key that will be used to activate the macro while the cursor is in the text box.Press the key that will be used to run the macroProtocolsProxyProxy _type:Proxy authentication failed.Proxy host:Proxy port:Proxy request failed: %s.Proxy type:Put the selected command in the command entry boxPut the selected command in the command entry box and close this dialogR_edRe_d (Bold)Re_vert to default colorsReally Quit KildClient?Really close?Rec_all & CloseReconnectResolving host %s...Resolving proxy host %s...Revert to _defaultRewriterSSL Handshake failed: %sSSL not supported in this versionSSL protocol used:S_end & CloseS_pell check typed textS_tatistics...ScriptingScroll on _outputSe_nd this command:Search direction:Select if you do not want the connection time to be displayedSelect if you do not want the idle time to be displayedSelect if you want the connection time to be displayed in hours, minutes and secondsSelect if you want the connection time to be displayed in secondsSelect if you want the idle time to be displayed in hours, minutes and secondsSelect if you want the idle time to be displayed in secondsSelect log fileSelect the font used in the _main screen:Select the font used in the _status bar:Select the font used in the command _entry box:Select the font used in the command entry boxSelect the font used in the main output screenSelect the font used in the status barSelect this if you want to prefix each line in the log file with the date and/or time it was received.Select to include lines from the main window in the log file.Send the selected command(s) to the mudSend the selected command(s) to the mud and close the dialogSend this text _initially:SendingSending connection request...Sending proxy authentication credentials...Server _address:Server _port:Specify how many commands are sent at onceSpecify how many lines are sent at onceSpecify how many times this timer should run before being disabled or deletedSpecify some text to be appended to each sent lineSpecify some text to be prepended to each sent lineSpecify the command used to launch a web browserSpecify the command used to play sound files.Specify the delay between sending the group of commandsSpecify the delay between sending the group of linesSpecify the interval, in seconds, between timer activationsSpecify the maximum number of equal commands that can be sent in a rowSpecify the number of characters that must be typed for command completion to startSpecify the number of commands that are saved and can be later recalledSpecify the number of lines of output that can be seen with by scrolling the windowSpecify the separator for commands typed in the command entry boxSpell checking support not included in this build.St_artStatisticsStatus BarStyleSubject's DN:SubstitutionSuccessfully moved %s.TTL expiredTempTest TriggersThe default is to prefix lines with the date and time, but you can configure the format with strftime() escape sequences. See the manual for a description of those.The help is displayed in main window.The interval must be positive.The matched substring numberThe text entered here will be matched against triggers as if it were a line coming from the MUDThe whole lineThe whole matched textThen send the _contents of this file:There are %d open worlds. Do you really want to quit?There is one open world. Do you really want to quit?This is what would be printed in the main screen. If empty, the line has been gaged. It can be different from the original line because of rewriter triggers.This is what would be printed in the main screen:This object belongs to a plugin. Changes made here will not be saved in the plugin.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 version of KildClient does not have SSL support.Timer added.Timer modified.Timer number %d Name: %s Interval: %d Repeat count: %d Action: %s Enabled: %s Temporary: %s TimersTrigger added.Trigger modified.Trigger number %d Name: %s Pattern: %s Action: %s Enabled: %s Ignore case: %s Gag output: %s Gag in log: %s Keep executing: %s Rewriter: %s Change style: %s TriggersUnable to connect to host %s: %s.Unable to connect to host %s: Error #%d.Unable to connect to proxy host %s: %s.Unable to connect to proxy host %s: Error #%d.UnknownUnknown directive '%s' in config file. Unnamed worldUnrecognized response from proxy host.Use $window->getsize() instead.Use $window->minimize() instead.Use $world->path() instead.Use %Kw to represent the World's name, and %Kc to represent the auto-logon character nameUse _SSLUse _bold font for highlighted colors (instead of just highlighting)Use _multi-line input barUse global settings No proxy SOCKS4 SOCKS5Use single-_line input barUse the Find button to find the first result.Valid since:VariablesVersionVersion %s of this plugin is already loaded.Visit http://kildclient.sf.netW_hite (Bold)Warning: Trying to send a very long command line. Perhaps a recursive alias definition?Warning: the getwindowsize() function is deprecated and will be removed.Warning: the minimize() function is deprecated and will be removed.Warning: the path() function is deprecated and will be removed.World name:World saved.Would this line be included in the log file?Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br) Yell_ow (Bold)YesYou can leave this field blank, and a file name will be automatically generated. Only edit this field if you know what you are doing.You must specify a variable name.You must specify the action, unless the trigger is a gag or changes the style.You must specify the action.You must specify the key.You must specify the name.You must specify the password.You must specify the pattern.You must specify the substitution.You're attempting to connect to a world that uses SSL, but this version of KildClient has been built without SSL support. Try to connect without SSL?[WORLD...]_About_Action:_Apply to:_Ask for confirmation before deleting triggers, aliases, etc._Background:_Black_Clear_Command echo:_Delay_Delay between each group of lines/commands:_Disable_Disconnect_Display_Do not display this message again_Downwards_Echo sent commands in main window_Edit_Edit..._Enable if server proposes after connecting_Enabled_Event:_File:_Finally, send this text:_Find:_Flash window when new text is received_Foreground_Foreground:_Format:_Green_Help_Hide tabs if only one world is open_Host:_Idle time:_Ignore case when matching_Import_Include the last_Informative messages:_Input_Interval:_Italic:_Items to export_Keep dialog open after sending_Keep executing other triggers after this this one matches_Keep last typed command in command entry box_Key:_Lines to save in scrollback buffer:_Load_Magenta_Manual_Multi-line Send..._Name of variable to make permanent:_Name:_Next_Number of commands to save in history:_Number of lines/commands to send at once:_Password:_Pattern:_Perl file to load:_Port:_Preferences_Previous_Recall_Reconnect_Repeat count:_Rewriter trigger_Select a saved world:_Send_Show items defined by plugins_Store commands between sessions_Striked-thru:_Substitution:_Tab position:_Temporary (will be deleted automatically when its repeat count reaches 0)_Test Triggers..._Text to find:_Underline:_Upwards_Username:_White_World_Wrap lines at word boundaries_Yellow_times in a rowaddress type not supportedaliasalias: not creating alias without patternalias: not creating alias without substitutionaliasescharactercharacters have been enteredcommand not supported / protocol errorcommands(s)connection not allowed by rulesetconnection refused by destination hostgeneral failurehookhook: hook '%s' not found hookshost unreachableline(s)lines of the scrollback buffer in the logmacromacro: No such macromacrosnnetwork unreachablenorequest failed because client's identd could not confirm the user ID string in the requestrequest failed because identd could not be reachedrequest rejected or failedsec_onds eachsecondsseconds e_achtimertimer: No such timertimerstriggertriggersunknown reason codeyyesProject-Id-Version: KildClient 2.11.0 Report-Msgid-Bugs-To: POT-Creation-Date: 2011-05-29 12:33-0300 PO-Revision-Date: 2011-02-13 15:41-0200 Last-Translator: Rene Kuettner Language-Team: German Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Ziel: %d Vordergrund: %d Hintergrund: %d Kursiv: %d Durchgestrichen: %d Unterstrichen: %d SSL eingeschaltet.%d %s gelöscht.%d Zeilen%s ist bereits permanent.%s: %s ist schon permanent%s: %s ist nicht permanent%s: Das Argument muss numerisch sein%s: Ungültiger Tastencode%s: Keine solche Welt gefunden%s: Nur Skalar ($), Array (@) und Hash (%%) -Variablen können permanent sein%s: Dies ist eine interne Funktion, die nicht direkt aufgerufen werden sollte.%s: Zu wenig Argumente%s: Zu wenig Argumente.%s: Zu viele String-Argumente%s: Variable '%s' in permanente Variable umgewandelt. %s: Variable '%s' in permanente Variable umgewandelt. %s: Falscher Argumenttyp%s: Falsche Anzahl an Argumenten.%s: Falscher Referenztyp%s: Die Aktion wurde zweimal mit dem Attribut eins angegeben%s: Aktion ist nicht definiert und kein Gag. Erzeuge nichts.%s: Aktion nicht angegeben. Wird nicht erzeugt.%s: Anzahl muss numerisch sein%s: Interval muss numerisch sein%s: Interval nicht angegeben. Wird nicht erzeugt.%s: Ungültige Hintergrundfarbe%s: Ungültige Vordergrundfarbe%s: ungültiges Ziel%s: Ungültiger Stil für Unterstreichungen%s: Tastencode wurde zweimal mit dem Attribut eins angegeben%s: Tastencode nicht angegeben. Wird nicht erzeugt.%s: Das Muster wurde zweimal mit Attribut eins angegeben%s: Muster ist nicht definiert. Erzeuge nichts.%s: Ersetzung zweimal mit dem Attribut eins angegeben(-1 für unbegrenzt viele Wiederholungen)(Leer lassen, um die Systemeinstellung zu verwenden)0 Zeilen1 Zeile: Abgelaufen: Noch nicht aktivANSI FarbenAutomatische AnmeldungZeichensatzFarben, die von KildClient verwendet werdenBefehlseingabeVerbindungStandardfarbenDateiÜberlaufschutzSchriftEditorEingabeProtokollierungMCCP (für Kompression)NamensanzeigeHinweis:OptionenGeladene PluginsPlugins geladen beim ProgrammstartProxyStandardfarben zurücksetzenSkripteBildlaufSendeverzögerungenZeitanzeigeWeb BrowserFensterkonfigurationZeilenumbruchEin mächtiger MUD-Client mit Unterstützung für Perl SkripteProtokollierung beim Herstellen einer Verbindung _automatisch startenAutovervollständigung benötigt mindestensAktion_Füge dies am Anfang jeder Zeile an:Füge dies am _Ende jeder Zeile an:ErweitertAlias hinzugefügtAlias geändert.Alias Nummer %d Name: %s Muster: %s Ersetzung: %s Ignoriere Groß-/Kleinschreibung: %s Als Perl-Code ausführen: %s Aktiv: %s AliaseDieses Plugin beim Programmstart _ladenErscheinungsbildSoll diese Welt wirklich geschlossen werden?Versuche eine Verbindung zu %s (%s) an Port %s herzustellen...Versuche eine Verbindung zum Proxy %s (%s) an Port %s herzustellen...AutorAutomatisierung_Blau_HintergrundSchwar_z (Fett)Bl_au (Fett)Schwarz Rot Grün Gelb Blau Magenta Zyan Weiß Standard Schwarz (fett) Rot (fett) Grün (fett) Gelb (fett) Blau (fett) Magenta (fett) Zyan (fett) Weiß (fett) Standard (fett) Fetter Hintergrund_Fetter VordergrundEmpfangene Bytes (komprimiert):Empfangene Bytes (unkomprimiert):Stil ä_ndern_Trennzeichen für Befehle:_Einstellen...Verbindun_gszeit:C_yanKann kein Plugin in einer anderen Welt laden.Kann Hilfe-Datei nicht öffnen.Typ des Zertifikats:_Charaktere in diesem MUD:Stil ändernCharakter_Zeichensatz:Zeilen am Wortende umbrechenAktiviere diese Einstellung, wenn leuchtende ANSI Farben auch in Fettschrift dargestellt werden dürfenWählen, wenn der eingegeben Text in schwarzen Punkten erscheint.Wählen, um die automatische Befehlskomplettierung zu aktivieren (basierend auf vorherigen Befehlen)Wählen, um die Befehlshistorie beim Beenden in einer Datei abzulegenWählen, um die den letzten Befehl in der Eingabezeile zu erhalten, so dass er durch drücken der ENTER-Taste noch einmal gesendet werden kannWählen, wenn immer zur letzten Zeile gescrollt werden soll, sobald neuer Text empfangen wurdeWählen, um gesendete Befehle in der Hauptausgabe wiederzugeben (echo)Wählen, wenn die Ersetzung in einer s///e Konstruktion ausgeführt werden sollWählen, wenn der Timer gelöscht werden soll, sobald sein Wiederholungszähler 0 geworden istWählen, um das Alias zu aktivieren (nur aktivierte Aliase haben einen Effekt)Wählen, um den Hook zu aktivieren (nur aktivierte Hooks haben einen Effekt)Wählen, um die Untätigkeitszeit nur zurückzusetzen, wenn ein Kommando eingegeben wird. Wenn diese Einstellung nicht gewählt ist, kann die Untätigkeitszeit auch durch Hooks, Timer etc. zurückgesetzt werden.Wählen, um das Makro zu aktivieren (nur aktivierte Makros haben einen Effekt)Wählen, wenn die Zeile, auf die das Muster passt, nicht im Protokoll auftauchen sollWählen, wenn Zeilen, auf die das Muster passt, nicht angezeigt werden sollWählen, um den Timer zu aktivieren (nur aktive Timer haben einen Effekt)Wählen, um den Trigger zu aktivieren (nur aktive Trigger haben einen Effekt)Wählen, wenn dieser Trigger ein Rewriter-Trigger sein sollWählen, wenn weitere Trigger ausgeführt werden sollen, auch wenn dieser Trigger ausgelöst wurdeWählen, um zu verhindern, dass mehr als die angegebene Anzahl an gleichen Befehlen am Stück gesendet werden (was bei einigen MUDs zum Trennen der Verbindung führen kann)Chiffre:Klicken um die Trigger auf die Zeile anzuwenden.Klicken um die Befehlseingabe zu löschen.Klicken um den Link zu öffnen; Rechtsklick für weitere Optionen.All Farben auf die eingebauten Standardeinstellungen zurücksetzenFarbenBefehlshistorieBefehls_historie...Befehl nicht gefunden.Befehle die gesendet worden wären:Kompressionsalgorithmus:Kompressionsrate:Verwendete Kompression:Löschvorgang bestätigenVerbinde zuZu _anderer Welt verbindenMit einer anderen Welt verbindenOhne SSL-Verschlüsselung verbindenVerbunden mit %s (%s) an Port %s. Verwende MCCP Version %d.Verbunden mit %s (%s) an Port %s.Verbunden mit %s an Port %s, über Proxy %s (%s) an Port %s. Verwende MCCP version %d.Verbunden mit %s an Port %s über Proxy %s (%s) an Port %s.Verbunden mit Proxyserver %s an Port %s, Authentifizierung läuft...Verbunden mit Proxyserver %s an Port %s, sende Anfrage...._Art der Verbindung:Verbindungszeit:Linkadresse kopierenKann nicht mit %s an Port %s verbinden: %sKann nicht mit %s an Port %s verbinden: Fehler #%dKann Verzeichnis '%s' nicht erstellen: %sKann Socket nicht erzeugen: %sKann Socket nicht erzeugen: Fehler #%dKann Datei '%s' nicht importieren: %sKann Plugin %s nicht ladenKann Weltdatei '%s' nicht laden: %sKann Datendatei %s nicht öffnen: %s Kann Datei '%s' nicht öffnen: %sKann Datei '%s' nicht öffnen: %s Variablen wurden nicht gesichert.Kann Datei nicht öffnen.Kann Datei nicht öffnen: %sKann Protokolldatei nicht öffnen.Kann Rohdatendatei %s nicht öffnen: %s Kann Welt '%s' nicht öffnen: %s Kann Hostnamen %s nicht auflösen: %sDer Thread für die Namensauflösung konnte nicht gestartet werden.AnzahlZähler Benutzerdefiniert: _Cyan (Fett)Verzeichnis_VerzögerungLöschenBeschreibungVerzeichnis, in dem die Einstellungen und Welten gespeichert werdenT_imers deaktivieren_Aliase deaktivieren_Makros deaktivieren_Trigger deaktivierenVerbindung getrenntVerbindung mit %s wurde getrennt.Verbindung mit %s wurde getrennt: %s.Verbindung mit %s wurde getrennt: Fehler #%d.Verbindung zur Welt %s getrenntAnzeigeZeige Stunden, Minuten und SekundenIn Sekunden anzeigenVerbiete das _Senden abNicht ändern Schwarz Rot Grün Gelb Blau Magenta Zyan Weiß Standard Schwarz (fett) Rot (fett) Grün (fett) Gelb (fett) Blau (fett) Magenta (fett) Zyan (fett) Weiß (fett) Standard (fett) Nicht ändern Nein JaNicht ändern Keine Einfach DoppeltNicht verbindenNicht löschenNicht anzeigenSollen %d %s wirklich gelöscht werden?Soll %s wirklich gelöscht werden?Sollen %d Variablen wirklich in temporäre umgewandelt werden?Soll die Veriable wirklich zu einer temporären umgewandelt werden?Nicht beendenSchreibt alle empfangenen Daten (wenn möglich dekomprimiert) in die DateiSchreibt alle empfangenen Daten (gegebenenfalls nach der Dekompression) in die DateiErsetzung als Perl-Code e_valuieren_ExportierenAlias bearbeitenCharakter-Informationen bearbeitenVoreingestellte _Welt bearbeiten...Hook bearbeitenMakro bearbeitenTimer bearbeitenTrigger bearbeitenWelt bearbeitenElement '%s' ist innerhalb des Elements '%s' nicht erlaubtBefehls-_Autovervollständigung aktivieren_Zu jeder Zeit aktivieren, wenn der Server es anbietetAktiviert_Zeile auf die die Trigger angewendet werden sollen:Geben Sie einen Befehl an, der immer dann gesendet wird, wenn die maximale Anzahl an zu sendenden gleichen Befehlen gesendet würdeGeben Sie einen beschreibenden Namen der Welt anGeben Sie optional einen beschreibenden Namen für das Alias einGeben Sie optional einen beschreibenden Namen für den Hook anGeben Sie optional einen beschreibenden Namen für das Makro anGeben Sie optional einen beschreibenden Namen für den Timer einGeben Sie optional einen beschreibenden Namen für den Trigger einGeben Sie den Text ein, der an die Welt gesendet wirdGeben Sie den Text ein, nach dem gesucht werden soll.Geben Sie eine Aktion ein, die ausgeführt wird, wenn ein Muster gefunden wirdGeben Sie eine Aktion ein, die immer ausgeführt werden soll, wenn ein Timer ausgelöst wurdeGeben Sie die Aktion ein, die ausgeführt werden soll, wenn ein Ereignis stattfindetGeben Sie die Aktion ein, die ausgeführt werden soll, wenn die Taste gedrückt wirdGeben Sie den Namen des Charakters für das automatische Login anGeben Sie das Passwort des Charakters für das automatische Login anGeben Sie den Befehl an, mit dem der Webbrowser gestartet werden kann. %s wird durch die Webseiten-Adresse ersetzt.Befehl, mit dem Klangdateien abgespielt werden können. %s wird durch den Dateipfad ersetzt.Standardeinstellungen für das Senden mehrerer Zeilen oder Kommandos:Server zu dem die Verbindung hergestellt werden sollGeben Sie den Namen einer Skalar ($), Array (@) oder Hash (%) Variable an, deren Inhalt beim beenden gespeichert werden soll.Geben Sie das Muster ein, das gegen empfangene Zeilen geprüft wirdGeben Sie das Muster ein, auf das in eingegebene Befehlen geprüft wirdPort zu dem am Server verbunden werden sollGeben Sie die auszuführende Ersetzung einGeben Sie den Text ein, der gesucht werden sollFehler beim Laden eines PluginsFehler in der Plugin-Datei: %sFehler beim Setzen der Rechtschreibkorrektur: %s Fehler beim Lesen vom Proxyserver.Als Perl-Code auführenEreignis:Läuft ab:ExportierenExterne ProgrammeDATEIFehler beim Laden der Datei %s: %sDateiDateiname nicht angegeben.Suche BefehlNächste suchen_WeitersuchenWeitersuchenVorherige suchen_WeitersuchenSuche einen Befehl mit einem gegebenen SuchbegriffWeiteren Befehl mit diesem Suchbegriff suchenFingerabdruck:Grü_n (Fett)GagGag ProtokollAllgemeinHilfethema nicht gefunden.Hier kann das Erscheinungsbild von KildClient angepasst werden.Hier können Automatisierungsfunktionen von KildClient wie Trigger, Aliase oder Plugins eingestellt werden.Hook definiert.Hook geändert.Hook nicht gefundenHook Nummer %d für das Ereignis %s Name: %s Aktion: %s Aktiv: %s HooksHooks für '%s': Server:Hostname:I. FallIdentifizieren als 'Charakter - Weltname'Identifizieren als 'Weltname - Charakter'Identifizieren als 'Weltname'Untätigkeitszeit:Wenn gewählt werden Trigger, Aliase, Makros und Plugins, die in Plugins definiert sind, in den entsprechenden Abschnitten des Welt-Editors angezeigt.Wenn nicht gewählt werden Objekte wie Trigger, Aliase etc. direkt ohne Nachfrage gelöscht, wenn der Löschen-Knopf betätigt wird.Wenn diese Einstellung aktiv und nur eine Welt offen ist, werden keine Tabs angezeigtWählen, um die Protokollierung automatisch immer dann zu starten, wenn eine Verbindung zu einer Welt hergestellt wird.ImportierenAnzahl an Zeilen, die das Protokoll umfassen darf.EingabeInterner Fehler: Element '%s' endet obwohl der Beginn eines neuen Elements erwartet wirdIntervalUngültiges Argument '%s' Ungültiges Attribut '%s' für das Element '%s'Ungültiger Funktionsaufruf: Syntax ist $world->FUNKTIONSchlüsselwert '%s' ist ungültigUngültiger Schlüsselcode.Ungültige Plugin-Datei.Ungültige Fenstergröße in der Konfigurationsdatei. Aussteller DN:_Ausführung beibehalten_Offen haltenPermanent behaltenSchlüsselSchlüsselaustausch:Fehler - KildClientInformation - KildClientFrage - KildClientWarnung - KildClientKildClient bereitSprachen-Code:Rechts Links Oben UntenEmpfangene Zeilen:Plugin ladenProtokollierungDie Protokollierung ist ausgeschaltet.Die Protokollierung ist nicht gestartet.Protokollierung gestoppt.Protokolliere in Datei %s.Verwende Protokolldatei %s. MAC:Makro hinzugefügt.Makro geändert.Makro Nummer %d Name: %s Tastencode: %s Aktion: %s Aktiv: %s MakrosMagen_ta (Fett)HauptfensterIn temporäre Variable umwandelnVerschiedenesEs ist mehr als ein Befehl ausgewählt.Mehrzeilig sendenk/A_Anzahl an Zeilen:NameEingaben _niemals verstecken (auch nicht bei Passworten)Der neueste Befehl ist obenNeinKein %s gelöscht.Es sind keine akzeptablen Authentifizierungsmethoden beim Proxy verfügbar.Keine automatische Anmeldung diku (Charaktername, Passwort) lp (CONNECT Charakter Passwort)Es ist kein Befehl ausgewählt.Kein %s vorhandenKein %s vorhanden.Kein solcher Alias.Es existiert kein solcher Hook.Kein solches Makro vorhanden.Kein solches Plugin gefunden.Kein solcher Timer vorhanden.Kein solcher TriggerKeine WeltKeineNicht verbundenNicht verbunden.Nicht gefundenNicht definiertHinweis: strftime() Formatinformationen können verwendet werden, um verschiedene Dateinamen nach Datum und Zeit des Beginns der Protokollierung zu erzeugen. Zusätzlich repräsentiert %Kw den Weltnamen und %Kc den Namen des Charakters, der für die automatische Anmeldung eingetragen ist.Anzahl der Trigger, die ausgelöst wurden:Offline bleibenPassende Zeilen nicht ausgebenPassende Zeilen nicht ins Protokoll schreibenEin %s gelöscht.Untätigkeitszeit nur bei direkter Eingabe eines Befehls _zurücksetzenNur Skalar ($), Array (@) und Hash (%%) -Variablen können permanent sein.Link öffnen_Direkt verbinden:Zeigt Versionsinformationen an und beendet das ProgrammPass_wort:PasswortMusterSSL-Handshake wird ausgeführt...Permanente VariablenPermanente VariablenPermanente VariablePluginPlugin '%s' geladen.Plugin ist bereits geladen. Versuchen Sie es zu aktivieren.Plugin deaktiviert.Plugin aktiviert.Plugin ist nicht geladen.Kein Plugin angegeben.Plugin Nummer %d Name: %s Version: %s Beschreibung: %s Autor: %s Aktiv: %s PluginsPort:EinstellungenDatum und Zeit Protokolleinträgen _voranstellenDrücken Sie eine Taste um deren Tastencode zu erhalten.Drücken Sie die Taste, die das Makro aktiviert, solange sich der Cursor in der Textbox befindet.Drücken Sie die Taste, die diesem Makro zugeordnet werden sollNetzwerkProxyserverProxyserver_typ:Die Authentifizierung am Proxy ist fehlgeschlagen.Proxyserver:Proxy-Port:Proxy-Anfrage fehlgeschlagen: %s.Typ des Proxyservers:Ausgewählten Befehl in die Befehlseingabe schreibenAusgewählten Befehl in die Befehlseingabe schreiben und diesen Dialog schließen_RotR_ot (Fett)Auf Standardfarben _zurücksetzenSoll KildClient wirklich beendet werden?Wirklich schließen?Erneut aufrufen und schließenErneut verbindenLöse Hostnamen %s auf...Löse Proxy-Hostnamen %s auf...Auf Standard _zurücksetzenRewriterSSL-Handshake schlug fehl: %sSSL wird in dieser Version nicht unterstütztVerwendetes SSL Protokoll:S_enden & Schließen_Reichtschreibprüfung aktivierenS_tatistiken...SkripteBeim _Empfang automatisch scrollenSe_nde diesen Befehl:Suchrichtung:Wählen, falls die Anzeige der Verbindungszeit nicht gewünscht istWählen, wenn die Untätigkeitszeit nicht angezeigt werden sollWählen, wenn die Verbindungszeit in Stunden, Minuten und Sekunden angezeigt werden sollWählen, wenn die Verbindungszeit in Sekunden angezeigt werden sollWählen, wenn die Untätigkeitszeit in Stunden, Minuten und Sekunden angezeigt werden sollWählen, wenn die Untätigkeitszeit in Sekunden angezeigt werden sollAuswahl der ProtokolldateiWähle eine Schriftart für das Hauptfenster:Wähle eine Schriftart für die Statuszeile:Schriftart, die in der Befehlseingabe verwendet werden soll:Schriftart für die BefehlseingabeWähle eine Schrift für die HauptausgabeSchriftart, die in der Statuszeile verwendet wirdWählen, wenn jeder Zeile im Protokoll Datum und Zeit vorangestellt werden sollen.Wählen, um Zeilen aus dem Hauptfenster ins Protokoll zu schreiben.Sende den/die gewählte(n) Befehl(e) zum MUDSende den/die gewählte(n) Befehl(e) zum MUD und schließe diesen DialogSende diesen Text _zuerst:SendenSending Verbindungsanfrage...Sende Authentifizierungsdaten an den Proxyserver...Serveradresse:Serverport:Geben Sie an, wieviele Befehle auf einen Schlag gesendet werden dürfenAnzahl der Zeilen, die auf einmal gesendet werdenGeben Sie an, wie oft ein Timer ausgeführt werden soll, bevor er gelöscht oder deaktiviert wirdText, der an jede gesendete Zeile angehangen wirdText, der an jede gesendete Zeile angehangen wirdGeben Sie das Kommando an, mit dem der Webbrowser gestartet werden kannGeben Sie den Befehl an, mit dem Klangdateien abgespielt werden können.Geben Sie eine Verzögerung für das Senden einer Gruppe von Befehlen anVerzögerung beim Senden mehrerer ZeilenGeben Sie das Interval in Sekunden ein zwischen dem die Timer ausgelöst werdenGeben Sie die maximale Anzahl an gleichen Befehlen an, die auf einen Schlag gesendet werden dürfenMinimal Anzahl an Zeichen für die AutovervollständigungGeben Sie die Anzahl an Befehlen an, die in am Ende gesichert und beim nächsten Mal wieder aufgerufen werden könnenAnzahl der Zeilen, die im Speicher gehalten werden sollenGeben Sie das Trennzeichen an, das für Befehle in der Befehlseingabe verwendet werden sollDie Unterstützung für die Rechtschreibprüfung ist nicht verfügbar.S_tartStatistikenStatuszeileStilDienst DN:Ersetzen%s erfolgreich verschoben.TTL abgelaufenTemporärTrigger testenStandardmäßig werden alle Zeilen mit Datum und Uhrzeit beginnend angezeigt. Es kann aber wie bei strftime() ein benutzerdefiniertes Format eingestellt werden (Siehe Handbuch für eine Beschreibung).Die Hilfe wird im Hauptfenster angezeigt.Der Interval muss positiv sein.Zutreffender Teil NummerDie Trigger werden auf den Text, der hier eingegeben wird, angewendet als wäre er vom MUD empfangen wordenGanze ZeilenGanzer zutreffender TextDann sende den Inhalt dieser _Datei:Es sind noch %d Welten verbunden. Soll trotzdem beendet werden?Eine Welt ist noch verbunden. Soll trotzdem beendet werden?Diese Ausgabe wäre im Hauptfenster erschienen. Wenn die Ausgabe leer ist wurde die Zeile gaged. Sie kann verschieden von der ursprünglichen Zeile sein, wenn Rewriter Trigger angewendet wurden.Diese Ausgabe wäre im Hauptfenster erschienen:Dieses Objekt gehört zu einem Plugin. Änderungen, die hier gemacht werden, werden nicht im Plugin gespeichert.Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder (nach Ihrer Option) jeder späteren Version.Diese Version von KildClient enthält keine Unterstützung für SSL-Verschlüsselung.Timer hinzugefügt.Timer geändert.Timer Nummer %d Name: %s Interval: %d Wiederholungen: %d Aktion: %s Aktiv: %s Temporär: %s TimerTrigger hinzugefügt.Triger wurde verändert.Trigger Nummer %d Name: %s Muster: %s Aktion: %s Aktiv: %s Ignoriere Groß-/Kleinschreibung: %s Gag-Ausgabe: %s Gag ins Protkoll: %s Ausführung beibehalten: %s Rewriter: %s Stiländerung: %s TriggerKann nicht mit %s verbinden: %sKann nicht mit %s verbinden: Fehler #%d.Kann nicht mit Proxy %s verbinden: %sKann nicht mit Proxy %s verbinden: Fehler #%d.UnbekanntUnbekannte Direktive '%s' in der Konfigurationsdatei. Namenlose WeltUnverständliche Antwort vom Proxyserver.Verwenden Sie stattdessen $window->getsize().Verwenden Sie stattdessen $window->minimize().Verwenden Sie stattdessen $world->path().Verwenden Sie %Kw um den Weltnamen und %Kc um den Charakternamen zu repräsentieren_SSL-Verschlüsselung verwendenFettschrift für leuchtende Farben verwenden (statt einfacher Aufhellung)Mehrzeilige Befehlseingabe verwendenSystemeinstellungen verwenden Keinen Proxyserver verwenden SOCKS4 SOCKS5_Einzeilige Befehlseingabe verwendenVerwenden Sie den Suchknopf, um das erste Vorkommen zu suchen.Gültig seit:VariablenVersionVersion %s dieses Plugins bereits geladen.Besuchen Sie http://kildclient.sf.netWe_iß (Fett)Warnung: Es soll eine sehr lange Kommandozeile gesendet werden. Wurde ein Alias rekursiv definiert?Warnung: die Funktion getwindowsize() ist veraltet und wird entfernt!Warnung: Die Funktion minimize() ist veraltet und wird bald entfernt.Warnung: Die Funktion path() ist veraltet und wird bald entfernt.Weltname:Welt gesichert.Wäre diese Zeile im Protokoll erschienen?Geschrieben von Eduardo M Kalinowski (eduardo@kalinowski.com.br) Ge_lb (Fett)JaWird dieses Feld leer gelassen, wird automatisch ein Dateiname generiert. Nur bearbeiten, wenn man sicher ist, was man tut!Ein Variablenname muss angegeben werden.So lange der Trigger kein Gag ist oder den einen Stil ändert, muss eine Aktion angegeben werden.Die Aktion muss angegeben werden.Der Schlüssel muss angegeben werden.Ein Name muss angegeben werden.Ein Passwort muss angegeben werden..Das Muster muss angegeben werden.Die Ersetzung muss angegeben werden.Es wird versucht mit einer Welt zu verbinden, die SSL verwendet. Diese Version von Kildclient wurde aber ohne SSL-Unterstützung erstellt. Soll die Verbindung ohne SSL-Verschlüsselung versucht werden?[WELT...\Ü_ber_Aktion:_Anwenden auf:_Nachfragen, wenn Objekte wie Trigger oder Alias gelöscht werden_Hintergrund:_Schwarz_ZurücksetzenBefehls-_Echo:_Verzögerung_Verzögerung in Sekunden zwischen dem Senden:_Deaktivieren_Verbindung trennen_AnzeigeDiese Meldung _nicht noch einmal anzeigen_AbwärtsBefehls_echo (gesendete Befehle in der Hauptausgabe wiedergeben)_Bearbeiten_Bearbeiten..._Aktivieren, wenn der Server es direkt nach dem Verbinden anbietet_Aktiv_Ereignis:_Datei:Sende _schließlich diesen Text:_Suchen:Fenster _Blinken lassen, wenn neuer Text empfangen wurde_VordergrundV_ordergrund:_Format:_Grün_Hilfe_Verstecke Tabs, wenn nur eine Welt geöffnet ist_Server:_Untätigkeitszeit:Groß-/Kleinschreibung beim Mustervergleich _ignorieren_Importieren_Protokolliere die letzten_Informative Meldungen:_Eingabe_Interval:_Kursiv:Zu exportierende _ElementeDialog nach dem Senden _geöffnet lassenAuch bei Auslösung _weitere Trigger ausführen_Letzten Befehl in der Befehlseingabe belassen_Taste:_Zeilenanzahl, die im Puffer gespeichert werden soll:_Laden_MagentaHand_buch_Mehrzeiliges Senden..._Name der permanenten Variable:_Name:_NächsteAnzahl an Befehlen, die in der Historie gespeichert werden sollen:_Anzahl an Zeilen/Kommandos, die auf einmal gesendet werden können:Pas_swort:_Muster:_Perl Skript, das geladen werden soll:_Port:_Einstellungen_VorherigeErneut aufrufen_Erneut verbinden_Wiederholungen:_Rewriter Trigger_Eine bekannte Welt wählen:_Senden_Zeige in Plugins definierte Objekte_Befehlshistorie beim Beenden in einer Datei ablegen_Durchgestrichen:_Ersetzung:_Tab-Position:_Temporär (wird gelöscht, sobald der Wiederholungszähler 0 erreicht)Trigger _testen...Zu suchender _Text:_Unterstreichen:_AufwärtsBen_utzername:_Weiß_WeltZeilen am _Wortende umbrechenGel_b_gleichen Befehlen pro ZeileAddresstyp wird nicht unterstütztAliasalias: Alias wird ohne Muster nicht erzeugtalias: Alias wird ohne Ersetzung nicht erzeugtAliaseCharaktereingegebene ZeichenBefehl wird nicht unterstützt / ProtokollfehlerBefehl(e)Die Regeln verbieten die VerbindungVerbindung wurde von der Gegenstelle abgelehntAllgemeiner FehlerHookHook: Hook '%s' nicht gefunden HooksGegenstelle nicht erreichbarZeile(n)Zeilen des AusgabepuffersMakroMakro: Kein solches Makro vorhandenMakrosnNetzwerk nicht erreichbarNeinAnfrage fehlgeschlagen, da der IDENT-Server die Benutzeridentifikation nicht bestätigt hatAnfrage fehlgeschlagen, da der IDENT-Server nicht erreichbar warAnfrage wurde abgelehnt oder schlug fehl_Sekunden alleSekunden_Sekunden alleTimerTimer: Kein solcher Timer vorhanden.TimerTriggerTriggerUnbekannter Grund.jJakildclient-2.11.1/po/pt_BR.po0000644000175000017500000026107311570463465012647 00000000000000# KildClient messages in Portuguese (Brazilian) # Copyright (C) 2004-2011 Eduardo M Kalinowski # This file is distributed under the same license as the KildClient package. # msgid "" msgstr "" "Project-Id-Version: KildClient 2.11.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-05-29 12:33-0300\n" "PO-Revision-Date: 2011-05-28 11:15-0300\n" "Last-Translator: Eduardo M Kalinowski \n" "Language-Team: Eduardo M Kalinowski \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/main.c:76 msgid "Outputs version information and exits" msgstr "Mostra a informação da versão e sai" #: src/main.c:78 msgid "Directory to store settings and saved worlds" msgstr "Diretório para salvar a configuração e mundos salvos" #: src/main.c:78 msgid "DIR" msgstr "DIR" #: src/main.c:80 msgid "" "Dumps all data received from (after decompression, if appropriate) to the " "file" msgstr "" "Escreve todos os dados recebidos (depois de descomprimir, se apropriado) ao " "arquivo" #: src/main.c:81 src/main.c:84 msgid "FILE" msgstr "ARQUIVO" #: src/main.c:83 msgid "Dumps all data received (possibly compressed) to the file" msgstr "" "Escreve todos os dados recebidos (possivelmente comprimidos) ao arquivo" #. Parse command-line options #: src/main.c:122 msgid "[WORLD...]" msgstr "[MUNDO...]" #: src/main.c:129 #, c-format msgid "Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" msgstr "Escrito por Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" #: src/main.c:134 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "Impossível abrir arquivo de dump %s: %s\n" #: src/main.c:141 #, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "Impossível abrir arquivo de dump bruto %s: %s\n" #: src/main.c:287 msgid "There is one open world. Do you really want to quit?" msgstr "Há um mundo aberto. Você deseja realmente sair?" #: src/main.c:293 #, c-format msgid "There are %d open worlds. Do you really want to quit?" msgstr "Há %d mundos abertos. Você deseja realmente sair?" #: src/main.c:296 msgid "Really Quit KildClient?" msgstr "Realmente sair do KildClient?" #: src/main.c:298 msgid "Don't quit" msgstr "Não sair" #: src/net.c:150 msgid "" "You're attempting to connect to a world that uses SSL, but this version of " "KildClient has been built without SSL support. Try to connect without SSL?" msgstr "" "Você está tentando se conectar a um host que usa SSL, mas esta versão do " "KildClient foi compilada sem suporte a SSL. Conectar sem SSL?" #: src/net.c:151 msgid "KildClient Question" msgstr "Questão - KildClient" #: src/net.c:153 msgid "Connect without SSL" msgstr "Conectar sem SSL" #: src/net.c:154 msgid "Do not connect" msgstr "Não conectar" #: src/net.c:168 msgid "This version of KildClient does not have SSL support." msgstr "Esta versão do KildClient não tem suporte a SSL." #: src/net.c:238 src/proxy.c:206 #, c-format msgid "Resolving proxy host %s..." msgstr "Procurando host proxy %s..." #: src/net.c:241 #, c-format msgid "Resolving host %s..." msgstr "Procurando host %s..." #: src/net.c:272 src/proxy.c:224 msgid "Could not start name-resolution thread." msgstr "Não foi possível iniciar a thread para resolução do nome." #: src/net.c:324 src/proxy.c:190 #, c-format msgid "Could not resolve host %s: %s" msgstr "Não foi possível encontrar o host %s: %s" #: src/net.c:352 #, c-format msgid "Attempting to connect to host %s (%s) port %s..." msgstr "Tentando se conectar ao host %s (%s) porta %s..." #: src/net.c:355 #, c-format msgid "Attempting to connect to proxy host %s (%s) port %s..." msgstr "Tentando se conectar ao host proxy %s (%s) porta %s..." #: src/net.c:374 #, c-format msgid "Could not create socket: %s" msgstr "Não foi possível criar o socket: %s" #: src/net.c:377 #, c-format msgid "Could not create socket: error #%d" msgstr "Não foi possível criar o socket: erro #%d" #: src/net.c:397 #, c-format msgid "Could not connect to host %s port %s: %s" msgstr "Impossível conectar ao host %s porta %s: %s" #: src/net.c:407 #, c-format msgid "Could not connect to host %s port %s: Error #%d" msgstr "Impossível conectar ao host %s porta %s: Erro #%d" #: src/net.c:463 #, c-format msgid "Unable to connect to host %s: %s." msgstr "Impossível conectar ao host %s: %s" #: src/net.c:466 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "Impossível conectar ao host proxy %s: %s" #: src/net.c:508 src/net.c:526 #, c-format msgid "Unable to connect to host %s: Error #%d." msgstr "Impossível conectar ao host %s: Erro #%d" #: src/net.c:511 src/net.c:529 #, c-format msgid "Unable to connect to proxy host %s: Error #%d." msgstr "Impossível conectar ao host proxy %s: Erro #%d" #: src/net.c:563 #, c-format msgid "Performing SSL handshake..." msgstr "Iniciando SSL..." #: src/net.c:613 #, c-format msgid "SSL Handshake failed: %s" msgstr "Negociação SSL falhou: %s" #: src/net.c:655 #, c-format msgid "SSL Handshake took too long." msgstr "Handshake SSL demorou demais." #: src/net.c:684 src/net.c:1510 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "Conectado ao host %s (%s) porta %s." #: src/net.c:687 src/net.c:1513 #, c-format msgid "Connected to host %s port %s, via proxy %s (%s) port %s." msgstr "Conectado ao host %s porta %s, via proxy %s (%s) porta %s." #: src/net.c:694 src/net.c:1485 src/net.c:1520 msgid " SSL enabled." msgstr "SSL habilitado." #: src/net.c:712 src/perlscript.c:3069 #, c-format msgid "Logging to file %s.\n" msgstr "Logando para o arquivo %s.\n" #: src/net.c:858 #, c-format msgid "Disconnected from host %s." msgstr "Desconectado do host %s." #: src/net.c:931 src/net.c:940 #, c-format msgid "Disconnected from host %s: %s." msgstr "Desconectado do host %s: %s." #: src/net.c:951 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "Desconectado do host %s: erro #%d." #: src/net.c:1473 #, c-format msgid "Connected to host %s (%s) port %s, MCCP version %d enabled." msgstr "Conectado ao host %s (%s) porta %s, MCCP versão %d habilitado." #: src/net.c:1477 #, c-format msgid "" "Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d " "enabled." msgstr "" "Conectado ao host %s porta %s, via proxy %s (%s) porta %s, MCCP versão %d " "habilitado." #: src/net.c:1598 src/we_logging.c:135 msgid "Not connected." msgstr "Não conectado." #. success #: src/proxy.c:61 msgid "general failure" msgstr "falha geral" #: src/proxy.c:62 msgid "connection not allowed by ruleset" msgstr "conexão não permitida pelo conjunto de regras" #: src/proxy.c:63 msgid "network unreachable" msgstr "rede inatingível" #: src/proxy.c:64 msgid "host unreachable" msgstr "host de destino inatingível" #: src/proxy.c:65 msgid "connection refused by destination host" msgstr "conexão recusada pelo host destino" #: src/proxy.c:66 msgid "TTL expired" msgstr "TTL expirou" #: src/proxy.c:67 msgid "command not supported / protocol error" msgstr "comando não suportado / erro de protocolo" #: src/proxy.c:68 msgid "address type not supported" msgstr "tipo de endereçamento não suportado" #: src/proxy.c:241 #, c-format msgid "Connected to proxy server %s port %s, sending request..." msgstr "Conectado ao servidor proxy %s porta %s, enviando pedido..." #: src/proxy.c:296 src/proxy.c:425 src/proxy.c:470 src/proxy.c:544 msgid "Error while reading from proxy host." msgstr "Erro ao ler do servidor proxy." #: src/proxy.c:317 msgid "request rejected or failed" msgstr "pedido recusado ou falhou" #: src/proxy.c:321 msgid "request failed because identd could not be reached" msgstr "pedido falhou pois o servidor identd não pode ser alcançado" #: src/proxy.c:325 msgid "" "request failed because client's identd could not confirm the user ID string " "in the request" msgstr "" "pedido falhou pois o identd do cliente não pode confirmar o ID de usuário no " "pedido" #: src/proxy.c:329 src/proxy.c:570 #, c-format msgid "Proxy request failed: %s." msgstr "Pedido ao proxy falhou: %s." #: src/proxy.c:346 #, c-format msgid "Connected to proxy server %s port %s, negotiating authentication..." msgstr "Conectado ao servidor proxy %s porta %s, negociando autenticação..." #: src/proxy.c:440 msgid "No acceptable proxy authentication methods." msgstr "Nenhum método de autenticação aceitável." #: src/proxy.c:488 msgid "Proxy authentication failed." msgstr "Autenticação com o servidor proxy falhou." #. Should never happen #: src/proxy.c:531 msgid "Unrecognized response from proxy host." msgstr "Resposta do servidor proxy não foi reconhecida." #: src/proxy.c:565 msgid "unknown reason code" msgstr "código de resposta desconhecido" #: src/proxy.c:586 #, c-format msgid "Sending proxy authentication credentials..." msgstr "Enviando credenciais de autenticação ao servidor proxy..." #: src/proxy.c:625 #, c-format msgid "Sending connection request..." msgstr "Enviando pedido de conexão..." #: src/mainwindow.c:173 src/mainwindow.c:550 src/mainwindow.c:815 #: src/worldgui.c:1127 src/worldselector.c:195 src/worldeditor.c:182 #: src/we_general.c:344 src/we_generic_guied.c:83 src/we_triggers.c:85 #: src/we_triggers.c:555 src/we_triggers.c:753 src/we_aliases.c:78 #: src/we_aliases.c:457 src/we_macros.c:81 src/we_macros.c:422 #: src/we_timers.c:78 src/we_timers.c:459 src/we_hooks.c:89 src/we_hooks.c:609 #: src/we_vars.c:78 src/we_vars.c:380 src/prefs.c:109 src/triggers.c:585 #: src/multilinesend.c:95 src/cmdhistory.c:209 src/cmdhistory.c:454 #, c-format msgid "Error loading UI from XML file: %s" msgstr "Erro ao carregar interface do arquivo XML: %s" #: src/mainwindow.c:610 src/mainwindow.c:611 msgid "Not connected" msgstr "Não conectado" #: src/mainwindow.c:751 msgid ": Not yet active" msgstr ": Não ativo ainda" #: src/mainwindow.c:756 msgid ": Expired" msgstr ": Expirou" #: src/mainwindow.c:768 src/dlgStatistics.glade:81 src/dlgStatistics.glade:346 msgid "None" msgstr "Nenhuma" #: src/worldgui.c:227 msgid "_Find:" msgstr "_Procurar:" #: src/worldgui.c:241 msgid "Find Next" msgstr "Encontrar Próximo" #: src/worldgui.c:273 msgid "Click to clear the command input area." msgstr "Clique para limpar a área de entrada de comandos." #: src/worldgui.c:374 msgid "No world" msgstr "Nenhum mundo" #: src/worldgui.c:448 msgid "KildClient ready" msgstr "KildClient pronto" #: src/worldgui.c:455 msgid "0 lines" msgstr "0 linhas" #: src/worldgui.c:910 msgid "Are you sure you want to close this world?" msgstr "Você realmente deseja fechar este mundo?" #: src/worldgui.c:911 msgid "Really close?" msgstr "Realmente fechar?" #. Keep Open is RESPONSE_NO because of NO close. But we use #. STOCK_YES to pass a positive image. #: src/worldgui.c:914 msgid "Keep _open" msgstr "Manter _aberto" #: src/worldgui.c:1058 #, c-format msgid "Error setting spell checker: %s\n" msgstr "Erro ao configurar verificador ortográfico: %s\n" #: src/worldgui.c:1062 msgid "Spell checking support not included in this build." msgstr "Correção ortográfica não incluída nessa versão." #: src/worldgui.c:1341 msgid "Click to open link; right-click for more options." msgstr "Clique para abrir; clique com o botão direito para mais opções." #: src/worldgui.c:1503 msgid "Not found" msgstr "Não encontrado" #: src/ansitextview.c:438 msgid "1 line" msgstr "1 linha" #: src/ansitextview.c:440 #, c-format msgid "%d lines" msgstr "%d linhas" #: src/worldselector.c:140 src/worldselector.c:690 #, c-format msgid "Could not load world from file '%s': %s" msgstr "Impossível carregar mundo do arquivo '%s': %s" #: src/worldselector.c:143 src/worldselector.c:693 src/worlds.c:2284 #: src/we_generic_guied.c:312 src/we_generic_guied.c:401 src/prefs.c:451 #: src/prefs.c:530 msgid "KildClient Error" msgstr "Erro - KildClient" #: src/worldselector.c:496 #, c-format msgid "Could not open world '%s': %s\n" msgstr "Impossível abrir mundo '%s': %s\n" #: src/worldselector.c:538 #, c-format msgid "Invalid argument '%s'\n" msgstr "Argumento '%s' inválido\n" #: src/worldselector.c:811 msgid "Disconnected" msgstr "Desconectado" #: src/worldselector.c:814 src/worldselector.c:821 msgid "Reconnect" msgstr "Reconectar" #: src/worldselector.c:815 src/worldselector.c:822 msgid "Connect to another world" msgstr "Conectar a outro mundo" #: src/worldselector.c:816 msgid "Offline" msgstr "Offline" #: src/worlds.c:690 msgid "Unnamed world" msgstr "Mundo sem nome" #: src/worlds.c:747 #, c-format msgid "Could not open file: %s" msgstr "Impossível abrir arquivo: %s" #: src/worlds.c:810 #, c-format msgid "Invalid top-level element '%s'" msgstr "Elemento '%s' inválido" #: src/worlds.c:1624 #, c-format msgid "Internal error: element '%s' ends when in START mode" msgstr "Erro interno: elemento '%s' termina quando no modo START" #: src/worlds.c:1898 #, c-format msgid "Invalid key code '%s'" msgstr "Código de tecla '%s' inválido" #: src/worlds.c:1917 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "Elemento '%s' não permitido dentro do elemento '%s'" #: src/worlds.c:1930 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "Atributo '%s' inválido para o elemento '%s'" #: src/worlds.c:2281 src/we_generic_guied.c:309 src/prefs.c:448 #, c-format msgid "Could not open file '%s': %s" msgstr "Impossível abrir arquivo '%s': %s" #: src/worlds.c:2440 #, c-format msgid "Disconnected from world %s" msgstr "Desconectado do mundo %s." #: src/worldeditor.c:247 msgid "General" msgstr "Geral" #: src/worldeditor.c:255 src/worldeditor.c:259 msgid "Display" msgstr "Aparência" #: src/worldeditor.c:256 msgid "Here you can set options to configure the appearance of KildClient." msgstr "" "Aqui você pode definir opções para configurar a aparência do KildClient." #: src/worldeditor.c:267 msgid "Main Window" msgstr "Janela Principal" #: src/worldeditor.c:275 msgid "Colors" msgstr "Cores" #: src/worldeditor.c:283 msgid "Status Bar" msgstr "Barra de Status" #: src/worldeditor.c:291 msgid "Input" msgstr "Entrada" #: src/worldeditor.c:299 msgid "Logging" msgstr "Log" #: src/worldeditor.c:305 src/worldeditor.c:309 msgid "Automation" msgstr "Automação" #: src/worldeditor.c:306 msgid "" "Here you can set options to configure the automation features of KildClient, " "such as triggers, aliases, plugins, etc." msgstr "" "Aqui você pode definir opções para configurar os recursos de automação do " "KildClient, como triggers, aliases, plugins, etc." #: src/worldeditor.c:317 msgid "Scripting" msgstr "Scripts" #: src/worldeditor.c:325 msgid "Plugins" msgstr "Plugins" #: src/worldeditor.c:336 src/kildclient.glade:1808 msgid "Triggers" msgstr "Triggers" #: src/worldeditor.c:347 src/kildclient.glade:1822 msgid "Aliases" msgstr "Aliases" #: src/worldeditor.c:358 src/kildclient.glade:1838 msgid "Macros" msgstr "Macros" #: src/worldeditor.c:369 src/kildclient.glade:1854 msgid "Timers" msgstr "Timers" #: src/worldeditor.c:380 msgid "Hooks" msgstr "Hooks" #: src/worldeditor.c:391 msgid "Variables" msgstr "Variáveis" #: src/worldeditor.c:400 msgid "Protocols" msgstr "Protocolos" #: src/worldeditor.c:408 msgid "Miscellaneous" msgstr "Outros" #: src/worldeditor.c:416 msgid "Advanced" msgstr "Avançado" #: src/we_general.c:75 msgid "Character" msgstr "Personagem" #: src/we_general.c:83 msgid "Password" msgstr "Senha" #: src/we_general.c:383 msgid "You must specify the name." msgstr "Você deve especificar o nome." #: src/we_general.c:384 src/we_general.c:397 src/we_triggers.c:638 #: src/we_triggers.c:652 src/we_aliases.c:519 src/we_aliases.c:532 #: src/we_macros.c:479 src/we_macros.c:492 src/we_macros.c:505 #: src/we_timers.c:518 src/we_timers.c:531 src/we_hooks.c:661 #: src/we_vars.c:408 src/we_vars.c:420 src/we_vars.c:440 #: src/permanentvariables.c:131 src/cmdhistory.c:278 src/cmdhistory.c:290 #: src/cmdhistory.c:484 src/cmdhistory.c:517 src/cmdhistory.c:574 msgid "KildClient Warning" msgstr "Aviso - KildClient" #: src/we_general.c:396 msgid "You must specify the password." msgstr "Você deve especificar a senha." #: src/we_general.c:438 msgid "character" msgstr "personagem" #: src/we_logging.c:124 #, c-format msgid "Logging to file %s." msgstr "Logando para o arquivo %s." #: src/we_logging.c:130 msgid "Logging is disabled." msgstr "Log está desabilitado." #: src/we_logging.c:227 msgid "Logging not started" msgstr "Log não iniciado." #: src/we_logging.c:257 msgid "Select log file" msgstr "Selecione arquivo de log" #: src/we_plugins.c:126 src/we_plugins.c:343 src/we_triggers.c:227 #: src/we_aliases.c:208 src/we_macros.c:211 src/we_timers.c:208 #: src/we_hooks.c:330 src/perlscript.c:3195 msgid "Name" msgstr "Nome" #: src/we_plugins.c:138 src/we_plugins.c:385 src/perlscript.c:3196 msgid "Description" msgstr "Descrição" #: src/we_plugins.c:150 src/we_plugins.c:371 msgid "Author" msgstr "Autor" #: src/we_plugins.c:163 msgid "File" msgstr "Arquivo" #: src/we_plugins.c:211 src/we_plugins.c:467 msgid "Error Loading Plugin" msgstr "Erro ao Carregar Plugin" #: src/we_plugins.c:329 src/we_triggers.c:213 src/we_aliases.c:194 #: src/we_macros.c:197 src/we_timers.c:194 src/we_hooks.c:316 msgid "Enabled" msgstr "Habilitado" #: src/we_plugins.c:357 msgid "Version" msgstr "Versão" #: src/we_plugins.c:445 msgid "Always load this plugin at _startup" msgstr "_Sempre carregar esse plugin ao iniciar" #: src/we_plugins.c:507 msgid "The help is displayed in main window." msgstr "A ajuda foi exibida na janela principal." #: src/we_plugins.c:508 msgid "KildClient Information" msgstr "Informação - KildClient" #: src/we_plugins.c:509 msgid "_Do not display this message again" msgstr "_Não mostrar esta mensagem novamente" #: src/we_plugins.c:581 msgid "Load plugin" msgstr "Carregar plugin" #: src/we_generic_guied.c:96 msgid "Export" msgstr "Exportar" #: src/we_generic_guied.c:363 msgid "Import" msgstr "Importar" #: src/we_generic_guied.c:398 #, c-format msgid "Could not import file '%s': %s" msgstr "Impossível importar arquivo '%s': %s" #: src/we_generic_guied.c:952 #, c-format msgid "Do you really want to delete the %s?" msgstr "Você realmente deseja apagar o %s?" #: src/we_generic_guied.c:959 #, c-format msgid "Do you really want to delete %d %s?" msgstr "Você realmente deseja apagar %d %s?" #: src/we_generic_guied.c:963 src/we_vars.c:292 msgid "Confirm deletion" msgstr "Confirmar deleção" #: src/we_generic_guied.c:964 msgid "Do not delete" msgstr "Não excluir" #: src/we_generic_guied.c:972 msgid "Delete" msgstr "Excluir" #: src/we_triggers.c:132 src/dlgTestTriggers.glade:7 msgid "Test Triggers" msgstr "Testar Triggers" #: src/we_triggers.c:241 src/we_aliases.c:222 src/triggers.c:449 #: src/aliases.c:171 msgid "Pattern" msgstr "Padrão" #: src/we_triggers.c:259 src/we_aliases.c:240 msgid "I. Case" msgstr "I. Caixa" #: src/we_triggers.c:273 src/we_macros.c:239 src/we_timers.c:248 #: src/we_hooks.c:344 src/triggers.c:450 src/macros.c:147 src/timers.c:205 msgid "Action" msgstr "Ação" #: src/we_triggers.c:291 msgid "Gag" msgstr "Gag" #: src/we_triggers.c:309 msgid "Gag Log" msgstr "Gag Log" #: src/we_triggers.c:327 msgid "Keep Exec" msgstr "Cont Exec" #: src/we_triggers.c:345 msgid "Rewriter" msgstr "Reescritor" #: src/we_triggers.c:363 msgid "Style" msgstr "Estilo" #: src/we_triggers.c:377 src/we_aliases.c:286 src/we_macros.c:253 #: src/we_timers.c:280 src/we_hooks.c:358 msgid "Plugin" msgstr "Plugin" #: src/we_triggers.c:473 share/kildclient.pl:233 share/kildclient.pl:236 #: share/kildclient.pl:443 share/kildclient.pl:518 share/kildclient.pl:721 msgid "trigger" msgstr "trigger" #: src/we_triggers.c:473 share/kildclient.pl:443 msgid "triggers" msgstr "triggers" #: src/we_triggers.c:637 src/we_aliases.c:518 msgid "You must specify the pattern." msgstr "Você deve especificar o padrão." #: src/we_triggers.c:651 msgid "" "You must specify the action, unless the trigger is a gag or changes the " "style." msgstr "" "Você deve especificar a ação, a não ser que o trigger seja um gag ou altere " "o estilo." #: src/we_aliases.c:254 src/aliases.c:172 msgid "Substitution" msgstr "Substituição" #: src/we_aliases.c:272 msgid "Eval as Perl" msgstr "Avaliar como Perl" #: src/we_aliases.c:382 share/kildclient.pl:246 share/kildclient.pl:249 #: share/kildclient.pl:449 share/kildclient.pl:524 share/kildclient.pl:733 msgid "alias" msgstr "alias" #: src/we_aliases.c:382 share/kildclient.pl:449 msgid "aliases" msgstr "aliases" #: src/we_aliases.c:531 msgid "You must specify the substitution." msgstr "Você deve especificar a substituição." #: src/we_macros.c:225 src/macros.c:146 msgid "Key" msgstr "Tecla" #: src/we_macros.c:349 share/kildclient.pl:259 share/kildclient.pl:262 #: share/kildclient.pl:455 share/kildclient.pl:530 share/kildclient.pl:745 msgid "macro" msgstr "macro" #: src/we_macros.c:349 share/kildclient.pl:455 msgid "macros" msgstr "macros" #: src/we_macros.c:478 msgid "You must specify the key." msgstr "Você deve especificar a tecla." #: src/we_macros.c:491 msgid "Invalid key code." msgstr "Código de tecla inválido." #: src/we_macros.c:504 src/we_timers.c:530 src/we_hooks.c:660 msgid "You must specify the action." msgstr "Você deve especificar a ação." #: src/we_timers.c:221 msgid "Interval" msgstr "Intervalo" #: src/we_timers.c:234 msgid "Count" msgstr "Vezes" #: src/we_timers.c:266 msgid "Temp" msgstr "Temp" #: src/we_timers.c:383 share/kildclient.pl:272 share/kildclient.pl:275 #: share/kildclient.pl:461 share/kildclient.pl:536 share/kildclient.pl:757 msgid "timer" msgstr "timer" #: src/we_timers.c:383 share/kildclient.pl:461 msgid "timers" msgstr "timers" #: src/we_timers.c:517 msgid "The interval must be positive." msgstr "O intervalo deve ser positivo." #. The manually added combo for selecting which hook #: src/we_hooks.c:132 msgid "_Event:" msgstr "_Evento:" #: src/we_hooks.c:536 share/kildclient.pl:286 share/kildclient.pl:289 #: share/kildclient.pl:467 share/kildclient.pl:543 share/kildclient.pl:770 msgid "hook" msgstr "hook" #: src/we_hooks.c:536 share/kildclient.pl:467 msgid "hooks" msgstr "hooks" #: src/we_vars.c:283 msgid "Do you really want to make the variable temporary?" msgstr "Você realmente deseja tornar a variável temporária?" #: src/we_vars.c:289 #, c-format msgid "Do you really want to make %d variables temporary?" msgstr "Você realmente deseja tornar %d variáveis temporárias?" #: src/we_vars.c:293 msgid "Keep permanent" msgstr "Manter permanente" #: src/we_vars.c:301 msgid "Make temporary" msgstr "Manter temporária" #: src/we_vars.c:407 msgid "You must specify a variable name." msgstr "Você deve especificar o nome de uma variável." #: src/we_vars.c:419 #, c-format msgid "" "Only scalar ($), array (@) and hash (%%) variables can be made permanent." msgstr "" "Apenas variáveis escalares ($), arrays (@) e hashes (%%) podem ser feitas " "permanentes." #: src/we_vars.c:438 #, c-format msgid "%s is already permanent." msgstr "%s já é permanente." #: src/prefs.c:401 #, c-format msgid "Invalid window size specification in config file.\n" msgstr "" "Especificação de tamanho de janela inválida no arquivo de configuração.\n" #: src/prefs.c:421 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "Diretiva '%s' desconhecida no arquivo de configuração.\n" #: src/prefs.c:527 #, c-format msgid "Could not create directory '%s': %s" msgstr "Impossível criar diretório '%s': %s" #: src/parser.c:148 msgid "" "Warning: Trying to send a very long command line. Perhaps a recursive alias " "definition?" msgstr "" "Aviso: Tentando enviar uma linha muito longa. Talvez uma definição recursiva " "de alias?" #: src/triggers.c:448 #, c-format msgid "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" msgstr "Núm Gag GLo Hab KeE ReE IgC Est %-*.*s %-*.*s\n" #: src/triggers.c:470 src/triggers.c:471 src/triggers.c:472 src/triggers.c:473 #: src/triggers.c:474 src/triggers.c:475 src/triggers.c:476 src/aliases.c:192 #: src/aliases.c:193 src/aliases.c:194 src/macros.c:169 src/timers.c:228 #: src/timers.c:229 src/hooks.c:188 src/perlscript.c:3215 msgid "y" msgstr "s" #: src/triggers.c:470 src/triggers.c:471 src/triggers.c:472 src/triggers.c:473 #: src/triggers.c:474 src/triggers.c:475 src/triggers.c:476 src/aliases.c:192 #: src/aliases.c:193 src/aliases.c:194 src/macros.c:169 src/timers.c:228 #: src/timers.c:229 src/hooks.c:188 src/perlscript.c:3215 msgid "n" msgstr "n" #: src/triggers.c:668 msgid "No" msgstr "Não" #: src/triggers.c:668 msgid "Yes" msgstr "Sim" #: src/aliases.c:170 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "Núm Aval Hab IgC %-*.*s %-*.*s\n" #: src/macros.c:145 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "Núm Hab %-*.*s %-*.*s\n" #: src/timers.c:197 msgid "Num Ena Temp Int " msgstr "Num Hab Temp Int" #: src/timers.c:201 msgid "Count " msgstr "Vezes " #: src/permanentvariables.c:127 #, c-format msgid "" "Could not open file '%s': %s\n" "Variables were not saved." msgstr "" "Impossível abrir arquivo '%s': %s\n" "Variáveis não foram salvas." #: src/hooks.c:62 #, c-format msgid "hook: hook '%s' not found\n" msgstr "hook: hook '%s' não encontrado\n" #: src/hooks.c:78 src/hooks.c:211 msgid "No such hook" msgstr "Não existe tal hook" #: src/hooks.c:160 src/hooks.c:206 msgid "Hook not found" msgstr "Hook não encontrado" #: src/hooks.c:173 #, c-format msgid "Hooks for '%s':\n" msgstr "Hooks para '%s':\n" #: src/hooks.c:174 msgid "Num Ena Action" msgstr "Num Hab Ação" #: src/hooks.c:216 #, c-format msgid "" "Hook number %d for event %s\n" " Name: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Hook número %d para o evento %s\n" " Nome: %s\n" " Ação: %s\n" " Habilitado: %s\n" #: src/hooks.c:222 src/perlscript.c:1532 src/perlscript.c:2033 #: src/perlscript.c:2343 src/perlscript.c:2625 msgid "Not set" msgstr "Não definido" #: src/hooks.c:224 src/perlscript.c:1535 src/perlscript.c:1536 #: src/perlscript.c:1537 src/perlscript.c:1538 src/perlscript.c:1539 #: src/perlscript.c:1540 src/perlscript.c:1541 src/perlscript.c:2036 #: src/perlscript.c:2037 src/perlscript.c:2038 src/perlscript.c:2346 #: src/perlscript.c:2629 src/perlscript.c:2630 src/perlscript.c:3253 msgid "yes" msgstr "sim" #: src/hooks.c:224 src/perlscript.c:1535 src/perlscript.c:1536 #: src/perlscript.c:1537 src/perlscript.c:1538 src/perlscript.c:1539 #: src/perlscript.c:1540 src/perlscript.c:1541 src/perlscript.c:2036 #: src/perlscript.c:2037 src/perlscript.c:2038 src/perlscript.c:2346 #: src/perlscript.c:2629 src/perlscript.c:2630 src/perlscript.c:3253 msgid "no" msgstr "não" #: src/log.c:97 msgid "File name not specified." msgstr "Arquivo não especificado." #: src/log.c:161 msgid "Could not open log file." msgstr "Não foi possível abrir o arquivo de log." #: src/plugins.c:104 src/plugins.c:161 #, c-format msgid "Failed loading file %s: %s" msgstr "Impossível abrir arquivo %s: %s" #: src/cmdhistory.c:277 msgid "No command selected." msgstr "Nenhum comando selecionado." #: src/cmdhistory.c:289 msgid "More than one command selected." msgstr "Mais de um comando selecionado." #: src/cmdhistory.c:483 msgid "Enter some text to search for." msgstr "Entre com algum texto para procurar." #: src/cmdhistory.c:516 msgid "Use the Find button to find the first result." msgstr "Use o botão Procurar para procurar o primeiro resultado." #: src/cmdhistory.c:573 msgid "Command not found." msgstr "Comando não encontrado." #: src/perlscript.c:430 src/perlscript.c:436 src/perlscript.c:443 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "Chamada de função inválida: sintaxe é $world->FUNÇÃO" #: src/perlscript.c:585 src/perlscript.c:602 src/perlscript.c:664 #: src/perlscript.c:697 src/perlscript.c:1075 src/perlscript.c:1101 #: src/perlscript.c:1151 src/perlscript.c:1171 src/perlscript.c:1194 #: src/perlscript.c:1222 src/perlscript.c:1231 src/perlscript.c:1773 #: src/perlscript.c:1782 src/perlscript.c:1962 src/perlscript.c:2133 #: src/perlscript.c:2142 src/perlscript.c:2422 src/perlscript.c:2431 #: src/perlscript.c:2700 src/perlscript.c:2754 src/perlscript.c:2799 #: src/perlscript.c:2864 src/perlscript.c:2875 src/perlscript.c:2967 #: src/perlscript.c:3300 src/kcwin.c:98 #, c-format msgid "%s: Too few arguments" msgstr "%s: Muito poucos argumentos" #: src/perlscript.c:630 #, c-format msgid "%s: Argument must be numeric" msgstr "%s: Argumento deve ser numérico." #: src/perlscript.c:678 src/perlscript.c:710 #, c-format msgid "%s: No such world" msgstr "%s: Não existe tal mundo" #: src/perlscript.c:745 msgid "World saved." msgstr "Mundo salvo." #: src/perlscript.c:969 src/perlscript.c:984 src/perlscript.c:994 #, c-format msgid "%s: This is an internal function, do not call directly." msgstr "%s: Esta é uma função internal, não a chame diretamente." #: src/perlscript.c:973 src/perlscript.c:1353 src/perlscript.c:1884 #: src/perlscript.c:2258 src/perlscript.c:2453 src/perlscript.c:2928 #, c-format msgid "%s: Wrong argument type" msgstr "%s: Tipo de argumento errado" #: src/perlscript.c:1245 src/perlscript.c:1515 msgid "No such trigger" msgstr "Não existe tal trigger" #: src/perlscript.c:1263 src/perlscript.c:1814 src/perlscript.c:2187 #: src/perlscript.c:2887 #, c-format msgid "%s: Too many string arguments" msgstr "%s: Argumentos string demais" #: src/perlscript.c:1286 src/perlscript.c:1837 #, c-format msgid "%s: pattern given twice, using the named attribute one" msgstr "%s: pattern informado duas vezes, usando a de atributo nomeado" #: src/perlscript.c:1298 src/perlscript.c:2236 src/perlscript.c:2907 #, c-format msgid "%s: action given twice, using the named attribute one" msgstr "%s: ação informada duas vezes, usando a de atributo nomeado" #: src/perlscript.c:1344 src/perlscript.c:1875 src/perlscript.c:2249 #: src/perlscript.c:2920 #, c-format msgid "%s: Wrong type of reference" msgstr "%s: Tipo de referência inválido" #: src/perlscript.c:1364 #, c-format msgid "%s: pattern not specified, not creating" msgstr "%s: pattern não especificado, cancelando criação" #: src/perlscript.c:1373 #, c-format msgid "%s: action not specified, and isn't gag, not creating" msgstr "%s: ação não especificada e não e gag, cancelando criação" #: src/perlscript.c:1403 msgid "Trigger added." msgstr "Trigger adicionado." #: src/perlscript.c:1409 msgid "Trigger modified." msgstr "Trigger modificado." #: src/perlscript.c:1434 #, c-format msgid "%s: invalid target" msgstr "%s: 'target' inválido" #: src/perlscript.c:1444 #, c-format msgid "%s: invalid fg color" msgstr "%s: 'fg' inválido" #: src/perlscript.c:1454 #, c-format msgid "%s: invalid bg color" msgstr "%s: 'bg' inválido" #: src/perlscript.c:1464 #, c-format msgid "%s: invalid underline style" msgstr "%s: estilo de sublinhado inválido" #: src/perlscript.c:1520 #, c-format msgid "" "Trigger number %d\n" " Name: %s\n" " Pattern: %s\n" " Action: %s\n" " Enabled: %s\n" " Ignore case: %s\n" " Gag output: %s\n" " Gag in log: %s\n" " Keep executing: %s\n" " Rewriter: %s\n" " Change style: %s\n" msgstr "" "Trigger número %d\n" " Nome: %s\n" " Padrão: %s\n" " Ação: %s\n" " Ignorar caixa: %s\n" " Omitir na tela: %s\n" " Omitir no log: %s\n" " Habilitado: %s\n" " Continuar execução: %s\n" " Reescritor: %s\n" " Mudar estilo: %s\n" #: src/perlscript.c:1544 #, c-format msgid "" " Target: %d\n" " Foreground: %d\n" " Background: %d\n" " Italics: %d\n" " Striked-thru: %d\n" " Underline: %d\n" msgstr "" " Alvo: %d\n" " Texto: %d\n" " Fundo: %d\n" " Itálico: %d\n" " Tachado: %d\n" " Sublinhado: %d\n" #: src/perlscript.c:1796 src/perlscript.c:2020 msgid "No such alias" msgstr "Não existe tal alias." #: src/perlscript.c:1849 #, c-format msgid "%s: substitution given twice, using the named attribute one" msgstr "%s: substituição informada duas vezes, usando a de atributo nomeado" #: src/perlscript.c:1895 msgid "alias: not creating alias without pattern" msgstr "alias: cancelando criação de um aliás sem pattern" #: src/perlscript.c:1903 msgid "alias: not creating alias without substitution" msgstr "alias: cancelando criação de alias sem substituição" #: src/perlscript.c:1932 msgid "Alias added." msgstr "Alias adicionado." #: src/perlscript.c:1937 msgid "Alias modified." msgstr "Alias modificado." #: src/perlscript.c:2025 #, c-format msgid "" "Alias number %d\n" " Name: %s\n" " Pattern: %s\n" " Substitution: %s\n" " Ignore case: %s\n" " Eval as Perl: %s\n" " Enabled: %s\n" msgstr "" "Alias número %d\n" " Nome: %s\n" " Padrão: %s\n" " Substituição: %s\n" " Ignorar caixa: %s\n" " Avaliar como Perl: %s\n" " Habilitado: %s\n" #: src/perlscript.c:2105 msgid "Press a key to get its keycode." msgstr "Pressione uma tecla para obter seu código de tecla." #: src/perlscript.c:2157 msgid "macro: No such macro" msgstr "macro: Não existe tal macro" #: src/perlscript.c:2176 src/perlscript.c:2224 #, c-format msgid "%s: Invalid key code" msgstr "%s: Código de tecla inválido" #: src/perlscript.c:2213 #, c-format msgid "%s: keycode given twice, using the named attribute one" msgstr "%s: código de tecla informado duas vezes, usando o de atributo nomeado" #: src/perlscript.c:2269 #, c-format msgid "%s: keycode not specified, not creating" msgstr "%s: código de tecla não informado, cancelando criação" #: src/perlscript.c:2276 src/perlscript.c:2537 #, c-format msgid "%s: action not specified, not creating" msgstr "%s: ação não informada, cancelando criação" #: src/perlscript.c:2295 msgid "Macro added." msgstr "Macro adicionado." #: src/perlscript.c:2300 msgid "Macro modified." msgstr "Macro modificado." #: src/perlscript.c:2331 msgid "No such macro" msgstr "Não existe tal macro" #: src/perlscript.c:2337 #, c-format msgid "" "Macro number %d\n" " Name: %s\n" " Key Code: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Macro número %d\n" " Nome: %s\n" " Código de tecla: %s\n" " Ação: %s\n" " Habilitado: %s\n" #: src/perlscript.c:2447 msgid "timer: No such timer" msgstr "timer: Não existe tal timer" #: src/perlscript.c:2472 #, c-format msgid "%s: interval must be numeric" msgstr "%s: intervalo deve ser numérico" #: src/perlscript.c:2485 #, c-format msgid "%s: count must be numeric" msgstr "%s: contagem deve ser numérica" #: src/perlscript.c:2516 #, c-format msgid "%s: interval not specified, not creating" msgstr "%s: intervalo não foi informado, cancelando criação" #: src/perlscript.c:2577 msgid "Timer added." msgstr "Timer adicionado." #: src/perlscript.c:2582 msgid "Timer modified." msgstr "Timer modificado." #: src/perlscript.c:2612 msgid "No such timer" msgstr "Não existe tal timer" #: src/perlscript.c:2617 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %d\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" "Timer número %d\n" " Nome: %s\n" " Intervalo: %d\n" " Número de vezes: %d\n" " Ação: %s\n" " Habilitado: %s\n" " Temporário: %s\n" #: src/perlscript.c:2708 #, c-format msgid "" "%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent" msgstr "" "%s: Apenas variáveis escalares ($), arrays (@) e hashes (%%) podem ser " "feitas permanentes" #: src/perlscript.c:2717 #, c-format msgid "%s: %s is already permanent" msgstr "%s: %s já é permanente" #: src/perlscript.c:2731 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "%s: Variável '%s' feita permanente.\n" #: src/perlscript.c:2773 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "%s: Variável '%s' feita temporária.\n" #: src/perlscript.c:2777 #, c-format msgid "%s: %s is not permanent" msgstr "%s: %s não é permanente" #: src/perlscript.c:2830 msgid "Permanent variables" msgstr "Variáveis permanentes" #: src/perlscript.c:2942 msgid "Hook defined." msgstr "Hook definido." #: src/perlscript.c:2946 msgid "Hook modified." msgstr "Hook modificado." #: src/perlscript.c:3052 msgid "Logging stopped." msgstr "Log desabilitado." #: src/perlscript.c:3194 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "Núm Hab %-*.*s Versão %-*.*s\n" #: src/perlscript.c:3237 msgid "No such plugin" msgstr "Não existe tal plugin." #: src/perlscript.c:3242 #, c-format msgid "" "Plugin number %d\n" " Name: %s\n" " Version: %s\n" " Description: %s\n" " Author: %s\n" " Enabled: %s\n" msgstr "" "Plugin número %d\n" " Nome: %s\n" " Versão: %s\n" " Descrição: %s\n" " Autor: %s\n" " Habilitado: %s\n" #: src/kildclient.glade:176 msgid "_Import" msgstr "_Importar" #: src/kildclient.glade:225 msgid "E_xport" msgstr "E_xportar" #: src/kildclient.glade:274 msgid "Edit Alias" msgstr "Editar Alias" #: src/kildclient.glade:293 src/kildclient.glade:536 src/kildclient.glade:875 #: src/kildclient.glade:1170 src/kildclient.glade:1441 #: src/kildclient.glade:1687 src/dlgEditWorld.glade:92 #: src/dlgEditWorld.glade:3305 msgid "_Name:" msgstr "_Nome:" #: src/kildclient.glade:306 src/kildclient.glade:549 msgid "_Pattern:" msgstr "_Padrão:" #: src/kildclient.glade:321 msgid "_Substitution:" msgstr "_Substituição:" #: src/kildclient.glade:336 msgid "Enter optionally a descriptive name for the alias" msgstr "Entre opcionalmente um nome descritivo para o alias" #: src/kildclient.glade:350 msgid "Enter the pattern to match against typed commands" msgstr "Entre o padrão para ser comparado com os commandos digitados" #: src/kildclient.glade:365 msgid "Enter the substitution to be executed" msgstr "Entre a substuição a ser feita" #: src/kildclient.glade:378 msgid "E_val substitution as Perl statement" msgstr "A_valiar Substituição como um comando Perl" #: src/kildclient.glade:382 msgid "Check to have the substitution be executed in a s///e construction" msgstr "Marque para que a substituição seja executada numa construção s///e" #: src/kildclient.glade:396 src/kildclient.glade:638 src/kildclient.glade:978 #: src/kildclient.glade:1226 src/kildclient.glade:1421 msgid "_Enabled" msgstr "_Habilitado" #: src/kildclient.glade:400 msgid "Check to make the alias enabled; only enabled aliases are tried" msgstr "" "Marque para habilitar o alias; somente aliases habilitados são tentados" #: src/kildclient.glade:416 src/kildclient.glade:712 src/kildclient.glade:1072 #: src/kildclient.glade:1292 src/kildclient.glade:1496 msgid "Note:" msgstr "Nota:" #: src/kildclient.glade:430 src/kildclient.glade:726 src/kildclient.glade:1086 #: src/kildclient.glade:1306 src/kildclient.glade:1510 msgid "" "This object belongs to a plugin. Changes made here will not be saved " "in the plugin." msgstr "" "Este objeto pertence a um plugin. Modificações feitas nele não serão " "salvas no plugin." #: src/kildclient.glade:445 src/kildclient.glade:741 msgid "_Ignore case when matching" msgstr "_Ignorar maiúsculas e minúsculas" #: src/kildclient.glade:516 src/kildclient.glade:2030 msgid "Enter optionally a descriptive name for the trigger" msgstr "Entre opcionalmente um nome descritivo para o trigger" #: src/kildclient.glade:517 msgid "Edit Trigger" msgstr "Editar Trigger" #: src/kildclient.glade:564 src/kildclient.glade:932 src/kildclient.glade:1246 #: src/kildclient.glade:1393 msgid "_Action:" msgstr "_Ação:" #: src/kildclient.glade:592 msgid "Enter the pattern to match against received lines" msgstr "Entre o padrão para ser comparado com as linhas recebidas" #: src/kildclient.glade:607 msgid "Enter the action that will be run when a match happens" msgstr "Entre a ação que vai ser executado quando uma linha disparar o trigger" #: src/kildclient.glade:620 msgid "Omit (_gag) from output" msgstr "Omitir (_gag) da tela de saída" #: src/kildclient.glade:624 msgid "Check to make the matched line not be printed in the main output window" msgstr "Marque para que a linha não seja mostrada na tela" #: src/kildclient.glade:642 msgid "Check to make the trigger enabled; only enabled triggers are tried" msgstr "" "Marque para habilitar o trigger; somente triggers habilitados são tentados" #: src/kildclient.glade:656 msgid "Omit (gag) from _log file" msgstr "Omitir (gag) do arquivo de _log" #: src/kildclient.glade:660 msgid "Check to make the matched line not be printed in the log file" msgstr "Marque para que a linha não seja escrita no arquivo de log" #: src/kildclient.glade:674 msgid "_Keep executing other triggers after this this one matches" msgstr "C_ontinuar executando outros triggers depois de esser ser executado" #: src/kildclient.glade:678 msgid "" "Check to make this trigger not prevent further triggers from being tried, if " "it matches" msgstr "" "Marque para que esse trigger não impeça outros triggers de serem tentados, " "caso este seja executado" #: src/kildclient.glade:692 msgid "_Rewriter trigger" msgstr "Trigger _reescritor" #: src/kildclient.glade:696 msgid "Check to make this trigger a rewriter trigger" msgstr "Marque para que o trigger seja um trigger reescritor" #: src/kildclient.glade:763 msgid "C_hange style" msgstr "_Alterar estilo" #: src/kildclient.glade:779 msgid "C_onfigure..." msgstr "C_onfigurar..." #: src/kildclient.glade:856 msgid "Edit Timer" msgstr "Editar Timer" #: src/kildclient.glade:888 msgid "_Interval:" msgstr "_Intervalo:" #: src/kildclient.glade:903 msgid "Enter optionally a descriptive name for the timer" msgstr "Entre opcionalmente um nome descritivo para o timer" #: src/kildclient.glade:917 msgid "Enter the action to be executed whenever the timer fires" msgstr "Entre a ação a ser executado quando o timer disparar" #: src/kildclient.glade:947 msgid "_Repeat count:" msgstr "_Número de vezes:" #: src/kildclient.glade:960 msgid "" "_Temporary (will be deleted automatically when its repeat count reaches 0)" msgstr "" "_Temporário (será deletado automaticamente quando o número de vezes atingir " "0)" #: src/kildclient.glade:964 msgid "Check to have the timer deleted after its repeat count has reached 0" msgstr "" "Marque para que o timer seja apagado quando seu número de vezes chegar a 0" #: src/kildclient.glade:982 msgid "Check to make the timer enabled; only enabled timers are run" msgstr "" "Marque para habilitar o timer; somente timers habilitados são executados" #: src/kildclient.glade:1002 msgid "Specify the interval, in seconds, between timer activations" msgstr "Especifique o intervalo, em segundos, entre ativações do timer" #: src/kildclient.glade:1015 msgid "seconds" msgstr "segundos" #: src/kildclient.glade:1039 msgid "" "Specify how many times this timer should run before being disabled or deleted" msgstr "" "Especifique quantas deves esse timer deve rodar antes de ser desabilitado ou " "apagado" #: src/kildclient.glade:1052 msgid "(-1 to repeat indefinitely)" msgstr "(-1 para repetir indefinidamente)" #: src/kildclient.glade:1151 msgid "Edit Macro" msgstr "Editar Macro" #: src/kildclient.glade:1183 msgid "_Key:" msgstr "_Tecla:" #: src/kildclient.glade:1198 msgid "Enter optionally a descriptive name for the macro" msgstr "Entre opcionalmente um nome descritivo para o macro" #: src/kildclient.glade:1212 msgid "Press the key that will be used to run the macro" msgstr "Aperte a tecla que será usada para executar o macro" #: src/kildclient.glade:1230 msgid "Check to make the macro enabled; only enabled macros are run" msgstr "" "Marque para habilitar o macro; somente macros habilitados são executados" #: src/kildclient.glade:1261 msgid "Enter the action to be run when the key is pressed" msgstr "Entre a ação a ser executada quando a tecla for pressionada" #: src/kildclient.glade:1276 msgid "" "Press the key that will be used to activate the macro while the cursor is in " "the text box." msgstr "" "Aperte a tecla que será usada para executar o macro enquanto o cursor " "estiver na caixa de texto" #: src/kildclient.glade:1374 msgid "Edit Hook" msgstr "Editar Hook" #: src/kildclient.glade:1408 msgid "Enter the action to be run when the event happens" msgstr "Entre a ação a ser executado quando o evento acontecer" #: src/kildclient.glade:1425 msgid "Check to make the hook enabled; only enabled hooks are run" msgstr "Marque para habilitar o hook; somente hooks habilitados são executados" #: src/kildclient.glade:1456 msgid "Enter optionally a descriptive name for the hook" msgstr "Entre opcionalmente um nome descritivo para o hook" #: src/kildclient.glade:1472 msgid "Event:" msgstr "Evento:" #: src/kildclient.glade:1575 msgid "Permenent variable" msgstr "Variável permanente" #: src/kildclient.glade:1592 msgid "_Name of variable to make permanent:" msgstr "_Nome da variável a ser tornada permanente:" #: src/kildclient.glade:1606 msgid "" "Enter the name of a scalar ($), array (@) or hash (%) variable whose " "contents are to be saved between sessions of the World" msgstr "" "Entre o nome de uma variável escalar ($), array (@) ou hash (%) cujo " "conteúdo será salvo entre sessões do Mundo" #: src/kildclient.glade:1668 msgid "Edit Character Information" msgstr "Editar Informações do Personagem" #: src/kildclient.glade:1700 msgid "Enter the character's name for automatic login" msgstr "Entre o nome do personagem para login automático" #: src/kildclient.glade:1714 msgid "_Password:" msgstr "_Senha:" #: src/kildclient.glade:1729 msgid "Enter the character's password for automatic login" msgstr "Entre a senha do seu personagem para login automático" #: src/kildclient.glade:1870 msgid "Permanent Variables" msgstr "Variáveis Permanentes" #: src/kildclient.glade:1886 msgid "OnConnect Hooks" msgstr "Hooks OnConnect" #: src/kildclient.glade:1902 msgid "OnDisconnect Hooks" msgstr "Hooks OnDisconnect" #: src/kildclient.glade:1920 msgid "OnReceivedText Hooks" msgstr "Hooks OnReceivedText" #: src/kildclient.glade:1938 msgid "OnSentCommand Hooks" msgstr "Hooks OnSentCommand" #: src/kildclient.glade:1956 msgid "OnGetFocus Hooks" msgstr "Hooks OnGetFocus" #: src/kildclient.glade:1974 msgid "OnLoseFocus Hooks" msgstr "Hooks OnLoseFocus" #: src/kildclient.glade:1992 msgid "OnCloseConnected Hooks" msgstr "Hooks OnCloseConnect" #: src/kildclient.glade:2019 msgid "_Items to export" msgstr "_Itens para exportar" #: src/kildclient.glade:2031 msgid "Change Style" msgstr "Alterar Estilo" #: src/kildclient.glade:2050 msgid "_Background:" msgstr "F_undo:" #: src/kildclient.glade:2064 msgid "_Italic:" msgstr "_Itálico:" #: src/kildclient.glade:2077 src/kildclient.glade:2123 msgid "" "Do not change\n" "No\n" "Yes" msgstr "" "Não alterar\n" "Não\n" "Sim" #: src/kildclient.glade:2093 msgid "_Underline:" msgstr "S_ublinhado:" #: src/kildclient.glade:2106 msgid "" "Do not change\n" "None\n" "Single\n" "Double" msgstr "" "Não alterar\n" "Nenhum\n" "Simples\n" "Duplo" #: src/kildclient.glade:2139 msgid "_Striked-thru:" msgstr "_Tachado:" #: src/kildclient.glade:2153 msgid "_Foreground:" msgstr "Te_xto:" #: src/kildclient.glade:2167 msgid "_Apply to:" msgstr "_Aplicar a:" #: src/kildclient.glade:2181 msgid "The whole line" msgstr "Toda a linha" #: src/kildclient.glade:2196 msgid "The whole matched text" msgstr "Todo o texto encontrado" #: src/kildclient.glade:2216 msgid "The matched substring number" msgstr "A parte número" #: src/kildclient.glade:2259 src/kildclient.glade:2290 msgid "" "Do not change\n" "Black\n" "Red\n" "Green\n" "Yellow\n" "Blue\n" "Magenta\n" "Cyan\n" "White\n" "Default\n" "Black (bold)\n" "Red (bold)\n" "Green (bold)\n" "Yellow (bold)\n" "Blue (bold)\n" "Magenta (bold)\n" "Cyan (bold)\n" "White (bold)\n" "Default (bold)\n" msgstr "" "Não mudar\n" "Preto\n" "Vermelho\n" "Verde\n" "Amarelo\n" "Azul\n" "Magenta\n" "Ciano\n" "Branco\n" "Padrão\n" "Preto (negrito)\n" "Vermelho (negrito)\n" "Verde (negrito)\n" "Amarelo (negrito)\n" "Azul (negrito)\n" "Magenta (negrito)\n" "Ciano (negrito)\n" "Branco (negrito)\n" "Padrão (negrito)\n" #: src/wndmain.glade:20 msgid "_World" msgstr "_Mundo" #: src/wndmain.glade:37 msgid "_Reconnect" msgstr "_Reconectar" #: src/wndmain.glade:45 msgid "_Disconnect" msgstr "_Desconectar" #: src/wndmain.glade:53 msgid "Connect to _Another" msgstr "Conectar a _Outro Mundo" #: src/wndmain.glade:74 msgid "_Edit..." msgstr "_Editar..." #: src/wndmain.glade:91 msgid "S_tatistics..." msgstr "Es_tatísticas..." #: src/wndmain.glade:103 src/wndmain.glade:238 msgid "_Previous" msgstr "_Anterior" #: src/wndmain.glade:118 src/wndmain.glade:247 msgid "_Next" msgstr "_Próximo" #: src/wndmain.glade:151 msgid "_Edit" msgstr "_Editar" #: src/wndmain.glade:209 msgid "Find Ne_xt" msgstr "Encontrar _Próximo" #: src/wndmain.glade:222 msgid "_Input" msgstr "_Entrada" #: src/wndmain.glade:256 msgid "Find Previous" msgstr "Encontrar Anterior" #: src/wndmain.glade:265 msgid "Find N_ext" msgstr "Encontrar _Próximo" #: src/wndmain.glade:274 msgid "Command _History..." msgstr "_Histórico de Comandos..." #: src/wndmain.glade:288 msgid "_Multi-line Send..." msgstr "Enviar _Múltiplas Linhas..." #: src/wndmain.glade:302 msgid "_Test Triggers..." msgstr "_Testar Triggers..." #: src/wndmain.glade:314 msgid "_Preferences" msgstr "_Preferências" #: src/wndmain.glade:322 msgid "Disable _Triggers" msgstr "Desabilitar _Triggers" #: src/wndmain.glade:331 msgid "Disable _Aliases" msgstr "Desabilitar _Aliases" #: src/wndmain.glade:340 msgid "Disable _Macros" msgstr "Desabilitar _Macros" #: src/wndmain.glade:349 msgid "Disable T_imers" msgstr "Desabilitar T_imers" #: src/wndmain.glade:363 msgid "_Debug Matches" msgstr "" #: src/wndmain.glade:390 msgid "Edit Default _World..." msgstr "Editar _Mundo Padrão..." #: src/wndmain.glade:402 msgid "_Display" msgstr "_Aparência" #: src/wndmain.glade:411 msgid "_Split Window" msgstr "_Dividir janela" #: src/wndmain.glade:424 msgid "_Help" msgstr "_Ajuda" #: src/wndmain.glade:430 msgid "_Manual" msgstr "_Manual" #: src/wndmain.glade:447 msgid "_About" msgstr "_Sobre" #: src/dlgSelectWorld.glade:7 msgid "Connect to" msgstr "Conectar a" #: src/dlgSelectWorld.glade:19 msgid "_Select a saved world:" msgstr "_Selecione um mundo salvo:" #: src/dlgSelectWorld.glade:116 msgid "Or connect d_irectly:" msgstr "Ou conecte d_iretamente:" #: src/dlgSelectWorld.glade:141 src/dlgEditWorld.glade:107 msgid "_Host:" msgstr "_Host:" #: src/dlgSelectWorld.glade:154 src/dlgEditWorld.glade:124 msgid "_Port:" msgstr "Po_rta:" #: src/dlgPreferences.glade:6 msgid "Preferences" msgstr "Preferências" #: src/dlgPreferences.glade:33 msgid "Colors used by KildClient" msgstr "Cores usadas pelo KildClient" #: src/dlgPreferences.glade:65 msgid "_Informative messages:" msgstr "Mensagens _informativas:" #: src/dlgPreferences.glade:77 src/dlgPreferences.glade:117 msgid "" "Black\n" "Red\n" "Green\n" "Yellow\n" "Blue\n" "Magenta\n" "Cyan\n" "White\n" "Default\n" "Black (bold)\n" "Red (bold)\n" "Green (bold)\n" "Yellow (bold)\n" "Blue (bold)\n" "Magenta (bold)\n" "Cyan (bold)\n" "White (bold)\n" "Default (bold)\n" msgstr "" "Preto\n" "Vermelho\n" "Verde\n" "Amarelo\n" "Azul\n" "Magenta\n" "Ciano\n" "Branco\n" "Padrão\n" "Preto (negrito)\n" "Vermelho (negrito)\n" "Verde (negrito)\n" "Amarelo (negrito)\n" "Azul (negrito)\n" "Magenta (negrito)\n" "Ciano (negrito)\n" "Branco (negrito)\n" "Padrão (negrito)\n" #: src/dlgPreferences.glade:105 msgid "_Command echo:" msgstr "Eco de _comandos:" #: src/dlgPreferences.glade:168 msgid "Window configuration" msgstr "Configuração da Janela" #: src/dlgPreferences.glade:200 msgid "_Tab position:" msgstr "_Posição das abas:" #: src/dlgPreferences.glade:212 msgid "" "Left\n" "Right\n" "Top\n" "Bottom" msgstr "" "Esquerda\n" "Direita\n" "Em cima\n" "Em baixo" #: src/dlgPreferences.glade:226 msgid "_Hide tabs if only one world is open" msgstr "_Esconder abas se houver só um mundo aberto" #: src/dlgPreferences.glade:231 msgid "" "If this is checked, when there is only one open world no tabs will be shown" msgstr "" "Se esta opção estiver habilitada, quando houver apenas um mundo aberto, " "nenhuma aba será exibida." #: src/dlgPreferences.glade:242 msgid "_Flash window when new text is received" msgstr "_Piscar janela quando novo texto é recebido" #: src/dlgPreferences.glade:280 msgid "Appearance" msgstr "Aparência" #: src/dlgPreferences.glade:302 msgid "Sending Delays" msgstr "Espera Entre Envios" #: src/dlgPreferences.glade:334 msgid "Enter the default parameters for sending multiple lines or commands:" msgstr "" "Entre os parâmetros padrão para o envio de múltiplas linhas ou comandos:" #: src/dlgPreferences.glade:349 msgid "_Number of lines/commands to send at once:" msgstr "_Número de linhas/comandos para enviar de uma vez:" #: src/dlgPreferences.glade:386 msgid "_Delay between each group of lines/commands:" msgstr "_Espera entre cada grupo de linhas/comandos:" #: src/dlgPreferences.glade:442 msgid "Sending" msgstr "Envio" #: src/dlgPreferences.glade:465 msgid "Web Browser" msgstr "Navegador Web" #: src/dlgPreferences.glade:498 msgid "Specify the command used to launch a web browser" msgstr "Especifique o comando usado para iniciar um navegador web" #: src/dlgPreferences.glade:512 msgid "" "Enter the command to run a web browser. %s will be substituted by the web " "page address." msgstr "" "Entre o comando para rodar um navegador web. %s será substituído pelo " "endereço da página da web." #: src/dlgPreferences.glade:548 msgid "Audio Player" msgstr "Reprodutor de Ãudio" #: src/dlgPreferences.glade:581 msgid "Specify the command used to play sound files." msgstr "Especifique o comando usado para reproduzir arquivos de áudio." #: src/dlgPreferences.glade:595 msgid "" "Enter the command to run an audio player program. %s will be substituted by " "the file path." msgstr "" "Entre o comando para rodar um reprodutor de áudio. %s será substituído pelo " "arquivo." #: src/dlgPreferences.glade:627 msgid "External Programs" msgstr "Programas Externos" #: src/dlgPreferences.glade:651 src/dlgEditWorld.glade:245 msgid "Proxy" msgstr "Proxy" #: src/dlgPreferences.glade:686 src/dlgEditWorld.glade:280 msgid "Proxy _type:" msgstr "_Tipo do proxy:" #: src/dlgPreferences.glade:698 src/dlgEditWorld.glade:292 msgid "" "Use global settings\n" "No proxy\n" "SOCKS4\n" "SOCKS5" msgstr "" "Usar configuração global\n" "Sem proxy\n" "SOCKS4\n" "SOCKS5" #: src/dlgPreferences.glade:775 src/dlgEditWorld.glade:368 msgid "Pass_word:" msgstr "_Senha:" #: src/dlgPreferences.glade:791 src/dlgEditWorld.glade:384 msgid "Server _port:" msgstr "_Porta do servidor:" #: src/dlgPreferences.glade:805 src/dlgEditWorld.glade:398 msgid "_Username:" msgstr "_Usuário:" #: src/dlgPreferences.glade:819 src/dlgEditWorld.glade:412 msgid "Server _address:" msgstr "_Endereço do servidor:" #: src/dlgPreferences.glade:857 msgid "Proxy" msgstr "Proxy" #: src/dlgStatistics.glade:7 msgid "Statistics" msgstr "Estatísticas" #: src/dlgStatistics.glade:25 src/dlgStatistics.glade:40 #: src/dlgStatistics.glade:210 src/dlgStatistics.glade:361 #: src/dlgStatistics.glade:495 src/dlgStatistics.glade:510 #: src/dlgStatistics.glade:525 src/dlgStatistics.glade:540 #: src/dlgStatistics.glade:555 src/dlgStatistics.glade:583 #: src/dlgStatistics.glade:624 src/dlgStatistics.glade:639 #: src/dlgStatistics.glade:667 src/dlgStatistics.glade:708 #: src/dlgStatistics.glade:723 msgid "N/A" msgstr "N/A" #: src/dlgStatistics.glade:55 msgid "Proxy port:" msgstr "Porta do proxy:" #: src/dlgStatistics.glade:68 msgid "Proxy host:" msgstr "Host proxy:" #: src/dlgStatistics.glade:96 msgid "Proxy type:" msgstr "Tipo do proxy:" #: src/dlgStatistics.glade:109 msgid "World name:" msgstr "Nome do mundo:" #: src/dlgStatistics.glade:120 msgid "Host:" msgstr "Host:" #: src/dlgStatistics.glade:133 msgid "Port:" msgstr "Porta:" #: src/dlgStatistics.glade:146 msgid "Connection time:" msgstr "Tempo de conexão:" #: src/dlgStatistics.glade:159 msgid "Idle time:" msgstr "Tempo inativo:" #: src/dlgStatistics.glade:184 msgid "Compression used:" msgstr "Compressão utilizada:" #: src/dlgStatistics.glade:197 msgid "Bytes received (compressed):" msgstr "Bytes recebidos (comprimidos):" #: src/dlgStatistics.glade:225 msgid "Bytes received (decompressed):" msgstr "Bytes recebidos (descomprimidos):" #: src/dlgStatistics.glade:238 msgid "Compression ratio:" msgstr "Taxa de compressão:" #: src/dlgStatistics.glade:251 msgid "Lines received:" msgstr "Linhas recebidas:" #: src/dlgStatistics.glade:402 msgid "Key exchange:" msgstr "Troca de chave:" #: src/dlgStatistics.glade:415 msgid "SSL protocol used:" msgstr "Protocolo SSL usado:" #: src/dlgStatistics.glade:428 msgid "Compression algorithm:" msgstr "Algoritmo de compressão:" #: src/dlgStatistics.glade:441 msgid "Certificate type:" msgstr "Tipo de certificado:" #: src/dlgStatistics.glade:454 msgid "Cipher:" msgstr "Algoritmo criptográfico:" #: src/dlgStatistics.glade:467 msgid "MAC:" msgstr "MAC:" #: src/dlgStatistics.glade:480 msgid "SSL not supported in this version" msgstr "SSL não suportado nessa versão" #: src/dlgStatistics.glade:570 msgid "Hostname:" msgstr "Host:" #: src/dlgStatistics.glade:598 msgid "Valid since:" msgstr "Válido desde:" #: src/dlgStatistics.glade:611 msgid "Expiration:" msgstr "Expira:" #: src/dlgStatistics.glade:654 msgid "Fingerprint:" msgstr "Fingerprint:" #: src/dlgStatistics.glade:682 msgid "Subject's DN:" msgstr "" #: src/dlgStatistics.glade:695 msgid "Issuer's DN:" msgstr "" #: src/dlgAbout.glade:12 msgid "A mud client with powerful features and support for Perl Scripting" msgstr "" "Um cliente de MUD com recursos poderosos e suporte para scripting com Perl" #: src/dlgAbout.glade:14 msgid "Visit http://kildclient.sf.net" msgstr "Visite http://kildclient.sf.net" #: src/dlgAbout.glade:15 msgid "" "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." msgstr "" "Este programa é software livre, você pode redistribui-lo e/ou modificá-lo " "sob os termos da GNU General Public License conforme publicada pela Free " "Software Foundation; tanto a versão 2 desta licensa quanto (a seu critério) " "qualquer versão mais nova." #: src/dlgEditWorld.glade:7 msgid "Edit World" msgstr "Editar Mundo" #: src/dlgEditWorld.glade:60 msgid "Connection" msgstr "Conexão" #: src/dlgEditWorld.glade:141 msgid "Enter a descriptive name for the World" msgstr "Entre um nome descritivo para o Mundo" #: src/dlgEditWorld.glade:159 msgid "Enter the host to connect to" msgstr "Entre o host a se conectar" #: src/dlgEditWorld.glade:179 msgid "Enter the port used when connecting" msgstr "Entre a porta usada para conexão" #: src/dlgEditWorld.glade:197 msgid "Use _SSL" msgstr "Usar _SSL" #: src/dlgEditWorld.glade:452 msgid "Auto-login" msgstr "Login automático" #: src/dlgEditWorld.glade:488 msgid "Connection _Style:" msgstr "_Estilo de Conexão:" #: src/dlgEditWorld.glade:501 msgid "" "No auto-login\n" "diku (char, pass)\n" "lp (CONNECT char pass)" msgstr "" "Sem auto-login\n" "diku (pers, senha)\n" "lp (CONNECT pers senha)" #: src/dlgEditWorld.glade:519 msgid "Ch_aracters in this mud:" msgstr "_Personagens neste mud:" #: src/dlgEditWorld.glade:680 src/dlgEditWorld.glade:2009 #: src/dlgEditWorld.glade:2852 msgid "Font" msgstr "Fonte" #: src/dlgEditWorld.glade:713 msgid "Select the font used in the _main screen:" msgstr "Selecione a fonte usada na janela _principal:" #: src/dlgEditWorld.glade:729 msgid "Select the font used in the main output screen" msgstr "Selecione a fonte usada na janela principal" #: src/dlgEditWorld.glade:740 msgid "Use _bold font for highlighted colors (instead of just highlighting)" msgstr "" "Usar fonte _negrito para cores destacadas (ao invés de apenas destacar)" #: src/dlgEditWorld.glade:745 msgid "" "Check if you want the highlighted ANSI colors to be displayed in bold also" msgstr "" "Marque se você quiser que as cores ANSI destacadas sejam mostradas em " "negrito também" #: src/dlgEditWorld.glade:782 msgid "Word Wrap" msgstr "Quebra de linhas" #: src/dlgEditWorld.glade:812 msgid "_Wrap lines at word boundaries" msgstr "Quebrar linhas entre _palavras" #: src/dlgEditWorld.glade:817 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "Marque se você quiser que as linhas sejam quebradas entre palavras" #: src/dlgEditWorld.glade:836 msgid "_Indent wrapped lines by" msgstr "_Indentar linhas quebras por" #: src/dlgEditWorld.glade:865 msgid "pixels" msgstr "pixels" #: src/dlgEditWorld.glade:883 msgid "Wrap lines at full _screen width" msgstr "Quebrar linhas na largura _máxima da tela" #: src/dlgEditWorld.glade:902 msgid "Maximum line width in _characters:" msgstr "Largura máxima da linha em _caracteres:" #: src/dlgEditWorld.glade:964 msgid "Tooltips" msgstr "Tooltips" #: src/dlgEditWorld.glade:995 msgid "Display _tooltips with the time when the line was received" msgstr "Mostrar _tooltips com o horário em que a linha foi recebida" #: src/dlgEditWorld.glade:1000 msgid "" "Check if you want tooltips to be displayed showing the time when a line was " "received if you leave the mouse over the line for a short while" msgstr "" "Marque se você quiser que uma tooltip seja mostrada com o horário em que a " "linha foi recebida ao deixar o mouse sobre uma linha por alguns segundos" #: src/dlgEditWorld.glade:1058 msgid "Ansi Colors" msgstr "Cores Ansi" #: src/dlgEditWorld.glade:1374 msgid "_Black" msgstr "_Preto" #: src/dlgEditWorld.glade:1391 msgid "R_ed" msgstr "Verme_lho" #: src/dlgEditWorld.glade:1410 msgid "_Green" msgstr "_Verde" #: src/dlgEditWorld.glade:1429 msgid "_Yellow" msgstr "A_marelo" #: src/dlgEditWorld.glade:1448 msgid "B_lue" msgstr "_Azul" #: src/dlgEditWorld.glade:1467 msgid "_Magenta" msgstr "Ma_genta" #: src/dlgEditWorld.glade:1486 msgid "C_yan" msgstr "C_iano" #: src/dlgEditWorld.glade:1505 msgid "_White" msgstr "_Branco" #: src/dlgEditWorld.glade:1524 msgid "Bl_ack (Bold)" msgstr "Pr_eto (Negrito)" #: src/dlgEditWorld.glade:1541 msgid "Re_d (Bold)" msgstr "Vermel_ho (Negrito)" #: src/dlgEditWorld.glade:1560 msgid "G_reen (Bold)" msgstr "Ver_de (Negrito)" #: src/dlgEditWorld.glade:1579 msgid "Yell_ow (Bold)" msgstr "Amarel_o (Negrito)" #: src/dlgEditWorld.glade:1598 msgid "Bl_ue (Bold)" msgstr "A_zul (Negrito)" #: src/dlgEditWorld.glade:1617 msgid "Magen_ta (Bold)" msgstr "Magen_ta (Negrito)" #: src/dlgEditWorld.glade:1636 msgid "Cya_n (Bold)" msgstr "Cia_no (Negrito)" #: src/dlgEditWorld.glade:1655 msgid "W_hite (Bold)" msgstr "B_ranco (Negrito)" #: src/dlgEditWorld.glade:1720 msgid "Default Colors" msgstr "Cores Padrão" #: src/dlgEditWorld.glade:1767 msgid "_Foreground" msgstr "Te_xto" #: src/dlgEditWorld.glade:1801 msgid "Bac_kground" msgstr "F_undo" #: src/dlgEditWorld.glade:1835 msgid "Bold Foreground" msgstr "Texto em Negrito" #: src/dlgEditWorld.glade:1873 msgid "Bold Background" msgstr "Fundo Negrito" #: src/dlgEditWorld.glade:1916 msgid "Revert to default colors" msgstr "Reverter às cores padrão" #: src/dlgEditWorld.glade:1947 msgid "Re_vert to default colors" msgstr "Reverter às core_s padrão" #: src/dlgEditWorld.glade:1952 msgid "Click to revert all colors to their built-in defaults" msgstr "Clique para reverter todas as cores para o padrão do programa" #: src/dlgEditWorld.glade:2042 msgid "Select the font used in the _status bar:" msgstr "Selecione a fonte usada na barra de _status:" #: src/dlgEditWorld.glade:2058 msgid "Select the font used in the status bar" msgstr "Selecione a fonte usada na barra de status" #: src/dlgEditWorld.glade:2093 msgid "Time Display" msgstr "Exibição dos Tempos" #: src/dlgEditWorld.glade:2125 msgid "C_onnected time:" msgstr "Tempo c_onectado:" #: src/dlgEditWorld.glade:2156 src/dlgEditWorld.glade:2256 msgid "Do not display" msgstr "Não exibir" #: src/dlgEditWorld.glade:2161 msgid "Select if you do not want the connection time to be displayed" msgstr "Selecione se você não deseja que o tempo de conexão seja mostrado" #: src/dlgEditWorld.glade:2175 src/dlgEditWorld.glade:2275 msgid "Display as hours, minutes and seconds" msgstr "Mostrar como horas, minutos e segundos" #: src/dlgEditWorld.glade:2180 msgid "" "Select if you want the connection time to be displayed in hours, minutes and " "seconds" msgstr "" "Selecione se você deseja que o tempo de conexão seja mostrado em horas, " "minutos e segundos" #: src/dlgEditWorld.glade:2194 src/dlgEditWorld.glade:2294 msgid "Display as seconds" msgstr "Mostrar como segundos" #: src/dlgEditWorld.glade:2199 msgid "Select if you want the connection time to be displayed in seconds" msgstr "" "Selecione se você deseja que o tempo de conexão seja mostrado em segundos" #: src/dlgEditWorld.glade:2226 msgid "_Idle time:" msgstr "Tempo _Inativo:" #: src/dlgEditWorld.glade:2261 msgid "Select if you do not want the idle time to be displayed" msgstr "Selecione se você não deseja que o tempo de inatividade seja mostrado" #: src/dlgEditWorld.glade:2280 msgid "" "Select if you want the idle time to be displayed in hours, minutes and " "seconds" msgstr "" "Selecione se você deseja que o tempo de inatividade seja mostrado em horas, " "minutos e segundos" #: src/dlgEditWorld.glade:2299 msgid "Select if you want the idle time to be displayed in seconds" msgstr "" "Selecione se você deseja que o tempo de inatividade seja mostrado em segundos" #: src/dlgEditWorld.glade:2313 msgid "Only _reset idle time counter when a command is entered directly" msgstr "" "Só _resetar o contador de tempo inativo quando um comando é digitado " "diretamente" #: src/dlgEditWorld.glade:2318 msgid "" "Check to make the idle time counter reset only when a command is entered " "directly by typing it in the command entry box. If not checked, if a command " "is sent because of a timer, of a hook, etc, the idle timer is also reset." msgstr "" "Marque para fazer com que o contador de tempo inativo só seja resetado " "quando um comando for digitado diretamente na caixa de entrada de comandos. " "Se não estiver marcado, e um comando for enviado por um timer, hook, etc, o " "contador de tempo ocioso também é resetado." #: src/dlgEditWorld.glade:2387 msgid "Command Entry" msgstr "Entrada de Comandos" #: src/dlgEditWorld.glade:2417 msgid "_Keep last typed command in command entry box" msgstr "_Manter último comando enviado na caixa de entrada de comandos" #: src/dlgEditWorld.glade:2422 msgid "" "Check to have the last command kept in the command entry box, so that you " "can repeat commands only by pressing ENTER" msgstr "" "Marque para que o último comando seja mantido na caixa de entrada de " "comandos, para repeti-lo apertando ENTER simplesmente" #: src/dlgEditWorld.glade:2434 msgid "_Echo sent commands in main window" msgstr "_Ecoar comandos enviados na janela principal" #: src/dlgEditWorld.glade:2439 msgid "Check to have the sent commands echoed in the main output window" msgstr "Marque para ecoar os comandos enviados na janela principal de saída." #: src/dlgEditWorld.glade:2451 msgid "_Store commands between sessions" msgstr "_Salvar comandos entre sessões" #: src/dlgEditWorld.glade:2456 msgid "Check to have the command history saved in a file between sessions" msgstr "Marque para salvar os comandos entre sessões." #: src/dlgEditWorld.glade:2468 msgid "Never _hide the typed text" msgstr "Nunca _ocultar texto digitado" #: src/dlgEditWorld.glade:2473 msgid "" "Check this if the text you type is displayed as black dots in the input box." msgstr "" "Marque se tudo o que você digita aparece como pontos pretos na caixa de " "entrada." #: src/dlgEditWorld.glade:2489 msgid "_Number of commands to save in history:" msgstr "_Número de comandos para salvar no histórico:" #: src/dlgEditWorld.glade:2503 msgid "Specify the number of commands that are saved and can be later recalled" msgstr "" "Especifique o número de comandos que são salvos e podem ser recuperados " "depois" #: src/dlgEditWorld.glade:2526 msgid "C_ommand separator:" msgstr "Separador de c_omandos:" #: src/dlgEditWorld.glade:2540 msgid "Specify the separator for commands typed in the command entry box" msgstr "" "Especifique o separador de comandos digitados na caixa de entrada de comandos" #: src/dlgEditWorld.glade:2558 msgid "Use single-_line input bar" msgstr "Barra de entrada com _uma única linha" #: src/dlgEditWorld.glade:2594 msgid "Enable _auto-completion" msgstr "Habilitar _auto-compleção" #: src/dlgEditWorld.glade:2599 msgid "Check to enable command auto-completion (based on previous commands)" msgstr "" "Marque para completar automaticamente os comandos digitados (baseado em " "comandos anteriores)" #: src/dlgEditWorld.glade:2617 msgid "Acti_vate auto-completion only after" msgstr "Ati_var auto-compleção somente após" #: src/dlgEditWorld.glade:2631 msgid "" "Specify the number of characters that must be typed for command completion " "to start" msgstr "" "Especifique o número de caracteres que devem ser digitados para iniciar a " "completar comandos automaticamente" #: src/dlgEditWorld.glade:2645 msgid "characters have been entered" msgstr "caracteres terem sido digitados" #: src/dlgEditWorld.glade:2670 msgid "Use _multi-line input bar" msgstr "Barra de entrada com _múltiplas linhas" #: src/dlgEditWorld.glade:2711 msgid "N_umber of lines:" msgstr "Núm_ero de linhas:" #: src/dlgEditWorld.glade:2746 msgid "S_pell check typed text" msgstr "_Verificar ortografia do texto digitado" #: src/dlgEditWorld.glade:2779 msgid "Language code:" msgstr "Código da língua:" #: src/dlgEditWorld.glade:2803 msgid "(Leave blank for default based on locale)" msgstr "(Deixe em branco para padrão baseado no locale)" #: src/dlgEditWorld.glade:2885 msgid "Select the font used in the command _entry box:" msgstr "Selecione a fonte usada na caixa de _entrada de comandos:" #: src/dlgEditWorld.glade:2901 msgid "Select the font used in the command entry box" msgstr "Selecione a fonte usada na caixa de entrada de comandos" #: src/dlgEditWorld.glade:2935 msgid "Flood prevention" msgstr "Prevenção de Flood" #: src/dlgEditWorld.glade:2970 msgid "Do not allow the _same command to be sent" msgstr "Não _permitir que o mesmo comando seja enviado" #: src/dlgEditWorld.glade:2975 msgid "" "Check to prevent more than a given number of equal commands to be sent in a " "row (which can disconnect your character in some muds)" msgstr "" "Marque para evitar que mais que um determinado número de comandos iguais " "seja enviado em seqüência (o que pode desconectá-lo em alguns muds)" #: src/dlgEditWorld.glade:2990 msgid "Specify the maximum number of equal commands that can be sent in a row" msgstr "" "Especifique o número máximo de comandos iguais que podem ser enviados em " "seqüência" #: src/dlgEditWorld.glade:3004 msgid "_times in a row" msgstr "_vezes em seqüência" #: src/dlgEditWorld.glade:3028 msgid "Se_nd this command:" msgstr "E_nviar este comando:" #: src/dlgEditWorld.glade:3042 msgid "" "Enter a command to be sent whenever the specified maximum number of equal " "commands would be sent" msgstr "" "Entre o comando para ser enviado toda vez que o número máximo de comandos " "iguais fosse ser enviado" #: src/dlgEditWorld.glade:3104 msgid "Logging Status" msgstr "Estado do Log" #: src/dlgEditWorld.glade:3152 msgid "St_art" msgstr "Começ_ar" #: src/dlgEditWorld.glade:3195 msgid "_Include the last" msgstr "_Incluir as últimas" #: src/dlgEditWorld.glade:3200 msgid "Select to include lines from the main window in the log file." msgstr "Selecione para incluir linhas da janela principal no arquivo de log" #: src/dlgEditWorld.glade:3214 msgid "Inform number of lines to include in the log." msgstr "Informe o número de linhas para incluir no log." #: src/dlgEditWorld.glade:3229 msgid "lines of the scrollback buffer in the log" msgstr "linhas do buffer de rolagem no log" #: src/dlgEditWorld.glade:3268 src/dlgEditWorld.glade:4377 msgid "File" msgstr "Arquivo" #: src/dlgEditWorld.glade:3348 msgid "" "Note: You can use strftime() escapes to create different files based on the " "date and time that logging starts. Also, %Kw represents the World name and " "%Kc the character name used in auto-logon." msgstr "" "Nota: É possível usar seqüências da função strftime() para que o nome do " "arquivo inclua a data e/ou hora em que o log é iniciado. Além disso, %Kw " "representa o nome do mundo e %Kc o personagem usado no auto-logon." #: src/dlgEditWorld.glade:3381 msgid "Options" msgstr "Opções" #: src/dlgEditWorld.glade:3411 msgid "A_utomatically start logging when connected" msgstr "Inicilar log a_utomaticamente quando conectado" #: src/dlgEditWorld.glade:3417 msgid "" "If this is selected, logging will be automatically started whenever you " "connect to the world." msgstr "" "Se estiver selecionada, o log será automaticamente iniciado sempre que você " "se conectar a este mundo." #: src/dlgEditWorld.glade:3427 msgid "Prefix lines with _date and/or time" msgstr "Incluir _data e/ou hora" #: src/dlgEditWorld.glade:3433 msgid "" "Select this if you want to prefix each line in the log file with the date " "and/or time it was received." msgstr "" "Selecione esta opção se você deseja colocar no início de cada linha a data e/" "ou hora em que a linha foi recebida." #: src/dlgEditWorld.glade:3461 msgid "_Format:" msgstr "_Formato:" #: src/dlgEditWorld.glade:3474 msgid "" "The default is to prefix lines with the date and time, but you can configure " "the format with strftime() escape sequences. See the manual for a " "description of those." msgstr "" "Por padrão, é a adicionada a data e hora, mas é possível configurar o " "formato com seqüências da função strftime(). Consulte o manual para uma " "explicação mais detalhada." #: src/dlgEditWorld.glade:3483 msgid "Revert to _default" msgstr "Reverter ao _padrão" #: src/dlgEditWorld.glade:3549 msgid "Scripting" msgstr "Scripts" #: src/dlgEditWorld.glade:3585 msgid "_Perl file to load:" msgstr "Arquivo _Perl para carregar:" #: src/dlgEditWorld.glade:3608 src/dlgMLSend.glade:80 msgid "_Clear" msgstr "_Limpar" #: src/dlgEditWorld.glade:3675 msgid "Plugins Currently Loaded" msgstr "Plugins carregados" #: src/dlgEditWorld.glade:3754 msgid "_Load" msgstr "_Carregar" #: src/dlgEditWorld.glade:3821 msgid "Plugins Loaded on Startup" msgstr "Plugins carregados na inicialização" #: src/dlgEditWorld.glade:3987 msgid "MCCP (for compression)" msgstr "MCCP (para compressão)" #: src/dlgEditWorld.glade:4017 msgid "_Enable if server proposes after connecting" msgstr "_Habilitar se o servidor propuser após a conexão" #: src/dlgEditWorld.glade:4033 msgid "Enable if server proposes at _any time" msgstr "H_abilitar se o servidor propuser a qualquer momento" #: src/dlgEditWorld.glade:4049 msgid "_Disable" msgstr "_Desabilitar" #: src/dlgEditWorld.glade:4110 msgid "Scrolling" msgstr "Rolagem" #: src/dlgEditWorld.glade:4141 msgid "Scroll on _output" msgstr "Rolar quando chega texto _novo" #: src/dlgEditWorld.glade:4146 msgid "" "Check to have the main window scroll to the end whenever new output comes" msgstr "" "Marque para que a janela seja movida para o fim sempre que novo texto chegar" #: src/dlgEditWorld.glade:4161 msgid "_Lines to save in scrollback buffer:" msgstr "_Linhas para salvar no buffer de rolagem:" #: src/dlgEditWorld.glade:4175 msgid "" "Specify the number of lines of output that can be seen with by scrolling the " "window" msgstr "" "Especifique o número de linhas da saída que podem ser vistas rolando a janela" #: src/dlgEditWorld.glade:4217 msgid "Name display" msgstr "Exibição do nome" #: src/dlgEditWorld.glade:4247 msgid "Identify as 'World name'" msgstr "Identificar como 'Nome do mundo'" #: src/dlgEditWorld.glade:4260 msgid "Identify as 'World name - Character'" msgstr "Identificar como 'Nome do mundo - Personagem'" #: src/dlgEditWorld.glade:4273 msgid "Identify as 'Character - World name'" msgstr "Identificar como 'Personagem - Nome do mundo'" #: src/dlgEditWorld.glade:4290 msgid "Custom: " msgstr "Personalizado: " #: src/dlgEditWorld.glade:4323 msgid "" "Use %Kw to represent the World's name, and %Kc to represent the auto-logon " "character name" msgstr "" "Use %Kw para representar o nome do mundo, e %Kc para representar o nome do " "personagem usado no auto-logon" #: src/dlgEditWorld.glade:4411 msgid "_File:" msgstr "_Arquivo:" #: src/dlgEditWorld.glade:4442 msgid "" "You can leave this field blank, and a file name will be automatically " "generated. Only edit this field if you know what you are doing." msgstr "" "Você pode deixar esse campo em branco, e um nome de arquivo será gerado " "automaticamente. Edite esse campo apenas se souber o que está fazendo." #: src/dlgEditWorld.glade:4475 msgid "Character Set" msgstr "Conjunto de caracteres" #: src/dlgEditWorld.glade:4504 msgid "Character _set:" msgstr "Co_njunto de caracteres:" #: src/dlgEditWorld.glade:4549 msgid "Graphical Editors" msgstr "Editores Gráficos" #: src/dlgEditWorld.glade:4579 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "Pedir confirmação _antes de apagar triggers, aliases, etc." #: src/dlgEditWorld.glade:4584 src/dlgEditWorld.glade:4675 msgid "" "If not checked, objects such as triggers, aliases, etc. will be deleted " "directly without asking for confirmation when you press the Delete button." msgstr "" "Se não estiver marcado, objetos tais como triggers, aliases, etc. serão " "apagados diretamente sem pedir confirmação quando você aperta o botão " "Deletar." #: src/dlgEditWorld.glade:4597 msgid "_Show items defined by plugins" msgstr "_Mostrar itens definidos por plugins" #: src/dlgEditWorld.glade:4602 msgid "" "If checked, triggers, aliases, macros and timers defined in plugins will " "appear in the corresponding World Editor sections." msgstr "" "Se marcado, triggers, aliases, macros e timers definidos por plugins " "aparecerão nas seções correspondentes do Editor de Mundos" #: src/dlgEditWorld.glade:4640 msgid "TCP Keep Alive" msgstr "Keep Alive TCP" #: src/dlgEditWorld.glade:4670 msgid "Enable TCP _Keep Alive packets" msgstr "Habilitar pacotes TCP _Keep Alive" #: src/dlgEditWorld.glade:4689 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "(Você precisa reconectar para alterações fazerem efeito)" #: src/dlgEditWorld.glade:4722 msgid "Input" msgstr "Entrada" #: src/dlgEditWorld.glade:4752 msgid "_Disable up and down arrow keys for history navigation" msgstr "_Desabilitar as setas para navegar no histórico" #: src/dlgEditWorld.glade:4757 msgid "" "If checked, the up and down arrow keys are not used for navigating between " "saved commands. (You'll have to use Alt+up and Alt+down.)" msgstr "" "Se marcado, as setas para cima e para baixo não serão usadas para\n" "navegar entre os comandos salvos no histórico. (Será necessário usar\n" "Alt+Acima e Alt+abaixo.)" #: src/dlgTestTriggers.glade:24 msgid "Enter _line to be matched against the triggers:" msgstr "Entre a _linha para ser comparada com os triggers:" #: src/dlgTestTriggers.glade:41 msgid "" "The text entered here will be matched against triggers as if it were a line " "coming from the MUD" msgstr "" "Os triggers serão testados com o texto digitado aqui, como se fosse uma " "linha recebida do MUD" #: src/dlgTestTriggers.glade:51 src/dlgMLSend.glade:321 #: src/dlgCmdHistory.glade:241 msgid "_Send" msgstr "_Enviar" #: src/dlgTestTriggers.glade:56 msgid "Click the run the triggers against the line." msgstr "Clique para testar os triggers com a linha." #: src/dlgTestTriggers.glade:90 msgid "Number of triggers that matched:" msgstr "Número de triggers disparados:" #: src/dlgTestTriggers.glade:119 msgid "Commands that would be sent:" msgstr "Comandos que seriam enviados:" #: src/dlgTestTriggers.glade:151 msgid "This is what would be printed in the main screen:" msgstr "Isso é o que seria mostrado na janela principal:" #: src/dlgTestTriggers.glade:163 msgid "" "This is what would be printed in the main screen. If empty, the line has " "been gaged. It can be different from the original line because of rewriter " "triggers." msgstr "" "Isso é o que seria impresso na janela principal. Se estiver vazio, a linha " "foi omitida. A linha pode ser diferente da original por causa de triggers " "reescritores." #: src/dlgTestTriggers.glade:180 msgid "Would this line be included in the log file?" msgstr "Essa linha seria escrita no arquivo de log?" #: src/dlgMLSend.glade:7 msgid "Multi-line send" msgstr "Enviar múltiplas linhas" #: src/dlgMLSend.glade:20 msgid "Send this text _initially:" msgstr "Enviar esse texto _inicialmente:" #: src/dlgMLSend.glade:42 src/dlgMLSend.glade:127 msgid "Enter some text to be sent to the World" msgstr "Entre com algum texto para ser enviado ao Mundo" #: src/dlgMLSend.glade:55 msgid "Then send the _contents of this file:" msgstr "Então enviar o conteúdo desse _arquivo:" #: src/dlgMLSend.glade:105 msgid "_Finally, send this text:" msgstr "_Finalmente, enviar esse texto:" #: src/dlgMLSend.glade:150 msgid "Add this to the _beginning of each line:" msgstr "Adicionar isso ao c_omeço de cada linha" #: src/dlgMLSend.glade:165 msgid "Specify some text to be prepended to each sent line" msgstr "" "Especifique algum texto para ser anexado ao começo de cada linha enviada" #: src/dlgMLSend.glade:179 msgid "Add this to the _end of each line:" msgstr "Adicionar isso ao f_im de cada linha:" #: src/dlgMLSend.glade:194 msgid "Specify some text to be appended to each sent line" msgstr "Especifique algum texto para ser anexado ao fim de cada linha enviada" #: src/dlgMLSend.glade:210 msgid "_Delay" msgstr "A_guardar" #: src/dlgMLSend.glade:224 msgid "Specify the delay between sending the group of lines" msgstr "Especifique a espera entre o envio de cada grupo de linhas" #: src/dlgMLSend.glade:239 msgid "seconds e_ach" msgstr "segundos ca_da" #: src/dlgMLSend.glade:253 msgid "Specify how many lines are sent at once" msgstr "Especifique quantas linhas são mandadas de cada vez" #: src/dlgMLSend.glade:267 msgid "line(s)" msgstr "linha(s)" #: src/dlgMLSend.glade:285 msgid "_Keep dialog open after sending" msgstr "_Manter janela aberta após envio" #: src/dlgCmdHistory.glade:7 msgid "Command History" msgstr "Histórico de Comandos" #: src/dlgCmdHistory.glade:51 msgid "Find a command containing a given search term" msgstr "Procura por um comando contendo um determinado texto" #: src/dlgCmdHistory.glade:63 msgid "Find _next" msgstr "Encontrar _próximo" #: src/dlgCmdHistory.glade:69 msgid "Find the next command with the same match text" msgstr "Procura pelo próximo comando com o mesmo texto" #: src/dlgCmdHistory.glade:107 msgid "Dela_y" msgstr "A_guardar" #: src/dlgCmdHistory.glade:120 msgid "Specify the delay between sending the group of commands" msgstr "Especifique a espera entre o envio de cada grupo de comandos" #: src/dlgCmdHistory.glade:135 msgid "sec_onds each" msgstr "segundos ca_da" #: src/dlgCmdHistory.glade:149 msgid "Specify how many commands are sent at once" msgstr "Especifique quantos comandos são mandadas de cada vez" #: src/dlgCmdHistory.glade:163 msgid "commands(s)" msgstr "comando(s)" #: src/dlgCmdHistory.glade:184 msgid "Newest commands are on the top" msgstr "Comandos mais novos estão no topo" #: src/dlgCmdHistory.glade:205 msgid "_Recall" msgstr "_Recuperar" #: src/dlgCmdHistory.glade:211 msgid "Put the selected command in the command entry box" msgstr "Colocar comando na caixa de entrada de comandos" #: src/dlgCmdHistory.glade:223 msgid "Rec_all & Close" msgstr "Recuper_ar & Fechar" #: src/dlgCmdHistory.glade:229 msgid "Put the selected command in the command entry box and close this dialog" msgstr "Colocar comando na caixa de entrada de comandos e fechar essa janela" #: src/dlgCmdHistory.glade:247 msgid "Send the selected command(s) to the mud" msgstr "Envia o(s) comando(s) selecionados ao mud" #: src/dlgCmdHistory.glade:259 msgid "S_end & Close" msgstr "E_nviar & Fechar" #: src/dlgCmdHistory.glade:265 msgid "Send the selected command(s) to the mud and close the dialog" msgstr "Envia o(s) comando(s) selecionados ao mud e fecha esta janela" #: src/dlgCmdHistory.glade:305 msgid "Find Command" msgstr "Encontrar Comando" #: src/dlgCmdHistory.glade:321 msgid "_Text to find:" msgstr "_Texto para procurar:" #: src/dlgCmdHistory.glade:334 msgid "Enter the text to search for" msgstr "Entre o texto para procurar" #: src/dlgCmdHistory.glade:353 msgid "Search direction:" msgstr "Direção da busca:" #: src/dlgCmdHistory.glade:367 msgid "_Downwards" msgstr "Para _baixo" #: src/dlgCmdHistory.glade:383 msgid "_Upwards" msgstr "Para _cima" #: src/mnuPopupURL.glade:8 msgid "Open Link" msgstr "Abrir link" #: src/mnuPopupURL.glade:23 msgid "Copy Link Address" msgstr "Copiar endereço do link" #: share/kildclient.pl:76 share/kildclient.pl:97 share/kildclient.pl:117 #: share/kildclient.pl:182 share/kildclient.pl:433 share/kildclient.pl:511 #: share/kildclient.pl:589 share/kildclient.pl:602 share/kildclient.pl:615 #: share/kildclient.pl:628 share/kildclient.pl:641 share/kildclient.pl:654 #: share/kildclient.pl:667 share/kildclient.pl:680 share/kildclient.pl:694 #: share/kildclient.pl:708 share/kildclient.pl:718 share/kildclient.pl:730 #: share/kildclient.pl:742 share/kildclient.pl:754 share/kildclient.pl:767 #: share/kildclient.pl:983 share/kildclient.pl:1016 #, perl-format msgid "%s: Too few arguments." msgstr "%s: Muito poucos argumentos." #: share/kildclient.pl:207 share/kildclient.pl:567 #, perl-format msgid "No such %s" msgstr "Não existe tal %s" #: share/kildclient.pl:298 share/kildclient.pl:316 share/kildclient.pl:334 #: share/kildclient.pl:352 share/kildclient.pl:370 #, perl-format msgid "%s: Wrong number of arguments." msgstr "%s: Número errado de argumentos." #: share/kildclient.pl:403 share/kildclient.pl:411 share/kildclient.pl:489 #: share/kildclient.pl:497 #, perl-format msgid "No such %s." msgstr "Não existe tal %s." #: share/kildclient.pl:425 #, perl-format msgid "No %s deleted." msgstr "Nenhum %s apagado." #: share/kildclient.pl:427 #, perl-format msgid "One %s deleted." msgstr "Um %s apagado." #: share/kildclient.pl:429 #, perl-format msgid "%d %s deleted." msgstr "%d %s apagados." #: share/kildclient.pl:506 #, perl-format msgid "Successfully moved %s." msgstr "Sucesso ao mover %s." #: share/kildclient.pl:798 msgid "Could not open file." msgstr "Não foi possível abrir o arquivo." #: share/kildclient.pl:828 msgid "Unknown" msgstr "Desconhecido" #: share/kildclient.pl:835 msgid "Invalid plugin file." msgstr "Arquivo de plugin inválido." #: share/kildclient.pl:866 msgid "Plugin already loaded. Try enabling it." msgstr "Plugin já carregado. Tente habilitá-lo." #: share/kildclient.pl:868 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "Versão %s desse plugin já está carregada." #: share/kildclient.pl:878 #, perl-format msgid "Error in plugin file: %s" msgstr "Erro no arquivo de plugin: %s" #: share/kildclient.pl:890 msgid "Cannot load a plugin in another world." msgstr "Não é possível carregar um plugin em outro mundo." #: share/kildclient.pl:895 share/kildclient.pl:915 msgid "Plugin not specified" msgstr "Plugin não especificado." #: share/kildclient.pl:902 share/kildclient.pl:933 msgid "Plugin not loaded." msgstr "Plugin não carregado." #: share/kildclient.pl:905 #, perl-format msgid "Plugin '%s' loaded." msgstr "Plugin '%s' carregado." #: share/kildclient.pl:921 #, perl-format msgid "Could not load plugin %s" msgstr "Impossível carregar plugin %s" #: share/kildclient.pl:997 msgid "Plugin enabled." msgstr "Plugin habilitado." #: share/kildclient.pl:1030 msgid "Plugin disabled." msgstr "Plugin desabilitado." #: share/kildclient.pl:1150 msgid "Cannot open help file." msgstr "Não foi possível abrir o arquivo de ajuda." #: share/kildclient.pl:1168 msgid "Help topic not found." msgstr "Tópico de ajuda não encontrado." #: share/kildclient.pl:1174 msgid "" "Warning: the getwindowsize() function is deprecated and will be removed." msgstr "Aviso: a função getwindowsize() será removida no futuro." #: share/kildclient.pl:1175 msgid "Use $window->getsize() instead." msgstr "Use $window->getsize() no lugar dela." #: share/kildclient.pl:1180 msgid "Warning: the minimize() function is deprecated and will be removed." msgstr "Aviso: a função minimize() será removida no futuro." #: share/kildclient.pl:1181 msgid "Use $window->minimize() instead." msgstr "Use $window->minimize() no lugar dela." #: share/kildclient.pl:1186 msgid "Warning: the path() function is deprecated and will be removed." msgstr "Aviso: a função path() será removida no futuro." #: share/kildclient.pl:1187 msgid "Use $world->path() instead." msgstr "Use $world->path() no lugar dela." #~ msgid "Maximum" #~ msgstr "Máximo" #~ msgid "None" #~ msgstr "Nada" #~ msgid "Background" #~ msgstr "Fundo" #~ msgid "_Image:" #~ msgstr "_Imagem:" #~ msgid "_None: use solid color" #~ msgstr "_Nenhum: usar cor sólida" #~ msgid "_Shade image or transparent background:" #~ msgstr "_Escurecer imagem ou fundo transparente:" #~ msgid "_Transparent" #~ msgstr "_Transparente" kildclient-2.11.1/po/eo.po0000644000175000017500000025510411570463465012242 00000000000000# KildClient messages in Esperanto # Copyright (C) 2004-2011 Eduardo M Kalinowski # This file is distributed under the same license as the KildClient package. # msgid "" msgstr "" "Project-Id-Version: KildClient 2.11.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-05-29 12:33-0300\n" "PO-Revision-Date: 2011-05-28 11:17-0300\n" "Last-Translator: Eduardo M Kalinowski \n" "Language-Team: Eduardo M Kalinowski \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/main.c:76 msgid "Outputs version information and exits" msgstr "Monstras eldoninformadon kaj eliras" #: src/main.c:78 msgid "Directory to store settings and saved worlds" msgstr "Dosierujo por konservi la konfiguron kaj konservitajn mondojn" #: src/main.c:78 msgid "DIR" msgstr "DOSIERUJO" #: src/main.c:80 msgid "" "Dumps all data received from (after decompression, if appropriate) to the " "file" msgstr "Åœuti ĉio riĉevita (post malkompatigo, se necesas) al dosiero" #: src/main.c:81 src/main.c:84 msgid "FILE" msgstr "DOSIERO" #: src/main.c:83 msgid "Dumps all data received (possibly compressed) to the file" msgstr "Åœuti ĉio riĉevita (antaÅ­ malkompatigo, se necesas) al dosiero" #. Parse command-line options #: src/main.c:122 msgid "[WORLD...]" msgstr "[MONDO...\\" #: src/main.c:129 #, c-format msgid "Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" msgstr "Skribita da Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" #: src/main.c:134 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "Ne eblas malfermi Åutdosieron %s: %s\n" #: src/main.c:141 #, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "Ne eblas malfermi kruddataÅutdosieron %s: %s\n" #: src/main.c:287 msgid "There is one open world. Do you really want to quit?" msgstr "Estas unu malfermata mondo. Ĉu vi vere volas eliri?" #: src/main.c:293 #, c-format msgid "There are %d open worlds. Do you really want to quit?" msgstr "Estas %d malfermataj mondoj. Ĉu vi vere volas eliri?" #: src/main.c:296 msgid "Really Quit KildClient?" msgstr "Vere eliri KildClient?" #: src/main.c:298 msgid "Don't quit" msgstr "Ne eliri" #: src/net.c:150 msgid "" "You're attempting to connect to a world that uses SSL, but this version of " "KildClient has been built without SSL support. Try to connect without SSL?" msgstr "" "Vi provas konekti al mondo kiu uzas SSL, sed ĉi tiu eldono de KildClient ne " "havas SSL subtenon. Konekti sen SSL?" #: src/net.c:151 msgid "KildClient Question" msgstr "Demando - KildClient" #: src/net.c:153 msgid "Connect without SSL" msgstr "Konekti sen SSL" #: src/net.c:154 msgid "Do not connect" msgstr "Ne konekti" #: src/net.c:168 msgid "This version of KildClient does not have SSL support." msgstr "Ĉi tiu eldono de KildClient ne havas SSL subtenon." #: src/net.c:238 src/proxy.c:206 #, c-format msgid "Resolving proxy host %s..." msgstr "Serĉante prokurservilon %s..." #: src/net.c:241 #, c-format msgid "Resolving host %s..." msgstr "Serĉante retnodon %s..." #: src/net.c:272 src/proxy.c:224 msgid "Could not start name-resolution thread." msgstr "Ne eblas Åalti nomo-serĉado." #: src/net.c:324 src/proxy.c:190 #, c-format msgid "Could not resolve host %s: %s" msgstr "Ne eblas trovi retnodon %s: %s" #: src/net.c:352 #, c-format msgid "Attempting to connect to host %s (%s) port %s..." msgstr "Provante koneti al retnodo %s (%s) pordo %s..." #: src/net.c:355 #, c-format msgid "Attempting to connect to proxy host %s (%s) port %s..." msgstr "Provante koneti al prokurservilon %s (%s) pordo %s..." #: src/net.c:374 #, c-format msgid "Could not create socket: %s" msgstr "Ne eblas krei kontaktoskatolon: %s" #: src/net.c:377 #, c-format msgid "Could not create socket: error #%d" msgstr "Ne eblas krei kontaktoskatolon: eraro #%d" #: src/net.c:397 #, c-format msgid "Could not connect to host %s port %s: %s" msgstr "Ne eblas konekti al retnodo %s pordo %s: %s" #: src/net.c:407 #, c-format msgid "Could not connect to host %s port %s: Error #%d" msgstr "Ne eblas konekti al retnodo %s pordo %s: Eraro #%d" #: src/net.c:463 #, c-format msgid "Unable to connect to host %s: %s." msgstr "Ne eblas konekti al retnodo %s: %s" #: src/net.c:466 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "Ne eblas konekti al prokurservilon %s: %s" #: src/net.c:508 src/net.c:526 #, c-format msgid "Unable to connect to host %s: Error #%d." msgstr "Ne eblas konekti al retnodo %s: Eraro #%d." #: src/net.c:511 src/net.c:529 #, c-format msgid "Unable to connect to proxy host %s: Error #%d." msgstr "Ne eblas konekti al prokurservilon %s: Eraro #%d." #: src/net.c:563 #, c-format msgid "Performing SSL handshake..." msgstr "Iniciante SSL..." #: src/net.c:613 #, c-format msgid "SSL Handshake failed: %s" msgstr "SSL Negociado ne funkciis: %s" #: src/net.c:655 #, c-format msgid "SSL Handshake took too long." msgstr "SSL Negociado daÅ­ris tre longe." #: src/net.c:684 src/net.c:1510 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "Konektata al retnodo %s (%s) pordo %s." #: src/net.c:687 src/net.c:1513 #, c-format msgid "Connected to host %s port %s, via proxy %s (%s) port %s." msgstr "" "Konektata al retnodo %s pordo %s, pere de prokurservilo %s (%s) pordo %s." #: src/net.c:694 src/net.c:1485 src/net.c:1520 msgid " SSL enabled." msgstr "SSL ebligita." #: src/net.c:712 src/perlscript.c:3069 #, c-format msgid "Logging to file %s.\n" msgstr "Registrado komencita al la dosiero %s.\n" #: src/net.c:858 #, c-format msgid "Disconnected from host %s." msgstr "Malkonektita el retnodo %s." #: src/net.c:931 src/net.c:940 #, c-format msgid "Disconnected from host %s: %s." msgstr "Malkonektita el retnodo %s: %s." #: src/net.c:951 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "Malkonektita el retnodo %s: eraro #%d." #: src/net.c:1473 #, c-format msgid "Connected to host %s (%s) port %s, MCCP version %d enabled." msgstr "Konektata al retnodo %s (%s) pordo %s, MCCP eldono %d ebligata." #: src/net.c:1477 #, c-format msgid "" "Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d " "enabled." msgstr "" "Konektata al retnodo %s pordo %s, pere de prokurservilo %s (%s) pordo %s, " "MCCP eldono %d ebligata." #: src/net.c:1598 src/we_logging.c:135 msgid "Not connected." msgstr "Ne konektata." #. success #: src/proxy.c:61 msgid "general failure" msgstr "Äenerala malfunkciado" #: src/proxy.c:62 msgid "connection not allowed by ruleset" msgstr "konekto ne permesita de la regularo" #: src/proxy.c:63 msgid "network unreachable" msgstr "reto ne atingebla" #: src/proxy.c:64 msgid "host unreachable" msgstr "retnodo ne atingebla" #: src/proxy.c:65 msgid "connection refused by destination host" msgstr "konekto rifuzita de la destina retnodo" #: src/proxy.c:66 msgid "TTL expired" msgstr "TTL finiÄita" #: src/proxy.c:67 msgid "command not supported / protocol error" msgstr "komando ne subtenata / protokoleraro" #: src/proxy.c:68 msgid "address type not supported" msgstr "adrestipo ne subtenata" #: src/proxy.c:241 #, c-format msgid "Connected to proxy server %s port %s, sending request..." msgstr "Konektata al prokurservilo %s pordo %s, sendante konektpeton...." #: src/proxy.c:296 src/proxy.c:425 src/proxy.c:470 src/proxy.c:544 msgid "Error while reading from proxy host." msgstr "Eraru dum legado el la prokurservilo." #: src/proxy.c:317 msgid "request rejected or failed" msgstr "konektpeto malakceptita aÅ­ malsukcesita" #: src/proxy.c:321 msgid "request failed because identd could not be reached" msgstr "konkektpeto malsukcesis ĉar identd ne povis esti atingita" #: src/proxy.c:325 msgid "" "request failed because client's identd could not confirm the user ID string " "in the request" msgstr "" "konektpeto malsukcesis ĉar identd de kliento ne povis konfirmi la " "legitimilon en la konektpeto" #: src/proxy.c:329 src/proxy.c:570 #, c-format msgid "Proxy request failed: %s." msgstr "Prokura konektpeto malsukcesis: %s." #: src/proxy.c:346 #, c-format msgid "Connected to proxy server %s port %s, negotiating authentication..." msgstr "" "Konektata al prokurservilon %s pordo %s, negociante aÅ­tentokontrolon..." #: src/proxy.c:440 msgid "No acceptable proxy authentication methods." msgstr "NeniÅ­ akceptebla aÅ­tentokontrolmetodo por prokurservilo." #: src/proxy.c:488 msgid "Proxy authentication failed." msgstr "Prokurservila aÅ­tentokontrolo malsukcesis." #. Should never happen #: src/proxy.c:531 msgid "Unrecognized response from proxy host." msgstr "Malrekonebla respondo el prokurservilo." #: src/proxy.c:565 msgid "unknown reason code" msgstr "malkonata kodo." #: src/proxy.c:586 #, c-format msgid "Sending proxy authentication credentials..." msgstr "Sendante aÅ­tentokontrolajn akreditaĵojn al prokurservilo..." #: src/proxy.c:625 #, c-format msgid "Sending connection request..." msgstr "Sendante konketpeton..." #: src/mainwindow.c:173 src/mainwindow.c:550 src/mainwindow.c:815 #: src/worldgui.c:1127 src/worldselector.c:195 src/worldeditor.c:182 #: src/we_general.c:344 src/we_generic_guied.c:83 src/we_triggers.c:85 #: src/we_triggers.c:555 src/we_triggers.c:753 src/we_aliases.c:78 #: src/we_aliases.c:457 src/we_macros.c:81 src/we_macros.c:422 #: src/we_timers.c:78 src/we_timers.c:459 src/we_hooks.c:89 src/we_hooks.c:609 #: src/we_vars.c:78 src/we_vars.c:380 src/prefs.c:109 src/triggers.c:585 #: src/multilinesend.c:95 src/cmdhistory.c:209 src/cmdhistory.c:454 #, c-format msgid "Error loading UI from XML file: %s" msgstr "Eraro dum ÅarÄo de interfaco el XMLdosiero: %s" #: src/mainwindow.c:610 src/mainwindow.c:611 msgid "Not connected" msgstr "Ne konektata" #: src/mainwindow.c:751 msgid ": Not yet active" msgstr ": Ne ankoraÅ­ aktiva" #: src/mainwindow.c:756 msgid ": Expired" msgstr ": FiniÄita" #: src/mainwindow.c:768 src/dlgStatistics.glade:81 src/dlgStatistics.glade:346 msgid "None" msgstr "Neniu" #: src/worldgui.c:227 msgid "_Find:" msgstr "_Trovi:" #: src/worldgui.c:241 msgid "Find Next" msgstr "Trovi Proksiman" #: src/worldgui.c:273 msgid "Click to clear the command input area." msgstr "Klaku por forigi la tekston en la komandskatolo." #: src/worldgui.c:374 msgid "No world" msgstr "Neniu mondo" #: src/worldgui.c:448 msgid "KildClient ready" msgstr "KildClient preta" #: src/worldgui.c:455 msgid "0 lines" msgstr "0 linioj" #: src/worldgui.c:910 msgid "Are you sure you want to close this world?" msgstr "Ĉu vi vere volas fermi ĉi tiun mondon?" #: src/worldgui.c:911 msgid "Really close?" msgstr "Vere fermi?" #. Keep Open is RESPONSE_NO because of NO close. But we use #. STOCK_YES to pass a positive image. #: src/worldgui.c:914 msgid "Keep _open" msgstr "Teni _malfermata" #: src/worldgui.c:1058 #, c-format msgid "Error setting spell checker: %s\n" msgstr "Eraro en konfigurado de literumilo: %s\n" #: src/worldgui.c:1062 msgid "Spell checking support not included in this build." msgstr "Literumado ne estas subtenata en ĉi tiu eldono." #: src/worldgui.c:1341 msgid "Click to open link; right-click for more options." msgstr "" "Klaku por malfermi; klaku kun la dekstra butono por pluraj alternativoj" #: src/worldgui.c:1503 msgid "Not found" msgstr "Ne trovata" #: src/ansitextview.c:438 msgid "1 line" msgstr "1 linio" #: src/ansitextview.c:440 #, c-format msgid "%d lines" msgstr "%d linioj" #: src/worldselector.c:140 src/worldselector.c:690 #, c-format msgid "Could not load world from file '%s': %s" msgstr "Ne eblas ÅarÄi mondon el dosiero '%s': %s" #: src/worldselector.c:143 src/worldselector.c:693 src/worlds.c:2284 #: src/we_generic_guied.c:312 src/we_generic_guied.c:401 src/prefs.c:451 #: src/prefs.c:530 msgid "KildClient Error" msgstr "Eraro - KildClient" #: src/worldselector.c:496 #, c-format msgid "Could not open world '%s': %s\n" msgstr "Ne eblas malfermi mondon '%s': %s\n" #: src/worldselector.c:538 #, c-format msgid "Invalid argument '%s'\n" msgstr "Argumento '%s' ne estas valida\n" #: src/worldselector.c:811 msgid "Disconnected" msgstr "Malkonektata" #: src/worldselector.c:814 src/worldselector.c:821 msgid "Reconnect" msgstr "Rekonekti" #: src/worldselector.c:815 src/worldselector.c:822 msgid "Connect to another world" msgstr "Konekti al alia mondo" #: src/worldselector.c:816 msgid "Offline" msgstr "Senkonekte" #: src/worlds.c:690 msgid "Unnamed world" msgstr "Mondo ne nomiÄata" #: src/worlds.c:747 #, c-format msgid "Could not open file: %s" msgstr "Ne eblas malfermi dosieron: %s" #: src/worlds.c:810 #, c-format msgid "Invalid top-level element '%s'" msgstr "Elemento '%s' invalida" #: src/worlds.c:1624 #, c-format msgid "Internal error: element '%s' ends when in START mode" msgstr "Interna eraro: elemento '%s' finiÄas en START reÄimo" #: src/worlds.c:1898 #, c-format msgid "Invalid key code '%s'" msgstr "Klavkodo '%s' invalida" #: src/worlds.c:1917 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "Elemento '%s' ne permisata ene elemento '%s'" #: src/worlds.c:1930 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "Atributo '%s' ne estas valida por elemento '%s'" #: src/worlds.c:2281 src/we_generic_guied.c:309 src/prefs.c:448 #, c-format msgid "Could not open file '%s': %s" msgstr "Ne eblas malfermi dosieron '%s': %s" #: src/worlds.c:2440 #, c-format msgid "Disconnected from world %s" msgstr "Malkonektita el mondo %s" #: src/worldeditor.c:247 msgid "General" msgstr "Äœenerala" #: src/worldeditor.c:255 src/worldeditor.c:259 msgid "Display" msgstr "Apero" #: src/worldeditor.c:256 msgid "Here you can set options to configure the appearance of KildClient." msgstr "Ĉi tie vi povas agordi opciojn por konfiguri la aperon de KildClient." #: src/worldeditor.c:267 msgid "Main Window" msgstr "Ĉeffenestro" #: src/worldeditor.c:275 msgid "Colors" msgstr "Koloroj" #: src/worldeditor.c:283 msgid "Status Bar" msgstr "Stata breto" #: src/worldeditor.c:291 msgid "Input" msgstr "Enigo" #: src/worldeditor.c:299 msgid "Logging" msgstr "Registrado" #: src/worldeditor.c:305 src/worldeditor.c:309 msgid "Automation" msgstr "AÅ­tomatizo" #: src/worldeditor.c:306 msgid "" "Here you can set options to configure the automation features of KildClient, " "such as triggers, aliases, plugins, etc." msgstr "" "Ĉi tie vi povas agordi opciojn por konfiguri la aÅ­tomatizfunkciojn de " "KildClient, kiel triggers, aliases, plugins, ktp." #: src/worldeditor.c:317 msgid "Scripting" msgstr "Skriptdosiero" #: src/worldeditor.c:325 msgid "Plugins" msgstr "Plugins" #: src/worldeditor.c:336 src/kildclient.glade:1808 msgid "Triggers" msgstr "Triggers" #: src/worldeditor.c:347 src/kildclient.glade:1822 msgid "Aliases" msgstr "Aliases" #: src/worldeditor.c:358 src/kildclient.glade:1838 msgid "Macros" msgstr "Macros" #: src/worldeditor.c:369 src/kildclient.glade:1854 msgid "Timers" msgstr "Timers" #: src/worldeditor.c:380 msgid "Hooks" msgstr "Hokoj" #: src/worldeditor.c:391 msgid "Variables" msgstr "Variabloj" #: src/worldeditor.c:400 msgid "Protocols" msgstr "Protokoloj" #: src/worldeditor.c:408 msgid "Miscellaneous" msgstr "Alispecaj" #: src/worldeditor.c:416 msgid "Advanced" msgstr "Avancita" #: src/we_general.c:75 msgid "Character" msgstr "Rolulo" #: src/we_general.c:83 msgid "Password" msgstr "Pasvorto" #: src/we_general.c:383 msgid "You must specify the name." msgstr "Vi devas informi la nomon." #: src/we_general.c:384 src/we_general.c:397 src/we_triggers.c:638 #: src/we_triggers.c:652 src/we_aliases.c:519 src/we_aliases.c:532 #: src/we_macros.c:479 src/we_macros.c:492 src/we_macros.c:505 #: src/we_timers.c:518 src/we_timers.c:531 src/we_hooks.c:661 #: src/we_vars.c:408 src/we_vars.c:420 src/we_vars.c:440 #: src/permanentvariables.c:131 src/cmdhistory.c:278 src/cmdhistory.c:290 #: src/cmdhistory.c:484 src/cmdhistory.c:517 src/cmdhistory.c:574 msgid "KildClient Warning" msgstr "Averto - KildClient" #: src/we_general.c:396 msgid "You must specify the password." msgstr "Vi devas informi la passvorton.." #: src/we_general.c:438 msgid "character" msgstr "rolulo" #: src/we_logging.c:124 #, c-format msgid "Logging to file %s." msgstr "Registrado aktiva al dosiero %s." #: src/we_logging.c:130 msgid "Logging is disabled." msgstr "Registrabo malaktiva." #: src/we_logging.c:227 msgid "Logging not started" msgstr "Registrado ne komencata." #: src/we_logging.c:257 msgid "Select log file" msgstr "Elektu Registradodosieron" #: src/we_plugins.c:126 src/we_plugins.c:343 src/we_triggers.c:227 #: src/we_aliases.c:208 src/we_macros.c:211 src/we_timers.c:208 #: src/we_hooks.c:330 src/perlscript.c:3195 msgid "Name" msgstr "Nomo" #: src/we_plugins.c:138 src/we_plugins.c:385 src/perlscript.c:3196 msgid "Description" msgstr "Priskribo" #: src/we_plugins.c:150 src/we_plugins.c:371 msgid "Author" msgstr "AÅ­toro" #: src/we_plugins.c:163 msgid "File" msgstr "Dosiero" #: src/we_plugins.c:211 src/we_plugins.c:467 msgid "Error Loading Plugin" msgstr "Eraro dum Åœargado de plugin" #: src/we_plugins.c:329 src/we_triggers.c:213 src/we_aliases.c:194 #: src/we_macros.c:197 src/we_timers.c:194 src/we_hooks.c:316 msgid "Enabled" msgstr "Ebligata" #: src/we_plugins.c:357 msgid "Version" msgstr "Eldono" #: src/we_plugins.c:445 msgid "Always load this plugin at _startup" msgstr "Ĉiam Åargi ĉi tiun plugin en _startigo" #: src/we_plugins.c:507 msgid "The help is displayed in main window." msgstr "La aiuto estas en la ĉeffenestro." #: src/we_plugins.c:508 msgid "KildClient Information" msgstr "Informo - KildClient" #: src/we_plugins.c:509 msgid "_Do not display this message again" msgstr "_Ne montri ĉi tiun mesaÄon denove" #: src/we_plugins.c:581 msgid "Load plugin" msgstr "Åœargi plugin" #: src/we_generic_guied.c:96 msgid "Export" msgstr "Eksporti" #: src/we_generic_guied.c:363 msgid "Import" msgstr "Importi" #: src/we_generic_guied.c:398 #, c-format msgid "Could not import file '%s': %s" msgstr "Ne eblas importi dosieron '%s': %s" #: src/we_generic_guied.c:952 #, c-format msgid "Do you really want to delete the %s?" msgstr "Ĉu vi vere volas eksigi la %s-n?" #: src/we_generic_guied.c:959 #, c-format msgid "Do you really want to delete %d %s?" msgstr "Ĉu vi vere volas eksigi %d %s?" #: src/we_generic_guied.c:963 src/we_vars.c:292 msgid "Confirm deletion" msgstr "Konfirmado de eksigo" #: src/we_generic_guied.c:964 msgid "Do not delete" msgstr "Ne eksigi" #: src/we_generic_guied.c:972 msgid "Delete" msgstr "Eksigi" #: src/we_triggers.c:132 src/dlgTestTriggers.glade:7 msgid "Test Triggers" msgstr "Testi Trigger-jn" #: src/we_triggers.c:241 src/we_aliases.c:222 src/triggers.c:449 #: src/aliases.c:171 msgid "Pattern" msgstr "Åœablono" #: src/we_triggers.c:259 src/we_aliases.c:240 msgid "I. Case" msgstr "I. Usk." #: src/we_triggers.c:273 src/we_macros.c:239 src/we_timers.c:248 #: src/we_hooks.c:344 src/triggers.c:450 src/macros.c:147 src/timers.c:205 msgid "Action" msgstr "Ago" #: src/we_triggers.c:291 msgid "Gag" msgstr "Gag" #: src/we_triggers.c:309 msgid "Gag Log" msgstr "Gag Log" #: src/we_triggers.c:327 msgid "Keep Exec" msgstr "_DaÅ­ri Ezek" #: src/we_triggers.c:345 msgid "Rewriter" msgstr "Reskribisto" #: src/we_triggers.c:363 msgid "Style" msgstr "Stilo" #: src/we_triggers.c:377 src/we_aliases.c:286 src/we_macros.c:253 #: src/we_timers.c:280 src/we_hooks.c:358 msgid "Plugin" msgstr "Plugin" #: src/we_triggers.c:473 share/kildclient.pl:233 share/kildclient.pl:236 #: share/kildclient.pl:443 share/kildclient.pl:518 share/kildclient.pl:721 msgid "trigger" msgstr "trigger" #: src/we_triggers.c:473 share/kildclient.pl:443 msgid "triggers" msgstr "triggers" #: src/we_triggers.c:637 src/we_aliases.c:518 msgid "You must specify the pattern." msgstr "Vi devas informi la Åablonon." #: src/we_triggers.c:651 msgid "" "You must specify the action, unless the trigger is a gag or changes the " "style." msgstr "" "Vi devas informi la agon, krom se trigger estas gag aÅ­ ÅanÄas la stilon." #: src/we_aliases.c:254 src/aliases.c:172 msgid "Substitution" msgstr "AnstataÅ­o" #: src/we_aliases.c:272 msgid "Eval as Perl" msgstr "Komp Perl" #: src/we_aliases.c:382 share/kildclient.pl:246 share/kildclient.pl:249 #: share/kildclient.pl:449 share/kildclient.pl:524 share/kildclient.pl:733 msgid "alias" msgstr "alias" #: src/we_aliases.c:382 share/kildclient.pl:449 msgid "aliases" msgstr "aliases" #: src/we_aliases.c:531 msgid "You must specify the substitution." msgstr "Vi devas informi la anstataÅ­on." #: src/we_macros.c:225 src/macros.c:146 msgid "Key" msgstr "Klavo" #: src/we_macros.c:349 share/kildclient.pl:259 share/kildclient.pl:262 #: share/kildclient.pl:455 share/kildclient.pl:530 share/kildclient.pl:745 msgid "macro" msgstr "macro" #: src/we_macros.c:349 share/kildclient.pl:455 msgid "macros" msgstr "macros" #: src/we_macros.c:478 msgid "You must specify the key." msgstr "Vi devas informi la klavon." #: src/we_macros.c:491 msgid "Invalid key code." msgstr "Invalida klavkodo." #: src/we_macros.c:504 src/we_timers.c:530 src/we_hooks.c:660 msgid "You must specify the action." msgstr "Vi devas informi la agon." #: src/we_timers.c:221 msgid "Interval" msgstr "Intervalo" #: src/we_timers.c:234 msgid "Count" msgstr "Fojoj" #: src/we_timers.c:266 msgid "Temp" msgstr "NedaÅ­ra" #: src/we_timers.c:383 share/kildclient.pl:272 share/kildclient.pl:275 #: share/kildclient.pl:461 share/kildclient.pl:536 share/kildclient.pl:757 msgid "timer" msgstr "timer" #: src/we_timers.c:383 share/kildclient.pl:461 msgid "timers" msgstr "timers" #: src/we_timers.c:517 msgid "The interval must be positive." msgstr "La intervalo devas esti pozitiva." #. The manually added combo for selecting which hook #: src/we_hooks.c:132 msgid "_Event:" msgstr "_Evento:" #: src/we_hooks.c:536 share/kildclient.pl:286 share/kildclient.pl:289 #: share/kildclient.pl:467 share/kildclient.pl:543 share/kildclient.pl:770 msgid "hook" msgstr "hoko" #: src/we_hooks.c:536 share/kildclient.pl:467 msgid "hooks" msgstr "hokoj" #: src/we_vars.c:283 msgid "Do you really want to make the variable temporary?" msgstr "Ĉu vi vere volas igi ĉi tiun variablon maldaÅ­ra?" #: src/we_vars.c:289 #, c-format msgid "Do you really want to make %d variables temporary?" msgstr "Ĉu vi vere volas igi %d variablojn maldaÅ­raj?" #: src/we_vars.c:293 msgid "Keep permanent" msgstr "Teni daÅ­ra" #: src/we_vars.c:301 msgid "Make temporary" msgstr "Igi maldaÅ­ra" #: src/we_vars.c:407 msgid "You must specify a variable name." msgstr "Vi devas informi variablnomon." #: src/we_vars.c:419 #, c-format msgid "" "Only scalar ($), array (@) and hash (%%) variables can be made permanent." msgstr "Nur skalara ($), array (@) kaj hash (%%) variabloj povas iÄi daÅ­raj." #: src/we_vars.c:438 #, c-format msgid "%s is already permanent." msgstr "%s jam estas daÅ­ra." #: src/prefs.c:401 #, c-format msgid "Invalid window size specification in config file.\n" msgstr "Invalida specifo de grandeco de la fenestro en konfigurdosiero.\n" #: src/prefs.c:421 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "Ne konata direktivo '%s' en konfigurdosiero.\n" #: src/prefs.c:527 #, c-format msgid "Could not create directory '%s': %s" msgstr "Ne eblas krei dosierujon '%s': %s" #: src/parser.c:148 msgid "" "Warning: Trying to send a very long command line. Perhaps a recursive alias " "definition?" msgstr "Averto: provante sendi tre grandan linion. Eble rekursia aliasdefino?" #: src/triggers.c:448 #, c-format msgid "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" msgstr "" #: src/triggers.c:470 src/triggers.c:471 src/triggers.c:472 src/triggers.c:473 #: src/triggers.c:474 src/triggers.c:475 src/triggers.c:476 src/aliases.c:192 #: src/aliases.c:193 src/aliases.c:194 src/macros.c:169 src/timers.c:228 #: src/timers.c:229 src/hooks.c:188 src/perlscript.c:3215 msgid "y" msgstr "j" #: src/triggers.c:470 src/triggers.c:471 src/triggers.c:472 src/triggers.c:473 #: src/triggers.c:474 src/triggers.c:475 src/triggers.c:476 src/aliases.c:192 #: src/aliases.c:193 src/aliases.c:194 src/macros.c:169 src/timers.c:228 #: src/timers.c:229 src/hooks.c:188 src/perlscript.c:3215 msgid "n" msgstr "n" #: src/triggers.c:668 msgid "No" msgstr "Ne" #: src/triggers.c:668 msgid "Yes" msgstr "Jes" #: src/aliases.c:170 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "" #: src/macros.c:145 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "" #: src/timers.c:197 msgid "Num Ena Temp Int " msgstr "" #: src/timers.c:201 msgid "Count " msgstr "Fojoj " #: src/permanentvariables.c:127 #, c-format msgid "" "Could not open file '%s': %s\n" "Variables were not saved." msgstr "" "Ne eblas malfermi dosieron '%s': %s\n" "Variabloj ne konserviÄis." #: src/hooks.c:62 #, c-format msgid "hook: hook '%s' not found\n" msgstr "hook: hoko '%s' ne trovata\n" #: src/hooks.c:78 src/hooks.c:211 msgid "No such hook" msgstr "Ne ekzistas tiun hokon." #: src/hooks.c:160 src/hooks.c:206 msgid "Hook not found" msgstr "Hoko ne trovata" #: src/hooks.c:173 #, c-format msgid "Hooks for '%s':\n" msgstr "Hokoj por '%s':\n" #: src/hooks.c:174 msgid "Num Ena Action" msgstr "" #: src/hooks.c:216 #, c-format msgid "" "Hook number %d for event %s\n" " Name: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Hoko numero %d por evento %s\n" " Nomo: %s\n" " Ago: %s\n" " Ebligata: %s\n" #: src/hooks.c:222 src/perlscript.c:1532 src/perlscript.c:2033 #: src/perlscript.c:2343 src/perlscript.c:2625 msgid "Not set" msgstr "Ne difinita" #: src/hooks.c:224 src/perlscript.c:1535 src/perlscript.c:1536 #: src/perlscript.c:1537 src/perlscript.c:1538 src/perlscript.c:1539 #: src/perlscript.c:1540 src/perlscript.c:1541 src/perlscript.c:2036 #: src/perlscript.c:2037 src/perlscript.c:2038 src/perlscript.c:2346 #: src/perlscript.c:2629 src/perlscript.c:2630 src/perlscript.c:3253 msgid "yes" msgstr "jes" #: src/hooks.c:224 src/perlscript.c:1535 src/perlscript.c:1536 #: src/perlscript.c:1537 src/perlscript.c:1538 src/perlscript.c:1539 #: src/perlscript.c:1540 src/perlscript.c:1541 src/perlscript.c:2036 #: src/perlscript.c:2037 src/perlscript.c:2038 src/perlscript.c:2346 #: src/perlscript.c:2629 src/perlscript.c:2630 src/perlscript.c:3253 msgid "no" msgstr "ne" #: src/log.c:97 msgid "File name not specified." msgstr "Plugindosiero ne informata." #: src/log.c:161 msgid "Could not open log file." msgstr "Ne eblas malfermi registraddosieron." #: src/plugins.c:104 src/plugins.c:161 #, c-format msgid "Failed loading file %s: %s" msgstr "Ne eblas malfermi dosieron %s: %s" #: src/cmdhistory.c:277 msgid "No command selected." msgstr "Neniu komando selektata." #: src/cmdhistory.c:289 msgid "More than one command selected." msgstr "Plu ol unu komando selektata." #: src/cmdhistory.c:483 msgid "Enter some text to search for." msgstr "Tajpu tekston por trovi." #: src/cmdhistory.c:516 msgid "Use the Find button to find the first result." msgstr "Uzu la Trovi butonon por trovi la unuan rezultaton." #: src/cmdhistory.c:573 msgid "Command not found." msgstr "Komando ne trovata." #: src/perlscript.c:430 src/perlscript.c:436 src/perlscript.c:443 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "Malvalida funkciovoko: la sintakso estas $world->FUNKCIO" #: src/perlscript.c:585 src/perlscript.c:602 src/perlscript.c:664 #: src/perlscript.c:697 src/perlscript.c:1075 src/perlscript.c:1101 #: src/perlscript.c:1151 src/perlscript.c:1171 src/perlscript.c:1194 #: src/perlscript.c:1222 src/perlscript.c:1231 src/perlscript.c:1773 #: src/perlscript.c:1782 src/perlscript.c:1962 src/perlscript.c:2133 #: src/perlscript.c:2142 src/perlscript.c:2422 src/perlscript.c:2431 #: src/perlscript.c:2700 src/perlscript.c:2754 src/perlscript.c:2799 #: src/perlscript.c:2864 src/perlscript.c:2875 src/perlscript.c:2967 #: src/perlscript.c:3300 src/kcwin.c:98 #, c-format msgid "%s: Too few arguments" msgstr "%s: Mankas argumentoj" #: src/perlscript.c:630 #, c-format msgid "%s: Argument must be numeric" msgstr "%s: Argumento devas esti numera" #: src/perlscript.c:678 src/perlscript.c:710 #, c-format msgid "%s: No such world" msgstr "%s: Ne ekzistas tiu mondo" #: src/perlscript.c:745 msgid "World saved." msgstr "Mondo konservita." #: src/perlscript.c:969 src/perlscript.c:984 src/perlscript.c:994 #, c-format msgid "%s: This is an internal function, do not call directly." msgstr "%s: Ĉi tiu funkcio estas interna, ne Äin voku rekte." #: src/perlscript.c:973 src/perlscript.c:1353 src/perlscript.c:1884 #: src/perlscript.c:2258 src/perlscript.c:2453 src/perlscript.c:2928 #, c-format msgid "%s: Wrong argument type" msgstr "%s: Invalida speco de argumento" #: src/perlscript.c:1245 src/perlscript.c:1515 msgid "No such trigger" msgstr "Ne ekzistas tiun trigger" #: src/perlscript.c:1263 src/perlscript.c:1814 src/perlscript.c:2187 #: src/perlscript.c:2887 #, c-format msgid "%s: Too many string arguments" msgstr "%s: Troaj ĉenaj argumentoj" #: src/perlscript.c:1286 src/perlscript.c:1837 #, c-format msgid "%s: pattern given twice, using the named attribute one" msgstr "%s: Åablono informita dufoje, uzante la de la nomata atributo" #: src/perlscript.c:1298 src/perlscript.c:2236 src/perlscript.c:2907 #, c-format msgid "%s: action given twice, using the named attribute one" msgstr "%s: agado informita dufoje, uzante la de la nomata atributo" #: src/perlscript.c:1344 src/perlscript.c:1875 src/perlscript.c:2249 #: src/perlscript.c:2920 #, c-format msgid "%s: Wrong type of reference" msgstr "%s: Invalida speco de referenco" #: src/perlscript.c:1364 #, c-format msgid "%s: pattern not specified, not creating" msgstr "%s: Åablono ne informtita, ne kreita" #: src/perlscript.c:1373 #, c-format msgid "%s: action not specified, and isn't gag, not creating" msgstr "%s: agado ne informita, kaj ne estas gag, ne kreita" #: src/perlscript.c:1403 msgid "Trigger added." msgstr "Trigger adiciita." #: src/perlscript.c:1409 msgid "Trigger modified." msgstr "Triger ÅanÄita." #: src/perlscript.c:1434 #, c-format msgid "%s: invalid target" msgstr "%s: invalida 'target'" #: src/perlscript.c:1444 #, c-format msgid "%s: invalid fg color" msgstr "%s: invalida 'fg'" #: src/perlscript.c:1454 #, c-format msgid "%s: invalid bg color" msgstr "%s: invalida 'bg'" #: src/perlscript.c:1464 #, c-format msgid "%s: invalid underline style" msgstr "%s: invalida substrektstilo" #: src/perlscript.c:1520 #, c-format msgid "" "Trigger number %d\n" " Name: %s\n" " Pattern: %s\n" " Action: %s\n" " Enabled: %s\n" " Ignore case: %s\n" " Gag output: %s\n" " Gag in log: %s\n" " Keep executing: %s\n" " Rewriter: %s\n" " Change style: %s\n" msgstr "" "Trigger numero %d\n" " Nomo: %s\n" " Åœablono: %s\n" " Ago: %s\n" " Ignore usklecon: %s\n" " Gag ekrano: %s\n" " Gag registrado: %s\n" " Ebligata: %s\n" " DaÅ­ri ezekutadon: %s\n" " Reskribisto: %s\n" " ÅœanÄas stilon: %s\n" #: src/perlscript.c:1544 #, c-format msgid "" " Target: %d\n" " Foreground: %d\n" " Background: %d\n" " Italics: %d\n" " Striked-thru: %d\n" " Underline: %d\n" msgstr "" " Celo: %d\n" " Fono: %d\n" " Malfono: %d\n" " Kursivo: %d\n" " Trastrekto: %d\n" " Substrekto: %d\n" #: src/perlscript.c:1796 src/perlscript.c:2020 msgid "No such alias" msgstr "Ne ekzistas tiun alias." #: src/perlscript.c:1849 #, c-format msgid "%s: substitution given twice, using the named attribute one" msgstr "%s: anstataÅ­o informita dufoje, uzante la de la nomata atributo" #: src/perlscript.c:1895 msgid "alias: not creating alias without pattern" msgstr "alias: ne kreita alias sen Åablono" #: src/perlscript.c:1903 msgid "alias: not creating alias without substitution" msgstr "alias: ne kreita alias sen anstataÅ­o" #: src/perlscript.c:1932 msgid "Alias added." msgstr "Alias adiciita" #: src/perlscript.c:1937 msgid "Alias modified." msgstr "Alias ÅanÄita." #: src/perlscript.c:2025 #, c-format msgid "" "Alias number %d\n" " Name: %s\n" " Pattern: %s\n" " Substitution: %s\n" " Ignore case: %s\n" " Eval as Perl: %s\n" " Enabled: %s\n" msgstr "" "Alias numero %d\n" " Nomo: %s\n" " Åœablono: %s\n" " AnstataÅ­o: %s\n" " Ignori usklecon: %s\n" " Komp. kiel Perl: %s\n" " Ebligata: %s\n" #: src/perlscript.c:2105 msgid "Press a key to get its keycode." msgstr "Prenu klavo por scii sian klavkodo." #: src/perlscript.c:2157 msgid "macro: No such macro" msgstr "macro: Ne ekzistas tiun macro" #: src/perlscript.c:2176 src/perlscript.c:2224 #, c-format msgid "%s: Invalid key code" msgstr "%s: Invalida klavkodo" #: src/perlscript.c:2213 #, c-format msgid "%s: keycode given twice, using the named attribute one" msgstr "%s: klavkodo informita dufoje, uzante la de la nomata atributo" #: src/perlscript.c:2269 #, c-format msgid "%s: keycode not specified, not creating" msgstr "%s: klavkodo ne informita, ne kreita" #: src/perlscript.c:2276 src/perlscript.c:2537 #, c-format msgid "%s: action not specified, not creating" msgstr "%s: agado ne informita, ne kreita" #: src/perlscript.c:2295 msgid "Macro added." msgstr "Macro adiciita." #: src/perlscript.c:2300 msgid "Macro modified." msgstr "Macro ÅanÄita." #: src/perlscript.c:2331 msgid "No such macro" msgstr "Ne ekzistas tiun macro." #: src/perlscript.c:2337 #, c-format msgid "" "Macro number %d\n" " Name: %s\n" " Key Code: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" "Macro numero %d\n" " Nomo: %s\n" " Klavkodo: %s\n" " Ago: %s\n" " Ebligata: %s\n" #: src/perlscript.c:2447 msgid "timer: No such timer" msgstr "timer: Ne ekzistas tiun timer" #: src/perlscript.c:2472 #, c-format msgid "%s: interval must be numeric" msgstr "%s: intervalo devas esti numera" #: src/perlscript.c:2485 #, c-format msgid "%s: count must be numeric" msgstr "%s: nombro devas esti numera" #: src/perlscript.c:2516 #, c-format msgid "%s: interval not specified, not creating" msgstr "%s: intervalo ne informita, ne kreita" #: src/perlscript.c:2577 msgid "Timer added." msgstr "Timer adiciita." #: src/perlscript.c:2582 msgid "Timer modified." msgstr "Timer ÅanÄita." #: src/perlscript.c:2612 msgid "No such timer" msgstr "Ne ekzistas tiun timer." #: src/perlscript.c:2617 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %d\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" "Timer numero %d\n" " Nomo: %s\n" " Intervalo: %d\n" " Nombro de fojoj: %d\n" " Ago: %s\n" " Ebligata: %s\n" " NedaÅ­ra: %s\n" #: src/perlscript.c:2708 #, c-format msgid "" "%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent" msgstr "" "%s: Nur skalara ($), array (@) kaj hash (%%) variabloj povas iÄi daÅ­raj" #: src/perlscript.c:2717 #, c-format msgid "%s: %s is already permanent" msgstr "%s: %s jam estas daÅ­ra" #: src/perlscript.c:2731 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "%s: Variablo '%s' iÄis daÅ­ra.\n" #: src/perlscript.c:2773 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "%s: Variablo '%s' iÄis maldaÅ­ra.\n" #: src/perlscript.c:2777 #, c-format msgid "%s: %s is not permanent" msgstr "%s: %s ne estas daÅ­ra" #: src/perlscript.c:2830 msgid "Permanent variables" msgstr "DaÅ­raj variabloj" #: src/perlscript.c:2942 msgid "Hook defined." msgstr "Hoko difinita." #: src/perlscript.c:2946 msgid "Hook modified." msgstr "Hoko ÅanÄita." #: src/perlscript.c:3052 msgid "Logging stopped." msgstr "Registrado haltigita." #: src/perlscript.c:3194 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "" #: src/perlscript.c:3237 msgid "No such plugin" msgstr "Ne ekzistas tiun plugin." #: src/perlscript.c:3242 #, c-format msgid "" "Plugin number %d\n" " Name: %s\n" " Version: %s\n" " Description: %s\n" " Author: %s\n" " Enabled: %s\n" msgstr "" "Plugin numero %d\n" " Nomo: %s\n" " Eldono: %s\n" " Priskribo: %s\n" " AÅ­toro: %s\n" " Ebligata: %s\n" #: src/kildclient.glade:176 msgid "_Import" msgstr "_Importi" #: src/kildclient.glade:225 msgid "E_xport" msgstr "_Eksporti" #: src/kildclient.glade:274 msgid "Edit Alias" msgstr "Redakti Alias" #: src/kildclient.glade:293 src/kildclient.glade:536 src/kildclient.glade:875 #: src/kildclient.glade:1170 src/kildclient.glade:1441 #: src/kildclient.glade:1687 src/dlgEditWorld.glade:92 #: src/dlgEditWorld.glade:3305 msgid "_Name:" msgstr "_Nomo:" #: src/kildclient.glade:306 src/kildclient.glade:549 msgid "_Pattern:" msgstr "_Åœablono:" #: src/kildclient.glade:321 msgid "_Substitution:" msgstr "_AnstataÅ­o:" #: src/kildclient.glade:336 msgid "Enter optionally a descriptive name for the alias" msgstr "Informu, se vi volas, priskriban nomon por la alias" #: src/kildclient.glade:350 msgid "Enter the pattern to match against typed commands" msgstr "Informu la Åablono por provi kongrui kun tajpataj komandoj" #: src/kildclient.glade:365 msgid "Enter the substitution to be executed" msgstr "Informu anstataÅ­on por ruli" #: src/kildclient.glade:378 msgid "E_val substitution as Perl statement" msgstr "_Komputi anstataÅ­on kiel Perl komando" #: src/kildclient.glade:382 msgid "Check to have the substitution be executed in a s///e construction" msgstr "Marku por ke la anstataÅ­o estu komputita en s///e konstruo" #: src/kildclient.glade:396 src/kildclient.glade:638 src/kildclient.glade:978 #: src/kildclient.glade:1226 src/kildclient.glade:1421 msgid "_Enabled" msgstr "_Ebligata" #: src/kildclient.glade:400 msgid "Check to make the alias enabled; only enabled aliases are tried" msgstr "Marku por enabligi la alias-n; nur enabligataj alias-oj estas provataj" #: src/kildclient.glade:416 src/kildclient.glade:712 src/kildclient.glade:1072 #: src/kildclient.glade:1292 src/kildclient.glade:1496 msgid "Note:" msgstr "Notu:" #: src/kildclient.glade:430 src/kildclient.glade:726 src/kildclient.glade:1086 #: src/kildclient.glade:1306 src/kildclient.glade:1510 msgid "" "This object belongs to a plugin. Changes made here will not be saved " "in the plugin." msgstr "" "Ĉi tiu objekto apartenas al unu plugin. ÅœanÄoj farataj ĉi tie ne " "estos konservataj en la plugin." #: src/kildclient.glade:445 src/kildclient.glade:741 msgid "_Ignore case when matching" msgstr "_Ignori usklecon" #: src/kildclient.glade:516 src/kildclient.glade:2030 msgid "Enter optionally a descriptive name for the trigger" msgstr "Informu, se vi volas, priskriban nomon por la trigger" #: src/kildclient.glade:517 msgid "Edit Trigger" msgstr "Redakti Trigger" #: src/kildclient.glade:564 src/kildclient.glade:932 src/kildclient.glade:1246 #: src/kildclient.glade:1393 msgid "_Action:" msgstr "_Ago:" #: src/kildclient.glade:592 msgid "Enter the pattern to match against received lines" msgstr "Informu Åablonon por provi kongrui kun ricevataj linioj" #: src/kildclient.glade:607 msgid "Enter the action that will be run when a match happens" msgstr "Informu agon kiun estos rulata kiam linioj kongruas Åablonon" #: src/kildclient.glade:620 msgid "Omit (_gag) from output" msgstr "Ne montri (_gag) en ĉeffenestro" #: src/kildclient.glade:624 msgid "Check to make the matched line not be printed in the main output window" msgstr "Marku por ke la linio ne estos montrata en la ĉeffekrano" #: src/kildclient.glade:642 msgid "Check to make the trigger enabled; only enabled triggers are tried" msgstr "" "Marku por enabligi la trigger-n; nur enabligataj trigger-oj estas provataj" #: src/kildclient.glade:656 msgid "Omit (gag) from _log file" msgstr "Ne skribi (gag) en registraddosiero" #: src/kildclient.glade:660 msgid "Check to make the matched line not be printed in the log file" msgstr "Marku por ke la linio ne estos skribata en la registraddosiero" #: src/kildclient.glade:674 msgid "_Keep executing other triggers after this this one matches" msgstr "_DaÅ­ri la ezekutadon de aliaj trigger-oj eĉ se ĉi tiu rulas" #: src/kildclient.glade:678 msgid "" "Check to make this trigger not prevent further triggers from being tried, if " "it matches" msgstr "" "Marku por ke ĉi tiu trigger ne malebligu aliajn trigger-ojn de funkci, se ĉi " "tiu rulos" #: src/kildclient.glade:692 msgid "_Rewriter trigger" msgstr "_Reskribista trigger" #: src/kildclient.glade:696 msgid "Check to make this trigger a rewriter trigger" msgstr "Marku por ke la trigger estu reskribista trigger" #: src/kildclient.glade:763 msgid "C_hange style" msgstr "Åœ_anÄi stilon" #: src/kildclient.glade:779 msgid "C_onfigure..." msgstr "K_onfiguri..." #: src/kildclient.glade:856 msgid "Edit Timer" msgstr "Redakti Timer" #: src/kildclient.glade:888 msgid "_Interval:" msgstr "_Intervalo:" #: src/kildclient.glade:903 msgid "Enter optionally a descriptive name for the timer" msgstr "Informu, se vi volas, priskriban nomon por la timer" #: src/kildclient.glade:917 msgid "Enter the action to be executed whenever the timer fires" msgstr "Informu agon kiun estos rulata kiam timer aktiviÄas" #: src/kildclient.glade:947 msgid "_Repeat count:" msgstr "_Nombro de fojoj:" #: src/kildclient.glade:960 msgid "" "_Temporary (will be deleted automatically when its repeat count reaches 0)" msgstr "_NedaÅ­ra (estos eksigita aÅ­tomate kiam lia nombro de fojoj atingas 0)" #: src/kildclient.glade:964 msgid "Check to have the timer deleted after its repeat count has reached 0" msgstr "" "Marku se vi volas que la timer estu eksigita kiam la lia nombro de fojoj " "antigas 0" #: src/kildclient.glade:982 msgid "Check to make the timer enabled; only enabled timers are run" msgstr "Marku por enabligi la timer-n; nur enabligataj timer-oj estas rulataj" #: src/kildclient.glade:1002 msgid "Specify the interval, in seconds, between timer activations" msgstr "Informu la intervalon, en sekundoj, inter aktivadoj de ĉi tiu timer" #: src/kildclient.glade:1015 msgid "seconds" msgstr "sekundoj" #: src/kildclient.glade:1039 msgid "" "Specify how many times this timer should run before being disabled or deleted" msgstr "" "Informu kiom da fojoj ĉi tiu timer devas ruli antaÅ­ esti malebligita ou " "eksigita" #: src/kildclient.glade:1052 msgid "(-1 to repeat indefinitely)" msgstr "(-1 por repeti indefine)" #: src/kildclient.glade:1151 msgid "Edit Macro" msgstr "Redakti Macro" #: src/kildclient.glade:1183 msgid "_Key:" msgstr "_Klavo:" #: src/kildclient.glade:1198 msgid "Enter optionally a descriptive name for the macro" msgstr "Informu, se vi volas, priskriban nomon por la macro" #: src/kildclient.glade:1212 msgid "Press the key that will be used to run the macro" msgstr "Tajpu klavon kiu estos usata por ruli la macron" #: src/kildclient.glade:1230 msgid "Check to make the macro enabled; only enabled macros are run" msgstr "Marku por enabligi la macron; nur enabligataj macroj estas rulataj" #: src/kildclient.glade:1261 msgid "Enter the action to be run when the key is pressed" msgstr "Informu agon kiun estos rulata kiam la klavo estas tajpata" #: src/kildclient.glade:1276 msgid "" "Press the key that will be used to activate the macro while the cursor is in " "the text box." msgstr "" "Tajpu klavon kiu estos usata por ruli la macron dum kursoro estas en " "tekstskatolo." #: src/kildclient.glade:1374 msgid "Edit Hook" msgstr "Redakti Hoko" #: src/kildclient.glade:1408 msgid "Enter the action to be run when the event happens" msgstr "Informu agon kiun estos rulata kiam evento okazos" #: src/kildclient.glade:1425 msgid "Check to make the hook enabled; only enabled hooks are run" msgstr "Marku por enabligi la hokon; nur enabligataj hookoj estas rulataj" #: src/kildclient.glade:1456 msgid "Enter optionally a descriptive name for the hook" msgstr "Informu, se vi volas, priskriban nomon por la hoko" #: src/kildclient.glade:1472 msgid "Event:" msgstr "Evento:" #: src/kildclient.glade:1575 msgid "Permenent variable" msgstr "DaÅ­ra variablo" #: src/kildclient.glade:1592 msgid "_Name of variable to make permanent:" msgstr "_Nomo de variablo por iÄi daÅ­ra:" #: src/kildclient.glade:1606 msgid "" "Enter the name of a scalar ($), array (@) or hash (%) variable whose " "contents are to be saved between sessions of the World" msgstr "" "Informu nomon de skalara ($), array (@) aÅ­ hash (%) variablo kies enhavo " "saviÄas inter seancoj de la Mondo" #: src/kildclient.glade:1668 msgid "Edit Character Information" msgstr "Redakti Informon de Rolulo" #: src/kildclient.glade:1700 msgid "Enter the character's name for automatic login" msgstr "Informu la nomon de la rolulo por automata saluto" #: src/kildclient.glade:1714 msgid "_Password:" msgstr "Pas_vorto:" #: src/kildclient.glade:1729 msgid "Enter the character's password for automatic login" msgstr "Informu la pasvorton de la rolulo por automata saluto" #: src/kildclient.glade:1870 msgid "Permanent Variables" msgstr "DaÅ­raj Variabloj" #: src/kildclient.glade:1886 msgid "OnConnect Hooks" msgstr "OnConnect Hokoj" #: src/kildclient.glade:1902 msgid "OnDisconnect Hooks" msgstr "OnDisconnect Hokoj" #: src/kildclient.glade:1920 msgid "OnReceivedText Hooks" msgstr "OnReceivedText Hokoj" #: src/kildclient.glade:1938 msgid "OnSentCommand Hooks" msgstr "OnSentCommand Hokoj" #: src/kildclient.glade:1956 msgid "OnGetFocus Hooks" msgstr "OnGetFocus Hokoj" #: src/kildclient.glade:1974 msgid "OnLoseFocus Hooks" msgstr "OnLoseFocus Hokoj" #: src/kildclient.glade:1992 msgid "OnCloseConnected Hooks" msgstr "OnCloseConnected Hokoj" #: src/kildclient.glade:2019 msgid "_Items to export" msgstr "_Eroj por eksporti" #: src/kildclient.glade:2031 msgid "Change Style" msgstr "ÅœanÄi Stilon" #: src/kildclient.glade:2050 msgid "_Background:" msgstr "_Fono:" #: src/kildclient.glade:2064 msgid "_Italic:" msgstr "_Kursivo:" #: src/kildclient.glade:2077 src/kildclient.glade:2123 msgid "" "Do not change\n" "No\n" "Yes" msgstr "" "Ne ÅanÄi\n" "Ne\n" "Jes" #: src/kildclient.glade:2093 msgid "_Underline:" msgstr "_Substrekto:" #: src/kildclient.glade:2106 msgid "" "Do not change\n" "None\n" "Single\n" "Double" msgstr "" "Ne ÅanÄi\n" "Neniu\n" "Unuobla\n" "Duobla" #: src/kildclient.glade:2139 msgid "_Striked-thru:" msgstr "Tra_strekto:" #: src/kildclient.glade:2153 msgid "_Foreground:" msgstr "Malf_ono:" #: src/kildclient.glade:2167 msgid "_Apply to:" msgstr "_Apliki al:" #: src/kildclient.glade:2181 msgid "The whole line" msgstr "La tutan linion" #: src/kildclient.glade:2196 msgid "The whole matched text" msgstr "La tutan kongruitan tekston" #: src/kildclient.glade:2216 msgid "The matched substring number" msgstr "La parton numero" #: src/kildclient.glade:2259 src/kildclient.glade:2290 msgid "" "Do not change\n" "Black\n" "Red\n" "Green\n" "Yellow\n" "Blue\n" "Magenta\n" "Cyan\n" "White\n" "Default\n" "Black (bold)\n" "Red (bold)\n" "Green (bold)\n" "Yellow (bold)\n" "Blue (bold)\n" "Magenta (bold)\n" "Cyan (bold)\n" "White (bold)\n" "Default (bold)\n" msgstr "" "Ne ÅanÄi\n" "Nera\n" "Rugâ\n" "Verda\n" "Flava\n" "Blua\n" "Malva\n" "Cejana\n" "Blanka\n" "DefaÅ­lta\n" "Nera (grasa)\n" "Rugâ (grasa)\n" "Verda (grasa)\n" "Flava (grasa)\n" "Blua (grasa)\n" "Malva (grasa)\n" "Cejana (grasa)\n" "Blanka (grasa)\n" "DefaÅ­lta (grasa)\n" #: src/wndmain.glade:20 msgid "_World" msgstr "_Mondo" #: src/wndmain.glade:37 msgid "_Reconnect" msgstr "_Rekonekti" #: src/wndmain.glade:45 msgid "_Disconnect" msgstr "_Malkonekti" #: src/wndmain.glade:53 msgid "Connect to _Another" msgstr "Konekti al _Alia Mondo" #: src/wndmain.glade:74 msgid "_Edit..." msgstr "_Redakti..." #: src/wndmain.glade:91 msgid "S_tatistics..." msgstr "S_tatistikoj..." #: src/wndmain.glade:103 src/wndmain.glade:238 msgid "_Previous" msgstr "_AntaÅ­a" #: src/wndmain.glade:118 src/wndmain.glade:247 msgid "_Next" msgstr "_Proksima" #: src/wndmain.glade:151 msgid "_Edit" msgstr "_Redakti" #: src/wndmain.glade:209 msgid "Find Ne_xt" msgstr "Trovi _Proksiman" #: src/wndmain.glade:222 msgid "_Input" msgstr "_Enigo" #: src/wndmain.glade:256 msgid "Find Previous" msgstr "Trovi AntaÅ­a" #: src/wndmain.glade:265 msgid "Find N_ext" msgstr "Trovi _Proksiman" #: src/wndmain.glade:274 msgid "Command _History..." msgstr "Komand_historio..." #: src/wndmain.glade:288 msgid "_Multi-line Send..." msgstr "_Sendi Plurajn Liniojn..." #: src/wndmain.glade:302 msgid "_Test Triggers..." msgstr "_Testi Trigger-jn..." #: src/wndmain.glade:314 msgid "_Preferences" msgstr "_Preferoj" #: src/wndmain.glade:322 msgid "Disable _Triggers" msgstr "Malebligi _Triggers" #: src/wndmain.glade:331 msgid "Disable _Aliases" msgstr "Malebligi _Aliases" #: src/wndmain.glade:340 msgid "Disable _Macros" msgstr "Malebligi _Macros" #: src/wndmain.glade:349 msgid "Disable T_imers" msgstr "Malebligi T_imers" #: src/wndmain.glade:363 msgid "_Debug Matches" msgstr "" #: src/wndmain.glade:390 msgid "Edit Default _World..." msgstr "Redakti DefaÅ­ltan _Mondon..." #: src/wndmain.glade:402 msgid "_Display" msgstr "_Apero" #: src/wndmain.glade:411 msgid "_Split Window" msgstr "Dividi fene_stron" #: src/wndmain.glade:424 msgid "_Help" msgstr "_Helpo" #: src/wndmain.glade:430 msgid "_Manual" msgstr "_Manlibro" #: src/wndmain.glade:447 msgid "_About" msgstr "_Koncerne" #: src/dlgSelectWorld.glade:7 msgid "Connect to" msgstr "Konekti al" #: src/dlgSelectWorld.glade:19 msgid "_Select a saved world:" msgstr "_Elektu konservitan mondon:" #: src/dlgSelectWorld.glade:116 msgid "Or connect d_irectly:" msgstr "AÅ­ konektu _rekte:" #: src/dlgSelectWorld.glade:141 src/dlgEditWorld.glade:107 msgid "_Host:" msgstr "R_etnodo:" #: src/dlgSelectWorld.glade:154 src/dlgEditWorld.glade:124 msgid "_Port:" msgstr "_Pordo:" #: src/dlgPreferences.glade:6 msgid "Preferences" msgstr "Preferoj" #: src/dlgPreferences.glade:33 msgid "Colors used by KildClient" msgstr "Koloroj uzataj de KildClient" #: src/dlgPreferences.glade:65 msgid "_Informative messages:" msgstr "_Informaj mesaÄoj:" #: src/dlgPreferences.glade:77 src/dlgPreferences.glade:117 msgid "" "Black\n" "Red\n" "Green\n" "Yellow\n" "Blue\n" "Magenta\n" "Cyan\n" "White\n" "Default\n" "Black (bold)\n" "Red (bold)\n" "Green (bold)\n" "Yellow (bold)\n" "Blue (bold)\n" "Magenta (bold)\n" "Cyan (bold)\n" "White (bold)\n" "Default (bold)\n" msgstr "" "Nera\n" "Rugâ\n" "Verda\n" "Flava\n" "Blua\n" "Malva\n" "Cejana\n" "Blanka\n" "DefaÅ­lta\n" "Nera (grasa)\n" "Rugâ (grasa)\n" "Verda (grasa)\n" "Flava (grasa)\n" "Blua (grasa)\n" "Malva (grasa)\n" "Cejana (grasa)\n" "Blanka (grasa)\n" "DefaÅ­lta (grasa)\n" #: src/dlgPreferences.glade:105 msgid "_Command echo:" msgstr "EÄ¥o de _komandoj:" #: src/dlgPreferences.glade:168 msgid "Window configuration" msgstr "Konfiguro de la fenestro" #: src/dlgPreferences.glade:200 msgid "_Tab position:" msgstr "_Pozicio de la langetoj:" #: src/dlgPreferences.glade:212 msgid "" "Left\n" "Right\n" "Top\n" "Bottom" msgstr "" "Maldekstre\n" "Dekstre\n" "Supre\n" "Malsupre" #: src/dlgPreferences.glade:226 msgid "_Hide tabs if only one world is open" msgstr "KaÅi langetojn se nur unu mondo estas malferma" #: src/dlgPreferences.glade:231 msgid "" "If this is checked, when there is only one open world no tabs will be shown" msgstr "" "Se ĉi tiu estas markata, neniu langeto estos montrata kiam estas nur unu " "malferma mondo" #: src/dlgPreferences.glade:242 msgid "_Flash window when new text is received" msgstr "_Ekbrili fenestron kiam nova teksto alvenas" #: src/dlgPreferences.glade:280 msgid "Appearance" msgstr "Apero" #: src/dlgPreferences.glade:302 msgid "Sending Delays" msgstr "Malfruigo Inter Sendadoj" #: src/dlgPreferences.glade:334 msgid "Enter the default parameters for sending multiple lines or commands:" msgstr "" "Informu la defaÅ­ltajn parametrojn por la sendado de pluraj linioj aÅ­ " "komandoj:" #: src/dlgPreferences.glade:349 msgid "_Number of lines/commands to send at once:" msgstr "_Nombro de linioj/komandoj por sendi samtempe:" #: src/dlgPreferences.glade:386 msgid "_Delay between each group of lines/commands:" msgstr "_Tempo por atendi inter la sendado de ĉiu grupo de linioj/komandoj:" #: src/dlgPreferences.glade:442 msgid "Sending" msgstr "Sendado" #: src/dlgPreferences.glade:465 msgid "Web Browser" msgstr "Retumilo" #: src/dlgPreferences.glade:498 msgid "Specify the command used to launch a web browser" msgstr "Informu komandon por Åalti retumilon" #: src/dlgPreferences.glade:512 msgid "" "Enter the command to run a web browser. %s will be substituted by the web " "page address." msgstr "" "Informu komandon por Åalti retumilon. %s anstataÅ­iÄos por la adreso de la " "retpaÄo." #: src/dlgPreferences.glade:548 msgid "Audio Player" msgstr "Audludilo" #: src/dlgPreferences.glade:581 msgid "Specify the command used to play sound files." msgstr "Informu komandon por ludi auddosierojn." #: src/dlgPreferences.glade:595 msgid "" "Enter the command to run an audio player program. %s will be substituted by " "the file path." msgstr "Informu komandon por Åalti audlulidon. %s anstataÅ­iÄos por la dosiero." #: src/dlgPreferences.glade:627 msgid "External Programs" msgstr "Eksteraj Programoj" #: src/dlgPreferences.glade:651 src/dlgEditWorld.glade:245 msgid "Proxy" msgstr "Prokurservilo" #: src/dlgPreferences.glade:686 src/dlgEditWorld.glade:280 msgid "Proxy _type:" msgstr "_Tipo de prokurservilo:" #: src/dlgPreferences.glade:698 src/dlgEditWorld.glade:292 msgid "" "Use global settings\n" "No proxy\n" "SOCKS4\n" "SOCKS5" msgstr "" "Uzi defaÅ­ltan konfiguron\n" "Sen prokurservilo\n" "SOCKS4\n" "SOCKS5" #: src/dlgPreferences.glade:775 src/dlgEditWorld.glade:368 msgid "Pass_word:" msgstr "Pas_vorto:" #: src/dlgPreferences.glade:791 src/dlgEditWorld.glade:384 msgid "Server _port:" msgstr "Servil_pordo:" #: src/dlgPreferences.glade:805 src/dlgEditWorld.glade:398 msgid "_Username:" msgstr "Sal_utnomo:" #: src/dlgPreferences.glade:819 src/dlgEditWorld.glade:412 msgid "Server _address:" msgstr "Serviladreso:" #: src/dlgPreferences.glade:857 msgid "Proxy" msgstr "Prokurservilo" #: src/dlgStatistics.glade:7 msgid "Statistics" msgstr "Statistikoj" #: src/dlgStatistics.glade:25 src/dlgStatistics.glade:40 #: src/dlgStatistics.glade:210 src/dlgStatistics.glade:361 #: src/dlgStatistics.glade:495 src/dlgStatistics.glade:510 #: src/dlgStatistics.glade:525 src/dlgStatistics.glade:540 #: src/dlgStatistics.glade:555 src/dlgStatistics.glade:583 #: src/dlgStatistics.glade:624 src/dlgStatistics.glade:639 #: src/dlgStatistics.glade:667 src/dlgStatistics.glade:708 #: src/dlgStatistics.glade:723 msgid "N/A" msgstr "N/A" #: src/dlgStatistics.glade:55 msgid "Proxy port:" msgstr "Prokurservila pordo:" #: src/dlgStatistics.glade:68 msgid "Proxy host:" msgstr "Prokurservilo:" #: src/dlgStatistics.glade:96 msgid "Proxy type:" msgstr "Tipo de prokurservilo:" #: src/dlgStatistics.glade:109 msgid "World name:" msgstr "Nomo de la mondo:" #: src/dlgStatistics.glade:120 msgid "Host:" msgstr "Retnodo:" #: src/dlgStatistics.glade:133 msgid "Port:" msgstr "Pordo:" #: src/dlgStatistics.glade:146 msgid "Connection time:" msgstr "Konektadtempo:" #: src/dlgStatistics.glade:159 msgid "Idle time:" msgstr "Inativa tempo:" #: src/dlgStatistics.glade:184 msgid "Compression used:" msgstr "Kompaktigilo uzata:" #: src/dlgStatistics.glade:197 msgid "Bytes received (compressed):" msgstr "Riĉevitaj bajtoj (kompaktigitaj):" #: src/dlgStatistics.glade:225 msgid "Bytes received (decompressed):" msgstr "Riĉevitaj bajtoj (nekompaktigitaj):" #: src/dlgStatistics.glade:238 msgid "Compression ratio:" msgstr "Kompatigkvociento:" #: src/dlgStatistics.glade:251 msgid "Lines received:" msgstr "Linioj riĉevitaj:" #: src/dlgStatistics.glade:402 msgid "Key exchange:" msgstr "ÅœlosilointerÅanÄo:" #: src/dlgStatistics.glade:415 msgid "SSL protocol used:" msgstr "SSL protokolo uzata:" #: src/dlgStatistics.glade:428 msgid "Compression algorithm:" msgstr "Kompatigalgoritmo:" #: src/dlgStatistics.glade:441 msgid "Certificate type:" msgstr "Tipo de atesto:" #: src/dlgStatistics.glade:454 msgid "Cipher:" msgstr "Cifero:" #: src/dlgStatistics.glade:467 msgid "MAC:" msgstr "MAC:" #: src/dlgStatistics.glade:480 msgid "SSL not supported in this version" msgstr "SSL ne subtenata en ĉi tiu eldono" #: src/dlgStatistics.glade:570 msgid "Hostname:" msgstr "Retnodo:" #: src/dlgStatistics.glade:598 msgid "Valid since:" msgstr "Valida de:" #: src/dlgStatistics.glade:611 msgid "Expiration:" msgstr "FiniÄas:" #: src/dlgStatistics.glade:654 msgid "Fingerprint:" msgstr "Fingropremaĵo:" #: src/dlgStatistics.glade:682 msgid "Subject's DN:" msgstr "" #: src/dlgStatistics.glade:695 msgid "Issuer's DN:" msgstr "" #: src/dlgAbout.glade:12 msgid "A mud client with powerful features and support for Perl Scripting" msgstr "MUDkliento kun potencajn eblojn kaj subtenon de Perl skriptoj" #: src/dlgAbout.glade:14 msgid "Visit http://kildclient.sf.net" msgstr "Vizitu http://kildclient.sf.net" #: src/dlgAbout.glade:15 msgid "" "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." msgstr "" "Ĉi tiu programo estas libera; vi estas libera por disdoni ĉi tiun programon " "sub la kondiĉoj de la licenco GNU General Public License eldonata de Free " "Software Foundation; aÅ­ eldono 2 de la licenso, aÅ­ (laÅ­ via elekto) iu ajn " "pli nova eldono." #: src/dlgEditWorld.glade:7 msgid "Edit World" msgstr "Redakti Mondon" #: src/dlgEditWorld.glade:60 msgid "Connection" msgstr "Konekto" #: src/dlgEditWorld.glade:141 msgid "Enter a descriptive name for the World" msgstr "Informu priskriban nomon por la Mondo" #: src/dlgEditWorld.glade:159 msgid "Enter the host to connect to" msgstr "Informu la retnodon al kiu konekti" #: src/dlgEditWorld.glade:179 msgid "Enter the port used when connecting" msgstr "Informu la pordon por konekti" #: src/dlgEditWorld.glade:197 msgid "Use _SSL" msgstr "Uzi _SSL" #: src/dlgEditWorld.glade:452 msgid "Auto-login" msgstr "AÅ­tomata saluto" #: src/dlgEditWorld.glade:488 msgid "Connection _Style:" msgstr "_Stilo de la konekto:" #: src/dlgEditWorld.glade:501 msgid "" "No auto-login\n" "diku (char, pass)\n" "lp (CONNECT char pass)" msgstr "" "Sen aÅ­tomata saluto\n" "diku (rolulo, pasvorto)\n" "lp (CONNECT rolulo pasvorto)" #: src/dlgEditWorld.glade:519 msgid "Ch_aracters in this mud:" msgstr "_Roluloj en ĉi tiu mud:" #: src/dlgEditWorld.glade:680 src/dlgEditWorld.glade:2009 #: src/dlgEditWorld.glade:2852 msgid "Font" msgstr "Tiparo" #: src/dlgEditWorld.glade:713 msgid "Select the font used in the _main screen:" msgstr "Elektu la tiparon de la ĉ_effenestro:" #: src/dlgEditWorld.glade:729 msgid "Select the font used in the main output screen" msgstr "Elektu la tiparon de la ĉeffenestro" #: src/dlgEditWorld.glade:740 msgid "Use _bold font for highlighted colors (instead of just highlighting)" msgstr "Uzi _grasan tiparon por emfazitaj koloroj (anstataÅ­ nur emfazi)" #: src/dlgEditWorld.glade:745 msgid "" "Check if you want the highlighted ANSI colors to be displayed in bold also" msgstr "" "Marku se vi volas ke la enfazitaj koloroj estu montrataj ankaÅ­ en grasa " "tiparoj" #: src/dlgEditWorld.glade:782 msgid "Word Wrap" msgstr "Linirompado" #: src/dlgEditWorld.glade:812 msgid "_Wrap lines at word boundaries" msgstr "_Rompi la liniojn inter vortoj" #: src/dlgEditWorld.glade:817 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "Marku por rompi la liniojn inter vortoj" #: src/dlgEditWorld.glade:836 msgid "_Indent wrapped lines by" msgstr "Al_inei rompitajn liniojn je" #: src/dlgEditWorld.glade:865 msgid "pixels" msgstr "rastrumero" #: src/dlgEditWorld.glade:883 msgid "Wrap lines at full _screen width" msgstr "Rompi liniojn je la _tutan larÄeco de la ecrano" #: src/dlgEditWorld.glade:902 msgid "Maximum line width in _characters:" msgstr "Maksimuma larÄeco de linioj en _signoj:" #: src/dlgEditWorld.glade:964 msgid "Tooltips" msgstr "Åœpruchelpiloj" #: src/dlgEditWorld.glade:995 msgid "Display _tooltips with the time when the line was received" msgstr "Mon_tri Åpruchelpilojn kun la horo en kiu la linioj estis riĉevitaj" #: src/dlgEditWorld.glade:1000 msgid "" "Check if you want tooltips to be displayed showing the time when a line was " "received if you leave the mouse over the line for a short while" msgstr "" "Marku por montri Åpruchelpilojn montrante la horo en kiu unu linio estis " "riĉevita se vi lasas la muso sur la linio per kurtan periodo" #: src/dlgEditWorld.glade:1058 msgid "Ansi Colors" msgstr "Ansi Koloroj" #: src/dlgEditWorld.glade:1374 msgid "_Black" msgstr "_Nigra" #: src/dlgEditWorld.glade:1391 msgid "R_ed" msgstr "_RuÄa" #: src/dlgEditWorld.glade:1410 msgid "_Green" msgstr "V_erda" #: src/dlgEditWorld.glade:1429 msgid "_Yellow" msgstr "F_lava" #: src/dlgEditWorld.glade:1448 msgid "B_lue" msgstr "_Blua" #: src/dlgEditWorld.glade:1467 msgid "_Magenta" msgstr "_Malva" #: src/dlgEditWorld.glade:1486 msgid "C_yan" msgstr "Ce_jana" #: src/dlgEditWorld.glade:1505 msgid "_White" msgstr "B_lanka" #: src/dlgEditWorld.glade:1524 msgid "Bl_ack (Bold)" msgstr "N_igra (Grasa)" #: src/dlgEditWorld.glade:1541 msgid "Re_d (Bold)" msgstr "R_uÄa (Grasa)" #: src/dlgEditWorld.glade:1560 msgid "G_reen (Bold)" msgstr "Ver_da (Grasa)" #: src/dlgEditWorld.glade:1579 msgid "Yell_ow (Bold)" msgstr "Fla_va (Grasa)" #: src/dlgEditWorld.glade:1598 msgid "Bl_ue (Bold)" msgstr "Blu_a (Grasa)" #: src/dlgEditWorld.glade:1617 msgid "Magen_ta (Bold)" msgstr "Mal_va (grasa)" #: src/dlgEditWorld.glade:1636 msgid "Cya_n (Bold)" msgstr "Ceja_na (grasa)" #: src/dlgEditWorld.glade:1655 msgid "W_hite (Bold)" msgstr "Blan_ka (Grasa)" #: src/dlgEditWorld.glade:1720 msgid "Default Colors" msgstr "DefaÅ­taj Koloroj" #: src/dlgEditWorld.glade:1767 msgid "_Foreground" msgstr "Malf_ono" #: src/dlgEditWorld.glade:1801 msgid "Bac_kground" msgstr "_Fono" #: src/dlgEditWorld.glade:1835 msgid "Bold Foreground" msgstr "_Grasa Malfono" #: src/dlgEditWorld.glade:1873 msgid "Bold Background" msgstr "Fono (Grasa)" #: src/dlgEditWorld.glade:1916 msgid "Revert to default colors" msgstr "Uzi la defaÅ­ltajn kolorojn" #: src/dlgEditWorld.glade:1947 msgid "Re_vert to default colors" msgstr "U_zi la defaÅ­ltajn kolorojn" #: src/dlgEditWorld.glade:1952 msgid "Click to revert all colors to their built-in defaults" msgstr "Klaku por uzi la defaÅ­ltajn kolorojn" #: src/dlgEditWorld.glade:2042 msgid "Select the font used in the _status bar:" msgstr "Elektu la tiparon de la stata breto:" #: src/dlgEditWorld.glade:2058 msgid "Select the font used in the status bar" msgstr "Elektu la tiparon de la stata breto" #: src/dlgEditWorld.glade:2093 msgid "Time Display" msgstr "Montrado de Tempo" #: src/dlgEditWorld.glade:2125 msgid "C_onnected time:" msgstr "Tempo k_onektata:" #: src/dlgEditWorld.glade:2156 src/dlgEditWorld.glade:2256 msgid "Do not display" msgstr "Ne montri" #: src/dlgEditWorld.glade:2161 msgid "Select if you do not want the connection time to be displayed" msgstr "Elektu se vi ne volas ke la konektatatempo estu montrata" #: src/dlgEditWorld.glade:2175 src/dlgEditWorld.glade:2275 msgid "Display as hours, minutes and seconds" msgstr "Montri kiel horoj, minutoj kaj sekundoj" #: src/dlgEditWorld.glade:2180 msgid "" "Select if you want the connection time to be displayed in hours, minutes and " "seconds" msgstr "" "Elektu se vi volas ke la konektatatempo estu montrata en horoj, minutoj, kaj " "sekundoj" #: src/dlgEditWorld.glade:2194 src/dlgEditWorld.glade:2294 msgid "Display as seconds" msgstr "Montri kiel sekundoj" #: src/dlgEditWorld.glade:2199 msgid "Select if you want the connection time to be displayed in seconds" msgstr "Elektu se vi volas ke la konektatatempo estu montrata en sekundoj" #: src/dlgEditWorld.glade:2226 msgid "_Idle time:" msgstr "_Inativa tempo:" #: src/dlgEditWorld.glade:2261 msgid "Select if you do not want the idle time to be displayed" msgstr "Elektu se vi ne volas ke la inaktivatempo estu montrata" #: src/dlgEditWorld.glade:2280 msgid "" "Select if you want the idle time to be displayed in hours, minutes and " "seconds" msgstr "" "Elektu se vi volas ke la inaktivatempo estu montrata en horoj, minutoj, kaj " "sekundoj" #: src/dlgEditWorld.glade:2299 msgid "Select if you want the idle time to be displayed in seconds" msgstr "Elektu se vi volas ke la inaktivatempo estu montrata en sekundoj" #: src/dlgEditWorld.glade:2313 msgid "Only _reset idle time counter when a command is entered directly" msgstr "Nur _zerigi inaktivatemponombrilon kiam komando estas rekte tajpata" #: src/dlgEditWorld.glade:2318 msgid "" "Check to make the idle time counter reset only when a command is entered " "directly by typing it in the command entry box. If not checked, if a command " "is sent because of a timer, of a hook, etc, the idle timer is also reset." msgstr "" "Marku por ke la inaktivatemponombrilo zeriÄu nur kiam komando estas rekte " "tajpata em komandskatolo. Se ne markata, kiam komando estas sendata pere de " "timer, hoko, ktp, la inaktivatemponombrilo ankaÅ­ zeriÄas." #: src/dlgEditWorld.glade:2387 msgid "Command Entry" msgstr "Eniro de komandoj" #: src/dlgEditWorld.glade:2417 msgid "_Keep last typed command in command entry box" msgstr "_Reteni la lastan tajpitan komandon en komandskatolo" #: src/dlgEditWorld.glade:2422 msgid "" "Check to have the last command kept in the command entry box, so that you " "can repeat commands only by pressing ENTER" msgstr "" "Marku por ke la lastan komandoj estu konservata en la komandskatolo, por ke " "vi povus Äin ripeti tajpante ENTER" #: src/dlgEditWorld.glade:2434 msgid "_Echo sent commands in main window" msgstr "_EÄ¥i senditajn komandojn en la ĉeffenestro" #: src/dlgEditWorld.glade:2439 msgid "Check to have the sent commands echoed in the main output window" msgstr "Marku por eÄ¥i la senditajn komandojn en la ĉeffenestro" #: src/dlgEditWorld.glade:2451 msgid "_Store commands between sessions" msgstr "_Konservi komandojn inter sesioj" #: src/dlgEditWorld.glade:2456 msgid "Check to have the command history saved in a file between sessions" msgstr "Marku por konservi la komandhistorion en dosiero inter sekcioj" #: src/dlgEditWorld.glade:2468 msgid "Never _hide the typed text" msgstr "Neniam _kaÅi tajpatan tekston" #: src/dlgEditWorld.glade:2473 msgid "" "Check this if the text you type is displayed as black dots in the input box." msgstr "" "Marku ĉi tion se ĉio, kion vi tajpas montriÄas kiel nigraj punktoj en la " "komandskatolo." #: src/dlgEditWorld.glade:2489 msgid "_Number of commands to save in history:" msgstr "Nombro de komandoj por konservi en _historio:" #: src/dlgEditWorld.glade:2503 msgid "Specify the number of commands that are saved and can be later recalled" msgstr "" "Informu la nombron de komandoj kiu saviÄas kaj povas esti reuzataj poste" #: src/dlgEditWorld.glade:2526 msgid "C_ommand separator:" msgstr "EÄ¥o de k_omandoj:" #: src/dlgEditWorld.glade:2540 msgid "Specify the separator for commands typed in the command entry box" msgstr "Elektu la disigilon por komandoj tajpataj en la komandskatolo" #: src/dlgEditWorld.glade:2558 msgid "Use single-_line input bar" msgstr "_Unulinia komandskatolo" #: src/dlgEditWorld.glade:2594 msgid "Enable _auto-completion" msgstr "Ebligi _aÅ­tomata kompletado" #: src/dlgEditWorld.glade:2599 msgid "Check to enable command auto-completion (based on previous commands)" msgstr "" "Marku por abligi aÅ­tomatan kompletadon de komandoj (bazita en antaÅ­a " "komandoj)" #: src/dlgEditWorld.glade:2617 msgid "Acti_vate auto-completion only after" msgstr "Akti_vigi aÅ­tomata kompletado nur post" #: src/dlgEditWorld.glade:2631 msgid "" "Specify the number of characters that must be typed for command completion " "to start" msgstr "" "Informu la nombron de signoj kiu devas esti tajpataj por komenci la " "aÅ­tomatan komandkompletadon" #: src/dlgEditWorld.glade:2645 msgid "characters have been entered" msgstr "signoj estis tajpitaj" #: src/dlgEditWorld.glade:2670 msgid "Use _multi-line input bar" msgstr "_Plurlinia komandskatolo" #: src/dlgEditWorld.glade:2711 msgid "N_umber of lines:" msgstr "_Nombro de linioj:" #: src/dlgEditWorld.glade:2746 msgid "S_pell check typed text" msgstr "_Literumi tajpatan tekston" #: src/dlgEditWorld.glade:2779 msgid "Language code:" msgstr "Lingvokodo:" #: src/dlgEditWorld.glade:2803 msgid "(Leave blank for default based on locale)" msgstr "(Lasu blanka por la defaÅ­to surbazita en la lokaĵo)" #: src/dlgEditWorld.glade:2885 msgid "Select the font used in the command _entry box:" msgstr "Elektu la tiparon de la _komandskatolo:" #: src/dlgEditWorld.glade:2901 msgid "Select the font used in the command entry box" msgstr "Elektu la tiparon de la komandskatolo" #: src/dlgEditWorld.glade:2935 msgid "Flood prevention" msgstr "Evito de inundo" #: src/dlgEditWorld.glade:2970 msgid "Do not allow the _same command to be sent" msgstr "Ne permesi la _sama komando esti sendata" #: src/dlgEditWorld.glade:2975 msgid "" "Check to prevent more than a given number of equal commands to be sent in a " "row (which can disconnect your character in some muds)" msgstr "" "Marku por malebligi ke pli ol specifan nombron de egalaj komandoj estus " "sendata sinsekve (kiu povas malkonekti vin el kelkaj mud-oj)" #: src/dlgEditWorld.glade:2990 msgid "Specify the maximum number of equal commands that can be sent in a row" msgstr "" "Informu la maksiman nombron de egalaj komandoj kiu povas esti sendata " "sinsekve" #: src/dlgEditWorld.glade:3004 msgid "_times in a row" msgstr "_fojoj sinsekve" #: src/dlgEditWorld.glade:3028 msgid "Se_nd this command:" msgstr "Se_ndi tiun komandon:" #: src/dlgEditWorld.glade:3042 msgid "" "Enter a command to be sent whenever the specified maximum number of equal " "commands would be sent" msgstr "" "Informu komandon por sendi kiam specifita maksima nombro de egalaj komando " "estus sendata" #: src/dlgEditWorld.glade:3104 msgid "Logging Status" msgstr "Registrado" #: src/dlgEditWorld.glade:3152 msgid "St_art" msgstr "Åœ_argi" #: src/dlgEditWorld.glade:3195 msgid "_Include the last" msgstr "Sk_ribi la lastajn" #: src/dlgEditWorld.glade:3200 msgid "Select to include lines from the main window in the log file." msgstr "Marku por skribi liniojn el la ĉeffenestro en la registraddosiero." #: src/dlgEditWorld.glade:3214 msgid "Inform number of lines to include in the log." msgstr "Informu nombro de linioj por skribi en la en la registraddosiero." #: src/dlgEditWorld.glade:3229 msgid "lines of the scrollback buffer in the log" msgstr "linionj el la rolumadbufro en la registraddosiero" #: src/dlgEditWorld.glade:3268 src/dlgEditWorld.glade:4377 msgid "File" msgstr "Dosiero" #: src/dlgEditWorld.glade:3348 msgid "" "Note: You can use strftime() escapes to create different files based on the " "date and time that logging starts. Also, %Kw represents the World name and " "%Kc the character name used in auto-logon." msgstr "" "Noto: Vi povas uzi strfime() eskapsesekvencojn por krei dosierojn kies nomo " "dependas de la horo kaj dato kiam la registrado komencas. Krome, %Kw " "reprezentas la Mondnomon kaj %Kc la rolulon uzita en la aÅ­tomata saluto." #: src/dlgEditWorld.glade:3381 msgid "Options" msgstr "Opcioj" #: src/dlgEditWorld.glade:3411 msgid "A_utomatically start logging when connected" msgstr "AÅ­_tomate komenci registradon post konektado." #: src/dlgEditWorld.glade:3417 msgid "" "If this is selected, logging will be automatically started whenever you " "connect to the world." msgstr "" "Se ĉi tiu estas elektata, la registrado komencos aÅ­tomate kiam vi konektas " "al mono." #: src/dlgEditWorld.glade:3427 msgid "Prefix lines with _date and/or time" msgstr "AntaÅ­inserti en la linioj la _daton kaj/aÅ­ la horon" #: src/dlgEditWorld.glade:3433 msgid "" "Select this if you want to prefix each line in the log file with the date " "and/or time it was received." msgstr "" "Elektu ĉi tiun se vi volas antaÅ­inserti en ĉiu linio la horo kaj/aÅ­ dato " "kiam la linio estis recevita." #: src/dlgEditWorld.glade:3461 msgid "_Format:" msgstr "_Formo:" #: src/dlgEditWorld.glade:3474 msgid "" "The default is to prefix lines with the date and time, but you can configure " "the format with strftime() escape sequences. See the manual for a " "description of those." msgstr "" "La defaÅ­lto estas antaÅ­inserti en la linioj la daton kaj horon, se vi povas " "konfiguri la formon kun strftime() espaksekvencoj. Vidu la manlibron por " "priskribo pri ĉi tio." #: src/dlgEditWorld.glade:3483 msgid "Revert to _default" msgstr "Uzi la _defaÅ­lton" #: src/dlgEditWorld.glade:3549 msgid "Scripting" msgstr "Skriptdosiero" #: src/dlgEditWorld.glade:3585 msgid "_Perl file to load:" msgstr "_Perl dosiero por ÅarÄi:" #: src/dlgEditWorld.glade:3608 src/dlgMLSend.glade:80 msgid "_Clear" msgstr "_Purigi" #: src/dlgEditWorld.glade:3675 msgid "Plugins Currently Loaded" msgstr "ÅœarÄataj plugins" #: src/dlgEditWorld.glade:3754 msgid "_Load" msgstr "Åœ_arÄi" #: src/dlgEditWorld.glade:3821 msgid "Plugins Loaded on Startup" msgstr "Plugins ÅarÄataj ĉe la startigo" #: src/dlgEditWorld.glade:3987 msgid "MCCP (for compression)" msgstr "MCCP (por kompaktigo)" #: src/dlgEditWorld.glade:4017 msgid "_Enable if server proposes after connecting" msgstr "_Ebligi se la servilo proponas post konekto" #: src/dlgEditWorld.glade:4033 msgid "Enable if server proposes at _any time" msgstr "E_bligi se la servilo proponas ĉiam" #: src/dlgEditWorld.glade:4049 msgid "_Disable" msgstr "_Malebligi" #: src/dlgEditWorld.glade:4110 msgid "Scrolling" msgstr "Rolumo" #: src/dlgEditWorld.glade:4141 msgid "Scroll on _output" msgstr "Rolumi kiam alvenas _novan tekston" #: src/dlgEditWorld.glade:4146 msgid "" "Check to have the main window scroll to the end whenever new output comes" msgstr "Marku por ke la ĉeffenestro rolumu kiam novan tekston alvenas" #: src/dlgEditWorld.glade:4161 msgid "_Lines to save in scrollback buffer:" msgstr "_Linioj por konservi en rolumadbufro" #: src/dlgEditWorld.glade:4175 msgid "" "Specify the number of lines of output that can be seen with by scrolling the " "window" msgstr "" "Informu la nombron de linioj kiu povas esti vidataj rolumante la ĉeffenestro" #: src/dlgEditWorld.glade:4217 msgid "Name display" msgstr "Montrado de nomo" #: src/dlgEditWorld.glade:4247 msgid "Identify as 'World name'" msgstr "Identigi kiel 'Mondnomo'" #: src/dlgEditWorld.glade:4260 msgid "Identify as 'World name - Character'" msgstr "Identigi kiel 'Mondnome - Rolulo'" #: src/dlgEditWorld.glade:4273 msgid "Identify as 'Character - World name'" msgstr "Identigi kiel 'Rolulo - Mondnomo'" #: src/dlgEditWorld.glade:4290 msgid "Custom: " msgstr "Altra: " #: src/dlgEditWorld.glade:4323 msgid "" "Use %Kw to represent the World's name, and %Kc to represent the auto-logon " "character name" msgstr "" "Uzu %Kw por reprezenti la Mondnomon kaj %Kc por reprezenti la rolulon uzita " "en la aÅ­tomata saluto." #: src/dlgEditWorld.glade:4411 msgid "_File:" msgstr "_Dosiero:" #: src/dlgEditWorld.glade:4442 msgid "" "You can leave this field blank, and a file name will be automatically " "generated. Only edit this field if you know what you are doing." msgstr "" "Vi povas lasi ĉi tiun kampon blanka, kaj dosiernomo aÅ­tomate generiÄos. " "Redaktu ĉi tiun kampon nur se vi scias tiun, kiun vi faras." #: src/dlgEditWorld.glade:4475 msgid "Character Set" msgstr "Signaro" #: src/dlgEditWorld.glade:4504 msgid "Character _set:" msgstr "_Signaro:" #: src/dlgEditWorld.glade:4549 msgid "Graphical Editors" msgstr "Grafikaj Redaktiloj" #: src/dlgEditWorld.glade:4579 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "_Peti konfirmon antaÅ­ forigo de triggers, aliases, ktp." #: src/dlgEditWorld.glade:4584 src/dlgEditWorld.glade:4675 msgid "" "If not checked, objects such as triggers, aliases, etc. will be deleted " "directly without asking for confirmation when you press the Delete button." msgstr "" "Se ĉi tiun ne estas markata, objektoj kiel triggers, aliases, ktp. foriÄos " "rekte sen antaÅ­a konfirmo kiam vi klakas la Forigi butonon." #: src/dlgEditWorld.glade:4597 msgid "_Show items defined by plugins" msgstr "_Montri objektojn difinitaj de plugins" #: src/dlgEditWorld.glade:4602 msgid "" "If checked, triggers, aliases, macros and timers defined in plugins will " "appear in the corresponding World Editor sections." msgstr "" "Se markata, triggers, aliases, macros kaj timers definataj de plugins estos " "montrataj en la propaj sekcioj de la Mondredaktilo." #: src/dlgEditWorld.glade:4640 msgid "TCP Keep Alive" msgstr "" #: src/dlgEditWorld.glade:4670 msgid "Enable TCP _Keep Alive packets" msgstr "" #: src/dlgEditWorld.glade:4689 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "(Vi devas rekonekti por aktivigi ÅanÄo en ĉi tiu opicio)" #: src/dlgEditWorld.glade:4722 msgid "Input" msgstr "Enigo" #: src/dlgEditWorld.glade:4752 msgid "_Disable up and down arrow keys for history navigation" msgstr "_Malkativi savoklavojn por navigi komandhistorion" #: src/dlgEditWorld.glade:4757 msgid "" "If checked, the up and down arrow keys are not used for navigating between " "saved commands. (You'll have to use Alt+up and Alt+down.)" msgstr "" "Se markata, la supran kaj suban sagoklavojn ne povos esti usataj por\n" "navigi la komandhistorion. (Neĉesos uzi Alt+supren kaj Alt+suben.)" #: src/dlgTestTriggers.glade:24 msgid "Enter _line to be matched against the triggers:" msgstr "Informu _linion por provi kongrui kon la trigger-j:" #: src/dlgTestTriggers.glade:41 msgid "" "The text entered here will be matched against triggers as if it were a line " "coming from the MUD" msgstr "" "La teksto informata ĉi tie estos uzata por provi kongrui kun la triggers " "kvazaÅ­ Äi estus linioj riĉevita el la MUD" #: src/dlgTestTriggers.glade:51 src/dlgMLSend.glade:321 #: src/dlgCmdHistory.glade:241 msgid "_Send" msgstr "_Sendi" #: src/dlgTestTriggers.glade:56 msgid "Click the run the triggers against the line." msgstr "Klaku por provi kongrui triggers kun la linio." #: src/dlgTestTriggers.glade:90 msgid "Number of triggers that matched:" msgstr "Nombro de triggers kiu kongrui:" #: src/dlgTestTriggers.glade:119 msgid "Commands that would be sent:" msgstr "Komandoj kiu estus sendota:" #: src/dlgTestTriggers.glade:151 msgid "This is what would be printed in the main screen:" msgstr "Ĉi tiu estus montrata en la ĉeffenestro:" #: src/dlgTestTriggers.glade:163 msgid "" "This is what would be printed in the main screen. If empty, the line has " "been gaged. It can be different from the original line because of rewriter " "triggers." msgstr "" "Ĉi tio estus montrata en la ĉeffenestro. Se Äi estas blanka, la linio estis " "ellasita. Äœi povas esti malsama al la originala linio kaÅ­ze de reskribitaj " "trigger-j." #: src/dlgTestTriggers.glade:180 msgid "Would this line be included in the log file?" msgstr "Ĉu tiu linio estus skribata en la registraddosiero?" #: src/dlgMLSend.glade:7 msgid "Multi-line send" msgstr "Sendi plurajn liniojn" #: src/dlgMLSend.glade:20 msgid "Send this text _initially:" msgstr "Sendi tiun tekson _iniciale:" #: src/dlgMLSend.glade:42 src/dlgMLSend.glade:127 msgid "Enter some text to be sent to the World" msgstr "Tajpu tekston por sendi al la Mondo" #: src/dlgMLSend.glade:55 msgid "Then send the _contents of this file:" msgstr "Post tio sendi la _enhavon de tiu dosiero:" #: src/dlgMLSend.glade:105 msgid "_Finally, send this text:" msgstr "_Fine, sendi tiun tekston:" #: src/dlgMLSend.glade:150 msgid "Add this to the _beginning of each line:" msgstr "Aldoni tion al la _komenco de ĉiu linio:" #: src/dlgMLSend.glade:165 msgid "Specify some text to be prepended to each sent line" msgstr "Tajpu tekson por esti aneksata al la komenco de ĉiu sendata linio" #: src/dlgMLSend.glade:179 msgid "Add this to the _end of each line:" msgstr "Aldoni tion al la fi_no de ĉiu linio:" #: src/dlgMLSend.glade:194 msgid "Specify some text to be appended to each sent line" msgstr "Tajpu tekson por esti aneksata al la fino de ĉiu sendata linio" #: src/dlgMLSend.glade:210 msgid "_Delay" msgstr "_Atendi" #: src/dlgMLSend.glade:224 msgid "Specify the delay between sending the group of lines" msgstr "Informu tempon por atendi inter la sendado de ĉiu grupo de linioj" #: src/dlgMLSend.glade:239 msgid "seconds e_ach" msgstr "_sekundoj ĉiu" #: src/dlgMLSend.glade:253 msgid "Specify how many lines are sent at once" msgstr "Informu kiom da linioj estas sendata samtempe" #: src/dlgMLSend.glade:267 msgid "line(s)" msgstr "linio(j)" #: src/dlgMLSend.glade:285 msgid "_Keep dialog open after sending" msgstr "_Teni fenestro malferma post sendi" #: src/dlgCmdHistory.glade:7 msgid "Command History" msgstr "Komandhistorio" #: src/dlgCmdHistory.glade:51 msgid "Find a command containing a given search term" msgstr "Trovi komandon enhavantan specifikatan tekson." #: src/dlgCmdHistory.glade:63 msgid "Find _next" msgstr "Trovi _proksiman" #: src/dlgCmdHistory.glade:69 msgid "Find the next command with the same match text" msgstr "Trovi la proksiman komandon enhavantan la saman tekson." #: src/dlgCmdHistory.glade:107 msgid "Dela_y" msgstr "_Atendi" #: src/dlgCmdHistory.glade:120 msgid "Specify the delay between sending the group of commands" msgstr "Informu tempon por atendi inter la sendado de ĉiu grupo de komandoj" #: src/dlgCmdHistory.glade:135 msgid "sec_onds each" msgstr "_sekundoj ĉiu" #: src/dlgCmdHistory.glade:149 msgid "Specify how many commands are sent at once" msgstr "Informu kiom da komandoj estas sendata samtempe" #: src/dlgCmdHistory.glade:163 msgid "commands(s)" msgstr "komando(j)" #: src/dlgCmdHistory.glade:184 msgid "Newest commands are on the top" msgstr "Plej novaj komandoj estas supre" #: src/dlgCmdHistory.glade:205 msgid "_Recall" msgstr "" #: src/dlgCmdHistory.glade:211 msgid "Put the selected command in the command entry box" msgstr "Meti la selektatan komandon en komandskatolo" #: src/dlgCmdHistory.glade:223 msgid "Rec_all & Close" msgstr "" #: src/dlgCmdHistory.glade:229 msgid "Put the selected command in the command entry box and close this dialog" msgstr "" "Meti la selektatan komandon en komandskatolo kai fermi ĉi tiun fenestron" #: src/dlgCmdHistory.glade:247 msgid "Send the selected command(s) to the mud" msgstr "Sendi la selektata(j)n komando(j)n al al mud" #: src/dlgCmdHistory.glade:259 msgid "S_end & Close" msgstr "S_endi & Fermi" #: src/dlgCmdHistory.glade:265 msgid "Send the selected command(s) to the mud and close the dialog" msgstr "" "Sendi la selektata(j)n komando(j)n al al mud kaj fermi ĉi tiun fenestron" #: src/dlgCmdHistory.glade:305 msgid "Find Command" msgstr "Trovi komandon" #: src/dlgCmdHistory.glade:321 msgid "_Text to find:" msgstr "_Teksto por trovi:" #: src/dlgCmdHistory.glade:334 msgid "Enter the text to search for" msgstr "Informu la tekson por trovi" #: src/dlgCmdHistory.glade:353 msgid "Search direction:" msgstr "Direkto de serĉado:" #: src/dlgCmdHistory.glade:367 msgid "_Downwards" msgstr "_Malsupren" #: src/dlgCmdHistory.glade:383 msgid "_Upwards" msgstr "_Supren" #: src/mnuPopupURL.glade:8 msgid "Open Link" msgstr "Malfermi ligilon" #: src/mnuPopupURL.glade:23 msgid "Copy Link Address" msgstr "Kopii ligiladreson" #: share/kildclient.pl:76 share/kildclient.pl:97 share/kildclient.pl:117 #: share/kildclient.pl:182 share/kildclient.pl:433 share/kildclient.pl:511 #: share/kildclient.pl:589 share/kildclient.pl:602 share/kildclient.pl:615 #: share/kildclient.pl:628 share/kildclient.pl:641 share/kildclient.pl:654 #: share/kildclient.pl:667 share/kildclient.pl:680 share/kildclient.pl:694 #: share/kildclient.pl:708 share/kildclient.pl:718 share/kildclient.pl:730 #: share/kildclient.pl:742 share/kildclient.pl:754 share/kildclient.pl:767 #: share/kildclient.pl:983 share/kildclient.pl:1016 #, perl-format msgid "%s: Too few arguments." msgstr "%s: Mankas argumentoj." #: share/kildclient.pl:207 share/kildclient.pl:567 #, perl-format msgid "No such %s" msgstr "Ne ekzistas tiun %s" #: share/kildclient.pl:298 share/kildclient.pl:316 share/kildclient.pl:334 #: share/kildclient.pl:352 share/kildclient.pl:370 #, perl-format msgid "%s: Wrong number of arguments." msgstr "%s: MalÄusta nombro de argumentoj." #: share/kildclient.pl:403 share/kildclient.pl:411 share/kildclient.pl:489 #: share/kildclient.pl:497 #, perl-format msgid "No such %s." msgstr "Ne ekzistas tiun %s." #: share/kildclient.pl:425 #, perl-format msgid "No %s deleted." msgstr "Neniu %s eksigita." #: share/kildclient.pl:427 #, perl-format msgid "One %s deleted." msgstr "Unu %s eksigita." #: share/kildclient.pl:429 #, perl-format msgid "%d %s deleted." msgstr "%d %s eksigitaj." #: share/kildclient.pl:506 #, perl-format msgid "Successfully moved %s." msgstr "Sukcese movis %s." #: share/kildclient.pl:798 msgid "Could not open file." msgstr "Ne eblas malfermi dosieron." #: share/kildclient.pl:828 msgid "Unknown" msgstr "Ne konata" #: share/kildclient.pl:835 msgid "Invalid plugin file." msgstr "Plugindosiero ne valida." #: share/kildclient.pl:866 msgid "Plugin already loaded. Try enabling it." msgstr "Plugin jam ÅarÄita. Provu ebligi Äin." #: share/kildclient.pl:868 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "Eldono %s de tiu plugin jam estas ÅarÄita." #: share/kildclient.pl:878 #, perl-format msgid "Error in plugin file: %s" msgstr "Eraro en plugindosiero: %s" #: share/kildclient.pl:890 msgid "Cannot load a plugin in another world." msgstr "Ne eblas ÅarÄi plugin en alia mondo." #: share/kildclient.pl:895 share/kildclient.pl:915 msgid "Plugin not specified" msgstr "Plugin ne informata." #: share/kildclient.pl:902 share/kildclient.pl:933 msgid "Plugin not loaded." msgstr "Plugin ne ÅarÄita." #: share/kildclient.pl:905 #, perl-format msgid "Plugin '%s' loaded." msgstr "Plugin '%s' ÅarÄita." #: share/kildclient.pl:921 #, perl-format msgid "Could not load plugin %s" msgstr "Ne eblas ÅarÄi plugin %s" #: share/kildclient.pl:997 msgid "Plugin enabled." msgstr "Plugin ebligita." #: share/kildclient.pl:1030 msgid "Plugin disabled." msgstr "Plugin malebligita." #: share/kildclient.pl:1150 msgid "Cannot open help file." msgstr "Ne eblas malfermi helpdosieron." #: share/kildclient.pl:1168 msgid "Help topic not found." msgstr "Helptemo ne trovata." #: share/kildclient.pl:1174 msgid "" "Warning: the getwindowsize() function is deprecated and will be removed." msgstr "Averto: la funkcio getwindowsize() removiÄos future." #: share/kildclient.pl:1175 msgid "Use $window->getsize() instead." msgstr "Uzu $window->getsize() anstataÅ­." #: share/kildclient.pl:1180 msgid "Warning: the minimize() function is deprecated and will be removed." msgstr "Averto: la funkcio minimize() removiÄos future." #: share/kildclient.pl:1181 msgid "Use $window->minimize() instead." msgstr "Uzu $window->minimize() anstataÅ­." #: share/kildclient.pl:1186 msgid "Warning: the path() function is deprecated and will be removed." msgstr "Averto: la funkcio path() removiÄos future." #: share/kildclient.pl:1187 msgid "Use $world->path() instead." msgstr "Uzu $world->path() anstataÅ­." #~ msgid "Maximum" #~ msgstr "Maksimumo" #~ msgid "None" #~ msgstr "Minimumo" #~ msgid "Background" #~ msgstr "Foro" #~ msgid "_Image:" #~ msgstr "_Bildo:" #~ msgid "_None: use solid color" #~ msgstr "_Neniu: uzi solidan koloron" #~ msgid "_Shade image or transparent background:" #~ msgstr "_Malheligi bildon aÅ­ travideblan foron:" #~ msgid "_Transparent" #~ msgstr "_Travidebla" kildclient-2.11.1/po/eo.gmo0000644000175000017500000016537211570463465012415 00000000000000Þ•¬|—Ü*89~99 ¸9Æ9Õ9Þ9÷9:+:H:]:Lo:7¼:ô: ;!;"?;"b;…;;¼;5Ø;5<&D<k<…<(¢<Ë<à<õ<=6$='[=6ƒ='º=;â=>):>?d>¤>¬> ³>½>Î>á>õ>? ?=?R?d? z?†? ž?ª? Ã?Ð?æ?@ @%@4@ T@ u@‚@¢@³@Ä@Ú@î@þ@A-AB>A+A$­AÒA(ÙA"B%B .B;B‚KBÎB#ÖB úB*C00C6aC˜C ŸCªC °C ¼C ÊC­×C…D•D¥DÂD áDïD EE"E&(EOEfExE ‘E žE¨E8¸EJñE‹ŒmŒ uŒŒ&œŒ ÃŒ!ÏŒ&ñŒ(-HN_)g‘—¬³µÉÌZÓ2.ŽaŽ |ŽŠŽ ’ޠަ޻ŽÂŽÊŽÓŽçŽéŽuíŽ~c âð ‘ ‘ ‘8‘O‘o‘…‘IŸ‘6é‘ ’6’M’ i’#Š’®’#Î’ò’;“3N“!‚“¤“Á“%á“””+”A”>]”$œ”>Á”%•@&•g•5€•;¶•ò•û• ––$–8–I–a–#p–”–­–¼–Õ–ä– û– — $—1—C—`— x— …—“—)­—×—"ì—˜ $˜2˜R˜k˜˜‘˜±˜=Ę.™'1™Y™)]™&‡™®™·™Æ™–×™nš)vš š(¦š.Ïš5þš4› <›H›N›T› c›¼q› .œ;œ"Jœ$mœ’œ¢œ µœÜÕœ&Ýœ$4M\ c'mP•‡æZnžPÉž>ŸoYŸ>ÉŸ8 ;A R} FРA¡ÒY¡B,¢>o¢9®¢Eè¢J.£0y£Xª£„¤ˆ¤.¤0¿¤Gð¤%8¥^¥f¥u¥ˆ¥œ¥¸¥Ë¥Þ¥ò¥ ¦¦)¦?¦?O¦&¦b¶¦I§Hc§@¬§í§¨¨+%¨2Q¨!„¨"¦¨)ɨ"ó¨©+1©&]©#„©>¨©ç©ª$"ª.Gª"vª™ª¸ªתݪäªìª üª«« «=«]«o«‚«”« ¨«µ«Ñ«&ñ«¬1¬E7¬'}¬¥¬(º¬Ç㬫­½­ Ý­ è­ ò­ü­!®/>®3n®¢®A«®?í®&-¯ T¯ ^¯l¯‡¯ ¥¯ ²¯ À¯ίÞ¯,í¯°$7°\°3e°X™°%ò°3±2L±3±3³±5ç±#²A²=Z²4˜²1Ͳ:ÿ²1:³5l³V¢³Iù³PC´"”´l·´8$µ;]µ™µ·µÔµðµ ¶0(¶'Y¶%¶ §¶±¶ ¹¶ö̶ß¶!ç¶ ··-·<·M·^· n·|·.·7¼·ô·¸¸¸ ¸)¸F>¸y…¸ÿ¸¹¹J.¹y¹¹¹™¹¢¹!ª¹!̹ˆºŸº‰»X©»U¼X¼A`¼¢¼6¨¼ ß¼é¼/ ½89½r½‰½œ½µ½@̽ ¾¾ +¾7¾=¾S¾f¾{¾¾¤¾ µ¾!Á¾ã¾ ö¾ ¿¿%¿>¿ T¿'u¿¿¢¿²¿LÿÀÀ &À 3À(AÀ jÀtÀ’À¨À¬À¿ÀÄÀãÀÁÁ:ÁITÁžÁ·ÁËÁàÁøÁÂ(ÂAÂY rÂ~ „ ‘ ŸÂ ªÂÚ¶Â‘à ±Ã ¼Ã#ÝÃÄÄ(Ä;ÄLÄ^ÄsćÄC˜ÄFÜÄ#Å4Å#HÅ lÅwŀʼnŚŬžÅÎÅÕÅ(ìÅÆ)Æ:ÆOÆbdÆÇÆÏÆÖÆ5߯#ÇR9Ç/ŒÇ ¼Ç ÇÇÕÇ+íÇÈ(È#=ÈaÈ,xÈI¥ÈïÈöÈÉ"É 9É EÉOÉhÉ‡É šÉ¦É ÄÉ"åÉÊÊ,ÊGÊ WÊ"eʈʞÊ8³Ê7ìÊU$ËAzËT¼Ë@ÌRÌ&lÌ$“Ì'¸Ì%àÌ$Í#+ÍjOÍCºÍ,þÍI+ÎuΒΚÎ=²Î ðÎ þÎ/ Ï-<ÏRjÏ?½ÏBýÏ%@Ð'fÐDŽÐBÓÐDÑN[Ñ`ªÑI ÒMUÒ=£Ò0áÒÓ Ó &Ó2Ó 8ÓCÓ UÓcÓlÓ­}Ó"+Ô!NÔpÔvÔøÔÕ*$Õ5OÕ4…Õ¦ºÕ*aÖkŒÖ÷øÖ3ð×$Ø4Ø•EØÛØâØôØüÙÚ" Ú*/Ú)ZÚ1„Ú ¶Ú-ÀÚîÚ'Û!)Û"KÛnÛcŒÛðÛ@ùÛ:Ü9SÜÜ3¥Ü ÙÜ äÜîÜ,õÜ"ÝBÝERÝ5˜Ý0ÎÝ,ÿÝ,Þ>Þ4PÞ0…Þ=¶ÞôÞ߇ßßK®ßúßà0à Kàlà ‹àq¬à á )á3á 9á8Eá~á…áŒá”á§áD¯á ôá1ÿá 1â=â#Dâ hâ,sâ â ©â+µâ áâëâ ôâþâã+!ãMã Vã`ãhãoã/vã ¦ã°ãÀãÑãÚãíã ää %ä 1ä;ä"Nä>qä4°äåä$íäåå "å,å"Fåiå på-zå.¨å ×å âåíåæ ææ #æ.æ@æUæqæ&xæŸæ ±æ Òæ ßæìæGçMçbç uç‚ç Šç–çžç¥çÄçËçÛçòç#øç%èBèJèQè$gè Œè#—è&»èâèùèþèé é5é1>épévé”é›éé¯é ²é_½é:ê(Xêêê™ê¨ê®êÌêÓêÛêäêôêöê—”W­î1KoFÍŒ0MQ‹ ùï÷žn”[R• ûD9Ý“BF)`C¯>4q_º~žñÛV}óz<­,eW¼^ôd‹ö˜LhÇOÇ‚fp% Ía‡æHTLÃíy§<”a>7ÕE:wˆ@ˆúDd¿•¦T‘I‘Xy™(ŸÙ&‰&v2˜uÑ@yÿã¨sew矼¢m r¥æmëí¡‰OÓ²ÊN\*c«0µÚ‰`YÉœjðim½Z´-«©lîÚ—k`sá¸<‚8K“¾S~9Š4QÄÜ Á±A$¬Cè%Üü4ic,Ìs\ÆÏøZ§•lz3W#–.£‡;MI¦ ¦oÿ?šÅžïšUØ“et°2ýÈŽY¨bGð›Ø5*¥Ìu^ UÕ6)E_]'Ï!»å¹Pª†œüתh³¬¾ãv(#ß!ŒXV8¤fÆnQ ¢ »EõJuB=Läw.þ™Pìù©—kJƒ] V€¿JT3/·Áކø\¥HÔЊp";R Š[èÞSo=µNéàÝ‚½®Agò|Ô|Hâ? ’|#CÀ5þ¡¨+Ö Ê ’ / €å:1_õ¹c€Éƒ5ãÎÒD„gôO[+%Å),ç´  ûxÀg12¶j†k^x›…r™}>tŸ9ë·ß$¸KÞh³Â@7ñ‹ÎjGU¤‡rá¯nófŽxÛÒ$0£ˆêz°3ª6;ŒË(–"Ð!lv =*i„ú-}{q§?:‘Y/ö›…«˜.pòA×éBb¶G67êMa8Ñàýd¬’윮ä{t¢S{+'º…]Z–ÖıP&'X©„FË~q÷²N ¡¤-Iƒ Ób"RÈšÙâ Target: %d Foreground: %d Background: %d Italics: %d Striked-thru: %d Underline: %d SSL enabled.%d %s deleted.%d lines%s is already permanent.%s: %s is already permanent%s: %s is not permanent%s: Argument must be numeric%s: Invalid key code%s: No such world%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent%s: This is an internal function, do not call directly.%s: Too few arguments%s: Too few arguments.%s: Too many string arguments%s: Variable '%s' made permanent. %s: Variable '%s' made temporary. %s: Wrong argument type%s: Wrong number of arguments.%s: Wrong type of reference%s: action given twice, using the named attribute one%s: action not specified, and isn't gag, not creating%s: action not specified, not creating%s: count must be numeric%s: interval must be numeric%s: interval not specified, not creating%s: invalid bg color%s: invalid fg color%s: invalid target%s: invalid underline style%s: keycode given twice, using the named attribute one%s: keycode not specified, not creating%s: pattern given twice, using the named attribute one%s: pattern not specified, not creating%s: substitution given twice, using the named attribute one(-1 to repeat indefinitely)(Leave blank for default based on locale)(You must reconnect for changes in this setting to take effect)0 lines1 line: Expired: Not yet activeAnsi ColorsAudio PlayerAuto-loginCharacter SetColors used by KildClientCommand EntryConnectionDefault ColorsFileFlood preventionFontGraphical EditorsInputLogging StatusMCCP (for compression)Name displayNote:OptionsPlugins Currently LoadedPlugins Loaded on StartupProxyRevert to default colorsScriptingScrollingSending DelaysTime DisplayTooltipsWeb BrowserWindow configurationWord WrapA mud client with powerful features and support for Perl ScriptingA_utomatically start logging when connectedActi_vate auto-completion only afterActionAdd this to the _beginning of each line:Add this to the _end of each line:AdvancedAlias added.Alias modified.Alias number %d Name: %s Pattern: %s Substitution: %s Ignore case: %s Eval as Perl: %s Enabled: %s AliasesAlways load this plugin at _startupAppearanceAre you sure you want to close this world?Attempting to connect to host %s (%s) port %s...Attempting to connect to proxy host %s (%s) port %s...AuthorAutomationB_lueBac_kgroundBl_ack (Bold)Bl_ue (Bold)Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) Bold BackgroundBold ForegroundBytes received (compressed):Bytes received (decompressed):C_hange styleC_ommand separator:C_onfigure...C_onnected time:C_yanCannot load a plugin in another world.Cannot open help file.Certificate type:Ch_aracters in this mud:Change StyleCharacterCharacter _set:Check if you want lines to be wrapped at word boundariesCheck if you want the highlighted ANSI colors to be displayed in bold alsoCheck if you want tooltips to be displayed showing the time when a line was received if you leave the mouse over the line for a short whileCheck this if the text you type is displayed as black dots in the input box.Check to enable command auto-completion (based on previous commands)Check to have the command history saved in a file between sessionsCheck to have the last command kept in the command entry box, so that you can repeat commands only by pressing ENTERCheck to have the main window scroll to the end whenever new output comesCheck to have the sent commands echoed in the main output windowCheck to have the substitution be executed in a s///e constructionCheck to have the timer deleted after its repeat count has reached 0Check to make the alias enabled; only enabled aliases are triedCheck to make the hook enabled; only enabled hooks are runCheck to make the idle time counter reset only when a command is entered directly by typing it in the command entry box. If not checked, if a command is sent because of a timer, of a hook, etc, the idle timer is also reset.Check to make the macro enabled; only enabled macros are runCheck to make the matched line not be printed in the log fileCheck to make the matched line not be printed in the main output windowCheck to make the timer enabled; only enabled timers are runCheck to make the trigger enabled; only enabled triggers are triedCheck to make this trigger a rewriter triggerCheck to make this trigger not prevent further triggers from being tried, if it matchesCheck to prevent more than a given number of equal commands to be sent in a row (which can disconnect your character in some muds)Cipher:Click the run the triggers against the line.Click to clear the command input area.Click to open link; right-click for more options.Click to revert all colors to their built-in defaultsColorsCommand HistoryCommand _History...Command not found.Commands that would be sent:Compression algorithm:Compression ratio:Compression used:Confirm deletionConnect toConnect to _AnotherConnect to another worldConnect without SSLConnected to host %s (%s) port %s, MCCP version %d enabled.Connected to host %s (%s) port %s.Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d enabled.Connected to host %s port %s, via proxy %s (%s) port %s.Connected to proxy server %s port %s, negotiating authentication...Connected to proxy server %s port %s, sending request...Connection _Style:Connection time:Copy Link AddressCould not connect to host %s port %s: %sCould not connect to host %s port %s: Error #%dCould not create directory '%s': %sCould not create socket: %sCould not create socket: error #%dCould not import file '%s': %sCould not load plugin %sCould not load world from file '%s': %sCould not open dump file %s: %s Could not open file '%s': %sCould not open file '%s': %s Variables were not saved.Could not open file.Could not open file: %sCould not open log file.Could not open raw dump file %s: %s Could not open world '%s': %s Could not resolve host %s: %sCould not start name-resolution thread.CountCount Custom: Cya_n (Bold)DIRDela_yDeleteDescriptionDirectory to store settings and saved worldsDisable T_imersDisable _AliasesDisable _MacrosDisable _TriggersDisconnectedDisconnected from host %s.Disconnected from host %s: %s.Disconnected from host %s: error #%d.Disconnected from world %sDisplayDisplay _tooltips with the time when the line was receivedDisplay as hours, minutes and secondsDisplay as secondsDo not allow the _same command to be sentDo not change Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) Do not change No YesDo not change None Single DoubleDo not connectDo not deleteDo not displayDo you really want to delete %d %s?Do you really want to delete the %s?Do you really want to make %d variables temporary?Do you really want to make the variable temporary?Don't quitDumps all data received (possibly compressed) to the fileDumps all data received from (after decompression, if appropriate) to the fileE_val substitution as Perl statementE_xportEdit AliasEdit Character InformationEdit Default _World...Edit HookEdit MacroEdit TimerEdit TriggerEdit WorldElement '%s' not allowed inside element '%s'Enable _auto-completionEnable if server proposes at _any timeEnabledEnter _line to be matched against the triggers:Enter a command to be sent whenever the specified maximum number of equal commands would be sentEnter a descriptive name for the WorldEnter optionally a descriptive name for the aliasEnter optionally a descriptive name for the hookEnter optionally a descriptive name for the macroEnter optionally a descriptive name for the timerEnter optionally a descriptive name for the triggerEnter some text to be sent to the WorldEnter some text to search for.Enter the action that will be run when a match happensEnter the action to be executed whenever the timer firesEnter the action to be run when the event happensEnter the action to be run when the key is pressedEnter the character's name for automatic loginEnter the character's password for automatic loginEnter the command to run a web browser. %s will be substituted by the web page address.Enter the command to run an audio player program. %s will be substituted by the file path.Enter the default parameters for sending multiple lines or commands:Enter the host to connect toEnter the name of a scalar ($), array (@) or hash (%) variable whose contents are to be saved between sessions of the WorldEnter the pattern to match against received linesEnter the pattern to match against typed commandsEnter the port used when connectingEnter the substitution to be executedEnter the text to search forError Loading PluginError in plugin file: %sError loading UI from XML file: %sError setting spell checker: %s Error while reading from proxy host.Eval as PerlEvent:Expiration:ExportExternal ProgramsFILEFailed loading file %s: %sFileFile name not specified.Find CommandFind N_extFind Ne_xtFind NextFind PreviousFind _nextFind a command containing a given search termFind the next command with the same match textFingerprint:G_reen (Bold)GagGag LogGeneralHelp topic not found.Here you can set options to configure the appearance of KildClient.Here you can set options to configure the automation features of KildClient, such as triggers, aliases, plugins, etc.Hook defined.Hook modified.Hook not foundHook number %d for event %s Name: %s Action: %s Enabled: %s HooksHooks for '%s': Host:Hostname:I. CaseIdentify as 'Character - World name'Identify as 'World name - Character'Identify as 'World name'Idle time:If checked, the up and down arrow keys are not used for navigating between saved commands. (You'll have to use Alt+up and Alt+down.)If checked, triggers, aliases, macros and timers defined in plugins will appear in the corresponding World Editor sections.If not checked, objects such as triggers, aliases, etc. will be deleted directly without asking for confirmation when you press the Delete button.If this is checked, when there is only one open world no tabs will be shownIf this is selected, logging will be automatically started whenever you connect to the world.ImportInform number of lines to include in the log.InputInternal error: element '%s' ends when in START modeIntervalInvalid argument '%s' Invalid attribute '%s' for element '%s'Invalid function call: syntax is $world->FUNCTIONInvalid key code '%s'Invalid key code.Invalid plugin file.Invalid top-level element '%s'Invalid window size specification in config file. Keep ExecKeep _openKeep permanentKeyKey exchange:KildClient ErrorKildClient InformationKildClient QuestionKildClient WarningKildClient readyLanguage code:Left Right Top BottomLines received:Load pluginLoggingLogging is disabled.Logging not startedLogging stopped.Logging to file %s.Logging to file %s. MAC:Macro added.Macro modified.Macro number %d Name: %s Key Code: %s Action: %s Enabled: %s MacrosMagen_ta (Bold)Main WindowMake temporaryMaximum line width in _characters:MiscellaneousMore than one command selected.Multi-line sendN/AN_umber of lines:NameNever _hide the typed textNewest commands are on the topNoNo %s deleted.No acceptable proxy authentication methods.No auto-login diku (char, pass) lp (CONNECT char pass)No command selected.No such %sNo such %s.No such aliasNo such hookNo such macroNo such pluginNo such timerNo such triggerNo worldNoneNot connectedNot connected.Not foundNot setNote: You can use strftime() escapes to create different files based on the date and time that logging starts. Also, %Kw represents the World name and %Kc the character name used in auto-logon.Number of triggers that matched:OfflineOmit (_gag) from outputOmit (gag) from _log fileOnCloseConnected HooksOnConnect HooksOnDisconnect HooksOnGetFocus HooksOnLoseFocus HooksOnReceivedText HooksOnSentCommand HooksOne %s deleted.Only _reset idle time counter when a command is entered directlyOnly scalar ($), array (@) and hash (%%) variables can be made permanent.Open LinkOr connect d_irectly:Outputs version information and exitsPass_word:PasswordPatternPerforming SSL handshake...Permanent VariablesPermanent variablesPermenent variablePluginPlugin '%s' loaded.Plugin already loaded. Try enabling it.Plugin disabled.Plugin enabled.Plugin not loaded.Plugin not specifiedPlugin number %d Name: %s Version: %s Description: %s Author: %s Enabled: %s PluginsPort:PreferencesPrefix lines with _date and/or timePress a key to get its keycode.Press the key that will be used to activate the macro while the cursor is in the text box.Press the key that will be used to run the macroProtocolsProxyProxy _type:Proxy authentication failed.Proxy host:Proxy port:Proxy request failed: %s.Proxy type:Put the selected command in the command entry boxPut the selected command in the command entry box and close this dialogR_edRe_d (Bold)Re_vert to default colorsReally Quit KildClient?Really close?ReconnectResolving host %s...Resolving proxy host %s...Revert to _defaultRewriterSSL Handshake failed: %sSSL Handshake took too long.SSL not supported in this versionSSL protocol used:S_end & CloseS_pell check typed textS_tatistics...ScriptingScroll on _outputSe_nd this command:Search direction:Select if you do not want the connection time to be displayedSelect if you do not want the idle time to be displayedSelect if you want the connection time to be displayed in hours, minutes and secondsSelect if you want the connection time to be displayed in secondsSelect if you want the idle time to be displayed in hours, minutes and secondsSelect if you want the idle time to be displayed in secondsSelect log fileSelect the font used in the _main screen:Select the font used in the _status bar:Select the font used in the command _entry box:Select the font used in the command entry boxSelect the font used in the main output screenSelect the font used in the status barSelect this if you want to prefix each line in the log file with the date and/or time it was received.Select to include lines from the main window in the log file.Send the selected command(s) to the mudSend the selected command(s) to the mud and close the dialogSend this text _initially:SendingSending connection request...Sending proxy authentication credentials...Server _address:Server _port:Specify how many commands are sent at onceSpecify how many lines are sent at onceSpecify how many times this timer should run before being disabled or deletedSpecify some text to be appended to each sent lineSpecify some text to be prepended to each sent lineSpecify the command used to launch a web browserSpecify the command used to play sound files.Specify the delay between sending the group of commandsSpecify the delay between sending the group of linesSpecify the interval, in seconds, between timer activationsSpecify the maximum number of equal commands that can be sent in a rowSpecify the number of characters that must be typed for command completion to startSpecify the number of commands that are saved and can be later recalledSpecify the number of lines of output that can be seen with by scrolling the windowSpecify the separator for commands typed in the command entry boxSpell checking support not included in this build.St_artStatisticsStatus BarStyleSubstitutionSuccessfully moved %s.TTL expiredTempTest TriggersThe default is to prefix lines with the date and time, but you can configure the format with strftime() escape sequences. See the manual for a description of those.The help is displayed in main window.The interval must be positive.The matched substring numberThe text entered here will be matched against triggers as if it were a line coming from the MUDThe whole lineThe whole matched textThen send the _contents of this file:There are %d open worlds. Do you really want to quit?There is one open world. Do you really want to quit?This is what would be printed in the main screen. If empty, the line has been gaged. It can be different from the original line because of rewriter triggers.This is what would be printed in the main screen:This object belongs to a plugin. Changes made here will not be saved in the plugin.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 version of KildClient does not have SSL support.Timer added.Timer modified.Timer number %d Name: %s Interval: %d Repeat count: %d Action: %s Enabled: %s Temporary: %s TimersTrigger added.Trigger modified.Trigger number %d Name: %s Pattern: %s Action: %s Enabled: %s Ignore case: %s Gag output: %s Gag in log: %s Keep executing: %s Rewriter: %s Change style: %s TriggersUnable to connect to host %s: %s.Unable to connect to host %s: Error #%d.Unable to connect to proxy host %s: %s.Unable to connect to proxy host %s: Error #%d.UnknownUnknown directive '%s' in config file. Unnamed worldUnrecognized response from proxy host.Use $window->getsize() instead.Use $window->minimize() instead.Use $world->path() instead.Use %Kw to represent the World's name, and %Kc to represent the auto-logon character nameUse _SSLUse _bold font for highlighted colors (instead of just highlighting)Use _multi-line input barUse global settings No proxy SOCKS4 SOCKS5Use single-_line input barUse the Find button to find the first result.Valid since:VariablesVersionVersion %s of this plugin is already loaded.Visit http://kildclient.sf.netW_hite (Bold)Warning: Trying to send a very long command line. Perhaps a recursive alias definition?Warning: the getwindowsize() function is deprecated and will be removed.Warning: the minimize() function is deprecated and will be removed.Warning: the path() function is deprecated and will be removed.World name:World saved.Would this line be included in the log file?Wrap lines at full _screen widthWritten by Eduardo M Kalinowski (eduardo@kalinowski.com.br) Yell_ow (Bold)YesYou can leave this field blank, and a file name will be automatically generated. Only edit this field if you know what you are doing.You must specify a variable name.You must specify the action, unless the trigger is a gag or changes the style.You must specify the action.You must specify the key.You must specify the name.You must specify the password.You must specify the pattern.You must specify the substitution.You're attempting to connect to a world that uses SSL, but this version of KildClient has been built without SSL support. Try to connect without SSL?[WORLD...]_About_Action:_Apply to:_Ask for confirmation before deleting triggers, aliases, etc._Background:_Black_Clear_Command echo:_Delay_Delay between each group of lines/commands:_Disable_Disable up and down arrow keys for history navigation_Disconnect_Display_Do not display this message again_Downwards_Echo sent commands in main window_Edit_Edit..._Enable if server proposes after connecting_Enabled_Event:_File:_Finally, send this text:_Find:_Flash window when new text is received_Foreground_Foreground:_Format:_Green_Help_Hide tabs if only one world is open_Host:_Idle time:_Ignore case when matching_Import_Include the last_Indent wrapped lines by_Informative messages:_Input_Interval:_Italic:_Items to export_Keep dialog open after sending_Keep executing other triggers after this this one matches_Keep last typed command in command entry box_Key:_Lines to save in scrollback buffer:_Load_Magenta_Manual_Multi-line Send..._Name of variable to make permanent:_Name:_Next_Number of commands to save in history:_Number of lines/commands to send at once:_Password:_Pattern:_Perl file to load:_Port:_Preferences_Previous_Reconnect_Repeat count:_Rewriter trigger_Select a saved world:_Send_Show items defined by plugins_Split Window_Store commands between sessions_Striked-thru:_Substitution:_Tab position:_Temporary (will be deleted automatically when its repeat count reaches 0)_Test Triggers..._Text to find:_Underline:_Upwards_Username:_White_World_Wrap lines at word boundaries_Yellow_times in a rowaddress type not supportedaliasalias: not creating alias without patternalias: not creating alias without substitutionaliasescharactercharacters have been enteredcommand not supported / protocol errorcommands(s)connection not allowed by rulesetconnection refused by destination hostgeneral failurehookhook: hook '%s' not found hookshost unreachableline(s)lines of the scrollback buffer in the logmacromacro: No such macromacrosnnetwork unreachablenopixelsrequest failed because client's identd could not confirm the user ID string in the requestrequest failed because identd could not be reachedrequest rejected or failedsec_onds eachsecondsseconds e_achtimertimer: No such timertimerstriggertriggersunknown reason codeyyesProject-Id-Version: KildClient 2.11.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2011-05-29 12:33-0300 PO-Revision-Date: 2011-05-28 11:17-0300 Last-Translator: Eduardo M Kalinowski Language-Team: Eduardo M Kalinowski Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Celo: %d Fono: %d Malfono: %d Kursivo: %d Trastrekto: %d Substrekto: %d SSL ebligita.%d %s eksigitaj.%d linioj%s jam estas daÅ­ra.%s: %s jam estas daÅ­ra%s: %s ne estas daÅ­ra%s: Argumento devas esti numera%s: Invalida klavkodo%s: Ne ekzistas tiu mondo%s: Nur skalara ($), array (@) kaj hash (%%) variabloj povas iÄi daÅ­raj%s: Ĉi tiu funkcio estas interna, ne Äin voku rekte.%s: Mankas argumentoj%s: Mankas argumentoj.%s: Troaj ĉenaj argumentoj%s: Variablo '%s' iÄis daÅ­ra. %s: Variablo '%s' iÄis maldaÅ­ra. %s: Invalida speco de argumento%s: MalÄusta nombro de argumentoj.%s: Invalida speco de referenco%s: agado informita dufoje, uzante la de la nomata atributo%s: agado ne informita, kaj ne estas gag, ne kreita%s: agado ne informita, ne kreita%s: nombro devas esti numera%s: intervalo devas esti numera%s: intervalo ne informita, ne kreita%s: invalida 'bg'%s: invalida 'fg'%s: invalida 'target'%s: invalida substrektstilo%s: klavkodo informita dufoje, uzante la de la nomata atributo%s: klavkodo ne informita, ne kreita%s: Åablono informita dufoje, uzante la de la nomata atributo%s: Åablono ne informtita, ne kreita%s: anstataÅ­o informita dufoje, uzante la de la nomata atributo(-1 por repeti indefine)(Lasu blanka por la defaÅ­to surbazita en la lokaĵo)(Vi devas rekonekti por aktivigi ÅanÄo en ĉi tiu opicio)0 linioj1 linio: FiniÄita: Ne ankoraÅ­ aktivaAnsi KolorojAudludiloAÅ­tomata salutoSignaroKoloroj uzataj de KildClientEniro de komandojKonektoDefaÅ­taj KolorojDosieroEvito de inundoTiparoGrafikaj RedaktilojEnigoRegistradoMCCP (por kompaktigo)Montrado de nomoNotu:OpciojÅœarÄataj pluginsPlugins ÅarÄataj ĉe la startigoProkurserviloUzi la defaÅ­ltajn kolorojnSkriptdosieroRolumoMalfruigo Inter SendadojMontrado de TempoÅœpruchelpilojRetumiloKonfiguro de la fenestroLinirompadoMUDkliento kun potencajn eblojn kaj subtenon de Perl skriptojAÅ­_tomate komenci registradon post konektado.Akti_vigi aÅ­tomata kompletado nur postAgoAldoni tion al la _komenco de ĉiu linio:Aldoni tion al la fi_no de ĉiu linio:AvancitaAlias adiciitaAlias ÅanÄita.Alias numero %d Nomo: %s Åœablono: %s AnstataÅ­o: %s Ignori usklecon: %s Komp. kiel Perl: %s Ebligata: %s AliasesĈiam Åargi ĉi tiun plugin en _startigoAperoĈu vi vere volas fermi ĉi tiun mondon?Provante koneti al retnodo %s (%s) pordo %s...Provante koneti al prokurservilon %s (%s) pordo %s...AÅ­toroAÅ­tomatizo_Blua_FonoN_igra (Grasa)Blu_a (Grasa)Nera Rugâ Verda Flava Blua Malva Cejana Blanka DefaÅ­lta Nera (grasa) Rugâ (grasa) Verda (grasa) Flava (grasa) Blua (grasa) Malva (grasa) Cejana (grasa) Blanka (grasa) DefaÅ­lta (grasa) Fono (Grasa)_Grasa MalfonoRiĉevitaj bajtoj (kompaktigitaj):Riĉevitaj bajtoj (nekompaktigitaj):Åœ_anÄi stilonEÄ¥o de k_omandoj:K_onfiguri...Tempo k_onektata:Ce_janaNe eblas ÅarÄi plugin en alia mondo.Ne eblas malfermi helpdosieron.Tipo de atesto:_Roluloj en ĉi tiu mud:ÅœanÄi StilonRolulo_Signaro:Marku por rompi la liniojn inter vortojMarku se vi volas ke la enfazitaj koloroj estu montrataj ankaÅ­ en grasa tiparojMarku por montri Åpruchelpilojn montrante la horo en kiu unu linio estis riĉevita se vi lasas la muso sur la linio per kurtan periodoMarku ĉi tion se ĉio, kion vi tajpas montriÄas kiel nigraj punktoj en la komandskatolo.Marku por abligi aÅ­tomatan kompletadon de komandoj (bazita en antaÅ­a komandoj)Marku por konservi la komandhistorion en dosiero inter sekciojMarku por ke la lastan komandoj estu konservata en la komandskatolo, por ke vi povus Äin ripeti tajpante ENTERMarku por ke la ĉeffenestro rolumu kiam novan tekston alvenasMarku por eÄ¥i la senditajn komandojn en la ĉeffenestroMarku por ke la anstataÅ­o estu komputita en s///e konstruoMarku se vi volas que la timer estu eksigita kiam la lia nombro de fojoj antigas 0Marku por enabligi la alias-n; nur enabligataj alias-oj estas provatajMarku por enabligi la hokon; nur enabligataj hookoj estas rulatajMarku por ke la inaktivatemponombrilo zeriÄu nur kiam komando estas rekte tajpata em komandskatolo. Se ne markata, kiam komando estas sendata pere de timer, hoko, ktp, la inaktivatemponombrilo ankaÅ­ zeriÄas.Marku por enabligi la macron; nur enabligataj macroj estas rulatajMarku por ke la linio ne estos skribata en la registraddosieroMarku por ke la linio ne estos montrata en la ĉeffekranoMarku por enabligi la timer-n; nur enabligataj timer-oj estas rulatajMarku por enabligi la trigger-n; nur enabligataj trigger-oj estas provatajMarku por ke la trigger estu reskribista triggerMarku por ke ĉi tiu trigger ne malebligu aliajn trigger-ojn de funkci, se ĉi tiu rulosMarku por malebligi ke pli ol specifan nombron de egalaj komandoj estus sendata sinsekve (kiu povas malkonekti vin el kelkaj mud-oj)Cifero:Klaku por provi kongrui triggers kun la linio.Klaku por forigi la tekston en la komandskatolo.Klaku por malfermi; klaku kun la dekstra butono por pluraj alternativojKlaku por uzi la defaÅ­ltajn kolorojnKolorojKomandhistorioKomand_historio...Komando ne trovata.Komandoj kiu estus sendota:Kompatigalgoritmo:Kompatigkvociento:Kompaktigilo uzata:Konfirmado de eksigoKonekti alKonekti al _Alia MondoKonekti al alia mondoKonekti sen SSLKonektata al retnodo %s (%s) pordo %s, MCCP eldono %d ebligata.Konektata al retnodo %s (%s) pordo %s.Konektata al retnodo %s pordo %s, pere de prokurservilo %s (%s) pordo %s, MCCP eldono %d ebligata.Konektata al retnodo %s pordo %s, pere de prokurservilo %s (%s) pordo %s.Konektata al prokurservilon %s pordo %s, negociante aÅ­tentokontrolon...Konektata al prokurservilo %s pordo %s, sendante konektpeton...._Stilo de la konekto:Konektadtempo:Kopii ligiladresonNe eblas konekti al retnodo %s pordo %s: %sNe eblas konekti al retnodo %s pordo %s: Eraro #%dNe eblas krei dosierujon '%s': %sNe eblas krei kontaktoskatolon: %sNe eblas krei kontaktoskatolon: eraro #%dNe eblas importi dosieron '%s': %sNe eblas ÅarÄi plugin %sNe eblas ÅarÄi mondon el dosiero '%s': %sNe eblas malfermi Åutdosieron %s: %s Ne eblas malfermi dosieron '%s': %sNe eblas malfermi dosieron '%s': %s Variabloj ne konserviÄis.Ne eblas malfermi dosieron.Ne eblas malfermi dosieron: %sNe eblas malfermi registraddosieron.Ne eblas malfermi kruddataÅutdosieron %s: %s Ne eblas malfermi mondon '%s': %s Ne eblas trovi retnodon %s: %sNe eblas Åalti nomo-serĉado.FojojFojoj Altra: Ceja_na (grasa)DOSIERUJO_AtendiEksigiPriskriboDosierujo por konservi la konfiguron kaj konservitajn mondojnMalebligi T_imersMalebligi _AliasesMalebligi _MacrosMalebligi _TriggersMalkonektataMalkonektita el retnodo %s.Malkonektita el retnodo %s: %s.Malkonektita el retnodo %s: eraro #%d.Malkonektita el mondo %sAperoMon_tri Åpruchelpilojn kun la horo en kiu la linioj estis riĉevitajMontri kiel horoj, minutoj kaj sekundojMontri kiel sekundojNe permesi la _sama komando esti sendataNe ÅanÄi Nera Rugâ Verda Flava Blua Malva Cejana Blanka DefaÅ­lta Nera (grasa) Rugâ (grasa) Verda (grasa) Flava (grasa) Blua (grasa) Malva (grasa) Cejana (grasa) Blanka (grasa) DefaÅ­lta (grasa) Ne ÅanÄi Ne JesNe ÅanÄi Neniu Unuobla DuoblaNe konektiNe eksigiNe montriĈu vi vere volas eksigi %d %s?Ĉu vi vere volas eksigi la %s-n?Ĉu vi vere volas igi %d variablojn maldaÅ­raj?Ĉu vi vere volas igi ĉi tiun variablon maldaÅ­ra?Ne eliriÅœuti ĉio riĉevita (antaÅ­ malkompatigo, se necesas) al dosieroÅœuti ĉio riĉevita (post malkompatigo, se necesas) al dosiero_Komputi anstataÅ­on kiel Perl komando_EksportiRedakti AliasRedakti Informon de RoluloRedakti DefaÅ­ltan _Mondon...Redakti HokoRedakti MacroRedakti TimerRedakti TriggerRedakti MondonElemento '%s' ne permisata ene elemento '%s'Ebligi _aÅ­tomata kompletadoE_bligi se la servilo proponas ĉiamEbligataInformu _linion por provi kongrui kon la trigger-j:Informu komandon por sendi kiam specifita maksima nombro de egalaj komando estus sendataInformu priskriban nomon por la MondoInformu, se vi volas, priskriban nomon por la aliasInformu, se vi volas, priskriban nomon por la hokoInformu, se vi volas, priskriban nomon por la macroInformu, se vi volas, priskriban nomon por la timerInformu, se vi volas, priskriban nomon por la triggerTajpu tekston por sendi al la MondoTajpu tekston por trovi.Informu agon kiun estos rulata kiam linioj kongruas ÅablononInformu agon kiun estos rulata kiam timer aktiviÄasInformu agon kiun estos rulata kiam evento okazosInformu agon kiun estos rulata kiam la klavo estas tajpataInformu la nomon de la rolulo por automata salutoInformu la pasvorton de la rolulo por automata salutoInformu komandon por Åalti retumilon. %s anstataÅ­iÄos por la adreso de la retpaÄo.Informu komandon por Åalti audlulidon. %s anstataÅ­iÄos por la dosiero.Informu la defaÅ­ltajn parametrojn por la sendado de pluraj linioj aÅ­ komandoj:Informu la retnodon al kiu konektiInformu nomon de skalara ($), array (@) aÅ­ hash (%) variablo kies enhavo saviÄas inter seancoj de la MondoInformu Åablonon por provi kongrui kun ricevataj liniojInformu la Åablono por provi kongrui kun tajpataj komandojInformu la pordon por konektiInformu anstataÅ­on por ruliInformu la tekson por troviEraro dum Åœargado de pluginEraro en plugindosiero: %sEraro dum ÅarÄo de interfaco el XMLdosiero: %sEraro en konfigurado de literumilo: %s Eraru dum legado el la prokurservilo.Komp PerlEvento:FiniÄas:EksportiEksteraj ProgramojDOSIERONe eblas malfermi dosieron %s: %sDosieroPlugindosiero ne informata.Trovi komandonTrovi _ProksimanTrovi _ProksimanTrovi ProksimanTrovi AntaÅ­aTrovi _proksimanTrovi komandon enhavantan specifikatan tekson.Trovi la proksiman komandon enhavantan la saman tekson.Fingropremaĵo:Ver_da (Grasa)GagGag LogÄœeneralaHelptemo ne trovata.Ĉi tie vi povas agordi opciojn por konfiguri la aperon de KildClient.Ĉi tie vi povas agordi opciojn por konfiguri la aÅ­tomatizfunkciojn de KildClient, kiel triggers, aliases, plugins, ktp.Hoko difinita.Hoko ÅanÄita.Hoko ne trovataHoko numero %d por evento %s Nomo: %s Ago: %s Ebligata: %s HokojHokoj por '%s': Retnodo:Retnodo:I. Usk.Identigi kiel 'Rolulo - Mondnomo'Identigi kiel 'Mondnome - Rolulo'Identigi kiel 'Mondnomo'Inativa tempo:Se markata, la supran kaj suban sagoklavojn ne povos esti usataj por navigi la komandhistorion. (Neĉesos uzi Alt+supren kaj Alt+suben.)Se markata, triggers, aliases, macros kaj timers definataj de plugins estos montrataj en la propaj sekcioj de la Mondredaktilo.Se ĉi tiun ne estas markata, objektoj kiel triggers, aliases, ktp. foriÄos rekte sen antaÅ­a konfirmo kiam vi klakas la Forigi butonon.Se ĉi tiu estas markata, neniu langeto estos montrata kiam estas nur unu malferma mondoSe ĉi tiu estas elektata, la registrado komencos aÅ­tomate kiam vi konektas al mono.ImportiInformu nombro de linioj por skribi en la en la registraddosiero.EnigoInterna eraro: elemento '%s' finiÄas en START reÄimoIntervaloArgumento '%s' ne estas valida Atributo '%s' ne estas valida por elemento '%s'Malvalida funkciovoko: la sintakso estas $world->FUNKCIOKlavkodo '%s' invalidaInvalida klavkodo.Plugindosiero ne valida.Elemento '%s' invalidaInvalida specifo de grandeco de la fenestro en konfigurdosiero. _DaÅ­ri EzekTeni _malfermataTeni daÅ­raKlavoÅœlosilointerÅanÄo:Eraro - KildClientInformo - KildClientDemando - KildClientAverto - KildClientKildClient pretaLingvokodo:Maldekstre Dekstre Supre MalsupreLinioj riĉevitaj:Åœargi pluginRegistradoRegistrabo malaktiva.Registrado ne komencata.Registrado haltigita.Registrado aktiva al dosiero %s.Registrado komencita al la dosiero %s. MAC:Macro adiciita.Macro ÅanÄita.Macro numero %d Nomo: %s Klavkodo: %s Ago: %s Ebligata: %s MacrosMal_va (grasa)ĈeffenestroIgi maldaÅ­raMaksimuma larÄeco de linioj en _signoj:AlispecajPlu ol unu komando selektata.Sendi plurajn liniojnN/A_Nombro de linioj:NomoNeniam _kaÅi tajpatan tekstonPlej novaj komandoj estas supreNeNeniu %s eksigita.NeniÅ­ akceptebla aÅ­tentokontrolmetodo por prokurservilo.Sen aÅ­tomata saluto diku (rolulo, pasvorto) lp (CONNECT rolulo pasvorto)Neniu komando selektata.Ne ekzistas tiun %sNe ekzistas tiun %s.Ne ekzistas tiun alias.Ne ekzistas tiun hokon.Ne ekzistas tiun macro.Ne ekzistas tiun plugin.Ne ekzistas tiun timer.Ne ekzistas tiun triggerNeniu mondoNeniuNe konektataNe konektata.Ne trovataNe difinitaNoto: Vi povas uzi strfime() eskapsesekvencojn por krei dosierojn kies nomo dependas de la horo kaj dato kiam la registrado komencas. Krome, %Kw reprezentas la Mondnomon kaj %Kc la rolulon uzita en la aÅ­tomata saluto.Nombro de triggers kiu kongrui:SenkonekteNe montri (_gag) en ĉeffenestroNe skribi (gag) en registraddosieroOnCloseConnected HokojOnConnect HokojOnDisconnect HokojOnGetFocus HokojOnLoseFocus HokojOnReceivedText HokojOnSentCommand HokojUnu %s eksigita.Nur _zerigi inaktivatemponombrilon kiam komando estas rekte tajpataNur skalara ($), array (@) kaj hash (%%) variabloj povas iÄi daÅ­raj.Malfermi ligilonAÅ­ konektu _rekte:Monstras eldoninformadon kaj elirasPas_vorto:PasvortoÅœablonoIniciante SSL...DaÅ­raj VariablojDaÅ­raj variablojDaÅ­ra variabloPluginPlugin '%s' ÅarÄita.Plugin jam ÅarÄita. Provu ebligi Äin.Plugin malebligita.Plugin ebligita.Plugin ne ÅarÄita.Plugin ne informata.Plugin numero %d Nomo: %s Eldono: %s Priskribo: %s AÅ­toro: %s Ebligata: %s PluginsPordo:PreferojAntaÅ­inserti en la linioj la _daton kaj/aÅ­ la horonPrenu klavo por scii sian klavkodo.Tajpu klavon kiu estos usata por ruli la macron dum kursoro estas en tekstskatolo.Tajpu klavon kiu estos usata por ruli la macronProtokolojProkurservilo_Tipo de prokurservilo:Prokurservila aÅ­tentokontrolo malsukcesis.Prokurservilo:Prokurservila pordo:Prokura konektpeto malsukcesis: %s.Tipo de prokurservilo:Meti la selektatan komandon en komandskatoloMeti la selektatan komandon en komandskatolo kai fermi ĉi tiun fenestron_RuÄaR_uÄa (Grasa)U_zi la defaÅ­ltajn kolorojnVere eliri KildClient?Vere fermi?RekonektiSerĉante retnodon %s...Serĉante prokurservilon %s...Uzi la _defaÅ­ltonReskribistoSSL Negociado ne funkciis: %sSSL Negociado daÅ­ris tre longe.SSL ne subtenata en ĉi tiu eldonoSSL protokolo uzata:S_endi & Fermi_Literumi tajpatan tekstonS_tatistikoj...SkriptdosieroRolumi kiam alvenas _novan tekstonSe_ndi tiun komandon:Direkto de serĉado:Elektu se vi ne volas ke la konektatatempo estu montrataElektu se vi ne volas ke la inaktivatempo estu montrataElektu se vi volas ke la konektatatempo estu montrata en horoj, minutoj, kaj sekundojElektu se vi volas ke la konektatatempo estu montrata en sekundojElektu se vi volas ke la inaktivatempo estu montrata en horoj, minutoj, kaj sekundojElektu se vi volas ke la inaktivatempo estu montrata en sekundojElektu RegistradodosieronElektu la tiparon de la ĉ_effenestro:Elektu la tiparon de la stata breto:Elektu la tiparon de la _komandskatolo:Elektu la tiparon de la komandskatoloElektu la tiparon de la ĉeffenestroElektu la tiparon de la stata bretoElektu ĉi tiun se vi volas antaÅ­inserti en ĉiu linio la horo kaj/aÅ­ dato kiam la linio estis recevita.Marku por skribi liniojn el la ĉeffenestro en la registraddosiero.Sendi la selektata(j)n komando(j)n al al mudSendi la selektata(j)n komando(j)n al al mud kaj fermi ĉi tiun fenestronSendi tiun tekson _iniciale:SendadoSendante konketpeton...Sendante aÅ­tentokontrolajn akreditaĵojn al prokurservilo...Serviladreso:Servil_pordo:Informu kiom da komandoj estas sendata samtempeInformu kiom da linioj estas sendata samtempeInformu kiom da fojoj ĉi tiu timer devas ruli antaÅ­ esti malebligita ou eksigitaTajpu tekson por esti aneksata al la fino de ĉiu sendata linioTajpu tekson por esti aneksata al la komenco de ĉiu sendata linioInformu komandon por Åalti retumilonInformu komandon por ludi auddosierojn.Informu tempon por atendi inter la sendado de ĉiu grupo de komandojInformu tempon por atendi inter la sendado de ĉiu grupo de liniojInformu la intervalon, en sekundoj, inter aktivadoj de ĉi tiu timerInformu la maksiman nombron de egalaj komandoj kiu povas esti sendata sinsekveInformu la nombron de signoj kiu devas esti tajpataj por komenci la aÅ­tomatan komandkompletadonInformu la nombron de komandoj kiu saviÄas kaj povas esti reuzataj posteInformu la nombron de linioj kiu povas esti vidataj rolumante la ĉeffenestroElektu la disigilon por komandoj tajpataj en la komandskatoloLiterumado ne estas subtenata en ĉi tiu eldono.Åœ_argiStatistikojStata bretoStiloAnstataÅ­oSukcese movis %s.TTL finiÄitaNedaÅ­raTesti Trigger-jnLa defaÅ­lto estas antaÅ­inserti en la linioj la daton kaj horon, se vi povas konfiguri la formon kun strftime() espaksekvencoj. Vidu la manlibron por priskribo pri ĉi tio.La aiuto estas en la ĉeffenestro.La intervalo devas esti pozitiva.La parton numeroLa teksto informata ĉi tie estos uzata por provi kongrui kun la triggers kvazaÅ­ Äi estus linioj riĉevita el la MUDLa tutan linionLa tutan kongruitan tekstonPost tio sendi la _enhavon de tiu dosiero:Estas %d malfermataj mondoj. Ĉu vi vere volas eliri?Estas unu malfermata mondo. Ĉu vi vere volas eliri?Ĉi tio estus montrata en la ĉeffenestro. Se Äi estas blanka, la linio estis ellasita. Äœi povas esti malsama al la originala linio kaÅ­ze de reskribitaj trigger-j.Ĉi tiu estus montrata en la ĉeffenestro:Ĉi tiu objekto apartenas al unu plugin. ÅœanÄoj farataj ĉi tie ne estos konservataj en la plugin.Ĉi tiu programo estas libera; vi estas libera por disdoni ĉi tiun programon sub la kondiĉoj de la licenco GNU General Public License eldonata de Free Software Foundation; aÅ­ eldono 2 de la licenso, aÅ­ (laÅ­ via elekto) iu ajn pli nova eldono.Ĉi tiu eldono de KildClient ne havas SSL subtenon.Timer adiciita.Timer ÅanÄita.Timer numero %d Nomo: %s Intervalo: %d Nombro de fojoj: %d Ago: %s Ebligata: %s NedaÅ­ra: %s TimersTrigger adiciita.Triger ÅanÄita.Trigger numero %d Nomo: %s Åœablono: %s Ago: %s Ignore usklecon: %s Gag ekrano: %s Gag registrado: %s Ebligata: %s DaÅ­ri ezekutadon: %s Reskribisto: %s ÅœanÄas stilon: %s TriggersNe eblas konekti al retnodo %s: %sNe eblas konekti al retnodo %s: Eraro #%d.Ne eblas konekti al prokurservilon %s: %sNe eblas konekti al prokurservilon %s: Eraro #%d.Ne konataNe konata direktivo '%s' en konfigurdosiero. Mondo ne nomiÄataMalrekonebla respondo el prokurservilo.Uzu $window->getsize() anstataÅ­.Uzu $window->minimize() anstataÅ­.Uzu $world->path() anstataÅ­.Uzu %Kw por reprezenti la Mondnomon kaj %Kc por reprezenti la rolulon uzita en la aÅ­tomata saluto.Uzi _SSLUzi _grasan tiparon por emfazitaj koloroj (anstataÅ­ nur emfazi)_Plurlinia komandskatoloUzi defaÅ­ltan konfiguron Sen prokurservilo SOCKS4 SOCKS5_Unulinia komandskatoloUzu la Trovi butonon por trovi la unuan rezultaton.Valida de:VariablojEldonoEldono %s de tiu plugin jam estas ÅarÄita.Vizitu http://kildclient.sf.netBlan_ka (Grasa)Averto: provante sendi tre grandan linion. Eble rekursia aliasdefino?Averto: la funkcio getwindowsize() removiÄos future.Averto: la funkcio minimize() removiÄos future.Averto: la funkcio path() removiÄos future.Nomo de la mondo:Mondo konservita.Ĉu tiu linio estus skribata en la registraddosiero?Rompi liniojn je la _tutan larÄeco de la ecranoSkribita da Eduardo M Kalinowski (eduardo@kalinowski.com.br) Fla_va (Grasa)JesVi povas lasi ĉi tiun kampon blanka, kaj dosiernomo aÅ­tomate generiÄos. Redaktu ĉi tiun kampon nur se vi scias tiun, kiun vi faras.Vi devas informi variablnomon.Vi devas informi la agon, krom se trigger estas gag aÅ­ ÅanÄas la stilon.Vi devas informi la agon.Vi devas informi la klavon.Vi devas informi la nomon.Vi devas informi la passvorton..Vi devas informi la Åablonon.Vi devas informi la anstataÅ­on.Vi provas konekti al mondo kiu uzas SSL, sed ĉi tiu eldono de KildClient ne havas SSL subtenon. Konekti sen SSL?[MONDO...\_Koncerne_Ago:_Apliki al:_Peti konfirmon antaÅ­ forigo de triggers, aliases, ktp._Fono:_Nigra_PurigiEÄ¥o de _komandoj:_Atendi_Tempo por atendi inter la sendado de ĉiu grupo de linioj/komandoj:_Malebligi_Malkativi savoklavojn por navigi komandhistorion_Malkonekti_Apero_Ne montri ĉi tiun mesaÄon denove_Malsupren_EÄ¥i senditajn komandojn en la ĉeffenestro_Redakti_Redakti..._Ebligi se la servilo proponas post konekto_Ebligata_Evento:_Dosiero:_Fine, sendi tiun tekston:_Trovi:_Ekbrili fenestron kiam nova teksto alvenasMalf_onoMalf_ono:_Formo:V_erda_HelpoKaÅi langetojn se nur unu mondo estas malfermaR_etnodo:_Inativa tempo:_Ignori usklecon_ImportiSk_ribi la lastajnAl_inei rompitajn liniojn je_Informaj mesaÄoj:_Enigo_Intervalo:_Kursivo:_Eroj por eksporti_Teni fenestro malferma post sendi_DaÅ­ri la ezekutadon de aliaj trigger-oj eĉ se ĉi tiu rulas_Reteni la lastan tajpitan komandon en komandskatolo_Klavo:_Linioj por konservi en rolumadbufroÅœ_arÄi_Malva_Manlibro_Sendi Plurajn Liniojn..._Nomo de variablo por iÄi daÅ­ra:_Nomo:_ProksimaNombro de komandoj por konservi en _historio:_Nombro de linioj/komandoj por sendi samtempe:Pas_vorto:_Åœablono:_Perl dosiero por ÅarÄi:_Pordo:_Preferoj_AntaÅ­a_Rekonekti_Nombro de fojoj:_Reskribista trigger_Elektu konservitan mondon:_Sendi_Montri objektojn difinitaj de pluginsDividi fene_stron_Konservi komandojn inter sesiojTra_strekto:_AnstataÅ­o:_Pozicio de la langetoj:_NedaÅ­ra (estos eksigita aÅ­tomate kiam lia nombro de fojoj atingas 0)_Testi Trigger-jn..._Teksto por trovi:_Substrekto:_SuprenSal_utnomo:B_lanka_Mondo_Rompi la liniojn inter vortojF_lava_fojoj sinsekveadrestipo ne subtenataaliasalias: ne kreita alias sen Åablonoalias: ne kreita alias sen anstataÅ­oaliasesrolulosignoj estis tajpitajkomando ne subtenata / protokolerarokomando(j)konekto ne permesita de la regularokonekto rifuzita de la destina retnodoÄenerala malfunkciadohokohook: hoko '%s' ne trovata hokojretnodo ne atingeblalinio(j)linionj el la rolumadbufro en la registraddosieromacromacro: Ne ekzistas tiun macromacrosnreto ne atingeblanerastrumerokonektpeto malsukcesis ĉar identd de kliento ne povis konfirmi la legitimilon en la konektpetokonkektpeto malsukcesis ĉar identd ne povis esti atingitakonektpeto malakceptita aÅ­ malsukcesita_sekundoj ĉiusekundoj_sekundoj ĉiutimertimer: Ne ekzistas tiun timertimerstriggertriggersmalkonata kodo.jjeskildclient-2.11.1/po/pt_BR.gmo0000644000175000017500000017206511570463465013015 00000000000000Þ•¶Ì¡|+:~: €:Ž::¦:¿:Û:ó:;%;L7;7„;¼;Ò;é;"<"*<M<e<„<5 <5Ö<& =3=M=(j=“=¨=½=Ð=6ì='#>6K>'‚>;ª>æ>)??,?l?t? {?…?–?©?½?Ï? ä?@@,@ B@N@ f@r@ ‹@˜@®@Ì@ à@í@ü@ A =AJAjA{AŒA¢A¸AÌAÜAïA BBB+_B$‹B°B(·B"àBC CC‚)C¬C#´C ØC*ãC0D6?DvD }DˆD ŽD šD ¨D­µDcEsEƒE E ¿EÍE áEïEF&F-FDFVF oF |F†F8–FJÏF‹GL¦GDóGB8Ht{HIðH@:IB{ID¾I?J:CJß~J<^K=›KGÙK<!LB^L-¡LWÏL‚'MªM,²M&ßM1N58NnNuN…N™N¬NÉNàNóNO O!O5ONO;bO"žOQÁO8PCLP8PÉPÜPíP(ÿP/(Q#XQ|Q"˜Q»QÚQ'óQ Ra…a‹aœa ¢a¬a$´a$Ùaþa b„"b{§b’#cK¶c]d`d-gd•d4›dÐdÙd'ðd1eJe`ere‡e2¦e Ùe ãeîeýe ff f7fKf^fof~f”f ¤f°f¸fÍfáfòfgg g-gL=gŠg‘g ¡g­g"¼g ßgíg hh!h3h8hShrhuh+„h6°hçh üh i i !i .i—3O—Eƒ—!É—0ë—;˜X˜a˜ i˜s˜†˜˜˜´˜͘#똙*™:™O™^™ z™‡™¡™°™Å™ä™ þ™ šš,5š bš!oš‘š š¯šÊšàšýš ›"›B›JZ›.¥›&Ô›û›(œ%+œ Qœ[œmœ¤œ$', T)_0‰6ºñ ÷ž žž!žØ1ž ŸŸ)Ÿ!HŸjŸzŸ’Ÿ¡Ÿ³Ÿ4ºŸ,1 I  X c C| VÀ •¡Q­¡\ÿ¡.\¢{‹¢L£ET£Gš£Kâ£H.¤Gw¤¿¤IÎ¥;¦2T¦I‡¦KѦ4§eR§¸§I¨+c¨2¨B¨>©D©J©a©|©•©³©Í©â©ù© ªª0ªGª?Xª#˜ªV¼ª:«EN«;”«Ы嫸«,¬2>¬%q¬%—¬+½¬%鬭..­)]­"‡­@ª­#ë­®*-®/X®!ˆ®*ª®=Õ®¯¯ ¯0¯A¯ E¯O¯ W¯7c¯›¯¯¯įد î¯û¯°"1°T° n°<y°&¶°ݰ/ó°ã#±²!² ?² M² Z²$f²#‹²9¯²6é² ³G*³Sr³,Ƴ ó³ ý³" ´-´ F´ R´ _´l´ {´4ˆ´!½´ß´4û´ 0µ2;µdnµ%Óµ3ùµ2-¶3`¶3”¶5ȶ/þ¶$.·HS·6œ·8Ó·= ¸1J¸6|¸d³¸W¹Kp¹¼¹s×¹:Kº=†º!ĺ æº»#»;»-Y»0‡»¸»×»é»ñ»ù»¼¼ ¼>¼F¼a¼s¼‡¼›¼®¼Á¼4Õ¼/ ½ :½G½X½\½d½!j½LŒ½€Ù½Z¾i¾z¾V¾æ¾ì¾þ¾¿ ¿-¿-A¿ o¿¿¤Ÿ¿DÀœÆÀdcÁgÈÁ0Â09ÂjÂ8r «ÂµÂ,ÏÂ:üÂ7ÃWÃsÃÃM¨Ã öÃÄÄ!Ä'Ä7ÄIÄcÄyČĞÄ!²ÄÔÄæÄöÄúÄÅ%Å7ÅRÅnÅsÅ…Ål—ÅÆ ÆÆ/Æ(BÆkÆrƒƫƯÆÃÆÈÆ"æÆ ÇÇ,!Ç9NLjǤǷÇËÇâÇ÷Ç È%È;È SÈ`ÈhÈwÈ‡È —ÈÜ¥È‚É šÉ»ÉÊÉ ÛÉ/üÉ,ÊLÊTÊtʔʩʹÊÌÊÝÊïÊËËR'ËWzË ÒËÝË&öËÌ%Ì+Ì3ÌDÌ[Ìṙ̎Ì)¥ÌÏÌäÌ÷ÌÍj(Í“Í›Í ¢Í°Í4ÈÍ`ýÍ4^Î “ΞΤÎ+´Î àÎìÎüÎÏ/'ÏDWÏ œÏ¦ÏºÏÖÏôÏÐ Ð%Ð;ÐWÐ lÐwГР±ÐÒÐçÐ'øÐ Ñ2Ñ:ÑYÑoÑDƒÑGÈÑ\ÒKmÒ_¹ÒNÓhÓ-Ó,¯Ó9ÜÓ7Ô+NÔ*zÔu¥ÔCÕ)_Õ=‰Õ ÇÕèÕîÕ; ÖIÖaÖ6uÖ4¬ÖTáÖE6×I|×9Æ×?Ø<@Ø:}Ø@¸ØVùØmPÙP¾ÙOÚM_Ú5­Ú ãÚ íÚûÚ ÛÛ!Û 6ÛBÛGÛ²WÛ( Ü3ÜRÜ^bÜ ÁÜÎÜ)æÜ3Ý1DÝ£vÝ1ÞaLÞÿ®Þ2®ßáßóß™àŸà¦àºàÎàáá#êá)â)8â/bâ ’â9ŸâÙâ0èâ%ã&?ã!fãiˆã òãHüã'Eä2mä& ä9Çäå åå,#åPåpåX‚å;Ûå6æ2Nææ æ+æ*Éæ=ôæ2çEç‘Iç/ÛçY è eè†è¦èÅè!åè(é‰0é ºéÅéÌé Õé<áéê&ê-ê5ê Gê,Qê ~ê0‹ê ¼ê Éê%Õê ûê,ë4ë <ë2Gë zë†ë ë™ë ¹ë,Äëñëøë ì ìì,ìEìLì"\ì ì‰ìžì»ìÔì Ýì éìôì! íC+í?oí¯í)·í áíëíôíüí,îFî Mî/Wî3‡î»î ÃîÍîêîòî ï ï ï"ï5ïIïdï$lï‘ï¡ï ÁïËïÜïQñïCðWð mð zð …ðð˜ðŸð¾ðÇð%Ýðñ4 ñ7>ñvñ ~ñ‰ñ*©ñ Ôñ/ßñ#ò 3ò?ò Dòeòkòˆò"‘ò´òºò×òÞòàòòò÷òUþò=Tó’ó¬ó»óÄóÓóÙóöóýóô ô/ô1ôS®ƒ2o×Q§”}õ˜H5•’Ya<tŸÜOe²‡¸éwV«K…¶¯ˆ2 ¬Œjí¿s{ĹßNùKâŽçJäÙ„ÓJ@Ûm֬ɣ 6z D “ ¨³#‚Ô­QC¬ªµþQá‰K} Dk€–Î+åì­ô>‹FÈ@jz-Ý Y:”qÙÂ1n¡X…8Õ‚>]t)'š!ÔÉhªºMcŠ`µLÍ1ZµàÁ.OÕ%è@º“ë÷fó¥Î,5èeUÿd¥_O÷½m`Ý[Eñ;ßr¹ØBélÞ89*=v¼Ò¢*á‹{æÐ_úÖ—Ë”7d›uª.‚Ñ–°%PhÂ^Èå¢c¥ 1«x‹ù™(\7x™ö$š=fVì“®Íþ<G|yÜdä[s"C,\Ìæ,y Žj’ ¦âA>¢£kR4êq$Ï^HB=Ll0¼ög‘(`¾!Õ+†¯BtP$¤p¶Š:î²wÚXëœL2±)¯ZÀ| žo?†Û-Ï óœà òã' ˆ[;´€&pf0ò/:ûH;#˜Sl¨¦GŒ)7Æ›%Ií6b9î¿ ?aÿ}-E| ‡Ÿ³u—ŒgW¤„–]e¡\›´]·¤õ‰UiMÑDÓ¶úi/…»Æü 3~< ËœÃ4±a‡Àvnû§ÒZšðÁbÊrPJ#±GEã3·´•kNF8FñM¨rny.¾ü 6CÐ~3™&N»®V˜©Þ³ž?ˆðÅØ'c40ç£oŽ’x²(q§ø *ŠITARv~«W„+"9Úøbw5hiWž׃g^ÄXê¸ýÇ—T†T€ÇYu‰I°R©!Åô_S mÌ‘Ÿýï"{&ʽ­©UAs°/‘¡zp Target: %d Foreground: %d Background: %d Italics: %d Striked-thru: %d Underline: %d SSL enabled.%d %s deleted.%d lines%s is already permanent.%s: %s is already permanent%s: %s is not permanent%s: Argument must be numeric%s: Invalid key code%s: No such world%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent%s: This is an internal function, do not call directly.%s: Too few arguments%s: Too few arguments.%s: Too many string arguments%s: Variable '%s' made permanent. %s: Variable '%s' made temporary. %s: Wrong argument type%s: Wrong number of arguments.%s: Wrong type of reference%s: action given twice, using the named attribute one%s: action not specified, and isn't gag, not creating%s: action not specified, not creating%s: count must be numeric%s: interval must be numeric%s: interval not specified, not creating%s: invalid bg color%s: invalid fg color%s: invalid target%s: invalid underline style%s: keycode given twice, using the named attribute one%s: keycode not specified, not creating%s: pattern given twice, using the named attribute one%s: pattern not specified, not creating%s: substitution given twice, using the named attribute one(-1 to repeat indefinitely)(Leave blank for default based on locale)(You must reconnect for changes in this setting to take effect)0 lines1 line: Expired: Not yet activeAnsi ColorsAudio PlayerAuto-loginCharacter SetColors used by KildClientCommand EntryConnectionDefault ColorsFileFlood preventionFontGraphical EditorsInputLogging StatusMCCP (for compression)Name displayNote:OptionsPlugins Currently LoadedPlugins Loaded on StartupProxyRevert to default colorsScriptingScrollingSending DelaysTCP Keep AliveTime DisplayTooltipsWeb BrowserWindow configurationWord WrapA mud client with powerful features and support for Perl ScriptingA_utomatically start logging when connectedActi_vate auto-completion only afterActionAdd this to the _beginning of each line:Add this to the _end of each line:AdvancedAlias added.Alias modified.Alias number %d Name: %s Pattern: %s Substitution: %s Ignore case: %s Eval as Perl: %s Enabled: %s AliasesAlways load this plugin at _startupAppearanceAre you sure you want to close this world?Attempting to connect to host %s (%s) port %s...Attempting to connect to proxy host %s (%s) port %s...AuthorAutomationB_lueBac_kgroundBl_ack (Bold)Bl_ue (Bold)Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) Bold BackgroundBold ForegroundBytes received (compressed):Bytes received (decompressed):C_hange styleC_ommand separator:C_onfigure...C_onnected time:C_yanCannot load a plugin in another world.Cannot open help file.Certificate type:Ch_aracters in this mud:Change StyleCharacterCharacter _set:Check if you want lines to be wrapped at word boundariesCheck if you want the highlighted ANSI colors to be displayed in bold alsoCheck if you want tooltips to be displayed showing the time when a line was received if you leave the mouse over the line for a short whileCheck this if the text you type is displayed as black dots in the input box.Check to enable command auto-completion (based on previous commands)Check to have the command history saved in a file between sessionsCheck to have the last command kept in the command entry box, so that you can repeat commands only by pressing ENTERCheck to have the main window scroll to the end whenever new output comesCheck to have the sent commands echoed in the main output windowCheck to have the substitution be executed in a s///e constructionCheck to have the timer deleted after its repeat count has reached 0Check to make the alias enabled; only enabled aliases are triedCheck to make the hook enabled; only enabled hooks are runCheck to make the idle time counter reset only when a command is entered directly by typing it in the command entry box. If not checked, if a command is sent because of a timer, of a hook, etc, the idle timer is also reset.Check to make the macro enabled; only enabled macros are runCheck to make the matched line not be printed in the log fileCheck to make the matched line not be printed in the main output windowCheck to make the timer enabled; only enabled timers are runCheck to make the trigger enabled; only enabled triggers are triedCheck to make this trigger a rewriter triggerCheck to make this trigger not prevent further triggers from being tried, if it matchesCheck to prevent more than a given number of equal commands to be sent in a row (which can disconnect your character in some muds)Cipher:Click the run the triggers against the line.Click to clear the command input area.Click to open link; right-click for more options.Click to revert all colors to their built-in defaultsColorsCommand HistoryCommand _History...Command not found.Commands that would be sent:Compression algorithm:Compression ratio:Compression used:Confirm deletionConnect toConnect to _AnotherConnect to another worldConnect without SSLConnected to host %s (%s) port %s, MCCP version %d enabled.Connected to host %s (%s) port %s.Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d enabled.Connected to host %s port %s, via proxy %s (%s) port %s.Connected to proxy server %s port %s, negotiating authentication...Connected to proxy server %s port %s, sending request...Connection _Style:Connection time:Copy Link AddressCould not connect to host %s port %s: %sCould not connect to host %s port %s: Error #%dCould not create directory '%s': %sCould not create socket: %sCould not create socket: error #%dCould not import file '%s': %sCould not load plugin %sCould not load world from file '%s': %sCould not open dump file %s: %s Could not open file '%s': %sCould not open file '%s': %s Variables were not saved.Could not open file.Could not open file: %sCould not open log file.Could not open raw dump file %s: %s Could not open world '%s': %s Could not resolve host %s: %sCould not start name-resolution thread.CountCount Custom: Cya_n (Bold)DIRDela_yDeleteDescriptionDirectory to store settings and saved worldsDisable T_imersDisable _AliasesDisable _MacrosDisable _TriggersDisconnectedDisconnected from host %s.Disconnected from host %s: %s.Disconnected from host %s: error #%d.Disconnected from world %sDisplayDisplay _tooltips with the time when the line was receivedDisplay as hours, minutes and secondsDisplay as secondsDo not allow the _same command to be sentDo not change Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) Do not change No YesDo not change None Single DoubleDo not connectDo not deleteDo not displayDo you really want to delete %d %s?Do you really want to delete the %s?Do you really want to make %d variables temporary?Do you really want to make the variable temporary?Don't quitDumps all data received (possibly compressed) to the fileDumps all data received from (after decompression, if appropriate) to the fileE_val substitution as Perl statementE_xportEdit AliasEdit Character InformationEdit Default _World...Edit HookEdit MacroEdit TimerEdit TriggerEdit WorldElement '%s' not allowed inside element '%s'Enable TCP _Keep Alive packetsEnable _auto-completionEnable if server proposes at _any timeEnabledEnter _line to be matched against the triggers:Enter a command to be sent whenever the specified maximum number of equal commands would be sentEnter a descriptive name for the WorldEnter optionally a descriptive name for the aliasEnter optionally a descriptive name for the hookEnter optionally a descriptive name for the macroEnter optionally a descriptive name for the timerEnter optionally a descriptive name for the triggerEnter some text to be sent to the WorldEnter some text to search for.Enter the action that will be run when a match happensEnter the action to be executed whenever the timer firesEnter the action to be run when the event happensEnter the action to be run when the key is pressedEnter the character's name for automatic loginEnter the character's password for automatic loginEnter the command to run a web browser. %s will be substituted by the web page address.Enter the command to run an audio player program. %s will be substituted by the file path.Enter the default parameters for sending multiple lines or commands:Enter the host to connect toEnter the name of a scalar ($), array (@) or hash (%) variable whose contents are to be saved between sessions of the WorldEnter the pattern to match against received linesEnter the pattern to match against typed commandsEnter the port used when connectingEnter the substitution to be executedEnter the text to search forError Loading PluginError in plugin file: %sError loading UI from XML file: %sError setting spell checker: %s Error while reading from proxy host.Eval as PerlEvent:Expiration:ExportExternal ProgramsFILEFailed loading file %s: %sFileFile name not specified.Find CommandFind N_extFind Ne_xtFind NextFind PreviousFind _nextFind a command containing a given search termFind the next command with the same match textFingerprint:G_reen (Bold)GagGag LogGeneralHelp topic not found.Here you can set options to configure the appearance of KildClient.Here you can set options to configure the automation features of KildClient, such as triggers, aliases, plugins, etc.Hook defined.Hook modified.Hook not foundHook number %d for event %s Name: %s Action: %s Enabled: %s HooksHooks for '%s': Host:Hostname:I. CaseIdentify as 'Character - World name'Identify as 'World name - Character'Identify as 'World name'Idle time:If checked, the up and down arrow keys are not used for navigating between saved commands. (You'll have to use Alt+up and Alt+down.)If checked, triggers, aliases, macros and timers defined in plugins will appear in the corresponding World Editor sections.If not checked, objects such as triggers, aliases, etc. will be deleted directly without asking for confirmation when you press the Delete button.If this is checked, when there is only one open world no tabs will be shownIf this is selected, logging will be automatically started whenever you connect to the world.ImportInform number of lines to include in the log.InputInternal error: element '%s' ends when in START modeIntervalInvalid argument '%s' Invalid attribute '%s' for element '%s'Invalid function call: syntax is $world->FUNCTIONInvalid key code '%s'Invalid key code.Invalid plugin file.Invalid top-level element '%s'Invalid window size specification in config file. Keep ExecKeep _openKeep permanentKeyKey exchange:KildClient ErrorKildClient InformationKildClient QuestionKildClient WarningKildClient readyLanguage code:Left Right Top BottomLines received:Load pluginLoggingLogging is disabled.Logging not startedLogging stopped.Logging to file %s.Logging to file %s. MAC:Macro added.Macro modified.Macro number %d Name: %s Key Code: %s Action: %s Enabled: %s MacrosMagen_ta (Bold)Main WindowMake temporaryMaximum line width in _characters:MiscellaneousMore than one command selected.Multi-line sendN/AN_umber of lines:NameNever _hide the typed textNewest commands are on the topNoNo %s deleted.No acceptable proxy authentication methods.No auto-login diku (char, pass) lp (CONNECT char pass)No command selected.No such %sNo such %s.No such aliasNo such hookNo such macroNo such pluginNo such timerNo such triggerNo worldNoneNot connectedNot connected.Not foundNot setNote: You can use strftime() escapes to create different files based on the date and time that logging starts. Also, %Kw represents the World name and %Kc the character name used in auto-logon.Num Ena %-*.*s %-*.*s Num Ena %-*.*s Version %-*.*s Num Ena ActionNum Ena Temp Int Num Eval Ena IgC %-*.*s %-*.*s Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s Number of triggers that matched:OfflineOmit (_gag) from outputOmit (gag) from _log fileOnCloseConnected HooksOnConnect HooksOnDisconnect HooksOnGetFocus HooksOnLoseFocus HooksOnReceivedText HooksOnSentCommand HooksOne %s deleted.Only _reset idle time counter when a command is entered directlyOnly scalar ($), array (@) and hash (%%) variables can be made permanent.Open LinkOr connect d_irectly:Outputs version information and exitsPass_word:PasswordPatternPerforming SSL handshake...Permanent VariablesPermanent variablesPermenent variablePluginPlugin '%s' loaded.Plugin already loaded. Try enabling it.Plugin disabled.Plugin enabled.Plugin not loaded.Plugin not specifiedPlugin number %d Name: %s Version: %s Description: %s Author: %s Enabled: %s PluginsPort:PreferencesPrefix lines with _date and/or timePress a key to get its keycode.Press the key that will be used to activate the macro while the cursor is in the text box.Press the key that will be used to run the macroProtocolsProxyProxy _type:Proxy authentication failed.Proxy host:Proxy port:Proxy request failed: %s.Proxy type:Put the selected command in the command entry boxPut the selected command in the command entry box and close this dialogR_edRe_d (Bold)Re_vert to default colorsReally Quit KildClient?Really close?Rec_all & CloseReconnectResolving host %s...Resolving proxy host %s...Revert to _defaultRewriterSSL Handshake failed: %sSSL Handshake took too long.SSL not supported in this versionSSL protocol used:S_end & CloseS_pell check typed textS_tatistics...ScriptingScroll on _outputSe_nd this command:Search direction:Select if you do not want the connection time to be displayedSelect if you do not want the idle time to be displayedSelect if you want the connection time to be displayed in hours, minutes and secondsSelect if you want the connection time to be displayed in secondsSelect if you want the idle time to be displayed in hours, minutes and secondsSelect if you want the idle time to be displayed in secondsSelect log fileSelect the font used in the _main screen:Select the font used in the _status bar:Select the font used in the command _entry box:Select the font used in the command entry boxSelect the font used in the main output screenSelect the font used in the status barSelect this if you want to prefix each line in the log file with the date and/or time it was received.Select to include lines from the main window in the log file.Send the selected command(s) to the mudSend the selected command(s) to the mud and close the dialogSend this text _initially:SendingSending connection request...Sending proxy authentication credentials...Server _address:Server _port:Specify how many commands are sent at onceSpecify how many lines are sent at onceSpecify how many times this timer should run before being disabled or deletedSpecify some text to be appended to each sent lineSpecify some text to be prepended to each sent lineSpecify the command used to launch a web browserSpecify the command used to play sound files.Specify the delay between sending the group of commandsSpecify the delay between sending the group of linesSpecify the interval, in seconds, between timer activationsSpecify the maximum number of equal commands that can be sent in a rowSpecify the number of characters that must be typed for command completion to startSpecify the number of commands that are saved and can be later recalledSpecify the number of lines of output that can be seen with by scrolling the windowSpecify the separator for commands typed in the command entry boxSpell checking support not included in this build.St_artStatisticsStatus BarStyleSubstitutionSuccessfully moved %s.TTL expiredTempTest TriggersThe default is to prefix lines with the date and time, but you can configure the format with strftime() escape sequences. See the manual for a description of those.The help is displayed in main window.The interval must be positive.The matched substring numberThe text entered here will be matched against triggers as if it were a line coming from the MUDThe whole lineThe whole matched textThen send the _contents of this file:There are %d open worlds. Do you really want to quit?There is one open world. Do you really want to quit?This is what would be printed in the main screen. If empty, the line has been gaged. It can be different from the original line because of rewriter triggers.This is what would be printed in the main screen:This object belongs to a plugin. Changes made here will not be saved in the plugin.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 version of KildClient does not have SSL support.Timer added.Timer modified.Timer number %d Name: %s Interval: %d Repeat count: %d Action: %s Enabled: %s Temporary: %s TimersTrigger added.Trigger modified.Trigger number %d Name: %s Pattern: %s Action: %s Enabled: %s Ignore case: %s Gag output: %s Gag in log: %s Keep executing: %s Rewriter: %s Change style: %s TriggersUnable to connect to host %s: %s.Unable to connect to host %s: Error #%d.Unable to connect to proxy host %s: %s.Unable to connect to proxy host %s: Error #%d.UnknownUnknown directive '%s' in config file. Unnamed worldUnrecognized response from proxy host.Use $window->getsize() instead.Use $window->minimize() instead.Use $world->path() instead.Use %Kw to represent the World's name, and %Kc to represent the auto-logon character nameUse _SSLUse _bold font for highlighted colors (instead of just highlighting)Use _multi-line input barUse global settings No proxy SOCKS4 SOCKS5Use single-_line input barUse the Find button to find the first result.Valid since:VariablesVersionVersion %s of this plugin is already loaded.Visit http://kildclient.sf.netW_hite (Bold)Warning: Trying to send a very long command line. Perhaps a recursive alias definition?Warning: the getwindowsize() function is deprecated and will be removed.Warning: the minimize() function is deprecated and will be removed.Warning: the path() function is deprecated and will be removed.World name:World saved.Would this line be included in the log file?Wrap lines at full _screen widthWritten by Eduardo M Kalinowski (eduardo@kalinowski.com.br) Yell_ow (Bold)YesYou can leave this field blank, and a file name will be automatically generated. Only edit this field if you know what you are doing.You must specify a variable name.You must specify the action, unless the trigger is a gag or changes the style.You must specify the action.You must specify the key.You must specify the name.You must specify the password.You must specify the pattern.You must specify the substitution.You're attempting to connect to a world that uses SSL, but this version of KildClient has been built without SSL support. Try to connect without SSL?[WORLD...]_About_Action:_Apply to:_Ask for confirmation before deleting triggers, aliases, etc._Background:_Black_Clear_Command echo:_Delay_Delay between each group of lines/commands:_Disable_Disable up and down arrow keys for history navigation_Disconnect_Display_Do not display this message again_Downwards_Echo sent commands in main window_Edit_Edit..._Enable if server proposes after connecting_Enabled_Event:_File:_Finally, send this text:_Find:_Flash window when new text is received_Foreground_Foreground:_Format:_Green_Help_Hide tabs if only one world is open_Host:_Idle time:_Ignore case when matching_Import_Include the last_Indent wrapped lines by_Informative messages:_Input_Interval:_Italic:_Items to export_Keep dialog open after sending_Keep executing other triggers after this this one matches_Keep last typed command in command entry box_Key:_Lines to save in scrollback buffer:_Load_Magenta_Manual_Multi-line Send..._Name of variable to make permanent:_Name:_Next_Number of commands to save in history:_Number of lines/commands to send at once:_Password:_Pattern:_Perl file to load:_Port:_Preferences_Previous_Recall_Reconnect_Repeat count:_Rewriter trigger_Select a saved world:_Send_Show items defined by plugins_Split Window_Store commands between sessions_Striked-thru:_Substitution:_Tab position:_Temporary (will be deleted automatically when its repeat count reaches 0)_Test Triggers..._Text to find:_Underline:_Upwards_Username:_White_World_Wrap lines at word boundaries_Yellow_times in a rowaddress type not supportedaliasalias: not creating alias without patternalias: not creating alias without substitutionaliasescharactercharacters have been enteredcommand not supported / protocol errorcommands(s)connection not allowed by rulesetconnection refused by destination hostgeneral failurehookhook: hook '%s' not found hookshost unreachableline(s)lines of the scrollback buffer in the logmacromacro: No such macromacrosnnetwork unreachablenopixelsrequest failed because client's identd could not confirm the user ID string in the requestrequest failed because identd could not be reachedrequest rejected or failedsec_onds eachsecondsseconds e_achtimertimer: No such timertimerstriggertriggersunknown reason codeyyesProject-Id-Version: KildClient 2.11.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2011-05-29 12:33-0300 PO-Revision-Date: 2011-05-28 11:15-0300 Last-Translator: Eduardo M Kalinowski Language-Team: Eduardo M Kalinowski Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Alvo: %d Texto: %d Fundo: %d Itálico: %d Tachado: %d Sublinhado: %d SSL habilitado.%d %s apagados.%d linhas%s já é permanente.%s: %s já é permanente%s: %s não é permanente%s: Argumento deve ser numérico.%s: Código de tecla inválido%s: Não existe tal mundo%s: Apenas variáveis escalares ($), arrays (@) e hashes (%%) podem ser feitas permanentes%s: Esta é uma função internal, não a chame diretamente.%s: Muito poucos argumentos%s: Muito poucos argumentos.%s: Argumentos string demais%s: Variável '%s' feita permanente. %s: Variável '%s' feita temporária. %s: Tipo de argumento errado%s: Número errado de argumentos.%s: Tipo de referência inválido%s: ação informada duas vezes, usando a de atributo nomeado%s: ação não especificada e não e gag, cancelando criação%s: ação não informada, cancelando criação%s: contagem deve ser numérica%s: intervalo deve ser numérico%s: intervalo não foi informado, cancelando criação%s: 'bg' inválido%s: 'fg' inválido%s: 'target' inválido%s: estilo de sublinhado inválido%s: código de tecla informado duas vezes, usando o de atributo nomeado%s: código de tecla não informado, cancelando criação%s: pattern informado duas vezes, usando a de atributo nomeado%s: pattern não especificado, cancelando criação%s: substituição informada duas vezes, usando a de atributo nomeado(-1 para repetir indefinidamente)(Deixe em branco para padrão baseado no locale)(Você precisa reconectar para alterações fazerem efeito)0 linhas1 linha: Expirou: Não ativo aindaCores AnsiReprodutor de ÃudioLogin automáticoConjunto de caracteresCores usadas pelo KildClientEntrada de ComandosConexãoCores PadrãoArquivoPrevenção de FloodFonteEditores GráficosEntradaEstado do LogMCCP (para compressão)Exibição do nomeNota:OpçõesPlugins carregadosPlugins carregados na inicializaçãoProxyReverter às cores padrãoScriptsRolagemEspera Entre EnviosKeep Alive TCPExibição dos TemposTooltipsNavegador WebConfiguração da JanelaQuebra de linhasUm cliente de MUD com recursos poderosos e suporte para scripting com PerlInicilar log a_utomaticamente quando conectadoAti_var auto-compleção somente apósAçãoAdicionar isso ao c_omeço de cada linhaAdicionar isso ao f_im de cada linha:AvançadoAlias adicionado.Alias modificado.Alias número %d Nome: %s Padrão: %s Substituição: %s Ignorar caixa: %s Avaliar como Perl: %s Habilitado: %s Aliases_Sempre carregar esse plugin ao iniciarAparênciaVocê realmente deseja fechar este mundo?Tentando se conectar ao host %s (%s) porta %s...Tentando se conectar ao host proxy %s (%s) porta %s...AutorAutomação_AzulF_undoPr_eto (Negrito)A_zul (Negrito)Preto Vermelho Verde Amarelo Azul Magenta Ciano Branco Padrão Preto (negrito) Vermelho (negrito) Verde (negrito) Amarelo (negrito) Azul (negrito) Magenta (negrito) Ciano (negrito) Branco (negrito) Padrão (negrito) Fundo NegritoTexto em NegritoBytes recebidos (comprimidos):Bytes recebidos (descomprimidos):_Alterar estiloSeparador de c_omandos:C_onfigurar...Tempo c_onectado:C_ianoNão é possível carregar um plugin em outro mundo.Não foi possível abrir o arquivo de ajuda.Tipo de certificado:_Personagens neste mud:Alterar EstiloPersonagemCo_njunto de caracteres:Marque se você quiser que as linhas sejam quebradas entre palavrasMarque se você quiser que as cores ANSI destacadas sejam mostradas em negrito tambémMarque se você quiser que uma tooltip seja mostrada com o horário em que a linha foi recebida ao deixar o mouse sobre uma linha por alguns segundosMarque se tudo o que você digita aparece como pontos pretos na caixa de entrada.Marque para completar automaticamente os comandos digitados (baseado em comandos anteriores)Marque para salvar os comandos entre sessões.Marque para que o último comando seja mantido na caixa de entrada de comandos, para repeti-lo apertando ENTER simplesmenteMarque para que a janela seja movida para o fim sempre que novo texto chegarMarque para ecoar os comandos enviados na janela principal de saída.Marque para que a substituição seja executada numa construção s///eMarque para que o timer seja apagado quando seu número de vezes chegar a 0Marque para habilitar o alias; somente aliases habilitados são tentadosMarque para habilitar o hook; somente hooks habilitados são executadosMarque para fazer com que o contador de tempo inativo só seja resetado quando um comando for digitado diretamente na caixa de entrada de comandos. Se não estiver marcado, e um comando for enviado por um timer, hook, etc, o contador de tempo ocioso também é resetado.Marque para habilitar o macro; somente macros habilitados são executadosMarque para que a linha não seja escrita no arquivo de logMarque para que a linha não seja mostrada na telaMarque para habilitar o timer; somente timers habilitados são executadosMarque para habilitar o trigger; somente triggers habilitados são tentadosMarque para que o trigger seja um trigger reescritorMarque para que esse trigger não impeça outros triggers de serem tentados, caso este seja executadoMarque para evitar que mais que um determinado número de comandos iguais seja enviado em seqüência (o que pode desconectá-lo em alguns muds)Algoritmo criptográfico:Clique para testar os triggers com a linha.Clique para limpar a área de entrada de comandos.Clique para abrir; clique com o botão direito para mais opções.Clique para reverter todas as cores para o padrão do programaCoresHistórico de Comandos_Histórico de Comandos...Comando não encontrado.Comandos que seriam enviados:Algoritmo de compressão:Taxa de compressão:Compressão utilizada:Confirmar deleçãoConectar aConectar a _Outro MundoConectar a outro mundoConectar sem SSLConectado ao host %s (%s) porta %s, MCCP versão %d habilitado.Conectado ao host %s (%s) porta %s.Conectado ao host %s porta %s, via proxy %s (%s) porta %s, MCCP versão %d habilitado.Conectado ao host %s porta %s, via proxy %s (%s) porta %s.Conectado ao servidor proxy %s porta %s, negociando autenticação...Conectado ao servidor proxy %s porta %s, enviando pedido..._Estilo de Conexão:Tempo de conexão:Copiar endereço do linkImpossível conectar ao host %s porta %s: %sImpossível conectar ao host %s porta %s: Erro #%dImpossível criar diretório '%s': %sNão foi possível criar o socket: %sNão foi possível criar o socket: erro #%dImpossível importar arquivo '%s': %sImpossível carregar plugin %sImpossível carregar mundo do arquivo '%s': %sImpossível abrir arquivo de dump %s: %s Impossível abrir arquivo '%s': %sImpossível abrir arquivo '%s': %s Variáveis não foram salvas.Não foi possível abrir o arquivo.Impossível abrir arquivo: %sNão foi possível abrir o arquivo de log.Impossível abrir arquivo de dump bruto %s: %s Impossível abrir mundo '%s': %s Não foi possível encontrar o host %s: %sNão foi possível iniciar a thread para resolução do nome.VezesVezes Personalizado: Cia_no (Negrito)DIRA_guardarExcluirDescriçãoDiretório para salvar a configuração e mundos salvosDesabilitar T_imersDesabilitar _AliasesDesabilitar _MacrosDesabilitar _TriggersDesconectadoDesconectado do host %s.Desconectado do host %s: %s.Desconectado do host %s: erro #%d.Desconectado do mundo %s.AparênciaMostrar _tooltips com o horário em que a linha foi recebidaMostrar como horas, minutos e segundosMostrar como segundosNão _permitir que o mesmo comando seja enviadoNão mudar Preto Vermelho Verde Amarelo Azul Magenta Ciano Branco Padrão Preto (negrito) Vermelho (negrito) Verde (negrito) Amarelo (negrito) Azul (negrito) Magenta (negrito) Ciano (negrito) Branco (negrito) Padrão (negrito) Não alterar Não SimNão alterar Nenhum Simples DuploNão conectarNão excluirNão exibirVocê realmente deseja apagar %d %s?Você realmente deseja apagar o %s?Você realmente deseja tornar %d variáveis temporárias?Você realmente deseja tornar a variável temporária?Não sairEscreve todos os dados recebidos (possivelmente comprimidos) ao arquivoEscreve todos os dados recebidos (depois de descomprimir, se apropriado) ao arquivoA_valiar Substituição como um comando PerlE_xportarEditar AliasEditar Informações do PersonagemEditar _Mundo Padrão...Editar HookEditar MacroEditar TimerEditar TriggerEditar MundoElemento '%s' não permitido dentro do elemento '%s'Habilitar pacotes TCP _Keep AliveHabilitar _auto-compleçãoH_abilitar se o servidor propuser a qualquer momentoHabilitadoEntre a _linha para ser comparada com os triggers:Entre o comando para ser enviado toda vez que o número máximo de comandos iguais fosse ser enviadoEntre um nome descritivo para o MundoEntre opcionalmente um nome descritivo para o aliasEntre opcionalmente um nome descritivo para o hookEntre opcionalmente um nome descritivo para o macroEntre opcionalmente um nome descritivo para o timerEntre opcionalmente um nome descritivo para o triggerEntre com algum texto para ser enviado ao MundoEntre com algum texto para procurar.Entre a ação que vai ser executado quando uma linha disparar o triggerEntre a ação a ser executado quando o timer dispararEntre a ação a ser executado quando o evento acontecerEntre a ação a ser executada quando a tecla for pressionadaEntre o nome do personagem para login automáticoEntre a senha do seu personagem para login automáticoEntre o comando para rodar um navegador web. %s será substituído pelo endereço da página da web.Entre o comando para rodar um reprodutor de áudio. %s será substituído pelo arquivo.Entre os parâmetros padrão para o envio de múltiplas linhas ou comandos:Entre o host a se conectarEntre o nome de uma variável escalar ($), array (@) ou hash (%) cujo conteúdo será salvo entre sessões do MundoEntre o padrão para ser comparado com as linhas recebidasEntre o padrão para ser comparado com os commandos digitadosEntre a porta usada para conexãoEntre a substuição a ser feitaEntre o texto para procurarErro ao Carregar PluginErro no arquivo de plugin: %sErro ao carregar interface do arquivo XML: %sErro ao configurar verificador ortográfico: %s Erro ao ler do servidor proxy.Avaliar como PerlEvento:Expira:ExportarProgramas ExternosARQUIVOImpossível abrir arquivo %s: %sArquivoArquivo não especificado.Encontrar ComandoEncontrar _PróximoEncontrar _PróximoEncontrar PróximoEncontrar AnteriorEncontrar _próximoProcura por um comando contendo um determinado textoProcura pelo próximo comando com o mesmo textoFingerprint:Ver_de (Negrito)GagGag LogGeralTópico de ajuda não encontrado.Aqui você pode definir opções para configurar a aparência do KildClient.Aqui você pode definir opções para configurar os recursos de automação do KildClient, como triggers, aliases, plugins, etc.Hook definido.Hook modificado.Hook não encontradoHook número %d para o evento %s Nome: %s Ação: %s Habilitado: %s HooksHooks para '%s': Host:Host:I. CaixaIdentificar como 'Personagem - Nome do mundo'Identificar como 'Nome do mundo - Personagem'Identificar como 'Nome do mundo'Tempo inativo:Se marcado, as setas para cima e para baixo não serão usadas para navegar entre os comandos salvos no histórico. (Será necessário usar Alt+Acima e Alt+abaixo.)Se marcado, triggers, aliases, macros e timers definidos por plugins aparecerão nas seções correspondentes do Editor de MundosSe não estiver marcado, objetos tais como triggers, aliases, etc. serão apagados diretamente sem pedir confirmação quando você aperta o botão Deletar.Se esta opção estiver habilitada, quando houver apenas um mundo aberto, nenhuma aba será exibida.Se estiver selecionada, o log será automaticamente iniciado sempre que você se conectar a este mundo.ImportarInforme o número de linhas para incluir no log.EntradaErro interno: elemento '%s' termina quando no modo STARTIntervaloArgumento '%s' inválido Atributo '%s' inválido para o elemento '%s'Chamada de função inválida: sintaxe é $world->FUNÇÃOCódigo de tecla '%s' inválidoCódigo de tecla inválido.Arquivo de plugin inválido.Elemento '%s' inválidoEspecificação de tamanho de janela inválida no arquivo de configuração. Cont ExecManter _abertoManter permanenteTeclaTroca de chave:Erro - KildClientInformação - KildClientQuestão - KildClientAviso - KildClientKildClient prontoCódigo da língua:Esquerda Direita Em cima Em baixoLinhas recebidas:Carregar pluginLogLog está desabilitado.Log não iniciado.Log desabilitado.Logando para o arquivo %s.Logando para o arquivo %s. MAC:Macro adicionado.Macro modificado.Macro número %d Nome: %s Código de tecla: %s Ação: %s Habilitado: %s MacrosMagen_ta (Negrito)Janela PrincipalManter temporáriaLargura máxima da linha em _caracteres:OutrosMais de um comando selecionado.Enviar múltiplas linhasN/ANúm_ero de linhas:NomeNunca _ocultar texto digitadoComandos mais novos estão no topoNãoNenhum %s apagado.Nenhum método de autenticação aceitável.Sem auto-login diku (pers, senha) lp (CONNECT pers senha)Nenhum comando selecionado.Não existe tal %sNão existe tal %s.Não existe tal alias.Não existe tal hookNão existe tal macroNão existe tal plugin.Não existe tal timerNão existe tal triggerNenhum mundoNenhumaNão conectadoNão conectado.Não encontradoNão definidoNota: É possível usar seqüências da função strftime() para que o nome do arquivo inclua a data e/ou hora em que o log é iniciado. Além disso, %Kw representa o nome do mundo e %Kc o personagem usado no auto-logon.Núm Hab %-*.*s %-*.*s Núm Hab %-*.*s Versão %-*.*s Num Hab AçãoNum Hab Temp IntNúm Aval Hab IgC %-*.*s %-*.*s Núm Gag GLo Hab KeE ReE IgC Est %-*.*s %-*.*s Número de triggers disparados:OfflineOmitir (_gag) da tela de saídaOmitir (gag) do arquivo de _logHooks OnCloseConnectHooks OnConnectHooks OnDisconnectHooks OnGetFocusHooks OnLoseFocusHooks OnReceivedTextHooks OnSentCommandUm %s apagado.Só _resetar o contador de tempo inativo quando um comando é digitado diretamenteApenas variáveis escalares ($), arrays (@) e hashes (%%) podem ser feitas permanentes.Abrir linkOu conecte d_iretamente:Mostra a informação da versão e sai_Senha:SenhaPadrãoIniciando SSL...Variáveis PermanentesVariáveis permanentesVariável permanentePluginPlugin '%s' carregado.Plugin já carregado. Tente habilitá-lo.Plugin desabilitado.Plugin habilitado.Plugin não carregado.Plugin não especificado.Plugin número %d Nome: %s Versão: %s Descrição: %s Autor: %s Habilitado: %s PluginsPorta:PreferênciasIncluir _data e/ou horaPressione uma tecla para obter seu código de tecla.Aperte a tecla que será usada para executar o macro enquanto o cursor estiver na caixa de textoAperte a tecla que será usada para executar o macroProtocolosProxy_Tipo do proxy:Autenticação com o servidor proxy falhou.Host proxy:Porta do proxy:Pedido ao proxy falhou: %s.Tipo do proxy:Colocar comando na caixa de entrada de comandosColocar comando na caixa de entrada de comandos e fechar essa janelaVerme_lhoVermel_ho (Negrito)Reverter às core_s padrãoRealmente sair do KildClient?Realmente fechar?Recuper_ar & FecharReconectarProcurando host %s...Procurando host proxy %s...Reverter ao _padrãoReescritorNegociação SSL falhou: %sHandshake SSL demorou demais.SSL não suportado nessa versãoProtocolo SSL usado:E_nviar & Fechar_Verificar ortografia do texto digitadoEs_tatísticas...ScriptsRolar quando chega texto _novoE_nviar este comando:Direção da busca:Selecione se você não deseja que o tempo de conexão seja mostradoSelecione se você não deseja que o tempo de inatividade seja mostradoSelecione se você deseja que o tempo de conexão seja mostrado em horas, minutos e segundosSelecione se você deseja que o tempo de conexão seja mostrado em segundosSelecione se você deseja que o tempo de inatividade seja mostrado em horas, minutos e segundosSelecione se você deseja que o tempo de inatividade seja mostrado em segundosSelecione arquivo de logSelecione a fonte usada na janela _principal:Selecione a fonte usada na barra de _status:Selecione a fonte usada na caixa de _entrada de comandos:Selecione a fonte usada na caixa de entrada de comandosSelecione a fonte usada na janela principalSelecione a fonte usada na barra de statusSelecione esta opção se você deseja colocar no início de cada linha a data e/ou hora em que a linha foi recebida.Selecione para incluir linhas da janela principal no arquivo de logEnvia o(s) comando(s) selecionados ao mudEnvia o(s) comando(s) selecionados ao mud e fecha esta janelaEnviar esse texto _inicialmente:EnvioEnviando pedido de conexão...Enviando credenciais de autenticação ao servidor proxy..._Endereço do servidor:_Porta do servidor:Especifique quantos comandos são mandadas de cada vezEspecifique quantas linhas são mandadas de cada vezEspecifique quantas deves esse timer deve rodar antes de ser desabilitado ou apagadoEspecifique algum texto para ser anexado ao fim de cada linha enviadaEspecifique algum texto para ser anexado ao começo de cada linha enviadaEspecifique o comando usado para iniciar um navegador webEspecifique o comando usado para reproduzir arquivos de áudio.Especifique a espera entre o envio de cada grupo de comandosEspecifique a espera entre o envio de cada grupo de linhasEspecifique o intervalo, em segundos, entre ativações do timerEspecifique o número máximo de comandos iguais que podem ser enviados em seqüênciaEspecifique o número de caracteres que devem ser digitados para iniciar a completar comandos automaticamenteEspecifique o número de comandos que são salvos e podem ser recuperados depoisEspecifique o número de linhas da saída que podem ser vistas rolando a janelaEspecifique o separador de comandos digitados na caixa de entrada de comandosCorreção ortográfica não incluída nessa versão.Começ_arEstatísticasBarra de StatusEstiloSubstituiçãoSucesso ao mover %s.TTL expirouTempTestar TriggersPor padrão, é a adicionada a data e hora, mas é possível configurar o formato com seqüências da função strftime(). Consulte o manual para uma explicação mais detalhada.A ajuda foi exibida na janela principal.O intervalo deve ser positivo.A parte númeroOs triggers serão testados com o texto digitado aqui, como se fosse uma linha recebida do MUDToda a linhaTodo o texto encontradoEntão enviar o conteúdo desse _arquivo:Há %d mundos abertos. Você deseja realmente sair?Há um mundo aberto. Você deseja realmente sair?Isso é o que seria impresso na janela principal. Se estiver vazio, a linha foi omitida. A linha pode ser diferente da original por causa de triggers reescritores.Isso é o que seria mostrado na janela principal:Este objeto pertence a um plugin. Modificações feitas nele não serão salvas no plugin.Este programa é software livre, você pode redistribui-lo e/ou modificá-lo sob os termos da GNU General Public License conforme publicada pela Free Software Foundation; tanto a versão 2 desta licensa quanto (a seu critério) qualquer versão mais nova.Esta versão do KildClient não tem suporte a SSL.Timer adicionado.Timer modificado.Timer número %d Nome: %s Intervalo: %d Número de vezes: %d Ação: %s Habilitado: %s Temporário: %s TimersTrigger adicionado.Trigger modificado.Trigger número %d Nome: %s Padrão: %s Ação: %s Ignorar caixa: %s Omitir na tela: %s Omitir no log: %s Habilitado: %s Continuar execução: %s Reescritor: %s Mudar estilo: %s TriggersImpossível conectar ao host %s: %sImpossível conectar ao host %s: Erro #%dImpossível conectar ao host proxy %s: %sImpossível conectar ao host proxy %s: Erro #%dDesconhecidoDiretiva '%s' desconhecida no arquivo de configuração. Mundo sem nomeResposta do servidor proxy não foi reconhecida.Use $window->getsize() no lugar dela.Use $window->minimize() no lugar dela.Use $world->path() no lugar dela.Use %Kw para representar o nome do mundo, e %Kc para representar o nome do personagem usado no auto-logonUsar _SSLUsar fonte _negrito para cores destacadas (ao invés de apenas destacar)Barra de entrada com _múltiplas linhasUsar configuração global Sem proxy SOCKS4 SOCKS5Barra de entrada com _uma única linhaUse o botão Procurar para procurar o primeiro resultado.Válido desde:VariáveisVersãoVersão %s desse plugin já está carregada.Visite http://kildclient.sf.netB_ranco (Negrito)Aviso: Tentando enviar uma linha muito longa. Talvez uma definição recursiva de alias?Aviso: a função getwindowsize() será removida no futuro.Aviso: a função minimize() será removida no futuro.Aviso: a função path() será removida no futuro.Nome do mundo:Mundo salvo.Essa linha seria escrita no arquivo de log?Quebrar linhas na largura _máxima da telaEscrito por Eduardo M Kalinowski (eduardo@kalinowski.com.br) Amarel_o (Negrito)SimVocê pode deixar esse campo em branco, e um nome de arquivo será gerado automaticamente. Edite esse campo apenas se souber o que está fazendo.Você deve especificar o nome de uma variável.Você deve especificar a ação, a não ser que o trigger seja um gag ou altere o estilo.Você deve especificar a ação.Você deve especificar a tecla.Você deve especificar o nome.Você deve especificar a senha.Você deve especificar o padrão.Você deve especificar a substituição.Você está tentando se conectar a um host que usa SSL, mas esta versão do KildClient foi compilada sem suporte a SSL. Conectar sem SSL?[MUNDO...]_Sobre_Ação:_Aplicar a:Pedir confirmação _antes de apagar triggers, aliases, etc.F_undo:_Preto_LimparEco de _comandos:A_guardar_Espera entre cada grupo de linhas/comandos:_Desabilitar_Desabilitar as setas para navegar no histórico_Desconectar_Aparência_Não mostrar esta mensagem novamentePara _baixo_Ecoar comandos enviados na janela principal_Editar_Editar..._Habilitar se o servidor propuser após a conexão_Habilitado_Evento:_Arquivo:_Finalmente, enviar esse texto:_Procurar:_Piscar janela quando novo texto é recebidoTe_xtoTe_xto:_Formato:_Verde_Ajuda_Esconder abas se houver só um mundo aberto_Host:Tempo _Inativo:_Ignorar maiúsculas e minúsculas_Importar_Incluir as últimas_Indentar linhas quebras porMensagens _informativas:_Entrada_Intervalo:_Itálico:_Itens para exportar_Manter janela aberta após envioC_ontinuar executando outros triggers depois de esser ser executado_Manter último comando enviado na caixa de entrada de comandos_Tecla:_Linhas para salvar no buffer de rolagem:_CarregarMa_genta_ManualEnviar _Múltiplas Linhas..._Nome da variável a ser tornada permanente:_Nome:_Próximo_Número de comandos para salvar no histórico:_Número de linhas/comandos para enviar de uma vez:_Senha:_Padrão:Arquivo _Perl para carregar:Po_rta:_Preferências_Anterior_Recuperar_Reconectar_Número de vezes:Trigger _reescritor_Selecione um mundo salvo:_Enviar_Mostrar itens definidos por plugins_Dividir janela_Salvar comandos entre sessões_Tachado:_Substituição:_Posição das abas:_Temporário (será deletado automaticamente quando o número de vezes atingir 0)_Testar Triggers..._Texto para procurar:S_ublinhado:Para _cima_Usuário:_Branco_MundoQuebrar linhas entre _palavrasA_marelo_vezes em seqüênciatipo de endereçamento não suportadoaliasalias: cancelando criação de um aliás sem patternalias: cancelando criação de alias sem substituiçãoaliasespersonagemcaracteres terem sido digitadoscomando não suportado / erro de protocolocomando(s)conexão não permitida pelo conjunto de regrasconexão recusada pelo host destinofalha geralhookhook: hook '%s' não encontrado hookshost de destino inatingívellinha(s)linhas do buffer de rolagem no logmacromacro: Não existe tal macromacrosnrede inatingívelnãopixelspedido falhou pois o identd do cliente não pode confirmar o ID de usuário no pedidopedido falhou pois o servidor identd não pode ser alcançadopedido recusado ou falhousegundos ca_dasegundossegundos ca_datimertimer: Não existe tal timertimerstriggertriggerscódigo de resposta desconhecidossimkildclient-2.11.1/po/POTFILES.in0000644000175000017500000000212711570463465013047 00000000000000# $Id: POTFILES.in 1098 2009-10-31 13:03:22Z ekalin $ # List of files with marked strings src/main.c src/net.c src/proxy.c src/mainwindow.c src/worldgui.c src/ansitextview.c src/worldselector.c src/worlds.c src/worldeditor.c src/we_general.c src/we_mainwindow.c src/we_colors.c src/we_statusbar.c src/we_input.c src/we_logging.c src/we_scripting.c src/we_plugins.c src/we_generic_guied.c src/we_triggers.c src/we_aliases.c src/we_macros.c src/we_timers.c src/we_hooks.c src/we_vars.c src/we_protocols.c src/we_misc.c src/we_advanced.c src/prefs.c src/parser.c src/triggers.c src/aliases.c src/macros.c src/timers.c src/permanentvariables.c src/hooks.c src/log.c src/plugins.c src/multilinesend.c src/cmdhistory.c src/sound.c src/perlscript.c src/kcircularqueue.c src/kcwin.c src/simocombobox.c src/kildclient.glade src/wndmain.glade src/dlgSelectWorld.glade src/dlgPreferences.glade src/dlgStatistics.glade src/dlgAbout.glade src/dlgEditWorld.glade src/dlgTestTriggers.glade src/dlgMLSend.glade src/dlgCmdHistory.glade src/mnuPopupURL.glade src/kildclient.h src/ansi.h src/perlscript.h share/kildclient.pl kildclient-2.11.1/po/sv.gmo0000644000175000017500000012577711570463465012447 00000000000000Þ•ôÏÌ!-~ - ˆ-–-¥-®-Ç-ã-û-.*.@."W."z..µ.Ô.&ð./1/(N/w/Œ/¡/´/'Ð/)ø/"0*0 10;0L0_0s0…0 š0»0Ð0â0 ø01 1(1 A1N1d1‚1 –1£1 ²1¿1ß1ð122+2>2Z2Bk2+®2$Ú2ÿ2(3"/3R3 [3h3‚x3û3#4 '4*240]46Ž4Å4 Ì4×4 Ý4 é4 ÷455$5A5 `5n5 ‚55¡5&§5Î5å5 þ5 66J%6Lp6D½6B7tE7Iº7D8?I8<‰8GÆ8<9&K91r95¤9Ú9á9ñ9::5:L:_:q: ‚::¡:º:;Î:" ;Q-;8;C¸;8ü;5<H<Y<(k</”<#Ä<è<"='=F='_= ‡=¨=6Å=ü=>)>$B>g>†>¤>ª> ±>¾>Â>É> Ð>,Ü> ??*? :?G?b?%?§?Â?%Ê?ð?)@-@ B@c@ r@€@#@$³@2Ø@2 A >A9IAƒA ‹A–A±A ÈA ÓA ÞA,éAB.B&6B1]B1B1ÁB'óBC1:C2lC.ŸC2ÎCWDZYDD´DùD#E:EWElE …E ¦E³E ºEÆEÍEßEäEÿEF F *F 5F @F JF XF-cF ‘F žF¬F´FCÊFuGF„GËGÜG âG ìGK÷G]CH¡H¨H4®HãH'ìHI2)I \IgIvIzI‹I¢I¶IÉIÚIéIÿI JJ#J8JLJ]JqJ†J ‹J˜JL¨JõJüJ KK 'K5KUKYKkKpK‹KŽK+K6ÉKL L L ,L :LHL WLeLnL sLL LšL¢L¹LØL.øL'M/M@?M €MŠM% M ÆMÑMÚMâMöM NN$N'8N`NqNN”Nk©NOO #OZ/O0ŠO »OÅO ËOØO õO P P 'P13PGeP­P ²P¾PØP ðPþP QQ-QHQ![Q}Q QžQ¶Q ÅQÏQáQõQ=R7ERT}RAÒRNS;cSŸS)¯S(ÙS/T-2T.`T&T'¶T<ÞTU6U>U+\UˆU ™U*§U'ÒUMúU0HV-yV;§VFãVS*WG~WSÆW2XMX TX _XjXpX ‡X%“X¹XØX%çX5 Y4CY1xYZªYïZ5õZ +[8[‚H[Ë[äÒ[!·\(Ù\'].*]Y]'a] ‰]&—]¾] Þ]ÿ]^D$^*i^-”^ Â^ Ï^Ù^,á^_ -_H;_C„_?È_ ` `,!`<N`‹`š`…ž`!$aFaca}a˜a·a•Õa kbvb}b †b ‘bžb¥b¬b,³bàb ébõb"þb !c,c2c;cDcLcScmc'tc œc ¨cµc¾cÅc$Ëcðc ÷cd d"d )d4d=dNd-ndœd$¢dÇdÐd$Ødýde' e*2e ]e here†e e še¤e ¬e·eÆeÝe ãeffJ"fmf |fˆf ‘fœf£fªf²fÂfÝf)ãf g gg&iw/¨w@ØwOxixqx‚x”x"¬xÏxæxyy .y:yPyly?|y$¼yUáy:7zErz9¸zòz{{,({1U{!‡{©{ Å{!æ{$|--|![|}|7›|Ó|ê|}%}"E} h}‰}} •}¡} ¥}°} ¸}<Ä}~~%~ :~G~ d~%…~«~È~%Ï~õ~(0C c o | †#§0Ë,ü )€=6€ t€€Ž€­€É€Ø€ç€2÷€"* M+Z5†6¼7ó0+‚#\‚<€‚;½‚5ù‚:/ƒpjƒ}ÛƒLY„!¦„0È„ù„#…"=…;`… œ… ª… µ… ¿…É…Ù…(Ý…† † &† 4† A† N†Z† l†2y†¬† »†ȆцM톑;‡J͇ˆ)ˆ 0ˆ ;ˆQGˆc™ˆ ýˆ ‰.‰ @‰(J‰s‰<“‰Љà‰ò‰ú‰ Š Š2ŠEŠ UŠ#`Š„ŠšŠ°Š¹ŠÓŠíŠÿŠ‹*‹/‹>‹OP‹ ‹©‹ ¸‹Æ‹Õ‹Ý‹ý‹ ŒŒ #ŒDŒHŒ0\ŒDŒÒŒëŒüŒ"6Q er x† •£²Éè.Ž 7ŽDŽNUŽ ¤Ž±Ž)ÇŽ ñŽ ýŽ%: M«Æß ûx•¥«bº>‘ \‘f‘ l‘ w‘ ˜‘ ¤‘¯‘ Ï‘5Ù‘Q’a’ g’!s’%•’»’Ö’ ë’÷’ “(“@“`“w“!Š“ ¬“ º“œړ ò“4ü“51”Ng”:¶”Oñ”;A•}•7•7Å•@ý•>>–C}–5Á–.÷–B&—i—„—Œ—-«—Ù— è—6õ—2,˜T_˜?´˜>ô˜73™;k™T§™Dü™BAšA„šÆš Κ Øšæšëš› ›!8› Z›&e›8Œ›6Å›5ü›o2œï¢œ/’ÂÒŽäsžôyž%nŸ*”Ÿ*¿Ÿ/꟠)! K [ &y '  !È  ê Q÷ :I¡;„¡À¡ ϡ١4á¡¢ 6¢EA¢@‡¢<È¢££(%£<N£ ‹£–£‚™£&¤C¤^¤x¤¤«¤’Ť X¥d¥ h¥s¥ ƒ¥Ž¥•¥ ›¥5¦¥ Ü¥ è¥õ¥ ý¥¦ &¦ 0¦ =¦ K¦W¦]¦{¦,‚¦ ¯¦ º¦ƦϦÖ¦*Þ¦ § § §)§ C§ N§Z§c§+y§:¥§ à§$ꧨ¨*!¨L¨S¨([¨4„¨ ¹¨ ŨШç¨î¨ þ¨ © ©%©:©U©!]© © ©T›©ð© ªªª-ª2ª:ª?ªNªdª&jª‘ª —ª¡ª#¸ª ܪ!èª «)«:«C«I«d«m«o«„«#ˆ« ¬« º« ūӫ٫ô«ú«ü«þqaä byA¬™:»cµ\WöŒDà5ÓÈ%ÃcÂu“ÒçHkï°Óíg«TÉŠ7F´ VI²H ª0è´`*"×Q÷¯‚'ŸÅ@ßlÚ$êÐ:Ppó”Ù]À¼q`¹²¦–\èý9„É›à’úò6zë41E>že“Õᡳæ+[ 6êðFWÇû¢¢Ýù8&^-„å§$Î~YI†ÒðîÌ,5õœmïRŽËÑ#¶.U•!>QÖ£+Mtç]<,‚…«–½4ÿPühK—C2Ð ¸‰€%ëÑ-ŒªÛ»9ZÞ¥‡Ï‡ ò¸¼ÜÙ¦! G&T ¥Îuâ ©X¬¯3?}¨Æº¨‹SäôAn=áa¡yæfs)”OÖ ÔîYx§Í£…w©8{µ• ìÛ ÿt[˜ekºxù‰ËG_Ç ¿þBã·D鋟{¤0®Õ'L;éK*¾‘Ähû€foÅ÷dˆlmXØÁ¹ô¾Ê—ÝLŠãñ^E(wB/·Íóåφ}sÃ3N"g |ÞšœdbiSñ±ƒÜø‘.±2rvV1r#Mz~’O›ŽÁovʈj<Æ¿ý½×NC³íšU­ ž iú( öpØâ@™ƒJüøÔnȤ°j=õ˜;/¶Ä­ßR7®JÀ?Z Ú)Ì| _ì Target: %d Foreground: %d Background: %d Italics: %d Striked-thru: %d Underline: %d SSL enabled.%d %s deleted.%d lines%s is already permanent.%s: %s is already permanent%s: %s is not permanent%s: Argument must be numeric%s: No such world%s: Too few arguments%s: Too few arguments.%s: Variable '%s' made permanent. %s: Variable '%s' made temporary. %s: Wrong argument type%s: Wrong number of arguments.%s: Wrong type of reference%s: action not specified, not creating%s: count must be numeric%s: interval must be numeric%s: interval not specified, not creating%s: invalid bg color%s: invalid fg color%s: invalid target%s: invalid underline style%s: pattern not specified, not creating(Leave blank for default based on locale)0 lines1 line: Expired: Not yet activeAnsi ColorsAudio PlayerAuto-loginCharacter SetColors used by KildClientCommand EntryConnectionDefault ColorsFileFlood preventionFontGraphical EditorsInputLogging StatusMCCP (for compression)Name displayNote:OptionsProxyRevert to default colorsScriptingScrollingSending DelaysTime DisplayWeb BrowserWindow configurationWord WrapA mud client with powerful features and support for Perl ScriptingA_utomatically start logging when connectedActi_vate auto-completion only afterActionAdd this to the _beginning of each line:Add this to the _end of each line:AdvancedAlias added.Alias modified.Alias number %d Name: %s Pattern: %s Substitution: %s Ignore case: %s Eval as Perl: %s Enabled: %s AliasesAlways load this plugin at _startupAppearanceAre you sure you want to close this world?Attempting to connect to host %s (%s) port %s...Attempting to connect to proxy host %s (%s) port %s...AuthorAutomationB_lueBac_kgroundBl_ack (Bold)Bl_ue (Bold)Bold BackgroundBold ForegroundBytes received (compressed):Bytes received (decompressed):C_hange styleC_ommand separator:C_onfigure...C_onnected time:C_yanCannot load a plugin in another world.Cannot open help file.Ch_aracters in this mud:Change StyleCharacterCharacter _set:Check if you want the highlighted ANSI colors to be displayed in bold alsoCheck this if the text you type is displayed as black dots in the input box.Check to enable command auto-completion (based on previous commands)Check to have the command history saved in a file between sessionsCheck to have the last command kept in the command entry box, so that you can repeat commands only by pressing ENTERCheck to have the main window scroll to the end whenever new output comesCheck to have the timer deleted after its repeat count has reached 0Check to make the alias enabled; only enabled aliases are triedCheck to make the macro enabled; only enabled macros are runCheck to make the matched line not be printed in the main output windowCheck to make the timer enabled; only enabled timers are runClick to clear the command input area.Click to open link; right-click for more options.Click to revert all colors to their built-in defaultsColorsCommand HistoryCommand _History...Command not found.Commands that would be sent:Compression algorithm:Compression ratio:Compression used:Confirm deletionConnect toConnect to _AnotherConnect to another worldConnect without SSLConnected to host %s (%s) port %s, MCCP version %d enabled.Connected to host %s (%s) port %s.Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d enabled.Connected to host %s port %s, via proxy %s (%s) port %s.Connected to proxy server %s port %s, negotiating authentication...Connected to proxy server %s port %s, sending request...Connection _Style:Connection time:Copy Link AddressCould not connect to host %s port %s: %sCould not connect to host %s port %s: Error #%dCould not create directory '%s': %sCould not create socket: %sCould not create socket: error #%dCould not import file '%s': %sCould not load plugin %sCould not load world from file '%s': %sCould not open dump file %s: %s Could not open file '%s': %sCould not open file '%s': %s Variables were not saved.Could not open file.Could not open file: %sCould not open log file.Could not open raw dump file %s: %s Could not open world '%s': %s Could not resolve host %s: %sCountCount Cya_n (Bold)DIRDela_yDeleteDescriptionDirectory to store settings and saved worldsDisable T_imersDisable _AliasesDisable _MacrosDisconnectedDisconnected from host %s.Disconnected from host %s: %s.Disconnected from host %s: error #%d.Disconnected from world %sDisplayDisplay as hours, minutes and secondsDisplay as secondsDo not allow the _same command to be sentDo not change No YesDo not change None Single DoubleDo not connectDo not deleteDo not displayDo you really want to delete %d %s?Do you really want to delete the %s?Do you really want to make %d variables temporary?Do you really want to make the variable temporary?Don't quitDumps all data received (possibly compressed) to the fileE_xportEdit AliasEdit Character InformationEdit Default _World...Edit MacroEdit TimerEdit WorldElement '%s' not allowed inside element '%s'Enable _auto-completionEnabledEnter a descriptive name for the WorldEnter optionally a descriptive name for the aliasEnter optionally a descriptive name for the macroEnter optionally a descriptive name for the timerEnter some text to be sent to the WorldEnter some text to search for.Enter the action to be run when the event happensEnter the action to be run when the key is pressedEnter the character's name for automatic loginEnter the character's password for automatic loginEnter the command to run a web browser. %s will be substituted by the web page address.Enter the command to run an audio player program. %s will be substituted by the file path.Enter the default parameters for sending multiple lines or commands:Enter the host to connect toEnter the port used when connectingEnter the text to search forError Loading PluginError in plugin file: %sError setting spell checker: %s Eval as PerlEvent:Expiration:ExportExternal ProgramsFILEFailed loading file %s: %sFileFile name not specified.Find CommandFind N_extFind Ne_xtFind NextFind PreviousFind _nextFind a command containing a given search termFingerprint:G_reen (Bold)GeneralHelp topic not found.Here you can set options to configure the appearance of KildClient.Here you can set options to configure the automation features of KildClient, such as triggers, aliases, plugins, etc.Hook number %d for event %s Name: %s Action: %s Enabled: %s Hooks for '%s': Host:Hostname:Idle time:If this is checked, when there is only one open world no tabs will be shownIf this is selected, logging will be automatically started whenever you connect to the world.ImportInputInternal error: element '%s' ends when in START modeIntervalInvalid attribute '%s' for element '%s'Invalid plugin file.Invalid window size specification in config file. Keep _openKeep permanentKeyKildClient ErrorKildClient InformationKildClient QuestionKildClient WarningKildClient readyLanguage code:Left Right Top BottomLines received:Load pluginLoggingLogging is disabled.Logging not startedLogging stopped.Logging to file %s.Logging to file %s. MAC:Macro added.Macro modified.Macro number %d Name: %s Key Code: %s Action: %s Enabled: %s MacrosMagen_ta (Bold)Main WindowMake temporaryMiscellaneousMore than one command selected.N/AN_umber of lines:NameNever _hide the typed textNoNo %s deleted.No acceptable proxy authentication methods.No auto-login diku (char, pass) lp (CONNECT char pass)No command selected.No such %sNo such %s.No such aliasNo such macroNo such pluginNo such timerNo worldNoneNot connectedNot connected.Not foundNot setNum Ena %-*.*s %-*.*s Num Ena %-*.*s Version %-*.*s Num Eval Ena IgC %-*.*s %-*.*s Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s OfflineOne %s deleted.Only _reset idle time counter when a command is entered directlyOpen LinkOr connect d_irectly:Outputs version information and exitsPass_word:PasswordPatternPermanent VariablesPermanent variablesPermenent variablePluginPlugin '%s' loaded.Plugin already loaded. Try enabling it.Plugin disabled.Plugin enabled.Plugin not loaded.Plugin not specifiedPlugin number %d Name: %s Version: %s Description: %s Author: %s Enabled: %s PluginsPort:PreferencesPress the key that will be used to activate the macro while the cursor is in the text box.Press the key that will be used to run the macroProtocolsProxyProxy _type:Proxy authentication failed.Proxy host:Proxy port:Proxy request failed: %s.Proxy type:Put the selected command in the command entry boxPut the selected command in the command entry box and close this dialogR_edRe_d (Bold)Re_vert to default colorsReally Quit KildClient?Really close?Rec_all & CloseReconnectResolving host %s...Resolving proxy host %s...Revert to _defaultSSL not supported in this versionSSL protocol used:S_end & CloseS_pell check typed textS_tatistics...ScriptingScroll on _outputSe_nd this command:Search direction:Select if you do not want the connection time to be displayedSelect if you do not want the idle time to be displayedSelect if you want the connection time to be displayed in hours, minutes and secondsSelect if you want the connection time to be displayed in secondsSelect if you want the idle time to be displayed in hours, minutes and secondsSelect if you want the idle time to be displayed in secondsSelect log fileSelect the font used in the _main screen:Select the font used in the _status bar:Select the font used in the command _entry box:Select the font used in the command entry boxSelect the font used in the main output screenSelect the font used in the status barSend the selected command(s) to the mudSend the selected command(s) to the mud and close the dialogSend this text _initially:SendingSending connection request...Sending proxy authentication credentials...Server _address:Server _port:Specify how many commands are sent at onceSpecify how many lines are sent at onceSpecify how many times this timer should run before being disabled or deletedSpecify the command used to launch a web browserSpecify the command used to play sound files.Specify the interval, in seconds, between timer activationsSpecify the maximum number of equal commands that can be sent in a rowSpecify the number of characters that must be typed for command completion to startSpecify the number of commands that are saved and can be later recalledSpecify the number of lines of output that can be seen with by scrolling the windowSpell checking support not included in this build.St_artStatisticsStatus BarStyleSuccessfully moved %s.TTL expiredThe help is displayed in main window.The interval must be positive.The whole lineThen send the _contents of this file:There are %d open worlds. Do you really want to quit?There is one open world. Do you really want to quit?This is what would be printed in the main screen:This object belongs to a plugin. Changes made here will not be saved in the plugin.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 version of KildClient does not have SSL support.Timer added.Timer modified.Timer number %d Name: %s Interval: %d Repeat count: %d Action: %s Enabled: %s Temporary: %s TimersTrigger number %d Name: %s Pattern: %s Action: %s Enabled: %s Ignore case: %s Gag output: %s Gag in log: %s Keep executing: %s Rewriter: %s Change style: %s Unable to connect to host %s: %s.Unable to connect to host %s: Error #%d.Unable to connect to proxy host %s: %s.Unable to connect to proxy host %s: Error #%d.UnknownUnknown directive '%s' in config file. Unnamed worldUnrecognized response from proxy host.Use $window->getsize() instead.Use $window->minimize() instead.Use $world->path() instead.Use _SSLUse _bold font for highlighted colors (instead of just highlighting)Use global settings No proxy SOCKS4 SOCKS5Use the Find button to find the first result.Valid since:VariablesVersionVersion %s of this plugin is already loaded.Visit http://kildclient.sf.netW_hite (Bold)Warning: the getwindowsize() function is deprecated and will be removed.Warning: the minimize() function is deprecated and will be removed.Warning: the path() function is deprecated and will be removed.World name:World saved.Would this line be included in the log file?Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br) Yell_ow (Bold)YesYou can leave this field blank, and a file name will be automatically generated. Only edit this field if you know what you are doing.You must specify a variable name.You must specify the action.You must specify the key.You must specify the name.You must specify the password.You must specify the pattern.You're attempting to connect to a world that uses SSL, but this version of KildClient has been built without SSL support. Try to connect without SSL?[WORLD...]_About_Action:_Apply to:_Background:_Black_Clear_Delay_Delay between each group of lines/commands:_Disable_Disconnect_Display_Do not display this message again_Downwards_Edit_Edit..._Enabled_Event:_File:_Finally, send this text:_Find:_Flash window when new text is received_Foreground_Foreground:_Format:_Green_Help_Hide tabs if only one world is open_Host:_Idle time:_Import_Informative messages:_Input_Interval:_Italic:_Items to export_Keep dialog open after sending_Keep last typed command in command entry box_Key:_Lines to save in scrollback buffer:_Magenta_Manual_Name of variable to make permanent:_Name:_Next_Number of commands to save in history:_Number of lines/commands to send at once:_Password:_Pattern:_Perl file to load:_Port:_Preferences_Previous_Recall_Reconnect_Repeat count:_Select a saved world:_Send_Store commands between sessions_Striked-thru:_Tab position:_Temporary (will be deleted automatically when its repeat count reaches 0)_Text to find:_Underline:_Upwards_Username:_White_World_Yellow_times in a rowaddress type not supportedaliasalias: not creating alias without patternaliasescharactercharacters have been enteredcommand not supported / protocol errorcommands(s)connection refused by destination hosthook: hook '%s' not found host unreachableline(s)macromacro: No such macromacrosnnetwork unreachablenorequest rejected or failedsec_onds eachsecondsseconds e_achtimertimer: No such timertimersyyesProject-Id-Version: KildClient-2.11.0 Report-Msgid-Bugs-To: POT-Creation-Date: 2011-05-29 12:33-0300 PO-Revision-Date: 2010-06-21 10:28-0300 Last-Translator: Niklas Grahn Language-Team: Niklas Grahn Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Swedish X-Poedit-Country: SWEDEN Plural-Forms: nplurals=2; plural=(n != 1); MÃ¥l: %d Förgrund: %d Bakgrund: %d Kursiv: %d Genomstrykning: %d Understreck: %d SSL avktiverat.%d %s borttagen.%d rader%s är redan permanent.%s: %s är redan permanent%s: %s är inte permanent%s: Argumentet mÃ¥ste vara numeriskt%s: Ingen sÃ¥dan värld%s: För fÃ¥ argument%s: För fÃ¥ argument.%s: Variabel '%s' gjord permanent. %s: Variabel '%s' gjord temporär. %s: Fel argumentstyp%s: Fel antal argument.%s: Fel referenstyp%s: Ã¥tgärden är inte angiven, skapar inte%s: antal mÃ¥ste vara numeriskt%s: intervall mÃ¥ste vara numeriskt%s: intervallet är inte angivet, skapar inte%s: ogiltig bakgrundsfärg%s: ogiltig förgrundsfärg%s: ogiltigt mÃ¥l%s: ogiltig understreckstil%s: mönstret är inte angivet, skapar inte(lämna tomt för standard baserad pÃ¥ lokal)0 rader1 rad: UtgÃ¥tt: Inte ännu aktivAnsifärgerLjuduppspelareAutomatisk inloggningTeckenkodningFärger som används av KildClientKommandoinmatningAnslutningStandardfärgerFilFörhindra massutskickTypsnittGrafiska redigerareInmatningLoggningstatusMCCP (för komprimering)TidsangivelseObservera:AlternativProxyÃ…tergÃ¥ till standardfärgerSkriptningRullningSändningsfördröjningarTidsangivelseWebbläsareFönsterkonfigurationRadbrytningEn mudklient med kraftfulla funktioner och stöd för PerlskriptningS_tarta loggning automatiskt vid anslutningA_ktivera bara automatisk komplettering efter attÃ…tgärdLägg till detta till _början av varje rad:Lägg till detta till _slutet av varje rad:AvanceratAlias tillagt.Alias modifierat.Aliasnummer %d Namn: %s Mönster: %s Substitution: %s Ignorera skiftläge: %s Eval som Perl: %s Aktiverat: %s AliasLäs alltid in denna insticksmodul vid _uppstartUtseendeÄr du säker pÃ¥ att du vill stänga denna värld?Försöker ansluta till värd %s (%s) port %s...Försöker ansluta till proxyvärd %s (%s) port %s...UpphovsmanAutomatiseringB_lÃ¥Ba_kgrundSv_art (fet)Bl_Ã¥ (fet)Fet bakgrundFet förgrundAntal mottagna byte (komprimerade):Antal mottagna byte (okomprimerade):B_yt stilK_ommandoseparator:K_onfigurera...A_nsluten tid:C_yanKan inte läsa in insticksmodul i en annan värld.Kan inte öppna hjälpfil.Ka_raktärer i denna mud:Byt stilKaraktärTecken_kodning:Markera om du vill att de färgmarkerade ANSI-färgerna även ska visas i fetstilMarkera detta om texten du skriver visas som svarta punkter i inmatningsrutan.Markera för att aktivera automatisk komplettering (baserad pÃ¥ föregÃ¥ende kommandon)Markera för att spara kommandohistoriken i en fil mellan sessionerMarkera för att behÃ¥lla det senaste kommandot i kommandoinmatningsrutan, sÃ¥ att du kan upprepa kommandon genom att bara trycka RETURMarkera för att lÃ¥ta huvudfönstret rulla till slutet varje gÃ¥ng ny utmatning mottagesMarkera för att ta bort tiduret efter att dess antal upprepningar nÃ¥tt nollMarkera för att aktivera alias; bara aktiverade alias försökes medMarkera för att aktivera makrot; bara aktiverade makrotar körsMarkera för att göra sÃ¥ att den matchade raden inte skrivs ut i huvudfönstret för utmatningMarkera för att aktivera tiduret; bara aktiverade tidur körsKlicka för att tömma kommandoinmatningsrutan.Klicka för att öppna länk; högerklicka för fler alternativ.Klicka för att lÃ¥ta alla färger Ã¥tergÃ¥ till deras inbyggda standardvärdenFärgerKommandohistoriaKommando_historiaKommando hittades inte.Kommandon som skulle bli skickade:Komprimeringsalgoritm:KomprimeringsförhÃ¥llande:Använd komprimering:Bekräfta borttagelseAnslut tillAnslut till _en annanAnslut till en annan världAnslut utan SSLAnsluten till värd %s (%s) port %s, MCCP-version %d aktiverad.Ansluten till värd %s (%s) port %s.Ansluten till värd %s port %s, via proxy %s (%s) port %s, MCCP-version %d aktiverad.Ansluten till värd %s port %s, via proxy %s (%s) port %s.Ansluten till proxyserver %s port %s, förhandlar om autentisering...Ansluten till proxyserver %s port %s, skickar begäran...Anslutnings_stil:Anslutningstid:Kopiera länkadressKunde inte ansluta till värd %s port %s: %sKunde inte ansluta till värd %s port %s: Fel #%dKunde inte skapa katalog '%s': %sKunde inte skapa sockel: %sKunde inte skapa sockel: fel #%dKunde inte importera fil '%s': %sKunde inte läsa in insticksmodul %sKunde inte läsa in värld frÃ¥n fil '%s': %sKunde inte öppna dumpfil %s: %s Kunde inte öppna fil '%s: %sKunde inte öppna fil '%s': %s Variabler sparades inte.Kunde inte öppna fil.Kunde inte öppna fil: %sKunde inte öppna loggfil.Kunde inte öppna rÃ¥ dumpfil %s: %s Kunde inte öppna värld '%s': %s Kunde inte slÃ¥ upp värd %s: %sAntalAntalCya_n (fet)KATFördrö_jTa bortBeskrivningKatalog för att lagra inställningar och sparade världar iInaktivera t_idurInaktivera _aliasInaktivera _makrotarFrÃ¥nkoppladFrÃ¥nkopplad frÃ¥n värd %s.FrÃ¥nkopplad frÃ¥n värd %s: %s.FrÃ¥nkopplad frÃ¥n värd %s: fel #%d.FrÃ¥nkopplad frÃ¥n värld %sSkärmVisa som timmar, minuter och sekunderVisa som sekunderTillÃ¥t inte att _samma kommando skickasÄndra inte Nej JaÄndra inte Ingen Enskild BÃ¥daAnslut inteTa inte bortVisa inteVill du verkligen ta bort %d %s?Vill du verkligen ta bort filen %s?Vill du verkligen göra %d variabler temporära?Vill du verkligen göra variabeln temporär?Avsluta inteDumpar alla mottagna data (möjligen komprimerade) till filenE_xporteraRedigera aliasRedigera karaktärsinformationRedigera standard_värld...Redigera makroRedigera tidurRedigera världElement '%s' är inte tillÃ¥tet inuti element '%s'Aktivera _automatisk kompletteringAktiverat(d)Skriv in ett beskrivande namn för VärldenSkriv in, om du vill, ett beskrivande namn för aliasSkriv in, om du vill, ett beskrivande namn för makrotSkriv in, om du vill, ett beskrivande namn för tiduretSkriv in lite text som ska skickas till VärldenSkriv in lite text att söka efter.Skriv in Ã¥tgärden som ska vidtas dÃ¥ händelsen inträffarSkriv in Ã¥tgärden som ska vidtas dÃ¥ tangenten trycks nedSkriv in karaktärens namn för automatisk inloggningSkriv in karaktärens lösenord för automatisk inloggningSkriv in kommandot som ska användas för att köra en webbläsare. %s kommer att ersättas av webbsideadressen.Skriv in kommandot som ska användas för att köra ett ljuduppspelarprogram. %s kommer att ersättas av sökvägen för fil.Skriv in standardparametrarna för sändning av flera rader eller kommandon:Skriv in värden att ansluta tillSkriv in porten som ska användas vid anslutningSkriv in texten att söka efterFel vid inläsning av insticksmodulFel i filen för insticksmodul: %sFel uppstod vid inställning av stavningskontrollerare: %s Eval som PerlHändelse:Utlöper:ExporteraExterna programFILMisslyckades med att läsa in fil %s: %sFilFilnamnet är inte angivet.Sök kommandoSök n_ästaSök n_ästaSök nästaSök föregÃ¥endeSök _nästaSök ett kommando innehÃ¥llandes en given söktermFingeravtryck:G_rön (fet)AllmäntHjälprubrik hittades inte.Här kan du justera inställningar för att konfigurera KildClients utseende.Här kan du justera inställningar för att konfigurera KildClients automatiserande funktioner sÃ¥ som triggers, alias, insticksmoduler etcetera.Hook number %d for event %s Namn: %s Ã…tgärd: %s Aktiverat: %s Hooks for '%s': Värd:Värdnamn:Passiv tid:Om detta markeras kommer inga flikar att visas om det bara finns en öppen världOm detta markeras kommer loggning att pÃ¥börjas automatiskt varje gÃ¥ng du ansluter till världen.ImporteraInmatningInternt fel: element '%s' slutar i START-lägeIntervallOgiltigt attribut '%s' för element '%s'Ogiltig fil för insticksmodul.Ogiltig angivelse för fönsterstorlek i konfigurationsfil. BehÃ¥ll _öppenBehÃ¥ll permanentTangentKildClient-felKildClient-informationKildClient-frÃ¥gaKildClient-varningKildClient redoSprÃ¥kkod:Vänster Höger Överkant NederkantAntal mottagna rader:Läs in insticksmodulLoggningLoggning är inaktiverad.Loggning har inte startatLoggning stoppad.Loggar till filen %s.Loggar till fil %s. MAC:Makro tillagt.Makro modifierat.Makronummer %d Namn: %s Key Code: %s Ã…tgärd: %s Aktiverat: %s MakrotarMagen_ta (fet)HuvudfönsterGör temporärDiverseFler än ett kommando markerat.Inte tillgängligtA_ntal rader:NamnDölj _aldrig den skrivna textenNejIngen %s borttagen.Inga acceptabla metoder för proxyautentisering.Ingen automatisk inloggning diku (char, pass) lp (CONNECT char pass)Inget kommando markerat.Inget sÃ¥dant %sInget sÃ¥dant %s.Inget sÃ¥dant aliasInget sÃ¥dant makroIngen sÃ¥dan insticksmodulInget sÃ¥dant tidurIngen världIngenInte anslutenInte ansluten.Hittades inteInte inställtNum Ena %-*.*s %-*.*s Num Ena %-*.*s Version %-*.*s Num Eval Ena IgC %-*.*s %-*.*s Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s FrÃ¥nkoppladEn %s borttagen._Ã…terställ räknaren för passiv tid bara när ett kommando skrivs in direktÖppna länkEller anslut d_irekt:Matar ut versionsinformation och avslutarLösen_ord:LösenordMönsterPermanenta variablerPermanenta variablerPermanent variabelInsticksmodulInsticksmodul '%s' inläst.Insticksmodul redan inläst. Försök aktivera den.Insticksmodul inaktiverad.Insticksmodul aktiverad.Insticksmodul inte inläst.Insticksmodulen är inte angivenInsticksmodulsnummer %d Namn: %s Version: %s Beskrivning: %s Upphovsman: %s Aktiverad: %s InsticksmodulerPort:InställningarTryck tangenten som ska användas för att aktivera makrot dÃ¥ markören befinner sig i textrutan.Tryck tangenten som kommer att användas för att köra makrotProtokollProxyProxy_typ:Proxyautentisering misslyckades.Proxyvärd:Proxyport:Proxybegäran misslyckades: %s.Proxytyp:Placera det valda kommandot i kommandoinmatningsrutanPlacera det valda kommandot i kommandoinmatningsrutan och stäng denna dialogrutaR_ödR_öd (fet)Ã…t_erställ till standardfärgerVill du verkligen avsluta KildClient?Vill du verkligen stänga?Ã…ter_kalla & stängÃ…teranslutSlÃ¥r upp värd %s...SlÃ¥r upp proxyvärd %s...Ã…tergÃ¥ till _standardSSL stöds inte i denna versionSSL-protokoll använt:S_kicka och stängS_tavninskontrollera skriven textS_tatistik...SkriptningRulla vid _utmatningSki_cka detta kommando:Sökväg:Välj om du vill att anslutningstiden inte ska visasVälj om du vill att den passiva tiden inte ska visasVälj om du vill att anslutningstiden ska visas i timmar, minuter och sekunderVälj om du vill att anslutningstiden ska visas i sekunderVälj om du vill att den passiva tiden ska visas i timmar, minuter och sekunderVälj om du vill att den passiva tiden ska visas i sekunderMarkera loggfilMarkera typsnittet som ska användas i huvud_fönstret:Markera typsnittet som ska användas i _statusmätaren:Markera typsnittet som ska användas i kommando_inmatningsrutan:Markera typsnittet som ska användas i kommandoinmatningsrutanMarkera typsnittet som ska användas i huvudskärmen för utmatningMarkera typsnittet som ska användas i statusmätarenSkicka det(de) valda kommandot(na) till muden Skicka det(de) valda kommandot(na) till muden och stäng fönstretSkicka _först denna text:SkickarSkickar anslutningsbegäran...Skickar referenser för proxyautentisering...Server_adress:Server_port:Ange hur mÃ¥nga kommandon som ska skickas pÃ¥ en gÃ¥ngAnge hur mÃ¥nga rader som ska skickas pÃ¥ en gÃ¥ngAnge hur mÃ¥nga gÃ¥nger detta tidur bör köras innan det inaktiveras eller tas bortAnge kommandot som ska användas för att starta en webbläsareAnge kommandot som ska användas för att spela upp ljudfiler.Ange intervallet, i sekunder, mellan tidursaktiveringarAnge det maximala antalet samma rader som kan skickas i radAnge antalet tecken som mÃ¥ste skrivas in för att kommandokomplettering ska startasAnge antalet kommandon som ska sparas och som senare kan Ã¥terkallasAnge antalet utmatningsrader som kan ses genom att rulla fönstretStöd för stavningskontroll är inte inkluderat i denna version.Sta_rtaStatistikStatusmätareStilFlyttade framgÃ¥ngsrikt %s.TTL har utgÃ¥ttHjälpen visas i huvudfönstret.Intervallet mÃ¥ste vara positivt.Hela radenSkicka sedan _innehÃ¥llet i denna fil:Det finns %d öppna världar. Vill du verkligen avsluta?Det finns en öppen värld. Vill du verkligen avsluta?Detta är vad som skulle skrivas ut i huvudfönstret:Detta objekt tillhör en insticksmodul. Ändringar gjorda här kommer inte att sparas i insticksmodulen.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.Denna version av KildClient har inte SSL-stöd.Tidur tillaggt.Tidur modifierat.Tidursnummer %d Namn: %s Intervall: %d Antal upprepningar: %d Ã…tgärd: %s Aktiverat: %s Temporärt: %s TidurTrigger number %d Namn: %s Mönster: %s Ã…tgärd: %s Aktiverat: %s Ignorera skiftläge: %s Gag output: %s Gag in log: %s Fortsätt verkställa: %s Rewriter: %s Byt stil: %s Kunde inte ansluta till värd %s: %s.Kunde inte ansluta till värd %s: Fel #%d.Kunde inte ansluta till proxyvärd %s: %s.Kunde inte ansluta till proxyvärd %s: Fel #%d.OkändOkänd katalog '%s' i konfigurationsfil. Namnlös världOkänt svar frÃ¥n proxyvärd.Använd $windows->getsize() istället.Använd $windows->minimize() istället.Använd $world->path() istället.Använd _SSLAnvänd _fet typsnitt för markerade färger (istället för bara färgmarkering)Använd allmänna inställningar Ingen proxy SOCKS4 SOCKS5Använd sök-knappen för att hitta det första resultatet.Giltigt sedan:VariablerVersionVersion %s av denna insticksmodul är redan inläst.Besök http://kildclient.sf.netV_it (fet)Varning: funktionen getwindowsize() avrÃ¥des och kommer att tas bort.Varning: funktionen minimize() avrÃ¥des och kommer att tas bort.Varning: funktionen path() avrÃ¥des och kommer att tas bort.Namn pÃ¥ värld:Värld sparad.Skulle denna rad inkluderas i loggfilen?Skrivet av Eduardo M Kalinowski (eduardo@kalinowski.com.br) Gu_l (fet)JaDu kan lämna detta fält tomt, och ett filnamn kommer att genereras automatiskt. Redigera bara detta fält om du vet vad du gör.Du mÃ¥ste ange ett namn pÃ¥ variabeln.Du mÃ¥ste ange Ã¥tgärden.Du mÃ¥ste ange tangenten.Du mÃ¥ste ange namnet.Du mÃ¥ste ange lösenordet.Du mÃ¥ste ange mönstret.Du försöker ansluta till en värld som använder SSL, men denna version av KildClient har kompilerats utan SSL-stöd. Försök ansluta utan SSL?[VÄRLD...]_Om_Ã…tgärd:_Tillämpa pÃ¥:_Bakgrund:_Svart_Töm_Fördröj_Fördröjning mellan varje grupp av rader/kommandon:_Inaktivera_FrÃ¥nkoppla_Skärm_Visa inte detta meddelande igen_NedÃ¥t_Redigera_Redigera..._Aktiverat(d)_Händelse:_Fil:Skicka _till sist denna text:_Sök:_LÃ¥t fönstret blinka när ny text mottages_Förgrund_Förgrund:_Format:_Grön_Hjälp_Dölj flikar om bara en värld är öppen_Värd:_Tid passiv:_Importera_Informativa meddelanden:_Inmatning_Intervall:_Kursiv:_Objekt att exportera_BehÃ¥ll dialogrutan öppen efter sändning_BehÃ¥ll senast skrivna kommando i kommandoinmatningsrutan_Tangent:_Rader att spara i rullningsbuffert:_Magenta_Handbok_Variabelns namn som ska göras permanent:_Namn:_Nästa_Antal kommandon att spara i historiken:_Antal rader/kommandon som ska skickas pÃ¥ en gÃ¥ng:_Lösenord:_Mönster:_Perlfil att läsa in:_Port:_Inställningar_FöregÃ¥ende_Ã…terkalla_Ã…teranslut_Antal upprepningar:_Markera en sparad värld:_Skicka_Lagra kommandon mellan sessioner_Genomstrykt:_Flikposition_Temporärt (kommer att tas bort automatiskt när dess antal upprepningar nÃ¥r noll)_Text att söka efter:_Understreck:_UppÃ¥t_Användarnamn:_Vit_Värld_Gul_gÃ¥nger i radadresstyp stöds intealiasalias: skapar inte alias utan mönsteraliaskaraktärtecken har skrivits inkommando stöds inte / protokollfelkommando(n)anslutning vägrades av mÃ¥lvärdhook: hook '%s' hittades inte värd oÃ¥tkomlig:a/e radmakromakro: Inget sÃ¥dant makromakrotarnnätverk oÃ¥tkomligtnejbegäran nekades eller misslyckadessek_under varsekund(er)sekunder v_artidurtidur: Inget sÃ¥dant tidurtidurjjakildclient-2.11.1/po/Makefile.in.in0000644000175000017500000002020111570463465013735 00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # # This file file be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # Please note that the actual code is *not* freely available. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ libdir = @libdir@ localedir = $(libdir)/locale gnulocaledir = $(datadir)/locale gettextsrcdir = $(datadir)/glib-2.0/gettext/po subdir = po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = $(top_srcdir)/@MKINSTALLDIRS@ CC = @CC@ GENCAT = @GENCAT@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ XGETTEXT = @XGETTEXT@ MSGMERGE = msgmerge DEFS = @DEFS@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ INCLUDES = -I.. -I$(top_srcdir)/intl COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) SOURCES = POFILES = @POFILES@ GMOFILES = @GMOFILES@ DISTFILES = LINGUAS ChangeLog Makefile.in.in POTFILES.in $(GETTEXT_PACKAGE).pot \ $(POFILES) $(GMOFILES) $(SOURCES) POTFILES = \ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ INSTOBJEXT = @INSTOBJEXT@ .SUFFIXES: .SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat .c.o: $(COMPILE) $< .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $< $(srcdir)/$(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(MSGFMT) -o $@ $< .po.gmo: file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) $(MSGFMT_OPTS) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && $(GENCAT) $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(srcdir)/$(GETTEXT_PACKAGE).pot: $(POTFILES) $(XGETTEXT) --default-domain=$(GETTEXT_PACKAGE) --directory=$(top_srcdir) \ --add-comments --keyword=_ --keyword=N_ \ --keyword=C_:1c,2 \ --keyword=NC_:1c,2 \ --keyword=g_dngettext:2,3 \ --flag=N_:1:pass-c-format \ --flag=C_:2:pass-c-format \ --flag=NC_:2:pass-c-format \ --flag=g_dngettext:2:pass-c-format \ --flag=g_strdup_printf:1:c-format \ --flag=g_string_printf:2:c-format \ --flag=g_string_append_printf:2:c-format \ --flag=g_error_new:3:c-format \ --flag=g_set_error:4:c-format \ --flag=g_markup_printf_escaped:1:c-format \ --flag=g_log:3:c-format \ --flag=g_print:1:c-format \ --flag=g_printerr:1:c-format \ --flag=g_printf:1:c-format \ --flag=g_fprintf:2:c-format \ --flag=g_sprintf:2:c-format \ --flag=g_snprintf:3:c-format \ --flag=g_scanner_error:2:c-format \ --flag=g_scanner_warn:2:c-format \ --files-from=$(srcdir)/POTFILES.in \ && test ! -f $(GETTEXT_PACKAGE).po \ || ( rm -f $(srcdir)/$(GETTEXT_PACKAGE).pot \ && mv $(GETTEXT_PACKAGE).po $(srcdir)/$(GETTEXT_PACKAGE).pot ) install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all if test -r "$(MKINSTALLDIRS)"; then \ $(MKINSTALLDIRS) $(DESTDIR)$(datadir); \ else \ $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(datadir); \ fi @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ case "$$cat" in \ *.gmo) destdir=$(gnulocaledir);; \ *) destdir=$(localedir);; \ esac; \ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ dir=$(DESTDIR)$$destdir/$$lang/LC_MESSAGES; \ if test -r "$(MKINSTALLDIRS)"; then \ $(MKINSTALLDIRS) $$dir; \ else \ $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \ fi; \ if test -r $$cat; then \ $(INSTALL_DATA) $$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ echo "installing $$cat as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \ else \ $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ echo "installing $(srcdir)/$$cat as" \ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \ fi; \ if test -r $$cat.m; then \ $(INSTALL_DATA) $$cat.m $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ echo "installing $$cat.m as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \ else \ if test -r $(srcdir)/$$cat.m ; then \ $(INSTALL_DATA) $(srcdir)/$$cat.m \ $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ echo "installing $(srcdir)/$$cat as" \ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \ else \ true; \ fi; \ fi; \ done if test "$(PACKAGE)" = "glib"; then \ if test -r "$(MKINSTALLDIRS)"; then \ $(MKINSTALLDIRS) $(DESTDIR)$(gettextsrcdir); \ else \ $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(gettextsrcdir); \ fi; \ $(INSTALL_DATA) $(srcdir)/Makefile.in.in \ $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \ else \ : ; \ fi # Define this as empty until I found a useful application. installcheck: uninstall: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ done if test "$(PACKAGE)" = "glib"; then \ rm -f $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \ fi check: all dvi info tags TAGS ID: mostlyclean: rm -f core core.* *.pox $(GETTEXT_PACKAGE).po *.old.po cat-id-tbl.tmp rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f $(GMOFILES) distdir = ../$(GETTEXT_PACKAGE)-$(VERSION)/$(subdir) dist distdir: update-po $(DISTFILES) dists="$(DISTFILES)"; \ for file in $$dists; do \ ln $(srcdir)/$$file $(distdir) 2> /dev/null \ || cp -p $(srcdir)/$$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ cd $(srcdir); \ catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ echo "$$lang:"; \ if $(MSGMERGE) $$lang.po $(GETTEXT_PACKAGE).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$cat failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done # POTFILES is created from POTFILES.in by stripping comments, empty lines # and Intltool tags (enclosed in square brackets), and appending a full # relative path to them POTFILES: POTFILES.in ( if test 'x$(srcdir)' != 'x.'; then \ posrcprefix='$(top_srcdir)/'; \ else \ posrcprefix="../"; \ fi; \ rm -f $@-t $@ \ && (sed -e '/^#/d' \ -e "s/^\[.*\] +//" \ -e '/^[ ]*$$/d' \ -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \ | sed -e '$$s/\\$$//') > $@-t \ && chmod a-w $@-t \ && mv $@-t $@ ) Makefile: Makefile.in.in ../config.status POTFILES cd .. \ && $(SHELL) ./config.status $(subdir)/$@.in # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: kildclient-2.11.1/configure.in0000644000175000017500000000742211570177315013164 00000000000000dnl $Id: configure.in 1171 2011-05-28 13:55:24Z ekalin $ AC_INIT([kildclient], [2.11.1]) AC_CONFIG_SRCDIR(src/main.c) AC_CANONICAL_HOST AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION) AC_CONFIG_HEADER(kcconfig.h:config.h.in) AM_MAINTAINER_MODE AC_PROG_CC AC_CHECK_FUNCS([localtime_r]) dnl dnl Internationalization macros dnl GETTEXT_PACKAGE=kildclient AC_SUBST(GETTEXT_PACKAGE) ALL_LINGUAS="pt_BR eo sv de" AM_GLIB_GNU_GETTEXT AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", "definition of GETTEXT_PACKAGE") dnl dnl Gtk 2.0 checks dnl case $host in *-*-mingw32*) REQUIRES_GMODULE="" ;; *) REQUIRES_GMODULE="gmodule-export-2.0 >= 2.14.0" ;; esac PKG_CHECK_MODULES(GTK, glib-2.0 >= 2.14.0 $REQUIRES_GMODULE gthread-2.0 >= 2.10.0 gtk+-2.0 >= 2.18.0) AC_SUBST(GTK_CFLAGS) AC_SUBST(GTK_LIBS) dnl dnl Check for perl dnl AC_CHECK_PROG(PERL, perl, perl) AC_PROG_PERL_MODULES([ExtUtils::Embed], [dnl KILDCLIENT_PERL_CFLAGS=`$PERL getperlflags.pl ccopts` KILDCLIENT_PERL_LIBS=`$PERL getperlflags.pl ldopts` AC_SUBST(KILDCLIENT_PERL_CFLAGS) AC_SUBST(KILDCLIENT_PERL_LIBS)], AC_MSG_ERROR(The perl ExtUtils::Embed module could not be found)) LIBS="$KILDCLIENT_PERL_LIBS $LIBS" case $host in *-*-mingw32*) # Do not check for -lperl, this check fails. ;; *) AC_CHECK_LIB([perl], [perl_construct], [], [dnl AC_MSG_ERROR(You do no have the perl library (-lperl) installed)]) ;; esac dnl dnl See if gtkspell is available dnl AC_ARG_WITH([gtkspell], AS_HELP_STRING([--with-gtkspell], [use gtkspell for spell cheking (default is YES)]), [use_gtkspell=$withval], [use_gtkspell="yes"]) if test "$use_gtkspell" != "no"; then PKG_CHECK_MODULES(GTKSPELL, gtkspell-2.0, [], [dnl GTKSPELL_CFLAGS="" GTKSPELL_LIBS="" AC_MSG_RESULT([not found, disabled])]) else GTKSPELL_CFLAGS="" GTKSPELL_LIBS="" fi AC_SUBST(GTKSPELL_CFLAGS) AC_SUBST(GTKSPELL_LIBS) if test "$GTKSPELL_CFLAGS" != "" ; then AC_DEFINE(HAVE_GTKSPELL, [1], [Do we have the gtkspell library?]) fi dnl dnl See if gnutls is available dnl AC_ARG_WITH([libgnutls], AS_HELP_STRING([--with-libgnutls], [use libgnutls to allow connecting via TLS/SSL (default is YES)]), [use_libgnutls=$withval], [use_libgnutls="yes"]) if test "$use_libgnutls" != "no"; then PKG_CHECK_MODULES(LIBGNUTLS, gnutls, [], [dnl LIBGNUTLS_CFLAGS="" LIBGNUTLS_LIBS="" AC_MSG_RESULT([not found, disabled])]) else LIBGNUTLS_CFLAGS="" LIBGNUTLS_LIBS="" fi AC_SUBST(LIBGNUTLS_CFLAGS) AC_SUBST(LIBGNUTLS_LIBS) if test "$LIBGNUTLS_CFLAGS" != "" ; then AC_DEFINE(HAVE_LIBGNUTLS, [1], [Do we have the gnutls library?]) fi dnl dnl See if documentation is to be generated dnl build_docs=yes AC_ARG_WITH([docs], AS_HELP_STRING([--with-docs], [generate the docbook documentation (default is YES)]), [build_docs=$withval]) AM_CONDITIONAL(BUILD_DOCS, test x$build_docs = xyes) dnl dnl Flags for win32 compilation dnl case $host in *-*-mingw32*) LIBS="$LIBS -mwindows -lregex" CFLAGS="$CFLAGS -Wno-comments -mms-bitfields" # Resources hack AC_CHECK_TOOL(WINDRES, windres) RES_COMPILE='$(WINDRES) -i $< -o $@ $(RESFLAGS)' ;; *) RES_COMPILE='$(CC) -c -o $@ -x c /dev/null' ;; esac AC_SUBST(RES_INCDIR) AC_SUBST(RES_COMPILE) dnl dnl Extra information for autoheader dnl AH_TOP([ #if defined(__CYGWIN32__) && !defined(__WIN32__) # define __WIN32__ #endif ]) dnl dnl Finalization dnl AC_CONFIG_FILES([Makefile po/Makefile.in src/Makefile share/Makefile share/plugins/Makefile doc/Makefile doc/C/Makefile doc/C/images/Makefile]) AC_OUTPUT kildclient-2.11.1/mkinstalldirs0000744000175000017500000000370411405233125013443 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" 1>&2 exit 0 ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac case $dirmode in '') if mkdir -p -- . 2>/dev/null; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" fi ;; *) if mkdir -m "$dirmode" -p -- . 2>/dev/null; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # End: # mkinstalldirs ends here kildclient-2.11.1/kildclient.spec0000644000175000017500000002010011570200756013631 00000000000000Name: kildclient Version: 2.11.1 Release: 1%{dist} Summary: A powerful MUD client with a built-in Perl interpreter Summary(pt_BR): Um poderoso cliente de MUD com um interpretador Perl embutido License: GPLv2+ Group: Amusements/Games Icon: kildclient.xpm URL: http://kildclient.sourceforge.net Source: http://download.sourceforge.net/%{name}/%{name}-%{version}.tar.gz BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildRequires: glib2-devel >= 2.14.0 BuildRequires: gtk2-devel >= 2.18.0 BuildRequires: gtkspell-devel >= 2.0.0 BuildRequires: gnutls-devel >= 2.2.0 BuildRequires: perl-devel >= 5.8.3 BuildRequires: zlib-devel BuildRequires: gettext >= 0.14.5 BuildRequires: desktop-file-utils %description KildClient is a MUD Client written with the GTK+ windowing toolkit. It supports many common features of other clients, such as triggers, gags, aliases, macros, timers, and much more. But its main feature is the built-in Perl interpreter. You can at any moment execute Perl statements and functions to do things much more powerful than simply sending text the mud. Perl statements can also be run, for example, as the action of a trigger, allowing you to do complex things. Some built-in functions of KildClient allow interaction with the world, such as sending commands to it. KildClient's ANSI support is extensive: it supports not only the common 16 colors, but also support underlined text (singly and doubly), text in italics, text striked through, reverse video and "hidden" text. It also supports vt100's line-drawing characters, and xterm's escape sequences for a 256-color mode. All these features make KildClient one of the clients with the most features for displaying the mud output. KildClient supports the MCCP (Mud Client Compression Protocol) protocol, versions 1 and 2, to reduce the necessary bandwidth. KildClient allows connection through SOCKS4/5 proxy servers. %description -l pt_BR KildClient é um cliente de MUD escrito com a biblioteca gráfica GTK. Ele suporta muitos recursos comuns aos outros clientes, como triggers, gags, aliases, macros, temporizadores e muito mais. Mas seu principal recurso é um interpretador Perl embutido. A qualquer momento, você pode executar declarações Perl e funções para fazer coisas muito mais poderosas que simplesmente enviar texto para o MUD. Declarações Perl podem também ser executadas, por exemplo, como ação de um trigger, lhe permitindo fazer coisas mais complexas. Algumas funções nativas do KildClient permitem interação com o mundo, como enviar comandos para ele. O suporte ANSI do KildClient é extenso: ele suporta não apenas as 16 cores comuns, mas também suporta texto sublinhado (simples e duplo), texto em itálico, texto tachado, texto em vídeo reverso e texto "escondido". Ele suporta os caracteres para desenho de linhas do vt100, e as seqüências do xterm para um mode com 256 cores. Todos esses recursos fazem o KildClient um dos cliente com mais recursos para mostrar o texto do mud. O KildClient suporta o protocolo MCCP (Mud Client Compression Protocol, Protocolo de Compressão para Clientes de MUD), versões 1 e 2, para reduzir a banda necessária. O KildClient suporta conexão através de servidores proxy SOCKS4/5. %prep %setup -q %build %configure make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install %find_lang %{name} desktop-file-install --vendor "fedora" --delete-original \ --dir $RPM_BUILD_ROOT%{_datadir}/applications \ $RPM_BUILD_ROOT%{_datadir}/applications/kildclient.desktop %clean rm -rf $RPM_BUILD_ROOT %files -f %{name}.lang %defattr(-, root, root, -) %{_bindir}/kildclient %doc %{_datadir}/doc/%{name} %{_mandir}/man1/kildclient.* %{_datadir}/%{name} %{_datadir}/pixmaps/kildclient.png %{_datadir}/pixmaps/kildclient.xpm %{_datadir}/applications/fedora-kildclient.desktop %changelog * Sat May 28 2011 Eduardo M Kalinowski - 2.11.1-1 - New version: 2.11.1. - Fixed minimum required version of gnutls. * Sun Feb 13 2011 Eduardo M Kalinowski - 2.11.0-1 - New version: 2.11.0. * Sun Jun 13 2010 Eduardo M Kalinowski - 2.10.0-1 - Require glib >= 2.14.0, gtk >= 2.18.0, but does not require libglade anymore. - Added zlib-devel as build requirement. -lz is also specified when linking. * Sat May 23 2009 Eduardo M Kalinowski - 2.9.0-1 - New version: 2.9.0. * Tue Jan 27 2009 Eduardo M Kalinowski - 2.8.1-1 - New version: 2.8.1. * Sat Jan 03 2009 Eduardo M Kalinowski - 2.8.0-1 - New version: 2.8.0. - Small changes in description to remove an occurrence of 'the the' and advertise proxy support. * Tue May 13 2008 Eduardo M Kalinowski - 2.7.0-1 - New version: 2.7.0. * Tue Jan 8 2008 Eduardo M Kalinowski - 2.6.0-5 - Removed manual Requires. - Removed unnecessary %%doc of manpage in %%files. - Fixed %%files so that %%{_datadir}/%%{name} is owned by the package. - Corrected call to desktop-file-install. * Fri Dec 28 2007 Eduardo M Kalinowski - 2.6.0-4 - Removed Vendor & Packager. - Added dist tag. - Added full URL in Source. - Changed the BuildRoot to use mktemp. - Support for SMP build flags. - Removed the use of %%makeinstall; standard make is called. - %%find_lang is now used. - Added call to desktop-file-install. * Thu Dec 20 2007 Eduardo M Kalinowski - 2.6.0-3aei - Included an icon. - Changed group to Amusements/Games. - Removed cleaning in the prep stage, and added cleaning in the install stage. - Specified the language for the .mo files. - Minor tweaks in descriptive fields. * Wed Dec 12 2007 Eduardo M Kalinowski - 2.6.0-2aei - Changed gtk+2-devel to gtk2-devel and gtk+2 to gtk2. - Added some files that were missing. * Wed Nov 28 2007 Eduardo M Kalinowski - New version: 2.6.0. * Mon May 21 2007 Eduardo M Kalinowski - New version: 2.5.1. * Sat Aug 12 2006 Eduardo M Kalinowski - New version: 2.5.0. - Requiring GTK+ version 2.8.X now. * Sun Mar 26 2006 Eduardo M Kalinowski - New version: 2.4.1. * Fri Feb 17 2006 Eduardo M Kalinowski - New version: 2.4.0. - Added gtkspell requirement. * Wed Dec 21 2005 Eduardo M Kalinowski - New version: 2.3.0. - Added Requires and BuildRequires for libgnutls. - Updated required version of gtk+ and libglade. * Sat Oct 01 2005 Eduardo M Kalinowski - Updated version to 2.2.2. - Removed intltool dependency. * Tue Sep 20 2005 Eduardo M Kalinowski - Updated version to 2.2.1. * Mon Sep 19 2005 Eduardo M Kalinowski - Updated version to 2.2.0. - Changed the description to describe some new features. * Thu Aug 25 2005 Eduardo M Kalinowski - Updated version to 2.1.0. * Wed Jul 27 2005 Eduardo M Kalinowski - Updated version to 2.0.0. - Removed dependency of libvte, which is not used anymore. * Sun Jul 03 2005 Eduardo M Kalinowski - Updated version to 1.3.2. * Tue May 31 2005 Eduardo M Kalinowski - Updated version to 1.3.1. - Added a requirement for glib >= 2.6.0. * Fri May 27 2005 Eduardo M Kalinowski - Updated for version 1.3.0 of the program. - Added perl-gettext as a requirement. * Wed Apr 20 2005 Eduardo M Kalinowski - Updated for version 1.2.0 of the program. - Mentioned MCCP in the description. - Added intltool to BuildRequires * Fri Mar 25 2005 Eduardo M Kalinowski - Updated for version 1.1.2 of the program. * Fri Mar 11 2005 Eduardo M Kalinowski - Updated for version 1.1.1 of the program. * Mon Feb 28 2005 Eduardo M Kalinowski - Included man file in package * Sun Feb 20 2005 Alexandre Erwin Ittner - New version: 1.1.0 * Thu Jan 13 2005 Alexandre Erwin Ittner - RPM for Conectiva 10 (but should work on any distro) kildclient-2.11.1/missing0000755000175000017500000002623311324777651012261 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009 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 tar try tar, gnutar, gtar, then tar without non-portable flags 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. ;; tar*) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) 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 ;; tar*) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) 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: kildclient-2.11.1/NEWS0000644000175000017500000010154511570176406011353 00000000000000Changes in version 2.11.1 ------------------------- - Bug fixed: the SSL handshake locked the interface. And KildClient would wait forever if it never completed, requiring a forced close. - Fixed bug with some 256-color ansi sequences. - Fixed a bug that caused the program to freeze when deleting a trigger or alias of a Word edited from the World Selector. - If a plugin fails to load, any objects created by that plugin are removed. - Fixed bug that prevented copying text from the scroll window. - Fixed crash that happened if you had a rewriter trigger without an action. (Thanks to dmzkrsk.) Changes in version 2.11.0 ------------------------- - Added an option to disable up/down for navigating the command history (Alt+up/down will remain working.) This allows the use of input methods that use the arrow keys as part of the input process. - Included the 'channels' plugin by Jack Mudge. It allows for capturing all lines of text matching a regexp to a separate window. - The path() function has been changed, it should now be called as $world->path(). It now respects the delay and grouping settings in the Preferences dialog instead of sending all commands at once. - The Windows version now supports SSL.xb - Bug fixed: the clear button in KCWin windows is now working. - Bug fixed: under some systems (PC-BSD, for example) connections do not always fail anymore. Changes in version 2.10.0 ------------------------- - Added German translation, courtesy of René Küttner. - It is now possible to use the matched substrings captured with () groups in triggers even if the action is not a Perl command: use $1 to represent the first matched substring, $2 for the second, and so on. - It is now possible to split the screen so that you can see simultaneously the newly received text and some other part of the scrollback buffer. - New wrapping options added: it is possible to indent wrapped lines, and lines can be wrapped after a specific number of characters, if the window is wider. - It is now possible to disable the tooltips with the time when a line was received. - You can now pass a host name in the command line to connect to a World. If you need to specify a port other than 4000, use hostname:port. Also, telnet:// URLs are recognized. - Added an option to enable TCP Keep Alive. (Based on patch by Tasci Synx.) - Fixed bug that prevented the World Editor to be opened again if it was closed by pressing ESC or using the X button of the title bar. - Fixed bug: when the World Editor is cancelled, changes you made are reverted if it's opened again. - Fixed a bug that caused the program to freeze when editing or creating a new World from the World Selector. - Fixed bug: worlds with only one auto-logon character now also have an option to disable auto-logon in the World Selector. - Fixed bug that caused on the OnCloseConnected hook to be executed when it shouldn't (before a connection is really established, or when the server closes the connection). - Fixed a bug that reported an error when loading plugins even when there was no error. Changes in version 2.9.0 ------------------------ - The Command History dialog now displays the most recent commands in the top. - If you type a command that you had typed before, now only one copy is stored in the command history. - It is now possible to customize what's displayed in the tab for each World, including for example the name of the character logged in. - When you start logging, you can now include lines already present in the scrollback buffer. - Added the $world->interpret() function, that takes its argument and interprets it as if it were typed in the input box. - Added the $world->expandalias() function to expand aliases in a given string. - When defining the file name for logging, it is possible to use the escapes %Kw and %Kc to represent the world's name and auto-logon character name, respectively. - Added the $world->sendlines() function to easily send several lines with a delay between each line (or group of lines). - Added the $world->mlsend() function to emulate the Multi-line send feature (and all its possibilities) from within a perl script. - The $world->sendfile() function now returns true for success (the file was sent) and false if the file could not be opened. - Added the $world->getline() function to retrieve a line from the scrollback buffer. - In the "Edit Default World" dialog, some settings related to logging that did not make sense in that context are not displayed anymore. - Bug fixed: using the '>' character in a trigger or alias does not cause errors anymore. - Bug fixed: warnings about editing a plugin's object (triggers, aliases, etc.) now only show when the object edited really is from a plugin. - Bug fixed: if you change a world's name, the tab now changes to the new name immediately. - Bug fixed: you can define macros containing keys such as the arrows and Page Up/Page Down. Care is recommended when doing that, though, because it can conflict with built-in commands for moving the cursor, for example. Changes in version 2.8.1 ------------------------ - Added Swedish translation, thanks to Niklas Grahn. - Backspace characters received from the MUD work, erasing the previous char. Changes in version 2.8.0 ------------------------ - SOCKS proxy support has been added. - The tab bar can be hidden if there is only open open tab. - If all the text you type is displayed as black dots (like it was a password), you can now set an option to prevent that and see the text in the input box. (This is necessary with a few servers that do the command echoing themselves.) - In the multi-line input box, Shift+Enter and Ctrl+Enter now allow you to enter a new line of text, instead of sending the contents of the box. - The $world->deltrigger() function (and the other ones for aliases, macros, etc.) now return the number of objects deleted. - Bug fixed: If you edit the list of auto-logon characters (reordering them or deleting entries), you could reconnect with the wrong character or get a crash. Now you always reconnect with the same character, even if the order is changed; if that auto-logon character is deleted, then auto-logon is disabled. Changes in version 2.7.0 ------------------------ - Added a $window variable pointing to the main window. The minimize() function is now $window->minimize() and getwindowsize() is now $window->getsize(). Because of this change, some of your scripts may need to be rewritten. - The name of the currently open world is displayed in the title bar. - Added the $window->settitle() function to set the title of the window. - Added the $window->seturgencyhint() function to force a request of attention to that window. - Fixed bug that caused a crash on startup in Ubuntu 8.04 (and possibly other systems). - Fixed bug that prevented a plugin from using its permanent variables during initialization of the plugin. - OnGetFocus and OnLoseFocus triggers are now run after the setting of the window title and urgency hint, so the triggers can override the default behavior. - Added functions to get a trigger/alias/macro/timer/hook's number based on its name. - The URL in the about box can now be clicked to go to KildClient's web site. - Added the $world->getlogfile() function to retrieve the name of the file to which the output is logged. Changes in version 2.6.0 ------------------------ - There is now a close button in the tabs for quickly closing the world. - It is now possible to reorder the Worlds by dragging the tabs to the new desired position. - When trying to connect to a Mud server, KildClient does not freeze anymore (it tries connecting asynchronously). (Includes patch by Zephaniah E. Hull.) - It is now easier to set up session logging, as logging can be configured and started/stopped from the World Editor. It is even possible to configure logging to automatically start from there. - Added the option not to store the command history between sections. (Patch by Zephaniah E. Hull.) - The keypad keys can now be used in the input box and in dialogs. (Patch by Zephaniah E. Hull.) - You can now alternate worlds with Ctrl-Tab and Ctrl-Shift-Tab. - Some bugs in the Windows version regarding network handling were fixed. - Added the $world->ispermanent function to check if a variable is permanent. - Added the $world->getcharacter function to return the name of the character used to auto log in to the mud. - Changed the delimiter for pattern matching in triggers and alias substitution (from <> to ASCII character 5, ^E). This should allow '>' (used in ->, for example) to be used in an easier way in aliases. - Bug fixed: When you open two worls in the Windows version and close one, or when you try to connect to another one in the same session, the program does not crash anymore. - Fixed a bug that sometime caused KildClient under Windows to crash when switching to another world. - Bug fixed: If a timer has an interval or repeat count that is a large number, the output of $world->listtimer is now properly aligned. - Bug fixed: When reading XML files (Worlds or triggers/etc to import), KildClient recognizes the files properly even if they do not end in a newline. Changes in version 2.5.1 ------------------------ - The last openened world is not selected and displayed on-screen when the World Selector dialog is shown. - The default strings for calling a browser and playing a sound now use quotes around the argument. - The tooltip with information about the line is not shown anymore at the same time as the "Disconnected" message box, so it does not cover the buttons in that dialog. - Bug fixed: If the kildclient.cfg file does not exist (which happens usually in the first run), KildClient does not crash anymore. - Bug fixed: In single-line input mode, pressing Shift+Enter or CTRL+Enter now sends the line to the mud. - Bug fixed: KildClient does not crash anymore if you try to connect to a world with invalid XML. Changes in version 2.5.0 ------------------------ - You can now change the color and style of a line that matched a trigger (also known as highlighting). - When new text is received, the window now flashes to draw your attention to it (if your window manager supports the "Urgent" hint). This feature can be disabled, however. - You can now specify another directory to store configuration files and saved Worlds, instead of the default ~/.kildclient (Linux) or %APPDATA%\kildclient (Windows), with the -c command-line option. - You can now manipulate, from a given World, another World. You get a pointer to it with the getworld() function, and then call functions on that pointer. - Added a new hook: OnCloseDisconnected. This hook is executed when you forcedly close a world while it is disconnected (via the menu World->Close, $world->close() or by quitting the program). So you can put "quit" in there to always exit the mud nicely. - Added the SILENT attribute to worlds: if $world->{SILENT} is set to a true value, some messages (such as "Trigger added", "Alias enabled", etc.) are not printed. - Fixed bug that closed the client if the Help button was pressed in the World Editor for a plugin that does not define a help function. - Bug fixed: now you can only open the Test Triggers dialog if you are connected to the world. - Fixed a bug that cause NAWS information to be sent with each command if the server supports it. Changes in version 2.4.1 ------------------------ - Fixed bug that caused crashes on startup with messages like this: *** glibc detected *** free(): invalid pointer: 0x081903c0 *** Aborted - Bug fixed: now if two triggers match the same line, each capturing different parts of the line with () in the regular expression, the commands of each trigger will be run with the correct captured parts in the $_[X] variables. Changes in version 2.4.0 ------------------------ - When using the multi-line input box, the up and down arrows behave now more naturally: they either retrieve the previous/next command or move the cursor. They move the cursor if you have already moved the cursor in order to edit the line, and move through commands otherwise. - You can now type the start of a command and use Alt+Shift+Up and down arrows to recall previously entered commands. - The keyboard shortcuts for moving through worlds were wrong: now they behave correctly: ctrl+page_down for next world and ctrl+page_up for previous world. - Added spell checking support to check what you type in real-time. - Pressing ENTER when in the "host" or "port" fields of the World Selector now works. - Pressing ENTER when in the search box activates Find Next, and pressing ESC closes the search bar. - If you try to exit the program when there are open worlds, a confirmation dialog is now displayed. - When using the Multi-Line Send feature, you can now choose not to close the dialog after sending. - A new function, $world->sendfile() has been added, that allows the contents of a file to be sent to the mud. - Two new functions, $world->getconntime() and $world->getidletime() retrieve the time connected and idle time, respectively. - Now by default MCCP is only activated if the request from the server to enable it comes at most 1 minute after the connection. This is to prevent other users in a MUD from trying to crash your client by sending the special sequence that turns on compression (however, well written MUD servers will not allow players to send such sequences). You can, however, cause MCCP to work if started anytime, or disable it altogether. - When Debug Matches is on, the name of triggers and aliases is now displayed when there is a match. - Fixed a bug that caused a crash (or at least a warning) when the Preferences Dialog was opened a second time. - Fixed a bug that prevented changing the input bar size when editing a World from the World Editor. - Fixed a bug that didn't show the status of the input bar correctly when editing a World. - Fixed a bug that caused a crash when very long lines were received when compression is active. - Fixed a bug that caused a crash when the Manual menu was selected for the second time. - Bug fixed: if compression is disabled during the MUD session, the status bar and Statistics dialog now reflect that fact. - Bug fixed: weird error messages are not shown anymore when a connection is closed cleanly. Changes in version 2.3.0 ------------------------ - Added a feature to search the buffer for a given string. - The input bar can now have more than one line, to ease typing long commands. - Added the "Edit" menu with the usual Cut, Copy, Paste and Delete. - When you have a prompt and some command echoes text in the screen, this text is printed above the command and not after the prompt. - Triggers and aliases can now match case-insensitively. - The play() function has been added. This function allows you to play WAV files. - It is now possible to export triggers, aliases, macros, timers, permanent variables and hooks and import them in other worlds. - The order of permanent variables can now be changed (but this is only for grouping of realted variables, there is no real effect in the world). - The entry boxes in the Multi Line Send dialog are now 80 characters wide. - In the editors for triggers, aliases, etc., you can now select more than one item and delete all selected items at once. - You can display items defined by plugins in the editors for triggers, aliases, etc. The changes, however, are NOT made in the plugin file. - KildClient can now connect with SSL to servers that support Telnet Over SSL, and the MUD session will be encrypted. (Note: this feature can be disabled at compilation time.) - Added the functions $world->triggerenabled(), $world->aliasenabled(), $world->macroenabled(), $world->timerenabled() and $world->hookenabled() to check if a - given trigger, alias, etc. is enabled. These functions can also be used to check for existence of triggers, aliases, etc. - Plugins can define two functions ENABLE and DISABLE to be called when the plugin is to be enabled or disabled, if this action requires some extra functionality that the default actions are not enough. - Fixed a bug that caused macros not to be run when non-English keymaps are used. (Thanks to Sergey Bogdanov.) - Fixed a bug that caused the wrong number of lines that fit in the window to be calculated (and sent to the server if NAWS is being used) under some circunstances. - Fixed a bug that caused a segfault when a recursive alias definition was found. Now alias processing stops after the command line gets too big. - Fixed a bug that caused a segfault after a world was closed. Changes in version 2.2.2 ------------------------ - In colorize(), you can now use && and ^^ to insert a literal & or ^ character. - URLs with username and password for authenticated login are now detected correctly and made clickable. - Removed some big memory leaks that caused KildClient's memory comsumption to get very high in long sessions. - Fixed a security bug that caused a segmentation fault when a very long ANSI sequence was receveived. - Fixed a bug that caused a crash when a connection was broken abruptly (ie, not in a tidy way, generally because of a network failure). - Fixed a bug that caused a segfault in the Windows version when $world->listtrigger was used and there was a trigger without an action. - Fixed a bug that caused text to be displayed in the wrong colors or attributes when non-recognized ANSI sequences were received. Changes in version 2.2.1 ------------------------ - Fixed a bug that caused a crash (segfault) when trying to connect to a World. This bug affects the Windows version. Changes in version 2.2.0 ------------------------ - KildClient has now much more complete support for ANSI codes: if you mud server uses it, KildClient can display text underlined (singly and doubly), in italics, striked through, in reverse video and in hidden mode. The colorize() function has been extended to include codes to turn on these attributes. - KildClient now supports vt100's line-drawing mode, which allows tables to be built with proper characters (and not +, - and |) that look really nice. (But the server must use these characters, naturally.) - KildClient now supports xterm's sequences to access a 256-colour mode instead of only the default 16. The colorize() function has been extended to allow a way to access these additional colors so you can use them in echoed text even if you mud server does not use them. - You can set some world parameters (such as fonts, colors, and others) as defaults, and all new worlds will use these defaults when they are created. - You can now have more than one character for auto-login. When a World has more than one character defined for auto-login, its entry in the World Selector can be expanded to show all characters and you can select which one to use for auto-login. - Added the hability to test triggers and see how they would react to lines sent from the MUD. - The line count in the status bar now displays the total number of lines received for that session, and not the number of lines in the scrollback buffer (which never increases, once the limit is reached). - The Reconnect and Connect to Another menu itens now have shortcuts (CTRL+R and CTRL+SHIFT+R, respectively). - You can now set default values for the command group size and delay between sending command groups (used in the Multi-line Send and Command History dialogs) in the Preferences dialog. - In the editors for triggers, aliases, etc, you can now delect a line by selecting it and pressing the DEL key. - When you connect to a world that uses MCCP, that information is now displayed in the status bar. - Fixed a bug that caused an infinite loop when there was an OnSentCommand hook and two triggers matched and caused commands to be sent. - Fixed a bug that sometimes caused segfaults when "Connect to Another World" was selected. Changes in version 2.1.0 ------------------------ - KildClient now records the time at which each line of the MUD output was received. You can see this time by leaving the mouse over a line of output for a brief time. - A new dialog has been added in which you can review the command history, send commands again, find commands, etc. - The shortcut for moving to the next or previous world is not CTRL+Page Up or CTRL+Page Down, respectively, but the old ones (ALT+Right or Left arrow) still work. There are also new shortcuts: ALT+ where is a number from 1 to 9 will move to the corresponding world. - There's an option in the Advanced section of the World Editor that allows you to skip the confirmation dialog when deleting a trigger, alias, etc. - The Reconnect menu item (and the $world->reconnect function) now work even if you are connected, closing the connection and trying to reconnect. - Added a new hook, OnDisconnect, triggered after you are disconnected from a World. - Fixed a bug that caused a newline to be sent when a pure gag trigger (one without an action) matched. - Fixed a bug that caused you to be disconnected if a very long line was sent by the mud. - Fixed a bug that caused the first line of output not to be correcty displayed in some circunstances. Changes in version 2.0.0 ------------------------ - It is now possible to add, edit, remove, plugins, triggers, aliases, macros, timers, hooks and permanent variables using a Graphical User Interface, accessible from the World Editor. Dealing with Perl is not necessary anymore for that. - Having the World Editor open does not prevent you from using the program anymore. - URLs in the MUD window are now more clearly marked, and pressing the left mouse button opens them automatically. The right mouse button still pops up a menu with an option to open it or copy the URL's address. - Dialog windows (especially the World Selector) now appear in the center of the screen, and not in awkward places. - The output from the MUD is not shown anymore in a vte widget, but in a TextView. This should not bring any big changes, things should still work as before with small modifications. The only thing that has been removed is the hability to have a transparent or image background. - KCWin's now use a TextView also. Gnome2::Vte::Terminal is not necessary anymore. If you used the ->{VTE} widget directly, you will need to make some changes to you plugins. The other functions (especially feed()) still work as before. - Added the $world->movetrigger() function to reorder triggers, and similar functions for aliases, times, macros and hooks. - Fixed a bug that attributed an invalid name to some hooks. - Bug fixed: macro names are displayed in $world->listmacro(). - Bug fixed: attempting to edit an offline World no longer crashes KildClient. - Corrected some problems that caused build failures for some versions of the Perl library. Changes in version 1.3.2 ------------------------ - Bug fixed: KildClient does not segfault anymore when opening a new world for the first time. - Bug fixed: & and < can be used in the command separator and this does not cause the world to stop being recognized anymore. Changes in version 1.3.1 ------------------------ - This version fix a library dependency problem. It brings no new features and bugfixes, but if you had problems building version 1.3.0, try using this version. Changes in version 1.3.0 ------------------------ - You can now specify one or more world names in the command line, and these worlds will be automatically opened. - The status bar is more informative and more configurable: it can display the time connected and/or idle, and the font can be changed. - When you are disconnected from a world, there is another option you can select: Offline, to keep that window open, so that you can review the screen, run Perl commands, etc. - Two new function: $world->reconnect() reconnects to the world that was open, when in offline mode. $world->connectanother() closes the current connection (if one is open) and allows you to select another world to connect to, using the same tab. - The command history is now more functional, behaving similary to the command history used in the Bash shell and other programs using the same library. The most noticeable feature is that if you start typing something and move to another command, the partially typed command is not lost. - More parts of KildClient appear translated (if there is a translation for that language, naturally). - The substitution of aliases can now be evaluated as a Perl statement (using the s//e construct). See the manual for more details. - KildClient now identifies itself using the Telnet TERMINAL TYPE option. - KildClient now supports the Telnet NAWS option to inform the server of the current window size. - A new menu has been added: Debug Matches in the Preferences menu. When this option is selected, information about matched triggers and alises will be output to stderr. - The enaXXX, disXXX and listXXX functions now support several arguments, for example: $world->distrigger(1, 3). - Bug fixed: when sending something to the server that contains the Telnet IAC character, that character is now correctly escaped. - Bug fixed: timers with names now have this name loaded correctly upon loading a world. Changes in version 1.2.0 ------------------------ - The list of save worlds is now displayed sorted alphabetically. - It is now possible to temporarily disable all trigger (or all macros, or all aliases, or all timers) via the Preferences menu. - The command separator can now be configured instead of having to be %;. (But %; is still the default.) - KildClient now supports MCCP (Mud Client Compression Protocol) version 1 and 2. This protocol, supported by several servers, compresses that sent by the server, thus reducing greatly the bandwidth used. And this happens transparently, so the user doesn't need to do anything. - A new trigger mode: rewriter triggers. Rewriter triggers run before normal triggers and can change the received line, so that further triggers work on the changed line. - Hooks work now more similary to triggers, aliases, etc: for each event, you can connect any number of hooks, and later edit them, disable them, etc. This is mainly for the use of plugins that want to define hooks. There have been some changes in the functions that deal with hooks. Also, a new hook has been added: OnSentCommand, run after each sent command. - When a plugin is unloaded (that is, when the world that loaded it is closed, KildClient will call the plugin's UNLOAD function automatically. - New functions, $world->getname(), $world->getmainfont() and $world->getentryfont() that return the name of the world, the main window font, and the command entry font, respectively. - New functions, getversion() and $world->getpluginversion() to return the version of KildClient or of a given plugin. - A new stardard helper plugin, KCWin, meant to be used in other plugins that require a little window for input and output. - A new standard plugin, notes, to associate notes with a world. - A new standard plugin, easypath, makes using paths easier. - A new plugin allows peer to peer chat with other users or KildClient or of other compatible clients that implement the MudMaster or zChat protocols. - Fixed a bug when it was not possible to connect to the first world tried when the program was started. (It used to pop two World Selector dialogs). - Fixed a bug that caused a crash when the user tried to enable or disable a plugin that was not loaded. Changes in version 1.1.2 ------------------------ - Bug fixed: pressing up arrow to retrieve the last command now correctly retrieves it in all cases. - Bug fixed: the anti-flood mechanism now works correctly even with multiple open worlds. - Bug fixed: some worlds were marked with new text and not be unmarked when focused, this does not happen anymore. - Bug fixed: the Preferences dialog now displays correctly when opened. - Bug fixed: avoided duplicate creation of plugin timers when the plugin is loaded from a script file. - Bug fixed: when the MUD sends lot of text at once, KildClient does not lock until all the text has been received, and does not show it all at once anymore. - Bug fixed: $world->setstatus() now correctly works even if the window does not have the focus when the function is called. - Bug fixed: when deleting a world, all its files are deleted, not only the .wrl file. - Bug fixed: when the last world is disconnected, "Connect to another world is selected" and then "Cancel" is clicked, the program now exits correctly instead of keeping an open window. - The check for trigger (done for each received line) and for aliases (done for each typed command) should be faster now, as some optimizations regarding that have been done. Changes in version 1.1.1 ------------------------ - Some changes regarding plugins: * The format for the plugin file has been slightly changed (there is no need to enclose the file in a block now). Plugins will have to be changed, but this change should be very easy to do. * If the plugin cannot be loaded by some reason (syntax error, it requires a non-existent Perl module, etc), loadplugin() will not consider the plugin as loaded anymore. * Similar to the above, if die() is called in a BEGIN block in the plugin file, the loading of the plugin can be aborted. This can be used to test for some condition and abort the loading if that is not met. * A function has been added, $world->requireplugin, that is similar to loadplugin(), but first checks if the plugin is already loaded. If it is, it returns successfully. If not, it tries loading the plugin (silently). If this succeeds, the function returns successfully, if not, it die()'s. This function is useful in plugins that require other plugins, and is meant to be called in a BEGIN block of a plugin that requires another. - Hyperlinks that appear in the MUD window can now be open in a web browser (or other program), or have they URLs copied, by clicking the right mouse button over them. - The keys for moving between worlds are now Alt+Left or Right arrow, because Ctrl+these arrows is used to move between words in the command entry box. - Corrected bug that caused the About dialog to be displayed only in the first time it was requested. Changes in version 1.1.0 ------------------------ - There is now support for plugins, which are Perl scripts that add new functionality to the client. Plugins can define functions, triggers, timers, macros, aliases, etc. - Triggers, aliases, macros and timers can be given names. These names can be used when enabling, disabling and deleting them. Several triggers (or aliases, macros, timers) can have the same name. In this case, a group is formed, and operations for enabling, disabling and deleting them work on all of them at once. - The World Selector dialog now starts with the last open world selected. - There are menu entries for moving between worlds. The shortcuts Ctrl+Left Arrow and Ctrl+Right Arrow can also be used. - Added the getwindowsize() function to return the size of the window, in characters. - Added the $world->commandecho() function to set or get the value of the command echo option of the world. - Added the $world->sendecho() and $world->sendnoecho() functions that behave just as $world->send(), but which never or always, respectively, echo the sent commands. - Added the Esperanto translation. - Some bugs fixed. Changes in version 1.0.0 ------------------------ - This is the first public release. kildclient-2.11.1/ChangeLog0000644000175000017500000030646311405233117012422 000000000000002007-05-21 ekalin * debian/changelog, debian/copyright, kildclient.spec: Updated package files to version to 2.5.1 * README, configure.in, doc/C/kildclient.xml: Updated version to 2.5.1 * win32/README.win32, win32/kildclient.iss: Added support in the installer to install Aspell so that Spell Checking works under Windows. 2007-05-13 ekalin * src/kildclient.h, src/net.c, src/worlds.c: Changed the way \r characters are handled, because of a mud that sends \r\r\n to end a line. * getperlflags.pl, win32/README.win32: Updates for the latest version of the tools. 2007-05-06 ekalin * debian/changelog, debian/kildclient.doc-base, doc/C/Makefile.am: Removed the autogeneration of the pdf manual (building it does not work for some reason, and the html manual is enough anyway). * autogen.sh, configure.in, po/LINGUAS: Moving (back) to glib-gettextize, because that works. 2007-04-22 ekalin * NEWS, src/kildclient.h, src/net.c, src/worldgui.c: The tooltip does not clobber the Disconnect dialog anymore. 2007-02-10 ekalin * NEWS, src/prefs.c: Bug fixed: If the kildclient.cfg file does not exist (which happens usually in the first run), KildClient does not crash anymore. 2007-01-28 ekalin * NEWS, src/prefs.c: The default commans for running the browser and playing a sound now quote their arguments. * NEWS, src/worldselector.c: Fixed bug that caused a crash when trying to connect to a world with invalid XML. 2007-01-01 ekalin * NEWS, src/worldselector.c: The last selected world is now displayed when the World Selector opens. 2006-12-09 ekalin * NEWS, src/worldgui.c: Bug fixed: In single-line input mode, pressing Shift+Enter or CTRL+Enter now sends the line to the mud. 2006-09-21 ekalin * src/ansitextview.c: Added the escape sequences to erase the screen, but there are a couple problems when there is text before the cleared part. 2006-09-20 ekalin * src/prefs.c: Bug fixed: the preferences file is now closed after being read. 2006-09-17 ekalin * src/ansitextview.c: Implemented ESC[K for erasing a line. * src/ansitextview.c: Corrected some bugs related to cursor movement. * src/ansitextview.c: Cursor movement is now limited to the current screen. * src/ansitextview.c: Used the cached values in the new code. * src/aliases.c, src/hooks.c, src/kildclient.h, src/macros.c, src/net.c, src/perlscript.c, src/timers.c, src/triggers.c, src/worldgui.c: The size of the window is now cached. 2006-09-10 ekalin * src/ansitextview.c: Escape sequences ESC[A, B, C and D are now supported. * src/ansitextview.c: Support alternative escape sequence to move the cursor. * src/ansitextview.c: Cursor moving now works even if the text has been scrolled. * src/ansitextview.c: It's now possible to move the cursor to a position even if there is not text there yet. * src/ansitextview.c: Changed the way newlines are handled so that moving the cursor can work. 2006-09-09 ekalin * src/ansitextview.c: Added very primitive cursor movement support (that does not work yet). * src/ansitextview.c, src/kildclient.h, src/worldgui.c: Created a mark to hold the position of the insertion cursor. * src/ansitextview.c: Corrected the name of a function. * src/ansitextview.c: Made the callback be ignored when text is to be added before a prompt. * src/ansitextview.c, src/kildclient.h, src/worldgui.c: Added the callback to remove text when overwriting. 2006-08-13 ekalin * debian/changelog, debian/compat, debian/control, debian/menu: Updated Ubuntu package files for version 2.5.0. 2006-08-12 ekalin * share/Makefile.am: Fixed error in last commit. * share/Makefile.am: Include icon e xcf files in tarball. * win32/kildclient.iss: Updated installer file for version 2.5.0. * debian/changelog, kildclient.spec: Updated package files for version 2.5.0. * po/eo.po, po/pt_BR.po: Updated translation files. * README, configure.in: Updated version to 2.5.0. 2006-08-10 ekalin * doc/C/kildclient.xml, share/kildclient.hlp, src/kildclient.glade: Fixed some problems with OnCloseConnected hooks. * NEWS, doc/C/images/we_trigger_edit.png, doc/C/images/we_trigger_highlight.png, doc/C/kildclient.xml, share/kcworld.dtd, share/kildclient.hlp, src/ansi.h, src/ansitextview.c, src/kildclient.glade, src/kildclient.h, src/perlscript.c, src/perlscript.h, src/prefs.c, src/triggers.c, src/we_generic_guied.c, src/we_triggers.c, src/worlds.c: Added the "highlight" feature to change the style of a line (or part thereof) when a trigger matches against it. 2006-07-31 ekalin * NEWS, doc/C/kildclient.xml, share/kildclient.hlp, share/kildclient.pl, src/hooks.c, src/perlscript.c, src/permanentvariables.c: It is now possible to get variables referencing other worlds and control them remotely. 2006-07-30 ekalin * configure.in, share/kildclient.ico, src/Makefile.am, src/mainwindow.c, src/wresources.rc: And now the icon works in Windows too. * debian/changelog, debian/menu, kildclient.desktop, share/Makefile.am, share/kildclient.png, share/kildclient.xcf, share/kildclient.xpm, src/Makefile.am, src/mainwindow.c: Added in icon to the program. 2006-07-18 ekalin * NEWS, README, configure.in, kildclient.spec, debian/changelog, debian/control, doc/C/images/pref_appearance.png, doc/C/kildclient.xml, src/kildclient.glade, src/kildclient.h, src/mainwindow.c, src/prefs.c: KildClient can now set the Urgency hint to make windows flash when new text is received. 2006-07-15 ekalin * NEWS, doc/C/kildclient.xml, share/kildclient.1, src/main.c: It is now possible to specify another directory so store the configuration files and saved worlds with the -c command-line option. 2006-06-23 ekalin * src/worldselector.c: Changed the order of the buttons in the world selector to conform to the Gnome HIG. 2006-06-22 ekalin * src/main.c, src/mainwindow.c, src/we_aliases.c, src/we_general.c, src/we_hooks.c, src/we_macros.c, src/we_plugins.c, src/we_timers.c, src/we_triggers.c, src/we_vars.c, src/worldselector.c: Dialogs now have better messages and buttons. 2006-06-17 ekalin * debian/changelog, debian/control: Updated Debian policy version. 2006-06-13 ekalin * Makefile.am, configure.in, doc/C/Makefile.am: It is now possible to disable the generation of the documentation while building the program with --without-docs. 2006-06-11 ekalin * NEWS, src/we_triggers.c: Bug fixed: you can only open the Test Triggers dialog if you are connected to a world. 2006-06-04 ekalin * NEWS, src/kildclient.h, src/worldgui.c: Fixed a bug that caused NAWS information to be sent with each command. 2006-04-25 ekalin * NEWS, doc/C/kildclient.xml, src/hooks.c, src/kildclient.h, src/main.c, src/net.c, src/perlscript.c, src/we_advanced.c, src/we_generic_guied.c, src/we_hooks.c, src/worlds.c: Added the OnCloseConnected hook. 2006-04-18 ekalin * NEWS, src/kildclient.h, src/prefs.c, src/we_plugins.c: Fixed a bug that closed the client if the Help button in the World Editor was clicked for a plugin without help, and also added a dialog to inform the user that help is printed in the main window. * NEWS, doc/C/kildclient.xml, share/kildclient.pl, src/perlscript.c: Added (actually, documented and expanded the influence of) the $world->{SILENT} attribute, to suppress some messages. 2006-03-26 ekalin * win32/kildclient.iss: Updated Windows installer file for version 2.4.1. * ChangeLog: Updated ChangeLog. * debian/changelog, kildclient.spec: Updated package files to 2.4.1. * NEWS, README, configure.in, doc/C/kildclient.xml: Updated version to 2.4.1. * src/cmdhistory.c, src/parser.c, src/perlscript.c, src/we_input.c: Removed some warnings and made code more compliant. 2006-03-24 ekalin * multilinesend.c, we_input.c, we_mainwindow.c, we_statusbar.c, worldgui.c: Fixed bug with pango font freeing that caused crashes sometimes. 2006-03-08 ekalin * kildclient.h, net.c, triggers.c: When two lines match a trigger, each capturing different parts of the line with () in regexps, each trigger is now run correctly with its appropriate parts in $_[]. 2006-02-17 ekalin * mainwindow.c, net.c, perlscript.c, worldgui.c: Removed compiler warnings. * kildclient.h, mainwindow.c, worldgui.c: Pressing ENTER in the search box activates Find Next, and pressing ESC closes the search bar. * kildclient.h, net.c, perlscript.c: Fixed a bug that caused error messages to be printed when disconnected from a World, even if there was no error. 2006-02-15 ekalin * mainwindow.c, net.c: Bug fixed: when compression is disabled during the MUD session, the status bar and Statistics dialog now reflect that fact. * kildclient.glade, kildclient.h, multilinesend.c: You can now choose not to close the Multi-Line Send dialog after sending the data. * perlscript.c: Two new functions, $world->getconntime() and $world->getidletime() retrieve the time connected and idle time, respectively. 2006-02-14 ekalin * Makefile.am, kildclient.glade, kildclient.h, net.c, we_protocols.c, worldeditor.c, worlds.c: MCCP can now be configured to be enabled only if proposed after connection (the new default), to be enabled at all times or to be disabled. 2006-02-13 ekalin * net.c: Telnet TTYPE and NAWS are now sent as one package only, to help servers that don't process TELNET correctly. 2006-02-09 ekalin * mainwindow.c, wndmain.glade: Fixed a but that caused a crash when the Manual menu was selected for the second time. 2006-02-08 ekalin * Makefile.am, kildclient.glade, kildclient.h, simocombobox.c, simocombobox.h, we_input.c, worldgui.c, worlds.c: Added spell checking support via gtkspell. * we_input.c: Fixed bugs regarding the World Editor and the input bar size. * kildclient.h, main.c, mainwindow.c, perlscript.c: If you try to exit the program when there are open worlds, a confirmation dialog is now displayed. 2006-02-03 ekalin * cmdhistory.c, kildclient.h, mainwindow.c, wndmain.glade, worldgui.c: Alt+Shift+Up and Down can be used to search for commands starting with the text that is in the input bar. 2006-01-29 ekalin * aliases.c, triggers.c: Debug Matches now shows trigger and alias names. 2006-01-25 ekalin * kildclient.h, multilinesend.c, perlscript.c: Added a new function, $world->sendfile(), to send the contents of a file to the mud. 2006-01-21 ekalin * cmdhistory.c, kildclient.h, mainwindow.c, wndmain.glade, worldgui.c: When using the multi-line input box, the up and down arrows behave now more naturally: they either retrieve the previous/next command or move the cursor. They move the cursor if you have already moved the cursor in order to edit the line, and move through commands otherwise. 2006-01-09 ekalin * worldselector.c: Pressing ENTER in the "host" or "port" fields of the World Selector now works. 2006-01-05 ekalin * net.c: Fixed a bug that caused a crash when very long lines were received when compression is active. 2006-01-03 ekalin * prefs.c: Fixed a bug that caused a crash when the Preferences dialog was opened for the second time. 2005-12-24 ekalin * main.c: Prevented the input bar contents from being selected whenever it gets focus. 2005-12-23 ekalin * wndmain.glade: Fixed keyboard shortcuts for moving through worlds. 2005-12-22 ekalin * kildclient.glade: Fixed typos in strings. 2005-12-21 Eduardo M Kalinowski * cmdhistory.c, kildclient.glade, kildclient.h, mainwindow.c, net.c, simocombobox.c, simocombobox.h, we_input.c, worldgui.c, worlds.c: Merged the mlinput branch, bringing the multi-line input bar into HEAD. * simocombobox.c: The line height is now cached for performance. * simocombobox.c: The size of the multi-line input box now really represents the number of lines. 2005-12-20 Eduardo M Kalinowski * kildclient.glade, kildclient.h, we_input.c, worldgui.c, worlds.c: The size of the input box can now be configured in the World Editor. * simocombobox.c: Focus is kept in the text entry even if size is changed. * kildclient.h, worldgui.c, worlds.c: The size of the input box is now saved and restored. 2005-12-19 Eduardo M Kalinowski * simocombobox.c, simocombobox.h: A signal is emitted when the size of the input line is changed. * simocombobox.c: The arrows now appear at the top and bottom of their area. * simocombobox.c: The maximum number of lines can be changed. * simocombobox.c, simocombobox.h, worldgui.c: The arrows work for chaning the size of the input box. 2005-12-18 Eduardo M Kalinowski * simocombobox.c: Added some arrows to change the input bar height. (But changing the height is still inoperant.) 2005-12-16 Eduardo M Kalinowski * worldgui.c: Key press events are now handled in a way that everything works as expected. 2005-12-14 Eduardo M Kalinowski * simocombobox.c: When the input state is toggled, the text is preserved. * simocombobox.c: When the multi-line input is selected, activate and changed signals are sent when appropriate, so that it can now be used. * mainwindow.c: Bug fixed: the real clipboard is used for copying text from the display window. * simocombobox.c, simocombobox.h, worldgui.c: Functions for getting/setting/etc with text now work for the currently selected text widget, whichever it is. 2005-12-13 Eduardo M Kalinowski * worldgui.c: Added a button to test the multi-line input. (But this will probably be changed in the future.) * simocombobox.c: The multi-line entry now appears correcly. * simocombobox.c, simocombobox.h: The SimoComboBox can now have also a multi-line text widget. * kildclient.h, simocombobox.c, simocombobox.h, we_input.c, worldgui.c: Removed the last references to txtEntry (or so I hope). * simocombobox.c, simocombobox.h, we_input.c, worldgui.c: Removed direct reference to txtEntry with regard to completion. * simocombobox.c: Grabbing the focus works correctly again. * cmdhistory.c, kildclient.h, mainwindow.c, net.c, simocombobox.c, simocombobox.h, worldgui.c: Removed several direct references to the entry widget. * simocombobox.c, simocombobox.h, worldgui.c: Moved some text entry signals to SimoComboBox. 2005-12-11 Eduardo M Kalinowski * worldgui.c: Fixed a bug that caused the search box to be redisplayed even if hidden when World->Open was selected. * worldgui.c: Fixed a bug with tooltips after a world is closed. 2005-12-07 Eduardo M Kalinowski * ansitextview.c, multilinesend.c: A much simpler way of determining the character size is now used. * kildclient.glade, multilinesend.c: The entry boxes in the Multi Line Send dialog are now 80 characters wide. 2005-11-30 Eduardo M Kalinowski * aliases.c, hooks.c, macros.c, perlscript.c, timers.c, triggers.c: The $world->listX functions now adapt their width to the screen width. 2005-11-24 Eduardo M Kalinowski * perlscript.c: The argument checking in functions is now better: no more strange warnings if no arguments are given to some functions, a nice message is printed. Also, the built-in $world-> functions are now safer even if not invoked from a proper world instance. 2005-11-22 Eduardo M Kalinowski * kildclient.h, perlscript.c: Added the $world->Xenabled() functions, where X is trigger, alias, macro, timer and hook. 2005-11-16 Eduardo M Kalinowski * aliases.c, kildclient.glade, kildclient.h, perlscript.c, perlscript.h, triggers.c, we_aliases.c, we_generic_guied.c, we_triggers.c, worlds.c: Triggers and aliases can now match case-insensitively. * parser.c: Fixed a bug that caused a segfault when a recursive alias definition was found. 2005-11-15 Eduardo M Kalinowski * perlscript.c: Fixed bug regarding alias matching: the line is now marked as a UTF-8 string. 2005-11-12 Eduardo M Kalinowski * worldgui.c: Added a missing newline in the output of getkeycode(). * macros.c: Fixed a bug that caused macros not to be run when a non-English keyboard is used. 2005-11-06 Eduardo M Kalinowski * Makefile.am, kildclient.glade, kildclient.h, perlscript.c, prefs.c, sound.c: Added the play() function to play sounds. 2005-11-05 Eduardo M Kalinowski * ansitextview.c: Fixed a bug that caused the wrong number of lines that fit in the window to be calculated (and sent to the server if NAWS is being used) under some circunstances. 2005-11-04 Eduardo M Kalinowski * mainwindow.c: Fixed a small bug that caused segfaults under some rare circunstances. 2005-11-03 Eduardo M Kalinowski * Makefile.am, aliases.c, ansitextview.c, cmdhistory.c, hooks.c, kcwin.c, kildclient.glade, kildclient.h, log.c, macros.c, main.c, mainwindow.c, multilinesend.c, net.c, parser.c, perlscript.c, perlscript.h, permanentvariables.c, plugins.c, prefs.c, timers.c, triggers.c, we_advanced.c, we_aliases.c, we_colors.c, we_general.c, we_generic_guied.c, we_hooks.c, we_input.c, we_macros.c, we_mainwindow.c, we_misc.c, we_plugins.c, we_scripting.c, we_statusbar.c, we_timers.c, we_triggers.c, we_vars.c, worldeditor.c, worldgui.c, worlds.c, worldselector.c: Merged the libgnutls branch. 2005-11-02 Eduardo M Kalinowski * Makefile.am, kildclient.glade, mainwindow.c: Added information about the SSL certificate in the Statistics window. * kildclient.glade, mainwindow.c: Added information about the SSL connection to the Statistics dialog. * mainwindow.c: Removed a warning about pointer sizes under AMD64 architecture. * ansitextview.c: Fixed bug that caused text to be displayed incorrectly when line drawing and normal characters were mixed in the same line. * we_general.c: Removed unused variable when compiling without SSL. * kildclient.h, mainwindow.c, net.c: Added SSL connection support. 2005-11-01 Eduardo M Kalinowski * kildclient.glade, main.c, we_general.c, worlds.c: Added a checkbox to select whether to use SSL when connecting. * aliases.c, ansitextview.c, cmdhistory.c, hooks.c, kcwin.c, kildclient.h, log.c, macros.c, main.c, mainwindow.c, multilinesend.c, net.c, parser.c, perlscript.c, perlscript.h, permanentvariables.c, plugins.c, prefs.c, timers.c, triggers.c, we_advanced.c, we_aliases.c, we_colors.c, we_general.c, we_generic_guied.c, we_hooks.c, we_input.c, we_macros.c, we_mainwindow.c, we_misc.c, we_plugins.c, we_scripting.c, we_statusbar.c, we_timers.c, we_triggers.c, we_vars.c, worldeditor.c, worldgui.c, worlds.c, worldselector.c: Corrected a problem with header inclusion order. * Makefile.am: Added a configure check for libgnutls (but this can be disabled.) 2005-10-31 Eduardo M Kalinowski * kildclient.h, perlscript.c, permanentvariables.c, we_generic_guied.c, we_vars.c: The order of permanent variables can be changed from the GUI Editor. * cmdhistory.c, mainwindow.c, prefs.c, we_aliases.c, we_general.c, we_generic_guied.c, we_hooks.c, we_macros.c, we_timers.c, we_triggers.c, we_vars.c, worldgui.c, worlds.c: Removed some memory leaks because GladeXML's were not being destroyed. 2005-10-30 Eduardo M Kalinowski * Makefile.am, aliases.c, hooks.c, kildclient.glade, kildclient.h, macros.c, timers.c, triggers.c, we_aliases.c, we_generic_guied.c, we_hooks.c, we_macros.c, we_timers.c, we_triggers.c, we_vars.c, worldeditor.c, worlds.c: It is now possible to export and import triggers, aliases, macros, timers, hooks and permanent variables. 2005-10-24 Eduardo M Kalinowski * kildclient.h, mainwindow.c, wndmain.glade, worldgui.c: Add a Find function to search for text in the output buffer. 2005-10-21 Eduardo M Kalinowski * ansitextview.c: When there is a prompt and a command prints something, the text is now printed above the command. 2005-10-20 Eduardo M Kalinowski * mainwindow.c, wndmain.glade: Added the "Edit" menu with the usual Cut, Copy, Paste and Delete. * hooks.c, kildclient.glade, kildclient.h, perlscript.c, we_advanced.c, we_aliases.c, we_hooks.c, we_macros.c, we_timers.c, we_triggers.c, worldeditor.c, worlds.c: Triggers, aliases, etc, defined by plugins can be displayed in the GUI editors. 2005-10-19 Eduardo M Kalinowski * kildclient.glade: The Close button in the About dialog works correctly now. 2005-10-15 Eduardo M Kalinowski * kildclient.glade, mainwindow.c: A GtkAboutDialog is now used for the About dialog. 2005-10-14 Eduardo M Kalinowski * kildclient.glade, kildclient.h, multilinesend.c, we_scripting.c, worldeditor.c: Now using a GtkFileChooserButton instead of doing the same manually. 2005-10-01 Eduardo M Kalinowski * kildclient.glade: Updated messages files. * kildclient.glade: Updated version to 2.2.2. * ansitextview.c: Corrected problem in the CVS Id line. 2005-09-30 Eduardo M Kalinowski * kildclient.glade: Joined the "Colors" and "Window" tabs of the Preferences Dialog into one. * kildclient.glade: Corrected the layout in the Sending tab of the Preferences dialog. * worldgui.c: The time displayed in the tooltips is now locale-dependent. * perlscript.c: Removed big memory leaks that caused memory comsumption to get very high in long sessions. 2005-09-28 Eduardo M Kalinowski * perlscript.c: Removed a debugging message that was kept there, forgotten. * kildclient.h, worldgui.c: When you leave the mouse over a link in the output window, a better tooltip is displayed. * ansitextview.c: URLs with username and password are now detected and made clickable. 2005-09-25 Eduardo M Kalinowski * net.c: Fixed a bug that caused a crash when a connection was broken abruptly (ie, not in a tidy way, generally because of a network failure). 2005-09-23 Eduardo M Kalinowski * Makefile.am: We're now using autopoint instead of the old and out-of-date glib-gettextize. * kildclient.glade: Corrected some errors in the message files. * ansitextview.c: Corrected a bug that caused text to be displayed in the wrong colors or attributes when unrecognized ANSI sequences were received. (These are now properly ignored.) 2005-09-22 Eduardo M Kalinowski * ansitextview.c: Fixed a security bug that caused a segmentation fault when a very long ANSI sequence was receveived. * kildclient.h, net.c, worlds.c: A GTimer is now used to keep track of elapsed time for the prompt timeout. (Which is good, because Mingw32 lacks gettimeofday().) 2005-09-20 Eduardo M Kalinowski * perlscript.c, triggers.c: Fixed a bug that caused a segfault in the Windows version when $world->listtrigger was used and there was a trigger without an action. * kildclient.glade: Updated version to 2.2.1. * worlds.c: Fixed a bug that causes a segfault when trying to connect to a world under Windows. 2005-09-19 Eduardo M Kalinowski * worldselector.c: Corrected a bug that prevented compilation under Windows. * kildclient.glade: Updated version to 2.2.0. * kildclient.glade, main.c: Corrected some messages. 2005-09-19 Eduardo M Kalinowski * worldselector.c: Corrected a bug that prevented compilation under Windows. * kildclient.glade: Updated version to 2.2.0. * kildclient.glade, main.c: Corrected some messages. 2005-09-18 Eduardo M Kalinowski * kildclient.glade, kildclient.h, mainwindow.c, net.c, wndmain.glade: Added a dialog showing some statistics about the world and the connection. * ansitextview.c, kildclient.h, worldgui.c: The line count in the status bar now displays the total number of lines received, not the number of lines in the scrollback buffer. 2005-09-17 Eduardo M Kalinowski * worldgui.c: Fixed (hopefully) the bug that caused segfaults when Connect to Anothre was selected. * ansi.h, ansitextview.c, kildclient.h, net.c, we_mainwindow.c, worldgui.c: Merged the more_ansi branch, bringing its features into HEAD. 2005-09-16 Eduardo M Kalinowski * ansitextview.c, kildclient.h, we_mainwindow.c, worldgui.c: Added support for the vt100 line drawing characters. 2005-09-15 Eduardo M Kalinowski * worlds.c: Fixed bug that caused some gtk warnings to be displayed when a world was requested from the command line. * kildclient.h, main.c, net.c: Added two debug-mode command-line options that dump everything received from the mud to a file. One of them dumps data just as received (data which might be compressed), and the other dumps data after decompression (if MCCP was used; otherwise the dumps are equal). * ansitextview.c, kildclient.h, net.c: Made the xterm256_state variable local to the function that parses ANSI sequences, because only complete sequences are passed to that function. 2005-09-14 Eduardo M Kalinowski * ansitextview.c: Corrected the code for a grayscale level that was wrong. * ansi.h, ansitextview.c, kildclient.h: Added suport for ANSI "hidden" text. * ansi.h, ansitextview.c, kildclient.h: Ansi Reverse Video mode is now supported. 2005-09-13 Eduardo M Kalinowski * net.c: When you connect to a host that uses MCCP, this information is displayed in the status bar. * ansi.h, ansitextview.c, kildclient.h, worldgui.c: Added support for doubly underlined and striked through text. * ansi.h, ansitextview.c, kildclient.h, net.c, worldgui.c: Added support for xterm's 256 color mode. 2005-09-12 Eduardo M Kalinowski * ansitextview.c: Corrected bug in ANSI italics and underline handling. 2005-09-11 Eduardo M Kalinowski * ansi.h, ansitextview.c, kildclient.h, worldgui.c: Underlined and italics text is now displayed, if the common-but-not-so-official ansi codes for these attributes is used. * ansitextview.c, kildclient.h, net.c, worldgui.c: Changed some structures that hold text appearance settings (currently only for ANSI) in preparation for future changes. 2005-09-10 Eduardo M Kalinowski * cmdhistory.c, kildclient.glade, kildclient.h, multilinesend.c, prefs.c: You can now set default values for the delay parameters when sending multiple lines or commands. 2005-09-07 Eduardo M Kalinowski * ansitextview.c: Fixed a bug that sometimes caused segfaults when "Connect to Another World" was selected. * kildclient.h, main.c, mainwindow.c, we_advanced.c, wndmain.glade, worldeditor.c, worlds.c: It is now possible to edit a Default World whose parameters are copied from when creating new Worlds. 2005-09-04 Eduardo M Kalinowski * kildclient.glade, kildclient.h, net.c, we_general.c, worlds.c, worldselector.c: Added the possibility of having more than one character associate with a World for auto-login. 2005-09-03 Eduardo M Kalinowski * we_plugins.c: Removed some useless code from a couple of functions. 2005-09-02 Eduardo M Kalinowski * kildclient.glade, kildclient.h, multilinesend.c, worlds.c: The multi-line send dialog is now per-world and not one for all worlds. 2005-09-01 Eduardo M Kalinowski * ansitextview.c, kildclient.h, net.c, perlscript.c, perlscript.h, triggers.c, worldgui.c: Removed compilation warnings (with GCC 4.0) about signedness mismatch in several places. * kildclient.glade, kildclient.h, net.c, triggers.c, we_triggers.c, wndmain.glade, worlds.c: Added the hability to test triggers and see how they would react to lines from the MUD. 2005-08-31 Eduardo M Kalinowski * hooks.c: Fixed a bug that caused an infinite loop when there was an OnSentCommand hook and two triggers matched and caused commands to be sent. 2005-08-30 Eduardo M Kalinowski * we_aliases.c, we_hooks.c, we_macros.c, we_plugins.c, we_timers.c, we_triggers.c, we_vars.c: The DEL key works in the GUI editors for triggers, etc. as a shortcut to delete the object. * wndmain.glade: Added keyboard accelerators for Reconnect and Connect to Another. 2005-08-26 Eduardo M Kalinowski * ansitextview.c: Fixed a bug that caused a segfault when opening a world. * net.c: Fixed a bug that caused you to be disconnected if a very long line (>1k) was sent by the mud. 2005-08-25 Eduardo M Kalinowski * kildclient.glade: Updated version to 2.1.0. 2005-08-25 Eduardo M Kalinowski * kildclient.glade: Updated version to 2.1.0. 2005-08-23 Eduardo M Kalinowski * triggers.c: Fixed a bug that caused a newline to be sent when a pure gag trigger (one without an action) matched. * hooks.c, kildclient.h, net.c, perlscript.c, we_hooks.c, worlds.c: Added a new hook, OnDisconnect, triggered after a connection to a World is closed. * cmdhistory.c, worlds.c: Removed some memory leaks from the Command History feature. 2005-08-22 Eduardo M Kalinowski * Makefile.am, cmdhistory.c, kildclient.glade, kildclient.h, mainwindow.c, wndmain.glade, worldgui.c, worlds.c: Added the Command History dialog. 2005-08-20 Eduardo M Kalinowski * multilinesend.c: Removed a memory leak in the multi-line-send feature. 2005-08-18 Eduardo M Kalinowski * net.c: Corrected a bug that prevented prompts from being displayed under some circunstances. 2005-08-16 Eduardo M Kalinowski * mainwindow.c, net.c: Changed the way timeouts for printing incomplete lines are used, hopefully KildClient is slightly faster now. * Makefile.am, ansitextview.c, kcircularqueue.c, kcircularqueue.h, kildclient.h, we_misc.c, worldgui.c, worlds.c: Added a feature that displays a tooltip with the time the line was received when the mouse is left over a line for a little time. 2005-08-13 Eduardo M Kalinowski * wndmain.glade, worldgui.c: The shortcuts for moving to the next/previous world have changed to CTRL+Page up/down, and ALT+num has been added as a shortcut for going to a given world. 2005-08-12 Eduardo M Kalinowski * kildclient.glade, kildclient.h, we_advanced.c, we_aliases.c, we_hooks.c, we_macros.c, we_timers.c, we_triggers.c, we_vars.c, worlds.c: It is now possible to disabled the dialog confirming trigger, etc. deletion in the GUI Editors. * worldselector.c: In the World Selector, the list of worlds starts focused. 2005-08-07 Eduardo M Kalinowski * worldgui.c: Fixed a bug that caused the first line not to be displayed correctly under some circunstances. 2005-08-06 Eduardo M Kalinowski * worldgui.c: Added a tooltip to the "clear" button near the command input area. 2005-08-03 Eduardo M Kalinowski * mainwindow.c, perlscript.c: The Reconnect menu item and the $world->reconnect function now work even if it is already connected. 2005-07-31 Eduardo M Kalinowski * kildclient.glade: Added a label describing how to use the "Key" entry box in the macro edit dialog. 2005-07-25 Eduardo M Kalinowski * perlscript.c: Allowed the win32 version to find the boogus Gettext.pm wherever it is run from. * worlds.c: Bug fixed: attempting to edit an offline World no longer crashes KildClient. 2005-07-24 Eduardo M Kalinowski * kildclient.glade: Updated version to 2.0.0. * mainwindow.c, worldeditor.c: Removed warnings when compiling with optimization on. * we_hooks.c: Fixed bug that prevented the OnSentCommands Hook editor from working correctly, and which caused segfaults on some occasions. 2005-07-23 Eduardo M Kalinowski * kildclient.glade, prefs.c, worldgui.c: Clicking URLs now works in Windows too. * worlds.c: Corrected bug that prevented the command separator from being correctly saved under some circunstances (ie, under windows). * triggers.c: Corrected little typo in $world->listtrigger output. 2005-07-22 Eduardo M Kalinowski * kildclient.glade, wndmain.glade: Dialogs, especially the World Selector, now appear in the center of the screen. * ansitextview.c, perlscript.h: Added a not-so-beautiful hack to prevent ActiveState Perl (under mingw) from trying to use its own functions instead of the C library ones. 2005-07-21 Eduardo M Kalinowski * worldselector.c: Corrected a bug in the mingw implementation of the functions that otherwise use glob(). * worlds.c: Corrected bug that caused a segfault when a world file could not be loaded for display in the world selector. * net.c: Added a mingw implementation of gettimeofday(). * log.c, main.c, mainwindow.c, prefs.c: Made some more changes to enable compilation under Mingw. * worldselector.c: Corrected a bug that prevented a new world from being created. * kildclient.h, multilinesend.c: Moved a definition of a function that didn't need to be in kildclient.h to a proper file. * net.c: Changed the write() and read() functions to send() and recv(), because only these work with sockets under Mingw. 2005-07-20 Eduardo M Kalinowski * mainwindow.c, permanentvariables.c: Corrected bug that caused perl_script_import_file to be called with a NULL file. * main.c: Made further changes to allow compilation under MINGW32. 2005-07-19 Eduardo M Kalinowski * worldselector.c: MINGW32 does not have glob(), so the parts that used that were rewritten with what Windows provides. * simocombobox.c, ansitextview.c, main.c, mainwindow.c: Made some changes to make possible compilation under Windows with mingw32. * worlds.c: Changed the names of the structure to have a KC_ prefix because one of them was conflicting with another #define in mingw. 2005-07-17 Eduardo M Kalinowski * kildclient.glade: Corrected some problems in the UI messages. 2005-07-16 Eduardo M Kalinowski * aliases.c, ansitextview.c, hooks.c, kcwin.c, log.c, macros.c, main.c, mainwindow.c, multilinesend.c, net.c, parser.c, perlscript.c, permanentvariables.c, plugins.c, prefs.c, timers.c, triggers.c, we_advanced.c, we_aliases.c, we_colors.c, we_general.c, we_hooks.c, we_input.c, we_macros.c, we_mainwindow.c, we_misc.c, we_plugins.c, we_scripting.c, we_statusbar.c, we_timers.c, we_triggers.c, we_vars.c, worldeditor.c, worldgui.c, worlds.c, worldselector.c: Renamed the config.h file to kcconfig.h, so that it does not conflict with a config.h that libperl installs. This change allows kildclient to be built with gcc 4.0.X, which for some reason was #include'ing perl's config.h. * kildclient.h, net.c, triggers.c: Corrected bug with rewriter triggers. 2005-07-15 Eduardo M Kalinowski * kildclient.glade: Added tooltips to most of the widgets, especially in the World Editor. * ansitextview.c, kcwin.c, kildclient.h, net.c, perlscript.c: Corrected bug that caused a segfault when a very long string was echo()ed. 2005-07-14 Eduardo M Kalinowski * kildclient.glade: Made the ENTER key work in the World Editor. * Makefile.am, aliases.c, hooks.c, kildclient.glade, kildclient.h, macros.c, mainwindow.c, perlscript.c, plugins.c, timers.c, triggers.c, we_aliases.c, we_hooks.c, we_macros.c, we_plugins.c, we_timers.c, we_triggers.c, we_vars.c, worldeditor.c, worlds.c, worldselector.c: Merged the Graphical Editors branch, bringing them to the main trunk. * we_vars.c: Corrected a small inconvenience in the variables editor, in case you clicked to edit a variable but later decided not to change it. * kildclient.glade: Corrected a small problem in the Timer editing window. * kildclient.h, plugins.c, we_plugins.c, we_timers.c, worldeditor.c, worlds.c, worldselector.c: Fixed some bugs that prevented the GUI Editors from being used when editing a world from the World Selector. 2005-07-13 Eduardo M Kalinowski * we_plugins.c: When loading a plugin, you can make it be loaded always at startup. * kildclient.h, plugins.c, we_plugins.c: The Load button now works, for loading plugins. * kildclient.glade: Moved the Loaded Plugins section to be the first one. * we_plugins.c: The Help button in the Plugin Editor works. * we_plugins.c: Plugins can be enabled/disabled by clicking the checkbox in the Enabled column of the GUI Editor. * kildclient.glade: Removed the "Information" button in the Plugin editor, all the information is shown in the list anyway. 2005-07-12 Eduardo M Kalinowski * kildclient.h, perlscript.c, we_plugins.c: The list loaded plugins is now updated when a plugin is loaded or enabled/disabled. * kildclient.h, we_plugins.c, worldeditor.c: The loaded plugins are displayed in the GUI Editor. * we_plugins.c: The order of the start up plugins can now be changed. * plugins.c: The plugins specified to load at startup plugins are now loaded on startup. * kildclient.h, mainwindow.c, plugins.c, we_plugins.c, worlds.c: The list of startup plugins is saved and loaded now. * kildclient.h, plugins.c, we_plugins.c: Plugins can be added and removed to the startup list in the GUI editor. 2005-07-11 Eduardo M Kalinowski * Makefile.am, kildclient.glade, kildclient.h, we_plugins.c: Added a (non functional yet) GUI Editor for plugins. * we_plugins.c: New file. * worldeditor.c, worlds.c: Added a (non functional yet) GUI Editor for plugins. 2005-07-10 Eduardo M Kalinowski * Makefile.am, kildclient.glade, kildclient.h, perlscript.c, we_vars.c, worldeditor.c: Added a GUI Editor for Permanent Variables. * we_vars.c: New file. 2005-07-09 Eduardo M Kalinowski * hooks.c, kildclient.h, perlscript.c, we_hooks.c: The Up and Down buttons of the Hook GUI Editor work; that GUI is now complete. * hooks.c, kildclient.h, perlscript.c: Added the $world->movehook function. * hooks.c, kildclient.h, we_hooks.c: Hooks can be added from the GUI editor. * kildclient.glade, we_hooks.c: Hooks can be edited from the GUI editor. * we_hooks.c: Hooks can be deleted from the GUI editor. * hooks.c, kildclient.h, perlscript.c, we_hooks.c: When hooks are added, modified or deleted from the command line, the view in the GUI Editor is updated. 2005-07-08 Eduardo M Kalinowski * hooks.c, kildclient.h, we_hooks.c, worldeditor.c, worlds.c: The hooks are listed in the GUI Hook editor. * worlds.c: Fixed a bug that attributed an invalid name to a hook. * Makefile.am, kildclient.h, we_hooks.c: Added a (not yet functioal) GUI editor for Hooks. * we_hooks.c: New file. * worldeditor.c: Added a (not yet functioal) GUI editor for Hooks. * Makefile.am, kildclient.glade, kildclient.h, macros.c, perlscript.c, we_macros.c, worldeditor.c: Added a GUI editor for Macros. * we_macros.c: New file. 2005-07-07 Eduardo M Kalinowski * Makefile.am, kildclient.glade, kildclient.h, perlscript.c, timers.c, we_timers.c: Added a GUI editor for timers. * we_timers.c: New file. * worldeditor.c: Added a GUI editor for timers. * perlscript.c: Bug fixed: you can now create a trigger without an action if it gags the log line. 2005-07-06 Eduardo M Kalinowski * Makefile.am, kildclient.glade, kildclient.h, perlscript.c, triggers.c, we_aliases.c, we_triggers.c, worldeditor.c: Added a GUI editor for triggers. * we_triggers.c: New file. 2005-07-05 Eduardo M Kalinowski * we_aliases.c: Confirmation is asked before deleting an alias. * perlscript.c: Corrected handling of position numbers in $world->movealias(). * we_aliases.c: The Perl Eval setting can now be toggled by clicking in the check button directly. 2005-07-04 Eduardo M Kalinowski * kildclient.glade, we_aliases.c: Aliases can be moved from the GUI Editor now. * aliases.c, kildclient.h, perlscript.c, we_aliases.c: Added the $world->movealias() function to reorder aliases. * net.c: Corrected bug that caused extra newlines to be printed when using Multi-Line Send with Command Echo active. * kildclient.h, multilinesend.c, we_scripting.c, worldeditor.c: Corrected bug that caused a Segfault when the ... button was used in the Scripting section of the World Editor to select a file. * we_aliases.c: Bug fixed: using the Perl commands for aliases does not cause a warning anymore if the World Editor wasn't opened before. 2005-07-03 Eduardo M Kalinowski * kildclient.glade: Updated version to 1.3.2. * worlds.c: Brought the command-separator bugfix (in HEAD) here, so that it appears already in the next bugfix release. * worldgui.c: Merged the bugfix that caused segfault when opening a new world. * worldgui.c: Fixed bug that caused a segfault when a world was opened for the first time. * we_aliases.c: The Enabled property of aliases can be toggle directly from the list of aliases in its GUI editor by clicking on the toggle button. 2005-07-02 Eduardo M Kalinowski * we_aliases.c: Double clicking on a row in the Alias editor now edits that alias. * kildclient.glade, we_aliases.c: The Add and Edit buttons of the Graphical Alias Editor work. * aliases.c, kildclient.h, perlscript.c, we_aliases.c: The Delete button of the Graphical Alias Editor works. 2005-07-01 Eduardo M Kalinowski * kildclient.glade, kildclient.h, perlscript.c, we_aliases.c, worldeditor.c: The aliases are listed in the World Editor. 2005-06-30 Eduardo M Kalinowski * worldeditor.c: Moved the section of the World Editor where the script file is set to inside the Automation Group. * Makefile.am, kildclient.glade, kildclient.h, we_aliases.c, worldeditor.c: Created the basic layout for a graphical editor for aliases. * we_aliases.c: New file. 2005-06-29 Eduardo M Kalinowski * kildclient.h, we_advanced.c, we_colors.c, we_general.c, we_input.c, we_misc.c, we_scripting.c, worldeditor.c: Bug fixed: when several World Editors were open, sometimes the settings of one World affected the wrong world. * perlscript.c: Bug fixed: macro names are displayed in $world->listmacro(). * worlds.c: Bug fixed: & and < can be used in the command separator and this does not cause the world to stop being recognized anymore. 2005-06-28 Eduardo M Kalinowski * kildclient.h, multilinesend.c, net.c: Corrected newline printing when "Don't Echo Commands" is active. * kildclient.glade, kildclient.h, mainwindow.c, perlscript.c, worldeditor.c, worlds.c, worldselector.c: The World Editor is not modal anymore. 2005-06-25 Eduardo M Kalinowski * ansitextview.c, net.c: Corrected bug that caused command output to be erased sometimes. 2005-06-24 Eduardo M Kalinowski * Makefile.am, ansitextview.c, kcwin.c, kildclient.h, main.c, mainwindow.c, perlscript.c, perlscript.h, we_colors.c, we_mainwindow.c, worldgui.c: Merged the novte branch again, bringing the new KCWin's without a VTE. 2005-06-23 Eduardo M Kalinowski * kcwin.c, perlscript.c, perlscript.h: Removed a memory leak when a KCWin is destroyed. * kcwin.c, kildclient.h, worldgui.c: Added some more child widgets in the KCWin hash. * perlscript.c: Added a missing newline to the end of a message output by the program. * ansitextview.c, kcwin.c, perlscript.c, perlscript.h: Added the KCWin::feed function again. 2005-06-22 Eduardo M Kalinowski * ansitextview.c, kcwin.c, kildclient.h, mainwindow.c, we_colors.c, we_mainwindow.c, worldgui.c: The new C-generated KCWin now appears in the same font/color as the world, and is bigger. * Makefile.am, kcwin.c, perlscript.c, perlscript.h: Added the function KCWin::new to create KCWin's, but they are still white, and the other functionalities are not present yet. * kcwin.c: New file. * worldgui.c: Added the function KCWin::new to create KCWin's, but they are still white, and the other functionalities are not present yet. * kildclient.h, main.c, mainwindow.c, worldgui.c: Changed the world_gui_new function so that it can create GUIs for the MUD itself and for other purposes (new built-in KCWin). 2005-06-19 Eduardo M Kalinowski * ansitextview.c, kildclient.h, worldgui.c: Added a line counter to the status bar. * kildclient.h, worldgui.c: Merged the bug fix into HEAD. * kildclient.h, worldgui.c: Fixed bug when a world was closed and others still remained open. * log.c: Removed some hacks to deal with \r in lines when logging, since newlines are converted to \n upon reception now. * hooks.c, perlscript.c: Marked some more strings for translation. * Makefile.am, aliases.c, ansi.h, ansitextview.c, hooks.c, kcvte.c, kcvte.h, kildclient.glade, kildclient.h, macros.c, main.c, mainwindow.c, net.c, parser.c, perlscript.c, prefs.c, timers.c, triggers.c, we_back.c, we_colors.c, we_fonts.c, we_input.c, we_mainwindow.c, we_misc.c, worldeditor.c, worldgui.c, worlds.c, worldselector.c: Merged the novte branch. 2005-06-18 Eduardo M Kalinowski * ansitextview.c, kildclient.glade, kildclient.h, worldgui.c: The scrollback buffer is now kept to the number of lines specified by the user, lines at the beginning are removed when it gets too big. * kildclient.glade, kildclient.h, we_mainwindow.c, worldgui.c, worlds.c: Word wrap can be enabled or disabled now. * Makefile.am: Renamed the Fonts section of the World Editor to Main Window, in preparation for the upcoming changes. * we_mainwindow.c: New file. * kildclient.glade, kildclient.h, we_fonts.c, we_mainwindow.c, worldeditor.c: Renamed the Fonts section of the World Editor to Main Window, in preparation for the upcoming changes. * kildclient.glade, we_fonts.c, we_input.c: Moved the Command Entry font configuration to the Input tab. * kildclient.glade: Removed the Background tab of the World Editor from the glade file. * worldgui.c: Corrected a bug that prevented selecting text from the World window. 2005-06-17 Eduardo M Kalinowski * we_misc.c: Corrected a bug in the last commit. 2005-06-16 Eduardo M Kalinowski * we_misc.c: Removed a (commented) reference to a vte function that is not necessary anymore. * ansitextview.c, kildclient.h, worldgui.c: URLs are now clicable again. 2005-06-14 Eduardo M Kalinowski * worldgui.c: Bug fixed: NAWS data is sent on resizes also. * ansitextview.c, kildclient.h, main.c, worldgui.c, worlds.c: In the first run of KildClient, when there is not saved window size, the window now starts with a 80x24 character terminal screen. 2005-06-13 Eduardo M Kalinowski * ansitextview.c, kildclient.h, mainwindow.c, net.c, prefs.c: Optimized the way echoed commands and connection messages are output to the world. * ansi.h, ansitextview.c: Some nonstandard but well-known ANSI sequences for colors are now supported. * mainwindow.c, worldgui.c: The color and font of the TextView are now set before anything is echoed to the World, so there is no more a font shift only after connection is established. * ansitextview.c, worldgui.c: Changing the default foreground or background color now yields the correct result. * ansitextview.c, net.c: Telnet NAWS is sent again. * ansitextview.c, kildclient.h, perlscript.c: The getwindowsize() function now works again. 2005-06-11 Eduardo M Kalinowski * ansitextview.c, we_fonts.c: The use bold setting now works again. * ansitextview.c, kildclient.glade, kildclient.h, we_colors.c, worlds.c: The default bold background color can now be configured. * ansitextview.c: Corrected bug regarding incomplete lines and long sequences of echoed text. * ansitextview.c, kildclient.h, perlscript.c, triggers.c: Corrected the echo and stripansi functions. * kildclient.h, net.c: Corrected a bug in the ANSI parser with regard to incomplete lines. * ansi.h, ansitextview.c, kildclient.h, mainwindow.c, net.c, triggers.c, we_colors.c, worldgui.c: Wrote the ANSI parser. It works, but still needs some fixing. 2005-06-08 Eduardo M Kalinowski * aliases.c, ansitextview.c, hooks.c, kildclient.h, macros.c, mainwindow.c, parser.c, perlscript.c, timers.c, triggers.c, worldgui.c: Added a function to add text with printf syntax. 2005-06-07 Eduardo M Kalinowski * worldgui.c: The page up/down and ctrl+end keys for scrolling now work again. * ansitextview.c, kildclient.h, worldgui.c: When the scrollbar is not positioned at the end, new text does not cause scrolling to the end, unless the Scroll Output option is active. * kildclient.h, net.c, worldgui.c: Lines that do not arrive complete in the first time are now printed correctly again. * we_fonts.c, worldgui.c: The font of the text view can be configured. * kildclient.h, net.c: Incoming data now has all its newlines, in whatever format, changed into just \n. This eases processing, and removes a bug that printed some blank lines in the new TextView. * parser.c: Corrected a wrong call to one of the ansi text adding functions. * aliases.c, ansitextview.c, hooks.c, kildclient.h, macros.c, mainwindow.c, net.c, perlscript.c, timers.c, triggers.c, worldgui.c: The text now scrolls to end when some more text is received. * ansitextview.c: New file. * Makefile.am, aliases.c, ansitextview.c, hooks.c, kcvte.c, kcvte.h, kildclient.h, macros.c, mainwindow.c, net.c, parser.c, perlscript.c, timers.c, triggers.c, we_colors.c, we_fonts.c, we_misc.c, worldgui.c, worldselector.c: Removed the vte and changed it for a TextView, but it still barely works. 2005-06-06 Eduardo M Kalinowski * Makefile.am, kildclient.h, we_back.c, worldeditor.c, worldgui.c, worlds.c: Removed the Background section of the World Editor, as the textview does not support that. * log.c: The LOG ENDED message now appears in its own line. 2005-06-05 Eduardo M Kalinowski * hooks.c, parser.c, perlscript.c, plugins.c, triggers.c: Corrected some problems that caused build failures for some versions of the Perl library. 2005-06-04 Eduardo M Kalinowski * kildclient.h, net.c: The Telnet IAC processor is now more robust. 2005-05-31 Eduardo M Kalinowski * kildclient.glade: Updated version to 1.3.1. 2005-05-27 Eduardo M Kalinowski * kildclient.glade: Updated version to 1.3.0. * main.c: Corrected typos in some strings. 2005-05-27 Eduardo M Kalinowski * kildclient.glade: Updated version to 1.3.0. * main.c: Corrected typos in some strings. 2005-05-27 Eduardo M Kalinowski * main.c: Corrected typos in some strings. 2005-05-26 Eduardo M Kalinowski * log.c, worlds.c: Corrected bugs regardling logging: binary characters are not printed anymore, and the Log Ended message is now printed correctly. * aliases.c, triggers.c: The debug information for matched triggers and aliases is now more clear and informative. 2005-05-23 Eduardo M Kalinowski * kildclient.h, net.c, worldgui.c: KildClient now supports the Telnet NAWS option to inform its window size to the server. 2005-05-22 Eduardo M Kalinowski * aliases.c, kildclient.h, perlscript.c, perlscript.h, worlds.c: The substitution of aliases can now be evaluated as a Perl statement (using the s//e construct). See the manual for more details. 2005-05-20 Eduardo M Kalinowski * worldgui.c: Corrected bug in the removal of old commands from the command history. 2005-05-17 Eduardo M Kalinowski * we_input.c, worldgui.c: Corrected bug that caused the recent command history list to get bigger than its determined size, and never stop growing. * kildclient.h, main.c, mainwindow.c, net.c, perlscript.c, wndmain.glade, worldgui.c, worlds.c, worldselector.c: Added an option to go offline when disconnected from a World, so that you can still see the window and run Perl commands and plugins. 2005-05-13 Eduardo M Kalinowski * kildclient.h, simocombobox.c, simocombobox.h, we_input.c, worldgui.c, worlds.c: Changed the behaviour of the command history to work more similarly to the functionality provided by the libhistory library (but we are not using this library). 2005-05-12 Eduardo M Kalinowski * worlds.c: Bug fixed: timers with names now have this name loaded correctly upon loading a world. 2005-05-09 Eduardo M Kalinowski * wndmain.glade: Corrected icon for menu, that was wrong because of last commit. 2005-05-06 Eduardo M Kalinowski * aliases.c, kildclient.h, mainwindow.c, triggers.c, wndmain.glade: Added an option to display (in stderr) information about matched triggers and aliases. 2005-05-04 Eduardo M Kalinowski * Makefile.am, kildclient.glade, kildclient.h, main.c, mainwindow.c, net.c, perlscript.c, we_fonts.c, we_statusbar.c, wndmain.glade, worldeditor.c, worldgui.c, worlds.c: Merged the statusbar branch, bringing its new features into HEAD. * kildclient.glade, kildclient.h, net.c, we_statusbar.c, worldgui.c, worlds.c: The behavior of the idle time counter can be configured now. * worldgui.c: Removed the frame around the main status bar text. It looks nicer this way. 2005-05-02 Eduardo M Kalinowski * mainwindow.c: Corrected little bug in the time display. * Makefile.am, kildclient.glade: The format of the time counters can now be changed. * we_statusbar.c: New file. * kildclient.h, mainwindow.c, we_fonts.c, we_statusbar.c, worldeditor.c, worlds.c: The format of the time counters can now be changed. 2005-05-01 Eduardo M Kalinowski * kildclient.h, main.c, mainwindow.c, net.c, worldgui.c: Added a connection and idle time counter to the status bar. 2005-04-30 Eduardo M Kalinowski * kildclient.glade, kildclient.h, we_fonts.c, worldgui.c, worlds.c: The status bar font can now be changed. * kildclient.h, mainwindow.c, perlscript.c, wndmain.glade, worldgui.c: Removed the stock GtkStatusBar widget and recreated one equal (or very similar :-) ) using an hbox and a label, in order to be able to futurely do more things with it. 2005-04-28 Eduardo M Kalinowski * kildclient.h, main.c, mainwindow.c, net.c, worldselector.c: It is now possible to specify one or more Worlds in the command line and have them opened automatically. 2005-04-26 Eduardo M Kalinowski * net.c: When sending something to the server that contains the Telnet IAC character, that character is now correctly escaped. * main.c: SIGPIPE signals are ignore, so the program does not crash anymore if we try to write to a closed connection (which could happen during some Telnet option negotiation). 2005-04-25 Eduardo M Kalinowski * net.c: KildClient now identifies itself using the Telnet TERMINAL TYPE option. 2005-04-20 Eduardo M Kalinowski * kildclient.glade: Updated version to 1.2.0. 2005-04-19 Eduardo M Kalinowski * mainwindow.c, net.c: Corrected bug that prevented $world->close from exiting the program when called in the last open world. 2005-04-17 Eduardo M Kalinowski * hooks.c, kildclient.h, net.c, perlscript.c, worlds.c: Added a new hook, OnSentCommand, run after a command is sent to the world. 2005-04-16 Eduardo M Kalinowski * worlds.c: Corrected bug that caused a segfault when a plugin tried to modify (including deleting) a trigger, timer, etc in the UNLOAD function. Of course, this should not be done, which is why there is now a note in the manual about that. * net.c, perlscript.c: Corrected some small problems with the hook code. 2005-04-15 Eduardo M Kalinowski * hooks.c, kildclient.h, mainwindow.c, net.c, perlscript.c, worlds.c: Changed the way hooks work: they are now very much more similar to triggers, etc. 2005-04-11 Eduardo M Kalinowski * kildclient.h, net.c, perlscript.c, triggers.c, worlds.c: A new trigger mode has been added: rewriter triggers. Rewriter triggers run before normal triggers and can change the received line, so that further triggers work on the changed line. 2005-04-10 Eduardo M Kalinowski * net.c: Made a disconnected world be saved before another one is open if "Connect to Another" is selected. * worldselector.c: The list of save worlds is now shown sorted alphabetically. * kildclient.h, main.c, mainwindow.c, net.c, worldselector.c: Rewrote the code dealing with opening and closing worlds, especially the code to handle the "Reconnect, Open Another, Close" choice. The code is now much more clear and simple. 2005-04-09 Eduardo M Kalinowski * Makefile.am, kildclient.glade, kildclient.h, parser.c, we_input.c, we_misc.c, worldeditor.c, worlds.c: The command separator is now configurable, instead of being fixed as %;. * kildclient.h, main.c, mainwindow.c, net.c, worldselector.c: Corrected bug that caused two World Selector dialogs to appear when it was not possible to connect to the first world tried when the program started. * perlscript.c: Corrected reference counting of Perl objects in some cases. 2005-04-08 Eduardo M Kalinowski * perlscript.c: New functions, getversion() and $world->getpluginversion() to return the version of KildClient or of a given plugin. 2005-04-02 Eduardo M Kalinowski * perlscript.c: New funtions $world->getmainfont() and $world->getentryfont() to return the font used in the main screen or command entry box, respectively. * kildclient.h, net.c: KildClient now supports MCCP (Mud Client Compression Protocol) version 1 and 2. This protocol, supported by several servers, compresses that sent by the server, thus reducing greatly the bandwidth used. 2005-03-31 Eduardo M Kalinowski * aliases.c, kildclient.h, macros.c, mainwindow.c, timers.c, triggers.c, wndmain.glade: It is now possible to temporarily disable all triggers (or aliases, or timers, or macros) via the menu. 2005-03-29 Eduardo M Kalinowski * perlscript.c: A new function, $world->getname(), has been added. This function returns the name of the world. * kildclient.h, plugins.c, worlds.c: KildClient now calls a plugin's UNLOAD function when the plugin is unloaded, so that it can dispose of anything it needs. * worldselector.c: Bug fixed: KildClient does not crash anymore if the last open world is not present in the configuration file. 2005-03-28 Eduardo M Kalinowski * perlscript.c: When a plugin uses a permanent variable, there will not be warnings about the variable being permanent (or about it being defined, in the first time) when the plugin is loaded. * mainwindow.c, worlds.c, worldselector.c: Removed some more memory leaks. 2005-03-27 Eduardo M Kalinowski * worlds.c, worldselector.c: Removed a couple memory leaks from the code. 2005-03-25 Eduardo M Kalinowski * kildclient.glade: Updated version to 1.1.2. * net.c: Removed a memory leak when processing triggers. 2005-03-25 Eduardo M Kalinowski * net.c: Removed a memory leak when processing triggers. 2005-03-24 Eduardo M Kalinowski * perlscript.c: Avoided some warnings when compiling with optimization. 2005-03-24 Eduardo M Kalinowski * perlscript.c: Avoided some warnings when compiling with optimization. 2005-03-23 Eduardo M Kalinowski * kildclient.h, net.c, perlscript.c: Corrected some type usages that caused warnings (and possibly errors) when compiling in different architectures. 2005-03-20 Eduardo M Kalinowski * mainwindow.c: Corrected bug that caused segfaults when a world was closed and removed and the window lost focus. * aliases.c, hooks.c, kildclient.glade, kildclient.h, log.c, macros.c, main.c, net.c, parser.c, perlscript.c, permanentvariables.c, plugins.c, prefs.c, timers.c, triggers.c, we_advanced.c, we_back.c, we_colors.c, we_fonts.c, we_general.c, we_misc.c, we_scripting.c, worldeditor.c, worlds.c, worldselector.c: Merged the world_editor_glade branch, thus bringing the Glade-ified World Editor the the main trunk. 2005-03-20 Eduardo M Kalinowski * mainwindow.c: Corrected bug that caused segfaults when a world was closed and removed and the window lost focus. * aliases.c, hooks.c, kildclient.glade, kildclient.h, log.c, macros.c, main.c, net.c, parser.c, perlscript.c, permanentvariables.c, plugins.c, prefs.c, timers.c, triggers.c, we_advanced.c, we_back.c, we_colors.c, we_fonts.c, we_general.c, we_misc.c, we_scripting.c, worldeditor.c, worlds.c, worldselector.c: Merged the world_editor_glade branch, thus bringing the Glade-ified World Editor the the main trunk. 2005-03-19 Eduardo M Kalinowski * kildclient.glade: Added keyboard accelerators to the World Editor. * aliases.c, timers.c, triggers.c: Bug fixed: avoided duplicate creation of plugin timers when the plugin is loaded from a script file, and removed duplicate calculation of some trigger and alias REs. * perlscript.c: Bug fixed: plugins loaded after the world has been loaded (ie, not from a script file) now work correctly. 2005-03-18 Eduardo M Kalinowski * kildclient.glade: The Password field in the World Editor now hides the text with * again. * kildclient.glade: Bug fixed: the Preferences dialog now displays correctly when opened. * mainwindow.c: Bug fixed: when the last world is disconnected, "Connect to another world is selected" and then "Cancel" is clicked, the program now exits correctly instead of keeping an open window. * worldselector.c: Bug fixed: when deleting a world, all its files are deleted, not only the .wrl file. (And removed a small memleak there.) * mainwindow.c: Corrected bug that caused segfault when a OnConnect hook and aliases existed in a World. * kildclient.h, prefs.c: The colorNames variable is not global anymore, since this is not necessary anymore. * kildclient.glade, kildclient.h, we_advanced.c, worldeditor.c: Moved the Advanced section of the World Editor to Glade. * kildclient.glade, we_back.c, we_scripting.c, worldeditor.c: Moved the Scripting section of the World Editor to Glade. * kildclient.glade, kildclient.h, we_back.c, worldeditor.c: Moved the Background section of the World Editor to Glade. * kildclient.glade, kildclient.h, we_colors.c, worldeditor.c: Moved the Colors section of the World Editor to Glade. * we_general.c, we_misc.c: Corrected style errors in C function definition. * kildclient.glade: Removed the dummy dialog in the Glade file that used to hold the General section of the World Editor. * kildclient.glade, kildclient.h, we_fonts.c, we_misc.c, worldeditor.c: Moved the Fonts section in the World Editor to Glade. 2005-03-17 Eduardo M Kalinowski * kildclient.glade, kildclient.h, we_general.c, worldeditor.c: Moved the "General" section of the World Editor to glade. 2005-03-16 Eduardo M Kalinowski * aliases.c, hooks.c, kildclient.glade, kildclient.h, log.c, macros.c, main.c, net.c, parser.c, perlscript.c, permanentvariables.c, plugins.c, timers.c, triggers.c, we_advanced.c, we_back.c, we_colors.c, we_fonts.c, we_general.c, we_misc.c, we_scripting.c, worldeditor.c, worlds.c, worldselector.c: Moved the World Editor dialog to Glade (but not yet the panels). * net.c: Bug fixed: when the MUD sends lot of text at once, KildClient does not lock until all the text has been received, and does not show it all at once anymore. 2005-03-15 Eduardo M Kalinowski * kildclient.h, net.c, worlds.c: Bug fixed: the anti-flood mechanism now works even with several open worlds. * perlscript.c: qr<> is now used (instead of qr//) to precompute Regexps, this should avoid problems with triggers/aliases containing slashes. 2005-03-14 Eduardo M Kalinowski * aliases.c, kildclient.h, mainwindow.c, perlscript.c, perlscript.h, triggers.c: Optimized regexp matching in triggers and aliases by precomputing them. * worldselector.c: Bug fixed: when a world was openend by connecting directly to it, or when the last open world does not exist anymore, there is not a GTK warning anymore. 2005-03-13 Eduardo M Kalinowski * mainwindow.c: Corrected a bug that caused some worlds to be marked with new text and not be unmarked when focused. * kildclient.h, worldgui.c: Corrected another bug regarding the arrow keys to retrieve previous commands. (And made the code slightly better.) 2005-03-12 Eduardo M Kalinowski * worldgui.c: Bug fixed: pressing up arrow to retrieve the last command now correctly retrieves it in all cases. * kildclient.h, main.c, mainwindow.c, perlscript.c: Bug fixed: $world->setstatus now works even if the window does not have focus when the function is called. 2005-03-11 Eduardo M Kalinowski * kildclient.h, mainwindow.c, perlscript.c: Added a getmenubar() function to get a pointer to the menu bar, to be used in Gtk-Perl. Unfortunately, this causes problems when loading other worlds. * kildclient.glade: Updated version to 1.1.1 * kildclient.h, perlscript.c: Made some modifications to plugins: - Syntax: no need to include the file in a block anymore; - loadplugin() does not consider the plugin as loaded if there was an error in the file or die() was called; - requireplugin(), a new funcion to make sure a plugin is present, or abort if it cannot be loaded. 2005-03-10 Eduardo M Kalinowski * wndmain.glade: Changed the keys used to move between worlds to Alt+Arrows because Ctrl+arrows was used to move between words in the command entry box. * kildclient.glade: Corrected bug that caused the About dialog to be displayed only in the first time it was requested. 2005-03-09 Eduardo M Kalinowski * kildclient.h, main.c, mainwindow.c, net.c, perlscript.c, worldselector.c: Changed the way "Connect to Another World" is handled when a world is disconnected, so that ir is just removal of the world followed by opening another. The code, however, is still rather messy in that part. 2005-03-08 Eduardo M Kalinowski * worldgui.c: Changed the regular expression for URLs again, this time it should work well. 2005-03-05 Eduardo M Kalinowski * Makefile.am, kildclient.h, mainwindow.c, wndmain.glade, worldgui.c: Added a menu item in the Help menu to open the HTML Manual. * Makefile.am, kildclient.glade, mainwindow.c, wndmain.glade, wndmain.gladep: Moved wndMain to a separate Glade file. * worldgui.c: Changed the URL regexp to allow URLs with anchors and non-standard ports, and to recognized https and ftp links. 2005-03-04 Eduardo M Kalinowski * kcvte.c, kcvte.h, kildclient.glade, kildclient.h, prefs.c, worldgui.c: Added support to open or copy to the clipboard URLs that appear in the MUD window. 2005-02-17 Eduardo M Kalinowski * kildclient.glade: Updated message strings. * kildclient.glade: Changed the version to 1.1.0. * kildclient.h, perlscript.c: It is now possible to specify the author of the plugin. * aliases.c: Corrected bug that caused segfault in listplugin. * Makefile.am, aliases.c, kildclient.h, macros.c, perlscript.c, plugins.c, timers.c, triggers.c, worlds.c: Added support for plugins. 2005-02-13 Eduardo M Kalinowski * aliases.c, kildclient.h, macros.c, perlscript.c, triggers.c, worlds.c: Triggers, etc. can now have names for easier usage, and for the creating of groups. 2005-02-01 Eduardo M Kalinowski * kildclient.h, net.c, perlscript.c, triggers.c, worlds.c: Added the option for triggers to also gag the line from the log file, and a couple of functions to write text to the log file. 2005-01-28 Eduardo M Kalinowski * perlscript.c: Added the $world->commandecho() function to get or set the status of the command echo option, and the $world->sendecho() and $world->sendnoecho() to send with or without echo, respectively, regardless of that option. * perlscript.c: Added a getwindowsize() function to return the current size of the window. * perlscript.c: Corrected bug that caused the $world->prev function to fail sometimes. 2005-01-27 Eduardo M Kalinowski * kildclient.glade, mainwindow.c: Added menus (and shortcuts) to move between worlds to the menu. * kildclient.h, mainwindow.c, perlscript.c: The crashes that happened some times when a menu item is selected should not happen anymore. 2005-01-10 Eduardo M Kalinowski * kildclient.h, mainwindow.c, prefs.c, worldselector.c: The World Selector now opens with the last world that was opened initially selected. 2005-01-09 Eduardo M Kalinowski * kildclient.h, main.c, mainwindow.c, multilinesend.c, perlscript.c, prefs.c, we_misc.c: Changed the way the support files are found under Windows. 2005-01-07 Eduardo M Kalinowski * kildclient.h, main.c, net.c, prefs.c, we_advanced.c, worlds.c, worldselector.c: Under Windows, KildClient now stores its Worlds and settings under the user's Application Data directory. 2005-01-05 Eduardo M Kalinowski * main.c, perlscript.c, perlscript.h: The Perl system is now initialized only once, and it doesn't crash anymore under cygwin. * mainwindow.c: Added some things so that detection of a closed connection can be detected under cygwin. 2005-01-04 Eduardo M Kalinowski * kildclient.h, mainwindow.c, multilinesend.c, prefs.c, we_misc.c: Added G_MODULE_EXPORT to signal functions called by glade, so that they work with glade_signal_autoconnect() under cygwin. * perlscript.c: Changed something to avoid a segfault under cygwin. * worldselector.c: Added a workaround for a weird behaviour of glob() under cygwin. 2004-12-30 Eduardo M Kalinowski * Makefile.am, kcvte.c, kcvte.h, mainwindow.c, net.c, parser.c, perlscript.c, worldgui.c: Removed \r\n from messages, the newline is now added by a function instead of being included directly in the message. * worlds.c: Corrected a bug that didn't save permanent hash variable names correctly. 2004-12-27 Eduardo M Kalinowski * perlscript.c: Corrected a message that used \n\r instead of \r\n. 2004-12-26 Eduardo M Kalinowski * kildclient.glade: Changed all version references to 1.0.0. 2004-12-24 Eduardo M Kalinowski * perlscript.c: Corrected bug in the functions for adding triggers, aliases, macros and timers. The last one was not working, but works now. 2004-12-20 Eduardo M Kalinowski * kildclient.glade, mainwindow.c, prefs.c: Corrected some wrong behaviours of some dialogs. * kildclient.glade: Changed a label that was wrong in the Preferences dialog. * permanentvariables.c: Corrected the bug that did not save non-ASCII characters in permanent variables, for strings and arrays. * net.c: Corrected a bug that caused some invalid characters to be printed in the log file. 2004-12-11 Eduardo M Kalinowski * mainwindow.c, worlds.c: Corrected a bug that caused new text notifications not to be erased when the world is closed. 2004-11-28 Eduardo M Kalinowski * perlscript.c: Added echos to report success of several functions. * kildclient.glade, mainwindow.c: Moved the main window to Glade, and added accelerators for some menu functions. Unfortunatelly, there seems to be a bug in libglade that does not load accelerators for stock menu items. * kildclient.glade, mainwindow.c, perlscript.c: Added a $world->save() function to save the current world. * mainwindow.c: Corrected some menus that were not working. 2004-11-27 Eduardo M Kalinowski * perlscript.c: Removed newlines from the string before matching for triggers. It now seems to work well. 2004-11-26 Eduardo M Kalinowski * kildclient.h, net.c: Corrected the behaviour of triggers and incomplete lines: now a line is only matched for triggers when it is complete. * parser.c: Corrected a nasty bug that caused some sent commands not to work. 2004-11-25 Eduardo M Kalinowski * kildclient.glade, kildclient.h, mainwindow.c, prefs.c: The position of the tabs can now be configured. * kildclient.glade, prefs.c: Moved the Preferences dialog (well, almost) to Glade. 2004-11-24 Eduardo M Kalinowski * Makefile.am, aliases.c, hooks.c, kildclient.glade, kildclient.h, log.c, macros.c, main.c, mainwindow.c, multilinesend.c, net.c, parser.c, perlscript.c, perlscript.h, permanentvariables.c, prefs.c, timers.c, triggers.c, we_advanced.c, we_back.c, we_colors.c, we_fonts.c, we_general.c, we_misc.c, we_scripting.c, worldeditor.c, worldgui.c, worlds.c, worldselector.c: Merged the changes from the multi_worlds_branch into the main trunk. 2004-11-22 Eduardo M Kalinowski * perlscript.c: Renamed the prevw, nextw and closew functions to prev, next and close, respectively. 2004-11-20 Eduardo M Kalinowski * mainwindow.c, perlscript.c, perlscript.h: Changed the syntax of many Perl funcions. They are now methods of the class World. Each interpreter has a $world global variable that represents the current world. 2004-11-19 Eduardo M Kalinowski * perlscript.c: Perl now correctly recognizes strings from triggers as UTF-8. 2004-11-18 Eduardo M Kalinowski * main.c, mainwindow.c, net.c, worlds.c, worldselector.c: Corrected some bugs in connection. Hopefully all of them. 2004-11-17 Eduardo M Kalinowski * kildclient.h, mainwindow.c, perlscript.c, worldgui.c: The status bar text is now individual per world. 2004-11-16 Eduardo M Kalinowski * mainwindow.c: The Perl interpreter is now created at the right time and correctly set during world creating so that commands in the script file are run correctly. 2004-11-15 Eduardo M Kalinowski * worldselector.c: Corrected bugs when using the "Connect to another world" option after disconnecting from a world. * kildclient.glade, kildclient.h, mainwindow.c, net.c, perlscript.c: Added a closew function to disconnect and close the current world, and a menu to do the same thing. 2004-11-14 Eduardo M Kalinowski * kildclient.h, mainwindow.c, perlscript.c: Added functions for moving between open worlds: nextw, prevw and gotow. * permanentvariables.c: Corrected bug that caused segfaults on /quit under certain circunstances. 2004-11-12 Eduardo M Kalinowski * hooks.c, kildclient.h, net.c: Corrected a bug that prevented a OnReceivedText hook to send text to the world. * hooks.c, kildclient.h, mainwindow.c, net.c, perlscript.c, timers.c: Corrected the bug that sent commands to the wrong world with timers, triggers and hooks. * kildclient.h, main.c, mainwindow.c, worldselector.c: Removed the reconnecting parameter from connect_to(). The new connected_at_least_once parameter does the same job, much better. * kildclient.h, mainwindow.c: Corrected bug that cause segfaults on reconnections in certain circunstances. * mainwindow.c: There was a problem when opening new worlds, the window needed to be resized for the vte to appear correctly (regarding scrolling). This has been fixed. * kildclient.h, main.c, mainwindow.c, net.c, we_general.c, worlds.c, worldselector.c: Added back notification of new text in the worlds. 2004-11-11 Eduardo M Kalinowski * perlscript.c: Bug fix: editing a timer to change its interval now works correctly. * main.c: On quitting with worlds open (with calling /quit, for example) all worlds are saved instead of only the active one. * mainwindow.c: Corrected a bug that caused timers to be duplicated when reconnecting to a world. * aliases.c, hooks.c, kildclient.h, log.c, macros.c, main.c, mainwindow.c, multilinesend.c, net.c, parser.c, perlscript.c, perlscript.h, permanentvariables.c, prefs.c, triggers.c, we_advanced.c, we_back.c, we_colors.c, we_fonts.c, we_general.c, we_misc.c, we_scripting.c, worldeditor.c, worldgui.c, worlds.c, worldselector.c: Now each world has its own Perl interpreter. 2004-11-10 Eduardo M Kalinowski * we_back.c, we_colors.c, we_fonts.c, we_misc.c: Corrected bug that caused segfaults when editing worlds from the World Selector. * kildclient.h, mainwindow.c, net.c, worlds.c, worldselector.c: Worlds can now be closed properly. Removed temporarily the notification of new text, since it was causing problems and needs to be reworked anyway. * net.c: Removed unused variable that was causing a warning. * mainwindow.c, net.c: Corrected the silliest bug ever: the timeout for printing incomplete lines was set to 200us instead of 200ms. I've also made some other changes to try to avoid the problem of incomplete lines being printed. 2004-11-08 Eduardo M Kalinowski * kildclient.h, net.c, triggers.c: The full line that matched a trigger, including ANSI sequences, is now saved in the variable $colorline for use in scripts. * kildclient.glade, kildclient.h, main.c, mainwindow.c, worldgui.c, worldselector.c: Added the hability to open several worlds, but many things still need to be fixed. 2004-11-07 Eduardo M Kalinowski * worldselector.c: Corrected a bug that caused segfaults when pressing Quit from the World Selector. * kildclient.h, mainwindow.c, net.c, worldgui.c: The name of the world is now shown in the notebook tab, and not in the window title. * Makefile.am, kildclient.h, main.c, mainwindow.c, net.c, parser.c, perlscript.c, we_back.c, we_colors.c, we_fonts.c, we_misc.c, worldgui.c, worldselector.c: Created a structure WorldGUI containing the widgets that comprise a world's interface: basically, the vte and the entry box. Changed where necessary to use this new structure. * worldgui.c: New file. 2004-11-06 Eduardo M Kalinowski * perlscript.c: Perl is now told that the expected encoding for scripts is UTF-8. * mainwindow.c: Added a notebook that will contain each world's terminal and entry box. 2004-11-05 Eduardo M Kalinowski * worldselector.c: Removed references to currentWorld in the disconnected message box code, and this can also be considered a bug fix and not only a preparation for multiple worlds support. * worlds.c: Removed references to currentWorld in the command history saving code, and this can be considered a bug fix and not only a preparation for multiple worlds support. * kildclient.h, mainwindow.c, timers.c: Removed references to currentWorld in the timer system. * kildclient.h, mainwindow.c, net.c: Removed references to currentWorld in the auto-logon code. * net.c: Removed references to currentWorld in the code for handling of connection closing. * macros.c: Removed a reference to currentWorld in the macro system. * kildclient.h, log.c, main.c, net.c, perlscript.c: Removed dependencies of currentWorld in the logging system. * aliases.c, hooks.c, kildclient.h, macros.c, mainwindow.c, multilinesend.c, net.c, parser.c, perlscript.c, timers.c, triggers.c, worlds.c: Changed the received text buffers to be per-world instead of global, and this caused a lot of other changes. 2004-11-04 Eduardo M Kalinowski * triggers.c: Rewrote the ANSI sequence stripped code as a finite state machine, this should prevent problems happening from incomplete ANSI sequences. * net.c: Rewrote the telnet IAC sequence processing code as a finite state machine, this should prevent problems happening from incomplete IAC sequences. 2004-11-02 Eduardo M Kalinowski * perlscript.c: Removed memory leaks in functions for creating triggers, aliases, etc. * we_misc.c: Corrected a bug that cause Gtk-Warnings when configuring the auto-completion of a world from the World Selector. * mainwindow.c: Made a little correction for the bug that happened when a connection failed but in the next try it worked. * Makefile.am, hooks.c, kildclient.h, mainwindow.c, net.c, perlscript.c, worlds.c: Added support for hooks. 2004-11-01 Eduardo M Kalinowski * kildclient.glade, kildclient.h, mainwindow.c, we_misc.c, worlds.c: Auto-completion can be disabled, or it can be configure to start only after a certain number of characters have been typed. 2004-10-30 Eduardo M Kalinowski * Makefile.am, kildclient.h, main.c, mainwindow.c, perlscript.c, perlscript.h, permanentvariables.c, worlds.c, worldselector.c: Variables can now be made permanent, that is, their values are saved when the world is closed and loaded again when the world is opened. 2004-10-29 Eduardo M Kalinowski * Makefile.am, mainwindow.c, simocombobox.c, simocombobox.h, util_cursor.h: A custom widget, SimoComboBox by Todd A. Fisher, is now used instead of GtkComboBoxEntry for the command entry. This combo box will only display a few entries below the entry box when poped down, and has command completion. 2004-10-27 Eduardo M Kalinowski * kildclient.h, main.c, worlds.c, worldselector.c: The history of entered commands is now saved on exit and loaded again when the world is loaded. * mainwindow.c: Removed a memory leak. * kildclient.glade, kildclient.h, mainwindow.c, we_misc.c, worlds.c: The history of recent commands is now per-world (even if only one world can be open at a time), and the number of commands to be kept can be configured. 2004-10-26 Eduardo M Kalinowski * kildclient.glade, we_misc.c: Moved the Miscellaneous panel of the world editor dialog to glade. 2004-10-25 Eduardo M Kalinowski * mainwindow.c: Added a "clear" button to the left of the command entry box, to clear the entire command entry box. * mainwindow.c: The command entry is not a Combo Box, and previous commands can be recalled easily by popping it down. 2004-10-23 Eduardo M Kalinowski * net.c: There is now checking for errors in the conversion of commands from UTF-8 to the mud encoding. The program will not crash anymore if an invalid character is entered. 2004-10-22 Eduardo M Kalinowski * kildclient.glade, multilinesend.c: Added more features to the multi-line send: now you can send some text, a file, and more text. * perlscript.c: The echo function now outputs to stdout if currentWorld is NULL (as is the case when the script file is loaded), preventing segfaults if echo is called there, or if there are warnings. * kildclient.glade, multilinesend.c: Converted the Multi-line Send dialog to Glade. * kildclient.glade, mainwindow.c: Moved the menus to Glade. * Makefile.am, kildclient.glade, kildclient.gladep, mainwindow.c: Added an About box... using libglade! 2004-10-21 Eduardo M Kalinowski * worlds.c: Some optimizations in the XML parsing code. * worldselector.c: The error message for a world that cannot be loaded from a file is not printed when generating the list of worlds. * perlscript.c: Corrected a little display error in the listtimer function. * perlscript.c, worlds.c: Made some corrections and changes to warnings used, the number of translatable strings should now be smaller (and also the program size.) * mainwindow.c, net.c, perlscript.c: Changed all occurrences of \n\r to the correct \r\n. 2004-10-20 Eduardo M Kalinowski * kildclient.h, multilinesend.c, net.c: When using the multi-line send feature, a text can be added to the start and/or end of each line. * Makefile.am, kildclient.h, mainwindow.c, multilinesend.c, net.c: Added a function to send multiple lines to the world. 2004-10-17 Eduardo M Kalinowski * kildclient.h, prefs.c, worlds.c: Corrected a bug: now the .kildclient directory is created if necessary before a world is saved. * parser.c: Corrected a bug: aliases that include %; now correctly split the commands defined inside. * parser.c: Changed the parser to be smarter. Now when %; is seen inside a quote string, it is not interpreted as a command separator. This allows aliases, and the like to be defined and include a %; inside. 2004-10-16 Eduardo M Kalinowski * aliases.c, kildclient.h, macros.c, mainwindow.c, perlscript.c, timers.c, triggers.c, worlds.c: Removed a huge memory leak when changing worlds. 2004-10-15 Eduardo M Kalinowski * worldeditor.c: Changed from that ugly and poorly functional GtkFileChoose to a GtkFileSelector, that looks better and works better. * we_back.c: Corrected a bug that caused the program to try to set the background image even when there was no vte yet. * Makefile.am, kildclient.h, mainwindow.c, we_back.c, we_scripting.c, worldeditor.c, worlds.c: The background of the terminal can be configure to be solid, transparent, or to show an image. 2004-10-14 Eduardo M Kalinowski * aliases.c, main.c, mainwindow.c, parser.c, perlscript.c, perlscript.h, timers.c, triggers.c: Removed a conflict between _ used for gettext and _ used in Perl headers (for prototypes...). This removed warnings from compilation, and also made internationalization work again. * perlscript.c: Added a minimize Perl function to minimize the main window. * kildclient.h, mainwindow.c, net.c, prefs.c, we_misc.c, worlds.c: Some more settings (scrolling, command echo, command repetition) are also now set on a per-mud basis. 2004-10-13 Eduardo M Kalinowski * Makefile.am, kildclient.h, mainwindow.c, prefs.c, we_fonts.c, worldeditor.c, worlds.c: The fonts can now be set on a per-world basis, and not globally anymore. 2004-10-12 Eduardo M Kalinowski * Makefile.am, kildclient.h, mainwindow.c, prefs.c, we_colors.c, worldeditor.c, worlds.c, worldselector.c: Colors can now be configured on a per-world basis, instead of globally. * Makefile.am, kildclient.h, we_advanced.c, we_general.c, we_misc.c, we_scripting.c, worldeditor.c: Moved each category of the World Editor dialog to a separate file. * worldeditor.c: Changed the layout of the World Editor dialog: not it has a list box on the left to select the categories, instead of a notebook with tabs. 2004-10-11 Eduardo M Kalinowski * worlds.c: Minor optimizations in the XML parser. * Makefile.am, kildclient.h, macros.c, mainwindow.c, perlscript.c, worlds.c: Added support for macros. * log.c: Corrected little bug that cause segfaults. 2004-10-08 Eduardo M Kalinowski * kildclient.h, mainwindow.c, net.c, worldeditor.c, worlds.c: Added an auto-login feature. 2004-10-07 Eduardo M Kalinowski * log.c: Changed the logging function to convert from \r\n (or \n\r) to only \n, and to add a newline to the end of all lines, even if they do not have one. * net.c: Corrected a bug in the splitting of received lines. 2004-10-05 Eduardo M Kalinowski * Makefile.am, kildclient.h, log.c, main.c, mainwindow.c, net.c, perlscript.c, perlscript.h: Added support for logging output. 2004-10-02 Eduardo M Kalinowski * mainwindow.c: Changed End to CTRL-End to go to the bottom of the terminal, because End was already too useful to move to the end of the edit box. * kildclient.h, net.c, prefs.c: Added an option to prevent sent commands from being echoed in the main window. * mainwindow.c: The END key can now be used to scroll back to the end of the output. 2004-10-01 Eduardo M Kalinowski * net.c: Messages are now printed to the terminal to show the status of the connection. * kildclient.h, mainwindow.c, perlscript.c: Added a status bar to the main window, and the hability to set the text displayed there via a Perl function. * perlscript.c: Reorganized the order of the functions, so as not to require predeclaration of the XS functions. * ansi.h: Corrected a little bug that caused command echoes (and possibly other messages) to appear in the wrong color. 2004-09-30 Eduardo M Kalinowski * perlscript.c: Corrected a bug in the trigger matching. * kildclient.h, net.c, worldeditor.c, worlds.c, worldselector.c: Added an anti-flooding mechanism that prevents a given number of commands from being executed in sequence. 2004-09-24 Eduardo M Kalinowski * mainwindow.c: Page Up and Page Down keys can now be used to scroll the terminal window. * perlscript.c: Modified the way the matching function is done to use <> as delimiters instead of /, to ease the inclusion of / in patterns. * kildclient.h, net.c, perlscript.c, triggers.c, worlds.c: Added a flag "keepexecuting" to triggers. When on, the trigger matching does not prevent other triggers from being tried. 2004-09-23 Eduardo M Kalinowski * Makefile.am, aliases.c, kildclient.h, parser.c, perlscript.c, perlscript.h, worlds.c: Added support for aliases. * worlds.c: Corrected bugs in the saving of worlds. * worldeditor.c: Corrected an error in the labels in the world editor ("Name" and "Perl file to load" were switched). 2004-09-22 Eduardo M Kalinowski * kildclient.h, perlscript.c, triggers.c, worlds.c: Triggers can now be enabled or disabled. * perlscript.c: Added a help function that displays help on commands. * Makefile.am, kildclient.h, mainwindow.c, perlscript.c, timers.c, worlds.c: Added support for timers. 2004-09-20 Eduardo M Kalinowski * perlscript.c: Removed memory leak in the deletion of a trigger. 2004-09-19 Eduardo M Kalinowski * kildclient.h, mainwindow.c: The selected portion of the command entry is saved and restored when the windows is focused again. * kildclient.h, mainwindow.c, net.c: Added notification of new text in the world. * worlds.c: Corrected a bug that sometimes caused a segfault when presenting the world selector dialog. * main.c: Corrected a bug that caused a segfault on exit (and prevented the preferences from being saved). * worlds.c: Minor code readability otimization in the world saving function. * worlds.c: Corrected bug that saved gags without actions incorrectly. * kildclient.h, net.c, perlscript.c, triggers.c, worlds.c: Triggers can now be marked to gag the line that triggered them. 2004-09-18 Eduardo M Kalinowski * kildclient.h, mainwindow.c: Corrected a bug that prevented the window size to be saved when the program was exited by closing the main window. * kildclient.h, net.c, perlscript.c: Corrected a bug that caused segfaults when /dc was used to disconnect and connect to another world. * parser.c, perlscript.c: The handling of errors and warnings in Perl is now much better. * perlscript.c: Added the possibility of editing and deleting triggers, and also a command to list the currently defined triggers. * kildclient.h, net.c, perlscript.c, perlscript.h, triggers.c, worlds.c: Added support for triggers, with a trigger Perl command to add them. 2004-09-17 Eduardo M Kalinowski * Makefile.am, kildclient.h, perlscript.c, triggers.c: Added a stripansi function to Perl, to strip ANSI sequences of a string. 2004-09-16 Eduardo M Kalinowski * kildclient.h, main.c, mainwindow.c, perlscript.c, perlscript.h, worldeditor.c, worlds.c: A user-specified Perl file can now be run when a world is loaded, primarily to define functions. * worldeditor.c: The world editor is now divided in tabs. * worldeditor.c: Removed a possible memory leak in the code. * Makefile.am, worldeditor.c, worlds.c: Just some code organization in new functions and files. 2004-09-15 Eduardo M Kalinowski * worldselector.c: Corrected a small bug that tried to saved worlds that were created by directly entering the host and port. * kildclient.h, main.c, mainwindow.c, net.c, worldselector.c: Corrected a bug that caused gtk_main_quit to be called before the main loop was started. * main.c: Corrected a small bug that tried to saved worlds that were created by directly entering the host and port. * kildclient.h, net.c, worlds.c, worldselector.c: The Character Set to be used in each world can be configured. 2004-09-13 Eduardo M Kalinowski * net.c: Errors in charset conversion are now reported. * perlscript.c: Removed compiler warnings in some Perl subroutines. * kildclient.h, mainwindow.c, prefs.c: A new configurable option has been added, whether to use bold fonts or just highlight the ansi "bold" text. * kildclient.h, main.c, prefs.c: The window size and position is now saved on exit and restored on startup. * worldselector.c: Corrected a small bug that caused segfaults under certain circunstances. * kildclient.h, worlds.c, worldselector.c: Added proper reporting of errors in the XML file. 2004-09-12 Eduardo M Kalinowski * worldselector.c: Corrected a bug that caused a segmentation fault when quitting under certain circunstances. * kildclient.h, worlds.c, worldselector.c: Worlds are not stored in XML format. * main.c, mainwindow.c, worldselector.c: Worlds are not saved after you edit them anymore, but only when you ask them to be saved, or when the program ends, or when another world is loaded. * worldselector.c: Added the list of worlds to a Scrolled Window, for when there are many of them. 2004-09-11 Eduardo M Kalinowski * worlds.c: When generating the name of a file for the world, existing worlds are not overwritten. * mainwindow.c, worlds.c: Added menu commands to edit and save the current world. * kildclient.h, worlds.c, worldselector.c: Worlds can now be added, edited or deleted from the World Selector window. * worldselector.c: Added some error reporting that was missing from last commit. * Makefile.am, kildclient.h, mainwindow.c, prefs.c, worlds.c, worldselector.c: Added the hability to load save worlds from files. (But saving of worlds is still to come.) 2004-09-10 Eduardo M Kalinowski * kildclient.h, mainwindow.c, prefs.c: Some miscellaneous options have been added: scroll on output, lines to save in scrollback, and keep or no the last entered command. * kildclient.h, mainwindow.c, prefs.c: The default bold color can now also be changed. 2004-09-09 Eduardo M Kalinowski * kildclient.h, mainwindow.c, net.c, prefs.c: The colors can now be configured. 2004-09-08 Eduardo M Kalinowski * net.c: Corrected terminal output functions so that \r\n is recognized as a good line ending, and thus another \r is not sent anymore. * kildclient.h, mainwindow.c, net.c: KildClient now handles correctly Telnet IAC sequences sent by the server, even though the only one it honours is WILL ECHO, making passwords to be hidden. 2004-09-07 Eduardo M Kalinowski * kildclient.h, mainwindow.c, net.c, perlscript.c: Modified the terminal feed function so that it outputs \n\r even if only \n is received. * parser.c: Changes in parser: // allows commands starting with / to be sent to the world, and %; separates commands in a line. 2004-09-06 Eduardo M Kalinowski * Makefile.am, perlscript.c: A file is now read by Perl at startup, and functions are defined in this file. A echonl function, similar to echo, but adding automatically a newline in the end, has been added, as the first function actually defined in Perl. * perlscript.c: Added the Perl command "echo" to print something in the terminal window, without sending it to the world. * kildclient.h, mainwindow.c, prefs.c: The command entry box font can now be changed (and independently from the terminal font, because of its weird behaviour concerning font sizes.) 2004-09-05 Eduardo M Kalinowski * kildclient.h, mainwindow.c, perlscript.c: Added menu itens to disconnect from world and to quit the program. * kildclient.h, mainwindow.c, net.c, perlscript.c: Added dc and quit Perl commands to disconnect from world and quit KildClient, respectively. * mainwindow.c: The last 50 commands entered are now saved and can be recalled with the up and down arrows. * net.c: Small optimization in function flush_buffer(). * mainwindow.c, prefs.c: Corrected a few minor bugs in the handling of preferences. * Makefile.am, kildclient.h, mainwindow.c, net.c, prefs.c: The processing of received data is now line-oriented. Nothing great happens now yet, but this will help in the future. 2004-09-03 Eduardo M Kalinowski * Makefile.am, kildclient.h, main.c, mainwindow.c, prefs.c: The font can now be configured, and this configuration is saved. 2004-09-01 Eduardo M Kalinowski * Makefile.am, kildclient.h, main.c, mainwindow.c, parser.c, perlscript.c, worldselector.c: Removed gnome dependencies, now the application uses only GTK. * perlscript.c: Added documentation for the function. * Makefile.am, kildclient.h, main.c, mainwindow.c, parser.c, perlscript.c, perlscript.h: Rudimentary support for Perl scripting has been added. 2004-08-31 Eduardo M Kalinowski * kildclient.h, main.c, mainwindow.c, worldselector.c: When there is an error connecting, or when the connection is closed, a dialog opens from where it is possible to reconnect, or to connect to another host. 2004-08-28 Eduardo M Kalinowski * mainwindow.c: Agora a mensagem de tentativa de conexão mostra o IP também. * Makefile.am, ansi.h, mainwindow.c: Messages are now printed to the terminal to show the status of the connection. * mainwindow.c: Changed deprecated gdk io notify functions to the new glib IO Channels feature. * .cvsignore: Added .cvsignore files. * Makefile.am, kildclient.h, main.c, mainwindow.c, worldselector.c: Initial Import: barely works * Makefile.am, kildclient.h, main.c, mainwindow.c, worldselector.c: New file. kildclient-2.11.1/share/0000755000175000017500000000000011570463457012035 500000000000000kildclient-2.11.1/share/kildclient.60000644000175000017500000000731711405233113014153 00000000000000.\" Hey, EMACS: -*- nroff -*- .\" Process with: groff -man -Tascii kildclient.6 .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH kildclient 6 "2008-01-29" "KILDCLIENT" "KildClient Manual Pages" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME kildclient \- A powerful MUD client with a built-in Perl interpreter .SH SYNOPSIS .B kildclient .RI [ options "]... [" World ]... .SH DESCRIPTION This manual page documents briefly the .B KildClient program. .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBKildClient\fP is a MUD Client written with the GTK+ windowing toolkit. It supports many common features of other clients, such as triggers, gags, aliases, macros, timers, and much more. But its main feature is the built-in Perl interpreter. You can at any moment execute Perl statements and functions to do things much more powerful than simply sending text the the mud. Perl statements can also be run, for example, as the action of a trigger, allowing you to do complex things. Some built-in functions of KildClient allow interaction with the world, such as sending commands to it. .PP You can specify the name of one or more saved Worlds in the command line, this/these World(s) will be automatically opened. You can also specify a host name to connect to in the command line. By default, connection in made to port 4000. You can specify a different port by using hostname:port. While not recommended, you can also specify a username and password with the following syntax: username:password@hostname:port. This host specification syntax can be prefixed with telnet:// and end with /, for example telnet://some.mud.com:4444/. .PP If you do not specify any World, you are prompted for the MUD to connect to. You can enter the host and port directly, or you can select from a list of saved MUDs. Once connected, type commands in the separate entry box and press ENTER to send them to the MUD. You can edit the commands before sending, since they only get sent when ENTER is pressed. You can recall previous commands with the arrow keys, or by pressing the button to the right of the command entry box. .PP There are many more features, many options for configuring the program's behaviour. For more details, see the KildClient manual, which is usually installed in the .B /usr/share/doc/kildclient directory. .SH OPTIONS This program follows the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. For a complete description, see the HTML manual. .TP .B \-\-help Show summary of options. .TP .B \-\-version Show version of program. .TP .B \-c, \-\-config=\fIDIR\fB Specifies the directory to use to store configuration files and saved worlds, instead of \fI~/.kildclient\fR. .TP .B \-\-display=DISPLAY Specifies the X display to use. .SH SEE ALSO .BR perl (1). .PP The full manual in HTML formats is included with the package. It can generally be found in the .B /usr/share/doc/kildclient directory. .SH AUTHOR KildClient was written by Eduardo M Kalinowski . .PP See http://kildclient.sf.net for the latest information on KildClient. kildclient-2.11.1/share/kildclient.xcf0000644000175000017500000001056411405233113014564 00000000000000gimp xcf file``BœBœ / gimp-commentCreated with The GIMPS gimp-commentCreated with The GIMPgimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) õ¥1¸C ...ÿ     ';gimp-text-layer(text "C\n") (font "Nimbus Roman No9 L Bold") (font-size 70.000000) (font-size-unit pixels) (hinting yes) (autohint yes) (antialias yes) (language "pt-br") (base-direction ltr) (color (color-rgba 0.215686 0.427451 0.400000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) â1¸þ™1¸} @7 @m @f»ù $$ ü(úR”ÄêÿÿùúÖ©n+ü¿ÿdûU³üÿ ÿûߌ2û>ÿÿdüaÜÿÿõÊr7 (\§÷ÿÿöÑq'7âÿÿdý2ËÿÿüÜEüŠùÿÿþd ürüÿÿý· ý(Ìÿÿþd ý¨ÿÿý¿ ýŸÿÿþd ý ¸ÿÿýçýŠÿÿþd ý²ÿÿþUýÿÿþd þ‘ÿÿýËý­ÿÿþdþPÿÿþVý Ûÿÿþdýëÿÿýëþ<ÿÿþdþ˜ÿÿþ›þÿÿþdý+ýÿÿþOúõÿÿdþ¡ÿÿþûˆÿÿdýúÿÿþØûõÿdþqÿÿþªüÿdþÇÿÿþ€"þÿ ÿþ`"þNÿ ÿþC"þ‡ÿ ÿþ-"þ®ÿ ÿþ"þÑÿ ÿþ"þéÿ ÿþ"þôÿ ÿþ"þþÿ ÿþ"þ÷ÿ ÿþ"þìÿ ÿþ "þÚÿ ÿþ"þ¸ÿ ÿþ#"þ•ÿ ÿþ8"þ`ÿ ÿþQ"þ$ÿ ÿþq"ýßÿÿþ˜#þ‰ÿÿþÇ#þ.ÿÿý÷#þ½ÿÿþ>#þGÿÿþ‰#ý¹ÿÿýßüpý)ùÿÿþGúÿÔþnÿÿýÀùŠÿÿúCý®ÿÿþPùÿÿýV ý Åÿÿýëù ©ÿÿþ^ ýÅÿÿýÛù'Ïÿÿý^ ý ±ÿÿýèB ø }÷ÿÿôM @7 @m @f ütûÿÿý¤%ü}éÿÿý×,ý-¿ÿÿóþ¼o6Av¼üÿÿüý üOÆÿÿý¶.ü6‘çÿ ÿüí—/ï+gš½ÞîùÿùéΪy; X ¸7 ¸m ¸f ¸\ .NKÿ     ÿÿÿõ-gimp-text-layer(text "K") (font "TSCu_Comic") (font-size 127.000000) (font-size-unit pixels) (hinting yes) (autohint yes) (antialias yes) (language "pt-br") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) xN ”\hN ¸ K êˆ<LÒø$™áúî·;6ýUõÿÿýû=4ý6ûÿÿþ­4þ´ÿÿþà4þðÿÿþõ#þ þÿÿþý"ý6Ú þÿÿþù û}ûÿ þ ÿÿþóý!Åÿÿþ ÿÿþîý_òÿÿþÿÿþæý«ÿÿþÿÿþÖýBäÿÿþ ÿÿþÆü…ýÿÿþ*ÿÿþ¶ý!Æÿÿþ4ÿÿþ¤ýfóÿ ÿþ>ÿÿþ‹ý¹ÿ ÿþIÿÿþpümòÿ ÿþZÿÿþVý-Èÿÿþkÿÿþ;ü ‹ûÿ ÿýðV þ|ÿÿþýZæÿÿýÅ þÿÿþõý0ÁÿÿüüþŸÿÿþÒ üœýÿÿý×6þ·ÿÿþ® üzóÿÿüýþÎÿÿþ‡üaãÿÿýÖ;þæÿÿþYýLÓÿÿüú‚ýûÿÿþ(ý;ÁÿÿýÇ-þÿÿýôý2¶ÿÿüîgþ3ÿÿþÃü)«þÿÿý¢þRÿÿù(¦ýÿÿýÑ>þpÿÿûZ(¦ýÿÿüïmþŽÿÿýÁýÿÿüý›þ¬ÿÿýÀ1 þÐÿÿýÝS"þôÿÿý–"þÿÿþ¹#þ?ÿÿþ:"þdÿÿþ¼"þŽÿÿþþÿÿþH!þ¹ÿ ÿûíy4ûÿÿýÓ þåÿ ÿùñ€—ÿÿþfþÿ ÿüó†ýóÿÿýëþ;ÿÿüöŒþ{ÿÿþ™þkÿÿý”ýÛÿÿýý7þÿÿþê þGÿÿýÓþÎÿÿþ· þ«ÿÿþ‚ýùÿÿþ„ ýðÿÿýú0þ2ÿÿþP þcÿÿýÔþfÿÿþ þ¹ÿÿþ‘þÿÿþèýòÿÿýþHþÔÿÿþµþcÿÿýê €€€×ú*Îï·=üm÷ÿÿýüPý·ÿÿýçýOëÿÿûJšÿÿü{ÿ ÿüSÿÿû×ÿÿýû8ÿþjÿþ†ÿþŽÿþ†ÿýþrÿýöWÿýæ5üÿÇ ý‘Ë ý ýÿÿþþ­ÿÿýÃþCÿÿþMýäÿÿþ‹þzÿÿþýBþÿÿþXþ±ÿÿþæþ„ÿÿýö1þèÿÿþ²ý¿ÿÿýáþÿÿþýçÿÿýÉ þXÿÿþKý@üÿÿý¯þ–ÿÿþþvÿ ÿþ‘þÔÿÿþäþ§ÿ ÿþy ýþÿÿþ°ý Ïÿ ÿþk þPÿÿþ|ýëÿÿýþd þŽÿÿþIý>ùÿÿýþb þËÿÿþþ_ÿ ÿýþeý üÿÿþáþ…ÿ ÿýþmþGÿÿþ®ýªÿ ÿþwþˆÿÿþzý Æÿ ÿþ„þÍÿÿþFýØÿ ÿýþÿÿþ ý æÿ ÿþWÿÿþß"ý/ñÿÿþÿÿþ«#ýBùÿÿþâÿÿþw$ýTýÿÿþ'ÿÿþD%þeÿÿþlÿÿýý&þtÿÿþ²ÿÿþÑ(þÿÿýõÿÿþ•)þŒÿÿþKÿÿþV*þ“ÿÿþ˜ÿÿýû+þ—ÿÿþäÿÿþÀ,û—ÿÿþ1ÿÿþo-ü“ÿþ~ÿÿýú/þˆþËÿÿþ¬3ýþÿÿþ33ýóÿÿþ¯5þ¢ÿÿýí5ý"ïÿÿýô?7ù*±ñð²,5€€€àý” üÿ¤ ÿýµ ÿýÅÿýÔÿýâ*ÿýî8ÿýó@ÿýõ@ÿýô9 ÿûì'ÿ ÿüÙÿ ÿý¦ÿ ÿýFwÿ ÿû½`úÿÿúõCïÿÿþÜý$Òÿÿþkü “þÿÿýþ†ù6²öì¬9‰ÀÀÀÀÒÒÒÒ'G#kildclient-2.11.1/share/plugins/0000755000175000017500000000000011570463457013516 500000000000000kildclient-2.11.1/share/plugins/easypath.pl0000644000175000017500000000061011434236162015574 00000000000000package easypath; #: Version: 1.0.1 #: Description: Adds a shortcut to paths: # #: Author: Eduardo M Kalinowski # # $Id: easypath.pl 1134 2010-08-22 15:04:17Z ekalin $ $::world->alias('^#(.*)$', '/\$world->path("$1")', { name => 'easypath:path' }); sub help { $::world->echonl("Makes # expand to the a path, as the $world->path()", "function would do."); } kildclient-2.11.1/share/plugins/chat.pl0000644000175000017500000014146411405233113014701 00000000000000package chat; #: Version: 1.0.1 #: Description: Chat directly to other people #: Author: Eduardo M Kalinowski # # $Id: chat.pl 1014 2009-02-01 12:46:52Z ekalin $ BEGIN { $::world->requireplugin('KCWin'); } use Glib; use IO::Socket::INET; use Encode; use bytes; sub help { $::world->echonl(<<'EOHELP'); Making and receiving calls (commands used in main window) --------------------------------------------------------- /chat::accept Accept calls on default port, 4050 /chat::accept(port) Accept calls on given port /chat::noaccept Stop accepting calls /chat::call("host") Call host (or ip address) on default port, 4050 /chat::call("host", port) Call host (or ip address) on given port /chat::zcall("host") Call host (or ip address) on default port, 4050, using the zChat protocol /chat::zcall("host", port) Call host (or ip address) on given port, using the zChat protocol Commands valid in the chat windows ---------------------------------- To send some text, just type it and press ENTER. Some other actions are available with commands that start with /: /emote text Sends text as an emote /chatall text Sends text to all connections /emoteall text Sends text as an emote to all connections /group group_name Set the group that this chat belongs /cg text Sends text to all connections in this group /eg text Sends text as an emote to all connections in this group /name new_name Changes the name used in chats /color new_color Changes the color used in chats. new_color is a color valid for the colorize() function /stripansi Ignore colors on received messages from this chat /nostripansi Display colors on received messages from this chat /ping Pings the chat peer /sendfile Sends a file to the peer /stopfile Stops a file transfer in progress /snoop Requests to start snooping your peer /allowsnoop Allow the peer to snoop us /noallowsnoop Disallow the peer to snoop us /info Shows information about this chat session /hangup Hangs this chat session up Chat commands to be used in main window --------------------------------------- When a command requires "name" as an argument, you should provide the name of a person with whom you are chatting (as a string). /chat::chat(name, text) Sends some text /chat::chatall(text) Sends some text to all chats /chat::emote(name, text) Sends some text as an emote /chat::emoteall(text) Sends some text as an emote to all chats /chat::setgroup(name, group) Sets the group that this chat belongs /chat::chatgroup(group, text) Sends some text to the group /chat::emotegroup(group, text) Sends some text as an emote to the group /chat::ping(name) Pings the connection /chat::sendfile(name, [file]) Sends a file to the peer /chat::stopfile(name) Stops a file transfer in progress /chat::snoop(name) Request to start snooping /chat::setallowsnoop(name, value) Sets whether the peer can or cannot snoop us /chat::info(name) Displays info on the connection /chat::hangup(name) Hangs up a connection /chat::setstripansi(name, value) Sets whether the chat displays received colors: 1 to ignore them, 0 to display /chat::setencoding(name, encoding) Sets the character encoding for that chat session /chat::setname(name) Sets the nick name used in chats /chat::setcolor(color) Sets the color used in chats. color is a color string valid for the colorize() function Variables controlling the chat ------------------------------ $chat::auto_accept_calls If true, chat calls are accepted without you being prompted. $chat::default_encoding The default character encoding to use in new chats. EOHELP } ################################################################# # Constants # use constant { # Chat types MM => 0, ZCHAT => 1, # Chat commands of both protocols NAME_CHANGE => 1, REQUEST_CONNECTIONS => 2, CONNECTION_LIST => 3, TEXT_EVERYBODY => 4, TEXT_PERSONAL => 5, TEXT_GROUP => 6, MESSAGE => 7, VERSION => 19, FILE_START => 20, FILE_DENY => 21, FILE_BLOCK_REQUEST => 22, FILE_BLOCK => 23, FILE_END => 24, FILE_CANCEL => 25, PING_REQUEST => 26, PING_RESPONSE => 27, # Chat commans specific of the zChat protocol PEEK_CONNECTIONS => 28, PEEK_LIST => 29, SNOOP => 30, SNOOP_DATA => 31, ICON => 100, STATUS => 101, EMAIL => 102, REQUEST_PGP_KEY => 103, PGP_KEY => 104, SEND_COMMAND => 105, STAMP => 106, # Used in MM chat protocol MMCHAT_END_OF_COMMAND => 255, # For file transfer MM_FILE_BLOCK_SIZE => 500, ZCHAT_FILE_BLOCK_SIZE => 1024, RECEIVING => 1, SENDING => 2, # Chat destinations PERSONAL => 0, EVERYBODY => 1, GROUP => 2, }; ################################################################# # Variables # our $my_name; $my_name = 'KildClient' unless ($my_name); $::world->makepermanent('$chat::my_name'); our $chat_color; $chat_color = '&R' unless ($chat_color); $::world->makepermanent('$chat::chat_color'); our $default_encoding; $default_encoding = "iso-8859-1" unless ($default_encoding); $::world->makepermanent('$chat::default_enconding'); our $auto_accept_calls; $::world->makepermanent('$chat::auto_accept_calls'); our $chat_port = 4050; our $accept_sock; our $accept_id; our @chats; our $zchat_stamp = int(rand(2**32 - 1)); # The stamp is a 32-bit number our $n_snoopers = 0; ################################################################# # Hooks (for snooping) # $::world->hook('OnReceivedText', '/chat::send_snoop_data($hookdata)', { name => 'chat:snoop', enabled => 0 }); $::world->hook('OnSentCommand', '/chat::send_snoop_data($hookdata)', { name => 'chat:snoop', enabled => 0 }); ################################################################# # The $chat_session (reference to a) hash members: # # socket => The socket used for communications # type => Type: MudMaster or zChat # window => The KCWin that holds the chat # window_has_focus => Whether the window is focused # io_watch_id => Id for the IO Watch callback # timeout_id => Id for the timeout callback (to close connections that # are not established after some time) # id => zChat ID (not used for anything, really) # group => Group name # remotename => Remote nickname of chat peer # remoteip => Remote advertised ip # remoteport => Remote advertised port (used for incoming connections) # remoteemail => E-mail of peer (just for displaying) # remotestamp => peer's zChat stamp # remoteversion => Version of the peer's client # remotestatus => Status of the peer's client # allowsnoop => Whether the peer can snoop us # is_snooped => 1 if we are being snooped # stripansi => Strip ANSI sequences from received data? # pingtime => Time (as returned by time() function) of last sent ping # pingstamp => A random value sent in each ping, to detect the correct # reply, if several pings are sent # filedirection => If file is being sent or received # filename => Name of file being transfered # filehandle => File handle of file being transfered # filetotalsize => Total file size # filesize => Size transfered so far # pending_op => Operation code that has been read, but that has not # been processed # pending_size => Size of data for pending operation # buffer => Buffer to hold incoming data in the connection # closed => 1 if the connection is not open anymore ################################################################# # User callable routines # sub call { # # Makes a call to the given ip and port, using the MudMaster protocol # my $ip = shift; my $port = shift || 4050; generic_call($ip, $port, MM); } sub zcall { # # Makes a call to the given ip and port, using the MudMaster protocol # my $ip = shift; my $port = shift || 4050; generic_call($ip, $port, ZCHAT); } sub accept { # # Marks the chat system as accepting new connections # if ($accept_sock) { $::world->echonl(::colorize("${chat_color}Already listening for chat connections on port $chat_port")); return; } $chat_port = shift || 4050; $accept_sock = IO::Socket::INET->new(Listen => 5, LocalPort => $chat_port, Proto => 'tcp', ReuseAddr => 1); $accept_id = Glib::IO->add_watch($accept_sock->fileno, 'in', \&accept_connection, $accept_sock); $::world->echonl(::colorize("${chat_color}Listening for chat connections on port $chat_port")); } sub noaccept { # # Stop accepting calls # Glib::Source->remove($accept_id) if $accept_id; $accept_id = undef; close $accept_sock; $::world->echonl(::colorize("${chat_color}Not accepting chat connections.")); } sub setname { # # Set the name used for chats # $my_name = $_[0]; broadcast(NAME_CHANGE, $my_name); } sub chat { # # Sends something to a chat session # my ($chat_session, $text) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); send_command($chat_session, TEXT_PERSONAL, format_text($text, 0, PERSONAL)); $chat_session->{window}->feed(::colorize("\n${chat_color}You chat to $chat_session->{remotename}, '$text'\n")); } sub emote { # # Sends something as an emote to a chat session # my ($chat_session, $text) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); send_command($chat_session, TEXT_PERSONAL, format_text($text, 1, PERSONAL)); $chat_session->{window}->feed(::colorize("\n${chat_color}You emote to $chat_session->{remotename}: $my_name $text\n")); } sub chatall { # # Chats something to all open connections # my ($text, $chat_session) = @_; broadcast(TEXT_EVERYBODY, format_text($text, 0, EVERYBODY)); my $output = ::colorize("\n${chat_color}You chat to everybody, '$text'\n"); if ($chat_session) { $chat_session->{window}->feed($output); } else { $::world->echo($output); } } sub emoteall { # # Emotes something to all open connections # my ($text, $chat_session) = @_; broadcast(TEXT_EVERYBODY, format_text($text, 1, EVERYBODY)); my $output = ::colorize("\n${chat_color}You emote to everybody: $my_name $text\n"); if ($chat_session) { $chat_session->{window}->feed($output); } else { $::world->echo($output); } } sub chatgroup { # # Chats something to a group # my ($group, $text, $chat_session) = @_; $groupformat = sprintf("%-15.15s", $group); broadcast(TEXT_GROUP, $groupformat . format_text($text, 0, GROUP), $group); my $output = ::colorize("\n${chat_color}You chat to the group $group, '$text'\n"); if ($chat_session) { $chat_session->{window}->feed($output); } else { $::world->echo($output); } } sub emotegroup { # # Emotes something to a group # my ($group, $text, $chat_session) = @_; $groupformat = sprintf("%-15.15s", $group); broadcast(TEXT_GROUP, $groupformat . format_text($text, 1, GROUP), $group); my $output = ::colorize("\n${chat_color}You emote to the group $group: $my_name $text\n"); if ($chat_session) { $chat_session->{window}->feed($output); } else { $::world->echo($output); } } sub setgroup { # # Sets a chat session to be part of a group # my ($chat_session, $group) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); $chat_session->{group} = substr($group, 0, 15); } sub ping { # # Pings a chat connection # my ($chat_session) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); $chat_session->{pingstamp} = int(rand(2**32 - 1)); $chat_session->{pingtime} = time(); send_command($chat_session, PING_REQUEST, $chat_session->{pingstamp}); } sub sendfile { # # Sends a file to the chat peer # my ($chat_session, $file) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); if ($chat_session->{filedirection}) { feed_and_show($chat_session, "${chat_color}A file transfer is already in progress.\n"); return; } if (!$file) { my $dialog = Gtk2::FileChooserDialog->new('Select file', undef, 'open', 'gtk-cancel' => 'cancel', 'gtk-ok' => 'accept'); my $response = $dialog->run(); $dialog->hide(); return if ($response ne 'accept'); $file = $dialog->get_filename(); } if(!open($chat_session->{filehandle}, $file)) { feed_and_show($chat_session, "${chat_color}Could not open '$file': $!\n"); return; } $chat_session->{filename} = $file; $chat_session->{filedirection} = SENDING; $chat_session->{filetotalsize} = -s $file; $chat_session->{filesize} = 0; # There must be a better way to extract the file name from a path if ($file =~ m{.*/([^/]+)$}) { $basefilename = $1; } else { $basefilename = $file; } send_command($chat_session, FILE_START, "$basefilename,$chat_session->{filetotalsize}"); feed_and_show($chat_session, "${chat_color}Sending file $file to $chat_session->{remotename}\n"); } sub stopfile { # # Stops a file transfer # my ($chat_session, $file) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); if (!$chat_session->{filedirection}) { feed_and_show($chat_session, "${chat_color}No file is being transfered.\n"); return; } send_command($chat_session, FILE_CANCEL, ''); file_stop($chat_session, "${chat_color}Transfer of file $chat_session->{filename} aborted.\n"); } sub snoop { # # Tries to start snooping the remote party # my ($chat_session) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); if ($chat_session->{type} != ZCHAT) { feed_and_show($chat_session, "${chat_color}Only the zChat protocol supports snooping.\n"); return; } send_command($chat_session, SNOOP, ''); feed_and_show($chat_session, "${chat_color}Requested to start snooping $chat_session->{remotename}\n"); } sub info { # # Prints information about the chat session # my ($chat_session, $text) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); my $window = $chat_session->{window}; my $chatheader = "Chat with $chat_session->{remotename}"; $window->feed(::colorize("&w$chatheader\n")); $window->feed("-" x length($chatheader) . "\n"); $window->feed("Connection IP : " . $chat_session->{socket}->peerhost() . "\n"); $window->feed("Advertised IP : $chat_session->{remoteip}\n"); $window->feed("Call port : $chat_session->{remoteport}\n"); $window->feed("Type : " . ($chat_session->{type} == MM ? "MudMaster" : "zChat") . "\n"); $window->feed("Group : $chat_session->{group}\n"); $window->feed("Remote version : " . ($chat_session->{remoteversion} ? $chat_session->{remoteversion} : "Unknown") . "\n"); $window->feed("Peer e-mail : $chat_session->{remoteemail}\n") if ($chat_session->{remoteemail}); $window->feed("They can snoop : " . ($chat_session->{allowsnoop} ? "yes" : "no") . "\n"); $window->feed("They are snooping: " . ($chat_session->{is_snooped} ? "yes" : "no") . "\n"); $window->feed("Strip ANSI : " . ($chat_session->{stripansi} ? "yes" : "no") . "\n"); if ($chat_session->{filedirection}) { if ($chat_session->{filedirection} == SENDING) { $window->feed("Sending file : $chat_session->{filename}\n"); } else { $window->feed("Receiving file : $chat_session->{filename}\n"); } $window->feed("File size: : $chat_session->{filetotalsize}\n"); $window->feed("Bytes transfered : $chat_session->{filesize}\n"); my $remaining_bytes = $chat_session->{filetotalsize} - $chat_session->{filesize}; $window->feed("Bytes left : $remaining_bytes (" . sprintf("%.0f", 100*($remaining_bytes/$chat_session->{filetotalsize})) . "%) \n"); } feed_and_show($chat_session, "$chat_color"); } sub hangup { # # Closes a connection # my ($chat_session) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); close $chat_session->{socket}; Glib::Source->remove($chat_session->{io_watch_id}); feed_and_show($chat_session, "${chat_color}Chat session closed.\n"); remove_session($chat_session); } sub setcolor { # # Sets the color used for chat messages. # $chat_color = $_[0]; } sub setstripansi { # # Sets whether to strip ANSI sequences or not # my ($chat_session, $value) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); $chat_session->{stripansi} = $value; } sub setallowsnoop { # # Sets whether our peer can snoop us # my ($chat_session, $value) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); if ($chat_session->{type} != ZCHAT) { feed_and_show($chat_session, "${chat_color}Only the zChat protocol supports snooping.\n"); return; } $chat_session->{allowsnoop} = $value; if ($value) { send_command($chat_session, MESSAGE, ::colorize("${chat_color}You can now snoop $my_name.\n")); feed_and_show($chat_session, "${chat_color}Snooping allowed.\n"); } else { send_command($chat_session, MESSAGE, ::colorize("${chat_color}You can no longer snoop $my_name.\n")); feed_and_show($chat_session, "${chat_color}Snooping disallowed.\n"); stop_snooped($chat_session); } } sub setencoding { # # Sets the encoding for that chat session # my ($chat_session, $encoding) = @_; $chat_session = find_session($chat_session) unless ref($chat_session); $chat_session->{encoding} = $encoding; } ################################################################# # Internal functions # sub generic_call { # # Makes a chat call, of the specified type # my ($ip, $port, $type) = @_; my $socket = IO::Socket::INET->new(PeerAddr => $ip, PeerPort => $port, Proto => 'tcp'); if (!defined($socket)) { $::world->echonl(::colorize("${chat_color}Could not connect to $ip, port $port: $!\n")); return 0; } my $chat_session = { socket => $socket, type => $type, remoteip => $ip, remoteport => $port, group => '', encoding => $default_encoding}; $chat_session->{io_watch_id} = Glib::IO->add_watch($socket->fileno, 'in', \&call_establishment_data_ready_cb, $chat_session); $chat_session->{timeout_id} = Glib::Timeout->add(60000, # That's 60 seconds in ms \&kill_pending_connection_cb, $chat_session); $chat_session->{window} = new_chat_window($ip, $chat_session); $chat_session->{window}->feed(::colorize("${chat_color}Calling $ip on port $port...\n")); $chat_session->{window}->show_all; if ($type == MM) { $proposal = sprintf("CHAT:$my_name\n%s%-5u", $socket->sockhost(), $chat_port); } else { $proposal = sprintf("ZCHAT:$my_name\t0\n%s%05u", $socket->sockhost(), $chat_port); } syswrite($socket, $proposal); push(@chats, $chat_session); return 1; } sub accept_connection { # # accept()'s an incoming connection. accept() won't block because this # is only called when there is an incoming connection (because of the # IO watch). # my ($fileno, $condition, $sock) = @_; my $client_sock = $sock->accept(); my $chat_session = { socket => $client_sock, group => '', encoding => $default_encoding }; $chat_session->{io_watch_id} = Glib::IO->add_watch($client_sock->fileno, 'in', \&receive_establishment_data_ready_cb, $chat_session); $chat_session->{timeout_id} = Glib::Timeout->add(60000, # That's 60 seconds in ms \&kill_pending_connection_cb, $chat_session); push(@chats, $chat_session); return 1; } sub call_establishment_data_ready_cb { # # Called when data is ready in a chat socket, for which no connection # has yet been established, when we making a call. # my ($fileno, $condition, $chat_session) = @_; my $socket = $chat_session->{socket}; my $tempbuffer; my $bytes_read = sysread($socket, $tempbuffer, 1024); if (!defined($bytes_read) || $bytes_read <= 0) { close $socket; remove_session($chat_session); return 0; } $chat_session->{buffer} .= $tempbuffer; while (1) { my $nlpos = index($chat_session->{buffer}, "\n"); return 1 if ($nlpos == -1); # Wait for more data if ($chat_session->{buffer} =~ /^YES:(.*)/) { change_remote_name($chat_session, $1, 1); substr($chat_session->{buffer}, 0, $nlpos + 1) = ''; send_command($chat_session, VERSION, get_version()); if ($chat_session->{type} == ZCHAT) { send_command($chat_session, STATUS, chr(1)); # We're always available for now send_command($chat_session, STAMP, pack("L", $zchat_stamp)); } $chat_session->{io_watch_id} = Glib::IO->add_watch($socket->fileno, 'in', $chat_session->{type} == MM ? \&mmchat_data_ready_cb : \&zchat_data_ready_cb, $chat_session); # Remove timeout Glib::Source->remove($chat_session->{timeout_id}); $chat_session->{window}->feed(::colorize("${chat_color}Chat session to '$chat_session->{remotename}' at $chat_session->{remoteip} port $chat_session->{remoteport} established\n")); return 0; } elsif ($chat_session->{buffer} =~ /^NO/) { # Refused $chat_session->{window}->feed(::colorize("${chat_color}Remote party refused chat session\n")); Glib::Source->remove($chat_session->{timeout_id}); close $socket; remove_session($chat_session); return 0; } else { # Wrong reply. Let's ignore this line and wait for another one substr($chat_session->{buffer}, 0, $nlpos + 1) = ''; } } return 1; # Continue processing } sub receive_establishment_data_ready_cb { # # Called when data is ready in a chat socket, for which no connection # has yet been established, when we are accepting a call. # my ($fileno, $condition, $chat_session) = @_; my $socket = $chat_session->{socket}; my $tempbuffer; my $bytes_read = sysread($socket, $tempbuffer, 1024); if (!defined($bytes_read) || $bytes_read <= 0) { close $socket; remove_session($chat_session); return 0; } $chat_session->{buffer} .= $tempbuffer; while (1) { if (!defined($chat_session->{type})) { # First line my $nlpos = index($chat_session->{buffer}, "\n"); return 1 if ($nlpos == -1); # Wait for more data if ($chat_session->{buffer} =~ /^ZCHAT:(.*)\t(.*)/) { $chat_session->{type} = ZCHAT; $chat_session->{remotename} = $1; $chat_session->{id} = $2; substr($chat_session->{buffer}, 0, $nlpos + 1) = ''; } elsif ($chat_session->{buffer} =~ /^CHAT:(.*)/) { $chat_session->{type} = MM; $chat_session->{remotename} = $1; $chat_session->{id} = 0; substr($chat_session->{buffer}, 0, $nlpos + 1) = ''; } else { # Wrong header. Let's ignore this line and wait for another one substr($chat_session->{buffer}, 0, $nlpos + 1) = ''; } } else { # Second line unless ($auto_accept_calls) { my $dialog = Gtk2::MessageDialog->new(undef, [], 'question', 'yes-no', "Accept chat call with '$chat_session->{remotename}' from " . $socket->peerhost() . "?"); $dialog->set_default_response('yes'); my $response = $dialog->run(); $dialog->destroy; if ($response ne 'yes') { syswrite($socket, "NO\n"); close $socket; Glib::Source->remove($chat_session->{timeout_id}); remove_session($chat_session); return 0; } } $chat_session->{remoteip} = substr($chat_session->{buffer}, 0, length($chat_session->{buffer}) - 5); $chat_session->{remoteport} = int(substr($chat_session->{buffer}, -5, 5)); $chat_session->{buffer} = ''; syswrite($socket, "YES:$my_name\n"); send_command($chat_session, VERSION, get_version()); if ($chat_session->{type} == ZCHAT) { send_command($chat_session, STATUS, chr(1)); # We're always available for now send_command($chat_session, STAMP, pack("L", $zchat_stamp)); } $chat_session->{window} = new_chat_window($chat_session->{remotename}, $chat_session); $chat_session->{io_watch_id} = Glib::IO->add_watch($socket->fileno, 'in', $chat_session->{type} == MM ? \&mmchat_data_ready_cb : \&zchat_data_ready_cb, $chat_session); # Remove timeout Glib::Source->remove($chat_session->{timeout_id}); $chat_session->{window}->feed(::colorize("${chat_color}Chat session with '$chat_session->{remotename}' from $chat_session->{remoteip} port $chat_session->{remoteport}\n")); $chat_session->{window}->show_all; return 0; # Remove callback } } return 1; # Continue processing } sub kill_pending_connection_cb { # # Kills connections that have been open for some time but have not yet # been sucessfully established. # my ($chat_session) = @_; if ($chat_session->{window}) { feed_and_show($chat_session, "${chat_color}No reply from remote party, chat closed.\n"); } Glib::Source->remove($chat_session->{io_watch_id}); close $chat_session->{socket}; remove_session($chat_session); return 0; } sub mmchat_data_ready_cb { # # Called when data is ready from a mudmaster chat session. # my ($fileno, $condition, $chat_session) = @_; my $socket = $chat_session->{socket}; my $tempbuffer; my $bytes_read = sysread($socket, $tempbuffer, 1024); if (!defined($bytes_read) || $bytes_read <= 0) { close $socket; feed_and_show($chat_session, "${chat_color}Chat session closed.\n"); remove_session($chat_session); return 0; } $chat_session->{buffer} .= $tempbuffer; while (1) { if (!defined($chat_session->{pending_op})) { # Get the command code return 1 if (length($chat_session->{buffer}) < 1); # Wait for more $chat_session->{pending_op} = ord($chat_session->{buffer}); substr($chat_session->{buffer}, 0, 1) = ''; } else { # Unfortunately, FILE_BLOCK blocks have a different structure if ($chat_session->{pending_op} == FILE_BLOCK) { # +1 is because there is an END_OF_COMMAND after the block. # This has been discovered in practice (and MudMaster does send # this byte), even though the specs says there is no # END_OF_COMMAND in this message. return 1 if length($chat_session->{buffer}) < MM_FILE_BLOCK_SIZE + 1; file_block_received($chat_session, substr($chat_session->{buffer}, 0, MM_FILE_BLOCK_SIZE)); substr($chat_session->{buffer}, 0, MM_FILE_BLOCK_SIZE + 1) = ''; $chat_session->{pending_op} = undef; } else { my $end_data_pos = index($chat_session->{buffer}, chr(MMCHAT_END_OF_COMMAND)); return 1 if ($end_data_pos == -1); # Wait for more data dispatch_command($chat_session, substr($chat_session->{buffer}, 0, $end_data_pos)); substr($chat_session->{buffer}, 0, $end_data_pos + 1) = ''; $chat_session->{pending_op} = undef; } } } return 1; # Continue processing } sub zchat_data_ready_cb { # # Called when data is ready from a zChat session. # my ($fileno, $condition, $chat_session) = @_; my $socket = $chat_session->{socket}; my $tempbuffer; my $bytes_read = sysread($socket, $tempbuffer, 1024); if (!defined($bytes_read) || $bytes_read <= 0) { close $socket; feed_and_show($chat_session, "${chat_color}Chat session closed.\n"); remove_session($chat_session); return 0; } $chat_session->{buffer} .= $tempbuffer; while (1) { if (!defined($chat_session->{pending_op})) { # Get the command code return 1 if (length($chat_session->{buffer}) < 2); # Wait for more $chat_session->{pending_op} = unpack("v", substr($chat_session->{buffer}, 0, 2)); substr($chat_session->{buffer}, 0, 2) = ''; } elsif (!defined($chat_session->{pending_size})) { # Get the size return 1 if (length($chat_session->{buffer}) < 2); # Wait for more $chat_session->{pending_size} = unpack("v", substr($chat_session->{buffer}, 0, 2)); substr($chat_session->{buffer}, 0, 2) = ''; } elsif (length($chat_session->{buffer}) >= $chat_session->{pending_size}) { dispatch_command($chat_session, substr($chat_session->{buffer}, 0, $chat_session->{pending_size})); substr($chat_session->{buffer}, 0, $chat_session->{pending_size}) = ''; $chat_session->{pending_op} = undef; $chat_session->{pending_size} = undef; } else { return 1; # Wait for more data } } return 1; # Continue processing } sub dispatch_command { # # Determines the command to be executed # my ($chat_session, $data) = @_; my $op = $chat_session->{pending_op}; if ($op == VERSION) { $chat_session->{remoteversion} = $data; } elsif ($op == STATUS) { $chat_session->{remotestatus} = ord($data); } elsif ($op == EMAIL) { $chat_session->{remoteemail} = $data; } elsif ($op == STAMP) { $chat_session->{remotestamp} = unpack("L", $data); if ($chat_session->{remotestamp} == $zchat_stamp) { $zchat_stamp = int(rand(2**32 - 1)); broadcast(STAMP, pack("L", $zchat_stamp)); } } elsif ($op == NAME_CHANGE) { change_remote_name($chat_session, $data); } elsif ($op == PING_REQUEST) { send_command($chat_session, PING_RESPONSE, $data); } elsif ($op == TEXT_EVERYBODY || $op == TEXT_PERSONAL || $op == TEXT_GROUP) { process_text_message($chat_session, $data, $op); } elsif ($op == MESSAGE) { Encode::from_to($data, $chat_session->{encoding}, 'UTF-8'); feed_and_show($chat_session, "${chat_color}Message from $chat_session->{remotename}: $data\n"); } elsif ($op == PING_RESPONSE) { if ($data == $chat_session->{pingstamp}) { my $elapsedsecs = time() - $chat_session->{pingtime}; feed_and_show($chat_session, "${chat_color}Ping replyied in $elapsedsecs second(s)\n"); } # If not equal, let's ignore this reply } elsif ($op == SNOOP_DATA) { $data = substr($data, 4); Encode::from_to($data, $chat_session->{encoding}, 'UTF-8'); feed_and_show($chat_session, "&c>&w" . $data . "\n"); } elsif ($op == SNOOP) { start_snooped($chat_session); } elsif ($op == FILE_START) { receive_file($chat_session, $data); } elsif ($op == FILE_BLOCK) { file_block_received($chat_session, $data); } elsif ($op == FILE_END) { file_end($chat_session); } elsif ($op == FILE_CANCEL) { if ($chat_session->{filedirection}) { file_stop($chat_session, "${chat_color}Transfer of file $chat_session->{filename} aborted by remote party.\n"); } else { file_stop($chat_session, ''); } } elsif ($op == FILE_DENY) { file_stop($chat_session, "${chat_color}$chat_session->{remotename} rejected the file transfer: $data\n"); } elsif ($op == FILE_BLOCK_REQUEST) { file_send_next_block($chat_session); } else { Encode::from_to($data, $chat_session->{encoding}, 'UTF-8'); $chat_session->{window}->feed("Received unknown command #$op, data: <$data>\n"); send_command($chat_session, MESSAGE, ::colorize("${chat_color}KildClient chat does not support command $op at this time, sorry.\n")); } } sub process_text_message { # # Processes a text message (personal, to everybody or to group). If the # zChat procotol is being used, this means checking the stamp. # my ($chat_session, $data, $op) = @_; my $message; if ($chat_session->{type} == ZCHAT) { my $stamp = unpack("L", substr($chat_session, 0, 4)); if ($stamp != $zchat_stamp) { $message = substr($data, 4); } else { return; } } else { $message = $data; } $message = substr($message, 15) if ($op == TEXT_GROUP); Encode::from_to($message, $chat_session->{encoding}, 'UTF-8'); $message = ::stripansi($message) if ($chat_session->{stripansi}); feed_and_show($chat_session, "$chat_color$message"); } sub change_remote_name { # # Changes the name of peer for a chat. # If $quit is defined, does not print anything in the window. # my ($chat_session, $name, $quiet) = @_; my $oldname = $chat_session->{remotename}; $chat_session->{remotename} = $name; $chat_session->{window}->set_title("Chat: $name"); unless ($quiet) { $chat_session->{window}->feed(::colorize("${chat_color}$oldname is now known as $name.\n")); } } sub process_input { # # Processes input typed in the Chat window # my ($entry, $chat_session) = @_; if ($chat_session->{closed}) { feed_and_show($chat_session, "${chat_color}This chat session is closed.\n"); return; } my $text = $entry->get_text; if ($text =~ m<^/emote\s+(.*)>i) { emote($chat_session, $1); } elsif($text =~ m<^/chatall\s+(.*)>i) { chatall($1, $chat_session); } elsif($text =~ m<^/emoteall\s+(.*)>i) { emoteall($1, $chat_session); } elsif($text =~ m<^/cg\s+(.*)>i) { if ($chat_session->{group} eq '') { feed_and_show($chat_session, "${chat_color}This chat does not belong to a group.\n"); } else { chatgroup($chat_session->{group}, $1, $chat_session); } } elsif($text =~ m<^/eg\s+(.*)>i) { if ($chat_session->{group} eq '') { feed_and_show($chat_session, "${chat_color}This chat does not belong to a group.\n"); } else { emotegroup($chat_session->{group}, $1, $chat_session); } } elsif($text =~ m<^/name\s+(.*)>i) { setname($1); } elsif($text =~ m<^/color\s+(.*)>i) { setcolor($1); } elsif($text =~ m<^/group\s+(.*)>i) { setgroup($chat_session, $1); } elsif($text =~ m<^/stripansi\s*>i) { setstripansi($chat_session, 1); } elsif($text =~ m<^/nostripansi\s*>i) { setstripansi($chat_session, 0); } elsif($text =~ m<^/ping\s*>i) { ping($chat_session); } elsif($text =~ m<^/sendfile\s*>i) { sendfile($chat_session); } elsif($text =~ m<^/stopfile\s*>i) { stopfile($chat_session); } elsif($text =~ m<^/snoop\s*>i) { snoop($chat_session); } elsif($text =~ m<^/allowsnoop\s*>i) { setallowsnoop($chat_session, 1); } elsif($text =~ m<^/noallowsnoop\s*>i) { setallowsnoop($chat_session, 0); } elsif ($text =~ mi) { info($chat_session); } elsif ($text =~ mi) { hangup($chat_session); } else { chat($chat_session, $text); } $entry->set_text(''); } sub send_command { # # Packs a command in the appropriate representation and sends it # my ($chat_session, $op, $data) = @_; if ($op != FILE_BLOCK) { $data = encode($chat_session->{encoding}, $data); } if (($op == TEXT_PERSONAL || $op == TEXT_EVERYBODY) && $chat_session->{type} == ZCHAT) { $data = pack("L", $zchat_stamp) . $data; } my $command; if ($chat_session->{type} == MM) { $command = chr($op) . $data . chr(MMCHAT_END_OF_COMMAND); } elsif ($chat_session->{type} == ZCHAT) { $command = pack("vv", $op, length($data)) . $data; } syswrite($chat_session->{socket}, $command); } sub broadcast { # # Broadcasts a command to all open chat sessions # my ($command, $data, $group) = @_; $group = substr($group, 0, 15) if ($group); foreach $chat (@chats) { next if $chat->{closed}; next if ($chat->{type} == MM && $command >= PEEK_CONNECTIONS); next if ($group && $chat->{group} ne $group); send_command($chat, $command, $data); } } sub format_text { # # Formats a message to be sent as a TEXT_PERSONAL, TEXT_GROUP, # or TEXT_EVERYBODY command # my ($text, $isemote, $dest) = @_; my $destname; $destname = "you" if ($dest == PERSONAL); $destname = "everybody" if ($dest == EVERYBODY); $destname = "the group" if ($dest == GROUP); my $string; if (!$isemote) { $string = ::colorize("\n${chat_color}$my_name chats to $destname, '$text'\n"); } else { if ($dest == PERSONAL) { $string = ::colorize("\n${chat_color}$my_name $text\n"); } else { $string = ::colorize("\n${chat_color}(To $destname) $my_name $text\n"); } } return $string; } sub start_snooped { # # Starts a snooping session, in which we send all received data # my ($chat_session) = @_; if (!$chat_session->{allowsnoop}) { send_command($chat_session, MESSAGE, ::colorize("${chat_color}$my_name does not allow you to snoop him/her.\n")); feed_and_show($chat_session, "${chat_color}$chat_session->{remotename} has tried to snoop you.\n"); return; } $chat_session->{is_snooped} = 1; if ($n_snoopers++ == 0) { $::world->enahook('OnReceivedText', 'chat:snoop'); $::world->enahook('OnSentCommand', 'chat:snoop'); } send_command($chat_session, MESSAGE, ::colorize("${chat_color}You are now snooping $my_name.\n")); feed_and_show($chat_session, "${chat_color}$chat_session->{remotename} is snooping you.\n"); } sub stop_snooped { # # Stops a snooping session, no more data is sent # my ($chat_session) = @_; if ($chat_session->{is_snooped}) { $chat_session->{is_snooped} = 0; if (--$n_snoopers == 0) { $::world->dishook('OnReceivedText', 'chat:snoop'); $::world->dishook('OnSentCommand', 'chat:snoop'); } } } sub send_snoop_data { # # Sends data that has been received to the people that are snooping # us # my ($data) = @_; foreach my $chat (@chats) { next if ($chat->{closed}); next unless ($chat->{is_snooped}); send_command($chat, SNOOP_DATA, $data); } } sub receive_file { # # Prompts the user if he wants to accept a file, and if he does, # start the transfer # my ($chat_session, $data) = @_; # It should never happen that another file is offered while a file # transfer is still in progress, but let's play safe if ($chat_session->{filedirection}) { send_command($chat_session, FILE_DENY, "A file transfer is already in progress."); return; } my ($file, $length) = split(",", $data); my $dialog = Gtk2::MessageDialog->new(undef, [], 'question', 'yes-no', "$chat_session->{remotename} wants to send you file '$file', length $length bytes. Accept it?"); $dialog->set_default_response('no'); my $response = $dialog->run(); $dialog->destroy; if ($response ne 'yes') { send_command($chat_session, FILE_DENY, "$my_name rejected the file transfer."); return; } $dialog = Gtk2::FileChooserDialog->new('Save file as', undef, 'save', 'gtk-cancel' => 'cancel', 'gtk-save' => 'accept'); $dialog->set_current_name($file); $response = $dialog->run(); $dialog->hide(); if ($response ne 'accept') { send_command($chat_session, FILE_DENY, "$my_name rejected the file transfer."); return; } my $filename = $dialog->get_filename(); if (!open ($chat_session->{filehandle}, ">$filename")) { feed_and_show($chat_session, "${chat_color}Could not open '$filename': $!\n"); send_command($chat_session, FILE_DENY, "$my_name rejected the file transfer."); return; } $chat_session->{filedirection} = RECEIVING; $chat_session->{filename} = $filename; $chat_session->{filetotalsize} = $length; $chat_session->{filesize} = 0; feed_and_show($chat_session, "${chat_color}Started transfer of file $filename.\n"); send_command($chat_session, FILE_BLOCK_REQUEST, ''); } sub file_block_received { # # Called when a FILE_BLOCK message is received # my ($chat_session, $block) = @_; # It should never happen that we receive a block when a file # transfer is not in progress, but let's play safe if (!defined($chat_session->{filedirection})) { send_command($chat_session, FILE_CANCEL, ''); return; } my $length = length($block); my $remaining_size = $chat_session->{filetotalsize} - $chat_session->{filesize}; my $bytes_to_write = $remaining_size < $length ? $remaining_size : $length; syswrite($chat_session->{filehandle}, $block, $bytes_to_write); $chat_session->{filesize} += $length; send_command($chat_session, FILE_BLOCK_REQUEST, ''); } sub file_end { # # Called when a FILE_END message is received # my ($chat_session) = @_; feed_and_show($chat_session, "${chat_color}Transfer of file $chat_session->{filename} finished.\n"); close($chat_session->{filehandle}); $chat_session->{filehandle} = undef; $chat_session->{filename} = undef; $chat_session->{filedirection} = undef; } sub file_stop { # # Called when a file transfer is to be stopped, either because one # of the parties aborted it, or because of an error, or because the # sending of the file has finished. # my ($chat_session, $message) = @_; # At least one client sends a FILE_CANCEL in reply to our denying a # file, and in this case the file transfer has not been initiated here. return unless defined($chat_session->{filedirection}); feed_and_show($chat_session, $message); if ($chat_session->{filedirection} == RECEIVING) { unlink($chat_session->{filename}); } close($chat_session->{filehandle}); $chat_session->{filehandle} = undef; $chat_session->{filename} = undef; $chat_session->{filedirection} = undef; } sub file_send_next_block { # # Sends the next block in the file transfer # my ($chat_session) = @_; # It should never happen that we receive a block when a file # transfer is not in progress, but let's play safe if (!defined($chat_session->{filedirection})) { send_command($chat_session, FILE_CANCEL, ''); return; } my $remaining_size = $chat_session->{filetotalsize} - $chat_session->{filesize}; #print "send block: size $chat_session->{filesize}, remaining: $remaining_size\n"; if ($remaining_size == 0) { send_command($chat_session, FILE_END, ''); file_stop($chat_session, "${chat_color}Finished transfer of file $chat_session->{filename}.\n"); return; } my $block_size = $chat_session->{type} == MM ? MM_FILE_BLOCK_SIZE : ZCHAT_FILE_BLOCK_SIZE; my $bytes_to_read = $remaining_size < $block_size ? $remaining_size : $block_size; #print "send block: block size is $block_size, we read $bytes_to_read\n"; my $buffer; my $nread = sysread($chat_session->{filehandle}, $buffer, $bytes_to_read); #print "send block: read $nread bytes\n"; if ($nread != $bytes_to_read) { # We have a problem send_command($chat_session, MESSAGE, ::colorize("${chat_color}Error while reading file.\n")); send_command($chat_session, FILE_CANCEL, ''); file_stop($chat_session, "${chat_color}Error while reading file. File transfer canceled.\n"); return; } #print "send block: adding " . ($block_size - $bytes_to_read) . " padding bytes.\n"; my $block = $buffer . chr(0) x ($block_size - $bytes_to_read); send_command($chat_session, FILE_BLOCK, $block); $chat_session->{filesize} += $bytes_to_read; #print "send block: sent\n\n"; } sub new_chat_window { # # Creates a new chat window. # my ($remotename, $chat_session) = @_; my $window = KCWin->new; $window->{chat_session} = $chat_session; $window->set_title("Chat: $remotename"); $window->signal_connect(delete_event => sub { $window->hide(); return 1; }); $window->signal_connect(focus_in_event => sub { $window->{chat_session}->{window_has_focus} = 1; if ($window->{chat_session}->{remotename}) { $window->set_title("Chat: $window->{chat_session}->{remotename}"); } }); $window->signal_connect(focus_out_event => sub { $window->{chat_session}->{window_has_focus} = 0; }); $window->{ENTRY}->signal_connect(activate => \&process_input, $chat_session); return $window; } sub feed_and_show { # # Feeds text to the window and shows the window. The text can have # color codes, colorize will be called automatically. # my ($chat_session, $text) = @_; my $window = $chat_session->{window}; $window->feed(::colorize($text)); unless ($chat_session->{window_has_focus}) { $window->set_title("(*) Chat: $chat_session->{remotename}"); } $window->show; } sub get_version { # # Returns a version string sent to the other part # return "KildClient " . ::getversion() . ", chat plugin " . $::world->getpluginversion(__PACKAGE__); } sub find_session { # # Finds a chat session for the given name # my ($name) = @_; foreach $chat (@chats) { next if $chat->{closed}; return $chat if ($chat->{remotename} eq $name); } die("Could not find chat session '$name'"); } sub remove_session { # # Removes the chat session from the list of connection # my ($chat_session) = @_; # FIXME: Actually remove it, and change UNLOAD correspondingly $chat_session->{closed} = 1; stop_snooped($chat_session); } ################################################################# # Automatic functions # sub UNLOAD { Glib::Source->remove($accept_id) if $accept_id; foreach my $chat (@chats) { next if $chat->{closed}; $chat->{socket}->close; Glib::Source->remove($chat->{io_watch_id}); $chat->{window}->destroy; } } kildclient-2.11.1/share/plugins/kc256.pl0000644000175000017500000000431211405233113014602 00000000000000package kc256; #: Version: 1.0.0 #: Description: Demonstrates the 256 color mode supported by KildClient #: Author: Eduardo M Kalinowski # # $Id: kc256.pl 1014 2009-02-01 12:46:52Z ekalin $ sub help { $::world->echonl(<<'EOHELP'); This plugin demonstrates a useful extension to the 16 ansi colors that KildClient supports. This is the same 256-color extension supported by xterm (if it is complied with support for that). With this extension, you can specify any color in a 6x6x6 RGB color cube, that is, you have 216 rgb colors at your disposal, plus 24 shades of gray. (The remaining 16 colors are the standard ansi colors.) There are two functions in this plugin: kc256::showcolors Displays all 216 available RGB colors and the 24 shades of grey in nice tables, with the values that you can use in colorize() to access them. kc256::rainbowtext($string) Just a demonstration on how (not to) use the colors. Displays $string, one character in a different color. EOHELP } sub showcolors { $::world->echonl("\nRGB Colors:"); $::world->echonl("green 000000 000000 000000 000000 000000 000000"); $::world->echonl("blue 012345 012345 012345 012345 012345 012345"); foreach my $r (0..5) { $::world->echo($r == 0 ? "red " : " "); $::world->echo("$r "); foreach my $g (0..5) { foreach my $b (0..5) { $::world->echo(::colorize("^$r$g${b}X ")); } $::world->echo(" "); } $::world->echo("\n"); } $::world->echonl("\nGreyscale:"); $::world->echo(" "); foreach my $g (0..23) { $::world->echo(::colorize("^${g}G ")); } $::world->echo("\n"); $::world->echonl(" 000000000011111111112222"); $::world->echonl(" 012345678901234567890123"); } sub rainbowtext { my ($text) = shift; my ($r, $g, $b) = (0, 0, 0); my $length = length($text); for (my $i = 0; $i < $length; ++$i) { my $char = substr($text, $i, 1); $::world->echo(::colorize("&$r$g${b}X$char")); next if ($char =~ /[[:space:]]/); ++$b; if ($b == 6) { ++$g; $b = 0; } if ($g == 6) { ++$r; $g = 0; } if ($r == 6) { $r = 0; } } } kildclient-2.11.1/share/plugins/Makefile.in0000644000175000017500000002760711570177666015523 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # $Id: Makefile.am 1132 2010-07-01 13:18:55Z ekalin $ VPATH = @srcdir@ 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/plugins DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = 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__installdirs = "$(DESTDIR)$(pkgplugindir)" DATA = $(pkgplugin_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ KILDCLIENT_PERL_CFLAGS = @KILDCLIENT_PERL_CFLAGS@ KILDCLIENT_PERL_LIBS = @KILDCLIENT_PERL_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ OBJEXT = @OBJEXT@ 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@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RES_COMPILE = @RES_COMPILE@ RES_INCDIR = @RES_INCDIR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ pkgplugindir = $(pkgdatadir)/plugins pkgplugin_DATA = chat.pl \ easypath.pl \ KCWin.pl \ keypad.pl \ notes.pl \ kc256.pl \ channels.pl EXTRA_DIST = $(pkgplugin_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu share/plugins/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu share/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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-pkgpluginDATA: $(pkgplugin_DATA) @$(NORMAL_INSTALL) test -z "$(pkgplugindir)" || $(MKDIR_P) "$(DESTDIR)$(pkgplugindir)" @list='$(pkgplugin_DATA)'; test -n "$(pkgplugindir)" || list=; \ 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)$(pkgplugindir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgplugindir)" || exit $$?; \ done uninstall-pkgpluginDATA: @$(NORMAL_UNINSTALL) @list='$(pkgplugin_DATA)'; test -n "$(pkgplugindir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(pkgplugindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(pkgplugindir)" && rm -f $$files 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)$(pkgplugindir)"; 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: 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 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-pkgpluginDATA 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 pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pkgpluginDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic 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-pkgpluginDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-pkgpluginDATA # 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: kildclient-2.11.1/share/plugins/keypad.pl0000644000175000017500000000255711405233113015236 00000000000000package keypad; #: Version: 1.0 #: Description: Allows use of the keypad for moving #: Author: Eduardo M Kalinowski # # $Id: keypad.pl 1014 2009-02-01 12:46:52Z ekalin $ $::world->macro('KP_Home', 'nw', { name => 'keypad:keypad' }); $::world->macro('KP_Up', 'n', { name => 'keypad:keypad' }); $::world->macro('KP_Page_Up', 'ne', { name => 'keypad:keypad' }); $::world->macro('KP_Left', 'w', { name => 'keypad:keypad' }); $::world->macro('KP_Right', 'e', { name => 'keypad:keypad' }); $::world->macro('KP_End', 'sw', { name => 'keypad:keypad' }); $::world->macro('KP_Down', 's', { name => 'keypad:keypad' }); $::world->macro('KP_Page_Down', 'se', { name => 'keypad:keypad' }); $::world->macro('KP_Subtract', 'down', { name => 'keypad:keypad' }); $::world->macro('KP_Add', 'up', { name => 'keypad:keypad' }); $::world->macro('KP_Begin', 'who', { name => 'keypad:keypad' }); $::world->macro('KP_Insert', 'look', { name => 'keypad:keypad' }); $::world->macro('KP_Divide', 'inventory', { name => 'keypad:keypad' }); $::world->macro('KP_Multiply', 'score', { name => 'keypad:keypad' }); sub help { $::world->echonl("Allows use of the keypad for movement (and a few other", "actions). NumLock must be off for this plugin to work."); } kildclient-2.11.1/share/plugins/notes.pl0000644000175000017500000000504011405233113015077 00000000000000package notes; #: Version: 1.0.0 #: Description: Assing notes to worlds #: Author: Eduardo M Kalinowski # # $Id: notes.pl 1014 2009-02-01 12:46:52Z ekalin $ BEGIN { eval "use Gtk2 -init;"; die "This plugin requires the gtk-perl bindings" if $@; } $::world->makepermanent('$notes::notetext'); our $window_created = 0; our $window; our $text_buffer; sub help { $::world->echonl("", "This plugin allows you to assign notes to World. The notes are saved", "with the World and are restored when it is opened again.", "", "Run /notes::edit to open a window where you can edit the notes.", "", "Run /notes::clear to clear the contents of the notes.", "", "It is possible to append something to the notes with /notes::append('text')", "This is probably more useful in scripts." ); } sub edit { unless ($window_created) { create_window(); $window->show_all(); $window_created = 1; } $window->present; } sub clear { $notetext = ""; update_text_view(); } sub append { my $newtext = $_[0]; $newtext .= "\n" unless (substr($_[0], -1) eq "\n"); $notetext .= $newtext; update_text_view(); } sub UNLOAD { if ($window_created) { update_text(); $window->destroy; } } sub create_window { $window = Gtk2::Window->new; $window->set_title("Notes for " . $::world->getname()); $window->signal_connect(delete_event => sub { update_text(); $window->hide(); return 1; }); $window->signal_connect(focus_out_event => sub { update_text(); }); my $vbox = Gtk2::VBox->new; my $scroll_win = Gtk2::ScrolledWindow->new; $scroll_win->set_policy('never', 'always'); my $text_view = Gtk2::TextView->new; $text_view->set_size_request(400, 150); $text_buffer = $text_view->get_buffer; update_text_view(); $scroll_win->add($text_view); $vbox->pack_start($scroll_win, 1, 1, 0); my $btn_close = Gtk2::Button->new_from_stock('gtk-close'); $btn_close->signal_connect(clicked => sub { update_text(); $window->hide; $window_displayed = 0; }); $vbox->pack_start($btn_close, 0, 0, 0); $window->add($vbox); } sub update_text { $notetext = $text_buffer->get_text($text_buffer->get_bounds(), 0); } sub update_text_view { return unless $text_buffer; if (defined($notetext)) { $text_buffer->set_text($notetext); } } kildclient-2.11.1/share/plugins/Makefile.am0000644000175000017500000000036111413362040015450 00000000000000# $Id: Makefile.am 1132 2010-07-01 13:18:55Z ekalin $ pkgplugindir = $(pkgdatadir)/plugins pkgplugin_DATA = chat.pl \ easypath.pl \ KCWin.pl \ keypad.pl \ notes.pl \ kc256.pl \ channels.pl EXTRA_DIST = $(pkgplugin_DATA) kildclient-2.11.1/share/plugins/KCWin.pl0000644000175000017500000000613711412460652014742 00000000000000package KCWin; #: Version: 2.0.0 #: Description: Creates general-purpose windows with an input and output area #: Author: Eduardo M Kalinowski # # $Id: KCWin.pl 1014 2009-02-01 12:46:52Z ekalin $ BEGIN { eval "use Gtk2"; die "This plugin requires the gtk2-perl bindings" if $@; } use base 'Gtk2::Window'; sub help { $::world->echonl(<<'EOHELP'); This plugin defines a new type, KCWin, which is a small window with an area for output and an entry box for input. These windows do nothing by themselves, but they can be used by other plugins when they need a window for input and output. The output area supports ANSI colors and thus is like a mini MUD window. Use KCWin->new to create a new window. KCWin derives from Gtk2::Window so you can use all of its methods. The widgets are accessible for customization. If $kcw is a KCWin, the following widgets are available: - $kcw->{VBOX}, Gtk2::VBox, the vertical box that contains the output and input areas. - $kcw->{SCROLLWIN}, Gtk2::ScrolledWindow, this holds the TextView that is used for output. - $kcw->{TEXTVIEW}, Gtk2::TextView, is the widget used for output. - $kcw->{TEXTBUFFER}, Gtk2::TextBuffer, for convenience, the TextBuffer displayed in the window. - $kcw->{CMDAREA}, Gtk2::HBox, a box that holds a button to clear the input area, and the input area itself. - $kcw->{BTNCLEAR}, Gtk2::Button, a button that clears the input entry widget when clicked. - $kcw->{ENTRY}, Gtk2::Entry, the input entry widget. Connect to the activate signal of this widget to do something when the user presses ENTER in this widget. The widgets can be used, and the window can be customized (by adding other widgets, for example). Three common actions have functions in KCWin as a shortcut: $text = KCWin::get_text Returns the text in the entry box. KCWin::set_text($text) Sets the text in the entry box. KCWin::feed($text) Appends text to the output terminal widget. $text can contain ANSI color sequences. The colorize function can be useful in conjuntion with this function. EOHELP } sub new { my $class = shift; my ($windowPTR, $vboxPTR, $scrollwinPTR, $txtViewPTR, $txtBufferPTR, $cmdareaPTR, $btnclearPTR, $entryPTR, $guiPTR) = KCWin::_new; my $self = bless Glib::Object->new_from_pointer($windowPTR), $class; $self->{VBOX} = Glib::Object->new_from_pointer($vboxPTR); $self->{SCROLLWIN} = Glib::Object->new_from_pointer($scrollwinPTR); $self->{TEXTVIEW} = Glib::Object->new_from_pointer($txtViewPTR); $self->{TEXTBUFFER} = Glib::Object->new_from_pointer($txtBufferPTR); $self->{CMDAREA} = Glib::Object->new_from_pointer($cmdareaPTR); $self->{BTNCLEAR} = Glib::Object->new_from_pointer($btnclearPTR); $self->{ENTRY} = Glib::Object->new_from_pointer($entryPTR); $self->{_GUIPTR} = $guiPTR; return $self; } sub destroy { my $self = shift; $self->_destroy(); $self->SUPER::destroy(); } sub get_text { my $self = shift; return $self->{ENTRY}->get_text; } sub set_text { my $self = shift; my ($text) = @_; return $self->{ENTRY}->set_text($text); } kildclient-2.11.1/share/plugins/channels.pl0000644000175000017500000000546111417424017015561 00000000000000package channels; #: Version: 0.2 #: Description: Separates out regex-matching lines into a new window #: Author: Jakykong # # $Id: channels.pl 1133 2010-07-14 21:11:43Z ekalin $ # # I, the author, hereby release this file into the public domain. Hack away. BEGIN { $::world->requireplugin('KCWin'); } #Gag everything, but we'll echonl things that don't match. $::world->trigger('.*','/channels::check($_[0], "$colorline")', {gag => 1, keepexecuting => 1} ); sub help { $::world->echonl(<<"EOHELP"); Channels is a simple plugin to yank lines out of the world window and put then in other windows. It's most obvious use is chat channels, which usually have something like "[NAME]" at the beginning. Once the plugin is loaded, there is only one function to call: /channels::new("name","regex"); where "name" is the name that should appear in the title bar of the new window, and "regex" is the pattern to match for text. Use /channels::list() for a list of currently defined channels. To remove a channel, use /channel::del(num), where num is the number of the channel. Enjoy! EOHELP } #Holds the channels and associated windows. my %chans = (); my %windowlist = (); my $bank = 0; sub check { #Check for matches. Echo to the respective window. my ($line, $colorline) = @_; my $result = 0; foreach $k ( keys %chans ) { if ( "$line" =~ m/$k/ ) { $result = 1; $chans{"$k"}->feed("$colorline"); } } unless ( $result ) { $::world->echo("$colorline"); } } sub del { #Deletes a channel, by the number given. my $number = $_[0]; foreach $k ( keys %chans ) { if ( "$k" eq $windowlist->{$number}[1] ) { $chans{$k}->destroy(); delete $chans{$k}; delete $windowlist{$k}; } } } sub new { #Creates a new channel. my ($name, $regex) = @_; $chans{$regex} = new_window($name); $bank = $bank + 1; $windowlist->{$bank} = [$bank,$regex,$name]; $::world->echonl( ::colorize("&rCreated channel #$bank, $name.") ); } sub list { #Lists all open windows foreach $i ( keys %windowlist ) { $k = @windowlist->{$i}[2]; $world::->echonl( "#$i: $k" ); } } sub new_window { #Returns a new KCWindow without displaying the clear button. #Syntax: new_window(name,func) where func is optional. my $n = $_[0]; my $window = KCWin->new; #Pass a function to new_window to have it run on close. #Default behavior is to simply hide the window, #so you can show it later via $window->show(). if ( @_ > 1 ) { my $func = $_[1]; } else { my $func = sub{ $window->hide(); }; } $window->set_title("$n"); $window->signal_connect(delete_event => sub { &func(); return 1; }); $window->{BTNCLEAR}->hide; $window->{VBOX}->show_all; $window->{BTNCLEAR}->hide; $window->show; return $window; } sub UNLOAD { #Destroys any remaining channel windows. foreach $k ( keys %chans ) { $chans{"$k"}->destroy; } } kildclient-2.11.1/share/kildclient.ico0000744000175000017500000000427611405233113014562 00000000000000 ¨( @€    %'-003BG$CG$U[.dk6el6fm7ÿÿÿ     ÿÿàÿÿ€‡ÿ‡þ ƒüÃüÃü?ÃüÁüÿáüÿáüÿáüçáüÇðøÇðð‡ððð`Àðùçøÿÿøÿÿøÿÿø?ÿø@ÿøpÿø<ÿø?ÿø?€ø?à?ø?ð?ü?ø?ü?þ?ÿÿÿÿkildclient-2.11.1/share/kildclient.hlp0000644000175000017500000013545311434236162014605 00000000000000$Id: kildclient.hlp 1134 2010-08-22 15:04:17Z ekalin $ [index] Use help "functionname" to get help on that function. The quotes are necessary. [help] help function: displays HELP syntax: help "function" Displays help for the given function. The name of the function is passed as a string, so it must be in quotes. [quit] quit function: QUITs kildclient Syntax: quit Disconnects and closes all Worlds and KildClient exits. [dc] dc function: DisConnects from world Syntax: $world->dc Disconnects from the current world. [reconnect] reconnect function: RECONNECTs to the world Syntax: $world->reconnect When in offline mode, this function will attempt to reconnect to the mud. [connectother] connectother function: CONNECTS to anOTHER world Syntax: $world->connectother This function allows you to select another World to connect to, using the same window. If you are connected, you will be first disconnected from the current server. [save] save function: SAVEs the current world Syntax: $world->save Saves the current World. [minimize] minimize function: MINIMIZEs the window Syntax: $window->minimize This function minimized KildClient's main window. Called from a macro, it makes a nice boss key. :-) [getname] getname function: GETs the NAME of the world Syntax: $name = $world->getname This function returns the name of the world. [getcharacter] getcharacter function: GETs the name of the connected CHARACTER Syntax: $name = $world->getcharacter If autologin was used, this function returns the name of the character used to log in to the mud. If autologin is disabled, this function returns undef. [getmainfont] getname function: GETs the MAIN window FONT Syntax: $font = $world->getmainfont This function returns the name of the font used in the main MUD window, that is, where the output of the world appears. [getentryfont] getentryfont function: GETs the command ENTRY box FONT Syntax: $font = $world->getentryfont This function returns the name of the font used in the command entry box. [getconntime] getconntime function: GETs the CONNection TIME Syntax: $seconds = $world->getconntime This function returns the time spent connected to the world, in seconds. [getidletime] getidletime function: GETs the IDLE TIME Syntax: $seconds = $world->getidetime This function returns the idle time, that is, the time elapsed since the last command was sent, in seconds. [getsize] getsize function: GETs the current window SIZE Syntax: ($lines, $columns) = $window->getsize $columns = $window->getsize This function returns the current size of the window (in characters), in terms of lines and columns. It can return both dimensions, or just the number of columns. [getversion] getversion function: GETs the KildClient VERSION number Syntax: $version = getversion This function returns the version number of KildClient. [next] next function: goes to the NEXT world Syntax: $world->next([number]) If used without arguments, this function focuses the next open world. You can also give a numeric argument X, in this case it focuses the Xth world after the current one. [prev] prev function: goes to the PREVious world Syntax: $world->prev([number]) If used without arguments, this function focuses the previous open world. You can also give a numeric argument X, in this case it focuses the Xth world before the current one. [gotow] gotow function: GOes TO a World Syntax: gotow number gotow "name" Focuses the Nth world (when called with a number) or the world with the given name (when called with a string). The first world is numbered 0. [getworld] getworld function: GETs a pointer to a WORLD Syntax: $var = getworld("name") Returns a variable that points to the open world with the given name. You can then manipulate that world with the returned variable (by calling functions that operate on worlds with that variable). For example: $coolmud = getworld("CoolMud"); $coolmud->send("quit"); This will send "quit" to the CoolMud world. [close] close function: CLOSEs the current world Syntax: $world->close Disconnects and closes the current world, immediately. [commandecho] commandecho function: sets or gets the status of the COMMAND ECHO feature Syntax: $world->commandecho(boolean) $status = $world->commandecho When used with an argument, this sets the command echo option for the current world to the given value (which should be false to cause commands not to be echoed or true to cause them to be echoed). If called without arguments, it doesn't change the status of that option, but returns its current value. [echo] echo function: ECHOes something to the terminal window Syntax: $world->echo("str1", "str2", ...) Prints the strings in the terminal window. They are not sent to the world. [echonl] echonl function: ECHOes to the terminal window, followed by NewLine Syntax: $world->echonl("str1", "str2", ...) Prints the strings in the terminal window, each followed by a newline. They are not sent to the world. [send] send function: SENDs something to the world Syntax: $world->send("str1", "str2", ...) Sends any number of strings to the current world. [sendlines] sendlines function: SENDs several LINES to the world Syntax: success = $world->sendlines( "multi-line string", [delay , [n-lines]] ) success = $world->sendlines( [ "line 1", "line 2", ... ] , [delay , [n-lines]] ) Sends several lines of text to the world. delay is the number of seconds to wait between sending each group of lines, and n-lines is the number of lines to send a time. If these values are not specified, they are taken from the defauls set in the Preferences dialog. There are two ways to specify the lines to be sent: the first is passing a multi-line string, which is split into lines and each line is sent separately. The second one is passing a reference to an array where each element consists of one line. This function always returns true. For more options, see the $world->mlsend() function which allows adding a text before and/or after each line, and sending lines before and/or after sending the contents of the file. [sendfile] sendfile function: SENDs a FILE to the world Syntax: success = $world->sendfile(file [, delay [, n-lines]]) Sends the contents of the given file to the world. delay is the number of seconds to wait between sending each group of lines, and n-lines is the number of lines to send a time. If these values are not specified, they are taken from the defauls set in the Preferences dialog. On success, returns true. If the file does not exist or cannot be open, this function does nothing and returns a false value. It returns undef if the file name is not specified. For more options, see the $world->mlsend() function which allows adding a text before and/or after each line, and sending lines before and/or after sending the contents of the file. [mlsend] mlsend function: Multi-Line SEND Syntax: success = $world->mlsend( attributes ); This functions emulates the Multi-line Send feature from perl scripts. Several lines can be sent at once, optionally prefixing and/or suffixing each line with text you specify. It's also possible to send the contents of a file to the MUD. The lines can be sent with customized intervals between them (so as not to cause buffer overflows that lead to a disconnection from the server). atributes is a reference to a hash defining attributes for the timer. Generally the call works like this: $world->mlsend({ attribute1 => value1, attribute2 => value2, ... }) Possible attributes: initialtext - Lines of text to be sent to the MUD before anything else. You can specify this argument in two ways: one is as a string composed of several lines, KildClient will split the string and send each line separately. The second option is to pass a reference to an array, where each element is a line. The following two call are thus equivalent: $world->mlsend({ initialtext => "First line\nSecond line\nLast line" }) $world->mlsend({ initialtext => [ "First line", "Second line", "Last line" ]}) file - The path to a file whose contents are to be sent, line by line, after sending the initialtext (if present), but before sending finaltext. finaltext - Lines to be sent after the file contents has been sent (if a file was specified). This is very similar to initialtext, and can be given also as a multi-line string or as a reference to an array of lines. linestart - If present, specifies a string that is prepended to each line as it is sent to the mud. lineend - If present, specifies a string that is appended to each line as it is sent to the mud. delay - The delay, in seconds, between each group of lines. If you are getting disconnected for sending too much text at once, increase this value. If not given, the value is taken from the Global Preferences. linesatime - The number of lines to be sent at a time. If not given, the value is taken from the Global Preferences. On success, returns true. If the file does not exist or cannot be open, this function does nothing and returns a false value. It returns undef if invalid parameters are specified. You might also want to see the $world->sendlines() and $world->sendfile() functions which are simpler ways of sending several lines or the contents of a file at once, respectively. [sendnoecho] sendnoecho function: SENDs something to the world, with NO ECHO Syntax: $world->sendnoecho("str1", "str2", ...) Sends any number of strings to the current world, without echoing them to the main window, regardless of the current setting of the command echo option. [sendecho] sendecho function: SENDs something to the world, with ECHO Syntax: $world->sendecho("str1", "str2", ...) Sends any number of strings to the current world, echoing them to the main window, regardless of the current setting of the command echo option. [interpret] interpret function: INTERPRETs a string as if typed in the input box Syntax: $world->interpret("string") This function interprets the string as if it were typed in the input box: commands are split, Perl code is run, aliases are expanded, etc. [getline] getline function: GETs a LINE from the scrollback buffer Syntax: $text = $world->getline(line); ($text, $time) = $world->getline(line); This functions allows you to retrieve a line from the scrollback buffer, and optionally the time in which it was received. line can be a positive number, representing the number of the line to fetch, or a negative number. If negative, that means that number of lines counting from the bottom. (That is, -1 is the last received line, -2 the one before the last, and so on.) If the line cannot be retrieved (because it is not stored anymore), returns undef. The time returned is represented as the number of seconds since the epoch, the same kind of value the time function would return. [settitle] settitle function: SETs the window TITLE Syntax: $window->settitle("new title") Sets the title of the window to the given string. [setstatus] setstatus function: SETs the STATUS bar text Syntax: $world->setstatus("message") Sets the text in the main window status bar to "text". [seturgencyhint] seturgencyhint function: SETs the URGENCY window HINT Syntax: $window->seturgencyhint(boolean) Sets the value of the window's "urgency" flag to true or false. This is a request for attention to the window, and usually will make the window title flash. However note that the actual behavior depends on the window manager used. [play] play function: PLAY a sounf file Syntax: play("file") Plays the sound file whose path is given as argument. Supports WAV files. [trigger] trigger function: creates a TRIGGER Syntax: $world->trigger(["pattern" [, "action"]] [, attributes]) Syntax: $world->trigger(number, "pattern", "action") Creates a new trigger, or edits the trigger identified by number, matching pattern (a Perl regular expression), that will execute action when a line is matched by pattern. action is interpreted as if it were typed in the command box. Simple strings get sent to the world, Perl code can be run by prefixing it with '/', etc. Atributes is a reference to a hash defining attributes for the trigger. Generally the call works like this: $world->trigger("pattern", "action", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: pattern - The pattern to match action - The action to execute enabled - If value evaluates to true, the trigger is enabled. If it evaluates to false, the trigger is disbled and lines are not matched against it. name - Assigns a name to the trigger, so that it can be referenced by name. ignorecase - If true, ignore case when matching the pattern. gag - If value evaluates to true, the trigger gags the line that triggered it. gaglog - If value evaluates to true, the line is not written to the log file. keepexecuting - If the value evaluates to true, when a line matches the trigger, the actions for the trigger are executed, and matching of the line continues against other triggers. If this is false (the default), when this trigger matches no other triggers are matched. rewriter - This trigger is a rewriter trigger. It is run before other triggers, does not prevent any other trigger from running (even if keepexecuting is false), and can alter the input line for further processing by changing the $colorline variable. For more details, see the manual. style - Used to control the changing of styles (color, attributes, etc.) of a matched part of the line. See the help for style for details. [style] style attribute for triggers When a trigger matches against a line, it can change the style of the matched line, the matched part or one of the matched substrings. (This feature is sometimes called highlighting.) To specify that a trigger should change the style, use the style attribute when adding or editing the trigger. The value of this attribute is an anonymous hash that specifies everything that is to be changed. Here's an example: $world->trigger('Joe', { name => 'joe', style => { enabled => 1, fg => 16 } }); These are the valid attributes: enabled - Set this to 1 to enable changing the style. target - What to highlight. Possible values are: -1 - The whole matched line 0 - The whole substring that matched 1 - The first captured substring 2 - The second captured substring 3 - etc. fg - What to do with the foreground colour. -1 means not to change it. Other values change to the given color, as follows: 0 - black 9 - black (bold) 1 - red 10 - red (bold) 2 - green 11 - green (bold) 3 - yellow 12 - yellow (bold) 4 - blue 13 - blue (bold) 5 - magenta 14 - magenta (bold) 6 - cyan 15 - cyan (bold) 7 - white 16 - white (bold) 8 - the default color 17 - default bold color bg - What to do with the background color. The values are the same as for the foreground color. italics - Italics setting. -1 means do not change. 0 means to not use italics, and 1 means to use it. strike - Strike-thru setting. -1 means do not change. 0 means disable it, and 1 means enable it. underline - Underline setting. -1 means no change. 0 means no underline. 1 means single underline, and 2 means double underline. [gag] gag function: adds a simple GAG Syntax: $world->gag("pattern") Adds a gag that prevents lines matching pattern from being shown. See the trigger function for more advanced options. [distrigger] distrigger function: DISables a TRIGGER Syntax: $world->distrigger(number/name...) Disables the trigger identified by number or name. [enatrigger] enatrigger function: ENAbles a TRIGGER Syntax: $world->enatrigger(number/name...) Enables the trigger identified by number or name. [triggerenabled] triggerenabled function: checks whether a TRIGGER is ENABLED Syntax: result = $world->triggerenabled(name/number) This function checks whether the specified trigger exists and whether it is enabled. You can pass either a trigger number or name. If the trigger does not exist, this function returns undef, so you can distinguish the case of a non-existant trigger from a disabled one. If the trigger exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several triggers with the same name, it returns a list with one value for each trigger with that name, and each value is 0 or 1 depending on the state of the trigger. [listtrigger] listtrigger function: LISTs one or all TRIGGERs Syntax: $world->listtrigger Briefly lists all defined triggers. Syntax: $world->listtrigger(number/name...) Lists detailedly the trigger with the given number or name. [deltrigger] deltrigger function: DELETEs a TRIGGER Syntax: $n = $world->deltriger(number/name...) Deletes the trigger identified by the given number or name. If there are several triggers with the same name, deletes them all. Returns the number of triggers deleted. [movetrigger] movetrigger function: MOVEs a TRIGGER to another position Syntax: $world->movetrigger(number/name, new_pos) Moves the trigger with the given name or number so that it occupies the position new_pos after execution of this function. Other triggers might be moved up or down in result of this. If new_pos is negative or greater than the number of triggers, the trigger is moved to the last position. If there are several triggers with the given name, only the first one found is moved. [alias] alias function: creates an ALIAS Syntax: $world->alias(["pattern" [, "substitution"]] [, attributes]) $world->alias(number, ["pattern" [, "substitution"]] [, attributes]) Creates a new alias, or edits the alias identified by number. Entered commands will be matched against pattern (a Perl regular expression), and if the pattern matches, the given substitution will be applied. (In a s/pattern/substitution/ structure.) Be careful that any part of the command can match. To match only the exact string, use something like '^command$'. To match only in the beginning of the line, use '^command'. Atributes is a reference to a hash defining attributes for the alias. Generally the call works like this: $world->alias("pattern", "action", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: pattern - The pattern to match substitution - The substitution to do ignorecase - If true, ignore case when matching the pattern. perleval - If true, the substitution is made passing the "e" flag (s/pattern/substitution/e), so substitution should be actually Perl statements to be evaluated when there is a match. enabled - If value evaluates to true, the alias is enabled, if false, it is disabled and commands are not matched against it. name - Assigns a name to the alias, so that it can be referenced by name. [disalias] disalias function: DISables an ALIAS Syntax: $world->disalias(number/name...) Disables the alias identified by number or name. [enaalias] enaalias function: ENAbles an ALIAS Syntax: $world->enaalias(number/name...) Enables the alias identified by number or name. [aliasenabled] aliasenabled function: checks whether a ALIAS is ENABLED Syntax: result = $world->aliasenabled(name/number) This function checks whether the specified alias exists and whether it is enabled. You can pass either a alias number or name. If the alias does not exist, this function returns undef, so you can distinguish the case of a non-existant alias from a disabled one. If the alias exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several aliases with the same name, it returns a list with one value for each alias with that name, and each value is 0 or 1 depending on the state of the alias. [listalias] listalias function: LISTs one or all ALIASes Syntax: $world->listalias Briefly lists all defined aliases. Syntax: $world->listalias(number/name...) Lists detailedly the alias with the given number or name. [delalias] delalias function: DELETEs an ALIAS Syntax: $n = $world->delalias(number/name...) Deletes the alias identified by the given number or name. If there are several aliases with the same name, deletes them all. Returns the number of aliases deleted. [movealias] movealias function: MOVEs an ALIAS to another position Syntax: $world->movealias(number/name, new_pos) Moves the alias with the given name or number so that it occupies the position new_pos after execution of this function. Other aliases might be moved up or down in result of this. If new_pos is negative or greater than the number of aliases, the alias is moved to the last position. If there are several aliases with the given name, only the first one found is moved. [expandalias] expandalias function: EXPANDs ALIASes in a string Syntax: $result = $world->expandalias("string") This function expands aliases in the string passed as argument. The result is what you would get if you typed "string" in the input box (except that aliases are still expanded even if "Disable Aliases" is selected in the "Preferences" menu). [getkeycode] getkeycode function: GETs the KEYCODE for a key combination Syntax: $key = $world->getkeycode After running this function, press a key (or a combination of keys). The keycode (to be used in the macro function) will be returned and also printed in the screen. [macro] macro function: creates a MACRO Syntax: $world->macro(["keycode" [, "action"]] [, attributes]) $world->macro(number, ["keycode" [, "action"]] [, attributes]) Creates a new macro, or edits the macro identified by number. Keycode represents a key such as "KP_Home" or "F12". The format is the one accepted by the GTK+ function gtk_accelerator_parse(), but most of the time you will want to use the "getkeycode" function to retrieve the keycode for a given key. Action is what will be executed when the key (or keys) is pressed. Atributes is a reference to a hash defining attributes for the macro. Generally the call works like this: $world->macro("keycode", "action", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: key - The key code. action - The action to be executed. enabled - If value evaluates to true, the macro is enabled, if false, it is disabled. name - Assigns a name to the macro, so that it can be referenced by name. [dismacro] dismacro function: DISables a MACRO Syntax: $world->dismacro(number/name...) Disables the macro identified by number or name. [enamacro] enamacro function: ENAbles a MACRO Syntax: $world->enamacro(number/name...) Enables the macro identified by number or name. [macroenabled] macroenabled function: checks whether a MACRO is ENABLED Syntax: result = $world->macroenabled(name/number) This function checks whether the specified macro exists and whether it is enabled. You can pass either a macro number or name. If the macro does not exist, this function returns undef, so you can distinguish the case of a non-existant macro from a disabled one. If the macro exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several macros with the same name, it returns a list with one value for each macro with that name, and each value is 0 or 1 depending on the state of the macro. [listmacro] listmacro function: LISTs one or all MACROs Syntax: $world->listmacro Briefly lists all defined macros. Syntax: $world->listmacro(number/name...) Lists detailedly the macro with the given number or name. [delmacro] delalias function: DELETEs a MACRO Syntax: $n = $world->delmacro(number/name...) Deletes the macro identified by the given number or name. If there are several macros with the same name, deletes them all. Returns the number of macros deleted. [movemacro] movemacro function: MOVEs a MACRO to another position Syntax: $world->movemacro(number/name, new_pos) Moves the macro with the given name or number so that it occupies the position new_pos after execution of this function. Other macros might be moved up or down in result of this. If new_pos is negative or greater than the number of macros, the macro is moved to the last position. If there are several macros with the given name, only the first one found is moved. [timer] timer function: creates a TIMER Syntax: $world->timer(attributes) $world->timer(number, attributes) Creates a new timer, or edits the timer identified by number. Atributes is a reference to a hash defining attributes for the timer. Generally the call works like this: $world->timer({ attribute1 => value1, attribute2 => value2, ... }) Possible attributes: interval - Number of seconds between each execution. Required. count - Number of times to execute the timer. After this number of executions, the timer will be automatically disabled or deleted (see temporary flag below). If count is not given or count is -1, the timer repeats until manually disabled or deleted. action - The action to execute. Required. temporary - If set to 1, the timer will be deleted (and not only disabled) after count executions have happened. enabled - If set to 1, the timer is enabled and will execute every count seconds. If set to 0, the timer does not execute until enabled again. New timers are created enabled by default. name - Assigns a name to the timer, so that it can be referenced by name. [listtimer] listimer function: LISTs one or all TIMERs Syntax: $world->listimer Briefly lists all defined timers. Syntax: $world->listtimer(number/name...) Lists detailedly the timer with the given number or name. [deltimer] deltimer function: DELETEs a TIMER Syntax: $n = $world->deltimer(number/name...) Deletes the timer identified by the given number or name. If there are several timers with the same name, deletes them all. Returns the number of timers deleted. [distimer] distimer function: DISables a TIMER Syntax: $world->distimer(number/name...) Disables the timer identified by number or name. [enatimer] enatimer function: ENAbles a TIMER Syntax: $world->enatimer(number/name...) Enables the timer identified by number or name. [timerenabled] timerenabled function: checks whether a TIMER is ENABLED Syntax: result = $world->timerenabled(name/number) This function checks whether the specified timer exists and whether it is enabled. You can pass either a timer number or name. If the timer does not exist, this function returns undef, so you can distinguish the case of a non-existant timer from a disabled one. If the timer exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several timers with the same name, it returns a list with one value for each timer with that name, and each value is 0 or 1 depending on the state of the timer. [movetimer] movetimer function: MOVEs a TIMER to another position Syntax: $world->movetimer(number/name, new_pos) Moves the timer with the given name or number so that it occupies the position new_pos after execution of this function. Other timers might be moved up or down in result of this. If new_pos is negative or greater than the number of timers, the timer is moved to the last position. If there are several timers with the given name, only the first one found is moved. [makepermanent] makepermanent function: MAKEs variables PERMANENT Syntax: $world->makepermanent('var1' [, 'var2' [, ...]]) This function marks one or more variables as permanent, that is, the values of these variables will be saved when the world is closed, and reloaded when the world is opened, thus keeping their values between successive uses of the world. The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation. [maketemporary] maketemporary function: MAKEs variables TEMPORARY Syntax: $world->maketemporary('var1' [, 'var2' [, ...]]) This function marks one or more variables as temporary, that is, the values of these variables will not be saved when the world is closed. This is the standard behaviour for variables, so this function is only needed to undo the efects of the makepermanent() function. The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation. [ispermanent] ispermanent function: checks wheter a variable IS PERMANENT Syntax: $return = $world->ispermanent('var']) This function tests if a variable is permanent. The return value is true or false depending on the variable's status. The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation. [listpermanent] listpermanent function: LISTs PERMANENT variables Syntax: $world->listpermanent This function prints a list of all variables that are defined as permanent, that is, variables that will be saved when you close the world and have their values restores when the world is re-opened. [hook] hook function: connects a HOOK Syntax: $world->hook(event, action, attributes) $world->hook(event, number, [action], [attributes]) A hook is an action that is connected to an event, such as connecting to the World or the window receiving focus. This functions allow you to define a hook for a given event, that will execute action, or to edit the hook identifyed by number. Here are the events currently supported: - OnConnect: This hook is executed when a connection to the world is made, after the auto-logon has taken place (if applicable). - OnDisconnect: This hook is executed when you are disconnected from a World, after the connection has been closed. - OnReceivedText: Executed when text is received from the world. The received text is available in the $hookdata variable. - OnSentCommand: Executed after a command is sent to the world. The command is available in the $hookdata variable. - OnGetFocus: Executed when the KildClient window receives the focus. - OnLoseFocus: Executed when the KildClient window loses the focus. - OnCloseConnected: Executed when the world is forcedly closed. This can happen using the World->Close menu, the $world->close() function, or by quitting the program with the world connected. You can put in this hook, for example "quit" to always exit the MUD nicely, even if you close the world by mistake. atributes is a reference to a hash defining attributes for the hook. Generally the call works like this: $world->hook("event", "action", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: action - The action to be executed. enabled - If value evaluates to true, the hook is enabled. If it evaluates to false, the hook is disbled and is not executed. name - Assigns a name to the hook, so that it can be referenced by name. [listhook] listhook function: LISTs connected HOOKs Syntax: $world->listhook(event) This function briefly lists all hooks connected to the given event. Syntax: $world->listhook(event, name/number...) Lists detailedly the hook with the given number or name, connected to the specified event. If there are several hooks with the same name, lists them all. [delhook] delhook function: DELetes a HOOK Syntax: $n = $world->delhook(event, number/name...) Deletes the hook identified by the given number or name, connected to the specified event. If there are several hooks with the same name, deletes them all. Returns the number of deleted hooks. [dishook] dishook function: DISables a HOOK Syntax: $world->dishook(event, number/name...) Disables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, disables them all. [enahook] enahook function: ENAbles a HOOK Syntax: $world->enahook(event, number/name...) Enables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, enables them all. [hookenabled] hookenabled function: checks whether a HOOK is ENABLED Syntax: result = $world->hookenabled(event, name/number) This function checks whether the specified hook exists and whether it is enabled. The first argument is the name of the event. For the second, you can pass either a hook number or name. If the hook does not exist, this function returns undef, so you can distinguish the case of a non-existant hook from a disabled one. If the hook exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several hooks with the same name, it returns a list with one value for each hook with that name, and each value is 0 or 1 depending on the state of the hook. [movehook] movehook function: MOVEs a HOOK to another position Syntax: $world->movehook(event, number/name, new_pos) Moves the hook with the given name or number, connected to the given event, so that it occupies the position new_pos after execution of this function. Other hooks might be moved up or down in result of this. If new_pos is negative or greater than the number of hooks, the hook is moved to the last position. If there are several hooks with the given name, only the first one found is moved. [gettriggernumber] gettriggernumber function: GETs a TRIGGER's NUMBER Syntax: @numbers = $world->gettriggernumber(name) Returns a list with the number(s) of the trigger(s) matching the given name. If no trigger with that name is found, returns an empty list. If there are several triggers with the same name, returns the numbers of all of them. The number of a trigger is necessary to edit it. However, as the user can change the order of triggers, create new ones and delete old triggers, a trigger's number may change, so you should not store its number; you must fetch the number just before editing it. [getaliasnumber] getaliasnumber function: GETs an ALIAS's NUMBER Syntax: @numbers = $world->getaliasnumber(name) Returns a list with the number(s) of the alias(es) matching the given name. If no alias with that name is found, returns an empty list. If there are several aliases with the same name, returns the numbers of all of them. The number of an alias is necessary to edit it. However, as the user can change the order of aliases, create new ones and delete old aliases, an alias's number may change, so you should not store its number; you must fetch the number just before editing it. [getmacronumber] getmacronumber function: GETs a MACRO's NUMBER Syntax: @numbers = $world->getmacronumber(name) Returns a list with the number(s) of the macro(s) matching the given name. If no macro with that name is found, returns an empty list. If there are several macros with the same name, returns the numbers of all of them. The number of a macro is necessary to edit it. However, as the user can change the order of macros, create new ones and delete old macros, a macro's number may change, so you should not store its number; you must fetch the number just before editing it. [gettimernumber] gettimernumber function: GETs a TIMER's NUMBER Syntax: @numbers = $world->gettimernumber(name) Returns a list with the number(s) of the timer(s) matching the given name. If no timer with that name is found, returns an empty list. If there are several timers with the same name, returns the numbers of all of them. The number of a timer is necessary to edit it. However, as the user can change the order of timers, create new ones and delete old timers, a timer's number may change, so you should not store its number; you must fetch the number just before editing it. [gethooknumber] gethooknumber function: GETs a HOOK's NUMBER Syntax: @numbers = $world->gethooknumber(event, name) Returns a list with the number(s) of the hook(s) matching the given name. If no hook with that name is found, returns an empty list. If there are several hooks with the same name, returns the numbers of all of them. You must specify the event in which to search for the hook. The number of a hook is necessary to edit it. However, as the user can change the order of hooks, create new ones and delete old hooks, a hook's number may change, so you should not store its number; you must fetch the number just before editing it. [loadplugin] loadplugin function: LOADs a PLUGIN Syntax: $world->loadplugin("name") $world->loadplugin("file") Loads a plugin. You can either pass a full path for the file that defines the plugin, or just its name. If you provide only the name, a file with that name (and the extesion .pl, if the extension is not already provided) will be looked for in the directories specified by the @PLUGINDIRS array. By default, this array contain two directories: one where KildClient stores some of its files (generally /usr/local/share/kildclient/plugins) and one in the user's home directory (~/.kildclient/plugins), but feel free to add more directories to search plugins for. This function returns true if the plugin was successfully loaded, and false otherwise (including the case in which the plugin was already loaded). See also requireplugin() for a way to load a plugin unless it is already loaded. [requireplugin] requireplugin function: REQUIREs a PLUGIN to be loaded Syntax: $world->loadplugin("name") This function is similar to loadplugin, but first checks if the plugin is already loaded. If it is, it returns successfully. If not, it tries loading the plugin (silently). If this succeeds, the function returns successfully, if not, it die()'s. This function is useful in plugins that require other plugins, and is meant to be called in a BEGIN block of a plugin that requires another. The argument passed must be the name of the plugin (a path to the file is not allowed, unlike with loadplugin See loadplugin for information on how plugins are found. [listplugin] listplugin function: LISTs loaded PLUGINs Syntax: $world->listplugin Briefly lists all loaded plugins. Syntax: $world->listplugin(name/number) Gives detailed information on the given plugin. [getpluginversion] getpluginversion function: GETs a PLUGIN's version Syntax: $version = $world->getpluginversion("name") This function returns the version of the plugin with the given name. If no plugin with that name is loaded, it returns an empty string. [enaplugin] enaplugin: ENAbles a PLUGIN Syntax: $world->enaplugin(name) Enables the specified plugin. [displugin] displugin: DISables a PLUGIN Syntax: $world->displugin(name) Disables the specified plugin. [logfile] logfile function: enables or disables LOGging the output to a FILE Syntax: $world->logfile("file" [, "timeformat"]) Starts logging to the given file. Everything output by the mud will be saved. If timeformat is specified, it is considered a string to be passed to the strftime() function, with special tags that are replace with the current time and/or date, and the resulting string is prefixed to each line. (See the strftime() manual page for the possible tags.) If this argument is not given, nothing is prefixed to the lines. It is not possible to log to more than one file at one time, if there is already a log file open, it will be closed and logging will continue to the new file. Syntax: $world->logfile With no arguments, this function stops logging output. [getlogfile] getlogfile: GETs name of LOGging FILE Syntax $file = $world->getlogfile() This function returns the name of the file to which the output is being logged, or undef if logging is not started for the world. [writetolog] writetolog function: WRITEs something TO the LOG file Syntax: $world->writetolog("line" [, "line", ...]) Writes the given line to the log file, if any. If logging is not currently enabled, then this function does nothing. Each argument is a complete line, that is written preceded by a timestamp, if this is enabled, to the log file. If the string has ANSI codes or codes used by the colorize() function, they will be stripped and not written to the log file. [echonlandlog] echonlandlog function: calls ECHONL and writetoLOG Syntax: $world->echonlandlog("line" [, "line", ...]) This is a convenience function that just calls $world->echonl() and $world->writetolog() for each argument, thus writing the given line(s) to the screen and to the log file. [colorize] colorize function: COLORIZEs a string Syntax: $colorized = colorize "str" Replaces color codes in the string with ANSI escape sequences, so that the string can be echoed in the terminal, for example. Returns the colorized string Color code table (based on the ones used by Smaug): Note: if you want to set both the foreground and the background, the code for the foreground should come first. If you want to set the foreground and/or background and one or more attributes (underline, italics, etc), the attribute setting should come last. Note: to insert a & or ^ character, use && and ^^, respectively. &0 (number zero) - Reset all attributes and colors to default Normal colors: &x - Black &r - Red &g - Green &O - Yellow &b - Blue &p - Magenta &c - Cyan &w - White &d - Default foreground Bold colors: &z - Bold Black &R - Bold Red &G - Bold Green &Y - Bold Yellow &B - Bold Blue &P - Bold Magenta &C - Bold Cyan &W - Bold White &D - Default bold foreground Background colors: ^x - Black ^r - Red ^g - Green ^O - Yellow ^b - Blue ^p - Magenta ^c - Cyan ^w - White ^d - Default background Light background colors (sometimes causes blinking): ^z - Light Black ^R - Light Red ^G - Light Green ^Y - Light Yellow ^B - Light Blue ^P - Light Magenta ^C - Light Cyan ^W - Light White ^D - Default light background Attributes: (may not work on other clients) &_ - Underline on ^_ - All underline off &= - Double underline on &| - Strikethrough on ^| - Strikethrough off &/ - Italics on ^/ - Italics off &i - Inverse video on ^i - Inverse video off &h - Hidden mode on ^h - Hidden mode off You can also also use colorize() to display text in any color of a 6x6x6 RGB color cube. To do so, use &rgbX and ^rgbX to set the foreground and background, respectively. r, g, and b are integers between 0 and 5 representing the amount of red, green and blue. X is really the letter X, it is used to close the code. Finally, to select one of the 24 shades of gray available, use &nG and ^nG for the foreground and background, respectively, where n is an integer from 0 to 23, and G is really the letter G. You can use the kc256 plugin to display all the colors for you to choose from. [stripansi] stripansi function: STRIPs ANSI sequences from the string Syntax: $stripped = stripansi "string" Returns the string stripped of any ANSI sequences that it had. [stripcolorize] stripansi function: STRIPs COLORIZE sequences from the string Syntax: $stripped = stripcolorize "string" Returns the string stripped of any sequences used by the colorize() function to add color. [path] path function: generate sequences of directions forming a PATH Syntax: $world->path "str" str is a string defining a path. The following example shows the features of paths: 3n2e4n2e{ne}e{open door}3n The general syntax syntax is . can be omitted, in this case it is considered as 1. Command is the command that will be repeated. If it is not a one-letter command, it should be enclosed in braces: {}. The example above would generate these commands: n n n e e n n n n e e ne e open door n n n kildclient-2.11.1/share/kildclient.xpm0000644000175000017500000000311611405233113014603 00000000000000/* XPM */ static char * kildclient_xpm[] = { "32 32 27 1", " c None", ". c #000000", "+ c #376D66", "@ c #2C5852", "# c #10201E", "$ c #366B64", "% c #030605", "& c #30605A", "* c #1D3935", "= c #356A64", "- c #18312E", "; c #356A63", "> c #33655F", ", c #040908", "' c #32635C", ") c #010202", "! c #31625B", "~ c #346861", "{ c #000101", "] c #050A09", "^ c #091312", "/ c #2D5A54", "( c #142825", "_ c #203F3B", ": c #132623", "< c #274E49", "[ c #08100F", " ", " ", " ... .. ", " .... .... ", " .... ..... ", " .... ...... ", " .... ...... ", " .... ....... ", " .... ....... ", " ... ....... ", " ... ........ ", " ........... ", " ......... ", " .......... ", " .......... +++ ", " .... .... ++++++++++ ", " ... ....@+++ +++ ", " ... ..#$++ ++ ", " .... .%&+++ ++ ", " .... *++=- + ", " ... ;++>, ", " ... +++'). ", " ... +++!... ", " .... +++~{... ", " .... ++++].... ", " ... ++++ ..... ", " ... ++++ ..... ", " .... ++++ ..... + ", " ... ++++ ...^/+ ", " ... ++++ (_/: ", " . +++++<[ ", " "}; kildclient-2.11.1/share/Makefile.in0000644000175000017500000005452611570177666014042 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # $Id: Makefile.am 1014 2009-02-01 12:46:52Z ekalin $ VPATH = @srcdir@ 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 = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.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__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' man6dir = $(mandir)/man6 am__installdirs = "$(DESTDIR)$(man6dir)" "$(DESTDIR)$(pixmapdir)" \ "$(DESTDIR)$(pkgdatadir)" NROFF = nroff MANS = $(man_MANS) DATA = $(pixmap_DATA) $(pkgdata_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@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ KILDCLIENT_PERL_CFLAGS = @KILDCLIENT_PERL_CFLAGS@ KILDCLIENT_PERL_LIBS = @KILDCLIENT_PERL_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ OBJEXT = @OBJEXT@ 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@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RES_COMPILE = @RES_COMPILE@ RES_INCDIR = @RES_INCDIR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = plugins pkgdata_DATA = kildclient.pl \ kildclient.hlp \ kcworld.dtd pixmapdir = $(datadir)/pixmaps pixmap_DATA = kildclient.png kildclient.xpm man_MANS = kildclient.6 EXTRA_DIST = $(pkgdata_DATA) $(pixmap_DATA) $(man_MANS) \ kildclient.xcf kildclient.ico all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu share/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu 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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-man6: $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man6dir)" || $(MKDIR_P) "$(DESTDIR)$(man6dir)" @list=''; test -n "$(man6dir)" || exit 0; \ { for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.6[a-z]*$$/p'; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^6][0-9a-z]*$$,6,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man6dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man6dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man6dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man6dir)" || exit $$?; }; \ done; } uninstall-man6: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man6dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.6[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^6][0-9a-z]*$$,6,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ test -z "$$files" || { \ echo " ( cd '$(DESTDIR)$(man6dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(man6dir)" && rm -f $$files; } install-pixmapDATA: $(pixmap_DATA) @$(NORMAL_INSTALL) test -z "$(pixmapdir)" || $(MKDIR_P) "$(DESTDIR)$(pixmapdir)" @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \ 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)$(pixmapdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pixmapdir)" || exit $$?; \ done uninstall-pixmapDATA: @$(NORMAL_UNINSTALL) @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(pixmapdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(pixmapdir)" && rm -f $$files install-pkgdataDATA: $(pkgdata_DATA) @$(NORMAL_INSTALL) test -z "$(pkgdatadir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ 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)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(pkgdatadir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(pkgdatadir)" && rm -f $$files # 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) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @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 \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 $(MANS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man6dir)" "$(DESTDIR)$(pixmapdir)" "$(DESTDIR)$(pkgdatadir)"; 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: 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 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-man install-pixmapDATA install-pkgdataDATA 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-man6 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 pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-man uninstall-pixmapDATA uninstall-pkgdataDATA uninstall-man: uninstall-man6 .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 ctags \ ctags-recursive distclean distclean-generic 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-man6 install-pdf install-pdf-am install-pixmapDATA \ install-pkgdataDATA install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-man uninstall-man6 \ uninstall-pixmapDATA uninstall-pkgdataDATA # 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: kildclient-2.11.1/share/kildclient.pl0000644000175000017500000006647511541416677014456 00000000000000## $Id: kildclient.pl 1152 2011-03-20 15:31:10Z ekalin $ ### Copyright (C) 2004-2011 Eduardo M Kalinowski ### ### 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., 51 Franklin Street, Fifth Floor, Boston, ### MA 02110-1301, USA. ### ### kildclient.pl ### ### This file contains some built-in Perl functions used by ### KildClient. ### ### This is not the best place to define your own functions. ### To do that, you should configure your world to load a ### script file, and define your functions there. use strict; use Locale::gettext; our $__helpfile; our @PLUGINDIRS; # Convenience wrapper sub _ { return gettext($_[0]); } { package World; sub echonl { my $self = shift; foreach (@_) { $self->echo("$_\n"); } } sub sendecho { my $self = shift; my $prevstate = $self->commandecho(); $self->commandecho(1); $self->send(@_); $self->commandecho($prevstate); } sub sendnoecho { my $self = shift; my $prevstate = $self->commandecho(); $self->commandecho(0); $self->send(@_); $self->commandecho($prevstate); } sub mlsend { my $self = shift; if (scalar @_ == 0) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'mlsend')); return; } my $args = shift; if ($args->{initialtext} && ref($args->{initialtext}) ne 'ARRAY') { $args->{initialtext} = [ split(/\n/, $args->{initialtext}) ]; } if ($args->{finaltext} && ref($args->{finaltext}) ne 'ARRAY') { $args->{finaltext} = [ split(/\n/, $args->{finaltext}) ]; } return $self->_mlsend($args); } sub sendlines { my $self = shift; if (scalar @_ == 0) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'sendlines')); return; } my $args = { initialtext => $_[0] }; if (scalar @_ >= 2) { $args->{delay} = $_[1]; } if (scalar @_ >= 3) { $args->{linesatime} = $_[2]; } return $self->mlsend($args); } sub sendfile { my $self = shift; if (scalar @_ == 0) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'sendfile')); return; } my $args = { file => $_[0] }; if (scalar @_ >= 2) { $args->{delay} = $_[1]; } if (scalar @_ >= 3) { $args->{linesatime} = $_[2]; } return $self->_mlsend($args); } sub path { my $self = shift; my $path = $_[0]; if (!$path) { return; } my ($num, $cmd, @cmdlist); # Splits the string in groups formed by an optional number # followed by the command and adds that to the list. do { $path =~ /(\d*)([[:alpha:]]|\{[^}]+\})/; $num = $1; $cmd = $2; $path = substr($path, $+[0]); $num = 1 if ($num eq ''); $cmd =~ s/\{(.+)\}/$1/; my $i; for ($i = 0; $i < $num; ++$i) { push(@cmdlist, $cmd); } } until ($path eq ''); # Sends the commands $self->sendlines(\@cmdlist); } sub prev { my $self = shift; my $num = $_[0]; if (!defined $num) { $num = 1; } $self->next(-$num); } sub gag { my $self = shift; my $pattern = shift; if (!$pattern) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'gag')); return; } $self->trigger({ pattern => $pattern, gag => 1 }); } sub _listobject { my $self = shift; my ($target, $function, $objnum, $objname, $extrafirstarg) = @_; if (defined($target)) { if ($target =~ /^\d+$/) { if ($extrafirstarg) { eval("\$self->$function(\$extrafirstarg, $target)"); } else { eval("\$self->$function($target)"); } } else { my @found = $self->_getobjectnumber($target, $objnum, 0, $extrafirstarg); if (scalar @found == 0) { $self->echonl(sprintf(_('No such %s'), $objname)); } else { foreach (@found) { if ($extrafirstarg) { eval("\$self->$function(\$extrafirstarg, $_)"); } else { eval("\$self->$function($_)"); } } } } } else { if ($extrafirstarg) { eval("\$self->$function(\$extrafirstarg)"); } else { eval("\$self->$function()"); } } } sub listtrigger { my $self = shift; if (@_) { foreach (@_) { $self->_listobject($_, '_listtrigger', 0, _('trigger')); } } else { $self->_listobject(undef, '_listtrigger', 0, _('trigger')); } } sub listalias { my $self = shift; if (@_) { foreach (@_) { $self->_listobject($_, '_listalias', 1, _('alias')); } } else { $self->_listobject(undef, '_listalias', 1, _('alias')); } } sub listmacro { my $self = shift; if (@_) { foreach (@_) { $self->_listobject($_, '_listmacro', 2, _('macro')); } } else { $self->_listobject(undef, '_listmacro', 2, _('macro')); } } sub listtimer { my $self = shift; if (@_) { foreach (@_) { $self->_listobject($_, '_listtimer', 3, _('timer')); } } else { $self->_listobject(undef, '_listtimer', 3, _('timer')); } } sub listhook { my $self = shift; my $event = shift; if (@_) { foreach (@_) { $self->_listobject($_, '_listhook', 4, _('hook'), $event); } } else { $self->_listobject(undef, '_listhook', 4, _('hook'), $event); } } sub gettriggernumber { my $self = shift; if (scalar @_ != 1) { $self->echonl(sprintf(_('%s: Wrong number of arguments.'), 'gettriggernumber')); return undef; } my $name = shift; my @found = $self->_getobjectnumber($name, 0, # Trigger 0, # By name undef); return @found; } sub getaliasnumber { my $self = shift; if (scalar @_ != 1) { $self->echonl(sprintf(_('%s: Wrong number of arguments.'), 'getaliasnumber')); return undef; } my $name = shift; my @found = $self->_getobjectnumber($name, 1, # Alias 0, # By name undef); return @found; } sub getmacronumber { my $self = shift; if (scalar @_ != 1) { $self->echonl(sprintf(_('%s: Wrong number of arguments.'), 'getmacronumber')); return undef; } my $name = shift; my @found = $self->_getobjectnumber($name, 2, # Macro 0, # By name undef); return @found; } sub gettimernumber { my $self = shift; if (scalar @_ != 1) { $self->echonl(sprintf(_('%s: Wrong number of arguments.'), 'gettimerrnumber')); return undef; } my $name = shift; my @found = $self->_getobjectnumber($name, 3, # Timer 0, # By name undef); return @found; } sub gethooknumber { my $self = shift; if (scalar @_ != 2) { $self->echonl(sprintf(_('%s: Wrong number of arguments.'), 'gethooknumber')); return undef; } my $event = shift; my $name = shift; my @found = $self->_getobjectnumber($name, 4, # Timer 0, # By name $event); return @found; } sub _delobject { my $self = shift; my ($target, $function, $objnum, $objname, $objnameplural, $extrafirstarg) = @_; my $deleted = 0; if (defined($target)) { if ($target =~ /^\d+$/) { if ($extrafirstarg) { eval("\$deleted += \$self->_$function(\$extrafirstarg, $target)"); } else { eval("\$deleted += \$self->_$function($target)"); } if (!$deleted) { $self->echonl(sprintf(_('No such %s.'), $objname)); } } else { my @found = reverse($self->_getobjectnumber($target, $objnum, 0, $extrafirstarg)); if (scalar @found == 0) { $self->echonl(sprintf(_('No such %s.'), $objname)); } else { foreach (@found) { if ($extrafirstarg) { eval("\$deleted += \$self->_$function(\$extrafirstarg, $_)"); } else { eval("\$deleted += \$self->_$function($_)"); } } } } unless ($self->{SILENT}) { if (!$deleted) { $self->echonl(sprintf(_('No %s deleted.'), $objnameplural)); } elsif ($deleted == 1) { $self->echonl(sprintf(_('One %s deleted.'), $objname)); } else { $self->echonl(sprintf(_('%d %s deleted.'), $deleted, $objnameplural)); } } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), $function)); $deleted = undef; } return $deleted; } sub deltrigger { my $self = shift; return $self->_delobject($_[0], 'deltrigger', 0, _('trigger'), _('triggers')); } sub delalias { my $self = shift; return $self->_delobject($_[0], 'delalias', 1, _('alias'), _('aliases')); } sub delmacro { my $self = shift; return $self->_delobject($_[0], 'delmacro', 2, _('macro'), _('macros')); } sub deltimer { my $self = shift; return $self->_delobject($_[0], 'deltimer', 3, _('timer'), _('timers')); } sub delhook { my $self = shift; return $self->_delobject($_[1], 'delhook', 4, _('hook'), _('hooks'), $_[0]); } sub _moveobject { my $self = shift; my ($old, $new_pos, $function, $objnum, $objname, $extrafirstarg) = @_; my $ok; if (defined($old)) { if ($old =~ /^\d+$/) { if ($extrafirstarg) { eval("\$ok = \$self->_$function(\$extrafirstarg, $old, $new_pos)"); } else { eval("\$ok = \$self->_$function($old, $new_pos)"); } if (!$ok) { $self->echonl(sprintf(_('No such %s.'), $objname)); } } else { my @found = $self->_getobjectnumber($old, $objnum, 0, $extrafirstarg); if (scalar @found == 0) { $self->echonl(sprintf(_('No such %s.'), $objname)); } else { if ($extrafirstarg) { eval("\$ok += \$self->_$function(\$extrafirstarg, $found[0], $new_pos)"); } else { eval("\$ok += \$self->_$function($found[0], $new_pos)"); } unless ($self->{SILENT}) { $self->echonl(sprintf(_('Successfully moved %s.'), $objname)); } } } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), $function)); } } sub movetrigger { my $self = shift; $self->_moveobject($_[0], $_[1], 'movetrigger', 0, _('trigger')); } sub movealias { my $self = shift; $self->_moveobject($_[0], $_[1], 'movealias', 1, _('alias')); } sub movemacro { my $self = shift; $self->_moveobject($_[0], $_[1], 'movemacro', 2, _('macro')); } sub movetimer { my $self = shift; $self->_moveobject($_[0], $_[1], 'movetimer', 3, _('timer')); } sub movehook { my $self = shift; my $event = shift; $self->_moveobject($_[0], $_[1], 'movehook', 4, _('hook'), $event); } sub _enadisobject { my $self = shift; my ($target, $newvalue, $function, $objnumber, $extrafirstarg) = @_; if ($target =~ /^\d+$/) { if ($extrafirstarg) { eval("\$self->$function(\$extrafirstarg, $target, { enabled => $newvalue })"); } else { eval("\$self->$function($target, { enabled => $newvalue })"); } } else { my @found = $self->_getobjectnumber($target, $objnumber, 0, $extrafirstarg); if (scalar @found == 0) { $self->echonl(sprintf(_('No such %s'), _($function))); } else { foreach (@found) { if ($extrafirstarg) { eval("\$self->$function(\$extrafirstarg, $_, { enabled => $newvalue })"); } else { eval("\$self->$function($_, { enabled => $newvalue })"); } } } } } sub enatrigger { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 1, 'trigger', 0); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'enatrigger')); } } sub distrigger { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 0, 'trigger', 0); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'distrigger')); } } sub enaalias { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 1, 'alias', 1); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'enaalias')); } } sub disalias { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 0, 'alias', 1); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'disalias')); } } sub enamacro { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 1, 'macro', 2); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'enamacro')); } } sub dismacro { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 0, 'macro', 2); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'dismacro')); } } sub enatimer { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 1, 'timer', 3); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'enatimer')); } } sub distimer { my $self = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 0, 'timer', 3); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'distimer')); } } sub enahook { my $self = shift; my $event = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 1, 'hook', 4, $event); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'enahook')); } } sub dishook { my $self = shift; my $event = shift; if (@_) { foreach (@_) { $self->_enadisobject($_, 0, 'hook', 4, $event); } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), 'dishook')); } } sub triggerenabled { my $self = shift; my $trigger = shift; if (!defined($trigger)) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'triggerenabled')); return undef; } return $self->_objectenabled($trigger, 0, _('trigger')); } sub aliasenabled { my $self = shift; my $alias = shift; if (!defined($alias)) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'aliasenabled')); return undef; } return $self->_objectenabled($alias, 1, _('alias')); } sub macroenabled { my $self = shift; my $macro = shift; if (!defined($macro)) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'macroenabled')); return undef; } return $self->_objectenabled($macro, 2, _('macro')); } sub timerenabled { my $self = shift; my $timer = shift; if (!defined($timer)) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'timerenabled')); return undef; } return $self->_objectenabled($timer, 3, _('timer')); } sub hookenabled { my $self = shift; my $event = shift; my $hook = shift; if (!$event || !defined($hook)) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'hookenabled')); return undef; } return $self->_objectenabled($hook, 4, _('hook'), $event); } sub writetolog { my $self = shift; foreach my $line (@_) { $self->_writetolog(::stripansi(::stripcolorize($line))); } } sub echonlandlog { my $self = shift; foreach my $line (@_) { $self->echonl($line); $self->writetolog($line); } } sub _getplugininfo { my $self = shift; my $file = shift; unless (open(PLUGIN, "<$file")) { return _('Could not open file.'); } my $nameline = ; my $versline = ; my $descline = ; my $authorline = ; chomp($nameline); chomp($versline); chomp($descline); chomp($authorline); my ($name, $vers, $desc, $author); my $fail = 0; if ($nameline !~ /^package ([a-zA-Z_][a-zA-Z_0-9]*);/) { $fail = 1; } else { $name = $1; } if ($versline !~ /^#: Version: (.*)$/) { $fail = 1; } else { $vers = $1; } if ($descline !~ /^#: Description: (.*)$/) { $fail = 1; } else { $desc = $1; } if ($authorline !~ /^#: Author: (.*)$/) { $author = _('Unknown'); } else { $author = $1; } CORE::close(PLUGIN); if ($fail) { return _('Invalid plugin file.'); } else { return (undef, $name, $vers, $desc, $author); } } sub _loadplugin { my $self = shift; my $file = shift; unless(-r $file) { foreach (@::PLUGINDIRS) { if (-r $_ . "/$file") { $file = $_ . "/$file"; last; } elsif (-r $_ . "/$file.pl") { $file = $_ . "/$file.pl"; last; } } } my ($error, $name, $vers, $desc, $author) = $self->_getplugininfo($file); if ($error) { return $error; } my $prevversion = $self->getpluginversion($name); if ($prevversion) { if ($prevversion eq $vers) { return _('Plugin already loaded. Try enabling it.'); } else { return sprintf(_('Version %s of this plugin is already loaded.'), $prevversion); } } $self->_startplugin($name, $vers, $desc, $author); do $file; if ($@) { $self->_stopplugin(0); return sprintf(_('Error in plugin file: %s'), $@); } else { $self->_stopplugin(1); return (undef, $name); } } sub loadplugin { my $self = shift; if ($self->{WORLDPTR} != $::world->{WORLDPTR}) { $::world->echonl(_('Cannot load a plugin in another world.')); return 0; } unless (defined($_[0])) { $self->echonl(_('Plugin not specified')); return 0; } my ($error, $name) = $self->_loadplugin($_[0]); if ($error) { $self->echonl($error); $self->echonl(_('Plugin not loaded.')); return 0; } else { $self->echonl(sprintf(_("Plugin '%s' loaded."), $name)); return 1; } } sub requireplugin { my $self = shift; my $plugin = $_[0]; die _('Plugin not specified') unless defined($plugin); my $prevversion = $self->getpluginversion($plugin); return 1 if ($prevversion); # This plugin is already loaded my ($error, $dummy) = $self->_loadplugin($plugin); die sprintf(_('Could not load plugin %s'), $plugin) if ($error); return 1; } sub _enadisplugin { my $self = shift; my ($pluginname, $newval) = @_; my $pluginver = $self->getpluginversion($pluginname); unless ($pluginver) { $self->echonl(_('Plugin not loaded.')); return 0; } # Triggers my @found = $self->_getobjectnumber($pluginname, 0, 1); foreach (@found) { $self->trigger($_, { enabled => $newval }); } # Aliases @found = $self->_getobjectnumber($pluginname, 1, 1); foreach (@found) { $self->alias($_, { enabled => $newval }); } # Macros @found = $self->_getobjectnumber($pluginname, 2, 1); foreach (@found) { $self->macro($_, { enabled => $newval }); } # Timers @found = $self->_getobjectnumber($pluginname, 3, 1); foreach (@found) { $self->timer($_, { enabled => $newval }); } # Hooks foreach my $hookname (qw/OnConnect OnReceivedText OnSentCommand OnGetFocus OnLoseFocus/) { @found = $self->_getobjectnumber($pluginname, 4, 1, $hookname); foreach (@found) { $self->hook($hookname, $_, { enabled => $newval }); } } return 1; } sub enaplugin { my $self = shift; my $pluginname = shift; my $prevstate; $prevstate = $self->{SILENT}; $self->{SILENT} = 1; if (!$pluginname) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'enaplugin')); return; } # See if there is a custom enabler eval { if ($pluginname->ENABLE()) { $self->_markpluginenadis($pluginname, 1); } }; # But if not, use the standard one, which enables all items if ($@) { if ($self->_enadisplugin($pluginname, 1)) { unless ($prevstate) { $self->echonl(_('Plugin enabled.')); } $self->_markpluginenadis($pluginname, 1); } } $self->{SILENT} = $prevstate; } sub displugin { my $self = shift; my $pluginname = shift; my $prevstate; $prevstate = $self->{SILENT}; $self->{SILENT} = 1; if (!$pluginname) { $self->echonl(sprintf(_('%s: Too few arguments.'), 'displugin')); return; } # See if there is a custom disaabler eval { if ($pluginname->DISABLE()) { $self->_markpluginenadis($pluginname, 0); } }; # But if not, use the standard one, which disables all items if ($@) { if ($self->_enadisplugin($pluginname, 0)) { unless ($prevstate) { $self->echonl(_('Plugin disabled.')); } $self->_markpluginenadis($pluginname, 0); } } $self->{SILENT} = $prevstate; } } sub colorize { my %colorsubst = ( "&0", "\e[0m", # Reset everything "&x", "\e[0;30m", # Set foreground colors "&r", "\e[0;31m", "&g", "\e[0;32m", "&O", "\e[0;33m", "&b", "\e[0;34m", "&p", "\e[0;35m", "&c", "\e[0;36m", "&w", "\e[0;37m", "&z", "\e[1;30m", "&d", "\e[39m", # Set default foreground color "&R", "\e[1;31m", # Set bold foreground color "&G", "\e[1;32m", "&Y", "\e[1;33m", "&B", "\e[1;34m", "&P", "\e[1;35m", "&C", "\e[1;36m", "&W", "\e[1;37m", "&D", "\e[1;39m", # Set bold default fore color "\\^x", "\e[40m", # Set background colors "\\^r", "\e[41m", "\\^g", "\e[42m", "\\^O", "\e[43m", "\\^b", "\e[44m", "\\^p", "\e[45m", "\\^c", "\e[46m", "\\^w", "\e[47m", "\\^d", "\e[49m", # Set default background color "\\^z", "\e[5;40m", # Set light background colors "\\^R", "\e[5;41m", "\\^G", "\e[5;42m", "\\^Y", "\e[5;43m", "\\^B", "\e[5;44m", "\\^P", "\e[5;45m", "\\^C", "\e[5;46m", "\\^W", "\e[5;47m", "\\^D", "\e[5;49m", # Set light default back color "&_", "\e[4m", # Underline on "&=", "\e[21m", # Double underline on "\\^_", "\e[24m", # All underline off "&\\|", "\e[9m", # Strikethrough on "\\^\\|", "\e[29m", # Strikethrough off "&/", "\e[3m", # Italics on "\\^/", "\e[23m", # Italics off "&i", "\e[7m", # Reverse video on "\\^i", "\e[27m", # Inverse video off "&h", "\e[8m", # Hidden mode on "\\^h", "\e[28m", # Hidden mode off ); my $str = $_[0]; if (!$str) { return ""; } # Escape $str =~ s#&&#\x{99}\x{100}\x{101}\x{102}\x{105}\x{106}#g; $str =~ s#\^\^#\x{106}\x{105}\x{102}\x{101}\x{100}\x{99}#g; $str =~ s{(&|\^)([0-5])([0-5])([0-5])X} {"\e[" . ($1 eq '&' ? '38' : '48') . ";5;" . (($2*36 + $3*6 + $4) + 16) . "m"}eg; $str =~ s{(&|\^)([0-9]|[01][0-9]|2[0-3])G} {"\e[" . ($1 eq '&' ? '38' : '48') . ';5;' . ($2 + 232) . 'm'}eg; foreach my $i (keys %colorsubst) { $str =~ s/$i/$colorsubst{$i}/g; } # Unescape $str =~ s#\x{99}\x{100}\x{101}\x{102}\x{105}\x{106}#&#g; $str =~ s#\x{106}\x{105}\x{102}\x{101}\x{100}\x{99}#\^#g; return $str; } sub stripcolorize { my $string = shift; if (!$string) { return ''; } $string =~ s/(&|^)[dxrgObpcwzRGYBPCW]//g; return $string; } sub __sethelpfile { $__helpfile = $_[0]; } sub help { if (!defined($_[0])) { $_[0] = 'index'; } open(HFILE, "<$__helpfile") or die(_('Cannot open help file.')); my $outputting = 0; while () { chomp; if (!$outputting) { next if ($_ ne "[$_[0]]"); $outputting = 1; } else { if ($_ =~ /^\[/) { close(HFILE); return; } $::world->echonl($_); } } $::world->echonl(_('Help topic not found.')); } ### Deprecated functions sub getwindowsize { $::world->echonl(_('Warning: the getwindowsize() function is deprecated and will be removed.')); $::world->echonl(_('Use $window->getsize() instead.')); $::window->getsize(); } sub minimize { $::world->echonl(_('Warning: the minimize() function is deprecated and will be removed.')); $::world->echonl(_('Use $window->minimize() instead.')); $::window->minimize(); } sub path { $::world->echonl(_('Warning: the path() function is deprecated and will be removed.')); $::world->echonl(_('Use $world->path() instead.')); $::world->path($_[0]); } kildclient-2.11.1/share/kildclient.png0000644000175000017500000000312611405233113014564 00000000000000‰PNG  IHDR00Wù‡bKGDÿÿÿ ½§“ pHYs  šœtIMEÖ 0L¶{(tEXtCommentCreated with The GIMPïd%nºIDAThÞí™klUÇ»Ý(…Û’¨‘g´A ’ ñj0QˆÖ¨ŒhôDIŒ‰1ºŠ¸|ÐjQ1 ’HPH}¬@1Zˆ ÐÔò(Ð¥-ÝÝñÞÅéåÎîÎ>Š<É$;3wÏãÎyüϹð?ÝX*p±v,ð 08\̓>~`P4å’ñà2¢À—yP¾ Ø'üÛÙ¹d~ °l×ß9äíL U‘ñE®xdçíÌ£9â]lºþðV® (Ô0ïÈß{5_6qý Íe`©Z³à×Ê&è”? Ü™Kÿ/Õù3C^ã€ý—L\§€ ¹Î•A\ò(ž.8(nÑù¨£4¶»ÜõÝš¸>ÊòUìj5×¥ñ¿À+ÀÅ$Š_–½óY­gk/O‘µ¿&ñu 8 L–:WzL#ü‡µS]@gÅÛ5À žÂKË4JŒÒÀ€O€KIOÿ4Àד€oF$@àHà]à| Å/+%.zœ>W”٠ܼœI¡xD€_UOøº…¥æŠ[À!‰ÿîÎ¥¡¬ý:¼Ð“Aš*—Ç\Ðôé)SùåÓn¨Xø_i9%Ùé3ÀëÀÛšw=•qRå㱚gç ’>‰¯?¤à÷J‰ƒS)`˜"q¹®p0Ôæ°Æ#0¼- EÜP¥ÜïT™€ -À*`­²ÖCV”)îæ5Ò•–a.*Ýl CGmr˜!¤[»˜¬•lVvö`£fm/à`’ò|/0è4Ì€X ,äÙlB’r¯Jaœ<)_vPÜ ÜÔ„ƒ¡Ãé~ Äuê:%À·Jš,1ÌÀfàc›W€§ºp0dÙÖŽfà}à=i;kåÝU·Yh‚ò…ZãIÖï“êÜí+ö8à¥X$²Gù:k€åÿ­œÁP³ ÚõÙ¤QC¹?”Æ4â5à‡kS³^EŒ˜5½×ç«°­ùX†bIË0Ô< ìÈÔ€š4ÝÇNmÀÒÄ0¼v"þA¥êšmÀ_ia˜`èŠÄÍ9·ø€ê HøñÒ>ƒJcƒÇŒÂãéž'¬Xl‡“ë8ÐI`µ[Æ%ʳý.„ÖUNšØPPØ=Gt]i·ŽnÛéjd"Æ®wš•:¥Ñ§¤PÙxpº9à Z–Õèñxº §ÚζаuÇ¥HGç‚T¾-š¢Üt9N¼Ããñ\%"D»"Å@0=_x¤ÙÎÄÿ4Íè>ÚÕ…‹!Ejc.ŒÐp«”îl (Óñ¶¢1°®ÅïàS²£ë ˜¦y–É$N_jö,Ày¹4`†r‘ø‰ŒjÓ(K¯þýNhž>èîÍÖpW–Œô×ý§oÙã^Ÿo³f}± ÙgÜŽ\¼ø\¦Á8né°L$ºg¯·¤¢füóÀNÍüÒ ­ÌÈ€Yš5ß»cC'ßt·¼zœ< ìq@+¤¿(ÌÄ€¹˜\Ÿa|ÕÙš;D.MÐÃÀw:-—¾ÁãÆ€¡ÀDå}½LÕ25 QSc›t†ø±m½ƒ^/Û=Â0à 3àKfÀ,M}˜ñ4,j•¾XmDî7ÌÀ0ùÝ,)ôk‡Tüª(?øQ\ËÑ€›”w Àæ¬FzÁÐ&™ZD•*½Ø0‰J}V†4_n˜©ÀWÄÏÎÞTeØËýi`>ÐW~/LÑ¥E•Fõni3klòj«Ò¨7ýt JüÀo;ñÑ{à÷ú|-#æÌÜëP² ø¸' µ¤B£#…Áàh.ç7†˜/iòf¢¯%~Õø[ŽÍ)*.ž×oXÙdoAA)ð°B:´´át^È0ý%…>NüìÌ©ò^¶«Õ)Ä 5@1¦ÜbkžZ¤~ìwr©ôÞòAV2|IEND®B`‚kildclient-2.11.1/share/Makefile.am0000644000175000017500000000052711405233113013772 00000000000000# $Id: Makefile.am 1014 2009-02-01 12:46:52Z ekalin $ SUBDIRS = plugins pkgdata_DATA = kildclient.pl \ kildclient.hlp \ kcworld.dtd pixmapdir = $(datadir)/pixmaps pixmap_DATA = kildclient.png kildclient.xpm man_MANS = kildclient.6 EXTRA_DIST = $(pkgdata_DATA) $(pixmap_DATA) $(man_MANS) \ kildclient.xcf kildclient.ico kildclient-2.11.1/share/kcworld.dtd0000644000175000017500000001331711407657143014120 00000000000000 kildclient-2.11.1/kildclient.desktop0000644000175000017500000000067211405233117014356 00000000000000[Desktop Entry] Version=1.0 Type=Application Exec=kildclient Icon=kildclient Terminal=false Categories=Network;RolePlaying; Name=KildClient Name[eo]=KildClient Name[pt_BR]=KildClient GenericName=MUD Client GenericName[eo]=Kliento por konekti al MUD-oj GenericName[pt_BR]=Cliente de MUD Comment=Connect to MUDs (Multi User Dungeons) Comment[eo]=Konektu al MUD-oj (Multi User Dungeons) Comment[pt_BR]=Conecte-se a MUDs (Multi User Dungeons) kildclient-2.11.1/win32/0000755000175000017500000000000011570463456011674 500000000000000kildclient-2.11.1/win32/kildclient.iss0000644000175000017500000003140111570450170014442 00000000000000; $Id: kildclient.iss 1179 2011-05-29 13:34:32Z ekalin $ ; ; Inno Setup script to generate KildClient installer. ; When generating the installer for a new version, the following must be ; changed/verified: ; - Version number in #define section ; - New files included in the package ; - GTK+ version necessary, and version of GTK+ Runtime included ; - Make sure to run strip on the .exe before compiling! ; - Generate html docs ; - Make in po/ directory ; When INCLUDE_GTK is defined, the installer includes the GTK+ Runtime ; installer and runs it, so that everything is installed automatically. #define INCLUDE_GTK ; Some defines #define AppName "KildClient" #define AppId "KildClient" #define AppVer "2.11.1" #define URL "http://kildclient.sf.net" [Setup] AppId={#AppId} AppName={#AppName} AppVersion={#AppVer} AppPublisher=Eduardo M Kalinowski AppPublisherURL={#URL} AppSupportURL={#URL} AppUpdatesURL={#URL} DefaultDirName={pf}\KildClient DefaultGroupName=KildClient AllowNoIcons=true LicenseFile=J:\progs\kildclient-win32\COPYING OutputDir=J:\progs\kildclient-win32\win32 #ifdef INCLUDE_GTK OutputBaseFilename=kildclient-{#AppVer} #else OutputBaseFilename=kildclient-{#AppVer}-nogtk #endif Compression=lzma SolidCompression=true AppCopyright=This program is released under the GNU General Public License ShowLanguageDialog=yes RestartIfNeededByRun=yes [Languages] Name: eng; MessagesFile: compiler:Default.isl Name: bra; MessagesFile: compiler:Languages\BrazilianPortuguese.isl [Tasks] Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked [Files] ; NOTE: Don't use "Flags: ignoreversion" on any shared system files ;;; Program and support files Source: J:\progs\kildclient-win32\src\kildclient.exe; DestDir: {app}; Flags: ignoreversion Source: J:\progs\kildclient-win32\src\*.ui; DestDir: {app}; Flags: ignoreversion Source: J:\progs\kildclient-win32\share\kildclient.pl; DestDir: {app}; Flags: ignoreversion ;;; Extra libraries Source: C:\MinGW\bin\libregex.dll; DestDir: {app}; Flags: ignoreversion Source: C:\MinGW\bin\libgtkspell.dll; DestDir: {app}; Flags: ignoreversion ; gnutls Source: C:\MinGW\bin\libgnutls-26.dll; DestDir: {app}; Flags: ignoreversion Source: C:\MinGW\bin\libgcrypt-11.dll; DestDir: {app}; Flags: ignoreversion Source: C:\MinGW\bin\libgpg-error-0.dll; DestDir: {app}; Flags: ignoreversion Source: C:\MinGW\bin\libtasn1-3.dll; DestDir: {app}; Flags: ignoreversion ;;; Help files Source: J:\progs\kildclient-win32\NEWS; DestDir: {app}; Flags: ignoreversion Source: J:\progs\kildclient-win32\COPYING; DestDir: {app}; Flags: ignoreversion Source: J:\progs\kildclient-win32\share\kildclient.hlp; DestDir: {app}; Flags: ignoreversion ;;; Message catalogs Source: J:\progs\kildclient-win32\po\pt_BR.mo; DestDir: {app}\locale\pt_BR\LC_MESSAGES; DestName: kildclient.mo; Tasks: ; Languages: ; Flags: ignoreversion Source: J:\progs\kildclient-win32\po\eo.mo; DestDir: {app}\locale\eo\LC_MESSAGES; DestName: kildclient.mo; Tasks: ; Languages: ; Flags: ignoreversion Source: J:\progs\kildclient-win32\po\sv.mo; DestDir: {app}\locale\sv\LC_MESSAGES; DestName: kildclient.mo; Tasks: ; Languages: ; Flags: ignoreversion Source: J:\progs\kildclient-win32\po\de.mo; DestDir: {app}\locale\de\LC_MESSAGES; DestName: kildclient.mo; Tasks: ; Languages: ; Flags: ignoreversion Source: J:\progs\kildclient-win32\win32\gettext.pm; DestDir: {app}\Locale; DestName: Gettext.pm; Flags: ignoreversion ;;; Plugins Source: J:\progs\kildclient-win32\share\plugins\*.pl; DestDir: {app}\plugins; Flags: ignoreversion ;;; The manual Source: J:\progs\kildclient-win32\doc\C\kildclient\*.html; DestDir: {app}\manual\html; Flags: ignoreversion Source: J:\progs\kildclient-win32\doc\C\images\*.png; DestDir: {app}\manual\html\images; Flags: ignoreversion ;Source: J:\progs\kildclient-win32\doc\C\kildclient.pdf; DestDir: {app}\manual; Flags: ignoreversion ;;; Aspell Source: J:\downloads\cross-tools\aspell\Aspell-0-50-3-3-Setup.exe; DestDir: {tmp} ;;; GTK+ Runtine #ifdef INCLUDE_GTK Source: J:\downloads\cross-tools\runtime\gtk+-runtime.exe; DestDir: {tmp} #endif [INI] Filename: {app}\kildclient.url; Section: InternetShortcut; Key: URL; String: http://kildclient.sf.net Filename: {app}\manual.url; Section: InternetShortcut; Key: URL; String: {app}\manual\html\index.html [Icons] Name: {group}\KildClient; Filename: {app}\kildclient.exe Name: {group}\{cm:Manual}; Filename: {app}\manual.url Name: {group}\{cm:ProgramOnTheWeb,KildClient}; Filename: {app}\kildclient.url Name: {group}\{cm:UninstallProgram,KildClient}; Filename: {uninstallexe} Name: {userdesktop}\KildClient; Filename: {app}\kildclient.exe; Tasks: desktopicon [Registry] Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\kildclient.exe"; ValueType: string; ValueName: ""; ValueData: "{app}\kildclient.exe"; Flags: uninsdeletekey Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\kildclient.exe"; ValueType: string; ValueName: "Path"; ValueData: "{app};{code:GetInstallAspellDir}\bin;{code:GetInstallGTKDir}\bin"; Flags: uninsdeletekey [Run] Filename: {tmp}\Aspell-0-50-3-3-Setup.exe; Parameters: "/DIR=""{code:GetInstallAspellDir}"" /SP- /SILENT"; StatusMsg: "Installing Aspell"; Check: NeedToInstallAspell; Flags: hidewizard #ifdef INCLUDE_GTK Filename: {tmp}\gtk+-runtime.exe; Parameters: "/S /D={code:GetInstallGTKDir}"; StatusMsg: "Installing GTK+ Runtime"; Check: NeedToInstallGtk #endif ;Filename: {app}\kildclient.exe; Description: {cm:LaunchProgram,KildClient}; Flags: nowait postinstall skipifsilent [UninstallDelete] Type: files; Name: {app}\kildclient.url Type: files; Name: {app}\manual.url [CustomMessages] eng.Manual=Manual bra.Manual=Manual [Code] const // Required GTK+ Version MAJORGTKREQUIRED = 2; MINORGTKREQUIRED = 18; // Version of GTK+ Runtime included in this setup MAJORGTKINCLUDED = 2; MINORGTKINCLUDED = 22; BUGFIXGTKINCLUDED = 0; var // Setup page to get Aspell install directory. pageAspellDir: TInputDirWizardPage; #ifdef INCLUDE_GTK // Setup page to get GTK+ install directory. pageGTKDir: TInputDirWizardPage; #endif { *************************************************************** *** GTK+ Support funtions *** *************************************************************** } function GetGtkVersion(var Major, Minor, Bugfix: Longint): Boolean; { Tries to get the version of the GTK+ runtime that is installed. If GTK+ is found, returns True and sets Major and Minor. If GTK+ is not installed, returns False. } var GTKVer: String; MajorStr, MinorStr, BugfixStr: String; Dot: Integer; begin if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\GTK\2.0\', 'Version', GTKVer) then begin { Get Major and Minor version numbers as strings } Dot := Pos('.', GTKVer); MajorStr := Copy(GTKVer, 1, Dot - 1); Delete(GTKVer, 1, Dot); Dot := Pos('.', GTKVer); MinorStr := Copy(GTKVer, 1, Dot - 1); Delete(GTKVer, 1, Dot); Dot := Pos('-', GTKVer); if Dot = 0 then Dot := Length(GTKVer) + 1; BugfixStr := Copy(GTKVer, 1, Dot - 1); { Convert them to Integers } Major := StrToIntDef(MajorStr, 0); Minor := StrToIntDef(MinorStr, 0); Bugfix := StrToIntDef(BugfixStr, 0); Result := True; end else begin Result := False; end; end; #ifdef INCLUDE_GTK function NeedToInstallGtk(): Boolean; { Verifies the version of GTK+ currently installed, if there is any. If GTK+ is installed and the installed version is newer or equal than the one included, the runtime is not installed. } var Major, Minor, Bugfix: Longint; begin if GetGTKVersion(Major, Minor, Bugfix) then begin if (Major > MAJORGTKINCLUDED) or ((Major = MAJORGTKINCLUDED) and (Minor > MINORGTKINCLUDED)) or ((Major = MAJORGTKINCLUDED) and (Minor = MINORGTKINCLUDED) and (Bugfix >= BUGFIXGTKINCLUDED)) then begin Result := False end else begin Result := True; end; end else begin Result := True; end; end; #endif function GetInstallGTKDir(Param: String): String; begin #ifdef INCLUDE_GTK if NeedToInstallGTK() then begin Result := pageGTKDir.Values[0]; end else begin RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\GTK\2.0', 'Path', Result); end; #else RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\GTK\2.0', 'Path', Result); #endif end; { *************************************************************** *** Aspell Support funtions *** *************************************************************** } function NeedToInstallAspell(): Boolean; var maj: Cardinal; begin Result := not(RegQueryDWordValue(HKLM, 'Software\Aspell', 'MajorVersion', maj)); end; function GetInstallAspellDir(Param: String): String; begin if NeedToInstallAspell() then begin Result := pageAspellDir.Values[0]; end else begin RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\Aspell', '', Result); end; end; { *************************************************************** *** General functions *** *************************************************************** } procedure InitializeWizard(); { Adds (if necessary) pages for the user to select the directory to install Aspell and GTK+ in. } var Path: String; begin if NeedToInstallAspell() then begin pageAspellDir := CreateInputDirPage(wpUserInfo, 'Aspell installation', 'Select where the Aspell files will be installed.', 'Aspell (needed for spell checking) will be installed in the folder you' #13#10 'specify here. Dictionaries need to be installed separatedly.' #13#10 'To continue, click Next.', True, 'Aspell'); pageAspellDir.add(''); // Set default value if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\Aspell', 'Path', Path) then begin pageAspellDir.Values[0] := Path; end else begin pageAspellDir.Values[0] := ExpandConstant('{pf}\Aspell'); end; end; #ifdef INCLUDE_GTK if NeedToInstallGtk() then begin pageGTKDir := CreateInputDirPage(wpUserInfo, 'GTK+ Installation', 'Select where the GTK+ Runtime files will be installed.', 'The GTK+ Runtime files will be installed in the folder you specify here.' #13#10 'To continue, click Next.', True, 'GTK\2.0'); pageGTKDir.add(''); // Set default value if RegQueryStringValue(HKEY_LOCAL_MACHINE, 'Software\GTK\2.0\', 'Path', Path) then begin pageGTKDir.Values[0] := Path; end else begin pageGTKDir.Values[0] := ExpandConstant('{cf}\GTK\2.0'); end; end; #endif end; #ifndef INCLUDE_GTK function InitializeSetup(): Boolean; { Aborts installation if the correct GTK+ Runtime is not installed. } var Major, Minor, Bugfix: Longint; begin if GetGTKVersion(Major, Minor, Bugfix) then begin if (Major < MAJORGTKREQUIRED) or ((Major = MAJORGTKREQUIRED) and (Minor < MINORGTKREQUIRED)) then begin MsgBox('Incorrect GTK+ version.' #13#10 'This program requires GTK+ version 2.16.X or greater.', mbError, MB_OK); Result := False; end else begin Result := True; end; end else begin MsgBox('Could not find the GTK+ Runtime.' #13#10 'This program requires GTK+ version 2.16.X. or greater.' #13#10 'You must intall the GTK+ Runtime before installing KildClient.', mbError, MB_OK); Result := False; end; end; #endif procedure CurStepChanged(CurStep: TSetupStep); var UninstallPath: String; UninstallString: String; ResultCode: Integer; begin { Uninstall a previous version (if it is found) } if (CurStep = ssInstall) then begin UninstallPath := 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{#AppId}_is1'; UninstallString := ''; if RegQueryStringValue(HKLM, UninstallPath, 'UninstallString', UninstallString) then begin if UninstallString <> '' then begin UninstallString := RemoveQuotes(UninstallString); Exec(UninstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); end; end; end; end; kildclient-2.11.1/win32/README.win320000644000175000017500000000452711526033645013437 00000000000000Building KildClient under Windows --------------------------------- This file aims at giving some tips on building KildClient under Windows. However, be aware that the process can be complicated and this is no detailed recipe, just some hints. If you still want to try, here's what you will need: Mingw and Msys: The compiler and Unix-like environment used for building KildClient. Get them from http://www.mingw.org Install the C compiler and MSYS Basic System. You also need the regex package from http://sourceforge.net/projects/mingwrep Just unzip it into c:\mingw ActivePerl 5.10.0.1004 (or later) from ActiveState: A Perl for Windows. Also needed at run time. Get it from http://www.activestate.com GTK+ Development Environment: Get it from http://www.gtk.org/download-windows.html Download the "bundle" which includes everything that is necessary. The README says to unzip to c:\opt\gtk, but it can be unzipped to c:\mingw and then it can be used directly with no further changes. - The runtime can be downloaded from http://gtk-win.sourceforge.net/home/index.php/en/Home It's not necessary for compilation (only runtime), but can be included in the installer. To use spell checking (optional), download these files: - aspell-dev from http://ftp.gnu.org/gnu/aspell/w32/ It has been tested with version 0-50-3-3. Extract it, noting the paths: the installer contains a top-level directory aspell-dev-VERSION. Inside it there are two directories, include and lib. The contents of those should end in the include and lib directories inside the MinGW directory. - gtkspell-2.0.6.tar.gz from FIXME This file was borrowed from the gaim win32 port, and repacked to use MinGW's directories (and pkgconfig). To include gnutls support (optional), download it from http://josefsson.org/gnutls4win/ and extract it to c:\mingw. Now untar the source file, run ./configure and make. Do not run make install. To run it, you must copy some files to a directory, keeping the correct structure. The easiest way now is to create an installer. The kildclient.iss file in this directory is an Inno Setup (http://www.jrsoftware.org/isinfo.php) script to create the installer. Check "Install Inno Setup Preprocessor" as the script uses this feature. You will need to adjust some paths to use it, most likely, however. kildclient-2.11.1/win32/gettext.pm0000644000175000017500000000017611405233112013617 00000000000000# Do-nothing replacement for Locale::Gettext which could not be found # for Win32 sub gettext { return $_[0]; } return 1; kildclient-2.11.1/COPYING0000644000175000017500000010451311324777651011713 00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . kildclient-2.11.1/config.h.in0000644000175000017500000000452011570453253012670 00000000000000/* config.h.in. Generated from configure.in by autoheader. */ #if defined(__CYGWIN32__) && !defined(__WIN32__) # define __WIN32__ #endif /* always defined to indicate that i18n is enabled */ #undef ENABLE_NLS /* "definition of GETTEXT_PACKAGE" */ #undef GETTEXT_PACKAGE /* Define to 1 if you have the `bind_textdomain_codeset' function. */ #undef HAVE_BIND_TEXTDOMAIN_CODESET /* Define to 1 if you have the `dcgettext' function. */ #undef HAVE_DCGETTEXT /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Do we have the gtkspell library? */ #undef HAVE_GTKSPELL /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if your file defines LC_MESSAGES. */ #undef HAVE_LC_MESSAGES /* Do we have the gnutls library? */ #undef HAVE_LIBGNUTLS /* Define to 1 if you have the `perl' library (-lperl). */ #undef HAVE_LIBPERL /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define to 1 if you have the `localtime_r' function. */ #undef HAVE_LOCALTIME_R /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_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_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 /* 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 kildclient-2.11.1/getperlflags.pl0000644000175000017500000000124011405233117013645 00000000000000# $Id: getperlflags.pl 1014 2009-02-01 12:46:52Z ekalin $ # The ExtUtils::Embed module returns, under Windows, compiler options # using the syntax used by Microsoft Compilers. # Since I compile KildClient for Windows with mingw32, a port of gcc and # related GNU applications, the flags must be using the gcc syntax. # This file does the conversion use ExtUtils::Embed; use warnings; use strict; sub kcccopts { my $cflags = ccopts(); print $cflags; } sub kcldopts { my $ldflags = ldopts(); if ($^O eq 'MSWin32') { $ldflags =~ s#\\#/#g; } print $ldflags; } if ($ARGV[0] eq 'ccopts') { kcccopts(); } elsif ($ARGV[0] eq 'ldopts') { kcldopts(); } kildclient-2.11.1/config.sub0000755000175000017500000010344511344453613012635 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 # Free Software Foundation, Inc. timestamp='2010-01-22' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # 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 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., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, 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. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # 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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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-dietlibc | linux-newlib* | 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/'` ;; *) 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*) 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 \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | 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 \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | 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 | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | ubicom32 \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | picochip) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-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-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | 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-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | 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-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | 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-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile-* | tilegx-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | 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 ;; 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) 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'm not sure what "Sysv32" means. Should this be sysv3.2? 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 ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; 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 ;; 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) basic_machine=powerpc-unknown ;; ppc-*) 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) 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 ;; 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 ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; # This must be matched before tile*. tilegx*) basic_machine=tilegx-unknown os=-linux-gnu ;; tile*) basic_machine=tile-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 ;; 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* \ | -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* \ | -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* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -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 ;; # 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 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) 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: kildclient-2.11.1/aclocal.m40000644000175000017500000015432111570177665012524 00000000000000# generated automatically by aclocal 1.11.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 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. # 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.68],, [m4_warning([this file was generated for autoconf 2.68. 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'.])]) # Copyright (C) 1995-2002 Free Software Foundation, Inc. # Copyright (C) 2001-2003,2004 Red Hat, Inc. # # This file is free software, distributed under the terms of the GNU # General Public License. As a special exception to the GNU General # Public License, this file may be distributed as part of a program # that contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # # Macro to add for using GNU gettext. # Ulrich Drepper , 1995, 1996 # # Modified to never use included libintl. # Owen Taylor , 12/15/1998 # # Major rework to remove unused code # Owen Taylor , 12/11/2002 # # Added better handling of ALL_LINGUAS from GNU gettext version # written by Bruno Haible, Owen Taylor 5/30/3002 # # Modified to require ngettext # Matthias Clasen 08/06/2004 # # We need this here as well, since someone might use autoconf-2.5x # to configure GLib then an older version to configure a package # using AM_GLIB_GNU_GETTEXT AC_PREREQ(2.53) dnl dnl We go to great lengths to make sure that aclocal won't dnl try to pull in the installed version of these macros dnl when running aclocal in the glib directory. dnl m4_copy([AC_DEFUN],[glib_DEFUN]) m4_copy([AC_REQUIRE],[glib_REQUIRE]) dnl dnl At the end, if we're not within glib, we'll define the public dnl definitions in terms of our private definitions. dnl # GLIB_LC_MESSAGES #-------------------- glib_DEFUN([GLIB_LC_MESSAGES], [AC_CHECK_HEADERS([locale.h]) if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi fi]) # GLIB_PATH_PROG_WITH_TEST #---------------------------- dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) # GLIB_WITH_NLS #----------------- glib_DEFUN([GLIB_WITH_NLS], dnl NLS is obligatory [USE_NLS=yes AC_SUBST(USE_NLS) gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= AC_CHECK_HEADER(libintl.h, [gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, [AC_TRY_LINK([ #include ], [return !ngettext ("","", 1)], gt_cv_func_ngettext_libc=yes, gt_cv_func_ngettext_libc=no) ]) if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, [AC_TRY_LINK([ #include ], [return !dgettext ("","")], gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no) ]) fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CHECK_FUNCS(bind_textdomain_codeset) fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then AC_CHECK_LIB(intl, bindtextdomain, [AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dgettext, gt_cv_func_dgettext_libintl=yes)])]) if test "$gt_cv_func_dgettext_libintl" != "yes" ; then AC_MSG_CHECKING([if -liconv is needed to use gettext]) AC_MSG_RESULT([]) AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dcgettext, [gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv], :,-liconv)], :,-liconv) fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset AC_CHECK_FUNCS(bind_textdomain_codeset) LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then AC_DEFINE(HAVE_GETTEXT,1, [Define if the GNU gettext() function is already present or preinstalled.]) GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" AC_CHECK_FUNCS(dcgettext) MSGFMT_OPTS= AC_MSG_CHECKING([if msgfmt accepts -c]) GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" ], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) AC_SUBST(MSGFMT_OPTS) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr], [CATOBJEXT=.gmo DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share and dnl and CATOBJEXT=.gmo in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [CATOBJEXT=.gmo DATADIRNAME=share], [CATOBJEXT=.mo DATADIRNAME=lib]) ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac]) LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi ]) if test "$gt_cv_have_gettext" = "yes" ; then AC_DEFINE(ENABLE_NLS, 1, [always defined to indicate that i18n is enabled]) fi dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is not GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po AC_OUTPUT_COMMANDS( [case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac]) dnl These rules are solely for the distribution goal. While doing this dnl we only have to keep exactly one list of the available catalogs dnl in configure.ac. for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done dnl Make all variables we use known to autoconf. AC_SUBST(CATALOGS) AC_SUBST(CATOBJEXT) AC_SUBST(DATADIRNAME) AC_SUBST(GMOFILES) AC_SUBST(INSTOBJEXT) AC_SUBST(INTLLIBS) AC_SUBST(PO_IN_DATADIR_TRUE) AC_SUBST(PO_IN_DATADIR_FALSE) AC_SUBST(POFILES) AC_SUBST(POSUB) ]) # AM_GLIB_GNU_GETTEXT # ------------------- # Do checks necessary for use of gettext. If a suitable implementation # of gettext is found in either in libintl or in the C library, # it will set INTLLIBS to the libraries needed for use of gettext # and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable # gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() # on various variables needed by the Makefile.in.in installed by # glib-gettextize. dnl glib_DEFUN([GLIB_GNU_GETTEXT], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_HEADER_STDC])dnl GLIB_LC_MESSAGES GLIB_WITH_NLS if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else AC_MSG_CHECKING(for catalogs to be installed) NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS AC_MSG_RESULT($LINGUAS) fi dnl Construct list of names of catalog files to be constructed. if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but ($top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) dnl Generate list of files to be processed by xgettext which will dnl be included in po/Makefile. test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES ]) # AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) # ------------------------------- # Define VARIABLE to the location where catalog files will # be installed by po/Makefile. glib_DEFUN([GLIB_DEFINE_LOCALEDIR], [glib_REQUIRE([GLIB_GNU_GETTEXT])dnl glib_save_prefix="$prefix" glib_save_exec_prefix="$exec_prefix" glib_save_datarootdir="$datarootdir" test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix=$prefix datarootdir=`eval echo "${datarootdir}"` if test "x$CATOBJEXT" = "x.mo" ; then localedir=`eval echo "${libdir}/locale"` else localedir=`eval echo "${datadir}/locale"` fi prefix="$glib_save_prefix" exec_prefix="$glib_save_exec_prefix" datarootdir="$glib_save_datarootdir" AC_DEFINE_UNQUOTED($1, "$localedir", [Define the location where the catalogs will be installed]) ]) dnl dnl Now the definitions that aclocal will find dnl ifdef(glib_configure_ac,[],[ AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) ])dnl # GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL]) # # Create a temporary file with TEST-FILE as its contents and pass the # file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with # 0 and perform ACTION-IF-FAIL for any other exit status. AC_DEFUN([GLIB_RUN_PROG], [cat >conftest.foo <<_ACEOF $2 _ACEOF if AC_RUN_LOG([$1 conftest.foo]); then m4_ifval([$3], [$3], [:]) m4_ifvaln([$4], [else $4])dnl echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD fi]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) 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`], [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 "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005, 2006, 2007, 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. # 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.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 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. # 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 # 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 10 # 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'. 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 ;; 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='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])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 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 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])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996, 1998, 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_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless `enable' is passed literally. # For symmetry, `disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful (and sometimes confusing) to the casual installer], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # 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 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_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 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_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])]) # 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 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 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 2 # _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 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. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} 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 /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([acinclude.m4]) kildclient-2.11.1/acinclude.m40000644000175000017500000000132311405233117013024 00000000000000AC_DEFUN([AC_PROG_PERL_MODULES],[dnl ac_perl_modules="$1" # Make sure we have perl if test -z "$PERL"; then AC_CHECK_PROG(PERL,perl,perl) fi if test "x$PERL" != x; then ac_perl_modules_failed=0 for ac_perl_module in $ac_perl_modules; do AC_MSG_CHECKING(for perl module $ac_perl_module) # Would be nice to log result here, but can't rely on autoconf internals $PERL "-M$ac_perl_module" -e exit > /dev/null 2>&1 if test $? -ne 0; then AC_MSG_RESULT(no); ac_perl_modules_failed=1 else AC_MSG_RESULT(ok); fi done # Run optional shell commands if test "$ac_perl_modules_failed" = 0; then : $2 else : $3 fi else AC_MSG_WARN(could not find perl) fi])dnl kildclient-2.11.1/doc/0000755000175000017500000000000011570463457011500 500000000000000kildclient-2.11.1/doc/Makefile.in0000644000175000017500000004141311570177666013474 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # $Id: Makefile.am 1014 2009-02-01 12:46:52Z ekalin $ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.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 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@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ KILDCLIENT_PERL_CFLAGS = @KILDCLIENT_PERL_CFLAGS@ KILDCLIENT_PERL_LIBS = @KILDCLIENT_PERL_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ OBJEXT = @OBJEXT@ 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@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RES_COMPILE = @RES_COMPILE@ RES_INCDIR = @RES_INCDIR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = C all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): # 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 \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: 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 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 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 ctags \ ctags-recursive distclean distclean-generic 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 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: kildclient-2.11.1/doc/Makefile.am0000644000175000017500000000010311405233117013427 00000000000000# $Id: Makefile.am 1014 2009-02-01 12:46:52Z ekalin $ SUBDIRS = C kildclient-2.11.1/doc/C/0000755000175000017500000000000011570463457011662 500000000000000kildclient-2.11.1/doc/C/kildclient/0000755000175000017500000000000011570463457014004 500000000000000kildclient-2.11.1/doc/C/kildclient/c39.html0000644000175000017500000001205011570176764015210 00000000000000 Basic Usage

Chapter 3. Basic Usage

This chapter will describe the most basic and important things you need to know in order to use KildClient. It is recommended that you read this section throughly, as it will ease understanding of the next chapters.

3.1. Connecting to a MUD

When you launch KildClient (see Chapter 2), you'll see a screen like this one below:

Figure 3-1. When KildClient is first started, you are asked to connect to a world

Before anything else, be aware that World is just a synonym for MUD, and these two words will be used interchangeably in this document.

The list of saved worlds may be empty, especially if this is the first time ever KildClient is run.

You have two options: connect to a previously saved World, or connect to a new one. To connect to a new one, you can either connect direcly by typing the MUD's address and port in the boxes, or by creating a new World.

Creating a new World is recommended because it allows you to save options for that world, such as the font size or the colors used. When you define triggers, aliases these will also be saved.

However, even if you connect directly, you can still customize the World, and you have the option of saving it, so the difference between the options is not so great.

To create a new World, press the button labeled New. You'll be taken to the World Editor, a dialog in which you can configure everything about the World. We'll talk about the World Editor in Chapter 4. For now, fill in the Name, Host and Port fields, and click OK.

To connect to a saved World, just select it and click the button labeled Connect. Alternatively, you can double-click the World in the list.

Sometimes you may see a little expander sign to the left of a World's name, and when you click it some options appear inside that World. This happens when there is more than one character associated with that World (see Section 4.1 for information on auto-login and associating characters with a World). The list shown is the list of all characters defined for that World. Select the entry corresponding to the character you want to use to auto-login with that character. If you select the main entry, the first character will be used.

To connect directly, fill in the Host and Port fields and click Connect.

You can be connected to several Worlds simultaneously. To do that, select the option World->Open from the menu. The World Selector dialog will be opened, and you can select another World.

kildclient-2.11.1/doc/C/kildclient/x2719.html0000644000175000017500000000521011570176766015406 00000000000000 getworld

A.3. getworld

$var = getworld( "name" );

Returns a variable that points to the open world with the given name. You can then manipulate that world with the returned variable (by calling functions that operate on worlds with that variable).

For example:

Example A-1. Quitting from another world


$coolmud = getworld("CoolMud");
$coolmud->send("quit");

This will send "quit" to the CoolMud world.

kildclient-2.11.1/doc/C/kildclient/c14.html0000644000175000017500000000572511570176764015214 00000000000000 Introduction

Chapter 1. Introduction

KildClient is a MUD Client written with the GTK+ windowing toolkit. It supports many common features of other clients, such as triggers, gags, aliases, macros, timers, and much more. But its main feature is the built-in Perl interpreter. You can at any moment execute Perl statements and functions to do things much more powerful than simply sending text the the mud. Perl statements can also be run, for example, as the action of a trigger, allowing you to do complex things. Some built-in functions of KildClient allow interaction with the world, such as sending commands to it.

This manual will guide you in using KildClient. First the basic usage will be described, and then more advanced features will be explained. In the end, there is a reference of all built-in functions of KildClient, which can be called from your scripts.

It is assumed that the user has some basic knowledge of MUDs and their working, and also of the specific MUDs the users connects to. This manual has no aim at explaining how to play a MUD. Even when specific examples are given of commands, these might not work on all MUDs.

kildclient-2.11.1/doc/C/kildclient/x1360.html0000644000175000017500000000717211570176765015405 00000000000000 Importing and Exporting

8.7. Importing and Exporting

You can export triggers, aliases, macros, timers, permanent variables and hooks to a file, and them load these objects in another World. This function is accessed via the World Editor.

To export some items, select them from the list. (You can select several items by holding the Control key and clicking.) Press the Export button, and a dialog will open for you to select a file name. Select a name, press Save and the selected items will be saved to the file.

The export function is accessible from the editors for all exportable objects (triggers, aliases, macros, timers, permanent variables and hooks). By default, it only exports one kind of object, the one currently displayed. But you can export more than one kind of object to the same file (for example, triggers and aliases, or aliases, macros and hooks, or even all of them). To do that, select all the items you want from all the pages in the World Editor. Then, from any page, select Export. From the dialog that opens, click Items to export. Several check boxes will appear. Mark the ones corresponding to the objects you want to export, and all corresponding selected objects will be imported.

After you have exported some items, you can import them in another World, even in another machine. Just open one of the editors (it doesn't matter which one, you can import triggers even from the alias editor), and press Import. Select the file from the dialog, and all items in the file will be imported and will be included in the current World.

kildclient-2.11.1/doc/C/kildclient/x3152.html0000644000175000017500000000462611570176766015410 00000000000000 $world->enahook

C.23. $world->enahook

void $world->enahook( event , number/name , ... );

Enables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, enables them all. Several arguments can be passed at once.

kildclient-2.11.1/doc/C/kildclient/x2822.html0000644000175000017500000000430511570176766015405 00000000000000 minimize

B.2. minimize

void $window->minimize(void);

This function minimized KildClient's main window. Called from a macro, it makes a nice boss key. :-)

kildclient-2.11.1/doc/C/kildclient/x3835.html0000644000175000017500000000523211570176767015413 00000000000000 $world->movealias

C.64. $world->movealias

void $world->movealias( number/name , new_pos );

Moves the alias with the given name or number so that it occupies the position new_pos after execution of this function. Other aliases might be moved up or down in result of this. If new_pos is negative or greater than the number of aliases, the alias is moved to the last position.

If there are several aliases with the given name, only the first one found is moved.

kildclient-2.11.1/doc/C/kildclient/x1103.html0000644000175000017500000000646411570176765015403 00000000000000 Changing the Style of the Matched Text

8.3. Changing the Style of the Matched Text

It is possible to cause a trigger to change the style of the line that matched (or of a part of it). This can be used, for example, to make some text that interests you stand out.

To do that, enable the Change Style check box in the Edit Trigger dialog (see Section 8.1.1). The Configure button then allows you to set the style to be applied. When pressed, it brings up a window like this:

Figure 8-3. The window to configure style

First you should select what is going to have the style changed. The style can be applied to the whole line that matched against the trigger, to the part of the line that matched the trigger pattern, or the the part of the line that was captured by one of the parentheses in the pattern (if they are used, naturally).

Next you can configure the style to be applied. You can change the color of the text, and apply or remove italics, strike-thru and underlining. In all these options, the default is "Do not change", which means that the trigger does not affect the style as sent by the MUD. If you select some option, then your selection will override the style that the MUD sends.

kildclient-2.11.1/doc/C/kildclient/c584.html0000644000175000017500000001165611570176765015311 00000000000000 Menu Reference

Chapter 6. Menu Reference

This chapter will describe all the menus and their commands in KildClient.

6.1. World menu

6.1.1. Open

This menu command opens the World Selector dialog for you to connect to a World, either a saved one or a new one. You can also edit the saved worlds from the World Selector dialog.

See Section 3.1 for more information on opening Worlds.

6.1.2. Reconnect

If you are not connected to a World, but have it still open (in offline mode), use this menu to connect again to the World. If you are connected, this command closes the current connection and reopens it.

6.1.3. Disconnect

This command closes the connection to the World. Note that this is not the recommended way to exit from a MUD, you should use the proper command (generally quit).

6.1.4. Connect to Another

This command opens the World Selector (see Section 3.1) for you to connect to another World using the same tab. If you are still connected to a World, the connection will be closed.

6.1.5. Close

This command closes the connection to the World (if it is open) and closes the current tab. If this is the only tab, the program is exited.

6.1.6. Edit

This command brings up the World Editor for you to configure the World. See Chapter 4.

6.1.7. Save

This command saves any changes made to the World to the disk so that they are made permanent. Note that whenever a World is closed, it is automatically saved before.

6.1.8. Statistics

This command opens a dialog showing some information and statistics about the currently open World. If the version you are running supports SSL and you are connected using SSL (see Section 4.1), some information about the SSL session and the certificate are displayed.

6.1.9. Previous and Next

These two commands allow you to navigate between the open Worlds, going to the next or previous tabs, repectively.

6.1.10. Quit

This command exits KildClient, closing any open Worlds. If an open world has "OnCloseConnected" hooks (see Chapter 12), they are executed. If there is at least one open world without such hook, you are asked for confirmation first.

kildclient-2.11.1/doc/C/kildclient/x3310.html0000644000175000017500000000610711570176766015400 00000000000000 $world->getline

C.37. $world->getline

$text = $world->getline( line );

($text, $time) = $world->getline( line );

This functions allows you to retrieve a line from the scrollback buffer, and optionally the time in which it was received.

line can be a positive number, representing the number of the line to fetch, or a negative number. If negative, that means that number of lines counting from the bottom. (That is, -1 is the last received line, -2 the one before the last, and so on.)

If the line cannot be retrieved (because it is not stored anymore), returns undef.

The time returned is represented as the number of seconds since the epoch, the same kind of value the time function would return.

kildclient-2.11.1/doc/C/kildclient/c19.html0000644000175000017500000000757311570176764015224 00000000000000 Running KildClient

Chapter 2. Running KildClient

To run KildClient, type kildclient in your command prompt:

kildclient [-c DIR] [World...] &

The ampersand (&) at the end of the line means that the command is to be executed in background, that is, not to wait until it finishes to get another command prompt. Since KildClient is a GUI program that does not require any input from the terminal, this is the desired behaviour.

You can enter the name of one or more saved Worlds in the command line, to have these Worlds opened automatically. If the World name contains spaces, you will need to quote it to prevent it from being interpreted as two or more names. The exact way depends on your shell, but generally enclosing it in quotes should work.

You can also specify a host name to connect to in the command line. By default, connection in made to port 4000. You can specify a different port by using hostname:port. While not recommended, you can also specify a username and password with the following syntax: username:password@hostname:port. This host specification syntax can be prefixed with telnet:// and end with /, for example telnet://some.mud.com:4444/. This is to allow links used in Web pages to be opened by KildClient.

If the -c (or --config) command line option is given, its argument is treated as the name of a directory to use to store configuration files and saved worlds. If it is not given, the default is ~/.kildclient under Linux or kildclient under the Application Data folder under Windows.

Alternatively, you may start KildClient from a menu in your Windowing Environment. The exact way to launch KildClient will then vary, but it should be just a matter of finding the menu entry and clicking on it, or perhaps just cliking in an icon somewhere.

kildclient-2.11.1/doc/C/kildclient/x2761.html0000644000175000017500000000424511570176766015412 00000000000000 play

A.6. play

void play( file );

This function plays a sound file. The argument is the path to the file.

kildclient-2.11.1/doc/C/kildclient/x4254.html0000644000175000017500000000533211570176767015410 00000000000000 $world->writetolog

C.84. $world->writetolog

void $world->writetolog( str , ... );

Writes the given line to the log file, if any. If logging is not currently enabled, then this function does nothing.

Each argument is a complete line, that is written preceded by a timestamp, if this is enabled, to the log file. If the string has ANSI codes or codes used by the colorize function, they will be stripped and not written to the log file.

See also $world->logfile.

kildclient-2.11.1/doc/C/kildclient/x2124.html0000644000175000017500000002147411570176765015405 00000000000000 Defining Hooks in the Command Line

12.2. Defining Hooks in the Command Line

For those more used to Perl and to command lines, it is also possible to define and alter hooks from the command line. This is done with a series of Perl function.

Hooks are defined with the $world->hook function. This function works similarly to $world->trigger (described in Chapter 8).

The simplest way to call the function is with two arguments: $world->hook(event, action). This defines a hook for the given event (see above for the valid events) that does action when the event is fired. As always, action can be some text or a Perl action.

Here's an example of connecting a hook to the OnConnect event:

Example 12-1. Connecting a hook


$world->hook('OnConnect', 'user Bob %; password 12345')

This hook causes the lines to the sent to the MUD when a connection is established, supposedly representing a way to log in to some MUD server.

12.2.1. Editing Hooks

Before going into editing, let us see how to get a list of all hooks that are currently defined for a given event. Just use the $world->listhook function with the event name as argument. You will be presented with a list of the currently defined hooks for that event.

There are three columns: Num is the number of the hook. Hooks are numbered sequentially starting at zero, but keep in mind that there is a separete numbering for each event. This number will be useful when we start editing hooks. After that, Ena tells whether the hook is enabled. Hooks that are disabled are not run. This is a nice way to stop a hook from working, but keep it stored for later use. We will see how to enable and disable hook later in this section. The last column shows the action of the hook.

The listing produced by $world->listhook is compact, showing all hooks but possibly truncating the pattern and/or substitution. If you give a hook number or name as the second argument to listhook (the first argument is the event, as always), it will display that hook's information detailedly.

To edit a hook, you need to know that hook's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->gethooknumber can be used to discover a hook's number if its name is known.) The same function used to add hooks can also change existing ones, you just need to pass the hook number as the second argument.

Calling $world->hook(event, number, new action) changes the action of the hook with that number for that event.

The only attribute for hooks, besides the action is enabled. It was mentioned briefly when we described how to list hooks. It can be set just like the other attributes and is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the hook is tried normally. When it is zero, commands are not tried against it. This way, disabling a hook effectively turns if off, as if it did not exist, but the hook is still saved, and can be turned on again when necessary.

Here's an example of disabling a hook (number 0 of event OnConnect in this case):

Example 12-2. Disabling a hook, the long way


$world->hook('OnConnect', 0,
             { enabled => 0 })

However, there is a shorter way: the $world->dishook function. It takes two arguments: the event and the hook number, and disables the hook with the given number. So the example above can be rewritten in a shorter way as:

Example 12-3. Disabling a hook, the short way


$world->dishook('OnConnect', 0)

The corresponding function $world->enahook enables the specified hook.

There are times when you want to delete a hook. This is easy to do, use the $world->delhook function. It takes as argument the event and the number of the hook wish to delete. Be aware that once deleted it is not possible to recover the hook (unless you create it again). Many times just disabling the hook is a better idea. The second thing to note is that when you delete a hook the numbers of the other hook may change, so be careful when you try to delete several hooks in sequence.

12.2.2. Assigning Names to Hooks

It is possible to assign names to hook. When a hook has a name, you can enable, disable, or delete it using its name instead of its number.

To assign a name to a hook, specify the name attribute when creating it:

Example 12-4. Creating a hook with a name


$world->hook('OnConnect', 'user Bob %; password 12345',
             { name => 'connection' })

You can now disable this hook with $world->dishook('OnConnect', 'connection'). The name can also be used in the $world->enahook, $world->delhook and $world->listhook functions.

It is also possible to assign a name to an existing hook. Just edit it as described in Section 12.2.1, passing the name attribute. Use this same process to change the name of a hook.

Another feature of hook names is that several hooks can have the same name. In this case, all these hooks will be treated as a single group. The functions above, when passed a hook name, will act upon all hooks of the group, that is, on all hooks with that name.

kildclient-2.11.1/doc/C/kildclient/x78.html0000644000175000017500000002053011570176764015242 00000000000000 Interacting with the MUD

3.2. Interacting with the MUD

The figure below shows a typical KildClient session:

Figure 3-2. A typical KildClient session with two open Worlds

The first thing to note is that, just like in other MUD clients, there is an area where the output of the MUD is shown, and a text box below where you can enter commands. You can edit the commands before being sent, and only after you press ENTER the line will be sent to the MUD.

A feature not so universal is the support for opening several Worlds simultaneously, and using tabs to alternate between them. You just need to click the tab to change to that World. If the name is displayed in red, that means that there is new text in that MUD, text you haven't seen yet. If the KildClient windows does not have focus (that is, when you using another window and leave KildClient in the background) and new text arrives in any World, the title of the KildClient window will change to "(*) KildClient" to alert you of that.

There are other ways to move to another open World. The keyboard shortcuts CTRL+Page up and CTRL+Page down move to the next or previous World, respectively. Alternatively, you can use ALT+Right arrow o ALT+Left arrow instead to achieve the same effect. To got directly to a World, press ALT+num, where num is a number from 1 to 9. This way you can move to any one of the first nine open Worlds.

On the left of the command entry box there is a button with a broom. Click on it to erase the whole command line.

You can recall recently typed commands with the arrow keys. Pressing the up arrow recalls the previous command, and the down arrow moves to the following command. If the input box has multiple lines, as described below, then use Alt and the arrows.

On the right, there is a button with an arrow poiting downwards. Click on it to get a list of the last typed commands. Selecting one of these commands will put it in the text box for you to repeat it, possibly changing it before.

On the extreme right, there are two small arrows. These arrows allow you to enlarge the input box if you type long input lines. The input box can have from one to ten lines. The arrow pointing up increases the size, the arrow pointing down decreases it.

The behaviour of input boxes with one or several lines is different: if there is only one line, and more text than fits the width is entered, the text is scrolled horizontally. On multi-line input boxes, however, text that does not fit one line is wrapped to the next line. A scroll-bar may be displayed if the whole text does not fit in the number of lines selected.

As mentioned briefly before, the behaviour of the up and down arrows is different. If the Alt key is held, then you will retrieve other commands in the history. If you press just the up and down arrows, it may retrieve another command or simply move the cursor: if you have just sent a command or just retrieved a command, then the arrow keys will move through other commands, but if you have moved the cursor in order to edit, the up and down arrows will move to the previous or next line. This may sound complicated, but is actually natural, the arrows do what you expect them to do.

In the single-line input box (but not in the multi-line one), a feature called command auto-completion is enabled: when you start typing a command, a list of the previously typed commands that start with the same string you've typed. You can select one of them from the list to repeat it or change it.

However, in both input methods, you can type the start of a command and press Alt+Shift+Up arrow to retrieve a previous command that starts with the typed text. You can then use Alt+Shift+Up arrow and Alt+Shift+Down arrow to navigate through all the saved commands with that prefix.

You can enter several commands at once in the command line separating them with %;. For example, if you type unlock door %; open door, two commands will be sent to the MUD in sequence: first unlock door, and then open door. Spaces around the %; are ignore and can be used for clarity. Note: it is possible to configure the command separator to be another string instead of %;. See Section 4.3.

Another special feature of the command line is that you can execute Perl statements from it. Starting a line with a slash (/) causes that line not to be sent to the world, but to be intepreted by the built-in Perl interpreter. To try it, type in the command box /$world->echonl("Hello, Perl World!"). You should see "Hello, Perl World!" printed in the screen. What has happened is that the command $world->echonl("Hello, Perl World!") has been run by Perl, and this command causes a string to be printed in the screen (but not to be sent to the MUD). Don't worry if you do not understand the syntax yet, we will explain it in Chapter 7. For now, just keep in mind that if you type a line starting with /, it will not be sent to the MUD, but what follows the slash is treated as a Perl command and executed.

Should you need to send a line that starts with / to the MUD, use two slashes: entering //list will send /list to the MUD.

If you are using the multi-line input bar, you can enable to built in spell checker to verify the text as you type. Misspelled words will be highlighted with a red line below them, and you can right-click on them to show a menu with possible spellings. To configure this feature, see Section 4.3.

kildclient-2.11.1/doc/C/kildclient/x717.html0000644000175000017500000000425711570176765015333 00000000000000 Diplay Menu

6.5. Diplay Menu

6.5.1. Split screen

This option toggles displaying or hiding another window with the output from the world, so that you can see both the text as it is received and some other part of the scrollback buffer. See Section 3.4.

kildclient-2.11.1/doc/C/kildclient/x4026.html0000644000175000017500000000660611570176767015412 00000000000000 $world->sendlines

C.77. $world->sendlines

success = $world->sendlines( "multi-line string" , [delay , [n-lines]] );

success = $world->sendlines( [ "line 1", "line 2", ... ] , [delay , [n-lines]] );

Sends several lines of text to the world. delay is the number of seconds to wait between sending each group of lines, and n-lines is the number of lines to send a time. If these values are not specified, they are taken from the defauls set in the Preferences dialog (see Section 5.2).

There are two ways to specify the lines to be sent: the first is passing a multi-line string, which is split into lines and each line is sent separately. The second one is passing a reference to an array where each element consists of one line.

This function always returns true.

For more options, see the $world->mlsend function which allows adding a text before and/or after each line, and sending lines before and/or after sending the contents of the file.

kildclient-2.11.1/doc/C/kildclient/x3166.html0000644000175000017500000000455311570176766015414 00000000000000 $world->enamacro

C.24. $world->enamacro

void $world->enamacro( number/name , ... );

Enables the macro identified by number or name. If there are several macros with the same name, enables them all. Several arguments can be passed at once.

kildclient-2.11.1/doc/C/kildclient/x4349.html0000644000175000017500000000456211570176767015421 00000000000000 KCWin::feed

D.4. KCWin::feed

void KCWin::feed( $text );

Appends text to the output terminal widget. $text can contain ANSI color sequences. The colorize function can be useful in conjuntion with this function.

kildclient-2.11.1/doc/C/kildclient/x1120.html0000644000175000017500000001246311570176765015376 00000000000000 Gags

8.4. Gags

Now that the basic usage of triggers has been explained, let us see some more advanced features.

In KildClient, gags are just a special kind of trigger with the "gag" flag activated, and they behave just like other triggers, with the exception that the line that matched the pattern does not get printed in the screen. It is possible to have a gag that executes an action when triggered, just like with non-gag triggers, or it can be a simple gag, which prevents the line from being printed but does nothing else.

To specify that a trigger is a gag when it is created, just check the Omit (gag) from output checkbox when creating the trigger.

Let's create a simple gag to omit all that is said by Joe, a very silly and annoying player:

Example 8-5. A simple gag

  • Pattern: ^Joe chats

  • Action: /$world->echonl("Joe said something silly here.")

  • Omit (gag) from output: Checked

This trigger is a gag, and whenever a line starting with "Joe chats" is received, it will not be printed. Instead, the code specified in the action will be executed, and that code will print a message that tells you that Joe said something, but does not tell what, so you do not need to worry.

That is good, but can get even better. We do not need to know that Joe said something, it would be better if we could ignore him altogether. And we can. It is not necessary to specify an action for a gag trigger. In this case, nothing will be done, but the matched line will not be printed. So our example becomes:

Example 8-6. A gag with no action

  • Pattern: ^Joe chats

  • Omit (gag) from output: Checked

The action has simply been omitted, but the check box that specifies that we are creating a gag trigger remains, naturally.

Sometimes you want to change the way a line is displayed, such as rearranging the information so that it appears in another way. The way to do that is with a gag, and an action that outputs the modified line. Heres a simple example that changes the way a hypothetical chat channel is displayed:

Example 8-7. Rewriting a line with gags

  • Pattern: ^(.*) chats, '(.*)'

  • Action: /$world->echonl("[Chat] $_[1]: $_[2]")

  • Omit (gag) from output: Checked

The Omit (gag) from output check box only controls whether the line is displayed in the screen or not. If you have logging enabled (see Chapter 14), a the line that matched a trigger with that option checked will be written in the log file normally. If you want the line to be omitted from the log file, you must set also the Omit (gag) from log file check box. If it is set, then the line will not be written to the log file. Note that the two attributes are independent: you can gag the line from the screen, from the log file, from both or from neither.

kildclient-2.11.1/doc/C/kildclient/x1166.html0000644000175000017500000001474211570176765015412 00000000000000 Other trigger features

8.5. Other trigger features

By default, when a trigger matches, no more checking is done. So if a line would match two or more triggers, only the first would have a successful match and have its action executed. The other ones wouldn't even have a chance to try a match.

If you check the Keep executing triggers after this one matches option, then even if this triggers matches it does not prevent other triggers from being tried. So, if a second trigger matches, the actions of both will be executed. Note, however, that unless this second trigger also has the same option checked, trigger matching will stop at that second trigger.

If you are having trouble with triggers and want to be informed whenver a trigger matches, enable the Preferences->Debug Matches menu. When this is enabled, information about each matched trigger will be printed to stderr. (This means you must start KildClient from a terminal to see the output.)

8.5.1. Rewriter Triggers

Rewriter triggers are a special kind of trigger that allows something not possible with ordinary triggers: changing the received line so that futher triggers work on this changed line.

As mentioned above, the $colorline variable holds the entire line that matched the trigger, including ANSI color codes. Rewriter triggers can alter this variable, and then the other triggers will match on this changed line.

Rewriter triggers run before normal triggers. Also, the Keep executing option (see Section 8.5) is not considered for them: they never stop processing of other triggers, even if that option is not set. The gag options are also not significant for a rewriter trigger; they are always ignored.

Let's see an example of where rewriter triggers can be useful. Suppose you do not want to see an offensive word that might appear in the MUD. A first attempt at filtering could be a trigger like this:

Example 8-8. A profanity filter that does not work

  • Pattern: fuck

  • Action: /$colorline =~ s/fuck/f***/; $world->echo($colorline)

  • Omit (gag) from output: Checked

This works for simple cases, but it is most likely not what you want. Suppose you have a trigger that captures messages sent from a specific channel (such as the one for telepathic communications) and does something, such as changing the presentation of the message or sending them to another window. If someone sends a message over that channel with the f-word, the channel-capture trigger will not work because the line has already been caught the the profanity-filter trigger above. You'll see the message with the bad word filtered, but it will not be captured as a channel message.

You might think about setting the Keep executing option in the profanity-filter trigger, but that would not solve the problem. That trigger would match, and print in the main window the line just with the word filtered. And then the original line would match against the channel-capture trigger, thus acting upon the channel message, but with the bad word intact, because the trigger did not change the line. So you would end up seeing the message twice, but neither case in the way you want.

The solution to this problem is to use a rewriter trigger to filter the bad word before other triggers have a chance to see the line. Our profanity-filter trigger should be like this:

Example 8-9. A profanity filter using a rewriter trigger

  • Pattern: fuck

  • Action: /$colorline =~ s/fuck/f***/

  • Rewriter trigger: Checked

Note that the line is not printed. Rewriter triggers generally need not print anything, because if no other trigger matches the line, it will be printed (with the changed contents). If another trigger matches, let this trigger decide what to do.

Now everything should work: when any line with the f-word is seen, this word is filtered out and the line is changed. If this was a channel message, the channel-capture trigger will see the line with the offensive word filtered and display the message in your special way without the bad word.

kildclient-2.11.1/doc/C/kildclient/x3188.html0000644000175000017500000000456511570176766015423 00000000000000 $world->enatimer

C.26. $world->enatimer

void $world->enatimer( number/name , ... );

Enables the timer identified by number or name. If there are several timers with the same name, enables them all. Several arguments can be passed at once.

kildclient-2.11.1/doc/C/kildclient/x4457.html0000644000175000017500000000542311570176770015410 00000000000000 Plugin Conventions

E.7. Plugin Conventions

The first convention about plugins has been mentioned already: all plugins should define a help describing themselves. This help can be as detailed as necessary.

Another convention regards the use of triggers, aliases, macros, timers and hooks. All of them should have names (and they should always be referenced by names, because the plugin writer cannot know which number will be assigned to them), and the names should consist of the name of the plugin, a colon, and then some descriptive name for the trigger (or alias, etc). This is to avoid name clashes with other plugins.

Another aspect regarding triggers, aliases, macros, timers and hooks is that they should only be created in the top-level scope, which means they are created when the plugin is loaded. They must not be created in a function that is called later, because this way they would not be recognized as belonging to the plugin, and this would create a mess for the user. So create them outside any functions.

kildclient-2.11.1/doc/C/kildclient/x4339.html0000644000175000017500000000435111570176767015414 00000000000000 KCWin::set_text

D.3. KCWin::set_text

void KCWin::set_text( $text );

Sets the text in the entry box.

kildclient-2.11.1/doc/C/kildclient/c2032.html0000644000175000017500000002023411570176765015347 00000000000000 Hooks

Chapter 12. Hooks

Hooks allow you to specify an action to be executed automatically when some events happen. For example, you can define a hook with actions to be executed when a connection is established, and then these commands will be automatically executed when you connect to the World.

You can connect hooks to seven events:

  • OnConnect: This hook is executed when a connection to the world is made, after the auto-logon has taken place (if applicable).

  • OnDisconnect: This hook is executed when you are disconnected from a World, after the connection has been closed.

  • OnReceivedText: Executed when text is received from the world. The text received is available for the hook in the $hookdata variable, and can be inspectd in Perl scripts.

  • OnSentCommand: Executed after a command is sent to the world. The command is available for the hook in the $hookdata variable, and can be inspectd in Perl scripts.

  • OnGetFocus: Executed when the KildClient window receives the focus.

  • OnLoseFocus: Executed when the KildClient window loses the focus.

  • OnCloseConnected: Executed when the world is forcedly closed. This can happen using the World->Close menu, the $world->close() function, or by quitting the program with the world connected. You can put in this hook, for example "quit" to always exit the MUD nicely, even if you close the world by mistake.

12.1. Creating and Editing Hooks

The easiest way to create and alter hooks is from the World Editor, the place where all settings of a World are altered (see Chapter 4).

Hook are defined in the Hooks section inside the Automation section. When you open that section, you'll see a list of the defined hooks and some buttons like this:

Figure 12-1. The graphical Hook editor

In the top there is a combo box for you to select one of the five events described above. When an event is selected the hooks defined for that event will be listed, and all operations will be done on hooks of that event.

The main part of the window is the list of defined hooks. The columns are as follows:

  • Enabled specifies whether the hook is enabled or not. Hooks that are not enabled are not active and will not be run, but they remain in the list so that they can later be enabled again.

  • Name is a name that is assigned to a hook. This helps you identify the hook's purpose and is useful when editing a hook via the command line (as described in Section 12.2.1). Assigning a name to a hook is optional.

  • Action defines what is done when the hook is run..

12.1.1. Adding Hooks

To add a new hook, select the desired event from the Combo Box and press the Add button. This will open a window for you to edit the new hook's parameters:

Figure 12-2. The window to edit hooks

What can be set represents the columns described above.

When you are finished, press OK and the hook will be added. If you change your mind, press Cancel and the hook will not be added.

To see some things hooks can do, read Section 12.2. If you want to try the hooks described there, you can create them from the World Editor.

12.1.2. Editing Hooks

To edit a hook, select the event from the combo box, then select the hook to edit in the list by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding hook (see Section 12.1.1) will be opened, filled with the hook's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the hook will remain as it was before.

Another shorter way to edit a hook is to double click its line in the list.

It is also possible to change the value of enabled setting directly from the hook list. Make sure that the hook you want to change is selected, and click in the check button. The state will be toggled.

To delete a hook, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the hook. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the hook again. See Section 4.8. To delete several hooks at once, select them all and press Delete.

The final thing that needs to be explained with regard to hooks is how to reorder them. Hooks as run from the first one to the last, so in a few cases the order might matter. To move a hook up or down in the list, select it and press the corresponding button.

kildclient-2.11.1/doc/C/kildclient/x1210.html0000644000175000017500000004160411570176765015375 00000000000000 Defining Triggers in the Command Line

8.6. Defining Triggers in the Command Line

For those more used to Perl and to command lines, it is also possible to define and alter triggers from the command line. This is done with a series of Perl function.

Triggers are defined with the $world->trigger function. There are many ways to use this function, and we will start describing them here.

The simples way to use that function is with two arguments: $world->trigger(pattern, action). This defines a trigger that will match against pattern and execute action when a match happens.

Here's how to define the trigger in Example 8-1 in the command line:

Example 8-10. A very simple trigger defined in the command line


$world->trigger('has attacked you!', 'wield sword')

To specify other trigger features an extra argument is passed to the trigger function. For those that know Perl, it is a reference to a hash, and this hash can contain some attributes specifying the trigger's behaviour. For those that do not understand the previous sentence, do not worry, the examples should make the usage clear.

Let's re-create a simple gag to omit all that is said by Joe (see Example 8-5):

Example 8-11. A simple gag (in the command line)


$world->trigger('^Joe chats',
                '/$world->echonl("Joe said something silly here.")',
                { gag => 1 })

See the difference? There is a third parameter, enclosed in curly braces {}, with the word gag, an arrow, and the number 1. What that means is that gag has the value 1, or, as usual in computer languages, is true. (False would be zero.)

Often gags do not have any action:

Example 8-12. A gag with no action (in the command line)


$world->trigger('^Joe chats',
                { gag => 1 })

The action has simply been omitted, but the argument that specifies that we are dealing with a gag remains, naturally. As a matter of fact, this kind of gag (with no action) is quite common, and there is a shorter way to do that. The command below has the exact same effect as the previous one:

Example 8-13. A shortcut function to define gags


$world->gag('^Joe chats')

The gag attribute only controls whether the line is displayed in the screen or not. If you have logging enabled (see Chapter 14), a the line that matched a trigger with the gag attribute will be written in the log file normally. If you want the line to be omitted from the log file, you must set also the gaglog attribute. If it is set, then the line will not be written to the log file. Note that the two attributes are independent: you can gag the line from the screen, from the log file, from both or from neither.

To make case be ignored when matching, use a very similar construct as the above, but using the ignorecase attribute:

Example 8-14. A case-insensitive trigger


$world->trigger('^.* chats ".*joe.*"', '/callAttention()',
                { ignorecase => 1})

Another attribute that can be set for triggers is keepexecuting, corresponding to the Keep executing triggers after this one matches option (see Section 8.5). This flag is specified just like gag. Just add the parameter { keepexecuting => 1 } to the function call. It is possible for a trigger to be both a gag and have the keepexecuting flag. In this case, include both in the last argument: { gag => 1, keepexecuting => 1 }. Note it is just one argument, with both flags separated by a comma. The order does not matter, keepexecuting could have come before gag.

Similarly, rewriter triggers (see Section 8.5.1) are created with the rewriter flag.

8.6.1. Editing Triggers

In the previous sections it was shown how to add triggers, but nothing was told about how to change them after they are defined. This and other points will be addressed in this section.

Before going into editing, let us see how to get a list of all triggers that are currently defined for the World. Just use the $world->listtrigger function without arguments. You will be presented with a list of the currently defined triggers.

There are several columns: Num is the number of the trigger. Triggers are numbered sequentially starting at zero. This number will be useful when we start editing triggers. Next comes gag, which tells whether the trigger is a gag (for the screen). Next is GLo, which means "Gag from Log", and shows whether the line is omitted (that is, not written) in the log file also (if logging is enabled, of course). After that, Ena tells whether the trigger is enabled. Triggers that are disabled are not matched. This is a nice way to stop a trigger, but keep it stored for later use. We will see how to enable and disable triggers later in this section. Next there is KeE, which reports the status of the keepexecuting flag for the trigger. After that, IgC specifies the case is being ignored. The final two columns list the pattern and action of the trigger.

The listing produced by $world->listtrigger is compact, showing all triggers but possibly truncating the pattern and/or action. If you give a trigger number as argument to listtrigger, it will display that trigger's information detailedly.

To edit a trigger, you need to know that trigger's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->gettriggernumber can be used to discover a trigger's number if its name is known.) The same function used to add triggers can also change existing ones, you just need to pass the trigger number as the first argument.

Calling $world->trigger(number, new pattern) changes the pattern of the trigger with that number. If you want to change the pattern and action, include the action as a third argument: $world->trigger(number, new pattern, new action). What if you want to change only the action? Since passing only one string argument would change the pattern, this is done in a different way, using the same hash that is used to pass attributes to the trigger. In brief, this is how you would change only the action: $world->trigger(number, { action => new action }). Notice that the action is passed as an attribute inside the curly braces. It is also possible to change the pattern this way, just use the attribute pattern.

Naturally, it is possible to attributes such as gag or keepexecuting. The syntax is the same, include the new value inside the curly braces. To clear one of those flags, use the value 0, which means false. The example below makes trigger number 2 stop being a gag, and at the same time sets it not to prevent matching of other triggers:

Example 8-15. Changing several attributes at once


$world->trigger(2,
                { gag => 0,
                  keepexecuting => 1 })

It is also possible, naturally, to change attributes such as pattern or action at the same time that gag or keepexecuting are changed. All these attributes are equal, the only difference is that since the pattern and action are used much more often, there is a shorter way of specifying them. But even when you create a trigger you can use this extended syntax. Example 8-10 could be also entered this way, with the exact same results:

Example 8-16. A very simple trigger, in another way


$world->trigger({ pattern => 'has attacked you!',
                  action => 'wield sword'})

The final attribute for triggers is enabled. It was mentioned briefly when we described how to list triggers. It can be set just like the other attributes, and like keepexecuting or gag it is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the trigger is matched normally. When it is zero, received lines are not matched against it. This way, disabling a trigger effectively turns if off, as if it did not exist, but the trigger is still saved, and can be turned on again when necessary.

Here's an example of disabling a trigger (number 3 in this case):

Example 8-17. Disabling a trigger, the long way


$world->trigger(3,
                { enabled => 0 })

However, there is a shorter way: the $world->distrigger function disables the trigger whose number is passed as argument. So the example above can be rewritten in a shorter way as:

Example 8-18. Disabling a trigger, the short way


$world->distrigger(3)

The corresponding function $world->enatrigger enables the specified trigger.

It is also possible to temporarily disable all triggers. Just use the menu Preferences->Disable Triggers and this will prevent triggers from running. This does not change the "enabled" status of any triggers, it just prevents all triggers from running. When you select the menu again, triggers that were enabled will run again, and those that were disabled will remain disabled.

There are times when you want to delete a trigger. This is easy to do, use the $world->deltrigger function. It takes as argument the number of the trigger you wish to delete. Be aware that once deleted it is not possible to recover the trigger (unless you create it again). Many times just disabling the trigger is a better idea. The second thing to note is that when you delete a trigger the numbers of the other triggers may change, so be careful when you try to delete several triggers in sequence.

8.6.2. Assigning Names to Triggers

It is possible to assign names to triggers. When a trigger has a name, you can enable, disable, or delete it using its name instead of its number.

To assign a name to a trigger, specify the name attribute when creating it:

Example 8-19. Creating a trigger with a name


$world->trigger('has attacked you!', 'wield sword',
                { name => 'attack' })

You can now disable this trigger with $world->distrigger('attack'). The name can also be used in the $world->enatrigger, $world->deltrigger and $world->listtrigger functions.

It is also possible to assign a name to an existing trigger. Just edit it as described in Section 8.6.1, passing the name attribute. Use this same process to change the name of a trigger.

Another feature of trigger names is that several triggers can have the same name. In this case, all these triggers will be treated as a single group. The functions above, when passed a trigger name, will act upon all triggers of the group, that is, on all triggers with that name.

8.6.3. Reordering Triggers

Triggers are tried from the first to the last, so in some cases the order of the triggers matters. It is possible to move a trigger to another position with the $world->movetrigger function.

The function takes two parameters: the first is the name or number of the trigger that you want to move. The second is the new position that the trigger will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of triggers, the trigger will be moved to the end of the list.

If there are several triggers with the same name, only the first one found will be moved. And when a trigger is moved, other triggers might move up or down to accomodate the change.

kildclient-2.11.1/doc/C/kildclient/x3024.html0000644000175000017500000000456411570176766015407 00000000000000 $world->disalias

C.13. $world->disalias

void $world->disalias( number/name , ... );

Disables the alias identified by number or name. If there are several aliases with the same name, disables them all. Several arguments can be passed at once.

kildclient-2.11.1/doc/C/kildclient/x3750.html0000644000175000017500000000541211570176767015407 00000000000000 $world->makepermanent

C.61. $world->makepermanent

void $world->makepermanent( var , ... );

This function marks one or more variables as permanent, that is, the values of these variables will be saved when the world is closed, and reloaded when the World is opened, thus keeping their values between successive uses of the World.

The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation.

kildclient-2.11.1/doc/C/kildclient/x3342.html0000644000175000017500000000531611570176766015406 00000000000000 $world->getmacronumber

C.39. $world->getmacronumber

@list = $world->getmacronumber( name );

Returns a list with the number(s) of the macro(s) matching the given name. If no macro with that name is found, returns an empty list. If there are several macros with the same name, returns the numbers of all of them.

The number of a macro is necessary to edit it. However, as the user can change the order of macros, create new ones and delete old macros, a macro's number may change, so you should not store its number; you must fetch the number just before editing it.

kildclient-2.11.1/doc/C/kildclient/x3514.html0000644000175000017500000000513511570176767015407 00000000000000 $world->listalias

C.49. $world->listalias

void $world->listalias(void);

Briefly lists all defined aliases.

void $world->listalias( number/name , ... );

Lists detailedly the alias with the given number or name. If there are several aliases with the same name, lists them all. Several arguments can be passed at once.

kildclient-2.11.1/doc/C/kildclient/x3268.html0000644000175000017500000000445111570176766015414 00000000000000 $world->getentryfont

C.33. $world->getentryfont

$font = $world->getentryfont(void);

This function returns the name of the font used in the command entry box.

kildclient-2.11.1/doc/C/kildclient/x3722.html0000644000175000017500000000546011570176767015411 00000000000000 $world->macroenabled

C.59. $world->macroenabled

result = $world->macroenabled( name/number );

This functions checks whether the specified macro exists and whether it is enabled.

You can pass either a macro number or name. If the macro does not exist, this function returns undef, so you can distinguish the case of a non-existant macro from a disabled one.

If the macro exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several macros with the same name, it returns a list with one value for each macro with that name, and each value is 0 or 1 depending on the state of the macro.

kildclient-2.11.1/doc/C/kildclient/x3474.html0000644000175000017500000000556111570176767015417 00000000000000 $world->hookenabled

C.46. $world->hookenabled

result = $world->hookenabled( event , name/number );

This functions checks whether the specified hook exists and whether it is enabled.

The first argument is the name of the event. For the second, you can pass either a hook number or name. If the hook does not exist, this function returns undef, so you can distinguish the case of a non-existant hook from a disabled one.

If the hook exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several hooks with the same name, it returns a list with one value for each hook with that name, and each value is 0 or 1 depending on the state of the hook.

kildclient-2.11.1/doc/C/kildclient/c1860.html0000644000175000017500000002017211570176765015360 00000000000000 Timers

Chapter 11. Timers

Timers allow you to execute commands repeatedly at fixed intervals, and also to specify a command to be executed later.

Timers have to mandatory attributes: an interval in seconds, that represents how often the timer is fired, and an action, that is the command that is executed. Just like in other places, the action can be a text that is sent to the MUD, or it can be something run with Perl.

It is possible to define timers that execute only a fixed number of times. This is the timer's repeat count. Whenever the timer is executed, this count is decreased, and when it reaches zero, the timer is disabled, and will only execute again if reenabled manually. A timer can also be temporary: in this case, when the repeat count reaches zero, it is deleted and not only disabled. A repeat count of -1 means that the timer is executed indefinitely.

A timer with a repeat count of one is executed only once. Since the first execution only happens interval seconds after it is defined, this allows you to define a command to be executed after some specified time. If it is marked as temporary, the timer will be deleted after it is run this one time.

11.1. Creating and Editing Timers

The easiest way to create and alter timers is from the World Editor, the place where all settings of a World are altered (see Chapter 4).

Timer are defined in the Timers section inside the Automation section. When you open that section, you'll see a list of the defined timers and some buttons like this:

Figure 11-1. The graphical Timer editor

The main part of the window is the list of defined timers. The columns are as follows:

  • Enabled specifies whether the timer is enabled or not. Timers that are not enabled are not active and will not be run, but they remain in the list so that they can later be enabled again.

  • Name is a name that is assigned to a timer. This helps you identify the timer's purpose and is useful when editing a timer via the command line (as described in Section 11.2.1). Assigning a name to a timer is optional.

  • Interval is the interval between timer activations, as described above.

  • Count is the repeat count, as described above.

  • Action is the action that is run when the timer fires.

  • Temp indicates whether the timer is temporary or not. Temporary timers are deleted automatically when their repeat count reaches 0.

  • Plugin: if this is non-empty, it means that the timer belongs to a plugin (and the name of the plugin is displayed). However, by default plugin timers are not displayed. See Section 4.8 for information on how to display plugin timers here.

11.1.1. Adding Timers

To add a new timer, press the Add button. This will open a window for you to edit the new timer's parameters:

Figure 11-2. The window to edit timers

What can be set represents the columns described above.

When you are finished, press OK and the timer will be added. If you change your mind, press Cancel and the timer will not be added.

To see some things timers can do, read Section 11.2. If you want to try the timers described there, you can create them from the World Editor.

11.1.2. Editing Timers

To edit a timer, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding timer (see Section 11.1.1) will be opened, filled with the timer's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the timer will remain as it was before.

Another shorter way to edit a timer is to double click its line in the list.

It is also possible to change the value of the binary options (those represented by a check box) directly from the timer list. Make sure that the timer you want to change is selected, and click in the check button. The state will be toggled.

To delete a timer, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the timer. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the timer again. See Section 4.8. To delete several timers at once, select them all and press Delete.

The final thing that needs to be explained with regard to timers is how to reorder them. Timers as tried from the first one to the last, so in a few cases the order might matter. To move a timer up or down in the list, select it and press the corresponding button.

kildclient-2.11.1/doc/C/kildclient/x4143.html0000644000175000017500000001627711570176767015417 00000000000000 $world->trigger

C.82. $world->trigger

void $world->trigger( pattern , action , [attributes] );

void $world->trigger( number , [pattern , [action]] , [attributes] );

Creates a new trigger, or edits the trigger identified by number, matching pattern (a Perl regular expression), that will execute action when a line is matched by pattern. action is interpreted as if it were typed in the command box. Simple strings get sent to the world, Perl code can be run by prefixing it with '/', etc.

atributes is a reference to a hash defining attributes for the trigger. Generally the call works like this:


$world->trigger("pattern", "action", { attribute1 => value1,
                                       attribute2 => value2, ... })

Possible attributes:

  • pattern: The pattern to match.

  • action: The action to be executed.

  • enabled: If value evaluates to true, the trigger is enabled. If it evaluates to false, the trigger is disbled and lines are not matched against it.

  • name: Assigns a name to the trigger, so that it can be referenced by name.

  • ignorecase: If value evaluates to true, ignore case when matching the pattern.

  • gag: If value evaluates to true, the line that triggered it is not printed.

  • gaglog: If value evaluates to true, the line that triggered it is not written to the log file.

  • keepexecuting: If the value evaluates to true, when a line matches the trigger, the actions for the trigger are executed, and matching of the line continues against other triggers. If this is false (the default), when this trigger matches no other triggers are matched.

  • rewriter:This trigger is a rewriter trigger. It is run before other triggers, does not prevent any other trigger from running (even if keepexecuting is false), and can alter the input line for further processing by changing the $colorline variable. For more details, see Section 8.5.1.

  • style: Used to control the changing of styles (color, attributes, etc.) of a matched part of the line. The value of this attribute is an anonymous hash that specifies everything that is to be changed.

    Here's an example:

    Example C-1. Changing styles with triggers

    
$world->trigger('Joe', { name => 'joe', style => { enabled => 1,
                                                       fg => 16 } });
    

    These are the valid attributes:

    • enabled: Set this to 1 to enable changing the style.

    • target: What to highlight. Possible values are:

      
  -1 - The whole matched line
         0 - The whole substring that matched
         1 - The first captured substring
         2 - The second captured substring
         3 - etc.
        
    • fg: What to do with the foreground colour. -1 means not to change it. Other values change to the given color, as follows:

      
  0 - black                  9 - black (bold)
        1 - red                   10 - red (bold)
        2 - green                 11 - green (bold)
        3 - yellow                12 - yellow (bold)
        4 - blue                  13 - blue (bold)
        5 - magenta               14 - magenta (bold)
        6 - cyan                  15 - cyan (bold)
        7 - white                 16 - white (bold)
        8 - the default color     17 - default bold color
        
    • bg: What to do with the background color. The values are the same as for the foreground color.

    • italics: Italics setting. -1 means do not change. 0 means to not use italics, and 1 means to use it.

    • strike: Strike-thru setting. -1 means do not change. 0 means disable it, and 1 means enable it.

    • underline: Underline setting. -1 means no change. 0 means no underline. 1 means single underline, and 2 means double underline.

kildclient-2.11.1/doc/C/kildclient/x3004.html0000644000175000017500000000455111570176766015401 00000000000000 $world->deltimer

C.11. $world->deltimer

$n = $world->deltimer( number/name );

Deletes the timer identified by the given number or name. If there are several timers with the same name, deletes them all. Returns the number of timers deleted.

kildclient-2.11.1/doc/C/kildclient/x3767.html0000644000175000017500000000552611570176767015425 00000000000000 $world->maketemporary

C.62. $world->maketemporary

void $world->maketemporary( var , ... );

This function marks one or more variables as temporary, that is, the values of these variables will not be saved when the World is closed. This is the standard behaviour for variables, so this function is only needed to undo the efects of the $world->makepermanent function.

The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation.

kildclient-2.11.1/doc/C/kildclient/x777.html0000644000175000017500000001624111570176765015335 00000000000000 Echoing and Sending Text

7.2. Echoing and Sending Text

As mentioned in the previous section, the $world->echo function is used to print (or echo) text to the MUD window, without sending it to the World. It works like the print built-in function: it accepts any number of arguments, and echoes all of them, sequentially.

For example, $world->echo("Variable var contains ", $var, ".\n") would print the first string, followed by the contents of $var, followed by a period and a new line. Of course, you could do all that in a single string using variable interpolation.

A variant of $world->echo is $world->echonl. The difference is that $world->echonl always prints automatically a newline after each argument. This is just a shorthand to make some things simpler and possibly more readable.

Similar to $world->echo is the $world->send function. This function sends something to the MUD. For example, $world->send("who") will have the same effect as if you had typed who in the command entry box and pressed ENTER. Note that you do not have to add a newline to the end of the line to send, because send automatically sends a newline after each argument (since commands must be terminated by a newline for the MUD to recognize them).

It is possible to pass several arguments to send. If you do so, each argument will be sent as a separate command. For example, $world->send("who", "look") will first send a who to the MUD, and then a look, just as if you had typed each of these commands in order.

All the examples given above did nothing that could not be done without Perl, and using send for that was actually less efficient that typing the commands directly. However, when combined with variables and/or control flow structures, send can actually be quite useful.

7.2.1. Paths and Speed-Walking

A useful feature of some MUD clients, which KildClient implements, is the support for speed-walking. This feature allows you to define paths to go directly from one place to another without having to type a lot of movement commands.

For example, suppose that to go to some place from a fixed point (such as the center of a town) you need to take the following directions: s s s e e s e e e e n nw n. This is often written in a more compact way as 3s 2e s 4e n nw n. KildClient allows you to send to the MUD all the 13 required commands in a single command. To do that, use the $world->path function. For example, if you enter /$world->path("3s2es4en{nw}n") in the command line, 13 commands will be sent to the MUD: exactly the 13 that form the path defined above.

Note the syntax: the movement commands are defined one after another, optionally prefixed by a number, which determines how many times that command will be sent. So 3s means send s three times. If there is no number, the command is sent only once.

Note also that the command to move to the north-west is enclosed in braces: {nw}. This is because if the $world->path function sees nw, it will think you want to move to the north than to the west. Enclosing it in braces causes $world->path to see that as a single command. Should you need to move several times to the northwest, you can add a number before: 4{nw} will send nw four times.

Naturally, you can include any command that is not a single letter in braces to force $world->path to see it as a command. It is likely that some paths will need something like {open door} in the middle.

Of course, simply entering paths in the command line is not that useful. But you can store the path in a variable, and then just call $world->path($stored_path). Just add a line that defines the variable to you script file (see Section 7.1), and you will be able to use the variabled anywhere.

Alternatively, you can define an alias (see Chapter 9) or a macro (see Chapter 10) to execute your path even faster. The easypath plugin does that, see section Section 13.3.1.

kildclient-2.11.1/doc/C/kildclient/c208.html0000644000175000017500000001651411570176764015277 00000000000000 Editing a World

Chapter 4. Editing a World

This chapter will describe all the options found in the World Editor that let you customize the behaviour of KildClient. Only general options will be described here, some sections of the World Editor, that allow you to configure features dealing with automation (such as triggers, aliases, hooks, etc.) will be described in other chapters, along with an explanation of that feature.

To access the World Editor for the currently open World, use the World->Edit menu. It is also possible to edit Worlds from the World Selector dialog, just click once in the World from the list and press Edit.

There are several groups of options in that dialog. The following sections will describe each one in turn.

4.1. General

The figure below shows the General section of the World Editor:

Figure 4-1. The General section of the World Editor

The first section, Connection, contains parameters that specify how to connect to the MUD:

  • Name: this specifies the name that will be shown in the World Selector, and also in the tab in the main window. It can be anything you want, that helps you identify the MUD.

  • Host: the host to connect to. It can be entered either as a name or as a numeric IP.

  • Port: the port to connect to.

  • Use SSL: if this is checked, the communication with the MUD will be encrypted and thus immune to casual eavesdropping. However, the MUD server must support this, if you try to connect using SSL to a server that does not understand it, the connection will fail.

    Note: you might not see this option. If it is not present, that means that you version of KildClient has been compiled without SSL support.

    Note: although the connection will be encrypted if the connection uses SSL, KildClient does not attempt any kind of certificate verification, so you must not assume that the connection is authenticated. You can, however, see some information on the certificate in the Statistics dialog (see Section 6.1.8).

The second second, Proxy allows you to specify a proxy server to use when connecting to the MUD. By default, Worlds use the global proxy settings configured in the Preferences dialog (see Section 5.4). But you can override the default settings for individual worlds.

Select No proxy if there is a default proxy setting but you want this world to connect directly to the MUD server. Or select SOCKS4 or SOCKS5 to specify a proxy server. In this case, provide the proxy server hostname or IP address and the port to connect to. If the proxy requires authentication, supply the credentials in the Username and Password fields.

The third section, Auto-login, contains the parameters that you need to configure if you want KildClient to login automatically to the MUD for you. You can associate several characters with a World, and then when you can select which character you use to login to the MUD, as explained in Section 3.1.

First, select how the login will be made in Connection Style. If this is set to "No auto-login", no attempt will be made to login automatically. This is the default.

There are two other options: "Diku", for Diku-based mud servers, which prompt you for the character name and then the password; and "lp" for lp-based mud servers, in which you have to type connect followed by the character name and password.

If neither of these options apply to your MUD, you should disable auto-login here, but you can still use a hook to send commands just after you connect. See Chapter 12.

Next follows a list of all the characters that you have defined. Each character is associated with a password, however the password is not displayed for security reasons.

To add a new character, press Add and enter the character's name and password in the window that appears, then press OK. The new character will be added to the list. To edit an existing character, select it and press the Edit button. To remove a character information, select it and press Delete. Finally, to control the order that the characters are displayed, use the Up and Down buttons. Note that the first character is considered the default and is the one used if you connect using the main entry for that World.

kildclient-2.11.1/doc/C/kildclient/x3850.html0000644000175000017500000000531411570176767015411 00000000000000 $world->movehook

C.65. $world->movehook

void $world->movehook( event , number/name , new_pos );

Moves the hook with the given name or number, connected to the given event, so that it occupies the position new_pos after execution of this function. Other hooks might be moved up or down in result of this. If new_pos is negative or greater than the number of hooks, the hook is moved to the last position.

If there are several hooks with the given name, only the first one found is moved.

kildclient-2.11.1/doc/C/kildclient/x568.html0000644000175000017500000000554011570176764015332 00000000000000 Proxy

5.4. Proxy

The figure below shows the Proxy section of the Preferences dialog:

Figure 5-4. The Proxy section of the Preferences dialog

In this section you configure the default proxy settings that will apply to Worls that are configured to use the global proxy configuration. It is possible for individual worlds to override the settings configured here, see Section 4.1.

The default setting is No proxy, which means connect directly to the MUD's host. Alternatively, you can use a SOCKS4 or SOCKS5 server. You must provide the proxy server hostname or IP address and the port to connect to. If the proxy requires authentication, supply the credentials in the Username and Password fields.

kildclient-2.11.1/doc/C/kildclient/x3381.html0000644000175000017500000000534111570176767015410 00000000000000 $world->gettimernumber

C.43. $world->gettimernumber

@list = $world->gettimernumber( name );

Returns a list with the number(s) of the timer(s) matching the given name. If no timer with that name is found, returns an empty list. If there are several timers with the same name, returns the numbers of all of them.

The number of a timer is necessary to edit it. However, as the user can change the order of timers, create new ones and delete old timers, a timer's number may change, so you should not store its number; you must fetch the number just before editing it.

kildclient-2.11.1/doc/C/kildclient/x3014.html0000644000175000017500000000456711570176766015411 00000000000000 $world->deltrigger

C.12. $world->deltrigger

$n = $world->deltrigger( number/name );

Deletes the trigger identified by the given number or name. If there are several triggers with the same name, deletes them all. Returns the number of triggers deleted.

kildclient-2.11.1/doc/C/kildclient/x3353.html0000644000175000017500000000451511570176767015411 00000000000000 $world->getmainfont

C.40. $world->getmainfont

$font = $world->getmainfont(void);

This function returns the name of the font used in the main MUD window, that is, where the output of the world appears.

kildclient-2.11.1/doc/C/kildclient/x274.html0000644000175000017500000001625511570176764015331 00000000000000 Display settings

4.2. Display settings

The Display category controls several aspects of the appearance of KildClient. It is divided in sub-categories, which will be described in the following sections.

4.2.1. Main Window

The figure below shows the Main Window section of the World Editor:

Figure 4-2. The Main Window section of the World Editor

This section allows you to configure the main window where the MUD text is shown.

You can set the font that is used for the text that is sent by the MUD. Click on the button with the name of the font to pop-up a dialog from where you can select another font. The change in the font is applied immediately when a new font is selected.

Still with regard to fonds, another option that can be configured in this section is whether to use bold fonts or not to represent text that has the "bold" or "highlight" attribute set. By default, this text is rendered in a lighter color and with a boldface, but you can disable the use of a bold font from this dialog. You can also change the colors used for the highlighted text, see Section 4.2.2.

You can also configure whether to use word wrap or not. If this option is not set, lines will be broken when they do not fit the window, even in the middle of a word. When this option is set, lines will be wrapped between words, so that a word is not broken.

Regardless of that setting, you can indent wrapped lines by some amount. Just specify how many pixels to indent the lines, or leave the value as 0 not to indent them.

By default, lines are wrapped when they do not fit the window. This is the behavior when Wrap lines at full screen width is selected. But it is also possible to wrap lines after a specific number of characters, even if the window is wider than that. To do that, select Maximum line width in characters and enter the maximum number of characters in each line.

The next group configures whether tooltips with the time when a line was received are displayed are enabled or not. If they are enabled, when you leave the mouse for some time over a line an information window is displayed with the time when the line was received.

4.2.2. Colors

The figure below shows the Colors section of the World Editor:

Figure 4-3. The Colors section of the World Editor

In this section you can configure the colors that will be used by KildClient. The ANSI standard defines eight colors, both in the "normal" state and in the "bold" state. These "bold" colors are by default shown with lighter colors, and, optionally, with a bold font also (see Section 4.2.1). Additionally, there are "default" colors for the foreground and background, when no specific color is set.

You can tweak the colors so that they look better in your screen, or redefine them completely. To do that, click in the button with the color, and a dialog will be shown for you to change the color. The changes are applied immediately when a new color is chosen.

Should you want to revert all colors to their built-in preset values, use the Revert to default colors button.

4.2.3. Status Bar

The figure below shows the Status Bar section of the World Editor:

Figure 4-4. The Status Bar section of the World Editor

The first section allows you to change the font used in the status bar. Click the button and a dialog will appear for you to select the font.

The second section controls the display of some time counter that appear in the right of the status bar. You can display the total time connected to this world and/or the idle time, that is, the time elapsed since you last sent a command to the MUD.

For each time, there are three options. Do not display causes that time not to be displayed. Display as hours, minutes and seconds displays the time as something like 2h45m30s, while Display as seconds would display that previous time as 9930s.

The behavior of the idle time counter can also be configured with the Only reset idle time counter when a command is entered checkbox. When the checkbox is unchecked (which is the default), that time is reset whenever a command is sent to the world, no matter if this command was typed, if it ran because of a trigger, a timer, etc. When checked, the timer will only be reset when you enter something in the command entry box and press ENTER. Automatically sent commands will not cause the counter to be reset.

kildclient-2.11.1/doc/C/kildclient/x3332.html0000644000175000017500000000455611570176766015412 00000000000000 $world->getlogfile

C.38. $world->getlogfile

$file = $world->getlogfile(void);

This function returns the name of the file to which the output is being logged, or undef if logging is not started for the world.

kildclient-2.11.1/doc/C/kildclient/x2963.html0000644000175000017500000000430011570176766015406 00000000000000 $world->dc

C.7. $world->dc

void $world->dc(void);

Disconnects from the current world.

kildclient-2.11.1/doc/C/kildclient/x2924.html0000644000175000017500000000546411570176766015417 00000000000000 $world->aliasenabled

C.4. $world->aliasenabled

result = $world->aliasenabled( name/number );

This functions checks whether the specified alias exists and whether it is enabled.

You can pass either a alias number or name. If the alias does not exist, this function returns undef, so you can distinguish the case of a non-existant alias from a disabled one.

If the alias exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several aliases with the same name, it returns a list with one value for each alias with that name, and each value is 0 or 1 depending on the state of the alias.

kildclient-2.11.1/doc/C/kildclient/x3096.html0000644000175000017500000000463011570176766015412 00000000000000 $world->echo

C.19. $world->echo

void $world->echo( str , ... );

Prints the strings in the terminal window. They are not sent to the world.

See also $world->echonl, $world->send.

kildclient-2.11.1/doc/C/kildclient/x626.html0000644000175000017500000000602711570176765015327 00000000000000 Edit Menu

6.2. Edit Menu

6.2.1. Cut

This command copies the text selected in the command entry box to the clipboard and deletes the selected text.

6.2.2. Copy

This command copies text either from the MUD (that is, in the output window) or from the command entry box to the clipboard.

If there is text selected in the main window, than this text is copied. Otherwise, if there is text selected in the command entry box, it is this text that is copied.

6.2.3. Paste

This command pastes the text in the clipboard to the command entry box, possibly overwriting any selected text.

6.2.4. Delete

This command deletes the text selected in the command entry box.

6.2.5. Find and Find Next

These commands are used to search for some text in the output buffer. Their use is described in Section 3.4.

kildclient-2.11.1/doc/C/kildclient/x3867.html0000644000175000017500000000524511570176767015424 00000000000000 $world->movemacro

C.66. $world->movemacro

void $world->movemacro( number/name , new_pos );

Moves the macro with the given name or number so that it occupies the position new_pos after execution of this function. Other macros might be moved up or down in result of this. If new_pos is negative or greater than the number of macros, the macro is moved to the last position.

If there are several macros with the given name, only the first one found is moved.

kildclient-2.11.1/doc/C/kildclient/x3072.html0000644000175000017500000000456711570176766015415 00000000000000 $world->distimer

C.17. $world->distimer

void $world->distimer( number/name , ... );

Disables the timer identified by number or name. If there are several timers with the same name, disables them all. Several arguments can be passed at once.

kildclient-2.11.1/doc/C/kildclient/a2675.html0000644000175000017500000001275011570176766015367 00000000000000 Global Function Reference

Appendix A. Global Function Reference

A.1. colorize

$color = colorize( str );

Replaces color codes (see below) in the string with ANSI escape sequences,so that the string can be echoed in the terminal, for example. Returns the colorized string.

Color code table (based on colors used by the Smaug server):


  &0 (number zero) - Reset all attributes and colors to default
Normal colors:
  &x - Black                     &r - Red
  &g - Green                     &O - Yellow
  &b - Blue                      &p - Magenta
  &c - Cyan                      &w - White
  &d - Default foreground
Bold colors:
  &z - Bold Black                &R - Bold Red
  &G - Bold Green                &Y - Bold Yellow
  &B - Bold Blue                 &P - Bold Magenta
  &C - Bold Cyan                 &W - Bold White
  &D - Default bold foreground
Background colors:
  ^x - Black                     ^r - Red
  ^g - Green                     ^O - Yellow
  ^b - Blue                      ^p - Magenta
  ^c - Cyan                      ^w - White
  ^d - Default background
Light background colors (sometimes causes blinking):
  ^z - Light Black               ^R - Light Red
  ^G - Light Green               ^Y - Light Yellow
  ^B - Light Blue                ^P - Light Magenta
  ^C - Light Cyan                ^W - Light White
  ^D - Default light background
Attributes: (may not work on other clients)
  &_ - Underline on              ^_ - All underline off
  &= - Double underline on
  &| - Strikethrough on          ^| - Strikethrough off
  &/ - Italics on                ^/ - Italics off
  &i - Inverse video on          ^i - Inverse video off
  &h - Hidden mode on            ^h - Hidden mode off

Note: if you want to set both the foreground and the background, the code for the foreground should come first. If you want to set the foreground and/or background and one or more attributes (underline, italics, etc), the attribute settings should come after the color.

Note : to insert a & or ^ character, use && and ^^, respectively.

You can also also use colorize() to display text in any color of a 6x6x6 RGB color cube. To do so, use &rgbX and ^rgbX to set the foreground and background, respectively. r, g, and b are integers between 0 and 5 representing the amount of red, green and blue. X is really the letter X, it is used to close the code.

Finally, to select one of the 24 shades of gray available, use &nG and ^nG for the foreground and background, respectively, where n is an integer from 0 to 23, and G is really the letter G.

You can use the kc256 (see Section 13.3.4) plugin to display all the colors for you to choose from.

kildclient-2.11.1/doc/C/kildclient/x3392.html0000644000175000017500000000533211570176767015412 00000000000000 $world->gettriggernumber

C.44. $world->gettriggernumber

@list = $world->gettriggernumber( name );

Returns a list with the number(s) of the trigger(s) matching the given name. If no trigger with that name is found, returns an empty list. If there are several triggers with the same name, returns the numbers of all of them.

The number of a trigger is necessary to edit it. However, as the user can change the order of triggers, create new ones and delete old triggers, a trigger's number may change, so you should not store its number; you must fetch the number just before editing it.

kildclient-2.11.1/doc/C/kildclient/c2364.html0000644000175000017500000001426111570176766015363 00000000000000 Using the Chat

Chapter 15. Using the Chat

KildClient supports peer to peer chat (that is, you talk directly to the other person, and not via a server, be it a MUD server or a chat server), which allows you to talk to other users of KildClient or other clients that support the MudMaster or zChat protocols (both are supported by KildClient).

There are several advantages of chatting directly with the other person:

  • You can chat even if the MUD is down, since the MUD server is not involved.

  • Since the chat is direct, it cannot be snooped by immortals or administrators.

  • The chat is independent from the MUD, so you can chat even if you in a situation in which it would not be possible to talk through the MUD.

The chat also supports other features that are not possible through a MUD, such as snooping a session, that is, seeing everything the other player sees in the screen (if they allow you to do so, of course), or sending everything you see to your chat party (if you allow that, of course), or transfering files.

These features do not pose a security risk, because they can be disabled and the other person can only see your output if you allow it, and they can only send files if you allow them to.

15.1. Basic Usage

The chat plugin requires the Gtk2 Perl bindings, and also the Perl bindings for the vte library. If you cannot load the plugin and it complains about not finding these bindings, go to http://gtk2-perl.sourceforge.net/ and download them.

To load the plugin, enter /$world->loadplugin('chat') in the command entry box. You should see Plugin loaded. If an error happened, you probably do not have the bindings mentioned in the above paragraph.

If you want to have the plugin always loaded, you can put that line (without the slash in the beginning) to your script file, and the plugin will loaded whenever you open a World.

Now that the plugin is loaded, you have two options: calling somebody or accepting calls from other persons.

The first thing you should do is set you chat nickname. To do that, type /chat::setname("nickname"). You only need to do this once, as the chat name will be saved and restored when you open the World again.

To accept calls, enter /chat::accept in the command entry box. Other people can now call you. You will need to give them your IP address. Calls are being waited on port 4050, which is the default port for the chat protocols. If you want to listen for connections in another port, just pass that port number as argument, for example, /chat::accept(5000). Be sure to inform other people the port you are using.

When somebody wants to chat to you, a dialog box will appear asking if you want to accept the chat. If you want to chat with them, select Yes to establish the chat connection, otherwise click No to deny the chat request.

To call somebody, use the call function: enter /chat::call("host"). host is the hostname or IP address of the person you wish to chat with. This command tries connecting to port 4050, if they are using another port, pass that port number as a second argument to the function.

You can substitute call for zcall. The later tries using the zChat protocol instead of the default MudMaster protocol. Use the zcall function if you know they support the zChat protocol.

If the other person accepts the chat, the connection will be established.

Each chat connection has its own window where the text received is displayed, and with an entry box where you can type messages that are sent to the other person. To send something, just enter the message and press ENTER.

There are some special commands that can be entered in chat windows, these will be described in the next session.

kildclient-2.11.1/doc/C/kildclient/x3140.html0000644000175000017500000000456211570176766015404 00000000000000 $world->enaalias

C.22. $world->enaalias

void $world->enaalias( number/name , ... );

Enables the alias identified by number or name. If there are several aliases with the same name, enables them all. Several arguments can be passed at once.

kildclient-2.11.1/doc/C/kildclient/x2268.html0000644000175000017500000001554611570176765015421 00000000000000 Standard Plugins

13.3. Standard Plugins

KildClient comes with a few plugins as part of its distribution. These plugins will be described here. You can load these plugins as described above.

13.3.1. easypath

This plugin makes the use of paths (see Section 7.2.1) easier. When this plugin is loaded, you can type #2n3e{sw} instead of /$world->path("2n3e{sw}").

13.3.2. keypad

This plugin allows use of the keypad for movement. Pressing the left arrow of the numeric keypad moves to the east, pressing the up arrow moves to the north, and so on.

A few other keys of the keypad are also bound: - and + represent down and up, respectively. 5 sends who, 0 sends look, / sends inventory and * sends score.

The Num Lock key must be off for this plugin to work.

13.3.3. notes

This plugin allows you to assign notes to World. The notes are saved with the World and are restored when it is opened again. You can write anything you want, probably it will be something you want to remember for that World.

This plugin requires the gtk2-perl bindings, because it has a graphical user interface.

Type /notes::edit to open a window where you can edit the notes. When you are finished, press the Close button. The notes are saved automatically.

Use the notes::clear function to clear the whole contents of the notes.

It is also possible to append something to the notes with notes::append('text'). This is probably more useful in scripts.

13.3.4. kc256

This plugin demonstrates a useful extension to the 16 ansi colors that KildClient supports. This is the same 256-color extension supported by xterm (if it is complied with support for that).

With this extension, you can specify any color in a 6x6x6 RGB color cube, that is, you have 216 rgb colors at your disposal, plus 24 shades of gray. (The remaining 16 colors are the standard ansi colors.)

There are two functions in this plugin:

kc256::showcolors: Displays all 216 available RGB colors and the 24 shades of grey in nice tables, with the values that you can use in colorize to access them.

kc256::rainbowtext($string): Just a demonstration on how (not to) use the colors. Displays $string, one character in a different color.

13.3.5. channels

Channels is a simple plugin to yank lines out of the world window and put then in other windows. It's most obvious use is chat channels, which usually have something like "[NAME]" at the beginning.

Once the plugin is loaded, there is only one function to call:

channels::new("name", "regex");

where "name" is the name that should appear in the title bar of the new window, and "regex" is the pattern to match for text.

Use channels::list() for a list of currently defined channels. To remove a channel, use channel::del(num), where num is the number of the channel.

13.3.6. Other Plugins

The KCWin plugin allows you to create general purpose windows a terminal for output and an entry box for input. These windows do nothing by themselves, but they can be used by other plugins when they need a window for input and output.

Since this plugin is just a helper for other plugins, it is not described here, but rather in Appendix D.

The chat plugin allows peer to peer chat with other users of KildClient and of other clients that support the MudMaster or zChat protocols. It is described in its own chapter, Chapter 15.

kildclient-2.11.1/doc/C/kildclient/x4439.html0000644000175000017500000001330211570176770015403 00000000000000 Using GTK+ From Plugins

E.6. Using GTK+ From Plugins

With the use of the gtk2-perl bindings, it is possible to use the full power of the GTK+ library in KildClient plugins. This allows you to create dialogs, windows, message boxes, and anything else your plugin needs.

Using gtk2-perl in a KildClient plugin is straightforward, there is just a couple of points to be observed. Import the Perl modules as usual, generally with a line like this: "use Gtk2 -init;". Create windows and display them as usual. The biggest difference is that you must not call Gtk2->main. Since KildClient is a GTK+ application, it already runs a main loop, and starting another one would lock KildClient and make it unresponsive. Also, you must never call Gtk2->main_quit, because that would cause KildClient to quit. Even tough the world would be saved, the user certainly wouldn't want that.

All features of GTK+ are supported, as are all of gtk2-modules (this includes modules for the base libraries Glid and GDK, and also for other libraries such as the Gnome ones). Notably, Gtk2::Builder (and the older Gtk2::GladeXML) are supported, which allows you to create complex user interfaces visually and load them from the .glade file in the plugin.

Note that having the gtk2-perl bindings is not necessary to run KildClient. If they are not present, however, it will not be possible to run plugins that use it, naturally. The plugins will not be loaded because an error will be generated when the modules are loaded (in the "use Gtk2 -init;" line).

The example below shows a very simple (and not very useful) plugin using gtk2-perl. It should show how simple it is to use the gtk2-perl bindings in KildClient plugin.

Example E-4. A plugin that uses gtk2-perl


package gtksample;
#: Version: 1.0.0
#: Description: A Plugin Using gtk2-perl
#: Author: Eduardo M Kalinowski

use Gtk2 -init;

# Is the window being displayed?
our $window_displayed = 0;

# Widgets
our $window;
our $entry;
our $button;

sub help {
  $::world->echonl("This plugins demonstrates the use of gtk2-perl under KildClient.",
                   "It does nothing really useful.",
                   "",
                   "Enter /gtksample::run to try it.");
}


sub run {
  return if $window_displayed;

  $window = Gtk2::Window->new();
  $window->set_title("gtk2-perl test");
  $window->signal_connect(delete_event => sub {
                            $window_displayed = 0;
                            return 0;
                          });

  my $vbox = Gtk2::VBox->new(0, 8);

  $entry = Gtk2::Entry->new();
  $entry->set_text("Type something here");
  $vbox->pack_start($entry, 0, 1, 0);

  $button = Gtk2::Button->new("And click me");
  $button->signal_connect(clicked => \&on_button_clicked);
  $vbox->pack_start($button, 0, 1, 0);

  $window->add($vbox);

  $window->show_all();
  $window_displayed = 1;
}


sub on_button_clicked {
  $button->set_label($entry->get_text());
}


sub UNLOAD {
  $window->destroy if $window_displayed;
}

Notice how it defines a UNLOAD function that destroys the window if it is being displayed. Plugins that open windows almost always need such a function to delete the windows that are still open when the World is closed. If these windows are not closed, the program will most likely crash if the user tries to use them after the Worlds has been closed, so make sure they get deleted.

For more information on gtk2-perl, see http://gtk2-perl.sourceforge.net/.

kildclient-2.11.1/doc/C/kildclient/x4403.html0000644000175000017500000000677211570176767015415 00000000000000 Enabling and Disabling Plugins

E.4. Enabling and Disabling Plugins

As described in Chapter 13, the user can enable or disable plugins. By default, disabling a plugin means disabling all its triggers, macros, aliases, hooks and timers, and enabling a plugin means enabling all the above items.

Most of the times that is enough, but for some plugins this naive approach may not be appropriate. One such case is when a plugin has some triggers (or any other kind of item) that is not necessarily always enabled, and whose status is set by some other means.

In these cases, you can define two functions named ENABLE and DISABLE. These will be called when the plugin is being enabled and disabled, respectively, and you can do whatever is necessary in there.

If these functions are defined, then the standard behaviour (enabling or disabling all items) is not done, and you must do whatever is necessary by yourself. Also, no message is printed, so you might want to print some informative message.

The functions should return a true value to indicate success. If for some reason the operation could not be done and the status should not be changed, return a false value and the status of the plugin will not be altered. But use this feature with care.

If the functions are not defined, then the default behavior described above is used. So if your plugin doesn't have special needs, you do not need to define these functions.

kildclient-2.11.1/doc/C/kildclient/x2937.html0000644000175000017500000000543711570176766015423 00000000000000 $world->commandecho

C.5. $world->commandecho

void $world->commandecho( boolean );

$status = $world->commandecho(void);

When used with an argument, this sets the command echo option for the current world to the given value (which should be false to cause commands not to be echoed or true to cause them to be echoed). For more details of the command echo option, see Section 4.7

If called without arguments, it doesn't change the status of that option, but returns its current value.

kildclient-2.11.1/doc/C/kildclient/x168.html0000644000175000017500000001231711570176764015326 00000000000000 Reviewing and Searching Text

3.4. Reviewing and Searching Text

Figure 3-3. A typical KildClient session with two open Worlds

The main box that shows the output of the MUD keeps by default the last 2000 lines received (but this number can be changed, see Section 4.7). You can recall the previous lines with the scrollbar or with the page up and page down keys.

You can split the main window in two parts. This way, you can use the bottom part to display text as it arrives from the MUD, and use the top one to review something that was received before. To do that, select the Display->Split Window menu. To adjust the size of the windows, drag the bar that separates them. Alternatively, you can drag directly the separation bar that appears just below the tabs with the open worlds.

You can search the text saved in the buffer for occurrences of a given word. To do that, use the Edit->Find menu.

When you select that menu, a bar appears above the command entry box. Search is done through that bar. To start searching, type the text you want to find in the entry box in the search bar. Searching in KildClient is done incrementally, that is, as soon as you type the first character, search starts (displaying the first occurrence of that character). As you continue typing, searching continues, always looking for occurrences of the text that you have typed. If you are looking for a word, often you don't even need to type the whole word, only the beginning is enough.

If the window is split, then the bottom window is not changed and keeps displaying the same part, and the matches are displayed in the top part.

If you've found an occurrence of the text, but it is not the one you intended, use the Find Next button beside the entry box to find the next occurrence. (You can also use the Edit->Find Next menu.) Pressing the Enter key when in the input box also activates the Find Next feature.

If the text you typed is not found, or if there are no more occurrences of it when you press Find Next, Not Found will be displayed in the search bar. In this case, you can erase some characters and try again (if you made a mistake), or reset the search and start again, as described below.

To reset a search so that you can start again, either erase all the text in the search box, or select Edit->Find from the menu again (which will also clear the entry box). When you do that, searching will start again at the top of the buffer.

After you're done searching, click the small button with an X in the left of the search bar to close the search bar. You can also press Esc in the input box.

kildclient-2.11.1/doc/C/kildclient/x1372.html0000644000175000017500000000751311570176765015407 00000000000000 Testing Triggers

8.8. Testing Triggers

You can test your triggers to see how they would react to text coming from the MUD. To do so, select the Input->Test Triggers menu item, or press the Test Triggers button from the Trigger section of the World Editor.

You will see a dialog like this:

Figure 8-4. The test triggers window

In the first entry box, enter some text to be matched against the triggers that are defined. This line will be matched as if it came from the MUD. Then press the Send button to try the triggers. Matching is done exactly for lines that come from the server: only enabled triggers are tried, rewriter triggers are tried first and change the line, the keep executing flag is verified, and so on.

After pressing Send, the results are shown in the second half of the window. The number of triggers that matched is displayed, and also all the commands that would be processed if that line came from the mud (if any). The line that would be printed to the main window is also displayed. If any gag trigger matched, that box will be empty indicating that no line will be printed. If no gag triggers matched, the line could be different because a rewriter trigger changed it. However, in most cases the line printed will be the same as the line received. Finally, you are told if the line would be written in the log file. If any gag log trigger matched the line, then it would be omitted.

You can try the triggers against other lines, just enter them and press Send. Any changes you make to the triggers are used instantly, just press Send again to try the same line against the new or changed triggers.

kildclient-2.11.1/doc/C/kildclient/x842.html0000644000175000017500000001260311570176765015324 00000000000000 Saving Variables Permanently

7.4. Saving Variables Permanently

You can define variables for use in your Perl scripts. Since KildClient has a full-featured Perl interpreter, you can use all kinds of variables Perl supports (scalars, arrays, hashes, and even references to build complex data structures), and you use them just like you would in Perl.

However, when you close the World, the variables and their values are lost. However, it is often desirable to keep the values of variables across sessions, and KildClient has a mechanism for that.

A variable can be made permanent. All variables that are marked as permanent will be saved when you close the World, and will be reloaded from the saved values when the World is opened again later. This way, their values are saved across sessions.

To make a variable permanent, open the World Editor (see Chapter 4) and select the Variables section inside Automation.

There you will see a list of the variables that are set to be permanent:

Figure 7-1. Permanent Variables

To add a variable, click the Add button. A window will open for you to enter the name of the variable.

To make one or more variables temporary again, select them and press Delete. They will be removed from the list.

Finally, if you mispell the name of a variable, select it and press Edit to correct it.

You can also change the order of the variables with the Up and Down buttons. This is usefor for grouping similar variables together, but does not otherwise affect the saving of the variables.

7.4.1. Permanent Variables in the Command Line

It is possible to make a variable permanent from the command line. To do that, use the $world->makepermanent function, passing the name of the variable as the argument. Note that since you must pass the name of the variable, you must use quotes, and preferably single quotes so that the variable does not get interpolated. For example, to make the variable $kill_count permanent, run $world->makepermanent('$kill_count'). Now when you close the World, the value of $kill_count will be saved, and when you reopen it later, the value will be restored.

It is possible to make more than one variable permanent at one time, just pass all their names as arguments to $world->makepermanent.

If you want a variable to stop being permanent (that is, to become temporary again), use the $world->maketemporary function. It is called just like makepermanent, and has the opposite effect.

To get a list of the variables that are currently permanent, use the function $world->listpermanent. This function has no arguments, and prints all the names of the variables that are permanent.

kildclient-2.11.1/doc/C/kildclient/x3735.html0000644000175000017500000000526011570176767015413 00000000000000 $world->movetimer

C.60. $world->movetimer

void $world->movetimer( number/name , new_pos );

Moves the timer with the given name or number so that it occupies the position new_pos after execution of this function. Other timers might be moved up or down in result of this. If new_pos is negative or greater than the number of timers, the timer is moved to the last position.

If there are several timers with the given name, only the first one found is moved.

kildclient-2.11.1/doc/C/kildclient/x3947.html0000644000175000017500000000576511570176767015432 00000000000000 $world->requireplugin

C.72. $world->requireplugin

$success = $world->requireplugin( name );

This function is similar to $world->loadplugin, but first checks if the plugin is already loaded. If it is, it returns successfully. If not, it tries loading the plugin (silently). If this succeeds, the function returns successfully, if not, it die()'s. This function is useful in plugins that require other plugins, and is meant to be called in a BEGIN block of a plugin that requires another.

The argument passed must be the name of the plugin (a path to the file is not allowed, unlike with $world->loadplugin. See $world->loadplugin for information on how plugins are found.

kildclient-2.11.1/doc/C/kildclient/x700.html0000644000175000017500000000654011570176765015320 00000000000000 Preferences Menu

6.4. Preferences Menu

6.4.1. Disable Triggers, Aliases, Macros or Timers

If each of these menu entries is checked, then the corresponding automation feature is disabled: lines are not matched against triggers, aliases do not replace typed commands, macros and timers do not run. Use them if you want to temporarily disable all of them, since the triggers, aliases, macros or timers are not deleted.

6.4.2. Debug Matches

If this entry is selected, whenever a trigger or alias matches, information is printed about it. The information is printed on stdout, which means you must start KildClient from a terminal.

6.4.3. Preferences

This command opens a dialog where you can configure some aspects of KildClient global to all Worlds. See Chapter 5.

6.4.4. Edit Default World

This command opens a dialog where you can set some default parameters used for Worlds. For example, you can define your preferred font or colors, and all new Worlds will use these default font and colors.

The things that can be set are described in Chapter 4, but not all things described there can be set as default parameters. (There's no sense in having a default World name, for example.)

kildclient-2.11.1/doc/C/kildclient/x1497.html0000644000175000017500000001574011570176765015420 00000000000000 Using Aliases

9.2. Using Aliases

In Chapter 9 an alias that replaces dt with drink from fountain was described. To create this alias, enter the following parameters, leaving the other options unchanged from the default values:

Example 9-1. A simple alias

  • Pattern: ^df$

  • Substitution: drink from fountain

You might be wondering why we use "^df$" and not only "df". Remember that aliases are just substitutions, and the pattern is a regular expression. If the anchors (that is, ^ and $) were not present, it would match against df anywhere in the line, and substitute this df even in the middle of words. wonder would become wodrink from fountainder. At times a behaviour like this (substituting anywhere) might be desirable, but in our case we want it to substitute only the whole command df, so we use the anchors.

As an example of an alias that does not match only the exact command, consider this one:

Example 9-2. A slightly more complex alias

  • Pattern: '^gra ' (without the quotes, but note the space after the word)

  • Substitution: 'chat CONGRATULATIONS, ' (without the quotes, but note the space after the word)

Whenever you enter a command that starts with gra followed by a space, that part (gra and the space) is replaced by the given pattern. So if you enter gra Bob, what will be sent to the MUD is chat CONGRATULATIONS, Bob.

Since aliases are just a substitution, you can define bracketed expressions in the pattern and then use $1, $2, and so on in the substitution. Let us increment the above example to add something to the end. We will need a bracketed expression:

Example 9-3. An alias that uses bracketed expressions

  • Pattern: ^gra (.*)$

  • Substitution: chat CONGRATULATIONS, $1!!!

It should be easy to understand. $1 in the substituion is replaced by what goes after gra.

9.2.1. Advanced Features

As mentioned in Section 9.1.1, aliases can use a s//e construct, that is, whose substitution is actually composed of Perl statements evaluated when a match is found.

To use that feature, select the Eval substitution as Perl statement option:

Example 9-4. An alias whose substitution is evaluated:

  • Pattern: calc\((.*)\)

  • Substitution: eval "$1"

  • Eval substitution as Perl statement: checked

The alias allows you to write something like that: gossip 2+3 = calc(2+3) and have the result of the calculation sent to the MUD. (Or any other Perl statement to be evaluated, actually.)

By default, case is considered when matching. If you want case-insensitive matching, select Ignore case when matching.

9.2.2. Using Perl in Aliases

It is possible to make an alias whose action is not to send a changed command line, but to execute an action.

To do that, make the replacement start with /, which means that the rest of the line will be executed, and not sent to the mud. In the rest of the line, you can put arbitrary Perl code. However, if you want to refer to a variable, you must escape the $ prefix by writing it as \$. This way, when the substitution is run, you get the name of the variable, not the value this variable currently has.

As an example, if you define an alias with pattern ^say (.*)$ and action /\$world-\>echonl("$1"), whenever you type a line that starts with say in the input box, the rest of the line will be echoed in the screen, but not sent to the mud.

kildclient-2.11.1/doc/C/kildclient/x3200.html0000644000175000017500000000461111570176766015374 00000000000000 $world->enatrigger

C.27. $world->enatrigger

void $world->enatrigger( number/name , ... );

Enables the trigger identified by number or name. If there are several triggers with the same name, enables them all. Several arguments can be passed at once.

kildclient-2.11.1/doc/C/kildclient/x480.html0000644000175000017500000001327311570176764015325 00000000000000 Advanced

4.8. Advanced

The figure below shows the Advanced section of the World Editor:

Figure 4-10. The Advanced section of the World Editor

In most cases, you will not need to change any of the settings of this section.

The File text box specifies the file where the World is saved. It is not necessary to enter anything here, a file name will be generated automatically if you leave it blank. If you enter a file name, it will override the default name. This means that you can create a copy of a World by editing it, giving a new file name, and then saving.

Note, however, that for the World to be recognized and listed in the World Selector, it must have the .wrl extension, and must be in the directory where KildClient stores its files (~/.kildclient under Linux and other UNIX-like systems).

Another thing that can be configured in this section is the character set used by KildClient. If you do not know what is that, then simply ignore it and do not change anything. If you do know, just select the character set that is used by the MUD from the combo box. However, keep in mind that internally KildClient works with the UTF-8 character set. The only things that are changed by the selection you can make in this section are what is output by the MUD and what is sent to the MUD.

You can configure some aspects of the editors for triggers, aliases, macros, timers and hooks (all displayed in the World Editor).

You disable the confirmation dialogs that appear when you try to delete a trigger, alias, macro, etc. from one of the graphical editors. If you disable the Ask for confirmation before deleting triggers, aliases, etc. there will not be a confirmation dialog and the item will be deleted immediately. Be warned that if this is unchecked and some item is deleted, you will need to create it again if you delete it by mistake.

You can also show triggers and other objects defined by plugins that are currently loaded. By default they are not shown, but you can change this cheking the Show items defined by plugins checkbox.

Note, however, that while having that option checked will allow you to edit, delete and reorder the items defined by plugins, these changes will not be made in the plugin file, and the next time the plugin is loaded, the items will be as they were before. You can use the editors to make changes and tests, but you will need to alter the plugin file afterwards.

Another configuration option in this screen is whether the TCP Keep Alive setting is enabled for the connection established to the World. TCP Keep Alive is a feature of the TCP protocol that causes packets to be sent to keep the connection alive if no data is transferred for a period of time. By default it is disabled, but if you need this you can enable it here.

The time that the connection must be idle before a Keep Alive packet is sent is set by your operating system. KildClient only enables the "Use Keep Alive" flag in the socket used for communication, but does not try to set the parameters involved in this operation. The way to set the intervals depends on the operating system.

Finally, it is possible to disable the use of the up and down arrow keys to navigate between commands saved in the command history. If the box is checked, then you will need to use Alt+up and Alt+down to navigate. The arrow keys will retain their normal behaviour. This option may be necessary when using some input methods that use the arrow keys as part of the input process.

kildclient-2.11.1/doc/C/kildclient/x3111.html0000644000175000017500000000466611570176766015407 00000000000000 $world->echonl

C.20. $world->echonl

void $world->echonl( str , ... );

Prints the strings in the terminal window, each followed by a newline. They are not sent to the world.

See also $world->echo, $world->send.

kildclient-2.11.1/doc/C/kildclient/x2780.html0000644000175000017500000000431011570176766015404 00000000000000 stripansi

A.8. stripansi

$stripped = stripansi( str );

Returns the string stripped of any ANSI sequences that it had.

kildclient-2.11.1/doc/C/kildclient/x3907.html0000644000175000017500000000602511570176767015414 00000000000000 $world->path

C.69. $world->path

void $world->path( str );

str is a string defining a path. The following example shows the features of paths:


  3n2e4n2e{ne}e{open door}3n

The general syntax syntax is "<number of repetitions><command>". "<number of repetitions>" can be omitted, in this case it is considered as 1. command is the command that will be repeated. If it is not a one-letter command, it should be enclosed in braces ({}).

The example above would generate these commands:


  n
  n
  n
  e
  e
  n
  n
  n
  n
  e
  e
  ne
  e
  open door
  n
  n
  n

The commands are send using the settings in the Sending tab of the Preferences dialog (see Section 5.2).

kildclient-2.11.1/doc/C/kildclient/x3036.html0000644000175000017500000000463011570176766015404 00000000000000 $world->dishook

C.14. $world->dishook

void $world->dishook( event , number/name , ... );

Disables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, disables them all. Several arguments can be passed at once.

kildclient-2.11.1/doc/C/kildclient/c2341.html0000644000175000017500000000751611570176766015363 00000000000000 Logging the Output

Chapter 14. Logging the Output

Logging can be configured in the World Editor, see Section 4.4, but there are also functions to start and stop logging from the command line.

Logging is controlled with the $world->logfile function. The first argument specifies the path to the file where the output is saved. If the file already exists, new text will be appended to it.

The file name is passed throught strftime(), so you can log to different files depending on the date and/or time. Also, you can use %Kw in the file name and it will be replaced by the name of the World. And the string %Kc is replaced by the name of the character used in auto-login (see Section 4.1). (If auto-login was not used, then %Kc is replaced by an empty string.)

The second argument, if present, controls the format of the timestamp. If you do not want a timestamp, then do not pass a second argument, pass only the file name. This timestamp argument is a string with control codes. Each control code will be substituted by a part of the time or date. This sequences are the ones of the strftime() C function, so see its man page for the list of control sequences.

Here's an example that turns on logging, with a timestamp that shows the date and time:

Example 14-1. Enabling logging


$world->logfile('/home/bob/mud/mudlog.txt', '%b/%d %H:%M:%S> ')

To turn off logging, just call logfile with no arguments.

There are functions to write arbitrary text to the log file: $world->writetolog and $world->echonlandlog.

kildclient-2.11.1/doc/C/kildclient/a4360.html0000644000175000017500000001062611570176770015353 00000000000000 Writing Plugins

Appendix E. Writing Plugins

This appendix will describe how you can write your own plugins for KildClient. It will describe the format of the plugin file, what it should have, and some guidelines that all plugins should follow.

The first thing to decide when writing a plugin is the name. Since each plugin defines a Perl package, the name should be a valid name for a Perl package. Moreover, it is a good practice to name the plugin file with the name of the plugin (although the name of the file could be different), so stick with letters, numbers, and the underscore. It should not start with an underscore, however, because all identifiers that start with an underscore are understood to be interal of KildClient.

E.1. The File Format

The plugin file is just a Perl file that is read and run by KildClient when the plugin is loaded. This file can call KildClient's functions to add triggers, aliases, macros or timers, to set permanent variables, etc. It usually also defines new subroutines for use in the triggers, etc, or to be called directly by the user.

However, the plugin file must with a header, which has a fixed format. If the header is not in this format, the plugin will not be recognized. The header is shown in Figure E-1.

Figure E-1. The Plugin Header


package NAME;
#: Version: VERSION
#: Description: ONE LINE DESCRIPTION
#: Author: AUTHOR'S NAME (OPTIONAL)

The first line defines the plugin's name, which will be used to refer to it later. It also starts a Perl package. All plugins define a package, so that one plugin's functions do not interfere with other plugin's ones.

The second line specifies the plugin's version. This is most informative, but is also used by KildClient to ensure that only one version of the plugin is loaded.

Next, there comes a short one-line description of the plugin. It should be brief but descriptive, and it is shown in the output of the $world->listplugin function.

Finally, it is possible to inform the author of the plugin. This line, however, is not required, but the author's name will appear in the plugin listing if it is informed.

After that, comes the plugin code. This is just Perl code, executed by KildClient when the plugin is loaded (with do).

kildclient-2.11.1/doc/C/kildclient/x3300.html0000644000175000017500000000465411570176766015404 00000000000000 $world->getkeycode

C.36. $world->getkeycode

$keycode = $world->getkeycode(void);

After running this function, press a key (or a combination of keys). The keycode (to be used in the $world->macro function) will be returned and also printed in the screen.

kildclient-2.11.1/doc/C/kildclient/a4270.html0000644000175000017500000001377211570176767015366 00000000000000 Using KCWin for Input/Output Windows

Appendix D. Using KCWin for Input/Output Windows

KCWin is a standard plugin distributed with KildClient that allows you to create windows with a terminal for output and an entry box for input. These windows do nothing by themselves, but they can be used by other plugins when they need a window for input and output. The output area supports ANSI colors and thus is like a mini MUD window.

This plugin requires the gtk2-perl bindings. It will fail to run if these bindings are not found.

This plugin is more often used as a helper for other plugins. A plugin that uses KCWin should use $::world->requireplugin('KCWin') in a BEGIN block, as described in Section E.5.1.

Use KCWin->new to create a new window. KCWin derives from Gtk2::Window so you can use all of its methods.

The widgets are accessible for customization. If $kcw is a KCWin, the following widgets are available:

  • $kcw->{VBOX}, Gtk2::VBox, the vertical box that contains the output and input areas.

  • $kcw->{SCROLLWIN}, Gtk2::ScrolledWindowGtk2::ScrolledWindow, this holds the TextView that is used for output.

  • $kcw->{TEXTVIEW}, Gtk2::TextView, is the widget used for output.

  • $kcw->{TEXTBUFFER}, Gtk2::TextBuffer, for convenience, the TextBuffer displayed in the window.

  • $kcw->{CMDAREA}, Gtk2::HBox, a box that holds a button to clear the input area, and the input area itself.

  • $kcw->{BTNCLEAR}, Gtk2::Button, a button that clears the input entry widget when clicked.

  • $kcw->{ENTRY}, Gtk2::Entry, the input entry widget. Connect to the activate signal of this widget to do something when the user presses ENTER in this widget.

The widgets can be used, and the window can be customized (by adding other widgets, for example). Some common actions have functions in KCWin as a shortcut. These functions will be described in the following sections.

D.1. Changes from Previous Versions

KCWin version 1.x used a Gnome2::Vte::Terminal for output (the same widget that was used in the main KildClient window). KCWin version 2.x (which comes with KildClient 2.x) has changed that in favour of a Gtk2::TextView (to match a change in the main KildClient program).

If you never used the KCWin->{VTE} variable directly, you will not need to change anything in your plugins that use KCWin. If you did, you will probably have to change some things. The new Gtk2::TextView widget is accessible via KCWin->{TEXTVIEW}, as described above.

Another feature that has been added is a Clear button just like in the MUD windows, which clears the entry widget. However, most plugins should not need to do anything to adapt themselves to that.

Finally, because of the changes, some more widgets are present in the window, and accessible via elements of the hash that holds a KCWin. These widgets are responsible for the layout of the window.

kildclient-2.11.1/doc/C/kildclient/x2841.html0000644000175000017500000000455411570176766015414 00000000000000 seturgencyhint

B.4. seturgencyhint

void $window->seturgencyhint( boolean );

Sets the value of the window's "urgency" flag to true or false. This is a request for attention to the window, and usually will make the window title flash. However note that the actual behavior depends on the window manager used.

kildclient-2.11.1/doc/C/kildclient/c2196.html0000644000175000017500000001644311570176765015371 00000000000000 Plugins

Chapter 13. Plugins

Plugins extend the functionality of KildClient. They add more features that make the client even more powerful.

Basically, plugins can define triggers, aliases, macros and timers and/or new functions. Whenever the plugin is loaded, the new functionality is available.

You can work with plugins from the World Editor (see Chapter 4). Open the World Editor, and select the Plugins section inside Automation. You will see a screen like this:

Figure 13-1. The Plugin list

There are two lists in the window: one lists the plugins that are currently loaded and that can be used. The other lists the plugins in the startup list, which are plugins that are loaded automatically for you whenever you connect to the World.

To load a plugin, press the Load button. A dialog will be opened for you to select the file. Select the file and press Open. The plugin will be loaded and will appear in the list. Or, if there was a problem and the plugin could not be loaded, the reason will be given in a message box.

While selecting the file, you have the option to specify that the plugin is to be loaded always at startup (that is, when you connect to the World). If you select that option, the plugin will also be added to the other list.

You can get help for a loaded plugin by selecting its line and pressing the Help button. Some help describing how to use the plugin will be shown in the main World window.

You can disable a plugin that is loaded. When a plugin is disabled, it is turned off temporarily. To disable a plugin, select its line in the list of loaded plugins and click the check box in the Enabled column. To enable it back, click in the check box again.

To add a plugin that is to be loaded always at startup (without loading it now, or if it is already loaded), press the Add button after the list of the startup plugins. A dialog box will open for you to select the file, and if that file could be loaded, the plugin will be added to the list.

To remove a plugin so that it is not loaded anymore at startup, select its line and press Remove. And to change the order that the plugins are loaded, select the line and use the Up and Down buttons to move the plugin.

13.1. Loading Plugins from the Command Line

It is also possible to load plugins directly from the command line, for those more comfortable with it and with Perl.

To load a plugin, the $world->loadplugin function is used. It must be called with one argument, which can be either the full path to the file that defines the plugin, or just the plugin name. But for this to work, the file must be installed in one of the directories that KildClient looks for plugins. By default, two locations are searched for: one is the plugins directory under KildClient's directory in your HOME path (that is, ~/.kildclient/plugins in UNIX systems). The other is the plugins directory under the directory where KildClient stores some of its files (generally it is something like /usr/local/share/kildclient/plugins).

For example, here is how to load the keypad plugin (which is a standard plugin distributed with KildClient):

Example 13-1. Loading a plugin


$world->loadplugin('keypad')

As an additional example, the code below loads a plugin specifying its full filename:

Example 13-2. Loading a plugin specifying the full filename


$world->loadplugin('/home/joe/kildclient-plugins/attackplugin.pl')

Either way, you should see a message saying that the plugin has been loaded. It is now already working. If the plugin was already loaded, loading will fail.

To always load the plugin when you connect to the World, either use the World Editor as described above, or add the line that loads it to your script file. See Section 4.5.1.

13.1.1. Enabling and Disabling Plugins

If you want to turn off a plugin temporarily, you can disable it. Later, when you want it to work again, just reenable it.

To disable a plugin, use the $world->displugin function, passing as argument the name of the plugin. What this function does is disable the plugin's triggers, aliases, macros and timers. You can still call the plugin functions directly.

To enable a plugin again, use the $world->enaplugin function, passing as argument the name of the plugin.

kildclient-2.11.1/doc/C/kildclient/x3580.html0000644000175000017500000000474211570176767015415 00000000000000 $world->listplugin

C.53. $world->listplugin

void $world->listplugin(void);

Briefly lists all loaded plugins.

void $world->listplugin( name/number );

Gives detailed information on the given plugin.

kildclient-2.11.1/doc/C/kildclient/x2994.html0000644000175000017500000000453711570176766015426 00000000000000 $world->delmacro

C.10. $world->delmacro

$n = $world->delmacro( number/name );

Deletes the macro identified by the given number or name. If there are several macros with the same name, deletes them all. Returns the number of macros deleted.

kildclient-2.11.1/doc/C/kildclient/x536.html0000644000175000017500000000546111570176764015327 00000000000000 Sending

5.2. Sending

The figure below shows the Sending section of the Preferences dialog:

Figure 5-2. The Sending section of the Preferences dialog

In this section you configure the default paramenters used when sending several commands at once. This setting is used in the Command History (Section 6.3.4) and Multi-line Send (Section 6.3.5) dialogs.

You specify the number of commands or lines that are sent simultaneously, and the delay between sending each group of commands/lines (containing the specified number of commands/lines, naturally). Note, however, that the values you set here are only defaults, you can change the values in the dialogs of those features if you need so.

kildclient-2.11.1/doc/C/kildclient/x2254.html0000644000175000017500000000604711570176765015410 00000000000000 Getting Information About Plugins

13.2. Getting Information About Plugins

All plugins should contain a help function that, when called, prints information about the plugin. If you want to get help on a plugin, call its help function. The example below shows how to call the help of the keypad plugin:

Example 13-3. Getting help about a plugin


keypad::help()

Note that the name of the function is prefixed with the name of the plugin and ::. This is a convention so that one plugin's functions do not interfere with other plugins' ones.

It is possible to get a list of all the currently loaded plugins with the $world->listplugin function. If called without arguments, it lists briefly all loaded plugins. But you can pass as argument either a plugin number or a plugin name, and it will give more detailed information about that plugin, including a listing of the triggers, aliases, macros and timers that the plugin defines (if any).

kildclient-2.11.1/doc/C/kildclient/x2510.html0000644000175000017500000001664111570176766015405 00000000000000 Chat Functions

15.3. Chat Functions

You can also access the chat features via some Perl functions of the chat plugin. Here is a list of these functions:

chat::call(host, [port])

Tries connection to host, on port port (or 4050, if not specified), using the MudMaster protocol.

chat::zcall(host, [port])

Tries connection to host, on port port (or 4050, if not specified), using the zChat protocol.

chat::accept([port])

Starts listening for chat connections on the given port (or 4050 if not specified).

chat::noaccept()

Stops listening for chat connections.

chat::setname(nickname)

Sets the nickname used in chat sessions.

chat::setcolor(code)

Sets the color used in chat sessions. code is a color code as recognized by the colorize function

chat::chat(name, text)

Sends text to name.

chat::emote(name, text)

Sends text as an emote to name.

chat::chatall(text)

Sends text to all chat connections.

chat::emoteall(text)

Sends text as an emote to all chat connections.

chat::group(name, group)

Makes the chat connection with name a member of the group group.

chat::chatgroup(group, text)

Sends text to all connections that are members of the group group.

chat::emotegroup(group, text)

Sends text as an emote to all connections that are members of the group group.

chat::ping(name)

Pings the other peer. If the connection is alive, they will reply to this request. Additionally, the time for the reply to be received is displayed.

chat::sendfile(name, [file])

Attemps to send a file to the peer. If you do not specify the file, a dialog will be displayed for you to select the file to send. The file will be offered. If they accept, the file transfer will start.

chat::stopfile(name)

Stops the file transfer currently in progress.

chat::snoop(name)

Asks name if you can snoop them, that is, see everything they see in their MUD session. If they accept, everything they see will be sent to you and displayed.

chat::setallowsnoop(name, value)

Sets whether name can snoop you, that is, wheter they can see everything you see in your MUD session, according to value. By default snooping is disabled.

chat::info(name)

Shows some information about the chat session.

chat::setstripansi(name, value)

Sets whether to trip ANSI color codes in messages received from name, according to value. If they are, colors sent by the peer will not be displayed, and that even incoming messages will be displayed in your chat color.

chat::hangup(name)

Stops the chat session with name. You will need to connect again to continue talking.

kildclient-2.11.1/doc/C/kildclient/x2751.html0000644000175000017500000000432411570176766015407 00000000000000 help

A.5. help

void help( "function" );

Displays help for the given function. The name of the function is passed as a string, so it must be in quotes.

kildclient-2.11.1/doc/C/kildclient/x4084.html0000644000175000017500000000763311570176767015417 00000000000000 $world->timer

C.80. $world->timer

void $world->timer( attributes );

void $world->timer( number , attributes );

Creates a new timer, or edits the timer identified by number.

atributes is a reference to a hash defining attributes for the timer. Generally the call works like this:


$world->timer({ attribute1 => value1,
                attribute2 => value2, ... })

Possible attributes:

  • interval: Number of seconds between each execution. Required.

  • count: Number of times to execute the timer. After this number of executions, the timer will be automatically disabled or deleted (see temporary flag below). If count is not given or count is -1, the timer repeats until manually disabled or deleted.

  • action: The action to execute. Required.

  • temporary: If set to 1, the timer will be deleted (and not only disabled) after count executions have happened.

  • enabled: If set to 1, the timer is enabled and will execute every count seconds. If set to 0, the timer does not execute until enabled again. New timers are created enabled by default.

  • name: Assigns a name to the timer, so that it can be referenced by name.

kildclient-2.11.1/doc/C/kildclient/x3553.html0000644000175000017500000000513711570176767015414 00000000000000 $world->listmacro

C.51. $world->listmacro

void $world->listmacro(void);

Briefly lists all defined macros.

void $world->listmacro( number/name , ... );

Lists detailedly the macro with the given number or name. If there are several macros with the same name, lists them all. Several arguments can be passed at once.

kildclient-2.11.1/doc/C/kildclient/x3062.html0000644000175000017500000000433311570176766015403 00000000000000 $world->displugin

C.16. $world->displugin

void $world->displugin( name );

Disables the specified plugin.

kildclient-2.11.1/doc/C/kildclient/x835.html0000644000175000017500000000454111570176765015330 00000000000000 Playing Sounds

7.3. Playing Sounds

To play a sound (for example, as the action of a trigger, to call your attention), use the play function. Pass it the path to the sound file, for example: /play("/home/joe/sounds/beep.wav").

Under Windows, this function supports playing WAV files. Under Linux, you must set-up a command to play sounds, see Section 5.3.

kildclient-2.11.1/doc/C/kildclient/x390.html0000644000175000017500000001123411570176764015320 00000000000000 Logging

4.4. Logging

A useful feature of KildClient is it hability to log all the output from the MUD, as shown in the screen, so that you can retrieve it later.

The output is saved in a file you specify. ANSI color codes are not saved, but otherwise the output is identical.

It is possible to prefix each line with a timestamp, so you can see when each line was received. You can specify the format of this timestamp.

The figure below shows the Logging section of the World Editor:

Figure 4-6. The Logging section of the World Editor

In the top, you will see if logging is currently enabled or disabled, and you can quickly start or stop it with the two buttons.

When you start logging, you can include some of the lines that have already been received and are in the scrollback buffer displayed in the main window. If you want to do that, just select the corresponding check box and enter the number of lines to save.

Next you specify the name of the file to store the log. New log lines are appended to that file, so it is safe so specify an existing file.

It is possible to have the log file named automatically based on the date and time that logging is started. For example, if the file name is "log_%m_%d.txt" the file name will include the month and day, for example for November 25th the file will be "log_11_25.txt". This is done replacing escape sequences beginning with the % character for the values depending on the date and time. The valid escape sequences are those of the strftime() function, and can be found here.

Similarly, you can use %Kw in the file name and it will be replaced by the name of the World. And the string %Kc is replaced by the name of the character used in auto-login (see Section 4.1). (If auto-login was not used, then %Kc is replaced by an empty string.)

If Automatically start logging when connected is selected, then all your mud sessions will be logged automatically.

It is possible to prefix each line written in the log file with the date and time it was received. To do that, select Prefix lines with date and/or time, and specify the format of the date and time. This is also a string with % escape sequences like the file name. The default includes the full date and time.

kildclient-2.11.1/doc/C/kildclient/x456.html0000644000175000017500000000646711570176764015337 00000000000000 Miscellaneous

4.7. Miscellaneous

The figure below shows the Miscellaneous section of the World Editor:

Figure 4-9. The Miscellaneous section of the World Editor

The first category, Scrolling, which controls the behavious of the scrollback buffer.

  • Scroll on output, when checked, will cause the buffer to always scroll the end when new text is received, thus displaying it immediately. If not checked, the buffer is only scrolled if you are at the end.

  • Lines to save in scrollback buffer determines how many lines of output will be saved in the buffer for you to see again. Note that KildClient will get slower and will consume more memory if you set this to too high a number.

The second category, Name display, controls how this world is identified in the tabs and in the window title. By default, only its name is used. But you can also display the name of the character logged in (provided auto logon was used, see section Section 4.1). If none of the options suit you, you can define your own. Use %Kw to represent the world name and %Kc to represent the character.

kildclient-2.11.1/doc/C/kildclient/p2673.html0000644000175000017500000003046211570176770015377 00000000000000 KildClient Programmer's Reference

II. KildClient Programmer's Reference

Table of Contents
A. Global Function Reference
A.1. colorize
A.2. getversion
A.3. getworld
A.4. gotow
A.5. help
A.6. play
A.7. quit
A.8. stripansi
A.9. stripcolorize
B. $window Reference
B.1. getsize
B.2. minimize
B.3. settitle
B.4. seturgencyhint
C. $world Reference
C.1. $world->{SILENT}
C.2. $world->alias
C.3. $world->close
C.4. $world->aliasenabled
C.5. $world->commandecho
C.6. $world->connectother
C.7. $world->dc
C.8. $world->delalias
C.9. $world->delhook
C.10. $world->delmacro
C.11. $world->deltimer
C.12. $world->deltrigger
C.13. $world->disalias
C.14. $world->dishook
C.15. $world->dismacro
C.16. $world->displugin
C.17. $world->distimer
C.18. $world->distrigger
C.19. $world->echo
C.20. $world->echonl
C.21. $world->echonlandlog
C.22. $world->enaalias
C.23. $world->enahook
C.24. $world->enamacro
C.25. $world->enaplugin
C.26. $world->enatimer
C.27. $world->enatrigger
C.28. $world->expandalias
C.29. $world->gag
C.30. $world->getaliasnumber
C.31. $world->getcharacter
C.32. $world->getconntime
C.33. $world->getentryfont
C.34. $world->gethooknumber
C.35. $world->getidletime
C.36. $world->getkeycode
C.37. $world->getline
C.38. $world->getlogfile
C.39. $world->getmacronumber
C.40. $world->getmainfont
C.41. $world->getname
C.42. $world->getpluginversion
C.43. $world->gettimernumber
C.44. $world->gettriggernumber
C.45. $world->hook
C.46. $world->hookenabled
C.47. $world->interpret
C.48. $world->ispermanent
C.49. $world->listalias
C.50. $world->listhook
C.51. $world->listmacro
C.52. $world->listpermanent
C.53. $world->listplugin
C.54. $world->listtimer
C.55. $world->listtrigger
C.56. $world->loadplugin
C.57. $world->logfile
C.58. $world->macro
C.59. $world->macroenabled
C.60. $world->movetimer
C.61. $world->makepermanent
C.62. $world->maketemporary
C.63. $world->mlsend
C.64. $world->movealias
C.65. $world->movehook
C.66. $world->movemacro
C.67. $world->movetrigger
C.68. $world->next
C.69. $world->path
C.70. $world->prev
C.71. $world->reconnect
C.72. $world->requireplugin
C.73. $world->save
C.74. $world->send
C.75. $world->sendecho
C.76. $world->sendfile
C.77. $world->sendlines
C.78. $world->sendnoecho
C.79. $world->setstatus
C.80. $world->timer
C.81. $world->timerenabled
C.82. $world->trigger
C.83. $world->triggerenabled
C.84. $world->writetolog
D. Using KCWin for Input/Output Windows
D.1. Changes from Previous Versions
D.2. KCWin::get_text
D.3. KCWin::set_text
D.4. KCWin::feed
E. Writing Plugins
E.1. The File Format
E.2. A Sample Plugin
E.3. Disposing Data When the Plugin Is Unloaded
E.4. Enabling and Disabling Plugins
E.5. Conditional Loading of Plugins
E.5.1. Plugins That Require Other Plugins
E.6. Using GTK+ From Plugins
E.7. Plugin Conventions
kildclient-2.11.1/doc/C/kildclient/x3674.html0000644000175000017500000000747511570176767015427 00000000000000 $world->macro

C.58. $world->macro

void $world->macro( keycode , action , [attributes] );

void $world->macro( number , [keycode , [action]] , [attributes] );

Creates a new macro, or edits the macro identified by number. keycode represents a key such as "KP_Home" or "<Control>F12". The format is the one accepted by the GTK+ function gtk_accelerator_parse(), but most of the time you will want to use the $world->getkeycode function to retrieve the keycode for a given key. action is what will be executed when the key (or keys) is pressed.

Atributes is a reference to a hash defining attributes for the macro. Generally the call works like this:


$world->macro("keycode", "action", { attribute1 => value1,
                                     attribute2 => value2, ... })

Possible attributes:

  • key: The key code.

  • action: The action to be executed.

  • enabled: If value evaluates to true, the macro is enabled, if false, it is disabled and is not run if the key is pressed.

  • name: Assigns a name to the macro, so that it can be referenced by name.

kildclient-2.11.1/doc/C/kildclient/a2801.html0000644000175000017500000000571011570176766015354 00000000000000 $window Reference

Appendix B. $window Reference

$windown is a variable that is always present and points to the current window. It is an object of class Window, and is opaque, that is, all interaction with it should be done via its functions, and not via its members.

The sections below describe the functions available for the $window variable.

B.1. getsize

($lines, $columns) = $window->getsize(void);

$columns = $window->getsize(void);

This functions returns the current size of the window (in characters), in terms of lines and columns. It can return both dimensions, or just the number of columns.

kildclient-2.11.1/doc/C/kildclient/x3277.html0000644000175000017500000000542611570176766015417 00000000000000 $world->gethooknumber

C.34. $world->gethooknumber

@list = $world->gethooknumber( event , name );

Returns a list with the number(s) of the hook(s) matching the given name. If no hook with that name is found, returns an empty list. If there are several hooks with the same name, returns the numbers of all of them. You must specify the event in which to search for the hook.

The number of a hook is necessary to edit it. However, as the user can change the order of hooks, create new ones and delete old hooks, a hook's number may change, so you should not store its number; you must fetch the number just before editing it.

kildclient-2.11.1/doc/C/kildclient/x3290.html0000644000175000017500000000471511570176766015412 00000000000000 $world->getidletime

C.35. $world->getidletime

$seconds = $world->getidletime(void);

This function returns the idle time, that is, the time elapsed since the last command was sent, in seconds. See Section 4.2.3 for information on how that time is calculated and how to configure it.

kildclient-2.11.1/doc/C/kildclient/x2972.html0000644000175000017500000000452411570176766015416 00000000000000 $world->delalias

C.8. $world->delalias

$n = $world->delalias( number/name );

Deletes the alias identified by the given number or name. If there are several aliases with the same name, deletes them all. Returns the number of aliases deleted.

kildclient-2.11.1/doc/C/kildclient/x3489.html0000644000175000017500000000454011570176767015421 00000000000000 $world->interpret

C.47. $world->interpret

$world->interpret( "string" );

This function interprets the string as if it were typed in the input box: commands are split, Perl code is run, aliases are expanded, etc.

kildclient-2.11.1/doc/C/kildclient/c1685.html0000644000175000017500000001734711570176765015377 00000000000000 Macros

Chapter 10. Macros

Macros are, in a way, similar to aliases. They allow you to send commands to the MUD in an easier way. Aliases allow you to associate commands with shortcuts (typing a three-letter command to send a much more complex command, for example). Macros allow you to associate a command with a keypress. You could associate, for example, F5 with the command drink from fountain, and then you would only need to press F5 to send that command to the MUD.

The commands need not be complex or big: you could associate the arrow keys with macros that send movement commands, and you would be able to move around the MUD using the arrow keys.

Macros consist of a key and an action. The action represents what is sent to the MUD when the macro is run. It can be a single command to send, several commands separated by %;, or something to be executed by Perl, if it starts with /.

10.1. Creating and Editing Macros

The easiest way to create and alter macros is from the World Editor, the place where all settings of a World are altered (see Chapter 4).

Macro are defined in the Macros section inside the Automation section. When you open that section, you'll see a list of the defined macros and some buttons like this:

Figure 10-1. The graphical Macro editor

The main part of the window is the list of defined macros. The columns are as follows:

  • Enabled specifies whether the macro is enabled or not. Macros that are not enabled are not active and will not be run even if their key is pressed, but they remain in the list so that they can later be enabled again.

  • Name is a name that is assigned to a macro. This helps you identify the macro's purpose and is useful when editing a macro via the command line (as described in Section 10.2.1). Assigning a name to a macro is optional.

  • Key is the key that activates the macro.

  • Action is the action that is run when the key is pressed.

  • Plugin: if this is non-empty, it means that the macro belongs to a plugin (and the name of the plugin is displayed). However, by default plugin macros are not displayed. See Section 4.8 for information on how to display plugin macros here.

10.1.1. Adding Macros

To add a new macro, press the Add button. This will open a window for you to edit the new macro's parameters:

Figure 10-2. The window to edit macros

What can be set represents the columns described above. To define the key, press the key combination desired in the text box for Key and the appropriate key code will be inserted.

When you are finished, press OK and the macro will be added. If you change your mind, press Cancel and the macro will not be added.

To see some things macros can do, read Section 10.2. If you want to try the macros described there, you can create them from the World Editor.

10.1.2. Editing Macros

To edit a macro, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding macro (see Section 10.1.1) will be opened, filled with the macro's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the macro will remain as it was before.

Another shorter way to edit a macro is to double click its line in the list.

It is also possible to change the value of the enabled option directly from the macro list. Make sure that the macro you want to change is selected, and click in the check button. The state will be toggled.

To delete a macro, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the macro. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the macro again. See Section 4.8. To delete several macros at once, select them all and press Delete.

The final thing that needs to be explained with regard to macros is how to reorder them. Macros as tried from the first one to the last, so in a few cases the order might matter. To move a macro up or down in the list, select it and press the corresponding button.

kildclient-2.11.1/doc/C/kildclient/x3126.html0000644000175000017500000000474011570176766015406 00000000000000 $world->echonlandlog

C.21. $world->echonlandlog

void $world->echonlandlog( str , ... );

This is a convenience function that just calls $world->echonl and $world->writetolog for each argument, thus writing the given line(s) to the screen and to the log file.

kildclient-2.11.1/doc/C/kildclient/x3403.html0000644000175000017500000001172111570176767015402 00000000000000 $world->hook

C.45. $world->hook

void $world->hook( event , action , [attributes] );

void $world->hook( event , number , [action] , [attributes] );

A hook is an action that is connected to an event, such as connecting to the World or the window receiving focus. This functions allow you to define a hook for a given event, that will execute action, or to edit the hook identifyed by number.

Here are the events currently supported:

  • OnConnect: This hook is execued when a connection to the world is made, after the auto-logon has taken place (if applicable).

  • OnDisconnect: This hook is executed when you are disconnected from a World, after the connection has been closed.

  • OnReceivedText: Executed when text is received from the world.

  • OnSentCommand: Executed after a command is sent to the world. The command is available for the hook in the $hookdata variable, and can be inspectd in Perl scripts.

  • OnGetFocus: Executed when the KildClient window receives the focus.

  • OnLoseFocus: Executed when the KildClient window loses the focus.

  • OnCloseConnected: Executed when the world is forcedly closed. This can happen using the World->Close menu, the $world->close() function, or by quitting the program with the world connected. You can put in this hook, for example "quit" to always exit the MUD nicely, even if you close the world by mistake.

atributes is a reference to a hash defining attributes for the hook. Generally the call works like this:


$world->hook("event", "action", { attribute1 => value1,
                                  attribute2 => value2, ... })

Possible attributes:

  • action: The action to be executed.

  • enabled: If value evaluates to true, the hook is enabled. If it evaluates to false, the hook is disbled and is not executed.

  • name: Assigns a name to the hook, so that it can be referenced by name.

kildclient-2.11.1/doc/C/kildclient/c1394.html0000644000175000017500000002320211570176765015357 00000000000000 Aliases

Chapter 9. Aliases

Aliases allow you to define shortcuts for simple commands. For example, you can define df to be an alias to drink from fountain, and then you can type only df in the command line, and drink from fountain will be sent to the mud.

However, in KildClient aliases can do much more. They allow you to rewrite part of the input line. In the example above, what happened is that df was replaced by drink from fountain. Aliases such as these replace the entire short command you type by a longer command, but you can also replace part of the line. If a mob has a really long name, such as Ingeloakastimizilian, you can define an alias "ing" that is replaced by "Ingeloakastimizilian", and whenever you type ing, even in the middle of another command, it will be replaced by the full name.

Aliases are implemented as a substitution, just like the "Search and Replace" option found in several programs. They consist of two parts: a pattern and a substitution. Each line you type is matched against the pattern and if it matches, the matched part is replaced by the substitution.

For those who know Perl, aliases work just like Perl's s/// operator. As a matter of fact, they are implemented with s///. This is more or less how the alias processing is done:


$line =~ s/$pattern/$substitution/;

Supposing $line holds the entered command, $pattern the pattern and $substitution the substitution. Then $line is sent to the World, possibly having been modified.

If you are having trouble with aliases and want to be informed whenver an alias matches, enable the Preferences->Debug Matches menu. When this is enabled, information about each matched alias will be printed to stderr. (This means you must start KildClient from a terminal to see the output.)

9.1. Creating and Editing Aliases

The easiest way to create and alter aliases is from the World Editor, the place where all settings of a World are altered (see Chapter 4).

Aliases are defined in the Aliases section inside the Automation section. When you open that section, you'll see a list of the defined aliases and some buttons like this:

Figure 9-1. The graphical Alias editor

The main part of the window is the list of defined aliases. The columns are as follows:

  • Enabled specifies whether the alias is enabled or not. Aliases that are not enabled are not active and will not be tried when a command is entered, but they remain in the list so that they can later be enabled again.

  • Name is a name that is assigned to an alias. This helps you identify the alias' purpose and is useful when editing an alias via the command line (as described in Section 9.3.1). Assigning a name to an alias is optional.

  • Pattern and Substitution are the parameters for the alias, and they define the alias' action, as described above.

  • I Case (for "Ignore Case"), if set, means the case is not considered while matching the pattern, that is, a case-insensitive match is done.

  • Eval as Perl controls how the alias is evaluated. This option will be described later.

  • Plugin: if this is non-empty, it means that the alias belongs to a plugin (and the name of the plugin is displayed). However, by default plugin aliases are not displayed. See Section 4.8 for information on how to display plugin aliases here.

9.1.1. Adding Aliases

To add a new alias, press the Add button. This will open a window for you to edit the new alias' parameters:

Figure 9-2. The window to edit aliases

What can be set represents the columns described above. The only thing that needs explanation is the Eval Substitution as Perl statement option, corresponding to the Eval as Perl column. As mentioned before, aliases are actually a substitution, using Perl's s// construct. It is also possible to have aliases that use a s//e construct, that is, whose substitution is actually composed of Perl statements evaluated when a match is found. When that option is enabled, the substitution is evaluated as a Perl statement.

When you are finished, press OK and the alias will be added. If you change your mind, press Cancel and the alias will not be added.

9.1.2. Editing Aliases

To edit an alias, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding aliases (see Section 9.1.1) will be opened, filled with the alias' parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the alias will remain as it was before.

Another shorter way to edit an alias is to double click its line in the list.

It is also possible to change the value of the Enabled and Eval as Perl flags directly from the alias list. Make sure that the alias you want to change is selected, and click in the check button. The state will be toggled.

To delete an alias, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the alias. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the alias again. See Section 4.8. To delete several aliases at once, select them all and press Delete.

The final thing that needs to be explained with regard to aliases is how to reorder them. Aliases as tried from the first one to the last, so in a few cases the order might matter. To move an alias up or down in the list, select it and press the corresponding button.

kildclient-2.11.1/doc/C/kildclient/x422.html0000644000175000017500000000615611570176764015323 00000000000000 Automation

4.5. Automation

This section allows you to configure the features that make your MUD playing experience easier, faster and more efficient. You can define triggers, aliases, hooks, etc. here. These sections of the World Editor will be described elsewhere, along with a description of the features. Here we will deal with another section that is more generic.

4.5.1. Scripting

The figure below shows the Scripting section of the World Editor:

Figure 4-7. The Scripting section of the World Editor

There is only one parameter to be configured in this section: Perl file to load. It allows you to specify a file that will be read by the Perl interpreter when the World is loaded. This file can contain sub-routine definitions that will be available for you to use in your triggers, aliases etc., or to be called directly. For more details, see Section 7.1.

Enter the path to the file in the textbox, or click the button next to it to open a dialog from which you can select a file.

kildclient-2.11.1/doc/C/kildclient/x2982.html0000644000175000017500000000461611570176766015421 00000000000000 $world->delhook

C.9. $world->delhook

$n = $world->delhook( event , number/name );

Deletes the hook identified by the given number or name, connected to the specified event. If there are several hooks with the same name, deletes them all. Returns the number of hooks deleted.

kildclient-2.11.1/doc/C/kildclient/index.html0000644000175000017500000005652111570176770015731 00000000000000 KildClient Manual

KildClient Manual

Version 2.11.1

Eduardo M Kalinowski


Table of Contents
I. KildClient User's Guide
1. Introduction
2. Running KildClient
3. Basic Usage
3.1. Connecting to a MUD
3.2. Interacting with the MUD
3.3. Closing Worlds and Exiting KildClient
3.4. Reviewing and Searching Text
4. Editing a World
4.1. General
4.2. Display settings
4.3. Input
4.4. Logging
4.5. Automation
4.6. Protocols
4.7. Miscellaneous
4.8. Advanced
5. Configuring KildClient
5.1. Appearance
5.2. Sending
5.3. External Programs (Linux)
5.4. Proxy
6. Menu Reference
6.1. World menu
6.2. Edit Menu
6.3. Input Menu
6.4. Preferences Menu
6.5. Diplay Menu
6.6. Help Menu
7. Using Perl in KildClient
7.1. The Basics
7.2. Echoing and Sending Text
7.3. Playing Sounds
7.4. Saving Variables Permanently
7.5. Controlling Worlds with Perl
8. Triggers
8.1. Creating and Editing Triggers
8.2. Basic Triggers
8.3. Changing the Style of the Matched Text
8.4. Gags
8.5. Other trigger features
8.6. Defining Triggers in the Command Line
8.7. Importing and Exporting
8.8. Testing Triggers
9. Aliases
9.1. Creating and Editing Aliases
9.2. Using Aliases
9.3. Defining Aliases in the Command Line
10. Macros
10.1. Creating and Editing Macros
10.2. Defining Macros in the Command Line
11. Timers
11.1. Creating and Editing Timers
11.2. Defining Timers in the Command Line
12. Hooks
12.1. Creating and Editing Hooks
12.2. Defining Hooks in the Command Line
13. Plugins
13.1. Loading Plugins from the Command Line
13.2. Getting Information About Plugins
13.3. Standard Plugins
14. Logging the Output
15. Using the Chat
15.1. Basic Usage
15.2. Advanced Features
15.3. Chat Functions
II. KildClient Programmer's Reference
A. Global Function Reference
A.1. colorize
A.2. getversion
A.3. getworld
A.4. gotow
A.5. help
A.6. play
A.7. quit
A.8. stripansi
A.9. stripcolorize
B. $window Reference
B.1. getsize
B.2. minimize
B.3. settitle
B.4. seturgencyhint
C. $world Reference
C.1. $world->{SILENT}
C.2. $world->alias
C.3. $world->close
C.4. $world->aliasenabled
C.5. $world->commandecho
C.6. $world->connectother
C.7. $world->dc
C.8. $world->delalias
C.9. $world->delhook
C.10. $world->delmacro
C.11. $world->deltimer
C.12. $world->deltrigger
C.13. $world->disalias
C.14. $world->dishook
C.15. $world->dismacro
C.16. $world->displugin
C.17. $world->distimer
C.18. $world->distrigger
C.19. $world->echo
C.20. $world->echonl
C.21. $world->echonlandlog
C.22. $world->enaalias
C.23. $world->enahook
C.24. $world->enamacro
C.25. $world->enaplugin
C.26. $world->enatimer
C.27. $world->enatrigger
C.28. $world->expandalias
C.29. $world->gag
C.30. $world->getaliasnumber
C.31. $world->getcharacter
C.32. $world->getconntime
C.33. $world->getentryfont
C.34. $world->gethooknumber
C.35. $world->getidletime
C.36. $world->getkeycode
C.37. $world->getline
C.38. $world->getlogfile
C.39. $world->getmacronumber
C.40. $world->getmainfont
C.41. $world->getname
C.42. $world->getpluginversion
C.43. $world->gettimernumber
C.44. $world->gettriggernumber
C.45. $world->hook
C.46. $world->hookenabled
C.47. $world->interpret
C.48. $world->ispermanent
C.49. $world->listalias
C.50. $world->listhook
C.51. $world->listmacro
C.52. $world->listpermanent
C.53. $world->listplugin
C.54. $world->listtimer
C.55. $world->listtrigger
C.56. $world->loadplugin
C.57. $world->logfile
C.58. $world->macro
C.59. $world->macroenabled
C.60. $world->movetimer
C.61. $world->makepermanent
C.62. $world->maketemporary
C.63. $world->mlsend
C.64. $world->movealias
C.65. $world->movehook
C.66. $world->movemacro
C.67. $world->movetrigger
C.68. $world->next
C.69. $world->path
C.70. $world->prev
C.71. $world->reconnect
C.72. $world->requireplugin
C.73. $world->save
C.74. $world->send
C.75. $world->sendecho
C.76. $world->sendfile
C.77. $world->sendlines
C.78. $world->sendnoecho
C.79. $world->setstatus
C.80. $world->timer
C.81. $world->timerenabled
C.82. $world->trigger
C.83. $world->triggerenabled
C.84. $world->writetolog
D. Using KCWin for Input/Output Windows
D.1. Changes from Previous Versions
D.2. KCWin::get_text
D.3. KCWin::set_text
D.4. KCWin::feed
E. Writing Plugins
E.1. The File Format
E.2. A Sample Plugin
E.3. Disposing Data When the Plugin Is Unloaded
E.4. Enabling and Disabling Plugins
E.5. Conditional Loading of Plugins
E.6. Using GTK+ From Plugins
E.7. Plugin Conventions
List of Examples
8-1. A very simple trigger
8-2. A trigger which captures part of the received line and uses it in the action
8-3. A trigger with an action in Perl
8-4. A trigger that calls a sub-routine
8-5. A simple gag
8-6. A gag with no action
8-7. Rewriting a line with gags
8-8. A profanity filter that does not work
8-9. A profanity filter using a rewriter trigger
8-10. A very simple trigger defined in the command line
8-11. A simple gag (in the command line)
8-12. A gag with no action (in the command line)
8-13. A shortcut function to define gags
8-14. A case-insensitive trigger
8-15. Changing several attributes at once
8-16. A very simple trigger, in another way
8-17. Disabling a trigger, the long way
8-18. Disabling a trigger, the short way
8-19. Creating a trigger with a name
9-1. A simple alias
9-2. A slightly more complex alias
9-3. An alias that uses bracketed expressions
9-4. An alias whose substitution is evaluated:
9-5. A simple alias defined in the command line
9-6. An alias whose substitution is evaluated (in the command line)
9-7. Disabling an alias, the long way
9-8. Disabling an alias, the short way
9-9. Creating an alias with a name
10-1. Defining a macro
10-2. Disabling a macro, the long way
10-3. Disabling a macro, the short way
10-4. Creating a macro with a name
11-1. A simple timer
11-2. A timer that executes only five times
11-3. A one-shot timer
11-4. Changing the interval of a timer
11-5. Changing the interval of a timer
11-6. Disabling a timer, the short way
11-7. Creating a timer with a name
12-1. Connecting a hook
12-2. Disabling a hook, the long way
12-3. Disabling a hook, the short way
12-4. Creating a hook with a name
13-1. Loading a plugin
13-2. Loading a plugin specifying the full filename
13-3. Getting help about a plugin
14-1. Enabling logging
A-1. Quitting from another world
C-1. Changing styles with triggers
E-1. A Sample Plugin
E-2. Conditional loading of plugins
E-3. A plugin that requires another
E-4. A plugin that uses gtk2-perl
kildclient-2.11.1/doc/C/kildclient/x884.html0000644000175000017500000000636011570176765015335 00000000000000 Controlling Worlds with Perl

7.5. Controlling Worlds with Perl

In Section 3.3 it was explained that you can disconnect from a World with the $world->dc function. It now should be clear why there is a $world-> in front. Another function that you know already is $world->close, to disconnect and close a World.

There are a few more functions that allow you to control Worlds from Perl. The $world->next and $world->prev move to the next or previous world in the list of tabs. It is also possible to pass an argument to them, specifying how many Worlds to move. So, $world->next(2) moves two Worlds forward, and $world->prev(3) moves three Worlds back.

To go to a specific World, use the gotow function (which does not belong to the World class, since it does not depend on a particular World), passing as argument a string with the name of the World.

Finally, you can use the quit function to disconnect and close all Worlds and then exit KildClient.

kildclient-2.11.1/doc/C/kildclient/x3225.html0000644000175000017500000000457011570176766015407 00000000000000 $world->gag

C.29. $world->gag

void $world->gag( pattern );

Adds a gag that prevents lines matching pattern from being shown.

See the $world->trigger function for more advanced options.

kildclient-2.11.1/doc/C/kildclient/x3938.html0000644000175000017500000000441411570176767015420 00000000000000 $world->reconnect

C.71. $world->reconnect

void $world->reconnect(void);

When in offline mode, this function will attempt to reconnect to the mud.

kildclient-2.11.1/doc/C/kildclient/x3596.html0000644000175000017500000000513711570176767015423 00000000000000 $world->listtimer

C.54. $world->listtimer

void $world->listtimer(void);

Briefly lists all defined timers.

void $world->listtimer( number/name , ... );

Lists detailedly the timer with the given number or name. If there are several timers with the same name, lists them all. Several arguments can be passed at once.

kildclient-2.11.1/doc/C/kildclient/x3963.html0000644000175000017500000000430311570176767015413 00000000000000 $world->save

C.73. $world->save

void $world->save(void);

Saves the current World.

kildclient-2.11.1/doc/C/kildclient/a2851.html0000644000175000017500000000543411570176767015365 00000000000000 $world Reference

Appendix C. $world Reference

$world is a variable that is always present and points to the current World. It is an object of class World, and is opaque, that is, all interaction with it should be done via its functions, and not via its members.

The sections below describe the variables and attributes available for the $world variable.

C.1. $world->{SILENT}

If this attribute is set to a true value (such as 1), some messages are not displayed, especifically the messages "Trigger added", "Trigger modified", "Trigger deleted", "Trigged moved", and the corresponding messages for the other objects: aliases, macros, timers, hooks, permanent variables and plugins.

kildclient-2.11.1/doc/C/kildclient/x4074.html0000644000175000017500000000440111570176767015404 00000000000000 $world->setstatus

C.79. $world->setstatus

void $world->setstatus( text );

Sets the text in the main window status bar to the given text.

kildclient-2.11.1/doc/C/kildclient/x2831.html0000644000175000017500000000427711570176766015415 00000000000000 settitle

B.3. settitle

void $window->settitle( "new title" );

Sets the title of the window to the given string.

kildclient-2.11.1/doc/C/kildclient/x2862.html0000644000175000017500000001013611570176766015410 00000000000000 $world->alias

C.2. $world->alias

void $world->alias( pattern , substitution , [attributes] );

void $world->alias( number , [pattern , [substitution]] , [attributes] );

Creates a new alias, or edits the alias identified by number. Entered commands will be matched against pattern (a Perl regular expression), and if the pattern matches, the given substitution will be applied. (In a s/pattern/substitution/ structure.)

Be careful that any part of the command can match. To match only the exact string, use something like '^command$'. To match only in the beginning of the line, use '^command'.

Atributes is a reference to a hash defining attributes for the alias. Generally the call works like this:


$world->alias("pattern", "action", { attribute1 => value1,
                                     attribute2 => value2, ... })

Possible attributes:

  • pattern: The pattern to match.

  • substitution: The substitution to do.

  • ignorecase: If value evaluates to true, ignore case when matching the pattern.

  • perleval: If true, the substitution is made passing the "e" flag (s/pattern/substitution/e), so substitution should be actually Perl statements to be evaluated when there is a match.

  • enabled: If value evaluates to true, the alias is enabled, if false, it is disabled and commands are not matched against it.

  • name: Assigns a name to the alias, so that it can be referenced by name.

kildclient-2.11.1/doc/C/kildclient/x2771.html0000644000175000017500000000422311570176766015407 00000000000000 quit

A.7. quit

void quit(void);

Disconnects and closes all Worlds and KildClient exits.

kildclient-2.11.1/doc/C/kildclient/x3614.html0000644000175000017500000000515311570176767015410 00000000000000 $world->listtrigger

C.55. $world->listtrigger

void $world->listtrigger(void);

Briefly lists all defined triggers.

void $world->listtrigger( number/name , ... );

Lists detailedly the trigger with the given number or name. If there are several triggers with the same name, lists them all. Several arguments can be passed at once.

kildclient-2.11.1/doc/C/kildclient/x3212.html0000644000175000017500000000504211570176766015376 00000000000000 $world->expandalias

C.28. $world->expandalias

$result = $world->expandalias( "string" );

This function expands aliases in the string passed as argument. The result is what you would get if you typed "string" in the input box (except that aliases are still expanded even if Disable Aliases is selected in the Preferences menu).

kildclient-2.11.1/doc/C/kildclient/x4005.html0000644000175000017500000000605711570176767015407 00000000000000 $world->sendfile

C.76. $world->sendfile

success = $world->sendfile( file , [delay , [n-lines]] );

Sends the contents of the given file to the world. delay is the number of seconds to wait between sending each group of lines, and n-lines is the number of lines to send a time. If these values are not specified, they are taken from the defauls set in the Preferences dialog (see Section 5.2).

On success, returns true. If the file does not exist or cannot be open, this function does nothing and returns a false value. It returns undef if the file name is not specified.

For more options, see the $world->mlsend function which allows adding a text before and/or after each line, and sending lines before and/or after sending the contents of the file.

kildclient-2.11.1/doc/C/kildclient/x3532.html0000644000175000017500000000526611570176767015414 00000000000000 $world->listhook

C.50. $world->listhook

void $world->listhook( event );

This function briefly lists all hooks connected to the given event.

void $world->listhook( event , number/name , ... );

Lists detailedly the hook with the given number or name, connected to the specified event. If there are several hooks with the same name, lists them all. Several arguments can be passed at once.

kildclient-2.11.1/doc/C/kildclient/c731.html0000644000175000017500000001672211570176765015302 00000000000000 Using Perl in KildClient

Chapter 7. Using Perl in KildClient

This chapter will describe briefly how to use Perl (Practical Extration and Report Language, or, according to some, Pathologically Eclectic Rubbish Lister) in KildClient. Even though it will give a few examples of things that would certainly be known already by people who know Perl, this Chapter is not meant to be a Perl tutorial. If you want to learn Perl from the start, you should read its man pages, find a tutorial or a good book on the subject (there are plenty of these). Some knowledge of Perl will certainly help in understanding this Chapter.

7.1. The Basics

KildClient has a built-in Perl interpreter. To run a perl statement, just type if preceded by a slash (/) in the command entry box. The statement will be executed by the Perl interpreter instead of being sent to the MUD.

The statement can be anything that Perl will accept. You can actually execute several Perl statements if you separate them with ; (no need to add / again, just once in the beginning of the line). You can call sub-routines, execute conditional or loop constructions, call a built-in function, do variable assignments, or even define a sub-routine. However, the statement must be complete. You cannot enter something like /$myVar = and then enter /"some_value";, the statement must be complete in one line. Technically, each line you enter is executed inside an eval block, so anything you want executed must be valid code inside an eval block.

All built-in Perl functions are accessible for you to use, and you can load Perl modules and use their functionality. However, that is not enough, because Perl's built-in functions will not allow you to interact with the World. Because of that, KildClient defines a set of functions that you can use to interact with the World. A full list describing them detailedly is found in Appendix A, but some of the most useful ones will be described in this Chapter. Many of these functions deal with creating and editing triggers, gags, aliases etc. These will be described in the corresponding chapters.

It is possible to get help on all functions using the help function. It takes as argument the name of the function. Note that since help is nothing else than another Perl function, the name of the function for which you want help is just an argument to it, and must be passed as a string. That is, to get help on the echo function, type /help "echo". (Naturally, you can enclose "echo" in parenthesis, but this is not necessary.)

Some functions are in a way global, that is, they do not refer to a specific world. One such example is colorize (see colorize), which inserts ANSI color codes in strings (useful when you want to print something in the screen). These are called like any built-in Perl function. For example, if you enter /$colorstr = colorize("&WI'm in white!"), the variable $colorstr will hold a string that would be printed in white.

Many functions, however, are specific to a World, such as echo (see $world->echo), which prints something in the World window (but does not send it to the World). Because of that, they are called in a slightly different way. To print that string which has just been created, you would enter /$world->echo($colorstr). Those that know Perl will recognized this as a method call of the $world instance. Indeed, $world is an instance of the class World class. This class defines several functions that allow interaction with a World. On start-up, the $world variable is created and references the current World.

It is also possible to control other worlds, if you have a variable pointing at them. You can get such a variable with the getworld function (see getworld). In that case, you should use the variable you got instead of $world.

If all the above did not make sense to you, do not worry. Just remember that many functions have to be called by adding $world-> to the front. These functions will always be listed with that in front.

When a World is opened, the Perl interpreter reads and executes a file you specify. (See Section 4.5.1 for information on how to specify the file.) In this file, you can define sub-routines and variables. They will be then available for you to use during your session. If you define a sub-routine called sendGreetings, you can type /sendGreetings and the sub-routine will be executed. Or, if you define a variable, you can use it anywhere.

It should be noted that each World has its own Perl interpreter, with its functions and variables. What you do in one World does not affect the others.

kildclient-2.11.1/doc/C/kildclient/x3050.html0000644000175000017500000000455511570176766015406 00000000000000 $world->dismacro

C.15. $world->dismacro

void $world->dismacro( number/name , ... );

Disables the macro identified by number or name. If there are several macros with the same name, disables them all. Several arguments can be passed at once.

kildclient-2.11.1/doc/C/kildclient/x3928.html0000644000175000017500000000454211570176767015421 00000000000000 $world->prev

C.70. $world->prev

void $world->prev( [number] );

If used without arguments, this function focuses the previous open world. You can also give a numeric argument X, in this case it focuses the Xth world before the current one.

kildclient-2.11.1/doc/C/kildclient/x2710.html0000644000175000017500000000427211570176766015404 00000000000000 getversion

A.2. getversion

$version = getversion(void);

This functions returns the version number of KildClient.

kildclient-2.11.1/doc/C/kildclient/x3882.html0000644000175000017500000000525311570176767015420 00000000000000 $world->movetrigger

C.67. $world->movetrigger

void $world->movetrigger( number/name , new_pos );

Moves the trigger with the given name or number so that it occupies the position new_pos after execution of this function. Other triggers might be moved up or down in result of this. If new_pos is negative or greater than the number of triggers, the trigger is moved to the last position.

If there are several triggers with the given name, only the first one found is moved.

kildclient-2.11.1/doc/C/kildclient/x1942.html0000644000175000017500000002615211570176765015412 00000000000000 Defining Timers in the Command Line

11.2. Defining Timers in the Command Line

For those more used to Perl and to command lines, it is also possible to define and alter timers from the command line. This is done with a series of Perl function.

Timers are created with the $world->timer function. It is similar to other functions for adding triggers, aliases and macros, but the hash reference with attributes (the thing inside {}) must always be used.

Let us see an example of defining a timer that sends "who" once a minute:

Example 11-1. A simple timer


$world->timer({ interval => 60,
                action => 'who' })

Note that the interval is specified in seconds.

Our second example will be of a timer that executes a specified number of times:

Example 11-2. A timer that executes only five times


$count = 5;
$world->timer({ interval => 10,
                count => 5,
                action => '/$world->send("chat The count is at $count"); --$count' })

In these two commands, first a variable that will be used in the timer is defined. Then the timer is created, specifying count as 5, so that it is executed only five times. The timer's action is to send commands counting down to one. When the count reaches one, the timer is disabled, because it has already executed five times.

Now let us see a temporary timer:

Example 11-3. A one-shot timer


$world->timer({ interval => 30,
                count => 1,
                temporary => 1,
                action => 'say 30 seconds have elapsed' })

This timer has a count of one, meaning it will only be executed once. Also, temporary is defined as true, which means that after it is executed (which will happen in 30 seconds), the timer will be erased.

Of course, a temporary timer does not need to have a count of one. The countdown timer above could have been made temporary if it was not needed after it reached one.

11.2.1. Editing Timers

Before going into editing, let us see how to get a list of all timers that are currently defined for the World. Just use the $world->listtimer function without arguments. You will be presented with a list of the currently defined timers.

There are several columns: Num is the number of the timer. Timers are numbered sequentially starting at zero. This number will be useful when we start editing timers. After that, Int is the interval (in seconds) between timer firings. Next comes Count, which is the number of times the timer will still be fired before being disabled or erased. If the value is -1, that means that it will execute indefinitely. Ena tells whether the timer is enabled. enabled. Timers that are disabled are not run. This is a nice way to stop a timer from working, but keep it stored for later use. We will see how to enable and disable timer later in this section. After that, Temp tells whether the timer is temporary or not. Temporary timers were explained in the previous section. In brief, a temporary timer is deleted (and not only disabled) after its count reaches zero. The last column shows the action associated with the timer.

The listing produced by $world->listtimer is compact, showing all timers but possibly truncating the action. If you give a timer number as argument to listtimer, it will display that timer's information detailedly.

To edit a timer, you need to know that timer's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->gettimernumber can be used to discover a timer's number if its name is known.) The same function used to add timers can also change existing ones, you just need to pass the timer number as the first argument.

The generay way to edit a timer is like this: $world->timer(number, { new attributes }), where new attributes is a list of the attributes you want to change. For example, the code below changes the interval of timer number two:

Example 11-4. Changing the interval of a timer


$world->timer(2, { interval => 30 })

As a further example, consider the one below, that edits timer number five to be temporary and to run 10 times:

Example 11-5. Changing the interval of a timer


$world->timer(5, { temporary => 1,
                   count => 10 })

It is possible to enable and disable timers with the syntax above, but there is a shorter way: the $world->distimer function disables the timer whose number is passed as argument, as shown in the example below:

Example 11-6. Disabling a timer, the short way


$world->distimer(3)

The corresponding function $world->enatimer enables the specified timer.

It is also possible to temporarily disable all timers. Just use the menu Preferences->Disable Timers and this will prevent timers from running. This does not change the "enabled" status of any timers, it just prevents all timers from running. When you select the menu again, timers that were enabled will run again, and those that were disabled will remain disabled.

There are times when you want to delete a timer. This is easy to do, use the $world->deltimer function. It takes as argument the number of the timer you wish to delete. Be aware that once deleted it is not possible to recover the timer (unless you create it again). Many times just disabling it is a better idea. The second thing to note is that when you delete a timer the numbers of the other timers may change, so be careful when you try to delete several timers in sequence.

11.2.2. Assigning Names to Timers

It is possible to assign names to timers. When a timer has a name, you can enable, disable, or delete it using its name instead of its number.

To assign a name to a timer, specify the name attribute when creating it:

Example 11-7. Creating a timer with a name


$world->timer({ interval => 60,
                action => 'who',
                name => 'who' })

You can now disable this timer with $world->distimer('who'). The name can also be used in the $world->enatimer, $world->deltimer and $world->listtimer functions.

It is also possible to assign a name to an existing timer. Just edit it as described in Section 11.2.1, passing the name attribute. Use this same process to change the name of a timer.

Another feature of timer names is that several timers can have the same name. In this case, all these timers will be treated as a single group. The functions above, when passed a timer name, will act upon all timers of the group, that is, on all timers with that name.

11.2.3. Reordering Timers

It is possible to move a timer to another position with the $world->movetimer function.

The function takes two parameters: the first is the name or number of the timer that you want to move. The second is the new position that the timer will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of timers, the timer will be moved to the end of the list.

If there are several timers with the same name, only the first one found will be moved. And when a timer is moved, other timers might move up or down to accomodate the change.

kildclient-2.11.1/doc/C/kildclient/x3785.html0000644000175000017500000001277611570176767015432 00000000000000 $world->mlsend

C.63. $world->mlsend

success = $world->mlsend( attributes );

This functions emulates the Multi-line Send feature (see Section 6.3.5) from perl scripts. Several lines can be sent at once, optionally prefixing and/or suffixing each line with text you specify. It's also possible to send the contents of a file to the MUD. The lines can be sent with customized intervals between them (so as not to cause buffer overflows that lead to a disconnection from the server).

atributes is a reference to a hash defining attributes for the timer. Generally the call works like this:


$world->mlsend({ attribute1 => value1,
                 attribute2 => value2, ... })

Possible attributes:

  • initialtext: Lines of text to be sent to the MUD before anything else. You can specify this argument in two ways: one is as a string composed of several lines, KildClient will split the string and send each line separately. The second option is to pass a reference to an array, where each element is a line.

    The following two call are thus equivalent:

    
  $world->mlsend({ initialtext => "First line\nSecond line\nLast line" })
      
    
  $world->mlsend({ initialtext => [ "First line",
                                        "Second line",
                                        "Last line" ]})
      
  • file: The path to a file whose contents are to be sent, line by line, after sending the initialtext (if present), but before sending finaltext.

  • finaltext: Lines to be sent after the file contents has been sent (if a file was specified). This is very similar to initialtext, and can be given also as a multi-line string or as a reference to an array of lines.

  • linestart: If present, specifies a string that is prepended to each line as it is sent to the MUD.

  • lineend: If present, specifies a string that is appended to each line as it is sent to the MUD.

  • delay: The delay, in seconds, between each group of lines. If you are getting disconnected for sending too much text at once, increase this value. If not given, the value is taken from the Global Preferences (see Section 5.2).

  • linesatime: The number of lines to be sent at a time. If not given, the value is taken from the Global Preferences (see Section 5.2).

On success, returns true. If the file does not exist or cannot be open, this function does nothing and returns a false value. It returns undef if invalid parameters are specified.

You might also want to see the $world->sendlines and $world->sendfile functions which are simpler ways of sending several lines or the contents of a file at once, respectively.

kildclient-2.11.1/doc/C/kildclient/x3248.html0000644000175000017500000000472411570176766015415 00000000000000 $world->getcharacter

C.31. $world->getcharacter

$name = $world->getcharacter(void);

If autologin was used (see Section 4.1), this function returns the name of the character used to log in to the mud. If autologin is disabled, this function returns undef.

kildclient-2.11.1/doc/C/kildclient/c902.html0000644000175000017500000002257111570176765015301 00000000000000 Triggers

Chapter 8. Triggers

Triggers allow you to react automatically to text that comes from the MUD. This reaction can be of two forms: sending something to the MUD in reply, or doing something else with no direct interaction with the MUD, such as printing something in the screen.

Sometimes the action of a trigger is to change the line that was received and that activated the trigger. You might want to match all lines that contain a certain word (such as your character's name) and print these lines (or part of these lines) in a different color to draw attention. (This feature is sometimes called highlighting.) Additionaly, sometimes you might want to omit some lines, such as everything said by some annoying player, or some messages that are not relevant for you. This kind of trigger is often called a gag. Both these features are supported by KildClient.

Triggers are defined by specifying a pattern against which all lines received from the MUD are matched. If there is indeed a match, an action specified by you is executed. If the trigger is a gag, then the line that matched will not be printed in the screen, otherwise it is printed normally. (Note that printing actually happens before the action is executed, even if here things were described in another order for ease of understanding.)

The above description was very brief and was meant just to give a basic idea of how triggers work. Next follows a more detailed explanation of all aspects involving triggers.

8.1. Creating and Editing Triggers

The easiest way to create and alter triggers is from the World Editor, the place where all settings of a World are altered (see Chapter 4).

Trigger are defined in the Triggers section inside the Automation section. When you open that section, you'll see a list of the defined triggers and some buttons like this:

Figure 8-1. The graphical Trigger editor

The main part of the window is the list of defined triggers. The columns are as follows:

  • Enabled specifies whether the trigger is enabled or not. Triggers that are not enabled are not active and will not be tried when a line is received, but they remain in the list so that they can later be enabled again.

  • Name is a name that is assigned to a trigger. This helps you identify the trigger's purpose and is useful when editing a trigger via the command line (as described in Section 8.6.1). Assigning a name to a trigger is optional.

  • Pattern and Action are the parameters for the trigger, and they define the trigger's action, as described above.

  • I Case (for "Ignore Case"), if set, means the case is not considered while matching the pattern, that is, a case-insensitive match is done.

  • Gag defines if the line that matches the trigger will be printed. If this is active, the line is gaged (omitted) from the main screen.

  • Gag Log defines if the line that matches the trigger will be written to the log file. If this is active, the line is gaged (omitted) from the log file, if logging is enabled (see Chapter 14).

  • Keep Exec defines what happens when the trigger is matched. By default, if a trigger matches further matching of that line against other triggers is stopped. If, however, this option is active and the trigger matches, the line continues being tried against other triggers.

  • Rewriter defines if the trigger is a rewriter trigger, a special kind of trigger described in Section 8.5.1.

  • Plugin: if this is non-empty, it means that the trigger belongs to a plugin (and the name of the plugin is displayed). However, by default plugin triggers are not displayed. See Section 4.8 for information on how to display plugin triggers here.

8.1.1. Adding Triggers

To add a new trigger, press the Add button. This will open a window for you to edit the new trigger's parameters:

Figure 8-2. The window to edit triggers

What can be set represents the columns described above.

When you are finished, press OK and the trigger will be added. If you change your mind, press Cancel and the trigger will not be added.

The next sections will describe some things that can be done with triggers.

8.1.2. Editing Triggers

To edit a trigger, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding trigger (see Section 8.1.1) will be opened, filled with the trigger's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the trigger will remain as it was before.

Another shorter way to edit a trigger is to double click its line in the list.

It is also possible to change the value of the boolean options (those represented by a check box) directly from the trigger list. Make sure that the trigger you want to change is selected, and click in the check button. The state will be toggled.

To delete a trigger, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the trigger. If you want, you can disable this confirmation dialog (see Section 4.8), but if you do so and click the Delete button, the only way to undo your action will be creating the trigger again. To delete several triggers at once, select them all and press Delete.

The final thing that needs to be explained with regard to triggers is how to reorder them. Triggers as tried from the first one to the last, so in a few cases the order might matter. To move a trigger up or down in the list, select it and press the corresponding button.

kildclient-2.11.1/doc/C/kildclient/x4397.html0000644000175000017500000000455411570176767015425 00000000000000 Disposing Data When the Plugin Is Unloaded

E.3. Disposing Data When the Plugin Is Unloaded

If the plugin defines a function called UNLOAD, this function will be called when the plugin is unloaded. Currently this happens only when the World that loaded the plugin is closed.

If your plugin must dispose of anything it created that would be kept behind even when the World is closed, the UNLOAD function is the place to do that.

kildclient-2.11.1/doc/C/kildclient/x439.html0000644000175000017500000000666511570176764015340 00000000000000 Protocols

4.6. Protocols

The figure below shows the Protocols section of the World Editor:

Figure 4-8. The Protocols section of the World Editor

Here you can configure how KildClient uses some protocols to enhance the player's experience while playing the MUD. Currenly you can configure how KildClient behaves with regard to the MCCP protocol, which compresses data sent by the MUD so that less data needs to be sent.

By default, KildClient will use this protocol if the server proposes it, but only if this proposal comes in at most one minute after the connection has been established. This is done in order to prevent bad players from trying to crash your client by sending the special sequence that enables compression. Note, however, that well-written servers prevent the user from sending such sequences to other users. However, as compression is generally negotiated just after connecting, leaving this option in its default state, Enable if server proposes after connecting is recommended.

If Enable if server proposes at any time is selected, MCCP will be started whenever the start sequence is received, no matter at what time.

Finally, you can disable MCCP altogether by selecting Disable. This way sequences asking for compression will be ignored, and the server will never send compressed data. Attempts by malicious players will not succeed.

kildclient-2.11.1/doc/C/kildclient/x2915.html0000644000175000017500000000433311570176766015411 00000000000000 $world->close

C.3. $world->close

void $world->close(void);

Disconnects and closes the current world, immediately.

kildclient-2.11.1/doc/C/kildclient/x2406.html0000644000175000017500000001604211570176766015404 00000000000000 Advanced Features

15.2. Advanced Features

There are other things you can do besides simply chatting. These functions are accessed by typing some commands in the chat window. These commands start with /, but do not confuse them with the usage of / in the main KildClient window to run Perl commands.

Here are the commands and their actions:

/emote text

Sends text as an emote and not as a chat message, that is, sends a message in the form name text.

/chatall text

Sends text to all chat connections.

/emoteall text

Sends text as an emote to all chat connections.

/group group name

Makes this chat connection a member of the specified group.

/cg text

Sends text to all connections that are members of the group that this chat session belongs.

/eg text

Sends text as an emote to all connections that are members of the group that this chat session belongs.

/name nickname

Changes the chat nickname to the one given. This affects all chat sessions.

/color code

Changes the color used in this chat session to the one specified. code is a color code as recognized by the colorize function. Note that this affects only chat messages and the text you send, if the chat peer sends messages in another color, they will be displayed in the color the peer chose. This affects all chat sessions.

/stripansi

Strips ANSI color codes in messages received in this chat. That means that colors sent by the peer will not be displayed, and that even incoming messages will be displayed in your chat color.

/nostripansi

Does not strip ANSI color codes in messages received in this chat. That means that colors sent by the peer will be displayed.

/ping

Pings the other peer. If the connection is alive, they will reply to this request. Additionally, the time for the reply to be received is displayed.

/sendfile

Attemps to send a file to the peer. A dialog will be displayed for you to select the file to send, and the file will be offered. If they accept, the file transfer will start.

/stopfile

Stops the file transfer currently in progress.

/snoop

Asks the peer if you can snoop them, that is, see everything they see in their MUD session. If they accept, everything they see will be sent to you and displayed.

/allowsnoop

Allows the peer to snoop you, that is, they can see everything you see in your MUD session. Be careful with this command. By default snooping is not allowed to protect your privacy.

/noallowsnoop

Disallows the peer to snoop you, that is, they cannot see what you see in your MUD session. By default snooping is disabled, and this command is used to disable it again if you had enabled it.

/info

Shows some information about the chat session.

/hangup

Stops this chat session. You will need to connect again to continue talking.

As you can see, the chat offers much more than simply chatting. One of its features is file transfer. To send a file, use the /sendfile command, as descrived above. When your peer wants to send you a file, a dialog box will be displayed telling you the name and size of the file. If you want the file, select Yes and another dialog will be displayed for you to you can select where to store the file. The file transfer will then begin. Or you can refuse the file by clicking No. You can interrupt a file transfer in progress by using the /stopfile command.

By default, you are prompted whenever somebody wants to talk with you. If you want to avoid this question and automatically accept all chats, set the $chat::auto_accept_calls variable to 1 (that is, enter something like /$chat::auto_accept_calls = 1). This setting will be remembered. Set it to 0 to have the prompts again.

If, however, you do not want to chat with anyone, the best thing is to disable accepting connections. Just type /chat::noaccept. Use /chat::acceptcalls to accept calls again.

kildclient-2.11.1/doc/C/kildclient/x1764.html0000644000175000017500000002711211570176765015411 00000000000000 Defining Macros in the Command Line

10.2. Defining Macros in the Command Line

For those more used to Perl and to command lines, it is also possible to define and alter macros from the command line. This is done with a series of Perl function.

Macros are set defining, as mentioned above, a key and an action. The key is key keycode for the key you wish to assign the macro to. The easiest way to get the keycode for a given key is with the $world->getkeycode function. This function takes no parameters. When run, it prompts you to press a key, and then prints the keycode for the key. It also returns the keycode as a string, so you can save it in a variable and use when defining the macro.

Here's a way to define a macro:

Example 10-1. Defining a macro


/$key = $world->getkeycode
Press a key to get its keycode.
Press the F5 key
Key code: F5
/$world->macro($key, 'drink from fountain')

The above session shows how to assign drink from fountain to the F5 key. Note that $world->getkeycode prompts you for a key and prints its keycode. Additionally, the keycode is returned, and it is stored in the $key variable. This variable is used as the first argument to the $world->macro function, that takes two arguments: the keycode and the action. We could have entered 'F5' directly, but using the keycode returned by $world->getkeycode is easier and less error-prone.

That's pretty much all about defining macros. They do not take arguments, it is all about executing simple commands. Other things that could be done are executing several commands (separating them with %;) or executing a Perl statement or function.

10.2.1. Editing Macros

Before going into editing, let us see how to get a list of all macros that are currently defined for the World. Just use the $world->listmacro function without arguments. You will be presented with a list of the currently defined macros.

There are four columns: Num is the number of the macro. Macros are numbered sequentially starting at zero. This number will be useful when we start editing them. After that, Ena tells whether the macro is enabled. Macros that are disabled are not executed even if the key is pressed. This is a nice way to stop a macro from working, but keep it stored for later use. We will see how to enable and disable macros later in this section. The final two columns list the keycode and action of the alias.

The listing produced by $world->listmacro is compact, showing all macros but possibly truncating the keycode and/or action. If you give a macro number as argument to listmacro, it will display that macro's information detailedly.

To edit a macro, you need to know that macro's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->getmacronumber can be used to discover a macro's number if its name is known.) The same function used to add macros can also change existing ones, you just need to pass the macro number as the first argument.

Calling $world->macro(number, new keycode) changes the key of the macro with that number. If you want to change the key and action, include the substitution as a third argument: $world->macro(number, new key, new action). What if you want to change only the action? Since passing only one string argument would change the key, this is done in a different way. In brief, this is how you would change only the key: $world->macro(number, { action => new action }). Notice that the key is passed as an attribute inside the curly braces. It is also possible to change the key this way, just use the attribute key.

The only attribute for macros, besides the key and action, is enabled. It was mentioned briefly when we described how to list macros. It can be set just like the other attributes and is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the macro is run normally. When it is zero, even if the key is pressed, the macros is not run. This way, disabling an alias effectively turns if off, as if it did not exist, but the macro is still saved, and can be turned on again when necessary.

Here's an example of disabling a macro (number 3 in this case):

Example 10-2. Disabling a macro, the long way


$world->macro(3,
              { enabled => 0 })

However, there is a shorter way: the $world->dismacro function disables the meacro whose number is passed as argument. So the example above can be rewritten in a shorter way as:

Example 10-3. Disabling a macro, the short way


$world->dismacro(3)

The corresponding function $world->enamacro enables the specified macro.

It is also possible to temporarily disable all macros. Just use the menu Preferences->Disable Macros and this will prevent macros from running. This does not change the "enabled" status of any macros, it just prevents all macros from running. When you select the menu again, macros that were enabled will run again, and those that were disabled will remain disabled.

There are times when you want to delete a macro. This is easy to do, use the $world->delmacro function. It takes as argument the number of the macro you wish to delete. Be aware that once deleted it is not possible to recover the macro (unless you create it again). Many times just disabling the macro is a better idea. The second thing to note is that when you delete a macro the numbers of the other macros may change, so be careful when you try to delete several macros in sequence.

10.2.2. Assigning Names to Macros

It is possible to assign names to macros. When a macro has a name, you can enable, disable, or delete it using its name instead of its number.

To assign a name to a macro, specify the name attribute when creating it:

Example 10-4. Creating a macro with a name


$world->macro($key, 'drink from fountain',
              { name => 'drink' })

You can now disable this macro with $world->dismacro('drink'). The name can also be used in the $world->enamacro, $world->delmacro and $world->listmacro functions.

It is also possible to assign a name to an existing macro. Just edit it as described in Section 10.2.1, passing the name attribute. Use this same process to change the name of a macro.

Another feature of macro names is that several macros can have the same name. In this case, all these macros will be treated as a single group. The functions above, when passed a macro name, will act upon all macros of the group, that is, on all macros with that name.

10.2.3. Reordering Macros

Macros are tried from the first to the last, so in some cases the order of the macros matters. It is possible to move an macro to another position with the $world->movemacro function.

The function takes two parameters: the first is the name or number of the macro that you want to move. The second is the new position that the macro will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of macros, the macro will be moved to the end of the list.

If there are several macros with the same name, only the first one found will be moved. And when an macro is moved, other macros might move up or down to accomodate the change.

kildclient-2.11.1/doc/C/kildclient/x4330.html0000644000175000017500000000436011570176767015403 00000000000000 KCWin::get_text

D.2. KCWin::get_text

$text = KCWin::get_text(void);

Returns the text in the entry box.

kildclient-2.11.1/doc/C/kildclient/x135.html0000644000175000017500000001073411570176764015321 00000000000000 Closing Worlds and Exiting KildClient

3.3. Closing Worlds and Exiting KildClient

When you are disconnected from a World (either because you requested it, with the quit command or something similar, or because the server has gone down), you will see a dialog box from which you can choose from four options: Reconnect will attempt to reconnect to the same World (using the same character for auto-login, if there is more than one defined, see Section 4.1). Connect to another world will open the World Selection dialog (see Section 3.1) for you to choose another World to connect to. Offline will keep the world open so that you still see its output or execute some things with Perl. Finally, Close will close the tab for that World. If that was the only open World, KildClient will exit when you press Close.

You can force disconnection from a World with the World->Disconnect menu. Note that this is not the recommended way to leave a MUD, but it might be necessary in other cases. The same dialog with the three options will be shown.

If you choose World->Close from the menu, the current World will be forcedly disconnected and automatically closed (just as if you had selected Close from the dialog). If this is the only open World, KildClient will be exited.

To close all open Worlds and exit KildClient immediately, select World->Quit from the menu.

These operations can also be run with Perl. To disconnect from a World, use the $world->dc (that is, type /$world->dc in the command box). To close the World, use $world->close. And to quit KildClient closing all Worlds, use quit (type /quit, as you might imagine). The reason quit does not have $world-> in front will be explained in Section 7.1, but for now suffices to say that since it operates on all Worlds (and not in one specific one), it does not have that.

kildclient-2.11.1/doc/C/kildclient/x3499.html0000644000175000017500000000516511570176767015426 00000000000000 $world->ispermanent

C.48. $world->ispermanent

$return = $world->ispermanent( var );

This function tests if a variable is permanent. The return value is true or false depending on the variable's status.

The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation.

kildclient-2.11.1/doc/C/kildclient/x993.html0000644000175000017500000002544311570176765015341 00000000000000 Basic Triggers

8.2. Basic Triggers

The simplest kind of trigger specifies only a pattern and an action. Below these parameters are described in detail.

What exactly is pattern? It is a regular expression. In short, a regular expression is a way to specify text patterns that are looked for in the lines that the server sends. If you know Perl, you certainly know what is a regular expression. If not, it is advised that you look for some more information on it, there are plenty of tutorials on the Internet. For those who know them, you can use the full power of Perl's regular expressions in triggers, because Perl is used for the matching.

What about the action? It can be anything that could be entered in the command line. It can be a simple command, that is sent to the MUD. Or you can send several commands at separating them with %; as described in Section 3.2. Finally, you can execute some Perl code when a trigger matches, and this allows you to do virtually anything you want.

Below is an example of a very simple trigger. To create this trigger, inform the Pattern and Action parameters shown below. Leave the other parameters in their default values.

Example 8-1. A very simple trigger

  • Pattern: has attacked you!

  • Action: wield sword

Whenever a line that contains the phrase "has attacked you!" is received, the command "wield sword" will be automatically be sent. Note that in this case the received line will probably be something like "An orc has attacked you!", but the trigger matches because that line contains the pattern. This is a feature of regular expressions. If you want to match the entire line and not only part of it, you must use the ^ and $ anchors in the beginning and end, respectively.

By default, case is considered when matching: if the server sent a line saying "Has Attacked" then there would be no match. To make case be ignored when matching, check the Ignore case when matching option.

It is also possible for the action to be executed to depend on what was received from the server. This is better explained by an example:

Example 8-2. A trigger which captures part of the received line and uses it in the action

  • Pattern: ^(.*) has attacked you!$

  • Action: cast missile $1

There are two new things in the pattern. The first one is that is surrounded by ^ and $ which means that the entire line must match, as described previously. The other new thing (and the one that concerns us at this moment) is the (.*) part. In regular expressions, the dot means to match any character. The asterisk means zero or more of the previous element. So the combination .* means zero or more of any characters. Essentially, it matches anything. The brackets () around any part of a regular expression captures part of the string to be used afterwards. So the whole regular expression means: look for a line that contains something followed by has attacked you!. What comes before has attacked you! is stored for later use.

This stored string is then used in the action by means of the $1 construct. This special placeholder is substituted by what was captured in the matched string. So if the line Orc has attacked you! is received, cast missile Orc is send. If Smaug has attacked you! is received, then cast missile Smaug is sent to the World, and so on.

It is possible to have more than one captured string in the pattern. In this case, $1 is replaced by what was captured in the first group, $2 by the second group, and so on.

Sending commands to the World is useful, but the real power is the fact that you can also run Perl commands in response to triggers. Just enter them as you would in the command box: prefixed by /. If the action is simple you can enter the statements there directly, if not, you can define a function in your script file and call it from the trigger.

Let us rewrite Example 8-2 to use Perl in the action:

Example 8-3. A trigger with an action in Perl

  • Pattern: ^(.*) has attacked you!$

  • Action: /$world->send("cast missile $_[1]")

This time, when a line consisting of some arbitrary text followed by "has attacked you!" is received, the $world->send will be called to send some text to the World.

You may have noticed that here $_[1] was used instead of $1 in the action to represent the first captured bracketed group. The reason for this is complex, and if you do not want to worry about the inner workings, just use the following rule: in commands sent to the mud, use $1, $2, etc., and in actions that are Perl commands, use $_[1], $_[2] and so on.

Here are the details for the different syntaxes. Feel free to skip the next two paragraphs:

When a trigger matches, KildClient substitutes $1 (and the other placeholders) by the captured expressions from the received line. However, $_[1] (and the other similar tokens) are not replaced by KildClient. If the action is just a string sent to the mud, they would not be replaced, so the only possibility to use the captured groups is with the $1 syntax. But Perl commands can access the captured groups in another way: the strings are stored in the @_ array. The first position, $_[0] contains the whole matched line. Subsequent positions contain each matched grouped expression, so $_[1] is the first bracketed substring, $_[2] is the second, and so on. This way, when a Perl command is executed the values are replaced by the Perl interpreter itself.

It is also possible to use $1 in commands to be passed to the Perl interpreter. Most of the time it will work, but in some specific circumstances you may get unexpected results. So it's preferable to let Perl do the substitution when commands are to be run by the Perl interpreter.

If you call a sub-routine as the trigger action, the matched arguments are not automatically passed, so you need to pass them manually. Since they are in the array @_, just pass that whole array as the argument to the sub-routine. Inside the sub-routine, they will be available as the sub-routine's arguments, which incidentally means that they will be accessed in the exact same way: with $_[1], $_[2] and so on. Alternatively, you can only pass the parameters that you need instead of the whole array.

Here's an example of a trigger that calls a sub-routine:

Example 8-4. A trigger that calls a sub-routine

  • Pattern: ^(.*) has attacked you!$

  • Action: /myGreatAttackSequence(@_)

Naturally, you need to define the myGreatAttackSequence sub-routine in your script file. It will be called as the result of the trigger. The @_ array, containing the whole matched line and the matched bracketed expressions is passed to the sub-routine as argument, and its contents will be available to the sub-routine as its parameters.

kildclient-2.11.1/doc/C/kildclient/x3362.html0000644000175000017500000000437311570176767015413 00000000000000 $world->getname

C.41. $world->getname

$name = $world->getname(void);

This function returns the name of the world.

kildclient-2.11.1/doc/C/kildclient/x3632.html0000644000175000017500000000641311570176767015410 00000000000000 $world->loadplugin

C.56. $world->loadplugin

$success = $world->loadplugin( name );

$success = $world->loadplugin( file );

Loads a plugin. You can either pass a full path for the file that defines the plugin, or just its name. If you provide only the name, a file with that name (and the extesion .pl, if the extension is not already provided) will be looked for in the directories specified by the @PLUGINDIRS array. By default, this array contain two directories: one where KildClient stores some of its files (generally /usr/local/share/kildclient/plugins) and one in the user's home directory (~/.kildclient/plugins), but feel free to add more directories to search plugins for.

This function returns true if the plugin was successfully loaded, and false otherwise (including the case in which the plugin was already loaded). See also $world->requireplugin for a way to load a plugin unless it is already loaded.

kildclient-2.11.1/doc/C/kildclient/x3178.html0000644000175000017500000000433211570176766015412 00000000000000 $world->enaplugin

C.25. $world->enaplugin

void $world->enaplugin( name );

Enables the specified plugin.

kildclient-2.11.1/doc/C/kildclient/x3371.html0000644000175000017500000000457611570176767015420 00000000000000 $world->getpluginversion

C.42. $world->getpluginversion

$version = $world->getpluginversion( name );

This functions returns the version of the plugin with the given name. If no plugin with that name is loaded, it returns an empty string.

kildclient-2.11.1/doc/C/kildclient/x723.html0000644000175000017500000000432011570176765015317 00000000000000 Help Menu

6.6. Help Menu

6.6.1. Help

This commands opens a browser showing the KildClient manual (which you are reading now).

6.6.2. About

This commands shows a window with some information about the program.

kildclient-2.11.1/doc/C/kildclient/x2735.html0000644000175000017500000000463211570176766015413 00000000000000 gotow

A.4. gotow

void gotow( number );

void gotow( name );

Focuses the Nth world (when called with a number) or the world with the given name (when called with a string). The first world is numbered 0.

kildclient-2.11.1/doc/C/kildclient/x3972.html0000644000175000017500000000502311570176767015413 00000000000000 $world->send

C.74. $world->send

void $world->send( str , ... );

Sends any number of strings to the current world. After each string, a newline is send, so that the MUD recognizes it as a command.

See also $world->echo, $world->sendecho and $world->sendnoecho.

kildclient-2.11.1/doc/C/kildclient/c507.html0000644000175000017500000001061311570176764015273 00000000000000 Configuring KildClient

Chapter 5. Configuring KildClient

The previous Chapter described how to configure a World. Those settings are individual for each World. There are some settings, however, that apply to KildClient as a whole, which will be described in this chapter.

To access those settings, use the Preferences->Preferences menu. The following sections will describe the groups in the Preferences dialog.

5.1. Appearance

The figure below shows the Appearance section of the Preferences dialog:

Figure 5-1. The Appearance section of the Preferences dialog

In this section you configure the colors that KildClient uses for its own purposes. (The configuration of the colors that the MUD displays is explained in Section 4.2.2.)

Two colors can be configured: Informative messages is the color used by KildClient to print messages about the status of the connection, such as the ones showing that a connection is being tried or has succeeded. Command echo specifies the color in which the commands you send to the World are printed in the screen (if this feature is enabled, see Section 4.7).

In each case, select from the drop-down list the color you want. Note that the actual color that is displayed depends on how it was configured in the World Editor (see Section 4.2.2).

How the tabs representing the open worlds are displayed is configured here. They can be at the top, bottom, left or right. Select the one you want from the combo box. You can also select whether to show tabs if there is only open open world, or hide the whole tab bar in this case.

Finally, you can enable or disable the Flash window when new text is received feature. When it is enabled, if text is received in the mud while you are at another window, KildClient's window will flash to draw your attention. If disabled, you can still know that new text has been received because the titlebar will have a (*) prepended. Note, however, that the exact behaviour of this feature might depend on your Window Manager, and that some window managers do not do anything for windows with the "Urgent" flag set.

kildclient-2.11.1/doc/C/kildclient/x4379.html0000644000175000017500000001111211570176767015411 00000000000000 A Sample Plugin

E.2. A Sample Plugin

Here is a simple but complete plugin. It will be used to illustrate many things about plugins.

Example E-1. A Sample Plugin


package sample;
#: Version: 1.0
#: Description: A Sample Plugin
#: Author: Eduardo M Kalinowski

$::world->trigger('First', 'of the plugin', { name => 'sample:misc' });
$::world->trigger('Second', 'of the plugin', { name => 'sample:misc' });

$::world->timer({ interval => 5, action => 'sample plugin',
                  name => 'sample:misc' });

$::world->macro('F8', '/sample::stop',  { name => 'sample:enadis' });
$::world->macro('F9', '/sample::start', { name => 'sample:enadis' });


sub testplugin {
  $::world->echonl("The plugin works.");
}

sub stop {
  $::world->distimer('sample:misc');
}

sub start {
  $::world->enatimer('sample:misc');
}

sub help {
  $::world->echonl("This is a sample plugin, that does nothing useful.");
  $::world->echonl("It outputs a short string every now and them. This");
  $::world->echonl("behaviour can be stopped by pressing the F8 key, and");
  $::world->echonl("re-enabled with the F9 key.");
  $::world->echonl("One function is defined: sample::testplugin. It");
  $::world->echonl("outputs something to show that the plugin is working.");
}

The first thing in the file is the header, in the format described above. then comes trigger, timer, and macro definitions. All definitions of triggers, aliases, macros, timers, hook and permanent variables, if any, should be in the top-level scope (which means they will be executed when the plugin is loaded). (Alternatively, you could put them in a BEGIN block, which would have the same result, but there isn't a reason for that.) You should not create any of those objects in any function.

It should be noted that the $world variable is refereed as $::world. It is just because we are inside a package, and $world does not belong to this package. Otherwise, the calls are equal.

After that, some functions are defined. testplugin is meant to be called by the user. stop and start are used by the macros (but they could also be called by the user). Finally, a help is defined, that outputs some information about the plugin. All plugins should define a help describing themselves.

kildclient-2.11.1/doc/C/kildclient/x3237.html0000644000175000017500000000530411570176766015406 00000000000000 $world->getaliasnumber

C.30. $world->getaliasnumber

@list = $world->getaliasnumber( name );

Returns a list with the number(s) of the alias(es) matching the given name. If no alias with that name is found, returns an empty list. If there are several aliases with the same name, returns the numbers of all of them.

The number of an alias is necessary to edit it. However, as the user can change the order of aliases, create new ones and delete old aliases, an alias's number may change, so you should not store its number; you must fetch the number just before editing it.

kildclient-2.11.1/doc/C/kildclient/x1585.html0000644000175000017500000002720211570176765015412 00000000000000 Defining Aliases in the Command Line

9.3. Defining Aliases in the Command Line

For those more used to Perl and to command lines, it is also possible to define and alter aliases from the command line. This is done with a series of Perl function.

Aliases are defined with the $world->alias function. This function works similarly to $world->trigger (described in Chapter 8).

The simplest way to call the function is with two arguments: $world->alias(pattern, substitution). This defines an alias with the given pattern and substitution. For example, the alias described in Example 9-1 would be created as follows:

Example 9-5. A simple alias defined in the command line


$world->alias('^df$', 'drink from fountain')

Like the $world->trigger function (see Section 8.6), you can specify extra arguments to control advanced alias features. One such argument is perleval that causes the substitution to be evaluated as a Perl statement. The alias defined in Example 9-4 can also be created as follows:

Example 9-6. An alias whose substitution is evaluated (in the command line)


$world->alias('calc\((.*)\)', 'eval "$1"',
              { perleval => 1})

See the difference? There is a third parameter, enclosed in curly braces {}, with the word perleval, an arrow, and the number 1. What that means is that perleval has the value 1, or, as usual in computer languages, is true. (False would be zero.)

To specify a case-insensitive match, use the ignorecase attribute.

9.3.1. Editing Aliases

Before going into editing, let us see how to get a list of all aliases that are currently defined for the World. Just use the $world->listalias function without arguments. You will be presented with a list of the currently defined aliases.

There are four columns: Num is the number of the alias. Aliases are numbered sequentially starting at zero. This number will be useful when we start editing aliases. After that, Ena tells whether the alias is enabled. Aliases that are disabled are not tried. This is a nice way to stop an alias from working, but keep it stored for later use. We will see how to enable and disable aliases later in this section. The final two columns list the pattern and substitution of the alias.

The listing produced by $world->listalias is compact, showing all aliases but possibly truncating the pattern and/or substitution. If you give an alias number as argument to listalias, it will display that alias's information detailedly.

To edit an alias, you need to know that alias's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->getaliasnumber can be used to discover an alias's number if its name is known.) The same function used to add aliases can also change existing ones, you just need to pass the alias number as the first argument.

Calling $world->alias(number, new pattern) changes the pattern of the alias with that number. If you want to change the pattern and substitution, include the substitution as a third argument: $world->alias(number, new pattern, new substitution). What if you want to change only the substitution? Since passing only one string argument would change the pattern, this is done in a different way. In brief, this is how you would change only the substitution: $world->alias(number, { substitution => new substitution }). Notice that the substitution is passed as an attribute inside the curly braces. It is also possible to change the pattern this way, just use the attribute pattern.

One other attribute of aliases is enabled. It was mentioned briefly when we described how to list aliases. It can be set just like the other attributes and is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the alias is tried normally. When it is zero, commands are not tried against it. This way, disabling an alias effectively turns if off, as if it did not exist, but the alias is still saved, and can be turned on again when necessary.

Here's an example of disabling an alias (number 3 in this case):

Example 9-7. Disabling an alias, the long way


$world->alias(3,
              { enabled => 0 })

However, there is a shorter way: the $world->disalias function disables the alias whose number is passed as argument. So the example above can be rewritten in a shorter way as:

Example 9-8. Disabling an alias, the short way


$world->disalias(3)

The corresponding function $world->enaalias enables the specified alias.

It is also possible to temporarily disable all aliases. Just use the menu Preferences->Disable Aliases and this will prevent aliases from being used. This does not change the "enabled" status of any aliases, it just prevents all aliases from being executed. When you select the menu again, aliases that were enabled will be matched again, and those that were disabled will remain disabled.

There are times when you want to delete an alias. This is easy to do, use the $world->delalias function. It takes as argument the number of the alias you wish to delete. Be aware that once deleted it is not possible to recover the alias (unless you create it again). Many times just disabling the alias is a better idea. The second thing to note is that when you delete an alias the numbers of the other aliases may change, so be careful when you try to delete several aliases in sequence.

9.3.2. Assigning Names to Aliases

It is possible to assign names to aliases. When an alias has a name, you can enable, disable, or delete it using its name instead of its number.

To assign a name to an alias, specify the name attribute when creating it:

Example 9-9. Creating an alias with a name


$world->alias('^df$', 'drink from fountain',
              { name => 'drink' })

You can now disable this alias with $world->disalias('drink'). The name can also be used in the $world->enaalias, $world->delalias and $world->listalias functions.

It is also possible to assign a name to an existing alias. Just edit it as described in Section 9.3.1, passing the name attribute. Use this same process to change the name of an alias.

Another feature of alias names is that several aliases can have the same name. In this case, all these aliases will be treated as a single group. The functions above, when passed an alias name, will act upon all aliases of the group, that is, on all aliases with that name.

9.3.3. Reordering Aliases

Aliases are tried from the first to the last, so in some cases the order of the aliases matters. It is possible to move an alias to another position with the $world->movealias function.

The function takes two parameters: the first is the name or number of the alias that you want to move. The second is the new position that the alias will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of aliases, the alias will be moved to the end of the list.

If there are several aliases with the same name, only the first one found will be moved. And when an alias is moved, other aliases might move up or down to accomodate the change.

kildclient-2.11.1/doc/C/kildclient/x3897.html0000644000175000017500000000454111570176767015425 00000000000000 $world->next

C.68. $world->next

void $world->next( [number] );

If used without arguments, this function focuses the next open World. You can also give a numeric argument X, in this case it focuses the Xth World after the current one.

kildclient-2.11.1/doc/C/kildclient/x4130.html0000644000175000017500000000545011570176767015402 00000000000000 $world->timerenabled

C.81. $world->timerenabled

result = $world->timerenabled( name/number );

This functions checks whether the specified timer exists and whether it is enabled.

You can pass either a timer number or name. If the timer does not exist, this function returns undef, so you can distinguish the case of a non-existant timer from a disabled one.

If the timer exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several timers with the same name, it returns a list with one value for each timer with that name, and each value is 0 or 1 depending on the state of the timer.

kildclient-2.11.1/doc/C/kildclient/x645.html0000644000175000017500000001432311570176765015326 00000000000000 Input Menu

6.3. Input Menu

6.3.1. Clear

This command clears the command entry box. The same can be achieved by using the button to the left of the command entry box.

6.3.2. Previous and Next

These commands retrieve the previous or next command in the history, putting them in the command input box. They are equivalent of pressing Alt+Up or Alt+Down (or just the arrows, in some circunstances).

6.3.3. Find Previous and Find Next

These commands search the command history for a command that starts with the text that is in the input bar. To use that feature, enter the first characters of the command you want to retrieve and select Find Previous. You can navigate through other commands starting with that prefix with these menu entries.

6.3.4. Command History

This command allows you to review the commands that have been sent recently, and send one or more commands again. When you select the menu item, a dialog like this appears:

Figure 6-1. Command History Dialog

The list on the left shows the commands which are saved. You can configure how many commands are saved, see Section 4.3.

To send again commands to the World, select the commands you would like to send and press Send. Since most MUDs cannot handle too much user input at once and disconnect you in this case, you can add a delay after each sent command, so that the commands are not sent all at once, but with pauses. You can specify the delay and also how many commands are sent at one time. The delay is added after each group of sent commands.

You can also press Send & Close to send the selected commands and close the dialog afterwards.

You can also put a command in the command entry box to edit it. To do so, select a command (in this case you must select only one) and press Recall. If you press Recall & Close instead, the command is recalled and the dialog is closed.

To search for commands containing a given string, used the Find and Find Next buttons. Use the former one to start a search, and the later to find more commands with the string. To start another search, use Find again.

6.3.5. Multi-line Send

This command allows you to send several lines of output and/or a file to the World. When you select the menu item, a dialog like this appears:

Figure 6-2. Multi-Line Send

You can send a file to the World, and you can also send text before and after the file if you need. Naturally, you can also send only some text without sending a file. Just leave the fields you don't need blank.

It is also possible to prefix all the lines with a string (such as chat), or to add a string to the end of all lines. If you want that, fill in the appropriate fields, if not, just leave them blank.

Most MUDs cannot handle too much user input at once and disconnect you in this case. To avoid that, you can add a delay after each sent lines, so that the text is not sent all at once, but with pauses. You can specify the delay and also how many lines are sent at one time. The delay is added after each group of sent lines.

If you select "Keep dialog open after sending", the dialog will not be closed after the text starts to be sent, so you can make further changes to the text.

6.3.6. Test Triggers

This command brings up the Test Triggers window, which is described in Section 8.8.

kildclient-2.11.1/doc/C/kildclient/x2954.html0000644000175000017500000000454311570176766015417 00000000000000 $world->connectother

C.6. $world->connectother

void $world->connectother(void);

This function allows you to select another World to connect to, using the same window. If you are connected, you will be first disconnected from the current server.

kildclient-2.11.1/doc/C/kildclient/x3259.html0000644000175000017500000000444711570176766015421 00000000000000 $world->getconntime

C.32. $world->getconntime

$seconds = $world->getconntime(void);

This function returns the time spent connected to the world, in seconds.

kildclient-2.11.1/doc/C/kildclient/x3653.html0000644000175000017500000000610011570176767015404 00000000000000 $world->logfile

C.57. $world->logfile

void $world->logfile( file , [timeformat] );

Starts logging to the given file. Everything output by the mud will be saved. If timeformat is specified, it is considered a string to be passed to the C strftime() function, with special tags that are replace with the current time and/or date, and the resulting string is prefixed to each line. (See the strftime manual page for the possible tags.) If this argument is not given, nothing is prefixed to the lines.

It is not possible to log to more than one file at one time, if there is already a log file open, it will be closed and logging will continue to the new file.

void $world->logfile(void);

With no arguments, this function stops logging output.

kildclient-2.11.1/doc/C/kildclient/x3571.html0000644000175000017500000000463511570176767015416 00000000000000 $world->listpermanent

C.52. $world->listpermanent

void $world->listpermanent(void);

This function prints a list of all variables that are defined as permanent, that is, variables that will be saved when you close the world and have their values restores when the world is re-opened.

kildclient-2.11.1/doc/C/kildclient/x550.html0000644000175000017500000000605511570176764015323 00000000000000 External Programs (Linux)

5.3. External Programs (Linux)

This section of the Preferences dialog only appears when KildClient is run in Linux.

The figure below shows the External Programs section of the Preferences dialog:

Figure 5-3. The External Programs section of the Preferences dialog

In this section you can configure the command that will be run when you right-click in a URL that appears in the MUD window and select Open Link. The command will be executed, with %s replaced with the URL's address. The ampersand (&) in the end means that the command is to be executed in the background, so that you can continue using KildClient while browsing the URL.

You can also set a command used to play audio files (see Section 7.3). Enter the command, with %s in the place of the file path. The default should work (it uses the SOX program, which is usually installed), but you can use other commands if you use ALSA, ARTS, ESD, JACK, etc.

kildclient-2.11.1/doc/C/kildclient/x4241.html0000644000175000017500000000551211570176767015404 00000000000000 $world->triggerenabled

C.83. $world->triggerenabled

result = $world->triggerenabled( name/number );

This functions checks whether the specified trigger exists and whether it is enabled.

You can pass either a trigger number or name. If the trigger does not exist, this function returns undef, so you can distinguish the case of a non-existant trigger from a disabled one.

If the trigger exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several triggers with the same name, it returns a list with one value for each trigger with that name, and each value is 0 or 1 depending on the state of the trigger.

kildclient-2.11.1/doc/C/kildclient/p12.html0000644000175000017500000002630711570176766015230 00000000000000 KildClient User's Guide

I. KildClient User's Guide

Table of Contents
1. Introduction
2. Running KildClient
3. Basic Usage
3.1. Connecting to a MUD
3.2. Interacting with the MUD
3.3. Closing Worlds and Exiting KildClient
3.4. Reviewing and Searching Text
4. Editing a World
4.1. General
4.2. Display settings
4.2.1. Main Window
4.2.2. Colors
4.2.3. Status Bar
4.3. Input
4.4. Logging
4.5. Automation
4.5.1. Scripting
4.6. Protocols
4.7. Miscellaneous
4.8. Advanced
5. Configuring KildClient
5.1. Appearance
5.2. Sending
5.3. External Programs (Linux)
5.4. Proxy
6. Menu Reference
6.1. World menu
6.1.1. Open
6.1.2. Reconnect
6.1.3. Disconnect
6.1.4. Connect to Another
6.1.5. Close
6.1.6. Edit
6.1.7. Save
6.1.8. Statistics
6.1.9. Previous and Next
6.1.10. Quit
6.2. Edit Menu
6.2.1. Cut
6.2.2. Copy
6.2.3. Paste
6.2.4. Delete
6.2.5. Find and Find Next
6.3. Input Menu
6.3.1. Clear
6.3.2. Previous and Next
6.3.3. Find Previous and Find Next
6.3.4. Command History
6.3.5. Multi-line Send
6.3.6. Test Triggers
6.4. Preferences Menu
6.4.1. Disable Triggers, Aliases, Macros or Timers
6.4.2. Debug Matches
6.4.3. Preferences
6.4.4. Edit Default World
6.5. Diplay Menu
6.5.1. Split screen
6.6. Help Menu
6.6.1. Help
6.6.2. About
7. Using Perl in KildClient
7.1. The Basics
7.2. Echoing and Sending Text
7.2.1. Paths and Speed-Walking
7.3. Playing Sounds
7.4. Saving Variables Permanently
7.4.1. Permanent Variables in the Command Line
7.5. Controlling Worlds with Perl
8. Triggers
8.1. Creating and Editing Triggers
8.1.1. Adding Triggers
8.1.2. Editing Triggers
8.2. Basic Triggers
8.3. Changing the Style of the Matched Text
8.4. Gags
8.5. Other trigger features
8.5.1. Rewriter Triggers
8.6. Defining Triggers in the Command Line
8.6.1. Editing Triggers
8.6.2. Assigning Names to Triggers
8.6.3. Reordering Triggers
8.7. Importing and Exporting
8.8. Testing Triggers
9. Aliases
9.1. Creating and Editing Aliases
9.1.1. Adding Aliases
9.1.2. Editing Aliases
9.2. Using Aliases
9.2.1. Advanced Features
9.2.2. Using Perl in Aliases
9.3. Defining Aliases in the Command Line
9.3.1. Editing Aliases
9.3.2. Assigning Names to Aliases
9.3.3. Reordering Aliases
10. Macros
10.1. Creating and Editing Macros
10.1.1. Adding Macros
10.1.2. Editing Macros
10.2. Defining Macros in the Command Line
10.2.1. Editing Macros
10.2.2. Assigning Names to Macros
10.2.3. Reordering Macros
11. Timers
11.1. Creating and Editing Timers
11.1.1. Adding Timers
11.1.2. Editing Timers
11.2. Defining Timers in the Command Line
11.2.1. Editing Timers
11.2.2. Assigning Names to Timers
11.2.3. Reordering Timers
12. Hooks
12.1. Creating and Editing Hooks
12.1.1. Adding Hooks
12.1.2. Editing Hooks
12.2. Defining Hooks in the Command Line
12.2.1. Editing Hooks
12.2.2. Assigning Names to Hooks
13. Plugins
13.1. Loading Plugins from the Command Line
13.1.1. Enabling and Disabling Plugins
13.2. Getting Information About Plugins
13.3. Standard Plugins
13.3.1. easypath
13.3.2. keypad
13.3.3. notes
13.3.4. kc256
13.3.5. channels
13.3.6. Other Plugins
14. Logging the Output
15. Using the Chat
15.1. Basic Usage
15.2. Advanced Features
15.3. Chat Functions
kildclient-2.11.1/doc/C/kildclient/x2790.html0000644000175000017500000000443011570176766015410 00000000000000 stripcolorize

A.9. stripcolorize

$stripped = stripcolorize( str );

Returns the string stripped of any sequences used by colorize to add color to it.

kildclient-2.11.1/doc/C/kildclient/x3084.html0000644000175000017500000000457111570176766015413 00000000000000 $world->distrigger

C.18. $world->distrigger

void $world->distrigger( number/name , ... );

Disables the trigger identified by number or name. If there are several triggers with the same name, disables them all. Several arguments can be passed at once.

kildclient-2.11.1/doc/C/kildclient/x3988.html0000644000175000017500000000516511570176767015431 00000000000000 $world->sendecho

C.75. $world->sendecho

void $world->sendecho( str , ... );

Sends any number of strings to the current world. After each string, a newline is send, so that the MUD recognizes it as a command.

The commands are always echoed to the window, regardless of the setting of the command echo option (see Section 4.7).

See also $world->send and $world->sendnoecho .

kildclient-2.11.1/doc/C/kildclient/x331.html0000644000175000017500000001534511570176764015322 00000000000000 Input

4.3. Input

The figure below shows the Input section of the World Editor:

Figure 4-5. The Input section of the World Editor

The first section, Command Entry, controls the behaviour of the command entry textbox:

  • Keep last typed command in command entry box, causes the entry box not to be cleared when you press ENTER. The command you have just sent will be kept and can be repeated just by pressing ENTER again. It will be selected, so you can start typing another command to erase it.

  • Echo sent commands in terminal window controls whether the commands that are sent to the MUD are also echoed to the MUD window.

  • Store commands between sessions controls whether the commands you type are saved when you quit and restored when you load the world again.

  • Never hide typed text is useful with a few servers that intend to do the command echoing themselves. The sympton is that all the text typed is displayed as black dots (as if it was a password). If this happens to you, enable this option and the text will be visible.

  • Number of commands to save in history specifies the number of commands that are saved and can be recalled with the arrow keys, with the button to the right of the entry box, or with command completion. If this is set to too high a number, KildClient will consume more memory.

  • Command separator allows you to configure the token used to separate commands. By default it is %;.

  • Use single-line input bar and Use multi-line input bar define the size of the input bar. If set to single-line, it will have only one line, and if you type more text than fits the width, the text will scroll horizontally. If, however, you select a multi-line input bar, the bar will have two or more lines, and text will wrap and be displayed in the next line. (Scroll-bars may be displayed if there is more text than fits.)

    If set to multi-line, you can specify how many lines to reserve for the input bar, from two to ten.

  • Enable auto-completion controls whether the auto-completion feature (see Section 3.2) is enabled or not. However, auto-completion only works for single line input bars.

  • When auto-completion is enabled, you can specify after how many characters have been typed it will be activated. Just enter the number in the text box Activate auto-completion only after X characters have been entered.

  • Spell check typed text, if checked, enables the built-in spell checker. This spell checker works only with the multi-line input bar. If it is active, misspelled words are highlighted with a red line below them. Right-clicking on them pops up a menu with spelling suggestions.

    By default, the language used for spell checking is based on your current locale. If you want to set a specific language, enter its language code (as recognized by the aspell backend) in the box.

    Note that for spelling to work you need the gtkspell library. Your version might have been compiled without spelling support.

The Font section allows you to configure the font that is used in the command entry box. Click the button and a dialog will appear for you to select the font.

The Flood Prevention feature is also configured in this section. This feature is useful in MUDs that disconnect you if you type 20 equal commands in a row, or something like that. When you enable this feature, KildClient will count the number of repeated commands you send. When you try to send the same command for the 20th time, KildClient will send another command you specify before, thus breaking the chain of repeated commands.

To use this feature, make enable the check box Do not allow the same command to be sent X times in a row. Change X for the number of equal commands that will disconnect you.

The Send this command textbox specifies the command that will be sent to prevent too many equal commands to be seen by the MUD. It should be set to a harmless command, because it might be sent anytime.

kildclient-2.11.1/doc/C/kildclient/x4415.html0000644000175000017500000001066711570176770015410 00000000000000 Conditional Loading of Plugins

E.5. Conditional Loading of Plugins

If your plugin depends on some condition to be successfully loaded, you should include a test for whatever is required in a BEGIN block, and if the conditions are not present, you should call the Perl die function passing a descriptive message telling why the plugin could not be loaded.

For example, here is part of a hypothetical spell-checker plugin that uses the file /usr/share/dict/words file:

Example E-2. Conditional loading of plugins


package spellcheck;
#: Version: 1.0
#: Description: Spell Checker
#: Author: Somebody

BEGIN {
  die("Word file (/usr/share/dict/words) could not be read")
    unless -r /usr/share/dict/words;
}

...

When the user tries to load that plugin, the test will be made. If the file cannot be read (because it does not exist, or the permissiosn are wrong, or for any other reason), die will be called, the plugin will not be loaded, and the given message will be printed in the screen.

E.5.1. Plugins That Require Other Plugins

If your plugin requires some other plugin, you should use the $world->requireplugin function in a BEGIN block. This function will verify if the named plugin is already loaded. If it is, it returns successfully. If it is not loaded, the function will try to load the plugin. If it could be loaded, the function exits successfully. If, however, the plugin could not be loaded (because it was not found, or because it failed some condition), $world->requireplugin will call die, which will abort the loading the plugin that required the other plugin.

As an example, consider the plugin foo, which requires the bar plugin:

Example E-3. A plugin that requires another


package foo;
#: Version: 1.0
#: Description: The Super Frobnicator
#: Author: Somebody

BEGIN {
  $::world->requireplugin('bar');
}

...

If foo was loaded successfully, you can be sure that the bar plugin and its functionality is present. If bar could not be loaded, foo will not be loaded.

kildclient-2.11.1/doc/C/kildclient/x4057.html0000644000175000017500000000521011570176767015404 00000000000000 $world->sendnoecho

C.78. $world->sendnoecho

void $world->sendnoecho( str , ... );

Sends any number of strings to the current world. After each string, a newline is send, so that the MUD recognizes it as a command.

The commands are not echoed to the window, regardless of the setting of the command echo option (see Section 4.7).

See also $world->send and $world->sendecho .

kildclient-2.11.1/doc/C/Makefile.in0000644000175000017500000004622711570177666013666 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # $Id: Makefile.am 1014 2009-02-01 12:46:52Z ekalin $ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc/C DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.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__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__installdirs = "$(DESTDIR)$(manualdir)" DATA = $(manual_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@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ KILDCLIENT_PERL_CFLAGS = @KILDCLIENT_PERL_CFLAGS@ KILDCLIENT_PERL_LIBS = @KILDCLIENT_PERL_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ OBJEXT = @OBJEXT@ 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@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RES_COMPILE = @RES_COMPILE@ RES_INCDIR = @RES_INCDIR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = images pkgdocdir = $(datadir)/doc/kildclient manualdir = $(pkgdocdir)/html #pkgdoc_DATA = kildclient.pdf manual_DATA = $(wildcard kildclient/*.html) EXTRA_DIST = kildclient.xml $(pkgdoc_DATA) $(manual_DATA) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/C/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/C/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-manualDATA: $(manual_DATA) @$(NORMAL_INSTALL) test -z "$(manualdir)" || $(MKDIR_P) "$(DESTDIR)$(manualdir)" @list='$(manual_DATA)'; test -n "$(manualdir)" || list=; \ 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)$(manualdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(manualdir)" || exit $$?; \ done uninstall-manualDATA: @$(NORMAL_UNINSTALL) @list='$(manual_DATA)'; test -n "$(manualdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(manualdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(manualdir)" && rm -f $$files # 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 \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(manualdir)"; 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: 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 mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html-am: info: info-recursive info-am: install-data-am: install-manualDATA 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 pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-manualDATA .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 ctags \ ctags-recursive dist-hook distclean distclean-generic \ 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-manualDATA 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 pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-manualDATA dist-hook: html verify: xmllint --valid --noout kildclient.xml html: kildclient.xml db2html kildclient.xml pdf: kildclient.xml -db2pdf kildclient.xml .PHONY: verify html pdf # 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: kildclient-2.11.1/doc/C/Makefile.am0000644000175000017500000000071611405233117013623 00000000000000# $Id: Makefile.am 1014 2009-02-01 12:46:52Z ekalin $ SUBDIRS = images pkgdocdir = $(datadir)/doc/kildclient manualdir = $(pkgdocdir)/html #pkgdoc_DATA = kildclient.pdf manual_DATA = $(wildcard kildclient/*.html) EXTRA_DIST = kildclient.xml $(pkgdoc_DATA) $(manual_DATA) dist-hook: html verify: xmllint --valid --noout kildclient.xml html: kildclient.xml db2html kildclient.xml pdf: kildclient.xml -db2pdf kildclient.xml .PHONY: verify html pdf kildclient-2.11.1/doc/C/images/0000755000175000017500000000000011570463457013127 500000000000000kildclient-2.11.1/doc/C/images/we_colors.png0000644000175000017500000013716511405233117015547 00000000000000‰PNG  IHDRÔã½0² pHYsÚk¥óÎtIMEÕ +JÄ} IDATxÚì½hWÞÿûÑ~Çg.Ê—p@ ·ãÛ@d¨Lk³ù# Y°L ‘H -¤ê¶Î¶öžDOþŠR; ©•B[m¸-J¹)V`ƒø†(d±—or­B‹UHˆÂm@â[s5Üæðxx|ÿi4úiÙ±%Ù~¿0attΙ}F:ïó9ŸsŽÃý;?#FU,<ŠÀF¹raŒˆ+\Œu‘£Z|@v`3%ˆP¸f]D9Ü¿ó1V%;8ç”7H[æÜèÜÿ’$"1‰¥r´£Ü2e^»ÔÆ#e©ÝäÝGæÇ’[æ ?€á’˜,+÷mL^£.""V#¢Åù’òÈh¤qNĘ@Ü ¢Ï¤;Z¦JfÿJ±(“‡ÅK0"Ÿ›|oie–8>­è€fŠ«›&"MÓâ_DH`DäpÿÖOÄ,åÁ Êh´-º)‰‘ê$"š}F‰4éÌ]ƒÞ½z›\NÒ8e4²_@kFªDL "šÿ)½p/F…WE4N 9.1F +NƬç”å…¬ ã­)ÅRœDD·~¢™§Ó×eñWŠ<¤ðqæb¤8yvÙ|ìZÖón¨×8Í-SŸ‹IŒúßrÏÍ0má¿íÝç^œÿ¿ˆˆô?ÿþËèú7Aø ÄÅ‘ 0á7†ñŸDÿEü¿ÈøO2 npÃù¿9ý—97 2øÚ"ÐrkJíÿïä(•£ÿóÿæô_„¿Ü ÿ—ñûÿCpþ›[6ˆ 8@`ÇвžwC¥ ƒÈøOžýÿ¸òß™ðRþwåö¼Ô ¥rœ 2'cˆHÓ¸HÄbIN3h„3"nŒçœ[9¹Àc­+å,D˜ÆsÂlKd—(ù‚¼oÂ(³\áð°éèþº )<•ãýû˜Ú-‘°8?Mf@©ÀD©‹åµ¼äT ¾à 1ç; v¹Q¸AVË“ Ë.•ZUÊ-©D4ÿ’²Ëë³Ðô™Þ¢Àw¼^Nó-ûµÛÅ‚‡(|¿²Hì$“»KÙeNDñSÌìàÍRŠ“M Sèß@ƒ×la3$~äÞ7c¤ç89K*À¶¦“ûkÙ¥’@¢“ÌNĈFÏ ÅL<¯™ÁLˆˆ²¿jî} çœÆ"Æ+btNÜàL`Ù_5Y–˜Á7·”Øå "]׫KÉŒˆhîÅæ¬nP‰ùÖз¥>r´v‘ôõï#U¦ŒFj7³\ ªÄÒK\• y6Öà5[Ø rËär2242÷;„×ïyY¬Yóâ/Ù5Ké+«V~yXQŠ NDºAÄ9'Ê2¦JL‘¤B'™Ó¸%I “¥<qN½äzÿá…§Yæ$m)/ï‘xy)8w22ˆEQ×uN$ï3YnК¥dÑaÞBÅì+sn/evíé,‘±ÞPSFDC7kïzá?Ä‚o1Nÿ¡X­Á‰hæ¬d–2/ˆhæ½ÊzsÔ¿¹»)ù”{öšê˜@î½<ãînFD™%nV8ð f.'å4Š¥øÜ‹ÂíÌúÃ÷øØQ–]¦±»ZÁ Åÿf½6É⹜Lt3râ ;š=/ Dñ®]¼qÏ[w|Ë×.%v9ô E±ºT©ª¢ØP%&9Ùo N›åâ®\Fá"«qnp2ô…§Ùzʃ <«•Úm•â‘ÁÍÿ¹©!dQ,ŒÔ×*%‹eLÙ#V”2ÅGv™ZÛüÙþåÞ,ôcŒ$F#¿ee9­ë lÅÓY""µ›È ÞnFD³?q"êífdÚMD´˜%2Èãb2—“ˆÈ%ÑÅ£ÌãböE™ÄˆóÊ7jasÚ²õr„ù•OjpƒŽ}¡=ø£d±“黉y\DDñùß&·‹8‘[""Jåˆôo4ÏGú™ï =lþEé?c¶±ÒÝÍ‹5[¸&yn}tºnHøÆÀNð|ØúP2˜éó('¯ÕóQþ•^îóàÊ^yRË¿ÒÍ©–ÆÚ€b冂Õt3™1"‰Dº­:Q6¯[sBÙ¼®Û¼ýú+u‘X¼nòÃzRÁ$PÞØ„¼N¼à´ Š=Öò¥˜ï d½eÏV}]H1xFs©yßdŒQz‰²\K/¹ÜÝÔÿ‘@9ò\³n49¯éœOÎ3ßAÉÝ]Va,¥å NËënášÈNFDú2'"ßWØTô×TìïÍ ½¹ž—¯¿Té^ö”ªR:‡;'2à KqX±"](¨&Xý7õG6¯çnD&èd©›þ2K=ÿ5/ DTÉÒl)ëÑ Ò4n¶ß,¥q’)ås±ÓÀ絊Dæ^òõ¦Zê]—œ\•ذ‡Qê%'ƒÌhà!‰ˆr¼²ƒ\BцÝVU¿Ñ\ ×ÂÜ–M{¥Q—¤ãû ;Èóa﯉X±whª¿®SªäРTE¤jÏ^yái¶ò^Å>ËÞÙY>p2ˆ ¬Ðí”/Ü@´¬³yÝî4a$™9 =kÍRÅ‚\‘å5Kõì­ߺ˜ÉZ¥òœKŒõï§…—±SÍ©Šô¹]4ÒÏ"÷)t˜Uç´_‹Ó«"'R¿ï ™›ØÏe87h.Ãýo1·‹ˆ(•-Ô^"‹F°ÈC fD”Εߨj>É*ظ…ay\Œˆ²Kye¿ û£ÀÎ`½}hãþº¼ãhª¿6µ)Dú(Õ÷âåÁm ¢pÉR;Ü6¯C1"Q(“BD$3Æ9gB!:$Ï«_*›Ï›eó¯ô¬¦5.U÷#`¥RT‰¼Yt~#«mþ첿ìý,GDÑÇÚÔ Éwù²š‚£ø±ä¤”’ÏèÜ2ÊÂËÒj¡¹—Ä š{Yö®YCl^›:Yv£è¼VOåØSÖlac|(ý"à –7DˆØIžæûК=¯"Ë(EDVŸÍçÍJªK1Êö—*Š®ndîW&°<׋‡éœH ÑÊ.0HvÒó\g—ND¯_êy6_QŠ Ä9·—"ƒkœ©ód‰^û([C'¢äOúF#G$"Š>Ò.—¬·ìÙÂ÷µÈ $1^ö.Q:§sCb¥—ˆ/ç‰HÓôœ&¹$óݼÙß'ÖÇîÐÈIí¦ÌM>Ôæžå«Û³‘6@ P¿DDé§9É)ÊŒ$ ^`Gx>ÖÙ‡n¬ç­Wªtb‡Àòº^UŠÈ༰FÄìw\dù "8Œ Äl;¤š;“Aº@d˜SCœˆ1ãT>MвRYK.6vTJ>ËkMïsÚû×LƒwãOòñ'yëºf©äÏùŸëʾÏ*ë÷~Q㎳?çgkURÝ¼Š”z-\“Ñ#²*±ô‹LúEÖõ†Ê°Åì:»¿æÅP²ÀÇÚ‡|pƒ¼¿íë;3ÑÌÛ½ŸQÑÿß²RËNr9Y쌼i_„ *ñ¿-†~+ÑÜ|Z’$yDã˜v€A‡÷×5q¬®®Q쇽·–Íf~NåÍ4¾¼WUz$Eiq)‘Èû&s9)½ÄǾÏ.dñV"vÑÅ㲩“œŒˆ?hÑGùÅ_ñÉ]ä=(Ž—T‰Qân2Ó\ûTy¯Ä˜ å;‰Žî¯Í½V‹ó5þw\µÄ‡@$l³·‹©Ý…&g4ž|ÆÉ tv7ÎÄ(N&ɤJlàÂávé™ä£7HêVä½.b"Ãy¶Z&Œ¨°é{-ññ¯‘-d»Œ‘êbгà¦ìH?Í-<ËÊN&u+â‰1>-¥|WLÿom«]²$UçØ^Ò*ýŒH×$A—÷…Ýñˆˆ@|@|â[O³çŒžǵ3ˆßšÎ½ÌàsÐé⃈&¯Nàó@ëĹö©øÈ¶5ðyh;ˆùÄ > >ñ±‰; G—ÃDÅäÃdËníp8`o`w‰ÄDp88}{zuuuuu5ö÷ØÐ»Cóÿœ‡€ÝƒÐÊ›N¦oOûOúÍ—Ãg†É ÐB‹éEXØ%´vÚÅ KyôÇ{à ©óZÓ´!ߣËqì÷Ç4M3Gôó¨²_qt9wsNþm²×ÝKD©'©>OŸ£Ë¡(Jì«Ì ìVñQ Ƙy1v~lâêξ:|j8|!leÈd2™§™éÛÓÓÆ9%Iš›Ÿ#¢à{Áð…°þJŒGư1<ÐI8VWW‰(õŒ+,Û ßèù±É«¯¹Ã©ÃQ¸•‡š‰Š¢dÉ’@Ú’æ>äÎf³f¶|>/I’½x½œú+9YÙ- rtJÙï¾kɽ̸ö©Øç@ëÉrÅó&£Ç|Ø©V!¹\ÎÑUcAŠ©<ÊzÐ:9-å¡-i×'Ò?¥S©Œ t­vÈŠÛ0IÜIXúGê–VWV-T³fNï —s:š¹;»W|Lßž-ýa­¼5_ú}éŸÓdPìfl  A=kæLÿ”Ž DoDac £hé´‹ÿ¤?~+8 £psûÊÛèµh`8|˜ttO?Ý ž5sÆ¿‰NòKùð¥0l t- 8m§Ú…pг]ÐR >ñˆˆÐ6tεGÙߣ¨=:ç¨AÙߣìï©ùV^ÓFχݞ>EíñôD._i|‹U€ø;„äýda½´AɇÉÍ”5Ë|èD ù(9}{úyzñÜÙPô«Ø‡Ãg`W3{–ˆ|ǽD4{ov5dyžýåyuzôF4ó"¾î= ŠŒ…> eyÿæk|æñv1ÍÞO’@‘ñ 4kyAŠ3 sæ=‡Üž¾™{³D´JùNµG=Ðë?È<ÍPý¹SÊxknqkPäò÷¡>Õݹ|¥^Ûjæ1o|ÿC߉¡šíñ:—¹ùy¾Ì½G¼ŠËå=âåË|n~Þža!µ½>©-iáË" }<’ú!µðh.þMlþ_©Ð'æP2/³D$wKÕoM܈F¿Š…ÏE.„£_Å&®G×›gøŒ?~3¾®ö€øígúÞ ù½DäôY)Á÷ƒ‡û‰(÷2GDš¦Qðl0ó"óüébò^£Óþ¸ÁMF5ñïâDä?éóðY/וÇ{Ä+wKëj€í->vºönÇjƒýÚBòžðá³$Hò~YÌ©,IöSƒ&Æ#ÌÉÒ?gÆÎ‡{=}Ówň¨ûT"Ê.åªßÊårD$:%Y’¬—ëÊ#:ÙzÛ`Û{>V‹Tœpk1:Ÿ…T*·¤Q¯§OÙßÓ{¨ÏìãR©zE'ý‹©…¯¿œòŸôñe>v~¬AýfëÜã…ê·\.å5-¯iÖË äYW{tŠøpÔ§ÉJ'Ü‚mÅì½$]ü˨¹\%ûËóÑ¿ŒZé5ñõèUº•±OG‰HéVÔ?òɈkŸkr<’yšÑ9}Sö÷x‡ˆ(x2@D³wggïÎQè½`uñfò¬«=:E|˜ŽŠÕrÖëÀðŸô[Sû–jIÜI8ºŽ.Gï¡ÞùÎ[ïÆnÆÄ=âÀ‘mI«¨'õ$Õçést9E‰}3{Ԟ̳ ežez`ªM³Dä=î­ðU˜‹okÿ*æ=Ú=æyÇóõ—S ê—%)ywÖÓ?àózôFþ6éyÇ3um‚ˆÆ>ùC(ru"<ùãȹGª‹7“g]í°é8L¹zÆ–moôüØäÕ ×>µÂÿa© ûuIE+¥tÑ嘺>5òÇ‘ÄÄØù±çOŸ›ï†Î†¦nLÅnÆRS_ÿýk{‘^woärÄwÂÿ.>öéX>Ÿ'¢sŸS¨£~M?MO]GCD”{™qíSs/±¸@«ÉrÅó&£×ŒùX]]5=Í(&ññÎÞMÞOú}¦ò0‰\Ž0ÆBï…fªÖ&,¦ý§üæ»æBshn:ÞgïÍš+2Ð ¼nÀ©©?61\túö4ç|èÝ!Y–SOJ1Œ®}."bN–«Z¡-iáKá€?`Ÿ^ñ÷ÍÍÏiKÚÜüœ÷¨–vˆø ×X¨’¸“°/È4‘º¥Éú+}êÆ”w°$Ì5“š¦U¯_ðz9硳¡™»%§s2Ï;žð¥ð@ÿc –vŽøØ°ò§oOW¤÷èI|Ÿ "Y’­9"ŠŒGÈ ø·ñÀÉÊ2éŸÒÁáàÀ‘è²í,‡~?ý*Š9`W‹kEnàt ~+î?é¯È¿_ ;ºÓ»4QUU”ÅÙû³ã•E¾‰NTUU”ÅÃú}d¹Ó%:„×ZíÒJɲÉ\.ç=ê]L/Ḁ̂ϫ]´‰ÍYíÒÑ4ucªÚ³€ö"ìÔÿ˜¸Gè˜ùÎ  >ÖÏæ\t]‡u€ä7øñˆˆ@|4BÀGÚ…n'£s¾ LÄf@|€Ù?qÎ ""&ÈXá¥QHl/ÿ60.cLÄI„0+`׊>Oߨù±á3ÃöÄ[ßÞš¸6±Z¨WªÉ½Ø{ô<¸÷@}³°a|âN"àL'¦­MQ3Ï2Ç=ú¼ùÍÝ7¶ ü®Ã m™Û@‘1✄VwÜ`œsÎ9: "œ1ÎI’ÐQÁ¬€­££c>R?¤&®MØÏ¶Õ4-r5’ú!Õ T“Ýÿð©áÙ{³ÖËÙ{³î·ÜÉûI+%q7a è‰Í%«iœs28ç\[æÜ Ý Xëÿ˜@’“1ÆÈ¶+7(·¤uʬÌ ³ñÑzïâßÅ­—ñoã›u\KÀHÜMX/“÷“ã³÷ËäHàÝ‘M'ÿkÖì t]'£­Ñš}cŒ‰dpýUÞLÖ_åó:*˜°[ÅÇð™áØ—1ëeôËhðt°äy’êóô9ºТľ*ds8ÖEôó¨²_qt9w5{Þñdžf8çD”y‘!"ß å^戈/óÅû׿f…Ú’vÌ{L–åØÍR;ÍDG—ãØï™ž›µÇ¬9õCÊápÌÿkžˆÒ?§{ÔžÝöÌ" ®¯TÍз¯UÜ ³×,8í‰ãfìFñaÆd˜ó,óÿš'ƒÜo¹­wƒïÃÂú+=2;?V]<“Édžf¦oON×ðaø}æ<Ëì½Yß ˆü'ü3÷fˆhöþ¬÷¸·™ ÇÎù}ù_ó©Ç¥É ‘OG†Ï ¯ê«¡³¡±OÇÌ{™5'ï'cɇIóÚ¼ïîê¥8'"}…ìqˆ¢°î¿ÍÁàL ˜y­¯{,]×1D†Y[C!@2õŒ+,Û ßèù±É«®}jKçp¬®®^ùë•ì/Ù©S~𡪪ÿãb¸Nƒ]…Dë]‡Ã‘Ïç%I¢:¡ ÉûÉ[ßßúú˯þ@èlÈw—|˜Œ~¾=ýáú}þSþ5+T%ýcZê–r/sÊ~ÅL”÷ÊÙL–9ç\Ù¯äÍÏÞ}›¾=}ì÷ÇO_är$þ]|ñÇEû[Ú’6q}"ýS:•ª‚j …zxzÏ}zŽ š›Ÿ‹ßŠ‘÷ˆ7ø~sž|˜œº>ÕL…¹¥œÔ-‘kŸËÞ0ædDÄÓ–4ó^Á‚œó…Ç Ó·§•ýЦiÉGÉéÛÓ»íáÓ¹N%8qƒX±ÃhqK‚Õþ0nH¤sŒˆ¡—‚Y›Ï6êªú¦ú(¤¾©Z+c êaÐë=ê ©—ÕÞC½øß{<žÀp ÷P¯OyxƒÃAõ€Êš¹º]¹\Îårår¹’Fé–ø2gNÆ—¹)M˜“¹º£ŸGû<}’$ ˜¸:áyÛÃvß ¬°Òàd·¢*ÆXá5­Òµ¶àe«=†nÎ ˜=x}³?І¨ …(TëÚ¼ ‘ˆÌ‹ê—5³Uä·Íô²fÁ¬t$Ûc{õàp0q'V¤§J‡ƒG¢7¢«9p2ø>a¼:1”¸“ðŸð7_CìfŒ ŠŒG¬Dß /þ]œ JÜ-U>䊌GÌPïQïäß&‡|C»´—*ŽG;«aFe Á&šU4Dóϼ.¹L½Z—Xò®0스Òï"èV˜ˆM§‚DT±ÛÅ¿‰NTUUl0Å7ècŒÙŇoÐGN6»ÈvâêÄÜ£9EUú¬Äèµè­ïn9DGüÛxôzÔªYÓ4ïQ/y{9ç»0ÚÔ쬰Äöì€YÝ9ÛÀ ÒWÌA<~6Ó¬–°«K^X"£"½BgT¸:ìïÚ+Yè|:zÚÅ uísÙÃE­kÿ)¿JD£­x·f‘ cÖ6D&’$­®¬ÖlFÍ ™“ÍÌΘז<’º¥É÷ò¼í±Jõÿ¶×î]VúÀ ½³fß‹í©x$j¢ì/­‘fN6px 2Q÷¹Ì·²¿<_×7Pd™Õ>'bMšØuIµÛƒÊg^j*êüÛÑ¬É‡ÉØÍXü›xƒ[7_¹™è?<÷QÈçÏfgÀ×NÙíÉþòÜü[|<çyÇ:‚Yk¦Tx;ª5ªçJjsÔÓN”íeÖÈÕÉ‹ÿÞÜ[G.…#ã“ø¥”07á.ôížs)4É «=æáë*.:¥‘B™¶.`îd³ÚçD*Â8¨<ž´ž©pœTøBììþÎ7ëÜü¼$I½n÷æÞº×í–$iîq ¿6â[—°VÊöj¾Ì£_ÆFÿ4R‘¾Jy‡µÇíé‹wËÊúàCõ@ïÀ‘c ?¦+ŠL]F®Nî0³Zž F½—õ&\*òW´ —maÖÙ{3ZQç·ÎkšÿLPQ{üg‚yÛYWöw݇úâß•öqòygïNã×@|PÄòÆwXô_©=Íùç•ý=æ_»wò³Iy¯R‘áܧc£ŸŒdŸ.†/„× ‹¡Â—#þSþLzñâùÑsŸœ³ç݌喲áó£;Ϭe"U®‹êÐÑz1§ ¼#õòw²Yç§YÕmáZˆN<3LjKZöeN©¿À¡“i`ÖŠØŽš[‡QÕ¢{¶šò¢Z¦®mcV¾Ìkîõ^qkMÓÌl"cZÕ´‹¦ir·DDŠËe¯ÁFÀóÀ6Øëi-Ô¹V½õ~ðLs<åÿúï¥%§Ts·‰Øõ©ÑOG"W'vžY+¦Hjnéa—ely„‡u]á/±_o#³2'ÓëHû­%I2³éœW·ÇÕíÊ/iDdþ[(¾ÌްØÆÄÕk õ¶¶çu§òš6y=V½1]úYÆÂßß?û6n%z{“’dÐ̽Ù#ÇJ¹ œô§Ÿ¦ÓéfÖš;s4Ø«´æ¾ée+LÅ:—íbVuŸšÉdÖ¼µ÷¨7q7AÍÞOVŸ¶=tÜ¿'ƒ&m3D™LF}CÅ €ø 85j_o»VYáG½ùåüŪˆÂ©k~|®¯ ×Ö D.…c_Æ”=W®NN]¯Gl1Œ;Ƭ5÷ê¨ö‚PE¶ 4JÍmR·‘Y{æŸÌ­yëÈ¥ðtbF9Гø>©šºx!<ÿdÎsdÀs¸»:ÿdnàð~m@Ç"à#m"ë+íl޾Bb׺‡È v®´Þ:á:QØA?ôQaÃ(Y’âßÅë8ÒŸ8Ò¿ÃÌjÕhöAMìdJ ƒBDCÔ‰o³úOÂãs3±·–»¥Ä÷u+æžë• IDAT,þMáÝÀ‰Bâô?f«e Í’}™‰ý=šþ9%9%߉àPÃóÞ‚§Åo?€Q·Ñyû¶Ð¾v3]×n6kÅ´Tu°œÝíQí©ÈFUÁ§•Û~[ûàU˜þuŒÞwØÃ—ùb:]½ÏØë°øcšsÞçñà×@|l„ü’¹<|o$|!’]Ò¢×Â$ÐРfÛÖèºN#‰æIc+Ñ*& d6¬™C@v³ÎØ€Yí¾ »“ƒjd»æ¢˜zþ’×7kS#¢M5}øÂè•¿NÆ¿ùzë¼òÙdøÜâc£$îÆ½ƒ#^"R\®ÐG£S_NB|l{lÞo&tz Á뛵™QqQïeµ:©yòœÝ¿bŸvÙ.fõõnú p›+eØuâc157v¡´'±ú¦{òjáK•_Ö¢×"éŸSÑOâ³lùYÍwƒ§ ¿7’|8=y-¾ðx~ò³0¹ö©¡F{ºñ(´ nØE\ .”ùÕƒÃá3mU–‚È»¶ÁÄÐö2+éÄÉ ‚,¨¸hü² ¨¬’Šœ%yA5”Ì ÄǺÈ-å”îÚ.Åÿè÷†/LÌÍ'cßFÏýñb3ïŠN¹#¢ÉÏ¡?Œzûææ“Ñ‘èõ8…V‘Æ„R?¿Õîs(ƈö‰‚çfìZñaŽuDª±UNꇅÐG£$çð@ìf”þØÔ»ýý^‘1"r¿åYxœt¹g` ß‹ç ÅCd"bBÙuþŸÉ¶X "˜@œ˜9_€!2Ì ØR:zŸ—Ë¥å²ö¡ÕÜ£Âþî|Y3e„È_®Üo¸Þ»f"|æ]ùëØ‡2ÏÒxZ H×9 Œ1fß‘ºrad«º(±‹HI`L ˜®c| ³v±ç£÷ÐÀÜãùÀ¾ÂN> ©ÔìÝ[fü)sJ:ç"c:çÌY¹ßpãw‰HvJáKdPòÑld<û;Ξna/Åç\–œ nõU­ï¨Ê¿ Lì¢ü2gØþfìZχo00{7>÷(©<ó,»9á;9l¾åy»oþQ’ J=žó¼ÝWQ°ñ»D4úIpn>ID’S®vœ€-E=à6ÏÛdŒ1ƸAdð¶-¸DÆD&cLÞÈ(ó"#ïU°ýÌ Ø¥žÅåýsäÖ·ÑèçW$I œ YñÁ÷G¢×±›“î·<£ŸT®hoü.…>ÇnD¢»BD£‰à9h%“C‘Ëu|BÞÃÄ.¦¯9PÖ‰\å-ÃЉˆfEÜ ýU>öMÜwÔ[pט°8VWW‰(õŒ+,Û ßèù±É«Éù >²m·_uíSs/ÛlÇ©ÑÄÝÙÐûA÷A·,Kí["ˆs}!•Š~s»ÝÁ“ÅåríW¬ !³^Ÿ,WI’$YtQ0+`K€øía ¿àp^Ó´|>Ï9œŒø6LfL’eY’ðå€Y`>}²$1's¼Cö`0—eŠÃ7f@|€ûŠ#b"> ˜°kø >´v„²†Oa'òíMÛ×¹ð|â€øØTø2?÷É9EQ]Žž=WþzÅz+—Ë5.»f†5qØ÷ˆC¾!óÜ,ìXñü ¨îW3O3«+« òù|øBá”8÷!wã²kfh†Õ"Ù_²ý“<1Àëï×u°œkŸÚÊÆ‰¢˜ÏçYñ(mISÝjþ×<9…–×ý­•aí¦¼ι¼WÖ_éÛÚÞ¹—™N8XÀ.Ä:X®£=êjd¼tÞ½Ô-YÊÃú—ˆROR}ž>G—CQ”ØW±ê Ö…ý:q'áèr8º½‡zçÿ9߸%|™O~6¹©wG³æÉ¿Möº{ñx5‰nnpwÆŸÁu6Y­ £·Wœ ľŠN¼G½în÷[n"Z]]µ»%‚ï#—#¾¾øwñ±OÇBUd¨Iàt`êúÔÈGwÁ³ÁçOŸ×t~Ø_~ý÷¯ëݱ $in~OÕÚý/œúÁ+¼lýQ /ÿ60.c G®Ã¬€-¥£§]Læÿ5Ÿ|˜4ÿâßÄ‡Ï S½Yƒ]…t{†š×ǼÇc£82Àjý*ÙKñeû66ym²R£”ßQ¥3gGÿÀuÄ´‹AYM3/Y±WÐ9o}C¸AœsÎ9: ¢Õ$I’ÐQÁ¬€MÇšvÙâÃ"õ$å;éËþ’­PÚ’6q}"ýS:•Je^dšÚ’80sæ<ïxˆ‚Ϋ+«ÍÜâ£Ñ÷¤qΙ@æ€X’$Ö®.ÁàD¤-s¾œ×WHKç ©.N]„Y[$>::æCÞ+sÛÈÉó¶G+­ìx½œóÐÙÐÌÝ™ÆjK¥âR·ô ù@¥Oݘò®}f¶¬¹º]ë½#¨&ÿkÖžêºNF[xFcŒ1&’ÁõWy3Y•Ïk!Vfl ->'“ŸMfžeÈ mI›ü|2ô^¨øûRRéŸÒÁáàÀ‘è¨íÈ&5JÜIpÎ×ÃÖû=zß'ˆH–äšš¦LyhZd<<ltGÐ…C'ƒë+U3ôík7Èì5 N{â0Ì Øuâ#2I>Jöîst9T·šý%;qmÂ|ËÂ/+²yÿ&8PUU=Pš²g˜¾=8PÅs¨4·¿_ ;ºÓéÛÓ5`m2¦Pù2·–ÞÔ¼#h¶?àœˆô²Ç!ŠÂºÿ6ƒ3H`æµ¾Rì±t«$`VÀ±b>ÀëÓ 1ÉGóªªê¯òœsƘ¢(Ì)…/Œµ¥1ñ[Ó™gim™g³Yιädâ9“ɸ$IUUщøD˜°iX1¾­Fç:•üáÄ bÅ£Å- WnYË ‰t®sƒq"ôR0+`óø­¦°ÒàdðBô_1>àŠÃav VÿÐ|GQ‘³©‚gü¥k«=†nÎ ˜=x}³Rù~9[Ì @ǃSmA;z©âx´Vÿ‚Ûþ­Ð9k¬Y¤z|\ÑB°)fmsÃ`V >àœ[a‰ vÀäµÄ«£9øZy-]R꜊màé+æ †Ú³¶TsÀ¬@|`¢ëÅM îQsÒ¤žæ`µ ò†µÕÛSja}”ý=ÖŸz 7øÁ‡ù%­ÉO@Ùß³kÍÚÚmÖäÃdðý`eåîÞàûf^æÖ[¡™è?L>LâÇ@|Ð|gÀ§ðú*­_ ¬ýîZí©Gö—çæßbjÁó¶'|) ³nàcì´ölºY#W'/þ{¸²òÇsžw<¡³¡ Öy)ŸÄo €ø Y8ç…0@ªíœ¯VMÆmðúšc ½bÕ2øzƒD'ù 4»»G¢kšµ Mê³ÎÍÏK’ÔëvWU.|ÊltÑ{¯Û-IÒÜã~OÄMw õSøZ> »ÂàMÈÞ°æ5ÛÓlGÅÈŠ'ЗµàûAEíñŸ êË…[å5Í&è>Ôÿ.± ͺMÛóúf½7ð U§ëË<úelôO#özÌÊóU.×¼ËÏ;{w¿'â€æ(z¿kî5ÉÖ5Ã;X-ÁÁëç©Ys©=ëœ/È/iS7b¾ã…‚—'.þG$ûôyàÝ¡+Å]q#ãïQo:µ°ðãÂ.4ki¯Yç§zܽ“ŸMÊ{•Bå—"w‡²OŸ‡ƒáË‘ŠJjÞÅóÎ<…‡¤\¯×oQ}WÕOáu k®xõÝk´°VGÒ{¸/ýszâjaïÿÙû³½ªJù}3÷“ÅÄdÐ Æ>9·kÍÚ1Ô^³f^dTµ´1´óñ<½81‰^/•|˜ôŸð“@¾ãÞäýʉžšwq«jæE¿'`›ÒÒMÆ6ëÐù\.çr¹`¼mJåÈØÐyqÛ§š;ƒÙW¯°Z~‹f‚¨Ž«£Bv4ÈFµÖÙ²&êßp פbWì]Îî1ëNmáš¶î;ìáË|1®ÞgìuXü1Í9ïóxð{ >ÖGuP¹ö¹ˆˆ9Yn)ÛìTt]'‘ÀDAo0>®')™6p4Ö%L ÈlX3‡€4?z†YÛÈ&šuö_½ò×Éø7_oâ}¯|6¾·€øØ$Ì5´š¦U¯¤EéÎÁæýf @¾Véš‚£Bš°æ¼#mÞ b§›µZØJ¼G½Þ£ÞÍ­ss¥ »]|DÆ#Sצâ߯­ p(q'áô…/‡í­Ö–4©[‚ý¶#Ü ±‹¸@\(Û"8 3þ¶~D&ص f`V˜ˆMCUUQ½G½Ó· gLßžœHNÉÚgˆü'ü²"[aª`[‘Æ„ÒH4~«Ý§TŒ'µqˆ ³Â¬@|l>ÖûZûõèŸGGÿŸçœ NF|&3&ɲ,IørÀ¬ˆ°Ÿ>Y’˜“¹ Þ!{0˜Ë2Eᛳ >ÀŽ}E1Ì Ø5`“1ìtñ‘¸“p8‰;‰5sær¹­h€½Z‡Ã‡Øáâ#úE4t6ý"ºfN÷!÷V4À^-v6ZÌc>8 wç™™Ågþ1£ªjæEF}CmY[Ò¶âÿ¼EÕ 6èù0Æj9Í8b_Æ‚ïcÁ÷‚±/c5ÕŒymÿ×T ǼÇ]Žc¿?¦iš•3úETÞ+Ë{åÙ»³ÉûIEQ]¥9Ô“TŸ§ÏÑåP%öU¬ºÚµëÿ<ªì/«m¦Î¨P kOa»ùh„ˆF>‰ÝŒ5Ø BÍŒ|:2|fxU_ }:feKÿ˜Îf²±±± cóOæ3O3Ó·§§æ»Á÷‚á aý•Œ«®Ö¢^ý™L¦¢N¼ÅzÆ–moôüØäÕ ×¾ÊYSs4¥<ˆwÑÏ£’Ì—GÆ>óŸôWhëÚž(™,s2ι²_Éÿš73äÍKÝäèrè¯tædµ•AŽ®ÕZ×uëÏç%IjV]u<¹—×>5÷2ƒG@‹ÉrÅó&£×ßç£yåADÑ/¢É‡I»¿$*FMñ±&Ú’f Ƙ=hCê–¨øÿ03T”š¸>‘þ)J¥6X¿$áq6‘MXíÒ¤ò0CMWWJ1"º®/þ¸hÃm5‹KÝ_æDÄ—yAp4wÐË9 ÍÜiœscõ`½´n‡ÓØ—±±OÇì7dŒûä\ìËXdMãœ3¸AœHDBzFœ9™FÄ—u]×EQ4»®Ü’¦º\ørÀ¬€-ËV“ÿ5kvº®“¡·³)#1ÆÉàú«¼™¬¿Êç5­S¢`V˜ˆ^“B€¡“Áõ•ªúöµŠdöš§=q flÉhuÀ9é+Ä bÅpëôMœ ÄÍÙƒë+L4't]7$¬’€Y`çôRdp2J 2Gϵ¥1ñ[Ó™gik”Ì N$rÎuÎះY`‡ sJþpâ±b‡Ñâ–‡+Ïëá‰D:×¹Áˆ8GÀ¬ˆ°3†È†^6D.Æ8Î;Ȱ=•ÖµyaŸÙš/kf«Èo%‘@ÃdÛÚßj¡›ƒx³Ç›`Vr´²%0+NA;z©âx´6Fñ¨ÌI.ÔÒ%–¼°+ ¡<UU"PµûÝjçˆIܳ¶«a0+ð|À97à ƒÁ¹Á*Éjÿ‡AµóTø9*ŠT«£òÙ·ïÂÉ ÒWÌA< µ©fm‹æ€Y€ç]/nQ½„QîÃ0šsZuÄŠPK¸P¹¥ìîze 2soVQ{”ý=ÊþEí™{4³Ö6k{ÙfM>LßQá¾û{”ý=ª»7øþ‡™—¹•ý=õýg‚ɇIüàˆõ]–ù¹OÎ)Šâèrôè¹ò×+Í—u8M3çr¹&s‚-è xÝ¡|Ò¤Z=T\ksÔÖB¹¬1šhOÃ.êÜ'c_ߘÊþò<ûËó©kÁBsS0ëº>ÆNkO»Ì¹:yñß çO™·Îþò|ññœçOèlhƒu^ GÆ'ñ{ >ÖMðƒ º_Í<ͬ®¬.<^Èçóe‡Ó6Ä<³¦îCî&s‚Í×”œ©êÔ±jÏG½xÒzZÄ®?¨ÊRÇùaºè ý“Á› øðãsS×'†Š Nú'Æ#cmZYÚéfmW“¶‰Yçæç%Iêu»+ÒE§4òQ(³Ñ“˜zÝnI’vµ cöîìÈŸF˜“‘$IáóáèWÑM©Y[Ò`ûvv õR„rY Ô ,Ê37ˆ©*” —Fíi4°&«‹²:ª¹û3æµ²¿'öelàè1"Ò—µàûAEíñŸ êË…þ¯f¢²¿'v3æ9< ¨=3÷fwŽY·Q{ÚaÖÙ{3ßPuº¾Ì£_ÆFÿ4b¾ÌkšÿL¡ò¼Vù f¾ë>Ôÿ.a%ù¼³w§ñ› >Ö‡ú†X/¥n)ÿká˜MÓþ€(Š=zRO ÒÞápLþm²×ÝK¶É‡Ã»÷ˆGLÍa¾eÏ`]D?*ûG—#q'aÝè˜÷˜,ËÑÏ£˜ ÙŠÞïÚ{YµüõBG+|$uº“Ú·¨Ê¯7˜ˆiÛ9j’,?¸;CDáËÿ#’}ú<ðîЕâó\3‘ˆ2¿äæ%¿¾1õáÇçv”YÛGç›uîqÊó¶ÇziÅ|ô¸{'?›”÷*…Ê/EïeŸ>×#•DÆ#Þ£ÞtjaáÇ+ÑóÎ<âcÝÄ¿‹ßúö–¢(ç>9—¸“Hÿ”¶Þ;?|/¨¿Ò'Æ'‚ïK? ’47?WQÏü£ùü¯ùàpÐtŸšó,5g[2™LæifúötàtÀºÑð™ál6›úßáM’r½^¿UcëŽjýaÔñdPøŠD£ÒóQÝ'ÕhaCìA‚V¢oÐ':ÍÞŸíUUÈ7蛹_¬™HD?ôm»uÌÚV1ÔùfͼȨªj½´b>ž§'Æ#ÑëwoòaÒÂOùŽ{“÷+#Igï'ƒþ 4öII߸U5ó"ƒßÐtôR[ÏÛžç™çóÿšO>LF¿ˆ&&ãßÄ‡Ï ÑÌÝ™©ëS$ÿ”ߪ´§PðTМ¦)\Ž0ÆBï…ÔËjã;†/…cþ“~ë7bæîÌÔµ)ÆXäR$öU OÌfŽD „έmŸ„Z~ŽŠ%µTkb…ê\T«“ªgß:x¬n ×"ûËs«»²Åâs¨-iŠZ¹$¡f"‰Nišµ-bhû˜•/sÑÉj•bÁ3Ãc— nš¦™ÙDÆ´ªiMÓän‰ˆ—Ë^_Æî&âcCôÿ¶¿ÿ·ýÿýbêIÊwÒgŠÜRޱ_WVë;ìÚç2ßÊ-åßK’*#rK9³N³°Cäú¿†Õ+õôGµwD¨’öXª²Ún7soÖ0so¶æ÷I’¤tj¡â­š‰;Ö¬Û¨…í0+s2½Žþйfý(I’dfÓ9¯þ¥ru»òKšÜ-åmmú2¯ù“@Ûéèiy¯lÿ½ð¼í±ô¾$IÍû¥Í…µš¦¹\ë’$™7µ¯Î¯E5z¥€0êlfJµÔFõr\{Y£jù®Pçî ZXÅ×7¦Î}2fÅZK4«sz{Ÿ¦É ø÷ ߉@ƒÄkÖö´gÛ˜Uݧf25&Gòš6y=8Y¬ü¨7q7AÍÞOz{+2÷ÆoÅÉ É륨üL&£¾¡â'Àó±>'“ŸMŸVßP5M‹} ½WXòîôÍÞŸõ÷%î&ÆÎ=ú¼A=‘ñÈÔµ©ø·qëkLiKšÔ½¶‹;p2»ýÓ¨=ô¼ÖÔ¨}]rQPCIaÔW$ 4 ÕÙ&µ™VÕbhÐG×éÃÏY•}cªb¡Dáñ»ýqdþ_óî7ÕØ¯$îX³nŸVµÅ¬‡=óOæz‹ëÿ­Y©[ò ú"Åi³ò± aï‘þ©ë•ëþ.^øq(v$¾¦›…Äù's‡ð› >ÖGd<|?8qmBÓ4©[ ½š¸6a¾½ †Þr¿éžþnµdªªŠ²è=ê.°é?á—yueí>&Æ'|'}W'&¯MF?â‰ÙŠ!²¾Rþ<®yb•'ÖÛI…¥»‹]ë"›U6S[õZáD$KRâ»xE†š‰öRöëmoÖv°Ìê?GÌÍÄØ]î–ß×­\t²ø7ñâ°­8ýYK»ñÑ,.—ëÁÿxPó-©[ª~˾€Å~=úçÑÑ?ÚsN'¦«sÖ,.uKsæˆH[ÒªçYÁkF«:°*…QˇaÔñŽP­âÕþ¡áÒÜæ†È5·µÞ–¢¡fÝ)-´Œ¾¹Vî;ìáË|1®ÞgìuXü1Í9ïóxð› >¶²,Oßž82¹ñõâÙ„!©®“ÀH`¢ ×Û•AEĨQgUmƒE1õü%U°B8#5sÈ®4k›X¯YÛeôð…Ñ+Œ³™pW>›l~Kh >:‹èhðƒ`.—óõZ^MðZؼ߬Þ,I… ¤fzµƒÄ¨u(.5±Ûzý‚M0kçµ°ÓðõnúØfs¥ ëã5n>3l.î›7Hì".Êö†ÉßÖoƒÈ»¶Á Ì ³ñÀú cBi$¿Õî(ƈ6Ò†çf@|€6D&"&½+˜ÿg²-QÖ‚&'fÎ`ˆ ³¶”ßà#-† ¤ëœÆ³ÙU¹0²U]”ØE$ˆ$0& L×1>†Y[ < å½cœsYf\`dp2¸ÕWµ¾£*ÿ60±‹òËœák³¶x>@«Q¸Í“6cŒ1n¼m+3‘1‘ Ä“÷0"ʼÈÈ{Èr˜°+Hô IDAT…ßQ| ÅNE.GÔñ y»˜¾Bæ@Y'Vp•· C'"n˜]qƒôWùØ7qßQoÁ]`VÄØ î÷ úÆÎ…ÞººeYÒ©àŸ×WˆVZwYi:Ààœë ©Tô˘ÛíîóôÉå fìñáp8¬kI’¼Ç½±1ó48‡Ã±Þ <6Plç>éóôžGoLå5­í˘@Ì)©o¨þA_Ÿ§O’$I–EôR0+`wz>,¹À—yâN"ôqhúöôkV:b Üß?p¸?¯iZ>Ÿçœ NF|&3&ɲ,Ip ¬€]*>Jƒ'>3ú8›í¤§O–$æd.ƒwÈ æ²LQ`è¢`VÄçœU¹Lí“)Öµ¦i`!µ¹9÷É93Ñz×ápL]ŸŠ\är¹éÛÓþ“~"JÜINˆÈ}Ðû"Öÿ»~<­yE1Ì Ø5l›¥¶|™G¿ˆNšÉÐ_éS7¦¼ƒ^<ÄGJÜIpÎ×ÃVZàd v3FEÆ#MVÓs 'ñ}‚ˆdI6… >j`N—(Šâ9Tš(™Ÿ˜NL+û•þ&ë‰ßŒ‡/…]ŽÀéÀ†·@~ƒ¦AÀ‡õ–ÿ¤u¥púCa©[š{4GDÚ’f…wXEìÕZ×ý¿ë_L/â¶šyª­,ËÉûIÎyäjÄ{Äǽ ~÷ˆ©RÑQ˜èvænÃÃg†‡Ï úŽnQœýQú*0Ûo숰3û'^8õƒ $2VxÙú£@ ^þm`\ ƘÈpð)Ì €ø; ƒ´enEƈsZÝ9pƒqÎ9çdè$ˆdpNÄ8'IBG³ >ÀÎ!«iœs&7ˆI#ƒHhC¯Àˆ3'Óˆø²®ëº(ŠDÄ Ê-iªË…/Ì Ø"~ƒ´˜ü¯Y³3Ðu ½­Ú›‘ÀcŒ‰dpýUÞLÖ_åóšÖ)Q 0+Ì Ä¯I!ÀÐÉàúJÕ }ûZÅ 2{͂Ӟ8Œ³¶dŒ€´º?àœˆôâ±â¸õú¦ a Îâæì€Áõ&šº®VIÀ¬ˆ°sz)28¥™£çÇÚÒ˜ø­é̳´5Jf'9ç:çðÏì€]'>Gubņ뇣Áì 3ѹN%8qƒX±ÃhqK‚ÃÊÔ ‘Hç:7'Â☰›Ä‡¥*( (í:D6ô²!r1>àÊÇ2#FÄ‹ýãÄÍ [ŸÁk¾äD̖Ή³ùí'²m½oµÇÐÍA¼Ùc×7+‘£µmñìt88í襊ãÑ Šº€1bæ«¢€0£9/E šJ¢^,b) ÎÊ2”ߟxÍá¯Õ«…`SÌÚæ†Á¬@|¼>‡còo“½î^²MÍhšvÌ{L–åèçÑ5‡|CŽ.DZßÓ4­ºÎÄ„£Ëáèrôêÿç<‘­è¥Ì°ÄBÇP¹&/ŠN%•`Š K”˜¢”n%æ+/hïvJ•”:§b¸AúŠ9ˆ‡¡6׬íÐ0+›ˆ$Isósö”±ócÃg†³ÙlêÇÔš‰W'VõÕáSÃá áê:§S×§VWV#—#Á³A<"›Ž®7¨±+þqËùQÓiÁJ:ƒì~²M¾pÛTKyE¼\ŽPE{J-¬ÿTpn¾¤MçÍûOÕ}Z”ý=»Ì¬meû˜5ù0|?hVhý©îÞàûf^æ¬Ù3Ñ&˜|˜ÄÏ€øØ‚§‚’$ÙSfîÎÏc‘K‘5ÝÝ$Pàd`úÎtuÞ#ÞÙ»³ÉûIß ïùÓçxD¶ 3àõS¸Ý«Q®!,aQ&Uªƒ9Ê"•ÅwY©ªFí©KøÂXäê„õ2ru"|a f]ïÇØiíi¯Y#W'/þ{aD”ýå¹ù·øxÎóŽ't6´Á:/…#ã“øÕ›sVÎÖç–rf¢kŸkÄ\ÎÑåp8ò^9—ËU×9}{šs>ôî,Ë©')<"›ç¼HÕÎyV½QÐÅY{<©M~Ø”K¹"±WË‹A$%•S*hÕ2x3Á},Ëæ˜2y?)ï•û<˜µŽYÛÔ¤meÖ¹ùyI’zÝîŠtÑ)|ʼÌl¬Ú^·[’¤¹Çø)[€$If‡]OÔNì–VWV-jTÕ-=H>Ð_éS7¦¼ƒ^<"[Ò%ÔM±&V*|–b(VÊ\ é`5Ö³0^æA±îRÒ! ÛÓˆ‹\, Xÿ2j&êËZðý ¢öøÏõ庽]^Óüg ÙòšFDýÙ—9"Zü1­ìïYH¥ˆ(ó43Ð?°ýͺÚÓ.³ÎÞ› ø†ªëÔ—yôËØèŸFêÝ¢ºîC}ñïVâÏ;{w¿<âcó œ ÄnÆÈ Èx¤q¢oЗþ9MÅnÆjþ¬÷èI|Ÿ "Y’µªï6ØŠÞïš{YH+ÜöÒR"+…t0ªŒ9%›"©¬­"e{š›/èu»UU }tN= ZÖð剋ÿÉ>}xwèŠíÁ« |)xw(ûôyp8¾!¢þ£Þä£$%Í1ÆæÍQòŸIïQï0kÙ.f{œò¼]ò²X1=îÞÉÏ&å½J½[؉ŒG¼G½éÔ V¢çx>ÄÇ–01>1˜Vö+v=Q31z-zîÓsÑ1ym2v3V]Uüf<|)ìèrN¦oc¸°CR®×ë·¬­;ìâ€Wê{$©å )¹:ŠÅ+½#ÅÊí“8µû¤-¬×Ùœ½7>?Z¿ÞŸíUUÈ7蛹_7Ð/ù0é?á'|ǽÉûI"òõ&ÎQòQ2t6”4{©‡óÛE|44k;ÅÐv1kæEFUUë¥óñ<½81‰^Ö»E™ûä~2è@cŸœ³ݪšy‘Á/è(¶Áöê“#ö—ÖµÔ-™C mI³bQë%>øÜ¢ÿwý‹éE<­‰: ·}ªÚRŒSÙêb¥”’Ú`e!–1S9+íMf_j«7ja}Ô7Të_mISÔµ×>hš&:‰Œ™6oÿÀØù1óÔ©ØѾþ˜¾ÌçÏ}}cj»›µ=bh»™•/sÑYcëUÑÉ‚g†Ç.…ëÝ¢¢r·DDŠËe¯/cÏÇ Ërò~’s¹±†5A ‘ëþ–o)Fö5/U‹o¹5;cóØ·aöBXY %ïÈz[¸&’$e3Ï­akƒlfè€Î¹©ŒE's¿¡Æþó¼å‘%Éó–gòFÔó–»f‡´½ÌºZس2'«M¢sÛð©êv\Ý®üÿÏÞû‡6‘íÿÿ¯¼™ÂèºЀ‚SV0å-Ü„-|®tÄ7t‚BÚ° ¾ã]¸[ïµù oÍõ‰½à¶¾ÁÛ¸Ð5» ¤ÂJ"\i„+Æ?\Ú7¬4\š . Â-dÀÂè€ß?&¤ùÕªm’¶ÏE&'gfŽy™ó<¯ó:ç¬hDdþ[<}•³N¬( >v€è­hà¿â'b柙è­hƒDÐzjÌÔ+ÄÆõIkÄs˜‡¬r11*ó”кeƒ‚©±È‡±ãÊ eñe– ŠßOª'ýu³ (ɇI2(õ8­œP¬Äèw1嘇ˆ<Ç<±ïcÊ1e˜µEåÙef•ȹ\Á‘‚¦MÞŒù‡ü naá=¡ÄgâdÐäÍÒ/—Ë•{q€øØ6F†Gò¯óïÖÞ=ùÇ“îucÍDÐú¨Qû˜ªÆS,IaJ^Z7jî Æ7Æò ‚¦´ÂGÍ€Ó¥z/"WÂá«ÇážØt4zc¢A¶DrÖq¸'y?Y÷¨+Цižc"RŽy8ç»Èc·]?`{–ª fõô¹æŸ—ÖN´N=Jaµpy=¥æ-,._ Ï?Ÿsó¸úJ±«óÏç<}¼y@[!à'-ï"ëk¥‚—$·6–c||]›°²<¬"Lu]žp¶1v„WÍÈÕ×Hìøð.r…Þ.IÉ{ñzy¬{—”¼_™­÷¨ÓÊàv¹¸÷w›Y[À®3«oȘ‹‰50}Í[XùÅN¿SüÖ²˜˜ø{ªZ¦ñö¯ç£ ÆJ²ƒXå’¦¥+¬Ê;Rîÿ(KÙ|ºÊ©ÖTÛ÷ê"×\Ðz—É…æ™u¿”°¢V¼W}p÷¹ø*_Ìf«×û_d9çû|<ñéºN#‰‚^«\¾žGi .ßຠ ŸG¹?£ìDÆëúKªT@$Y°­l²ŸuÆ™µ5¼¯Y?’¬áKc×þ:¿s{‹tíÛÉòM¬€øû•2ï7j+õ5ÔKÒ¡J[T™U ‘Ò¬Z¶amuÆÎviñ{ЬmWÂöDP¶=Êg{¥ `·Â ;ˆ Ä… ë@FüD-¯D&ر Fv›Y}0+â´AT`L(õDã3­^LV`Œ8 lWt‘aV˜ˆÞ¯‹LDLØy1ÿsº%QÖ„&'fŽ ‹ ³v”]°ÎGòAÒf³%$Ëm6[ÅØ-0t“ÀcÅ.鯣ÉM”ØA$ˆ$0& L×Ñ?†Y;Ë.ð|D¿‹Ï£ßE}C5FŽ+v~» •bŒsn·3.028Üj«šßPm|˜ØA…UÎà„Y;I»{>r¯r‹/§nM-¾XÄÆŒ{ù°Ó4%cŒ1Æ "ƒ·lf¦ 2&2cöO˜YåìŸ:0 ³ö¯øˆMÇ_c/±éXukØ%ó<ãv¹m6‡Ãû¾˜3ù ië°Ù:l½G{çž75Móª^[‡íø·¶…¬™ìþ!oì‡Xá-;Èþ c¬ Xl¨±yDd†Ìþ‰H‚¨ëèö…YÛFž;\Ÿ±vÉÉèߢOÒOÌžcžÐ…ùQ->Ê%‹­£˜x\9Îûó˜ç˜‡­¿q‡)b´ÍyÔ™Ïçë儸Ø9ææçcwãÙ Mkù4&ë”äC²Òïq»Ü’$9»$ÁK³vB|´õSý.š~š.ŸÏk‡‘¶¢MÜœÈþšÍd2Vbâ§„ÿŒß{ÊKDsÏæ\Ÿ»ˆhyyÙÖQ9G¦fN°sxúû=}ýMÓ …çdpjùLHH`vÆ$»MÌ ØÑç²M1CMß­½³ÊÈ9—e9÷*'ªá€Qe@ ž ÊWåÞ£½f¢Ô%=I?!ƒbwcÊ RøwÁL,ä ÿõš9ÁN×>»$±NÖmð6YƒÁœ–) MÌ Øâ#6 ]•1vþ›ó±éXd$—ï¢Ôs¸gb|Â7ä³Kv+¶TT³ÿÊ:8cwc±éØÜü\½œ  PñSÀ¬ˆcPòArá—…Šä±?õºz#Wkˆø¸ÿ´¿°R_)‰øñà‚þ3~(ñSq¥çè¨ÄŸ~švq&î'äÀ¶ÓÞ³]ÀvÓ>§öVÀéà·@3øÄ > >ññ€ö« ƒ–¡DÔ{”&â€Y`o¶O¼¸ëHd¬ø±ù[|ãÓÀ¸@Œ1l¹³ >ÀÞ m•—W@‘1✄f7Ü`œsÎ9: "œ1ÎI’ÐPÁ¬€}*>Ü.wèbhdx¤ÆïÆ}C>˜mWSŒ0t2¸¾V5BߺRqƒÌV³è´'cÁ¬€ý(>F†GbÓ1ëct:8°>fžgÜ.·­Ãæp8bß³išæ÷ùEQì9Ü“y^ô‘Øl¶Éÿìuö‘¶¢WŽÛ:lÇÿë¸åVI>HÚ:l¶[ïÑÞùŸçQ3v°=àœˆô5*C…÷þÛ ΄õѳÕ4[,]×ÑE†Y;C»ÊŸÉD”ùgÆõ;×üÿÍ“AÎÿtZß¾D®FÔ“jü^ü}ƒÄNiô«`îMfmhÖ¦©Ì:7?/IR¯Ó¹½wéu:%Išû‹>ˆ6m¥ÔŒÞ`uß‚ìà ¯¼iy6G_åÑ騨ŸF+Ò˽åÖ±¾ª¾ 8äßp@_åûƬ»¯<ÛkÖÔ£Y¿êÝô.Mó ¯S¨ >3¿uuÇï%­D¯ª¤b¤@|Иuïwµ&Ùfb¢fx«%8xý<5®\*ÏÖüóÖ°}³wòÛIû§Ž­œ¾:qù/‘üË%ÿ)ïµñȾ1kËh³Îý’qýεé]ÂW"þSÞüË¥ÀH |µò:‘ñˆ2 d3 /J;kº>÷Àó >جKÊõzíVq°é˜K½ÓÙ–N¯º{Ö"ÿzÉü[Ê.NŒG¬à寤§ze™RÕÙÇé}fÖˆ¡61kîUN–åMï’~šöô‘@ê %]uÔãtÀç'Bßœ·²œ{•Ë@|°µžh±‘ÐËüἡ«cÓ%=6u¥Ô²±6«[ÂÍ;Y`xd‹ÃöÚŠæ{{zº———÷‡Y[!†Ú̬|•‹lÓ»hšff«žó¯iš½K""Gwwùø*–0» ?hz™o&¨Îú¤5§ËVŸRsuÔêù/ìƒJX§éåš$Iõ¾-¼—$)›YØ{O^û/áÕZ³²N¦×Ñåw‘$É̦s^}ëî®îŠfï’ +¥[뫜ubÁxÏ1ê.°QË·ÑxФqüGƒ72¯u÷ú%lHAÓ&oÆüCþjm?û(¥s>y£äºWN(‹/³dPü~R=éßfmIyÚˬò9—Ëmze@I>L’A©ÇiåDåZï %>'ƒ&˃r¹œ|HÆ{@|аjÔ>®#ê šl&)*Ï¢ÆkŽ5,Um¬˜AÏ€RX-\¾8V‘áö­©s_Ÿw÷yœe‹àE®„ÃW#ŽÃ=±éht}Õ‡½nÖÝTª2«§Ï5ÿ|nÓ»D®„ÉYÇážäýxäJ¸â"—/…çŸÏ¹Žy\}¥ØÕùçsž>^,`waÐú.²¾V¡ªW«4©9àR3„UéVqw±ã½»ÈÖ"Q ¾òªù\ñ8ðEq}^»$%ïÅ÷ŸY›M»™Õ7äG‚gƒïbï’’÷ãõn-v²øâ·þ“ÅÄÄßSÕ2ˆêvFkÁjÉŽÙ¨Ö<[¶…ëp 7ï:7h]ö«Y÷N +;ߢ­Ý}.¾Ê³ÙêuÆ>†ÅYιۅ]¸ÄÇ6a«µ÷»wïl6[ùZé`סë: Œ& zÃþq=IÑ8È´ƒ¤‘.a‘@fÁ¶² ȇõžaÖ&³fýxû†/]ûëdüÎímü^ûv2| nñ±}X £Bm@yìzʼßl“ È7 #ÝTpTH¶%‹;jÖÖ—°%(ʶo²½Rˆ°gá‰Äâ‚Xžñ ·öi™@bÇ.A€YaV >šŠå±ÙlS·¦ÂWÂDÿ!Î |X^YNü”ð ùˆHÓ´ÀH õ8¥ (‰Ÿæ¤y›Í6qc"6[Ì.&$ýgüDä<âŒ}ëÿ}?*Dó: cB©'ŸiõæcÄI`íÐE†YaV >Ú—ì‹l>—O=J….…#ÜË\êqÊÆÿní….†&®OÌ™ý _ OÝš2Ï’$in~ŽˆügüS7§Fÿ8š| œ ,½\B…hN™ˆ˜°aæëüÏé–D X"˜@œ˜9^€.2Ì ØQv÷:‘«ÖÉ|C¾ì¯Ù±?™Ç´þŠ™}8ë<â$üCþăR,p:`zA”cJêa*ý8­ªPMƒ ¤ëœÆ+vI76Mn¢Ä"A$1H`ºŽþ1Ì €ç£>R—dý'ª^^^¶uÔ˜2cåLü”ðŸñ{Oy‰hîÙœësLWkJ+ÅçÜng\`dp2¸ÕV5¿¡Úø40±ƒ «œ! fÀóñÁÒäÝÚ;‹šž¤Ÿèoõ©[SÊ ‚ÚÐäÃNsNÆcŒDoÙÌLAdLd1ÆìŸ0"ʽÊÙ?u f@||ê šýW– Šýóô×X~¸çpOò~’ˆì’½zI°Cø‡¼±b…·\ì û'Œ±b0`±¡Äæý‘ 0û'" ¢®óØxÿï\Ew=€Y;ÑAØÃÿ·è¨ÄŸ~švq&î׈ºÿþ!è?ã'?%Pšƒ§¯_TCCÁ/Î#N»]Ò×—ÜÐ׈֚·Yi8Ààœë ™Lt:æt:Ý.·}cà€YÛHqÚjæ7î`ùùÆ.†&¯OtÀÞ‰»›å7¹îòò›\ËK27?»ϾX(hZ˧!0X§$’•~Ûå–$ÉápØ% ^z˜°ä¹Ãõ#,2ZÖQîï÷ôõ4M+ œ“Á©å3!"Ù“ìv4Q0+`GŸKZVûì’Ä:Y·ÁÛd sZ¦(0<0+âìÙ ( Œˆ‰ø)`VÀ¾á?ðâ€ø€øÄ >ڛͶiÊ\Ø/`…SÐ2tƒˆÚ`ïÒ£ÀD<0+â£ÚŠæ?ãO?K+Jâ§„$Iõ-®ýõšþVŒGˆ(ù é?ã'"çgì»XÿïûQšÚ>ñâ®L ‘±âÇæobðOã1ÆD†]×aVÀ>õ"6F/ŒŽ <ùÇ“™û3¡ ¡Û?Ü®—hý[4ŸÏOÝœ2?úÏø§nNþq4ù 8Xz¹„ªÐĶ´U^^EƈsšÝ8pƒqÎ9çdè$ˆdpNÄ8'IBC³v°q÷îe~ã–4}é} IDATooìbhòúD÷¹ÉÊÃ,^uŠýS{>—gŒsî8è(ü»P/Ñf³Ýþávl:67?g]ç¸rœ16öç1Ï1ÛOï£å7¹îòò›\ Ë_Ñ8çL ³C,IRËL`p"ÒV9_-èk$Š¥}ÐäînŒI¬€m~Qp‡ë3F»7àT[ÑX'#"Ƙ¶¢5H$¢Ô£ÔòÊòò›e+%ñS‚sî=åµÛí™çTˆfRøwžˆ¸Aº®“¡·²(#1ÆÉàúÛ‚™¬¿-4­]¢`V˜€=ÇnR—ÄW9ñU.uI ‰(1“ˆ\‰Œ]+?ýIú‰þVŸº5¥ *¨ͤ`èdp}­j„¾u¥â™­fÑiOÆ‚Y%ÔA5~/N%&ÕAµA"‘@#_Œd_d3ÿ,:9z÷$ï'‰È.Ù5MC=hj{À9ékT‡( ïý·=œ D3õµõK×ut‘aVÀΰ[Ç?£7¢þ3þs_ŸSO¨ñ™xƒD‹‰ë¡‹¡'ÿxBDñãÁ?ýgü$Pâ§êAó[)28¥ ™cC-)L|&‘û-kõ’™Á‰DιÎ9üó0+`?ŠŠhÓòsܤâÛš‰Ö)Ê E9Qaéÿ}ÿbvæo :שä'n[o0š\’Àˆ¿²5H$ҹΠFĉ09fÀóöFÙÐ7t‘×ã®Ù®1bDĉWl~Ù9·tâpÙ±UC7;ñf‹>Þ¬Ôä`VÚ,¯ZÑJ­÷G+°äBõ'ný[¡9*rÖ<±æ)Õý㊂m1k‹ ³ñçÜ Kl°f…D0ÅDµ¤°$O,O¬)åeàékf'†Ú³6UsÀ¬@|`¢ëë‹@4\ ¢æ I=ÍQž¹¦Ï£új5üëå)•°>Ê 7ñ Y‘˜xT½;÷ÓV´ÝnÖ°çÌš~š| "ÇÁëOvö¾<—+[ͨÇÁžz‰¾á@úio'ñö.Õ+@lL© 4ÄVÊæßnVžšdÍF§cúj)§¾ªEoE³¿fwî—ó (»×¬»¢<»Â¬‘ë“—ÿ'lç_/™‹¿Ì¹>wÏ?¬ ‘+áÈø$^NâìY8çÅ0@ªíœ¯V[ŒÛ0Ç™ÖV$Yå!ƒo18@TgÊzÉ3÷ê uGºv^“fS³¶ H{Ѭsóó’$õ:éb§4úU0÷¡;'ô:’$Íý‚åžÄØ«âÃh”R3z£b U »4yj›—°&þS–“‰ß™Q‡|ÖÇ…LFô:ä§Ë¿7c&4Íw:à<êŽý³|àúªø2à{|ëÏí8Øû1æêó8äžÙG)Zw[gÕ¼~Ûšu•§ÍÍšz4ëWkŒé«<:ûÓh©HÃÅ»ªÄù­ó¨;~¯$³¼ª’zˆEÄØ«¬{¿k®5Y®*jЉšá•1¤eScjæ©yåRy¶6^ ’É ÅY³ÍàD½‡K;/ž¿ûf4ÿr1|)¾1#×'ü>ïÂ/s‹Ù’?|uâò_"ù—KþSÞkã+=÷zyîYúö­©s_Ÿ'¢üë%ëßz×o[³¶=fÖ¹_2®ß¹¬VÌG³wòÛIû§ŽâݯDü§¼ù—K‘@õu"ãe@Éf^,X‰®Ï=ð|ˆ°w=\¯×n՛޹Tg(Ÿ³ùMÕÝk”°¾!5v/NDñ»qßI߆Fâéï J ùøzÇ7ý8í;é ](-ý™zœê•eHTg—‚þ._óª5çhÔ¼~››µ%bh™5÷*'Ë%1dÅ|,e'Æ#Ñ›Ñb‘ž¦}'}$zBI?®Œ$M=N|~(ôÍy+Ñ)˹W9¼ @sÀ"c u=Ñb#¡óõeŸj® V>{¥bÂm7Fµ+ÅŒaÄ*‡lŒÊ [ï»ûOù='”ðÅPòa*ýx¶ü«‚¦Å~ˆeÿ•Ë–u.—W–ÅNFDŽîn+Q[Ñrib§ÔàÖ5¯ßžfmÚ£få«Ü¼WÕeY`x$t¥ˆªiš™Md¬:¦DÓ4{—TQ`±“µƒŠð|´’ÔÔýS{1ƒÇÌf#Ü6›í}¿m| ØÖ.2o,¨NL’A©ÇikO+ ï %>'ƒ&ׇiˆ(—ËU(-öø ¢ÈÕȵë×*'¯O†×ýŠ`·z>ŒÚÇ5åBùɦ3ikÆ‚4p„l±TñŸò‘×WÙºLݘ8÷õyw¿§·ì…¾ž}”rõ¹]}¥˜ÁÈ•pøjÄq¸'6Þ˜hÔ"žPz]î×oO³îÆRµ­Y=}®ùçs%'ÍzÀ©g@)¬._³îžHÎ:÷$ïÇ#UïÌË—ÂóÏç\Ç<åž>çéóàšCûÆ|¨'U銔z˜R×;©‡)"É<ÏÿÌüšéîêŽ\ÿ$"›Í6qc"6[Ì.Úl6ÓùQ3'eþ™ Gâ§„ÔµÁ'©iZ`$zœR”ÄO Óc™|ôŸñ‘óˆ3ö]¬ÿ÷ý¨:ÛØEÖ×6(†êýáªMʳ5Ž©p„T‡•èk$v¼wÙr¤;º»ËêÖ±÷¤ê]¯ºÁ¯ŠÏ.IÉ ³Ÿj9Ãí’”¼¯wýòãØôíRçµÖõÛÖ¬Íg¯šÕ7äGÌÅÄŒæØ»¤äýºw;YüNñ[ÿÉbbâ喙vž" _ G®—&‰E®GL·Gà‹@øRX«GÆ#¡‹¥ðrI’ææçʯP/gôVt!³0öÿ•'š„.†&®O¼Óßœ _*>Šþ3þ©›SïÖÞE®Fg¨7ÛÕ­¦bÀ¥žŸ£AôF½}ãêù<Þ·„=Îê¿gÉÎÞ¹gó:çÑ›QO¿{ÿ˜uo—ðc̺•jSŽ»ÏÅWyùœÞmañE–sîv¹ð‚äòiš–yž1}ÚŠfF{,f}§}Œ±àÁò@îÀé@EhU½œ‘«ƘzBMT-ª3ûpÖyÄIù‡ü‰Åo•cJêa*ý8­ªK/—Po>ªKªë$0˜(4êדƒL©á4ݺ„ $ dl+›€X„Õ Κ¸>1za¬ÇÙ»]ŒŒGö¡Y›ÌûšõÃø³¾oD*…/]ûë6/…~íÛI«¯@h÷©¶‘+‘Èx$‘LDÆ#V´‡¶¢MÜœÈþšÍd6,‰Sª]/g·9ÁL¨±°ñòò²­£ræKâ§„ÿŒß{ÊKDsÏæ\Ÿ£ð”y¿Yà X>DÒx­°z#2C-Õ#5›–p{ñŸTý'Õ}nÖv(á®6«2 (Û½ËOüÎm¼™ÄG™óã´/|5<ÿó|6›µ&¹(ƒŠ2 Ïå«rïÑÞFOiœÚŠ&uIœóî®îŠS¤.©/Tü0R—ô$ý„ ŠÝ)ƒJáßT†$vˆ ÖŒøi¸µOƒÈ;vÁÌ ³ñ±ãÎßißä’›1ûk6ö}L>$oê'¬—3|5»$±NÖmð6Yƒ D†'f@|€=[E1?Ì Ø7`ª- >ñ±-¸]î™{3‰3wgÜ.·yl³Ù¶åFÖu¶ë‚Ø•â#óÏÌĉò]a5M‹\dþ™1?–ïψmÀÊ¿·>ÆïÆ}C>˜€øØ)F†GbÓ1ëct:8°>Z£$ÉI[‡ÍÖaë=Ú;ÿ󼙨išßçE±çpOæyÆJôª^[‡íø/÷©Tyžq»Ü¶›Ãáˆ}³ný[ÔqÐaë°%$\P[ÑŽ+Ç+ËÇt—-òg2™ã,óÿ7O9ÿÓYÍÆ?usêÝÚ»ÈÕHàlQ„.†_ô·úÄøDà‹RâÄõ‰wú»‘Ó#áKáz÷ |_ ëoõÈx$t1d¥çr¹ÜË\â§„ÿŒ¿ÁG/ŒŽ ¼ÓßÏCB þƒ5K€RÝ ³ÈüÆ,ß ßØÅÐäõ‰îòGÝÌf{÷îݵ¿^Ë¿ÎOÝš:÷ßçdY¾ü—Ëfº•ˆŽ+Çccóó0V\Ùápär9룕˜'´ÍyÔ™Ïç˯c”0ÈÖQú¶P(H’Tž³æíŸÚó¹<ëdœsÇAGáß…Š‹7.yû°ü&×}@^~“CÕÐdòÜáúŒQK¦ÚŽ Äïŵ-~/>2»d·<ÕA5õ8¥žP““¡‹¡¥—Kfbö_Yçgìn,6››Ÿ«yÁì¯ÙØ÷1ùÜ .ĺKõÕA5~/<L>Lªƒªõã%$ÕA5|5ܸ䠲}âÅ]?˜@"cÅÍß ÄàŸÆbŒ‰ ŸÂ¬€½'>NBBõÆ\ˆ(þc<ø‡ ÿŒŸJü”0£7¢þ¿÷”×ù™3qoCbúiÚyÄ™¸Ÿ¨{Á;qÿia¥¾²‰ø¨yÁè¨ÿŒÿÜ×çÔj|¦8UØ S•:¥‰ëK6¶ ¤­òò (2Fœ“ÐìÆŒsÎ9'C'A$ƒs"Æ9I*˜°s45à´œv8ͯhœs&Ù!–$©e‘¹'"m•óÕ‚¾F¢XÚMîîÆ®‹0+`›_- 8ûœÂ¿óDÄ Òu ½•E Œ1ƘH×ßtô·…‚¦µKÔÌ ³°ç€øÍ¦`èdp}­j„¾u¥â™­fÑiOÆ‚Y;ÒGÀOšÝpNDúqƒØzü€ùú¶ta Îâ3õ5& Ä âº®fIÀ¬ˆ°wZ)28¥ ™cC-)L|&‘û-kõ’™Á‰DιÎ9üó0+âìt®SÉNÜ ¶Þ`4¹$e jH¤sŒˆarÌ €ø{£‹lèºÈëñ¶ÿ½F#"xé€XÞª@•‰Ö)µ?RõE6Lõ¶Êcèf'Þl±À6˜µ¹%Yhp ZÑJ­÷G+±äBù±.&¬‰JkÝ–RØEm° Œ²¯„Ú!‡Vy¬‚í1kk ³ñçÜ K,6 +` e®‹ò¦¶() «{ͪ2— ”Š 2…*ËÀ Ò×ÌNüæÿ‘ÜËœo8à{\.wl:³62kK4Ç™ñö º¾¾DÍÕ ,EQmÔR$Õš£¾Z:ñò…Q‘1ï ºëc!›µu¼—Y›£)ç~ɸ~ç²>Z1=ÎÞÉo'íŸ:Ìôð•ˆÿ”7ÿr)0(¿¸Id<¢ (ÙÌ‹+Ñõ¹žñQƒØt,ðE€1ø"PÌ¥­hÇ•ãv»Ýaí‘{¬~FÏá"Ê<ϸ]n[‡Íápľ/f³ÙlÑ¿E¶ŽÒPަi~Ÿ_ÅžÃ=™ç+Ñ«zm¶ãÿu\[ïFTßìx—”ëõÚ­uE…8¨s©˜c ÊT ”ó\Œ*_H6©F «pp,¿Î—_$±^ý”~Oæy¦ i ™e½‹\䉓Á¯Î[f±SÚ/fm‘z/³6GSæ^åd¹$q¬˜¥ìâÄx$z3j¹a|'}$zBI?®Œ$M=N|~(ôMIß8e:ñQý: Ø±Ñ¯F‰hô«ÑØ1ëÉ ] ©ƒjá߅̺lWOª©G)"J=J©ƒ*¾„/…õ·zd<*[¶9—Ëå^æ?%ügüÖÕ_ô·úÄøDà‹€•8q}âþnäôHøR¸Þ}Aóz¢ÅZ¡s£JFP™·£bö UO]©ˆ¡Ym_ˆP¶.ÅÆ [é»+Ç”rúìӹ躘;™ó?“×'Ü.7 Ų†œóÀißíbûά-CdÖæhJ¾ÊÅξ7±“†G¬˜MÓÌl"cZÕ°‹¦iö.‰ˆÝÝåW(×@@|%&{½òg2ÉŸÉògròañÁž}4<$,Y ª¦ØO?N›âc1»è;ícŒ¿–?Šá+aƘoÈgµ:³gÕA•òö-f­Dç' äò'$êÝì|¹þ˱Bgl˜óRs†WºC¨NGqæK­!›÷*á:Á¯‚Ñïc‰‡)ó…L&|)<öõhy/9voFP¬”ìo9ßI_¿'v7¾ï̺{JØMÉ:™^G"è\“¤¢p‘$É̦sn%ZtwuV4"2ÿ-ž¾ÊY'‰~M?MÛÖ™ÿyÞ ;]^Y–º$"ê>Ðm½¾ÓÏÒdÐÜüœù×V´ð•°ßç7Ga,ªËå•eÆ*ŸÀååe[‡Íf³Ù?µ///×»/ØyXÝ6*×í òÅÄJȯ†P%&Jñ¬†#¤z‘SãCÆ äݱéhôV´ÇÙüj4ôÍyïIµ¬ óAʉ’ø˜º1qîëóî~Oï!yß™µ5åù³6GSÊä\®ÆàHAÓ&oÆüC~ëvɇI2(õ8]^—L¼'”øLœ š¼Y ÞÏårò^­`âãÃ0CMß­½³ÐuÝ ;íîê6% cn—ûü…ó½G{M%¡ *œóàÙàìÃÙÆ÷’$©z¨Uê’Êïnõ*î v¼jÔ>Þ *½µH…ú’¢æŠìÂFÕ²õRÕÁÓߟ~4›Ï-e~™ |±aGù ,&ËeŠÖ{R{ö$ûb!øU0ÿzÉL´*Ž÷šYwO©š£)=}®ùçsÖG+àÔ3 V —/Ž™é‘+áDrÖq¸'y?¹Réš½|)<ÿ|ÎuÌãê+Å®Î?Ÿóôyð’%bӱЅPùLHÆØùoΛa§þ!¿/u«ƒjôoQsÌ…ˆ²¿f#Ï1OôÖ&ÓtÕA5õ8E%$-7‰:¨fÿ•5ãN<ýÅç³æ}A“»ÈúZÙ‡Š%=6,ÝÁ6è £j²ÚK±Z:¦ÎÝ·ÜEnø¤Ø˜zB…Y[È›µ šÒ7äOü=ee°þ²™…Éñˆ¸îµµwIÉûñ|n)~'n_÷ïZ;YüN<3?ç?©Z‰‰¿§|C*Þ1â£ô:N>HŽþq´"yìOc3÷gÈ ‰ësÏæ²Ã’¦\°þ%¢ø¸ÿ´_–eùð&ŒèèäÿNÚD[øR8q/a%ž¿pÞ&Ú&oLZs[jÞ4­3Z«ªT„}lôsT¸.ªÝF™©v•&Ü ZÂM{ÏÎÞ¹ù…±oFaÖ=UÂ-kÊòÓk®†îîsñU¾˜ÍnïpñE–sîv¹ð’íдûXŸå°N¶ôrÉ<˜MSF†‹½ ç§5>BD¾Ó>ßi_Qµü¹è™,Ï`K]Ò“<©¸WÍÄš÷;Û%Õu Lô=T¡z‹3…™Ž ^¶n:/[ml=±äê(ϰñ#QÅÀˆ2 ¶ÅM@ê‘{¹³¶Öí±f•½®ß¹â[˜“¿•´ð¥±kŒß¹½ÿÙkßN"p@|P¯É7´ UýË’þ0µB¥«£ÊçQ¹ ]ÕY–æØÇʶR ¢³»Ûƒ9¶Ç¬mV–kJe@)\ݶWÊñöÜ ±ƒ¸@\ËÓ#þ»ž‘ $v|¬~¿¨}fVÄØý]d±²ù®ñ™VoH!0F¼¸~ƒeš`VÄØ[]d"b•7ó?§[% v˜@œ˜9^€.2Ì ØQþ?h2L ]ç$0ƘµRdyƒÑä&Jì Dˆ¦ëè쀞ÐôVŠ1ιÝθÀÈàdp«­j~Cµñi`bV9Ãc³vx>@³‘;ÍemcŒ1n¼e33‘1‘ ijˆ(÷*gÿÔY³vðÅOšŒÈ¹‘Ç'ìŸ0±ƒékdv”ubEWyÓ0t"â†ÙD7H[ˆÝ‰«JÑ]`VÄØxúúÕA5t1ü2à<â´Û%Šþy}h­y»‘•† ι¾ÉD§cN§ÓírÛ7.˜ñv7ç¿u»Ü±»ñè­©‚¦µ|ˆuJò!Ù7¨º]nI’$»]D+³ >Àžê(÷÷{úú š¦ ÎÉàd´ÁÓ 0;c’Ýn—$<0+âìÁÚg—$Öɺ Þ&k0˜Ó2EáÉ€Y`ÏV@Q`DLÄO³ö ˜j ˆ@|@|ââ€ø€øÀ+œ‚–¡DÔ{”&â€Y`o¶O¼¸ëHd¬ø±ù[|ãÓÀ¸@Œ1‘aãS˜ñöi«¼¼ŠŒç$4»qàãœsÎÉÐIÉàœˆqN’„† f@|€½C^Ó8çL n'’F‘ЂVgL#⫺®ë¢(7hyE“»»ñpÀ¬€§ Ùþ7]×ÉÐ[ª½ Œ1ƘH×ßÌdým¡ iíµ³Â¬@|ð‘# ®¯Uз®TÜ ³Õ,:í‰ÃX0+`Gúø @³ÛΉH_#n[¯€0Aß–.¬Á™@Ü0¸¾ÆDsà@×uCÂ, ˜ñöN+E'£4!sìb¨%…‰Ï$r¿e­^238‘È9×9‡S„/] IDATf@|€=‚Îu*ùÉÄÖŒ&—$0â¯lA ‰t®sƒq"LŽ€Y`ot‘ }Cy=> ý4ݲbYå1t³o¶XàãÍÚJ`VÚœ‚V´RëýÑö*˜QYB³ >Ài¥Ì°ÄbÃÐü0«§õ2pƒô5³CÁ¬ˆ°WÐõõE Z»D5ëå)•°žcÇs¯rÖÇÙG)ÇÁžÙG)+%÷*ç9vœˆ{ªO· +Ì ³¦Ÿ¦_Ì+X²³7ðå¹Ü›å'6(†o8ÐÊAL >@ÛQ ÐÚà€÷/:¨–¿ÙÓÏæœŸÉégs¥”¤ÕJ½Óó¯—Š­Ý€³Â¬‘ë“—ÿ'l]Äü[üeÎõ¹+x6øaÿûÈ•pd|/ñ@Îy1 Zïœ/É « b7Ô|½¶Yô_©<[/P”ùgsD4÷4­ (D¤œð¦Ÿ¥Í³r¬äxÏf³ ¿Ìݾ5uîëóåW0½ô–¯>|uâò_"ù—KþSÞkã˜uŸ˜uî—Œëw.ë£óÑãìüvÒþ©£x+ÿ)oþåR`$¾ZyÈxDP²™…… V¢ës<â€õ(×ëµ[­m5•° uÐ;û8MDégiï€BDê ÅŒH?Ý0úUPdÌ;¨6žj‘zœê•eHTÍ+ìûÁ¬¹W9Y–˵‹ù·”]œDoFÍôôÓ´ï¤RO(éªë¤§>? ú¦¤„œ²\? ÄØ×TöŒ ½ ædêJX O&3OÍý²ÐÌCDž¾þ…Ì‚ÎyúÙœRrh—¤­C[Ñrã`OïQ÷òò2̺OÌÊW¹ØYcÅU±“†G¬˜MÓÌl"cÕ1%š¦Ù»$"rtw—_¯biЦ`…SÐü.2ß %Èét¿9ï<â3S<.÷ùoBò!¹fsÒI’²™…ÝûD¬fVÖÉô:úCçš´.q$I2³éœKUº§»«»°¢Ù»¤òY¾ú*gXHÀó@±O\=²¥+C8^ *©‡)oYoXTSRÞÿòn]ü[ÁƒÊ eñe– ŠßOª'ý0ë>1«|@Îåj Ž4mòfÌ?T1«§Ï5ÿ¼´”ˆpêP «…ËǬë$’³ŽÃ=ÉûñÈ•pÅE._ Ï?Ÿsó¸úJ±«óÏç<}¼p@{‚aÐú.²¾ÖÊâèk$v|HYd,÷rqCJ'Ëç–ÊS¬YåÇÖAlú¶õ­]’’÷â0ë~3«oȘ‹‰•_¶{—”¼_y+¿ØÉâwŠßúOOUË ><»µ„5—µ®¦A[³îêVT€1´»ÏÅWùb6[½ÎØÇ°ø"Ë9w»\xለÌ-6F½åýc & dlÓM@ö•ªØ?fÝ:Û[—Ʈýu2~çö6^óÚ·“áKp{ˆ,ʼßLh÷˜u§Qe»wùÙ^)ÄØõpƒÄâqA,OŒ´zЇ 2ÄŽ]0‚³Â¬@|ðþP1¡ÔÏ´z 1â$°vî"ì0+|`™ˆ˜@åMÁüÏé–D X"˜@œ˜9^€.2Ì ØQ°Îh6L ]ç$0ÆX±Kº±Áhr%v " Œ DÓuôaVÀÎÏhz+ÅçÜng\`dp2¸ÕV5¿¡Úø40±ƒ «œá±€Y; < Ùȇæf›Œ1Æ7ˆ Þ²™™‚ȘÈbŒÙ?aD”{•³ê€,‡Y;øŒâ'MÆ?ä\ÈãöO˜ØÁô52;Ê:±¢«¼i:qÃl¢ˆ¤¿-ÄîÄÕ¥è®0+âì<}ýê º ~pqÚí’NEÿ¼¾F´Ö¼ÝÈJÃç\_Èd¢Ó1§Óév¹íÌ €ø»›ó_º]îØÝxôÖTAÓZ> Ä:%ùìTÝ.·$I’Ý.¢•‚Y`Ou”ûû=}ýMÓ …çdp2Úài˜1Én·K˜ñö`í³KëdÝo“5Ìi™¢ÀðdÀ¬ˆ°g+ (0"&â§€YûLµÄ > >ññˆ@|@|ââ€øÄÄ > >ññˆ@|@|âì{Šrr›~šÞô”Ù‡)W¿Ç!÷†v»M³4mìbØér;äW¿'rõšÎùÇ_Ähò¯—3 Ž.)ðßç³ÙÆ™CWÂËo–çž>‰ß}ÌMçæç}§ýÕéú*÷žô§Ÿ¥?%–²‹çÏ£ßÇÎ}ufˆ°§°KÒØ…ý~I¡­hD$’I`sGÿ™ÀüÿeªÓ£·¢¹W¹ð¥pïaYd,øU0ÿz)~ç6l`¯át:‰hn~Îü¨¯òà×çåý²³7|)L‘5ºaä^å|§òá^‡Ü£ Ÿ{6o}[ž³zL¤â:夥ˆHé÷Ô(¢A‘«×œGݲ³7rõZíÿF ?øÄNFDËËËæÇðx$õ05q=ÂvþBˆIöðűüë%S.ä_/ÑèÏ¿ &ïųÙãªwôÂXæ—¹­Ü«â:åäÞä‰ÈÞ%UŸ5q+ý>61!¢Ð¥0“¤Ð7£ï•gdØçéó('Õå7Ë ós¹×9ÿ™@ð›óéG³¨Ïh1¦BTÕ“*%$jå™u~挌_;á|¹pù¸ÁMF5ñ{q"ò ‹d~|¯<Ê1ÅÞ%išFD³Ü«ÜÒËE(€ø­¡ iDÔÝÕm~4c;zº{÷Ö±éØqÕ›}•›¸>±]ÅÈD”_©q;³ b§d—¤zEjœÇôîLŒGX'Ëþ+ºîu¹S°>@|€É,‘§ßm~”$‰ˆ–²‹ù×Kù×KùÜRõ)‘o'‰èö­)3^¤£(hÞ õ„BDs¿,TÕÝÝmФ¢Nêîþ°<þ!ßbfáöô”oHå«ññˆˆ@|ââ€ø€ø@‹ð€V¡DÄÉhŸG‰x P»P»€ø{³aàœDDL ‘±âG£˜Ø< ¾ñi`\ ƘÈl„Ú…ÚÄØC¤­òò (2Fœ“Ðì·27çœsN†N‚HçDŒs’$´¨]¨]@|€½C^Ó8çL n'’F‘Ђ×1#Î:™FÄWu]×EQ$"nÐòŠ&wwãá@íBí`‡@À)h6…çÍ·°®ëdè-ÕÞŒÆcL$ƒëo f²þ¶Pдv ¨]@|ð‘‡Þ ®¯U ·®TÜ ³¹*zˉÃX¨]¨]ìˆ8ÇOšý"月ô5â±õ øômé;œ ÄM·¼Áõ5&š{]× ÓP»P»€ø{§y ƒ“Qš 9v1Ô’ÂÄg¹ß²V÷”œHäœëœÃ1ŽÚ…ÚÄØ#è\§’#š¸AlýMÝä’Fü•M—A"‘Îun0"N„Y ¨]¨]@|€½Ñ75ô }ÓõùôÓtËŠe•ÇÐÍÞ³ÙT€=S»l6[3K22ìCí 8­hÖ;‚íU0£²„µ µ ˆ°Gš3°øFnþÒ“Õ­Âz¸AúšÙ{†¡P»P»Ø)0ì𮝝¾`èí5ì½^žR ëã8ØS‘’½´+~ÇÁžÝRTÔ."bÌÓ牌GäÝ»ËÐ{»¦ˆ°Û¨^z¡µ‹1|hyðbEíjBíÒWµèñàÙ`úñ,Ì ö v͆s^Œ¿£Ö{Å‹E2È*£ò¨]íS»ÄNiô«`îMÆ|Ü»x³”Ý[ž‚¦ù†¹Ç7(hš™è8Ø›ŽyŽ›ÙÀ—Å úúhMó8ºc?Æ,—{ùYõ.kÝwÃY?Æ\}‡Ü3û(U^*çQwü^µkw•G_åÑ騨ŸFÍ ™Œ2èuÈ=N—;~oÆÊüïsòá^ϱã /²W˜º\ŸDM`³îvÖÛ,ì®Tž­9Æ{¬?+1|%â?åÍ¿\ ŒÂW#Vºd·?y8KDá«—ÿÉ¿\òŸò^/fˆ\Ÿðû¼ ¿Ì-f7´¥³ê\¶&¹×ËsÏÒ·oMûú|ñúãe@Éf^, ví®ÚÕãìüvÒþ©ÃL?!4öÍhþåbøRت á«ßi_.»xùâØùoΗ_'öcly%¾8†š >Àþö|p½^ƒÑÚæªQ k‘½dýY‰é§ißI ¤žPÒKË–¨ƒªØÉˆ(õ8Õ+Ë$:¨Î®gH?NûNúDÆB6¬ÅiUï²5¹|aTdÌ;¨Z³*RÓŸŸ ml™P»Ú¿v-e'Æ#Ñ›Q3}îéï J ùøºç,ý8å=¡@Þ“êÜÓ'ÖEâ÷“‰¿§"e5 ´ 8­ëßÎ:oézKÖŽ_uKø>hšf¾ÄEÆ´u¯5™‰D¤­h¹r¦Ìòʲ™ÁѽaFCé¬:—­‰Ø)U—ÊÞ%U_µ«ýk—ØÉÃ#¡+aócAÓb?IJÿÊeË\ ËšFB©=é§imEË¿Yv¬Ï”AMð|€}ëùà{¸„’$™‘:ç’$ÕÌÏUºL$IÒW5"ʯ,Àe ›5Ý]Ý…ˆÌQ»vW u®YF 8çÓ¾Û?ÄJÕ£Sª¹vHìæÔØ…ÑÈõ‰ 5 @|€}HɇzK˳Žze@I>L’A©Çiå„R#à eñe– ŠßOª'‹Û¨'”™™½{Ë 4û(¥s>y#Ú¸TÞJ|&NMÞŒ¢ví®ÚUдɛ1ÿP±ªdËùNúúû=±»ñòJ•~–&ƒf¥<ÇŽ—NÈ?ä˾ÌZ¨iâìWχQûxo”*r%œHÎ:÷$ïÇ#ë®òŠ á«ÇážØt4z£Ø% _ Ï>J¹úÜ®>×Ö/kú¹û<ÎÃrãR]¾ž>ç:æ©w}Ô®v+•pêP «…Ëë£S7&Î}}ÞÝïé=$—WØtÌq¸çÚõÉ©›••§<45 ´ˆù­ï›êk­,޾FbÇ{÷Më­0fï’’÷ã 2Û%)y¯2ƒ]’’f7×òuo8«Öe½ƒj>WÌøb¤ú,ëXìdñ;ÅÓý'—P»vií""ïIÕ{R5ƒ_­ú¿W·ÖyŽõ'õ£¦ˆÏÇ®/áö.¯.;{ãÓ1WŸ+z3êéw£’ìóÚµ-TTQ³~¢¦ˆ°OÑuF½åS & dl+»olïÚê×'F/Œ-¯,÷ÿ¿þèß&QIöyíÚjVQÔ4ñö+eng&´{ ›ƒÿ¤ê_÷¥Ô.Ô4ñÀ6à ;ˆ Ä… 0Fü­~D&ر \÷àj×Ȱµ ˆ°¿û¦cB© ŸI´úQ`Œxq¥&Ë¡v¡vñöVß”ˆ˜@åïàùŸÓ-ž·f"081ÓQ¾)jj; Öù͆ ¤ëœÆ+_ºrFb³Ú±ƒHI`L ˜®£cŠÚ…ÚÀÎÏhzóÀçÜng\`dp2¸ÕH4¿…Øø40±ƒ «œá±@íBí`'ç4ù°3÷*g¶Œ1n¼eS"‘1‘ ijˆ(÷*gÿÔYŽÚ…ÚÀ>ø @“ñy#W#òø„ý&v0}̪N¬è£n†NDÜ0Ûâéo ±;qu@)úÉjj`àéëWÕÐÅPðË€óˆÓn—t*:Æõ5¢µæmVòÜs}!“‰NÇœN§Ûå¶oŒ¨]¨]@|€ÝÍù¯GÝ.wìn$ûU·Ë-I’d·‹hP»P»€ø{ª‡Úßïéë/hšV(8'ƒ“ÑOƒÀìŒIv»]’ðp v¡vñö`í³KëdÝo“ÅÌù¢Àðd v¡vñölFÄDüµ €}¦Úâ€ø€øÄ > >°ÇÀ § eèµÁ¦¥G‰x P»P»€ø{³aàÅí6˜@"cÅÍ߃ÃàŸÆbŒ‰ ;Ž¢v¡vñöi«¼¼ŠŒç$4û­Ì Æ9眓¡“ ÒÿßÞÝ…¶‘¤{:ð48Ђ,XÀ´™ÀJl`%6p$&VÈEd2‰ $b3Ú lä œXk8‰Þ\äU|á#g!ÏB6Ú”¹Và+°!òEö ³H Y¬ Q Æ †ºÀ y/ZnË­KŽ-ý˜¤Õn•ªË¥®§«ª» !ˆXR´¨]¨]>`ï¨hš‚% "Eb2ˆ¤m83 îcH,麮˲LD …EMíïÇ—µ µ `‹`Â)ôZõ—ŠyÖu }[co&‰™™Y&Cèïªæjý]µªi;eº v øø@µ¡wC'CèË CãÛ—+aÙ\ÕzËIà…Ú…Ú°%Á9Šz} ‚ˆôeñJÜÀ…ú¦œ;‚%f·¼!ôe–Í{]× —' v¡v ø€½Ó`Ð…N«Ñ$ â•#us¹¶7]ÉDºÐ…ÁD‚W% v¡v ø€½qnjèkÎMwÂÀ¼•C7ϞͦöLíŠ|‘ Y—j³P­esA6d"2_6Ý̶½µÒ\Ú€àvXó°r"¸£Ný¬üX9„½W»¬ø >þ°… íã ÛõÖD6k§”¢v ø€mnÌù€æ™ !Œí Bêo) җͳgü¡ö`íªãŒÆmlñ‡í-õáˆ-²Ñ% Ô.°cèúÊÁÚÐwÖ°÷J~VsØšóÈ€µÌ}ì?îOŽ%ÕÃým¶¯¼yÕáJÛšÆmv¦¦»³sjW}d`EÍ;-Ö®o¬´Š?ì.×®ÞÔ¨NRÞ™ÜP»Áìf3<¶wÎÇFóc õ%mòï™èÑüÓéMɲ[ñ×l?Û£1ì †)Ôl’GËi$º­]=¨Q›ž2ÀÆà&cÐkBˆÚü;ÚŽÇ}5Í’AV~ÈÝŽÊË}Jì«hùmÜ\»dC6ÌÁU4Ž¿4Né°uœØúBê7¨b6P»¶®F¡®‚د̓±þšÝ•}ILÞK|3_V5-t>âTBç#UM³mlþÖuÌ›ù!ÛÕ§4MÖyd }/íÏßÿæî.w¾;;§v™+›Nµõ‘4ïHh–ZÓí;©]=¨Q¶”‡¯ÆG®Ä*/ç×Vʉ›ÉйP¹4}tdøÊp}:éoÓ ‹•ÄèÈ>­]€àvqχÐ[5ÛÛ\µËa3•7¯ÌŸW¥ùÔXròΤ¹>?“ ‘DÁSüÓ¼í]¹§ùH(LÅ×Ö›¦\?ù£U²ÁÓA¹‰(÷4çVU’(x:8½²Aþi>t&$3ǯ®¹Ë§õ®ö¹µ¹~5&3Z×kt²;;¤v5^1Û4"]#õ¶•õƒ8¨]=¨Q¶”ggž ’Ä‘³!±Ò[–š: ‰†ÎggžY‰df§þ'—¬‹!ö[í°‹ÙOI }û‡]Ö>þ´Û.¹#ç/Xã蚦™G^™Ykè$×4ÍqH!"gw—´JÖ\IDÚ¢æTœGÜǼ æÊ…ÅsÛÇ­¾«mnöTÙ¬Ýé}íjŒ¨áV+¶Žú¡['‡mLçCj×ÖÕ([ÊUMKÝžˆ~5ì?á·¶YÐ4’š\†–ŸÉk‹ZåíÂê–û¬v‚ØÕ=bïåPš¢ÔŠ¢˜S.t!¬•–þCýÕEˆÌ;×>YsƒJÙÞe¢(о¤QeqaÉV×k06¼;½ÿÛÙ†Hl36êGdo f›áa-ÛúKê—?°vm]ªO9r>"„ˆœ Ýÿ{zµJô)MïD’¾swäj,9žZ[yöQí°›5¹øPßÖü|è0PUÓ&î¤ÃgkÏò ²³dPîi>p*`ÛxèT ó CM¬t}w¨}²D8˜Y"ƒ2³Á3µÌO<˜"ƒ&碌HV¢é'9]ˆ‰ÛëdrûÓûÚÕôέæs´º€Öö^[c»Îeõkëj”-åÒÏåЙÏçOŸ©¯Hùçy2húIÎâäê›% Ÿ •^–¬û®v‚ØÅ=Fóå]—+kŸ0P]ª^·fáÝHLe§G²3É Û»®_KÌýsÖsÂï9îé*‡í“57HÜL:¤ïMNÞ®ž&®%¦Ÿä<ǽ­>®i²æ¤?ïq¿ë¨Ú>WÞÞÿ/Ti:˜B-.²m£Øz>šk×ÖÕ¨V)ß½úÃåa¯ÏïþH­¯é{içÑ[ãwï¤ì¦~jê>«]°‰~õþý{"*þ,œ\i³ÝÈh|b<ÕXE‘íj oËý‡Õ…m½Ê?úÕFþsDÓ´ê’.³¬é×—)ý·ÉmyîhæÁT~&/ ò›]èŽ>YQ”‰?OÄ.ÅÔ£ª£ÙèÆ.UÕ4ÿ‰@i¯_5ЦvE¾ŒP³i§¶;©×‡#íÿ¥†û•­y£QEí°©§çcFÏló¹)r¸ÕT—{öùœ.ÄäI¿Ï»ŸkWcŸ„mž‡m³¦³7šÁÔ÷—4½šµ À·W‡^Óu$&‰eó~ÕË;"W,Idf¬“g»ì©ñTìêÈÂâ‚ï?|“™ØçµËv£t+† †Ë^ÚÜÿtÝþÔ.°óÔM¸ci§çp· Ÿ †ÏQ»¨aª‡m¡ÕËÆè¤é“çê{Sj)@í@ð;…0H>@B"!­éÐŽ\o÷·Af‰ä{ªcµ«¾vé$Ȱù¶v¡ýËZÜ@k±m¹^P“ȵ Álÿ¹©Ä,­ {?Û´á«ÀL¢vo¥=tnŠÚ…Ú€à væÇÒšsùÿÍoËäù@m%ÄfG=ÎMQ»P»¶®v^c‰t]ÄÌ\gëHÝã¶A>@$É$1KDë:NLQ»P»¶z> çͳÂá`!1‚ a5½o!Ö~X>@Õ%ÁøZ v¡vl%ô|@¯©G]å×e³`fabÛ.¸•df™%bfÇA&¢òë²ã×N„å¨]¨][øå@@…Ï%o&Õ±”ã ËX_&ó U'®õQ÷Œ¡‘0̶„Aú»jú»L>m储IDATp0Pë'Ô.Ô.°øû‚§ƒñÑxôbÄõ—áèTë×—‰–{w ¦Õ~xC¡ŠÅÉ{i—Ëåõxkg jj‚ØÝ†/ǼoúûÌä7w«š¶íóÿY"îSÔÔÐé ×ãUEq8d4¨]¨]>`O¡ú|þ㾪¦iÕjU2;àÛ ±ƒYq8Š‚/jj‚؃µÏ¡(ÜÇý†Ø!7?0¯‡”%Æ7µ µ ÁìÙ (KLÄ2ŠP»ö \j >Á‚@ð€à|‚€àÁ ø@ð>Á‚@ð€à| ø€àÁ ø€ýÃydÀúQº##•Ņݸ í·™~œóøüNu r>²éoo‚>`÷©¼yUyó*5žÌÏÌ%®%¶îƒfçæBç¯ß,ñ‰…· ³3Ï2ß§·"ÿû–„"€<$Šçgf·î#ŸEºZ¿Y´EˆÔÔ-Ê?À¾…žØÌ V_ÑËÃêQ·êr'®%È üó9ç‘ÈÅÕ8r1â<2ŸÉ7nl2‡"ÿ<3d5Øìë JÞ¼å:æU]îäÍ[MóX]Ô‚gÞãþ©GÙúõM³aK¿üº:Qºê@`ðäìó¹ú¬6.·Ìg=ƒ7®c^§::©¼]èpGZmS_n…b1x&ìTÔ£îйpùe•Ðó{‚AÙÇ9" œð›+cÉÜã\j<É_³âHŒŽ¨«ù™¹ò˲zT-¿.çgæÔÕÀ``äZ¢qc+í çCþã~Ç!Ål¶+o^ÕråÍ«úõ©o&'ÿ–N%‰(~-ÁŠ¿³e6q3Qüg15ž*þXX³¾YžméÇþ8ý*šý!3_* Å®Ž쨳ǖN½äø­ô·Rã)×oÔ¡OÃÑ?Fs§;Ù‘öÛ˜å8\x»P˜›-¿)‡?‹D¯ çŸL£Âz>`wspªñ«qßø’7“æÊÜ“Oƒg‚D4õhŠˆb_E‰èî·i"JßKQìËh«-Ç!¥ÃÌd~ÈQèl-)ó¥96:ׯoŸ•m¦]»’c·†¯ÑÂÂ&L°z4mæÇëñTÞ¼Ê=žîpGÚoc–›¦iDù"R~]~õr‘ ø€½ òæUæ»û$‘š¢Ô¢sž„û˜wà¨Ûj¤#çBŠ¢df+ ™‡YEQBçB­6¶È}ÜyfÌ÷Ê}ŠCQZf{,÷±CYӴφ)}/}28Tz]N§6«WòÌÝîHûmÌScIîãÒOåøhÂíñN=ΡÆ‚Ø ƒ‘¯cÅ•nM˜kÌ(äUiÞ¼¦R~ED$qôóˆ"z)&„ˆœÈÌ-7Þþþ~"ªjZUÓ¬—6Ê!…ˆô¥Ú6«ë;ÈFò¿'ˆèþ7w].W“7È–fçyÖ—´nw¤“mÂgCóÅÂý{wCgƒbIÄ×vö ø€],v9¦(Júû´9¥1x*@DÙGÙÂEç‘À©!s³è—Q’¨ø¯"Iý²6ù´ÕÆ6ÜÇD¤/‰6ë#gÃD”{œË=ÎQôóHÓP‰ˆ²sw&ë×w’ ¥‰¨ô¢ôà»5cêá~"*‹“ßL¶*¢VùŸ"¢ì£\¡Xtž w¸#íìé¡£nç!güê99QWÁì2sôó”ø¿·ˆ(9–¼pþBr<5ôYØ÷‰/ý·»æfŽCJèlˆˆ‚§ƒÎ•3õVۤƒÌù"Úf}üêHìR49žJŒ%cŒ _Ž5齸–ðüΓKyÖö^t’äͤ¢(á‹‘ùŸJõë¯ßL*‡”á«q3²é*ÿ‰Ñë>¿K…¾O|é¿Nv¸#l“ù[:0è _ˆøOz~ï¹ï.ê*ì¿zÿþ=N®´Ùnd4>1žê?¬¢Èvµ…·åþÃêÂ[\x ½VNÏÇŒžè5€à| ø>Á øØzŠzI7ˆH’Ø!QËÒv|,@/Â!„ADÄÉ̵—Fm%ôˆ±ö9— ‰˜Ù|Þ8‚ØKu4ë±®‘ÌLBÔÃÊDÂ`!„‚ $™ !ˆXR”žÅ> *š&„`‰„A‚H‘˜ " @¯1 îcH,麮˲LD …EMíïïM\€ §Ð Õ_*fåÖu °m$&‰™™Y&Cèïªæjý]µªi½™“‡àzAADdèB}¹6â(K$£ë `û¢a0È<'BhKUÝ6#d‹>…= - ǯI×öK]@‡tÌMØ,†`‰ÄÊÉ¡.‘|PÖ–K‚õâóÑó=i6–ªdè !ÄJ -tÍ Àv°¦Ü¢vÕ¡¡ëKUažØ3j—ºBÄVÍ6IŒøcP¬eföûü©Û)EQ6­Ê-jÊ!¥óõdøUùU«ßæžæ†/Nîs¿Û7œ¥óÐD]„±rXfmI8{üàO=`Nõ0ƒka0BLDL…³o½z9oUôßÓ‰‰»·S›•xàT ðãlçë»=^Û _¾{çnp0@]5âC³ÔAÞš“ ²NÍò¾LBôî> ¬ÙÔkŽ•¯~`ßþˆHâÈŨÿ„+ƒ¦iMSkµ¾» 7iû)0D]»Í?$Kå `-–š¬MÔ[s> 'ÍŒ0§š®¾¬YV›m±$¢—¢îcîèQ±T먼©QåM%p*Ðt"r»ÜéïÒC§‡Ü.·ùÒö!¶õš¦E¿¨%¢iZÓH%úEÔ{Ü›}”]­Ì ]ŸléE)|6ì>æöŸðgfë?·q¹1Kk¾5Kbøò°×ã:=TzQê$ÏMk åŸæÝÇÜn—{èìP±XD½Û¿q¿!êj3?„èå7 'Á‡YÄu'jvÙ×VN¼´_ªS²•1‹äx2q5®U³¦R·“‰k‰À þy>òY8ÿ<8 C4nc&å8è˜ú!Ã}ì>æQ°ÛÍ¿(Ô¯OŽ%‡NÒÌ=ͥƒɱ¤-ƒ©ñ”ßçOÿu2aþªEöê“ÆG®ÄüƒÜã\r<:´íìšeCزT/9ž Þ½ÊÍäã×âÓ¦Úå¹í™ÅB†¾:|ý¿®G> çŸæGFGòOr¨†û7þ°:<¬Ã2‚ØsÁ‡Þ¤á‘=û™û˜×:O×f}È?͛˾O©;“ñÑ„ßÈ>ʆCá¹ÿ £É6fJâZ½jU»¬õ³ÏgׂÈ"K5nŸžŸúzJE/E³³­²WŸìÔ£)óeðL0q#a¥YŸxãʦYÍÏä£ A æ6­òÜþ·V±x~çÉÏäN§×çÏ=Îá ˆè5‚ØÕt[@mè‚dóBsØ·ÌY–ù™üä7éÄŸF˜kGCMÓ¼oý!Òëq%nHˆÂ‹Brì:¢qó+‘¦ÇV{‹¦±T»á¦iÛk‹šã L†p:Ö[}´¹P­V<Ì–.Ï›Ói›f¦qe³¬j‹Zã# [æy%oMkKj,¿–¾2̧ïÝu5î}Ôó±ö~Ó:z>`Ïõ|4Ôió†z$£pöùáÏ"Pù¥:r-1ñç s½¢(¹Ç9ëà$ "IV?V“·SêG*‘,ŒfÛ´î`hÕó¡(Jõ.˲®ëŠ¢4n¯R*¿TGµZµÞØþ£‡¯Ä=Ç=ÁÓÁè¥häBÄöÛútÖíùPEûAºUž­¼µù-É“™$ƒ¦ÿ1»ÏaØeÿv{è¨|À^ˆ²³xÎ DáOƒù§ùüÓéÀ`€ˆü>oùå¼zTÎå²sé¿Þ%"¿Ï?ù—ÉØ×1ó]M·±Õ¨jµâ8ØäþÖzÿqoþInèÓàÜLÞïó6ÖÆÀ îQ6rñBúÛ´•xû.¿.ŒÆÔ~uòo“«ù‘(?“÷ýÞSŸNýBÓ¬ú}ÞÙgýÇ=ùçsw¿¹›ý!Ó.ÏfÞÚþ–ˆBç#Ã_EƒY–µ% _@è$^Gð{§çC_&"’Ô`ªÿÓÇGã#£#žßû™9z)–¼™,þ»¨V¯ß¸nnæ9î1ÿ5_6ݦ>Mß'¾¡OÃÏþñÌö¡õ료%n&nýyÂó;OâF¢±*F¿ˆ%n&2¦bŒY‰·ÿè‘?$n$5M‹~µV&o$7Ì»«Ï¤¹Ð*«ÑK±äX2>ïïïO\«e¯Už;ù-%FÉñdâÆ-’(y#‰oßþdxåÛÖóñ«÷ïßQñgáäJ›íFFãã©þÃ*þl»ÚÂÛrÿauám¹ÇŸ:IÞLjš&–ª$Éýýýø[l{R©,¡sŸCQ”Ä„y%—cóî5lSNÏÇŒžèCÈȼí&™B·NNÖ¿|–†2Øô@¤—÷ÉE;½`öæ13r}]G¯/tÑÀ¦‡µÃ¯ÄÌÄÌÔÛaÜáz|¤/KD¯>M±aÄzÉ<,›Ò˜p {ÒÇbIs8a¬Üj}%AüÐ{ò"I&I°D²ÌÕªÖË1qô|@/¨G]å×e"bf6o@iŒ¹lIf–Y"fvd"*¿.;~íìYz> Âg‡’7“êXÊqå¬/מc¤×¢oè ó†y0HWM— ¬!°øû‚§ƒñÑxôbÄõ—áèµ'‘¾L´Œ;ôÈê`·!„Ð Åâä½´Ëåòz¼^3-Áìz×c^7ý}fò›»UMí¶KÄ}Šú‘:ôz¼Š¢(‡Œàö¿Ïç?î«jšV­VÍi§A¶—D$±ƒYq8ŠBv=YËŠÂ}Üot~ìæ·²Ä˜p {9þ%&bÌ2ØŸp©- ø>Á‚@ð>|‚€àÁ ø>Á@—¤®¶^x[F‘@/‚̃)ô.ø@Ÿl Ìù€àÁì>ŠàC”_– ÿ.‹…‹Re¡²'÷ÑÙïôsy<^ïo=êQõSûÕû÷ø³pr +™¤îÜÝW»¿29ao¬§çc& »lØÈµÄ~‹<ˆ(uçîȵ椀aX‡n‘ cîžDD,wߦ¿Mçgòæ²û˜;t6ä=æí?¤ìÉBZXÔ / ÙGÙùóD”ŸÉ§¿MG¿ˆn,5 »@ë°Ca±D2sí¥Q[¹‹bmüÁ,3ËÌ&0_*E¾¬5½ÑÏ#‘‹Ñ}RJ™™ô÷sEæïi·ËÕyzÖ° z> UÛCÚ’¨ë ™™„ ©ã&z§ !„dè$ÉdAÄB¢tÿU4;K\ÇÜáÏ"Bˆ}RJáP¸ôS©X,˜…ÐUð±ÆàËÍÏS5MÁ ƒ‘"1Dï]cÜÇ‘XÒu]—e™ˆ„A ‹šÚßßIÛXx1Ï,QðTp¿•R`0PzQ"‰ /æ#ç7’2&œ@sÕ_*fc£ë:úžÚ7‰Ibff–Éú»ª¹ZW­jZ'³[Ê/Kf"êGê~+%õ#UHDÄå—¥%Œàš«MY0t2„¾\› K$K{m7…AfÜPe ÑÉ»Ìfy?–’A,11mxR †] E{³¤‘á/“Â6as[V}[&f‚%æøˆ!ôe–%BTßUE‘ûÖy7K«éѾ*%s—Yª+°9Á‡ÐÍ&G´g¯³]9­gCÉBèdtt­¬,sJÉuÌݸ²PœßöRb&f–lpj ‚hqª-ºyÕ(›mN¼éçôÛCâÚ¥¤† CƒeC×…††i½fU’·º”œG¦ç¦j ÿ;QÕªD$„ðzܽ‹?Z”Ó¶ ÁlÒ™®Ö9=[·|0IÜt`@ ¢WåWëWn¿º›X¬ì ×v¹ÖˆC·¥Ô9Ea"R?rÎ>/Xëõ³cZ”K$À° &œ@ËàC_®M*\÷®YêÀì×#÷? ˜!HýúéSAÛʲƒu;%ŒÚ¼N‡N$6º*¥ (¿®tõ®”ˆ‰ä _QŒžh|¬\8jè´2 ! âƒT*9e®?]8ê~v>*+¶sè5ëËrb,9÷ÿæE‰]ŠF¿ŒnÝ u¿z9¿Ú¦®žß×vpu—»èùè®”º>^–ÛwHÑÂB%9v+?3KDAâÚõþ~gã.›|—©hÚÈ•X§‘GÓR’0á¶€®‹&mžÄö6‰ˆˆæKón—{úTðþ'£nó¥yÌV*MßBD•J%|1’¸–˜üëd¥R‰_‰qäbdkÏã­Ð¡!j²Ë­‚•+[º*¥uù}ÞÙ¹BãgÙ:?êSK"9>½KŽ§È Ù¹ÙÔíÉĵ÷qãÆ™MÓb—cä­M)ÉríJãý0ì­z>„9ÍÐlVnh±Î°‚ÙùaE¥jõÖ¿‹ó¥æ$Óߦ£ŸGƒ§ƒ,±zDMÞLfe{±kµù¡« µ •pÔ »l ”ZE±Ñ˜ßçmò‡hmòÞdä|Äår±ÄÌ $Ç’SÙ©Æ-­ÈcJI’k%€à6½“ ÉC4ý™Qzš#¢éSÁéSA±X©è"þϹù…Vo™›ÉNù­—.—:õ0c.—ŠÅðÙ°û˜ÛŸ]Yév¹3ߥƒ÷1wþi®ÖjÚðåaï1÷Ðé¡R±h­Œ^Šº¹£_D…¦ÕÇÖrËì€y1Y꺔Zýø}Þ̛̓Š…4† Úbµ8WUaKÎuÞç±n)™O6Ÿn³˜óÍé¶Ù—«6mÞÙîõxW§— =ÍŠ…uša‰5Cp³§Õ‚g‚‰ +ᯆIbÿ‰µ“òüL>1šDÁ@`0P[ù4Ÿ¸–ù> ¤îLÆGö¾Z¯€Þn—Ûæ¼ö–¥jW¥Ô(0èÏ<É”Ëe2ÈyØé<ì´µÏL$ *—ÊÙï§ sÅü̬­T›uN¬@éï2Ú¢æ:êÊ<˜ î®´*%‰k#/>`35Ì4\PhŸ«ý4kA›ìKW73:/¥–‘Ç›J›OÕ«… VäѬã$P~½ærÜòë²ï„Ïz›A[òfòÖø­ê/Õn⌥ôa—Ú"ø€Á‡Ñ|¹Ö ­üø}þÙ¯GÌÈ#þϹÙçψ¨¢ —ÃѸ±í'r.œù>:­ëÕù…äx2r!dþªüºô{~ëšz˜YÓ Zo_Yöû¼³?Î’¡çgò¡s!keùå<úôÿLE/E›¿½ýn¶g]íÒY)5ýÉ=žŽœŽdæ¨EÐSy[)KåוÂÅÜã馉\8Ê>zP.Í“®“®—Kó>ˆœ7î²ÃÁׯŽ$nÄI×;É^»R’èC®vÁ° ´:ëm¸ÁÃ2‘| ¶`©þT2#gùgú2=Ë?;8iÞóÃâä³ü³–‡ú7““ßL&nÞR%úyÔ÷IÀL|äO#‰IMÓ¢ŸG­®_°–£—bɱd|4Þßߟ¸–X]y3YüwQ=¬^¿qÝövkäëìr+²,w[JMMe§Ã¡!³ÄÖ&WÞVJ/J•7•Ò¿KSÙé–©Iý"–º“*þ³HDžß{†/3+MKLý+0Lþybä?GÖßÇÖ¥$³ÌÌ«…€à6§ç£ÅìK[+h†æÂš¶SNyý3cÏï<÷ïÝo\oÎ5—CçBÖgÕn-‚Q”Ô¸ýzEQR·í+­·´jÈ»¸Ã)sW¥´~üaˆà™€0¨ºX%"í­ü¶R­Ô"ö)(‡”äÍdÓ_5F~Á3Á ;ÉX›Rb‰åò†ç| ø€ÖmÄ$±,é,µkM[¸V‰¹Íº©m)–V:”•û‡v^JëÆ,± Ê?É×Ï¥X7òhZ†›^Œ¶RR˜•>¶n¢Šà6‰!ä¤môÝ4~=Ž3Ú“t3ìRwµË‡”’-þpýÖÅÒúÇ6–a­”˜Í[}l,L8€æÌë8X"’ä5mÏž°º#“$› ÝÜ^]66±”¦²Ó ²ìˆR:P[³±dÑó-‚£Öê°$ööž²DÝ> N±=¶m“JiGEmJÉÁ²£Oư l~c£ë‚™…`ÛÙðÆf6ì4æi½Ù¦2sW;Å}Ê~.%f…úØ*°IÁ³Âá`Á+Ïn]¹¯Ãž|!I&I˜{T­jß5Ëáp˜Dög)q+}ìp86–æ|@sêQ—yëLóFÚæ3ÆöÆÙ¼Ù 2Ë,3;2•_—¿vvxV®Ôn/Îêuß•’C‘Y–°‚Km`s…Ï%o&Õ±”ã ËX_®=œ]'–І'î†Næ£á™I¤¿«¦¿Ë$q'ýr“0K)œß_¥8áW˜¹Ï!cÎl.ÿq_ðt0>^Œ¸~ãr8ênn±¬ïÞ][1„z¡Xœ¼—v¹\^×ÁÞ5ܼÐÔÂ|±¿JÉÜïPe£‘ýêýû÷DTüY8¹‚oØÌÎÍ¥¿Ï”^ªšÖÅ£Ov –ˆûõ#5àó{=^EQœN§CQº=7G)u¢"œžÁtÀ ª¦iÕjÕœP¹çWóÞfÅáØ@›ŠRê6øÀ° ¬ßê8…û¸ß{ï´Þ:¹'‰e‰7Þ0¢”º cÖo.d‰‰XFQ ”>.µ€àÁ ø@ð>Á‚@ð€à| ø€à`‹Hæ‚DY8Zü {†íµ âÕøBéãZ´a0Ì_|‰„Ñ‚¬M“%&‰˜™%Ä›tC°D‚H¢Ið! lö|\`3µ…Ñ$øÐ;aèD2‚ØÌÄÐ…-ø C˜±‰X»àCIkf~üKªÄáÛâåIEND®B`‚kildclient-2.11.1/doc/C/images/typical.png0000644000175000017500000016753011405233117015217 00000000000000‰PNG  IHDRÞºñ[sRGB®ÎébKGDÿÿÿ ½§“ pHYsÚk¥óÎtIMEÙ #L2$ÝtEXtCommentCreated with GIMPW IDATxÚìwxÅÇ¿{w!…„jè]¢H¨¡%)Ò‰ ù‰…"ˆ`Qi6D:JQ:J—…Ф7½C íÊÎïk[f÷öRáý<Ï=¹ìíÎÎÌÎî~çwÞ‚gŸ€”WÒ¯±+wÓAAADÆ(+f;*H·YÜ_†Üf‚Ù‚§+–E:`fÈa¦J{0Éß̦å†q¶©~8¿2æþñ±¬kí…ÿlÛQ}0×uô\ãÇຠòÏã·ë'CuÁX¦Ÿ;¹²v-m÷žï÷ɲœ:ÏóǬñj>¯¤×UóÝ–…õ“•ïhâÑÀꬢ€ XQ w31†1»ö;_1Á³O`XÀmV6"Âò„£tnƒ,&ª8åËÅó×-6Û3õ²’ˆÙ¹2úW#Œeð¶våO0ðÒ• 2Aðy cÌ›¾â<ÒüJcЇ– x)*aq¬u AõR5R7FÄ7Sœ×$ù.Í«` M£ûIóç> sNÙ5RŠ eݸۖbC“Gp?-ñ-«+i»PÖ¿âyàù®¨_÷$ïhtf¹÷´ëX­´¹ç–£Ì¿*‰˜æ¶D·$möˆîç®Æét2Ædû(Eº¬~”ï^½q®ã½C dÞ9@ÔÈ—!Ñíã¢êœk=“]ÛyÏf¦s Ó2qÞLù›ÆûGõnaLmXðuŒºÑ~…(îIÉs•e&€Ò8’A#‚Ñ<Nì"p3UÀÙ$3îܺ‰ó7îá³ &@„ÉlAXžpÔ(ä@ÁÝž‚ÆÍ/(Ũ†&MSú€Ö:WVæßŸsJ¬Qf-àv:¿i‰A!¥>ÙƒWù€åhA"õ„5÷óŽÉ ¥HO4¹_¼†®¥¢|ÊïÒk¬úîú+m{ÊïÒ}xõ,}qñ,~2‘gÔrööóUVÆDÅï¼k(MÊΉ²m1¥–£ûrçÜ?Œ1ˆ¢(û0N~™NÛÓ̇â¹Ä}™ºÏ¥¸/yíVZ—¾Úæ£,º•ÆU'Œó|ÍŽûPóžTRf@ :Ïñ¬zÖI;$šïƒïés&£ï Á‡èå½ tßF)­whv½³ýÕ<Ñí.«Éd‚Ýá@Ò½$ØlV˜L&Ÿ_e•¦íp8pï^lvL&“î3äQ ³y·˜€B9jr Ox>ØÎz·¼œvƒU¬T¥s;`1Ñ GFo¿¬ÛY ¨}öp¥?ö×}(n6®…›÷›†ç=,õ„¸ê¡Ç±Äi>(%ûkÃ;Gdøsôö—ˆ™Zr=­íœïLQfiÇAv×”k•¾$M&}k6¼Ã¡<©¨ÓeÒúÉÀ~ª|KëLcdÁÓÉáŒÜ@ÊÉ+?×Ú)­ô”ÏQÃ⬲*Dˆ^g€ûœP3ižxyPåÛÕ.DÅ6­ú‚Bò&o‚iŒ,ø²óFg²CœƒwÝÁw¿âZÅEQÝùá<‰¢úZëXØ}ÖV½fÔÚmàÙg䙪ì,ðÚï™Î8#B†Å7§ó©|Ç3NhcT4k½ot­Óœòë½» tÞñf³Vk:.^¸€ÛwnãþýûHMMCppBBB'O^)R!!!EQóÊ;—Ùl†ÍfÅ… pG#íˆ"EìLûÂd2eYÞ-&†R¹°–-Šÿ%§3ËÕ¤tXYƒl†2“””‹Å‚Í}îÞ½‹Ü¹s?öVq½¨ˆçY”ýÖZ‡fF­àž!%‰˜×³|ó¬ ¼‡£ž@×t3ÑØ.øxÈ«ŽÑ{1(†4}Šo.Z^[§,ª¿†¥Š÷RU‰wQ„àê¥K­M*!ïÚO%–8–\htÚ”b™'Ò˜BØI­ÿ²ë&½¶.Q­‰¨VŠ@®W¤É{KE2$i >\8 HW\;ÞȲê‰l#÷«¬®¡fç Hΰ±è.ƒrtƒ3BÀóòQ>EÇ„IÒU>Oei}(Úo„Š7‚¤Ézb|÷¦ëÒÑŸLˆnøݺbZcäÌŸgˆª³œIk7ãX»õžÃÒŽ‡²Îy÷„ô¬LŸ{HÞ?ÊûŽwŒ–›£®ÎýLPÜã±n}‡ë½OôÜLÅ(½ °X,¸uë&Ž=ŠÓ§O!)) ÉÉÉž{?$8a¹r¡lÙr¨T© Ž€ÝáðÙas§}ûÖM=vÌgÚ+UBDáØíöGÂðj6›³<ïá!€UÀå;éÎÉ•fv/iب¢7ÆäÉ“U¿Ý¸qC† Aâùóˆß²%Û*¦Zµª€C‡sÿ7zœ?–jå±Ï¸ÿ?|ÄçÍé¯O–¿7­Þ —Q_¥JeÀ‘#G [½õjZ¢Ú½­rå§G÷nW<8}‰phX;”/<é‹XËâïÞ^±âS€'Ožzªà¤ë-ñíËê­êxðöçˆyÞ~< ¹æ‹]aùfœü0‰UCËò¥%àyâŸI,éZBÝ— ’ k·@áÜ+"¯\Z:‰ “æAÏBåÿ©ÑqSηPÞ¯‘ªa¹Ör)ÐsíÐzî7QK)FVT¾¬q®'0TBQ1êÀ´ž’ôÝ×GÔz.*\˜ÞÈ—Ôšª!¤•"YӺαà3-C‡Â&A“]cÉ~J÷2_ÖifP$3N“Ok·¿.¼ŽºÞ¨¤¢œªg7gDTËÅPšw-ßn®…r÷_¾à5dé‰eð:>¬ÜF;ãÊѳٌóç±ÿ>œ8q D£FQ$¢ÂóåÃÝ»wqåò%=z»wï­Û7ñLµgQ¶\y8|ˆL‹Åâ3íË—/á˜2í²åàp8ªðή¼ .íÞ]L®]»§Ò7oÙ‚!C†àÖ­[˜dZ… Šo¥py“-9V[Þµ–uW)”ÖFM—Žã•IÖ&mQ”ºi¸ Ç•E%@Ï ©àˆzî5“Šj‰5Ñ—‡–e—s¿K;nkˆr²‘ž`VºY0 Ö4®QúäsF¬ × ö÷†Æ³Ž;™Ž10IÝj‰mUgPc"*8×RKp«Ä­^Y]¾òîí¢Ös3¤,½'Å$y(;`¼Q:ÅHæh§CmÔ½DÔ˜øšU¢[5áQà PébâïþÒ΂ž1†ç’¢ìŒrG\mOw”VQ?þ¼§}¹¥ø²vû3©RKtß»{÷îÆ©S#6¶)jDFÊΑ/~äËŸ•«VÃ?ÿ_W­„Ã&"wž¼ÈŸ/ìv;÷¼Ü´kÔ§/òåˇ*UªâŸþQ¥ý°Ä·ÅbÉÖ¼»#ú5255Õi2—¹žŒ1½zõBzz:fΘŽ;fºöîÛ‡~¯öErr2FþT&º:lÈjm„±ãÆâÿ뇰\¹0gÎ\ìÚ³¿ýö†  [ºvnò¤É˜ûÃ\?~f³Õ«WÇ{ï½’%K¢ªËÚ U«V‘¹|hM¾2úwõš5€çŸo†   ¢IL šÄÄhºšHÿ9jf̘kW¯¢TéÒ³fÍDbb" ŽÀo¼Ž6mÚj?Ãýû1eÊ·8tè¬V*T(Wû¾ŠfÍ›«;®¿­ZµÂøqc±víZŒñrçÎíÙ÷îÝ»X·nѺUkÀ?ü€1c>‡ÉdBxx8¢£cðî»ï"44”k¡®èr59qò‰ëÉ7_ƒÙsfãèÑ£0›Í¨Q£>úx$J–,éy9mOHÀ”ï¦àè‘#`Œ¡r•*xó7Q¿~}ÏižªPðÕW_cîÜ98qâRSSqúôß2— ›ƒá~ºˆTó|·:€”t’­ é†+ƒÕÎl‘beH·‰HµŠHs)V)Vi6†4»r’B@Põ³A*¼¯ éñ’Íá HN$ÈÎáýAüÏ‹'-—ù‘¹¬ ‚IÒÑð¤+¨ò(pÎEYäçdÇp÷—$¬®A³ŒZÇ;Ûº²^½e1¹”]uyxe1œ“‡ õ܃×®ßMòèÇ&AE:3¹~\×Ëë;+)¯¢ y~S„ò“Ö‹[ŽyŽ—¤ïjÌÞÑ&w]ºqïë)£É“ﻹ¬Xîº7¹Fc¼# ž²)ó€AúœvåÙUw¹Ã2Ïw“· ‚Üö(¯ oÉÛ†ôb`÷SµY;ôU©Ðu·iû‘äEðF°v'ë½e™ä ŠN…d»dFµ»­˜Ü*Á{Ì{W^L&ר˜´^˜÷|‚ ¬W÷É$hÅóCZÙ³Mñ,s>ºçƒˆÎ²KÞÙ&“ ;ëÚ.2ϵ“I*ª™·ípæm¸­ºwïÞÁ_ |ù (S®<Ò‘iGD—ëax¾|¨U§.Ž9†%J¢pá•u×l6ãnÒ]üõ×_(_®¼ÓýB1J´ïϽˆ¬QS¶-<<ÜgÚÙ /‰hùBK 8¯H4ä÷S§âûißcãÆM(P €ßy÷Kx_½zpæìYÄÆÆâôéÓ(T° ¾úê+Äuì˜%Ñ;6n܈áïCPP¾þæÔ¨éwñññxÿý÷P«fMüðã€w‡½£ÚoñÏ?zôè᳤iu5ê}ûöáý^ųÏVÇŠ+‘+W.Œ?C†ÁgééhÓ¦ìØ™³fâóÏÇ X±¢X¸p!&Nœˆ#†cÁ‚…8|øˆGpq5ñÇßÛ= ÏË}Р~T¯^‘‘‘j¡©Á®]»°lé2lOHÀ¡CðzÿþhÑ¢%V­Z„„ ò6Þ{ÿ},]ºTvÜŠåË1kÖl˜L& :ÇG®\¹Ð¸q4·>÷îÛ‡¾¯¼Œê՟ï«V#,, ãÆŽÁ Áƒ0&}Ú¶iõ¤åÊ• Íš5ǪU¿â—_~AÏž==uðËÊ•°Z­hÓ¦-ÂÂÂÆ––†U«× dÉ’Xõë¯xÿý÷`·Û0fÌX]K¶ÒÒ3mú4Œ?ÅKǼyó0~Ü8 ò6–,Y ðjßWY›7oÉd зï+˜9s–S|KÚÇܹsðù˜±([¦ 7jD€Y@xN‹ÌÊà}Yx­4î •J‹„lŸ Þ·Yê*«àF³Á“µ(E¦¯‹…E´|_L*Ór=ƒ"zó'ŸWÍüðÜ5”ÖS©¶ttqÚ.'ÊI–ªQ&¥¥W'bЦû‡ÒÂïÃÊ­ôçfi?œãyîEܺ煲”tØç~U8ðFBŒZÆ9m­ízÏCeXÒ šVå®P‚ÛýÎÛ±“¿Ã%¿Kº²Œ#ÐÄØ6›ÍHJº‡+W® iÓf€1\¼tE‹•‹n/^@Ñ¢ÅÆP3²&Ž>ˆ{÷î¡hÑb\á}O™¶„/&LÀ‚Ÿâå—_Æ[o¾%ûÍWÚBx+ó·Þz _õ˜(âå>/cÚ´iø~Ú÷:d(ò…‡Ct8üλ_Â;110gÎ@€Å‚µk×""""Ë ?lØ;p8øèÝáÝ0{ö,Àà·‡ þü€·‡ E—./Éö;uú4 |ùò™¢ðÝ”)°Ûí1b"""ÀÃÛoÁòåË1}ú4´QÅ‘#G¢L™2€Î_ÂĉqìØ1n8@¬Úz"‚€?úcÇŒÁ©“'qêäIO8ºqc¼÷þ(P €nY€ÐÐP4Žö æ· @hXš6mêf:uRuÜÐwÞñ¤=dè;èÜéE̘9“+¼àÛo¾ÝnÇï¿Â… {Ž[¶l¦}?•/¼]ôŽqqXµêW,^¼=zöô< /Yìt3‰óºBõë×Ï3Ìܶ];¼ÿþ{øý÷ßý¤£?ýeË–tíÒãÇÃÑ£G=yš2å[ˆ¢ˆaヒü @0ìÝáèØ±¦|7Å)¼%×}ô§ŸyÒÓòýÖštÆ ÷ȉ.¢¹˜/¤ F„p\ ¤î?ª!Qö«œd)øSÊ9Z>¼Zu£Œ%Ì ,®!h [ðçö+´¨/w,£¢Éã|¹¨âE+B‰fú<_v £‡òzñÙæ B¥?´ª]râ–3=‘΋¨¾o¿Ì'Ý—à68·$[|¹ ¸–ðötº*E:|„sÕéºó”íQ«írê߯e”‚9ƒî îöàvkbR4É\·k3èCnta“É„{÷’ˆÜ¹sÁ!:péâE´iÓo¾õ&z÷êí²t3LŸ>3fLÇÚµkQ @˜LrÁf·sCè™ÌfUÚn¦OŸŽ?-Dýúõ1{öl„„„ wïÞÞc}¤Ýhå½W¯^`Œá›o¾ÁîÝ»±gÏ yûm¼Ôå%Ï>þæÝ/á}úôi¢_¿~(U²$† ŠyóæaذaHµ¦ãø…D¤Zm(]° åÉ‹IwQ(O^¿ ÿÎÐw0vÜXŒ7ÅŠÍø>qâ B¯ –~ÏŽuF7騱ƒê· .¨åËWð|O/Ik"—Ö_·uÜž•¼Õ ­ðüóͰwï^¬úålK؆»wïbã¦MHIIÁ´é3tËY´h1@`` g[ñbÅœ½n³YV)n— ©;ÅñcÇøQ:GŽ8݈ڶS»£œ?ž+HÜõ[32%J”Àßÿ}ûö¢FHü¹o/þùç”(Q5kÖœ;wãÆÃþý"))Ésü;wt'û(-gÎöõ”æõ€£GŽÈê¨àú~ä°ÚeªœKt+Eƒ¯É—²4•IüüDNøA¥Pà=ЕsÜ‘PTaÝ”³ô•–3 xgÓxò¬z¼ðrÜN­û…È|ƒ=Qutb3 k"8ó"¹Ÿ0|ÄFF&öÚªóqü½õÄ3·Ã¢8†'°‰U[V÷z"[ú“Ìàu¸ÂQcÕL½…Œ”~á²h7Òpà‡T…¤“†•Ôš`ªð3× (½‡”‘ŒDž?r n=+·æzJK¿$¨f¤‰xmNCÔk=—uç’p:DºeçˆY¿EwV§ôG h¹—(ßV› ¡¡a0™ÍE…#"ðÆ›oàÛo¾c ½zöÂŒ31cÆt <ùòåóÊ<¹sCp8ìÜûÏ“¶Éä9fÆŒ˜1cŒ.]ºà‡æâÛo¿c"zõòŠoÝ´³¨›wèÙ³'ö¸DwýúõÑù¥—TÛŸ¼û%¼=Ѝ¨(Œ>°fíZ|7u*ŠVy[ÿÁ[-Û¢jÉÒØqâF/^€¸z üÞ]»uƒ9À‚Ï?û ¯½ö&Nš„† fK=—/W‡ÁéÓ§Q¹rå,IsûŽ7½H'f—Hõeµ22ÑÂ× ®ü›# õêÕCTTD‡“&MÂܹs°gï>CÃ1ܨ-:KTûjìLçá·{÷„††ªÍa€nx¨ãðåäIX¼h1jԈĢENk·{ò% :GŽÁû|ˆÎ^„ÙlAåÊOk†JÓ³¾Z,ãK̈ùmr:î©G=\ùpˆ@²UD²U„ÍÁìö綺ü¹ Éé"l Ù&"9]„ÕÎb‘þ_öñvW‰I*ˆ¥~“Ðñ«öœá¡øx»e‚IKœç¯î>ž rK½ž7¯,î}TésšŸÔ¯ÙWYdçt:gë^{w²î!qi^L¼^Ï:×Þ]…žŽŸÄçX¹ V^<Ç+nT¹/®äxI^Ýó ;ÏÀë¿ÍàõW–Õ§ÇÇYíÿ«™H&Z ’ö¡ð«<¾ÌrcV¿N`ês2­ûAá£mT¾ón?c&9ÞAá¯í*—Ìß\~?y;øêN†4/î6åÅ^· YY8Ï)§C¸ÔïÞ½•¹î)oðÞ«Rq&÷Ý—øXkûx3o7Ü>Þ®sšÜ>Þ&‰ï·Ô…Ä“¯qÄ$˜ÀDç>¢èµà›Ýp &A@®°0ØlV¤§¦! G@î=!Š S¾‚=»÷`ïÞ½4p:uê Ñá™6› !!9V«UÞ®L&OÚiiéȀ˗.aÆŒ4p:»ÒrŸë»ï¦¢Eó–Ͻ´³^ÞÝÌœ9{öîETT0gÎôêÙKv¼?y÷Kxÿuð ºuíêùÂøñhÛ­+؃¸úP¥D)@£ÊÕ\â cÃ;uF€Ù‚QŸŒÂàñÙ矣yó†¯X±"<ˆS§¼‚úÔ©ÓêótéŠÃᅦyóæaìØ±™ºhU«TÁÞ}û°ÿÏ}hÔ8Z3ä–¿C¾Fz¹î þN´t»ôë×sçÎAÎМš=užÕK×Ú¤°HWГZ A€Å ä 1!oN‹kò•Ú§[¹¬­Ì\áûí¿qàáxMóÜEÿmU'Ì@ÄœìÎ wäæA]W ësFÒü¹æ# ~ç+ïÊ2 ¬ˆÉó%×I[ÏÿÝ×b&þZ¸™6Í8ÏmîJ”z¾ßŠRER<ëõbtkEÉÑ•ÒQãÎïÑ É©g—EJ’ùt+ÿ ªÿ½åðNÞ•ý|F>CÞðp‚€ä”d„Y¼FÀîÝ»#éî,X°¯¼ò â:½QtxÚŸÕfƒÙdAXh¾›(zÒNI¾s®\(X¸~ùåäÏŸ_æzÒ½{w4oÞyÃóÂ!:|¦íÏINÞ`ö¬Ù˜5{ˆN;aÞ¼y˜:u*cžùþæÝ°ð>{î®_¿ŽjÕªy¶EDD î×°óô $¬Û€Îu ‡«÷Ô¨r5ܼw/ÕСcG˜ðñGbøðá¸wÿ>^Œ{Ñб½{÷ÁàÁƒ0yÒDŒ?0yÒDÕ~mZ·Æ±cG±pÁâ•—_A‘"Epï^öï?€ŸZˆ3g:ç[o À+}_Á„ ÒeÊâÆسg–-[Šy?Î3fávÝ(yó†ãöí[8sæ J—.íÓÒmt¡œÎ;¡M›¶¨]»6Š/‡(bý†õ€V­ZéÆ52„¦uÌÄ/&`üø 0™L˜äºîYÂJwÀ€ñòË}0~üx)Re˖õk×°gÏ,YºóçÍW™¤é,X 6B|ü¼ùæ°Ù¬ˆ‰‰Ao#‹ä0?ý·ýÜÊc´ê•ûÜ3r Á_GK¤«Ú›Žï·î;чÐfþúÒúòwåh½v(Í;o^–ÔÇ›÷—·Xš—wùì6rçÊâÅKàß3ÿ j•j²|¿ö¿×ƒ *€9²…§®\¾„Â…–+Œ»R£Ín÷¦}ö_T­ìŒâž7¯j¢¥r»¯´³^Þ/_ºŒY³gaÀ›o!.®#D‡ݺvc"¦M›†fÏ?üùóûo¼\ IDATwÃq¼wïÞí´DV“_¤«Iw¿oÚ„W_}iiižF—ßÕcÈ(mÛ´ÁgŸ}A0ú“O<“&}ѤIŒý).]¾‚ç›Æ¢OŸÞhݶwßáïÇ÷ßOCÒÝ»èÓ»jÕª‰ØØXŒ;W'ˆEéÙêÕñÃóP®\9ôíÛµkÕD÷n]±sÇ 8ÐÐKMzó½ùæÈ;7Ú¶mã A(µz2?Ķô< ÀO?-D÷îÝP³f$¢êÕÅüyóðæ›oaÈ¡†ã‰ó\ª•Ȥײ]{ôéÝ MšÄàÂÅ‹øüó1ž0‘ÊUc¨^£æ/XˆråÊ¡OŸ>xî¹êèÚµ vlߎA®P“R_Gé"(î²»ÝJþý÷_N7&Šž!ÑqãÆ¡råÊ>|8Ú·o‡ÆÑ5Ë)p…^„å‹,ª~}LŸ1v‡11ÑhܸÒ­V̘>Ã;±R#ö´¦%Œ³l2'ö²tå –·Ì6g¦ˆ·ÌË‹ xÁI÷yþ»ÒXΊØíî‰G¢bÉc÷õóøÅ*îY%®9L™GwìihÄöõŒ ²2pãÓ»ÒR–I0(ª•yV~”q®}}|¥a¤# (Ú˜ª|ÒºrMôUžŸéXÛ¥iI}ëe1ê¥åR eiLuw›p'm;\A()“ôúˆÊ˜âR‘¤s1^Çœ[^ïžÓÚ_YÞ½¯Ûž ìÏ;Fv‚?yUUÇœcxhQáûÏ$1ä•1ëi–,Œ¤µ¬;/0t®€ ±Ú¥rA&­¹(Lgq-ÝU-qï}Åà6HrßsžŒ§ìv;ræÌ‰zQQ8vônݾ ‡(ÂîpÀápÀ.Š([ÎPúIIMuE\{a¡aܹ\v› !Ò´ïÜQ¥ÃûI;»áå½`áBXºt:Äu”å·K—®X²d)ò†‡g(ïBÜØ¬K“j¨[Ä®ÛW~kÀlݺ ÿ: ÛþÁ¹8š˜ˆ°‹×°iùJDÕ«‡Y³g!WXØ#bßÉþa\ŸC Ê 7~.¯µ 5Ï:hô¦åZŒ~Œôò}íã‰~ô˜¦%‘kqNpÓ©k¥`ãYhµ^ÊV®œÐ£)AùP3bÅSZk›¹wÍÁlsúj[í¢ÇÇ;ÅæŒßfUq¼=>Þ®¿ÉVévdÈÇŠX¿ÙíãíõåöÇ[7v¶wŸ¬ðñ–úÿJã9{ÅkÖÆñ–—•*‹ò™›é8Þá È—ɤȗ÷G=¿hOdA€·ïìòU•ø×š¯÷¬ 7³Ëü`ÝyáÅWöï™@éy,õÓõúrK&ÎJýx™×—Ùã‹ë.‹IÕ¹ÔGÙãOìñaæßʘâšíXÏG\µ‚°ºI·¸Ëï.« kÛîÚPÄñ–ÄÆ7Éî`eLr“K$Êý¶½áôœçm‹Aîg/³•O¸É_ÝU~iuï3KðÄ—Õ« ñCgü{Þäi„.gÅ\÷>Î*ôº€xßyòQ9Ñ@á#n’¸˜¸$Ç»ó Õv¹¿9¿‹ÅCŽ9„½{÷bŸËw™RØÝþÒÒR±oÿŸxæ™çP©REجV…Àô:Lä@PpöùHÛMZz*öýé+í3˜ÝyßuÙ‚…›s5Eü±µk×RýV£LyMLÄK½z `P0.ü Ý»÷À’Å‹` €ÙdÂãŒ!á ù*g¾|k ­R%±~û:Ö¯á0Î0›Þð0㬠Æ=7'V«žÅ_fÓˆ0¡<Ÿj4·µD± SF[Z¬8Ç0ÙûJ— èÕ¹ÔRªŒè ß€ä×W‹Y@Þ“3–7Ô1ºÁ‰Ù­Œõ +êåéy(+‡RvÛß߇˜×,¿œ—12{=”áæ$i3?˪ÊúòŠi÷PœÛj.Ÿ„ã¶ÈÝCäo¦ˆî ®/ÉËÉõôÖ¢rÈXZoŠ1˜®LDÉDÁÀèÿ…$HÞr?GíOOsæRh‰hŽÎxê;‚£Ž;Î¥ÅO_Z÷ÊQAcñéõÑÍ€F=hvÎ5–ºÎÁìÃHÀóŸõ•&µHêtÌÝ÷ ‘z†Ä:Ê¡òº‰@STÈ}¹µÛŸJ¬)ÚW°0­Iïàúi{…6ïÞa\måþZ2žùÜ ñ>W=”ׇ?Ò§6.(¯gôT9²Èä+YBc$R=iR%ŧ·¼ŽµFR¹uÂxÏiÿ VÊä¼Qgà#L T>Ü€ [4G”†däê¦(ƒRC¸ßyÞ¼'ß¿œ¡¡¨U«Ê”)‹mÛ¶!>~3D‡ˆœ¡¡HMMEŽ€(]¦4ºv펼yó"=ÝŠÔ”N}0Ùë)ù~r–¦ý ì;2ïW›n'øîÝ»È;77‘t› ëöïÅßW.¡h¾ü°¦¥¡AÕgP¦P„¯‘ó' å„4=k§w”¬r?Ñ~ HÂvqÜD2bY— BA=l¯Y_J#YZWûA&e~„ÐrC‘XÖ¡žô¤%èôÄš )>øÇá>696+…¸ô¥Ì½‚N»fÚt¥×Ž;Iˇ(W #ûXµÐkttG|´&JÛŽZ 3¿GÎ2±8žßVR®ÿ+|”Sgâ|Ò-9Ohñ:øzâZµ/Óå«-jNÀôžMY!´} æ‡!¶}§%œåm‡iú|óDºR@k/€£îj£²¦g±àöŽÌñ·^:zïk_ âø£SßËÈ ÆD8줦¥"55 !!Á ò„>N¾6›Móy뺬JûA ïìÌû®ËrW_x-Ñ hW»^† øØ‹lH‡„¡y¹÷<7‹úfrÆït õËAy#JÓ“‹Yž¥Z=d¦·¯?×^!À5_ÞÞò¹=‹¸¢ÛŠjq.“–±/­ÆÉ3cr뢒i´cé‹CT%ê}‘‰¢d?Q.BDN$uDU ™Zbû´• ‚¼=JvaŠÑé1òë¡®‘³(…(’6+9V9s_6#kãÞú“-̺UQPF“ mÏõÑ—.˜ 5·€7¡PkƒÑçH¥·¡ç¯üÚ1íΙb~‚r’)·cäžÄÈyΨóâíx*‡èeÑ$£-jQ#i[Š‘:YÛbÞû[úü”v°ye“Š<(ñ ŠAÕ­fœ,/SåâZž@Ù¨$T®wÒg¾WŸ*ëDÐxvJG eeúÙfê{zûËD·,ï¼÷¢Ó,}.p=ÆÞcZ£9îwˆ×j­míö&á}7«Û£¤N\Ïln›•iù»^«Mº÷OKKƒÕjE`` – aa¹ Àé#%%Öôô éºôôôlK;»Éμ[@dë°®¯ªžUÚ×0±–õQ3~¨Î,jÝ¿ÁxÉ~¯æ¥ðyæ…ÒÒœ¥Íy)ùò• –w×ðüU‹it"<+ËAßOÞ½0$ôF ±<83"Á´B¿)¼2Z çœ"'´ j™u‰ –Yn8é(W;„Æê”Q¯ˆÜù–…'|gåM®üØÀZ‘ á·ªwÏf4ž-ËÀ /Ï’´¤ƒÙ*1®ì<*La¼<•íBY'"oTε•¥£ð%f’'¼UŽ@ç‰<Æi;z×RåS¬ug‘ІF{•®ŠÉ|Ì en=Lå«ÍPÖÀ‰{­õ^µ'å“í¯qÍ´Þ³¢Æ ­þ¼Ï™(2‚×2à—FÐk{ʹIzÇèé žÎP¾SÓÒÒÜ)#’ål½8¥™y·I|ÏÈC¬IÌ .+¬ëw©.® ˜Q"Ì'[ÖX9 F6±Ó;Ãý`®Õ³˜äG©Uš1iÁSG²ZfJÃ5óZ¤ÜçQT'“›8dÖ.yù ñKd×Ú[×RŸjɪiÒISîýe1x¶]&}H·kÔ'ׂàm?‚äÌž”a‚ £‘br¤ G#‹Bä~sVÜ”w:¤ûp¾3åüÅ>Šei•‹œ¹=«†BPDbϱ’®ì*ÛÇÿD dz¦gNdŽ‘Ä]’9oYÜû˜¼u!¸Þù‚´3ë~Ç("Œy#±HóϹ6’ÁÙ ¹®tì’ɧSÌ$Q’”F»”¬KHZ,pØíò´¤ÆÙñ²†"‹\‰«£{‹Å"»N&ÁÛþdm@NK ° ÜÅñ®ØÛ½ª\õW7MÎy]W)GŽÜO ¯&‚ƒC7¿wíÓÚ¨HÃápN×hš9Þ§…Ô`šûý݈uÚq¥ešÜ×>Ò›\ú@”ÝÜÖRߘ«œ`$môeûùú]YžŒœ'–ŠŒæ™ â7÷Š.cİàs½QUžQ)#yV¬ªw.½ür#,IߣÊÅ»™) i¼4xÑt|­bªŠ¾¢Œ2Ç|Ì)ðµú¦kQaR¤ÍüLCkQ#Rˆ®Ë?e`Ìã¯Í2™_e¢ÆÈ£ÊÕ¤HÑ¢ôÀ!‚ ˆ'_.? ñdÞF.^¸ /¼àÜÙ3T[AA‘¶lÞÄÝn¢ª!‚ ‚ ˆì‡„7AAAð&‚ ‚ ÞAAAð&‚ ‚ ÞAAA›È<'Ož <AA™Þ:vÄÅ‹eÛþøãÔˆŒÄ[·Ê¶_¼x:vÌp&kDFfêw£çÐú=·ô{¯Þ/gÉÊŠ²%+óìþDÖ¬‰†aØ»ÃpûÎL¥Úuê k·îtçê´ÛÚuê >>>[ÚуlþœßŸ|=ì2AO.–ŒذAClß¾:½èÙ¶k÷.”-[»wíB£† =Û¶oGà ùÊøsß¾,;Þf³þçCVæYZ)))ØñãÆa̘1Nsøˆ;f 5jDw®N»Ç~ˆOGFttt–´m‚ ‚ 2O†-Þ7DÂöÙ¶]»vcà€Ø¹k—l{BB5v oQñÕW_#:&õ¢¢ðZÿ×pùòeϾ5"#qðà!4‰E¯Þ½UçµÛíýéh4‰Eó-°nݺVY¾Îí¶¤Iÿf¥u­Fd$–¯XŽÖmÚ f­Z*ËfÈH¬X¹±M›¢a£Føìó1HMMUåïAæBBBмyslKHðy§OŸŽØØX4jÜ&L€Ýáðìo·Û1ôwP³V-ŸûgäFêØf³â£>BTýúhß¡Ž;&+«^Ún‹}íÚµñR—®8ð×li§ÑÑÑøtôh 1‚{íõòá« II<ƒ F£ÆQ»NĽø"âããñÏ?ÿ¢sçΪýÓÓÓѲeËr¯ê]eû7Z^‚ ‚xh»ZÕjøûï¿‘žž¸rå ** ‡ÃóZZþùûoT«Z °páBäÏŸë֮Ŗ͛…o§L‘¥½jÕ*¬^µ ãÇSwÑ¢Å(\8«W­ÂÜ9s°páÂVYFÏí¶.þ¹o_–[ããÇ÷S§bïž=;fŒL\¹ó8wÎlX¿ùÂó⫯¿6”nvæ¬V+,‹îu^¶l)òå Çš5k°fõj<]¹2~þé'Íüéퟑs©ãÙ³ç V­Zø=>¯¿þ:>5Ê󛯴Ýû;v oßW0jä¨lk«ÑÑѰÛíÜß|åÃh>|ê×Âo6`ËæÍhÙ¢%>ýìs”-[¹rçÁÎ;eû¯[·^ÖiÊ.Œ\㬸g‚ "›¹>Æ0›Í¨‰½{÷pZ»ëGEêÕ«ç±zïÝ·5kÖ„ÙlüºêW´jõ‚‚‚„V­Zcÿþý²´{õî…àà`*THuÞõëסc‡FáÂ…ñö!YV¾|¼³óÜF6lŠ-ª)®†yÅŠCpp0âââ°cÇ·ÞÈRRR°lÙRÄ6i¢{—-_‰fÍš#00¡¡¡x¡eK,[¶L[`Ø?#çЫãM›7#::h‹E‹ÎOXh(’““a6›Û¤ V®\ùP®‡¯|mC ÌG\\‘3gNôèÑ wîÜtêô"æÏŸ/¸‹#.s=ôîSÛÅ£~ÏA L¦±-™IªaÃFØ–€úõëc÷î]hÓ¦  ~TV­Z…öíÚaÛ¶íhØÐë“›˜xaaažÿs……áÖÍ›²t#""4Ïùï™3È;·çÿJ+fYÕø²ôfç¹R´HÝß«V­êùž7o^\»võ¡43·2™LÈ“'5l¤ê¨(¯ó™3ÿ¢QãÆ²mW‡‡‘ý3r½:¾páBBB2”ŸG~ŒAƒcþüùˆŽŽFß¾}=Ò‰¯|øÓ†<„;wà\ây?vÔ³=::'NÄé¿ÿFùråp௿À˜(K;+ïS©øö·=*÷ Añø“)á]·^]|;å[8ƒ´4yTœŽ:`óæÍ¸xñvïÞ…-Z<’íÈŸ{† ‚ šð€F â­[åòïvS¯^=ìܹSVZ·nÕ«× -- iiiX³z5ŠøpŸÒ¹sgüòËJ¤¥¥áúõë˜8qâ«,ÎŒÄÄD$I„úƒ`âÄ/pýúu¤¤¦bñ’Åx¦šwÝb± >>Œ1$&&bìØ±DžÝ´mÓk׬EJj*RSS1gÎ\ô½–íŸÑc¤4‰Åö;`·Û±eK¼,>½¯´_ìÔ ¿mÜ»ÃË—/ûÕáôWtðᇫºÑW>ôÚ”°°0lß±V«'NœÀû| û=þü¨…Ï>û1Ñ1È™3ç#ÙŽŒ–— ‚ ²Lx3æüøKC—°®W¯žl{ýúõe¿»éÚµ+®_¿Žæ-Z EË–8zì&Ošdø|/¸Â‘½Ðª^êÒMŸoše•ákr¥?çîÑ£ºuë†æÈÊç&®cºuïŽÖ­Û 99#GŽôüæŽÐQ«vm 4HòíaåYÚ6î'ßGëÖ­Ó¤ öØÑŸŒÎ²ý3zŒ”WûöÅo¿m@ý ðý´©=z´á´?üàLŸ>uëÖõDÉŽv;|ÄY o%¾ò¡×†¤|üÑǘ1}:4h€>ü½zöPíөӋؽgââ:>²íÈhy ‚ Â_<úÚ¥±…¸±Y—&ÕP»°s˜¸h±b8wö ÕÔ‘‘´P ñHµ¡K—.áÕ~ý°fõjºg‚ ˆ'†-›7áå¾ýpáüyÀž+X¸ùpÆ'Wfd‘•Gõg¤,#ïÒ|ýWÄÁ£Z—«H~”ï;«ÕŠ%K–â…ZRÛ"‚ d"ªÉãô‚{TËò_¬c>T×n¢cbP¹re|“E ÒPÛ"‚ žXáM#¨ é±=!î‚ ‚`¢* ‚ ‚ ÞAAA› ‚ ‚ cp}¼·lÞD5CAAÙ)¼A Z!‚ ‚ ˆìÞgÏüKµò¥d©ÒT O´ØAAü‡…7ñßÝ$žQÄWS¾Cçž½ñゟ¨Ò‚ âqÞŒ9?DöаÕ6â£ÏÆaùª5`œ EKVþŠ>‡õ›¶P¥ýÇ™ýã|=|Ý»¼ˆË—/cüä/eâÛ!ŠóÅDܺ}}{uÇþƒI|AÄc£ý\¥ð&²Ÿ56áâÅ‹èÙ­3’““±pÉR™øEó/…ÍnG¿>=q&ñ|¦Åwrr2ƇfÍ›£Nݺh×®fΚ‡ÃáÙ§Fdd¶”7#馤¤ }‡°Ù¬Üßm6Úwè€;wî>wv•Ï6mF½ºµà°[Û$÷îÝø‰“áEè¶Ûlx¾IcXméhUë6ÒŠ”Añ8â—ðΑ”„§¿›Šèî=Ѭm{Ôý ‰ÿý‘-\óZ?RùÙýç~Ô¯W»Ï7m‡È0ñRˆ¢èÝ9мi ¬¶t4nP»öíÏÔ9GòåÊaù²eر};æÎ‹{÷’ðÝÔ©ž}þÜ·ï‘©£ÄDÇ`õš5Üßׯ_zuë"Ož<†Ó|˜åkX¿>†œ¡¡¸|é"šÅ6vŠï/&cìÄINÑÛW®^EΜ9±÷ÏhÔ >=™‚ âIÞÉɨ5|î•)„©SðÛ²%8Ö¿?Êÿ8E7m¦š4À³ÕªàÀÁ#Öâùˆ /ÃüÅËœ¢ûùÛ½÷OT¯V%SçܺmZµjœ9sÂd2!Ož<èÙ£'V®üųÒ:¼lÙRÄÆÆ¢IlSüöÛÌýa.¢cbP»NÄÇÇËö]±r%b›6EÃFðÙçcššª™—éÓ§#667Æ„ `—XÝ¥¼ôRg,Z´DåŠÃÂ…?¡{÷îH<ƒ F£ÆQ»NĽø¢,oR”å[¾b9Z·iƒšµj©Ê$Š"¾úêkDÇÄ ^T^ëÿ._¾,;þàÁCh‹^½{û¬ÿ×_틜9±5a (ˆ«W¯¢y³Ü»Ÿkz:šÅFãúµkÈ—/ëÛ‚hÞª šµmB;wÊ~/·`!bºtCl§—Péûé$bPZ–:o5tŒZµÀðûÖÖ²E,¢‹-žoâak×oB€%Ú´h–© \¬XQüôóOHNNölË—/6oÚ¨yÌþaÅŠ9 /\ºµk1vÌ 1B¶ï¢E‹1wÎlX¿ùÂó⫯¿æ¦¹lÙRäËŽ5kÖ`ÍêÕxºreüüß—¹@¨Té)lKØ&Û¾cÇ”-[>|ê×Âo6`ËæÍhÙ¢%>ýìsCuÿ;¾Ÿ:{÷ìQ•iáÂ…ÈŸ??Ö­]‹-›7#** ßN™";~ÕªUX½jÆçû3™ðîÛƒ‚ø­ È›7®]½†æMcÐ$º®^»‚\¹ò`í†-Ç;ƒÀd"0‚ ‚x¢…w¡;q%*JµýV•*Øñå$Ù¶¢›6ã÷¹³±mêTXs…!ÿ~¹»DÄïàæ3ÏÀŠ’+V"=<¿ÿ8[~^ˆ‘‘¨ðÞ}Ÿ; †ßV.Ç?/uFÕ/¿’¥UrÕjìúbâçýkžÓïÚµÞ}w8ºwï.¿îaaؾc'¬V+Nœ8÷?ø KÊÓºuk¬^½iiiHKKÚիQDÇ5Åß~?7nÞ@¥ epýú5#aç,XùóçÇÖ{„›·nà™ÊOáÒÕ˘6s6=™‚ âIÞçÚµE©å+PrÕ*ä¸sf«…PqÆLœêÙ]÷Øôðp܈¬ÊßLÁ•¨z°‡„x~»ÛE7o9=æôtÙ´YæK^¿ÿë(¼-‚Ãàk×ÀÖÇŠÓg ðÖ-˜SÓPbõÜ‘¸žøâBÓ¦(²%æÔ4˜ÓÒPfñÔ|ÿƒ,?ÆÍ²_× %-•+–óˆ°­Ûw!44'B‚Cð{Â.«^µîÞOÂʵë3uû¿ÖŒ1¼õ曨ߠ:uê„ë7®áíÁƒ³¤ÅuŒC·îÝѺu$''cäÈ‘º+î'ßGëÖ­Ó¤ öØÑŸŒö™~Lt4*T¨€&11²íô1fLŸŽ àƒ?D¯ž=²¤<]»vÅõë×ѼE ´hÙGÃäI“2œ^ÂŽˆ(\÷îÝC``vï9€‚ à­×þ‡7ÿ×yóäÅÎ=Âl² )é.Š*€­ ÛéÉDA!BÜØ¬K“ª¨U(‚½»wqw¹|OÍšƒ|‡ÁœžŽ¤2¥qºGwÜxî9Ï>Í_hõkV©Ž ?rµÞ_‰¤²e½` fÏA± ¿‚€ÏUÇßݺ!¹˜3êDž'På˯‘óÂÀlÆ_Çájݺžs:OÍš Aq¥A}œîÑÝcõæåEºM` åøÅ×o€9=·ªVÅáAîšLÈ;Þ×1z|ðéXÔŽ|3ƒpððqäÎ Úµc ?/_‰û÷ïãÙªOÃf³"9% è÷†ùL»yËV8wöÌm<5"#©ÅwE~˜¿[·' D±œ¿p… BŸÝ`w8 :`Œaμù¸yëJ-‚Ä‹—ݸ!ztéâÓÍhËæMx¹o?œ=ó/U4AA<‚˜]^{®â§Í‡ýÞ™!øê5Ô~w8~Ÿ›uÃèZ"ÿQeÝÆÍ8|ìJ•(Šs‰‘+, -›6Ãá€(Š`Öþ¶ É))(U¼Ξ¿ˆg«UA³&1>E ïGÆfý0¿mÚŒš5ª#®C{¤§¦"-- v»&“€€9°ü—_qèÈ1´x>½{ö€Ùd"áMA™ð¶<ˆ“š¬V”X³c¢ŸèÊo»Ý=û÷£bùrhÜ Ö´tX­ép8D&-bcðÇŽ8tü$êFÖ@S‰?<ñßC¼Ò«z÷è‡Ý»Ý«ÕÉFE˜L&X, 8‹–€˜!KBIAñhñ@„w“—ºân… øó“‘O¼kÕ¼)Z>ï´r;Øìv8ìvˆŒÁ$0[,è׋f³&–χY»_w‹Ù ‹ÙìYð‡ ‚ ÞÙÂÆåK³%Ýÿ’›‰T„™ÍfÏÐC0µA‚ ‚ ˆ' LAA$¼ ‚ ‚ ‚„7AAA$¼ ‚ ‚ ‚„7AAA1MbqöÌ¿(Yª4UAAжoDرÿü½ôðçŸÎóûs¹~FèØÑyíÖ¬ºtá×QfÊGAŒ1\ºx©©©€¤¤$\»v5ë…·[´œ8\¼´jå|@Ÿ>@ÿþÀàÁ@¯^@§N@ïÞÞc×­âãªU‚A€Š½¿üõ—Ó  ~}ç9>þØXÆ¿ù0@¾mà@çv)¾Üºu^ÈøôS૯¼¿-Xà~ááÀÌ™@Ù²þ»Ùè¥ï«ü¾êÏ]>#åäqíТ0ož³Sñ ÀçŸ?~øp§Ø~åàµ×€¨(ãǹ~+WeÊ8;~›6sçúWÆÌ\£ísÂ`ÄÀlêÕ3ž·>}€‘#÷OX˜ÿ÷Gf¯àL÷7œ÷o×®@óæYW>‚ ‚x\¸zå2îÝ»'ÛvãúuܽsÇ¿„âÆndËö\a‰çβÄsgcŒ=ó/s‰{g¶nXl¬÷ìäI°bżÿ,vì˜÷ÿóçÁ +]LäÇ`;vÈÿ°;ÕûIóáþäÈvö,XÎÿ ;s, @½¯VÊm`¢èýßjË™Óù=gN°ôt~ÚZ_éû*¿¯úÓ+›Ñ¼™Íòï‡ñ:;¬bÅŒåÅßëç®?iþü9gF®¿‘öÉX³fþ×?vêXd¤öïzç7rýü­“òåÁ.̺òч>ô¡}èó_úœ=ó¯ç3êã<šØýIJºËx$%ÝegÏüËfϜΰ7®{¾»õõ²½WXÜØÌ°«É!NË—ÙìÝV¦ŒsxÞm¿zÕéžá¦U+§…lÃçøÚµò¡ðôtµu]¹M «Õiýì×ÏùÿÿþçüßfËxo&=]n=zÔiÉ ^}غ5s½%eú¾Êï«þ²é܇0ù`²paàôéŒ×Èõ+T3ع¸p¸sÇ¿üe÷õq³aCÆÎWª”Ó…I/?¾ÎŸ™ë§äÌç$ê¬*AAüÐëGÛ¬гgÖ¦ï«ü¾êOJVEQ¨ý[b¢¼£å/¾®ß† ÀNWˆš5úbÌ aC§ølÑÂy¾¬ÄhùµêÏÍùóΉˆYÍ… Nßß  ç5^¶Lþû÷ß“'ùó;­ÓRÿh)Zò|]¿’%ÛvZbçÌy°7GfÛ§¯òçœGд©s"åƒ>?Lœè¬ÛÂ…×rúô¬M?+~'‚ ˆÇ‹?;ß¼ L |ô‘3ÂÉäÉ@ZšS<”+X,N1U¤ˆsÿ³gâ‰1gdŠøxç07#G_~éŒØ ΉdƒñÏíŽJ¡´ì~ýµ3*EíÚY_9Û·ËÝKÒÒœ“Iýà§…¯òûª?7mÛ³gÏ>ët÷ɪ8ëîÉŽß|ãÌÛØ±Î( n¾øÂé22>p÷.ðÓOê “`·kŸCïúõî üø£³=8átuâEÞÐkÙy}Œ¢Uþ™3mjüxàé§â[zÿd÷ùg¤˜iӜ牽{³6ý¬ø ‚ üeà3Ž7v#ëS5 ¥Š—(‰sgÏ Té2O|e/Yâ ç·t©óÿR¥€={œ6‚ ‚ ˆÇ‡³gþõ|ÿaîl|<êÓ ¥sãÆuüºr^îÛ‰çÎö^ ÂO›;]Mœá h i%Ï?ïœÌàŽ‹öí£z!‚ ‚xÜaŒùýQ§!×תVmúôqºW,[ܸᴀ¿ôÕ AAÄ“À¹³g ïkÄ-…„·Ë—;?AA‘YLTAAA› ‚ ‚ HxAAa ‰7…4!‚ ‚ ˆ¬ãÿìÝ{xTÕ½ÿñÏ”r#Ô GEM '‚ªX¬O jÛŸTB1¥Š–ÔöXÊEÁ†‹7lbÑ‚@<©«„‘§ŠH=“€(Ôr¸H-—¸~ì“!“ÌdïÉÌ$3Éûõ<ûafÖdï½¾{­µ¿ìY³Ç;¿¶½â=x°u”Áƒ[vXÞy‡¦»’¡ÎáÞ–Óۜқ¿}vé"­Z%ÅÇ[Ï+*¬}8rÄú‘­„ï÷·o/ýùÏÖh½÷žõcQmøºÿyçY¿z{â„´w¯4bD`åv °~÷Ûoý¿ç†¬»^-_^ÿ׃ƒ­_°Ûé%©_¿ÖÑÖ_yÅw{o(>¡(Ã6ñþÙϤ-[¤Ÿþ´ñ|s'(N¶ÿ£‘ÀµÔ"ÚãÛZÛ‡Ëåü—H›³ÿBJL”V¯–þðéÿ×z-9Ù:~^(mßn%¡µ=ü°õ¦þý¥þÐ:ÏLžì|›sæX¿æš”dýzïcIW^é¼Üί~%Mšä¿ ^y¥UßÜ\kùüÝ`ëìöû[iî\é?hÙã[ïÞV 4>Á––5ó-óÊ?¾4{÷”›½{Ê1Æì)ßmô¿«³w¯Ì~$³g<¯Õ]Œñ_æ¤<ÜKso?Ú÷/Úã®ø6Õq‹¤öÑûBÿˆü¸­\)ó“Ÿø/•Ù¾Ýûµ7ß”éØñìóï|Gæ7œoów¼ŸgfÊ9/6Ž/¿,së­gŸßv›Ì_þºú»}Iæ{ߓٲÅ{?ZZ;]±ÂŠCÝõØÅ'Ør––¹ì)ßíY¦=:Å“;]^œÿ‚‘dªô<®É¯—ð¥Éšù–iðŠ÷÷¿/}ýµõ¿öýKêÕËÿÿVý}$lW>hõ1Ñk¯IwÜáýwO)óàƒ¡½âýóŸËüío2Ý»Ë$$È,_.3zôÙ¿ùÝïdú÷÷~üæ›Þë}úi™äd™.]d^]æÆ÷?j_ï1ÆÚ§¾}e:tùå/­OjÊÿñ™ßþÖºšð«_ÉìÚÚÿñçåÉüâgŸ?ð€ÌŒÎ×ûóŸËìØ!sÝu211¯ß®þvå _'ûî+ÞÁÆ×®þvëÿì3™{ïµÚï9ç„¶þNûOCÛš8QfÝ:™óÏ—IL´Æ§û2b„Ì¢EÞ¯-^,“}öùªU2£FÉÄÅÉtî,óøãõ¯Š†³ÿ:9þÆXWI¯»NÆå ìÓÿœ?'1©“’d^{Mæ§? ]ýj–§ž²bëoŒ±®ˆû*_´èì{V¬l»ÅÅ2ãÆYǶ{w™^9uÊyy°ãÇ©S2mÚȼÿ¾Ì{ïÉ´m+sòdèêŠíK2©©ÖUïÆl·¡ók¨úO0ãû«¯ÊÜr‹ïõØÅ'Ør®x7öŠwƒ‰÷Úµ27Ü`íÌ 7XÏC™xïÜ)Ó­ÛÙçÉÉ2¥¥ÞÓ¦÷ãêjÿëMIñýQb0'îÚÏÛ·—ùö[ïŽYó^ÇŽï”þöï½÷¼Ÿ»\2›69_ï'ŸÈüàþËíÖoW»ò†Ž¯“ý wâl|íêo·þÏ?—?^æâ‹Nz›xÚê¾öùç2={6n_bb¬éi]ºXÏ»t‘)/—i×Îÿß´oï½áî¿NŽ¿1 O¡WÿsrüÉe—Õÿ¨<˜úÕžRqÓM¾ËÚ´‘¹â ™ dÆŒñ.»õV™þS¦_?™Þ½e6nôNäì–¸8k¼?~\¦¢Bæ¿þKæßÿv^ªÄ÷Ýweþþ÷ú‰Y°õ vûµûâ¿þüvëž_CÕ;¾_q…uñËßzìâl9 ‰wȧšœwžtÝuÖÇsÆXÿþèGÖë¡Ò£‡õñoÍÇL_}eMߨ­ºÚûñ9 LŽÙ½ÛúBO¸œ<éýE—’éÞ{­˜üâÒßÿúíÕýX®îk ¹è"k L¨Ö_·þvåvÇ×nÿÂ-ØøÚÕßný·Üb}œ¹f5¥à7ŸJ`'þS×w¿+íÚÕ¸íž:%-Z$k=ÿå/­ç§OŸ}O×®R^ž´i“´¿u÷‹sÎiºþëôøûšBÑTý/˜ãWWy¹uç‘PÕÏiûûðCkÊMÝ©Jwß- nMÅùè#éç?·ÆQ§Ž‘²³¥N¬qÿå—½§úÙ•ëË/­/•^{­u®LL”¾ø"tõ vû5BÕ§êž_ÃÝìLj}a¶±ñ ¶h,¿]òú륷ß>{g—KÚ°Aúñ}¿ßîî¾Ê°æ¿ÕÞF slkKM•öíkÜþ5ÆÃŸ‡ù“ŸXmcùÚ¿¼_?çë5§öîµæWúìúíØ_»ý åñ G|íØ­Û6+!II‘.¸ÀšKù׿6]û•¬[žù³o_ýÿâùç¥{î±æùŽc=¯{BÞºÕšG~å•R\\Ó~á>þÍÝÿêêÕKÚ³'ôë-+“.¹¤á÷øJÊ:vô¯°^k¬ë®óž“hy Þ{ÏûŽ!W_mÍuWýÝ~í ¥¥Áo¯îù5”í·1ãÛ AÖÜîÚóÃkÏ·‹O°å@ÈïŸý̺WÛ›oZ¯×õùç ßãÒ_ùܹÖ?úö•Ú´i\ž|ÒºŠóÝïZ÷I­{Ë*'û×XyyÖ`Þ¾½—ÆþoØßþ½ý¶÷—b~ýkiÝ:çë5K**’n¼Ñú"L¨×oÇîøÚí_¨Ž_¸âkÇéú].ëS“óγî9ÜTíwÿ~iÔ(ëdÙ·¯u¯ÚÚæÍ“ž~Úº[×®Öñô—øòÅÖÕì—^²ÞS÷jã…Z¯mßnõá… ›vð Õñ÷Wÿ¦ê }!²öøøôÓõ¿à ÅÅÒm·ù/ON–ž{N*,ô~ýo³ê\ã¾û¬sL õ«Ñ§4c†ôÇ?^Þ˜/”ÖÄöᇭÿ4_pu«À§ž Oý³ýƒKK–„þüªöÛØñ­öšÄ½voŸ`Ë¿`ËÑù›ãýé§2—^ZŽ ¯/¦§ËlÝjͱúòËÀÊï»O¦¬Læôi«üàÁúóµzúHfäHÿ1­Y¤Ðõ_'ÇßÉüÓ†êߨþçäøÙm¿öø¸j•ÌÏ~¾[¾újýõc†ÌÝwŸ}>r¤Ì£:ßfAÌo+sî¹2W\!³{·Ì•W:/·[–,‘IHðÇ+¯”ùÇ?d«©Ç IDATºu³–÷ß·ÆìPÕ/Øí''[¿jøƒ´ìvÚ»·ÌÔ_]|‚-gaa‰Ž_®¬)[þÁ&kæ[¦ÁÄû¿ÿ[fÔ(oo¤ÈŽÛÊ•2?ù‰ÿòØX™íÛ½_{óMïŸÒþÎwdÞxÃù6ßyÇûyf¦LQ‘óò`ãøòË2·Þzöùm·Éüå/¡«_°Û—d¾÷=™-[÷“åÑÒNW¬°âPw=vñ ¶œ……%:ïçx_{­´~½ÿò˜© Àú˜ýÝw¥ü|ëWkÔ3³ñ·ûÚ¾]üœh(~vëOI±~òþ«¯¤êêÆÅ¯¡z?ñ„õc#FHn·tø°”žÞðT„Ú¯ÿÍ›¥¾}½_ëÛ׊UŒ éÕW­_Ý;yÒú›@?oh:Š]ûvrü‘¾÷=iãFë#ÿ@Ž»¡þÑÐö?'n¿Ý:v¯¿.Ýu—ïS?Iºæ«.kÖÔ/;÷\骫¤¿üEzáï²U«¬úwë&]x¡U¾zµóíÖ¶ñÖ[Ö˜é´ò\¾\fôhïò;d®»N&&&ð+vëŸ8QfÝ:™óÏ·>Ê~â‰Ð^ñ¶‹Ÿ“õ6?»õö™Ì½÷Z ŸsNè¯òÿîw2ýû{?~ó͆×[ûµ`â?b„Ì¢EÞ¯-^,“}öùªUÖ':qqÖt„ǯUÔiýýÕ%˜ãS³Ž¢"«»\»þÑÐö?'1yúi«}%%ɼöšÌOºúÕ,O=eÅÖß>c]÷U¾hÑÙ÷¬XØv‹‹eƳŽm÷î2/¼`™N˃?N’iÓÆš‚ðÞ{ÖX}òdèêŠíK2©©ÖUïÆl·¦ýté"óúë27ÞúþÌïW_•¹åß뱋O°å,,,-pª‰]âýÞ{ÞÏ].kž¥¿­}{™o¿u^¾s§5·­öœÁÒÒ³Ï?ùÄÙüA«Ýú?ÿ\¦gÏðM5±‹_ ë­?»õþ¹Ìøñ2_ÜpÒLÛ´ñ~\]í<ñ&þ11Ö÷ºt±žwé"S^.Ó®ÿ¿ißÞ{ÿB‘xs|jÖÑÐІ»þÑÐö¿@crÙeõ?*¦~µ§TÜt“ï²6m¬ùÕ6ÈŒã]vë­2ÿü§5o¶wo™½9»%.ÎJꎗ©¨ù¯ÿ’ù÷¿—‡*ñ}÷]™¿ÿ½~blý‚Ý~í¾ø¯¿Ý”ï©:¡ê?M¼¯¸Âšƒío=vñ ¶œ……¥N5ùòKëc:Nž¬ÿ±]Ý×꾿¡Ÿ¡­[Þ£‡õñ|ÍÇ€_}%]vÙÙò‹.’¶mküÕ~»õ÷»Ò®]áû´!Ðø9Y_íøÙ­ÿ–[¬3׬±¦¼ñFàS ìTW{?>'€XÿS§¤E‹¤±c­ç¿ü¥õüôé³ïéÚUÊË“6m’öï·î~qÎ9á=ÞŸ¾¦P8a×?œl?˜ãWWy¹uç‘PÕÏiûûðCkÊMÝ©Jwß- nMÅùè#éç?—~ñ çë>rDÊΖ:u’’“¥—_¶ÆL§åÁúòK)1Ñš¾rÝuÖã/¾]ý‚Ý~Põ©Ý»­86Uÿ±3uªôØcO°å¢SƒCâ{ïY·3ò§CïDâœs¬×BåÀk~¢Ëuv©=‡oï^kþ¦¾~»õïÛçˆÃ×öÃ?»õoÛf%$))ÒXs)ÿúWçû íÛû/ 6þÏ?/Ýs5ÏwÌëyÝòÖ­Ö<ò+¯”ââš¶ó…ûøÛõpo¿®^½¤={B¿Þ²2é’K~¯¤¬cG«Õ:vlü~\w÷œÜ@ËõÞ{Ò~pöùÕW[sÃU¿@·_ûGiiðÛKMõ®O(ÛocÆ·Aƒ¬¹Ýµç‡×ž'nŸ`Ë´ÀÄûé§­ÿÕ_}µ• Ýv›TTt¶üí·½¿4óë_KëÖ…nçæÎµ¾˜Ó·¯Ô¦MýòY³¬ý¹ñFë‹6þ|þ¹ï{ Ú­Þ<+IIÖÕѹsWÛwüœ®ßå²î9|ÞyÖ=‡î°öï—F²N–}ûZ÷ªmLüý}!ï‹/¬«Ù/½d½§îÕÆ /´^۾ݺ»paÓv¾Põ·ëáÞ¾$=ù¤Ûï~×:–u¿à ÅÅÖØäOr²ôÜsRa¡÷ëû›Uç÷Ý'½ùf`õ«Ñ§4c†ôÇ?^Þ˜/”ÖÄöᇭÿ4_p4y²ôÔSá©_c¶_cð`iÉ’Æo£¦ý<óŒu_òP·ßÆŽoµ/ØÔ$îµx»ø[ìñÐLšã-É ,SRbÍ7Û¹Óû¾°112Ï=gÍA۸Ѻomí9´vó^Ì‹½ï>™²2™Ó§­²ƒë‰nëVkrI&=Ýz12_~é|ý.—Ln®õÌ¥K­X4f> ¿íÛÅOAÎ+¶[ÿž=Öû¿ýVæÐ!™eˬy¸ÄÏɾù{Á–ÛµO–È›ãíÊšù–¹3ãrý Ë¿¬«€]¬½{ÊuÑÅ=ø_ €¨`Ýrî·¿å `¤èÚÕúë׿–þçÿ{cÂ7Å |ÙS¾Ûóxñ¢õÈÔéÚ»§Üñ߻ׯӘœ±:t¨R«W¾ª19c=ëÜrè\½¼þcC˜D»ª*kºÉïö'ãѼžzJÊÍm\Ò -U[B %¨¬lx®7šVv61€º¸â ˆ8L3@â €Ä ñH¼„“ç®&¦öoÝŠ'¿þ¿¸â 4o€Ä ñ@â x$ÞH¼o$Þ‰7@â €Ä ñH¼x$ÞH¼€ÑÖóÈ¢„Jüš+Þ@ ñš€gª M€Ð1uþåŠ7ÐH¼o€Ä‰7@â x ñH¼x$Þ‰7o€Ä ñnm­Œd ÑB¥N~Ý–ˆ˜ôôteffªOŸ>:÷Üsõé§Ÿê™gžÑ'Ÿ|BpøÅTtûí·kãÆÊÎÎVff¦¶lÙ¢ & âŠ7š2eŠ×óÂÂB >œÀ ñ ”âãã•••¥>}ú(99Y±±±r¹\€³Ä›¯VàÌìÙ³UTT¤ 6¨ªªJÇŽÓš5k /uókæx ®]»ªªªJåååêܹ3ó»éÙgŸ%hU˜j@€fÍš¥‰'*11QûöíÓÒ¥K•‘‘A`”œœL@â üÛ¸q£6nÜèõÚ[o½E`üÏËŒ3H¼‰é9 ñ •s»Ý –3¥‰7!@b \¸« @â x ñH¼áP¿~ý4mÚ4M›6Mééé>ßc÷ |@ã8_§NÚªÇᘘ©S§NœŸïè•ššªœœåçç+??_999JII!0!zôè¡®]»¶êÜtÓMzÿý÷uüøq@⽆ªÂÂBUVVª²²REEE6lX½÷8p€`@3=z´ [mý].—† ¢W^yÅg9ç'ÀWâm$c-ˆiiiÚ±c‡çyYY™ÒÒÒ꽯´´”`@œ×\söîÝ«/¾øÂg9ç'´zuòk®xG°„„=zTÊÏÏ×±cÇ”Pï}yyy ÂààÁƒ~ËFÕª¯vKÒ°aôtéR¿åœŸoüre¨®®–áÓhrþ¦J\z饭þjwÏž=%Éë“Y$ÞQ«ªªJ±±±?~¼$)>>^‡&0Ð̉7W»¥;î¸CÅÅÅ4€Ä»e())Qjjª6oÞ,IêÕ«—¶oßN` ‰<ÿüó>_0`€ àõšÛíVFFF«ˆËù矯‹.º¨U_ñƒ9Þ¬¸¸X#GŽTRR’’’’4bÄ-[¶ŒÀ@ÉÏÏ÷ùzFF†×RóZk‘••¥åË—3 W¼#ØÎ;µpáBÏT“ h×®]šHuu5A¨£S§Nêß¿¿ßO8H¼ù?kdÚ²e‹¶lÙB  äææ:z_kºÚ}üøqeggÓ8êæ×L5šSM€äv»,oMW×úoaÉ hy˜jx$ÞH¼ïVgîܹõ^s»ÝžeåÊ•šÇh^×\söîÝ«/¾ø‚`4Bii)A•xC4 &Ùnh~œ1FGÕÆ5}útÇë¾ë®»Ô·o_åååéôéÓ>|¸WyBB‚Ž=ª‚‚c”››«„„J„àøÍoذaš7oh¤¼¼<‚4Ä“_›:‰7š51oŒAƒ顇ÒáÇ%IóæÍó9¡ººZ†ÿXEŽмj¦öíØ±ƒ`h$ÞQ,!!Aû÷ï÷[^UU¥ØØXÏô„øøxO’ŽÐÚÝqÇ*..&š _®ŒbêÖ­›ßò’’¥¦¦zž÷êÕKÛ·o'p? Õ;ÿüóuÑEiÓ¦MÃFLLŒÎœ9C ïÖmõêÕ7nœ:wî¬øøx=ðÀ^åÅÅÅ9r¤’’’”””¤#FhÙ²eŽã´zYYYZ¾|9Ó¸l´mÛV™™™*))!@(ú!ˆ^ÅÅÅ:sæŒ&Mš¤'NÈívkÈ!žò;wjáÂ…ž© ,Ю]»ÇhÕ:uê¤þýûëùçŸ'~ÌŸ?_=zôЙ3gTZZª9sæ€Ä;:¸\.ŸWU‚ùb¥dÝÿ{ùòåZ¾|¹ßunÙ²E[¶lá D ŽÐ<Ž?®ììlÑ€œœ‚„SMšÀå—_®ªª*ЊqÅ;Œ/^¬îÝ»ëÈ‘#zá…‰7ÂaÔ¨Qgo£šßÓ uókæxM€Ä ñH¼ˆXn·Ûçc ñH¼ˆ.ðùH¼¡ÒÒRŸ ¹œýü-G^^žÏÇÐdjòëÿû‡+Þ@ ñH¼o$Þ‰7@â €Ä ñ@â x$Þ­mÍC,€1þo¢I¿~ýtÛm·I’V®\©­[·zÊÜn·222€ˆÂT@ÔIMMUNNŽòóó•ŸŸ¯œœ¥¤¤$Þ„ÒСCUXX¨ÊÊJUVVª¨¨HÆ #0"SM‚žž®ÌÌLõéÓGçž{®>ýôS=óÌ3úä“Ošdýá.öøSÞ²Ûý¯uiii*((ðÙ¹Ã|²s‡1Ƙ=廬ùà, ,3fÌ0?ùÉOÌw¾óÓ±cGsÏ=÷˜ 4ÙúÃ]íñ§¼e·ú_ë?Ö®]kÎ9çSPP`òóóM›6mÌÚµk=ån·»YÛO´·ÿæn,,ͱì)ßíY¦=:Å“;]^œÿ‚‘dªô<®É¯_Ù|ÐdÍ|ËœM¼w”™Ov”‘x±´k×ά_¿¾ÙÖîòh?å-»}ÐÿZ×øQ“x?ûì³fîܹ'Þ­mü‹öñ™…%jïÿ˯ko¦š!>>^YYYêÓ§’““+—ËÕdëwy´ÇŸò–Ý>è­{ü¨ªªRll¬gzI||¼>1í'ÚÛs·? åO5áŠwÀËŸÿügóãÿØ\vÙe&11Ñ´k×.à«,Á¬?ÜåÑÊ[vû ÿµîñãá‡6W_}µçùøC3iÒ$ÇW¼[úøíã3 KK½âÍ]M‚еkWUUU©¼¼\;wÖ„ |¾ïÙgŸ ËúÃ]ìþ7wü)oÙíÃéþEkûjíûo§¸¸X#GŽTRR’’’’4bÄ-[¶,bÚO´Ÿš»ýEúùh,¦šaÖ¬Yš8q¢µoß>-]ºÔç6$''‡eýá.vÿ›;þ”·ìöátÿ¢µ}µöý·³sçN-\¸Ð3ÕdÁ‚Úµk—×{Ünw½¿«ÙÇæÞÿH?ÿ4wû‹ôóÐX®¬™o™;®OSŸÎG$I—¥öÔÞ=åºèâD'DƒÏK/½¤?þ˜ýíý“ñjOùnÏãÅ‹^Ô#S§kïžrÇï^¿NcrÆêСJ­^ùªÆäŒÕ';Ê$Ií¬%o—pÅ;Ü¢íãË–¶ÿ }ôOöˆ$ÞÍÄ×G µEÓGžýý§~Ô‰wÄbà茌Ôh]¸« @â x ñH¼£JCß0ïׯŸ¦M›¦iÓ¦)==ÝñßIRûöí5qâD½ùæ›Z²d‰n¼ñÆ€·ï¤\’¦Nêó};vÔÊ•+ë=vR¿Hˆ0ån·Û³¬\¹R“'OVbbb“m¿¥”GjÿsÚ~›">þú_¤ï0ûªvÓ\û)í<’ëW{ß±ÿ‘0þ$Þ$55U999ÊÏÏW~~¾rrr”’’âøïï½÷^}öÙg‰7ê:t¨ UYY©ÊÊJiذa‹‹‹uòäI}úé§úÓŸþ¤¬¬¬ïçèÑ£UXXèwðÛ¹sg½Ç¡¨_´0ÆèĉZ±b…zöìIÃn!ý/RÚ¯¿þéû-ñm©û õ;pà€ÏÇ¡<º^ joó ê;yò¤Ï×ÓÒÒ´cÇÏó²²2¥¥¥9^o›6m¼žoÙ²E—_~¹ãí;)¿ä’KÔ¥KmÚ´Éëõš)cÇŽÕðáÃë=EýÂÿP•KR\\œ²³³µmÛ¶&ß~´—GjÿsÚ~Ãý/ö?Tû×\ý?Rö?RÛzzº{ì1­ZµJk×®ÕsÏ=ðçÒÒRŸCyþô·^ Z˜:96? ãÀÁƒ}¾ž £Gª  @Æåææ*!!Áñz+++5hÐ ½ù曊‹‹ÓÈ‘#}þ½¿í;)5j”Ï«m5?аdÉ?^***Òƒ>¨ŠŠŠÔ/ÜñE¹Ûí–1FGÕÆ5}úô&Ý~K(Ôþç´ý†3>þú_4ì¨ö¯¹ú¤ì¤¶ÿÛo¿]ï¼óŽfÏž-cŒî¼óNM˜0A÷Üsã}ËËËóù8”çO뢉·vuUWW˘À?/xòÉ'•››«±cÇêäÉ“Z²d‰ÏõØmß_ù¥—^ê÷j›$ÅÆÆ*&&FêÔ©“çq¨ê×Tñ¦ÜÉ/Ä…sû-¡<ÒûŸ]y¸âc×ÿ"}ÿCµÍÝÿ›{ÿ#µýO™2Åëyaa¡†5çO Êo#Ñð8ªªª«ñãÇK’âããuøðaÇëýúë¯õøã{ž'%%)333d'ž†®¶ùû6zÍ㌌Œ ë ‰w$lŸÄ;<ýÏiû W|êѰÿ¡Ú¿æêÿ‘²ÿ‘Úþããã•••¥>}ú(99Y±±±r¹\Qsþ¢Füš/W:ðüóÏû|½¤¤Äë.$½zõÒöíÛ½Þ½{{Íy³Û¾]ù€ôøã{æs×M¬_|ñE*##C‹-Ò¢E‹”‘‘á¹ êú…:þ¡*oîíG{y¤ö?§í7\ñi¨ÿEÃþ‡jÿš«ÿGÊþ;£3gÎ4iýfÏž­]»viîܹºï¾ûtë­·Fõùˆ$Þäççû|½¸¸X#GŽTRR’’’’4bÄ-[¶¬QÛ¸ä’KtÏ=÷hÅŠŽ·oW^“D×N¦kO­HMMõ$úuïhêú…#þ¡*oîíG{y¤ö?§í7\ñ±ë‘¾ÿ¡Ú¿æêÿ‘²ÿvÚ¶m«ÌÌL•””4iýºvíªªª*•——«sçΚ0aBÔž?hÂoª««}¾¾sçN-\¸ÐóQÙ‚ ¼îƒ]÷ Wír•+W*66V_~ù¥.\èóüþ¶ï´ÜŸž={êÉ'Ÿ”dÝûnâí¤~Íÿpǧ©¶íå‘Úÿœ¶ßæŠO¤ï(öÏnü gÿ U|ÃeþüùêÑ£‡Îœ9£ÒÒRÍ™3§Ië7kÖ,Mœ8Q‰‰‰Ú·oŸ–.]ð± ÷ùh‰\Y3ß2w\ÿŸê{ÄJÀzöÒÞ=åºèâD­ÂžòݞNj½¨G¦N×Þ=åŽÿÞ½~ÆäŒÕ¡C•Z½òUÉ«eÖ-1?:§¥o—0Õh $Þ‰7@â €Ä ñH¼„? ¤~ýúé¶Ûn“dýÎÖ­[*S§NÕu×]çõ µüâØ±cúàƒ4oÞ<>|8ªŽ‘ÛíËC ²û_ZZšn¼ñFÝrË-8p ûdßñÕ:v쨢¢" <Øëq¤ìKŸÃ1¾ÛÕ¿©ÆMÆg´6\ñBjjªrrr”ŸŸ¯üü|åää(%%Åqy¤èÑ£‡ºvíê³,##CTvv¶vïÞ­Gy„¨è™™™š?¾\.û&)))ž_¬ý8ö¿¥ŒÏáß[KýïdèС*,,Tee¥*++UTT¤aÆ9.£GVaa¡ßrcŒNœ8¡+V¨gÏžQwœ8@cm…ýoúôé:~ü8û¢¾ã«¥¦¦jçÎõGÂþ·”ñ9\ã{¤ÔŸñ$Þp,--M;vìð}zÔ§¼¼<k+ììhûNíÇ5sr—,Y¢ñãÇ«¢¢BEEEzðÁUQQÁøã{¸ëûí·ëwÞÑìÙ³eŒÑwÞ© &èž{îa|‰7‚S]]-cL£Ë›Ë¥—^j{µ›/½ Úûû±±±Š‰‰QEE…:uêäyÌø=ã{8ë?eʯ煅…>|8H¼ AãUUU)66VãÇ—$ÅÇÇ{Ýñî¼¹Ù]í¢¹ÿ±ÿáS{:‰¯Ç‘ðöhŸÃ=¾‡»þñññÊÊÊRŸ>}”œœ¬ØØØˆþ¢0@âJJJ”ššªÍ›7K’zõê¥íÛ·;.on ЀêP¹Ê–ÐÿØÿðÉÈÈЈ#Ô¶m[-Z´Hwß}·$EÔä£}|÷øîúÏž=[EEEÚ°aƒªªªtìØ1­Y³† ­_® Bqq±FŽ©¤¤$%%%iĈZ¶l™ãòH8yÖ^j^ZBÿcÿÃ+55Õó强w4a|Žüñ=ÜõïÚµ«ªªªT^^®Î;k„ Z€¸â”;wjáÂ…žê,Xàu[»ráë‘:¢¥ìÏž=õä“OJ²îá]7ñnîýg|.>uaí„Þ‰Y³fiâĉJLLÔ¾}û´téR.ì’\Y3ß2w\ÿŸê{Ä@{öÒÞ=åºèâD­ÂžòݞNj½¨G¦N×Þ=åŽÿÞ½~ÆäŒÕ¡C•Z½òUÉ«eÖ-3?:§¥o—0Õh L5AT²û‘>Ò$Þ@X€hÃT€ÄÖh^ IDAT ñ@â xG¹sçú|½cÇŽZ¹re½Ç5úõë§iÓ¦iÚ´iJOO¯÷÷Á–‡sûn·Û³¬\¹R“'OVbbb³_w3±»Ã ZgÿKKKÓƒ>¨õëׇ¥ý…ªÝ5eû f[þþ6’û_°ãkk1uêTŸÇ1ÚΉw ’››ëóõ””ϯ}Õ~,Y?£œ““£üü|åçç+''G)))!+÷ö%ëî!Tvv¶vïÞ­Gy„Æ€¨è™™™š?¾\.l…B1þµ=zôP×®]Žç€Ä»Ù÷šŸJ®ýX’†ªÂÂBUVVª²²REEE6lXÈÊýýÆ8qB+V¬PÏž=#î8p€†Hÿ«×þ§OŸ®ãÇG|¢½ýFêþ‡jükéF­Â€ã-ç Òpoµ?~«}ïèºË >ÜëqFF†ÒÒÒTPPày½¬¬LãÇ÷<¦¼)¶_[\\œ† ¢mÛ¶5Yì].— ¤þýûë›o¾ñ;e ´´”†Jÿ«×þ›ªýù“žž®ÌÌLõéÓGçž{®>ýôS=óÌ3úä“Oš¤ýÚí¿Óý³©ý/”ã_KuÉ%—¨K—.Ú´iSÀñkîó@âÝBÕœÀëžèk^_²d‰Æ¯ŠŠ éÁTEE…$)!!AGUAAŒ1ÊÍÍUBB‚gÁ”7ÅökêmŒÑÑ£GµqãFMŸ>½Éb×]w©oß¾ÊËËÓéÓ§½’«Úòòòh¨ô¿zí¿©ÚŸ?·ß~»ÞyçÍž=[ÆÝyçš0a‚î¹çž&i¿vûïtÿìDjÿ Åø×Ò5ÊçÕîh8?$Þ­Pll¬bbbTQQ¡N:y×U]]-cŒßõ4¶¼)¶ßœ¿9hÐ =ôÐC:|ø°$iÞ¼y­ò£`×ÿš«ýM™2ÅëyaaaÀÉ{8÷¿¹÷¯©;þ¶T—^z©ß«ÝÑp~H¼[w7¨yœ‘‘¡ªª*ÅÆÆz>ž‹÷œ%UÞÛon Ú¿? êÍÝþâãã•••¥>}ú(99Y±±±MúEO»ýoîý ·hÿ­¡«ÝÄ ñŽ81b„Ú¶m«E‹éî»ï–$¯¬¤¤D©©©Ú¼y³$©W¯^Ú¾}{HÊ›bûÍ­¢¢BݺuÓ¾}ûhp¸ÿ5wû›={¶ŠŠŠ´aÃUUU騱cZ³fMÄôŸ@ö/&&FgΜ‰ª6íã_¸ 0@ ¨÷Úšÿ´¶öøáÂ]M‚ššª;vx×¾£‚$käÈ‘JJJRRR’FŒ¡eË–…¬<ÜÛon«W¯Ö¸qãÔ¹sgÅÇÇë ÑÁqûoîö×µkWUUU©¼¼\;wÖ„ "ªÿ8Ý¿¶mÛ*33S%%%QÕ>¢}ükŠÿ¼Ö^j^#>@xqÅ;={öÔ“O>)ɺ‡pÝÿÎ;µpáBÏGu ,ðºÏp°åáÞ~$œ8Ïœ9£I“&éĉr»Ý2d ŽÚ°SPœ´?_?:R³Y³fiâĉJLLÔ¾}û´téÒ&k·ÿvû7þ|õèÑCgΜQii©æÌ™Uí#ÚÇ¿H€ÆqeÍ|ËÜqýªwìëÖ³—öî)×E÷ :5Ar¹´nÝ: 8`ô?@ ´§|·çñâE/ê‘©ÓµwO¹ã¿w¯_§19cuèP¥V¯|UcrÆjg™uËÕŽÅiéÛ%L5qâòË/WUUè4SM°xñbuïÞ]GŽÑ /¼@@€Òÿ|M©-Òo“íû$Þ¨gÔ¨Qhý/ÚSkˆNL5H¼o$Þ‰wT±»ƒ@K/oÎX÷ë×OÓ¦MÓ´iÓ”žžNc ±H¯¯ÁiêöMý§%î8Û7ã‹}[hÉí ñjIMMUNNŽòóó•ŸŸ¯œœ¥¤¤â ݾiÿH¼Z†ªÂÂBUVVª²²REEE6liEñ=pà€ÏÇþÞ8mߌ/÷A$ÞMâäÉ“­º<\\.—¬™3gêÑGÕµ×^ëUž––¦;vxž—••)--"ÑßÒÒRŸý½'û´_-µ}·öñÅnümªþ´6ü€ŽlÕåár×]w©oß¾ÊËËÓéÓ§5|øp¯ò„„=zT2Æ(77W 4ȉ†øæååù|ìï=‘Øÿ£}üj©í»µ/vãoSõ/ µáŠ·vµµôòp4hž}öY>|XÇŽÓ¼yó|¾¯ººZÕÕÕ4Ä0!¾ŠÊþÓZö?Üí»µ¶§ã/€ÐâŠ7‰w³x´ÿ~¿åUUUŠÕøñã%Iñññ:|ø0 2Dˆ/‰wKN¼íÚwkoÿvã/€ðàŠ·Ï?ÿ|«.—ŠŠ uëÖÍoyII‰RSS=Ï{õê¥íÛ·Ó C„ø6Mÿgÿ#³}·ööo7þ ñn6ùùù­º<\V¯^­qãÆ©sçΊ×<àU^\\¬‘#G*))IIII1b„–-[Vo=Ï>û,´ˆoÓôö?2Û·ÓößRٿƒ©&ØÍÿkéåá<1ž9sF“&MÒ‰'äv»5dÈOùÎ;µpáBÏGÁ ,Ю]»ê­'99™FÚÄ·iú?û™íÛiûoÉÿñnhü®¬™o™;®ÿOõŽ="IJéÙK{÷”뢋{D¼Y³f饗^ÒÇL0ˆ/¶§|·çñâE/ê‘©ÓµwO¹ã¿w¯_§19cuèP¥V¯|UcrÆjg™uKÎŽÅiéÛ%\ñFt›0aA ¾Do r»Ý –gdd$H¼‹Ä€ÈÃ]Mo z}óÍ7$Þ@¸“î>úH§Nþ›Ä—sÏ=W½ûôQLû’ør%"ÄÔ©SuÝu×ÕûR`¿~ýtÛm·I’V®\©­[·zÊÜn7_"thîܹÊÍÍõz­öOŽ;¦>ø@óæÍÓáÇ Z„†Æ'å- ã%ÐŒŒñ<äŠ7š]=Ôµk×z¯§¦¦*''GùùùÊÏÏWNNŽRRRX#ÔMºkdddhàÀÊÎÎÖîÝ»õÈ#,´vãã €¦ÀTDœÑ£G«°°°ÞëC‡Uaa¡*++UYY©¢¢" 6Œ€…ü?âF'NœÐŠ+Ô³gO‚Ánü`|ÐêN5!ñF³ºä’KÔ¥KmÚ´©^YZZšvìØáy^VV¦´´4‚·ÛíY§ììlmÛ¶ ¡E°?_4™ZSM˜ãf5jÔ(ŸW»%)!!AGUAAŒ1ÊÍÍUBBA @ÍœN‰·Ûí–1FGÕÆ5}út‚†Ánü`|Ðj¦š´éOâæu饗ú½Ú][uuµL­ÿ-"ô‰9ÐRÙŒ/©fªÉ®SÜÕͬ¡«Ý’TUU¥ØØX?^’Ï78b7~0¾h²ä»Cé”õ˜9Þh6 Ðã?î5¹ö”ˆ’’¥¦¦zž÷êÕKÛ·o'plÙ­i|‰‰‰Ñ™3gh@ ñF³ÉÈÈðZj^«Q\\¬‘#G*))IIII1b„–-[ðvž}öY‚ ´2vãG¨Æ—H×¶m[effª¤¤„FDBŸ$ˆT;wîÔÂ… =/X°@»víòz¯/ Ö·œœœL0ƯñÃÉøÍæÏŸ¯=zèÌ™3*--Õœ9sh‰7à?a–¤-[¶hË–-Žß_׬Y³4cÆŒVW—ËåóËc|±-]C㇓òh–““CH¼¦5a„VƒË/¿\UUU4H¼„Ãâŋս{w9rD/¼ð€Ä@8Œ5Š A¸« @â x ñ"_®DT˜:uª®»îºz÷žîׯŸn»í6IÒÊ•+µuëÖ–G·Ûí'û_÷o€Ö¢¥õÿ@ê—––¦o¼Q·Ür‹Hc"W¼ñzôè¡®]»Ö{=55U999ÊÏÏW~~¾rrr”’’²òHíû4gÿhéý?33SóçÏ—Ëå¢1$Þ€s£GVaaa½×‡ªÂÂBUVVª²²REEE6lXÈÊ#]´ï?Мý£¥÷ÿéÓ§ëøñã4€Äpî’K.Q—.]´iÓ¦zeiiiÚ±c‡çyYY™ÒÒÒBVžžž®Ç{L«V­ÒÚµkõÜsÏy]Q w¹ËåÒàÁƒ5sæL=ú裺öÚkª“'OÒÐêÛÿ£½~H¼€5ÊçÕnIJHHÐÑ£GUPP üü|;vL !+¿ýöÛµqãFegg+33S[¶lñú úp—ßu×]ºöÚk5gÎ=ýôÓõNªvû_ãàÁƒ4$´:Áöÿh¯€ÈÄ—+±.½ôR¿W»k«®®–1&äåS¦Lñz^XX¨áÇ7Yù AƒôÐCéðáÃ’¤yóæùü(Ü®~ 1¡Õ v|ˆöú ñièj·$UUU)66VãÇ—$ÅÇÇ{’ÔP”ÇÇÇ+++K}úôQrr²bcc½¾¨îò„„íß¿¿Ñõ'ñFklÿöú ñ2`À 0ÀëµÚ·Æ+))Qjjª6oÞ,IêÕ«—¶oßîyo°å³gÏVQQ‘6lØ ªª*;vLkÖ¬i²òŠŠ uëÖMûöíó»ý¯ñüóÏÓ˜ÐêÛÿ£½~"s¼±222¼–š×jkäÈ‘JJJRRR’FŒ¡eË–…¬¼k×®ªªªRyy¹:wîì5ÿº)ÊW¯^­qãÆ©sçΊ×<àUn·ÿ5òóóiLhu‚íÿÑ^?‘‰+ÞˆZ;wîÔÂ… =µ.X°@»ví Yù¬Y³4qâD%&&jß¾}Zºt©Wâîòââb9sF“&MÒ‰'äv»5dÈÇû_£ººšÆƇû´×Ïív×{ÌiÍÏ•5ó-sÇõÿ©Þ±G$I)={iïžr]tq¢€VaOùnÏãÅ‹^Ô#S§kïžrÇï^¿NcrÆêСJ­^ùªÆäŒÕβRIÒGÇâ´ôí¦šMÄ ñH¼x$Þ‰7o µH¢%–­Ýܹs}¾Þ¯_?M›6MÓ¦MSzzz½~U³¬\¹R“'OVbbbÄŽ]¾Æ†êŠrÆ€Ä/¹¹¹õ^KMMUNNŽòóó•ŸŸ¯œœ¥¤¤x½'##CTvv¶vïÞ­Gy$jêlW¿`Ëx­Ò ¡C‡ª°°P•••ª¬¬TQQ‘† Vï}Æ8qB+V¬PÏž=#¶ï×ìêl9ã@â 4ÊÉ“'£º¼´´”ƒøP{ºH]iiiÚ±c‡çyYY™ÒÒÒ|®'..NÙÙÙÚ¶m[DÕ¯v߯;ØÕ/ØrÆ <Ú´tŒêò¼¼<"àCFF†'¯+!!AGUAAŒ1ÊÍÍUBBB½ÄÝ££GjãÆš>}zDÕ¯v߯;ØÕ/ØrÆ€Äh»J#½@ãUWWËÓ`âÞRëŠr$Þ‰7€UUU)66VãÇ—$ÅÇÇëðáí¦~Á–æx£Å{þù磺@àJJJ”ššêyÞ«W/mß¾½ÕÔ/Ør$Þ@£äççGu9€ÀkäÈ‘JJJRRR’FŒ¡eË–µšú[ <˜j‚¯ºº:ªËnçÎZ¸p¡g*Å‚ ´k×®VS¿`ËxâëÇ5¢©€.—Ëï—·lÙ¢-[¶ø,k _¬l¨~¡(zL5D­Ë/¿\UUU@TàŠ7 ê,^¼XÝ»wב#Gô /$ބèQ£€¨ÃT€Ä ñ@â x·Ûíó1x$ÞD—ø| $Þ„Pii©ÏÇ@â @åååù| $Þ‰7o€Ä‰7@â x ñH¼x$Þ‰7o€Ä ñ@â x ñH¼o$Þ‰7o€Ä ñ@â x$ÞH¼o$Þ@ô&Þn·Û³üõ¯Õã?®óÏ??¢+ìv»£æàœ{÷Þ{õòË/ë­·ÞRaa¡n¸á¯º\~ùåžçéééõêwíµ×ÊívëÚk¯u‹º¯õïß_þóŸµfÍêæ›on‘aîܹŒ~úvÝ¥9úRSŸ¸¸8͘1C:uòŠÁªU«4eÊ%''GÕXe7~„#þ¡l'NTJJJ³ö»ñ³nŸh©c€¯ó{8ê®ñ…ñ-&ñ–¤ŒŒ eddhذazûí·5qâD¢"“&MÒ‰'”››«ÿ÷ÿþŸæÎ«x½çúë¯÷<®[&IW]u•>ùä]yå•o?%%E¿ùÍoTPP [n¹EøÃÔ»wïëÜÜÜñŸµP©é×>ŸGÒñ …ØØX͘1CEEE:~ü¸WFŽ©?þXO<ñ„')o)ãG¤Äß—?ýéOzà”ššÚl1lhütÚ¢yühèüÞœãA4´_ l‰wýë_Z·n¾ýö[¢"]ºtÑK/½¤ŠŠ >}Z[¶lÑ´iÓ¼Þ³ÿ~]sÍ5ºøâ‹uæÌŸ'Ž‚‚]uÕUoèСZ¼x±>üðC>}Z;vìP^^-ÎC=¤Å‹«¬¬¬^Ù±cÇ´råJ-Y²DÙÙÙ-jüˆdGŽÑ´iÓô›ßüF:th¶Ä»±ãgKÂù¶¡ZQÇŽuíµ×ê믿ö¼–žž®ÌÌLõéÓGçž{®>ýôS=óÌ3úä“O$IݺuÓ˜1ctÅW¨sçÎr¹\úüóÏ5jÔ(Ï:  o¼QíÚµÓºuëôöÛo;^¿ËåÒ AƒÔ¿}óÍ7Z¿~½wåÛ¶Õý÷߯=zÈåréÓO?ÕsÏ=ç3õw%ãÑGÕwÞ©Ë.»Lÿû¿ÿ«?þñz÷ÝwC²þ“'OêŽ;îPqq±Œ1>ß³nÝ:Íž=[{÷îÕo¼¡aÆyÊ.¼ðB}óÍ7Ú¾}»þýïë /ÔÞ½{ÓË/¿\þóŸÃÚ:¾NÚGFF†î¸ã]|ñÅjÛ¶m½r·Û­¡C‡jêÔ©úþ÷¿¯²²2=ðÀ^åµ×åë×þ·ö{BÑ~¦Nªë¯¿^:tÐÚµk½êïdývõ ·ýèGAµÿ`Ýñwâûßÿ¾Úµk§>ø Á÷­Y³¦ÞGÖ µ_'õ³ûûñññš2eŠÞ~ûmýõ¯ Éøa7~ÙÅßn| E|>¬ 6hРAZºti“žƒ?íÆ»ú;9þîw¿SÏž=µoß>>|X—^z©n¿ýöÇÂ×ùÝ6¹°éÿNÚOCíß.>NÆ YdÍ|Ë,Û|Ðì,+5;ËJ1Æì)ßm$Ù.n·ÛkY¹r¥INNö”Ϙ1Ãüä'?1ßùÎwLÇŽÍ=÷Üc,Xà)/**2·Þz«‰‹‹3.—«ÞúúÓŸšY³f™äädÓ©S'3mÚ4óÓŸþÔñú‡nžxâ “˜˜hbccͽ÷ÞkÜn·§ü¿ø…¹ùæ›=ÏlÆŒã¨î5õŸ6mš¹ì²ËLLLŒ¹õÖ[Í’%KB¶þÄÄD“——g.\hn½õVÓ¾}ûzÛ—d¦NjV­ZeÚ´iãU¿¡C‡š{ï½×H2÷ÝwŸÉÊÊòù÷þ^[»v­iÛ¶­ãý t±;¾NÚÇâÅ‹MïÞ½ýî§Ûí6“'O6½{÷ö¹Ž†baWŠösÿý÷›¸¸8gòòòL¿~ýZ¿Óú³ø«(Ú0ÇÇÉñw²Œ7ÎÜzë­Ž¶ùôÓO;n¿võ³ûûší÷êÕËüéO2ßÿþ÷ª—“ñ£¡ãg »ñ5ØøÔ,Ý»w7Ï?ÿ|ØÆ!‹Ýøédìp2¶ø«¿ÝùíOú“6l˜éСƒÉÌÌ4/½ôRÈû}Cç÷`ÇG»öc×þíâÈ1ba©Yö”ïö,Óâɉ./ÎÁH2‡Uz×ä×Ë64Y3ß2A'Þ’ŒËå2]ºt1£F2¿ûÝïü¾¿]»vfýúõžçK—.5C† 1矾ÏA·°°ÐtéÒÅó<..Î,\¸0 õÿÇü‡ß˜ŸŸïUær¹ê½È€ZwûÁ®¿f¹ð ÍC=d^~ùe“’’â8qž3gŽ'‘ëׯŸ™3gN£ïÚp¨¸ÝñuÒ>RSSmÑ•W^Ùè䲡²P·Ÿnݺ™É“'´~§õ Wâlûæø89þN–™3gšüà'ÞNƧ†êg÷÷n·Ûüìg?3ùùù&11±Ñõs:~Ô=~v±°_ƒOÍÒ¶m[óæ›o6ù Ønü Uâí´ÿÖ=>k×®5:t0’L‡ÌÚµkÃÒïíÎïíÚO í?ÐöËÂÒ\‰wH¦šcTYY©Å‹ëÑGõúx(++K}úôQrr²bccår¹<å“&MÒðáÃ5xð`ÅÇÇ«¤¤D ,Ю]»$IçŸ~½«««¯?!!Aû÷ï÷»ß§NªWÓ§O7:§OŸöÚ~¨Ö¿wï^Í™3G—]v™~ýë_ëþûï·ý›öíÛ«wïÞêׯŸ×þ´oß^'Ožt´Ýªª*%&&ꫯ¾ò|LÊ/ Ù_»öñÝï~WŸ}ö™ívì¦4V¨ÛÏ_|¡¸¸¸€×®ú5Uûoìþ;=þ¡Ò¦Mµk×Îqûµ«Ÿ“¿OKKó|lßXNǺÇÏŽÝøl|jœsNÓßõ6ã§Sþêow~Û³gn»í6­ZµJ7ß|³¶mÛ–Xø;¿;>Úµ»öo Rµ G'­1{öliÆ ªªªÒ±cÇ´fÍOùgŸ}¦éÓ§K’:tè ÿøÇúÃþ ¡C‡J’:¤_ýêW:tèÏmÙ­¿¢¢BݺuÓ¾}û|þ}LLŒ\.—gŸ].—bbbB‹P¯×®]>O\¾¤§§këÖ­úýïïymæÌ™ºâŠ+´yófIÒ×_­Ž;êĉ’¤óÎ;Ïk_ii©®ºê*½öÚkai|vÇ×®}|õÕWêÙ³§>þøã°w”ÚÇ1\Ç·{÷¨h²önáÞÿPÿ}ûöé{ßûžíûn¼ñF•””8n¿Á¶Iš3gŽ.¼ðBMš4I'NÔ¿þõ¯&?œ°_ƒOí>йÕÁr2~;~ر;¿-\¸P?þ¸rrrôÏþS3gÎ {\©ƒ]ÿ·k?víß.>@¤ É¥—Ë¥ÄÄDÝ}÷Ý^·âêÚµ«ªªªT^^®Î;k„ ~ÿ¾C‡êСƒ¾ùæÏëË—/×£>ªË.»ÌçU»õ¯^½ZãÆSçÎ_ïKg~ø¡ äyž••¥-[¶„,¸Á®ÿ±ÇSÿþý£¤¤$5Êö A«®ºªÞ âÿø‡®¾új¯+-µïË=pà@}øá‡žç¯¼òŠF­+®¸BíÚµÓ¥—^ês[Ï>ûl£âcw|íÚÇ’%K4yòdõë×/¨+‚NŒôôô_Iºï¾û§„„Ýÿýzýõ×›¬}†[¸÷?TÇÆ úáè·¼S§NºõÖ[5bĽüòË·ß`ÛÿÞ½{UXX¨É“'´`Æ'ìÆ×`ãS£æ^Úþ4vü vü vü°cw~ËÉÉQnn®nºé&ýþ÷¿×áÇÃç÷`û¿]û±kÿNó ;áh?@C‚ÎVjÄ#GŽhíÚµÊÏÏ÷”Íš5K'NTbb¢öíÛ§¥K—z}³øå—_V×®]eŒÑñãǵuëVMš4É+ñ;uê”&Ož¬ .¸@mÚ´ÑáÇ=W<íÖ_\\¬3gÎxîgëv»5dÈOù¢E‹ôÀèÙgŸõ|뺠  dÁ vý7nÔ¸qãtþù竲²Rk×®ÕSO=åøÄ±|ùòz'ŽÌÌLÏó?þñúÍo~£ë®»NÆ}ýõ×zâ‰'<奥¥zæ™g”››« .¸@zî¹çêm«±?,bw|íÚÇ믿®S§Né—¿ü¥.ºè"µmÛÖëïCåá‡ÖCýöî=.ŠzÿøkaÁÅ ,’ ‰i)ed*Ç ;^!/à]„4»Ø3D3¯ "˜ÔJõœ QLMËT.«³ï/=¦–È)1•¬¼€(^HnŸß縇…eg–Ý”×óñ˜‡ÎÎÎg>ŸÏ¼ç3ofgvg¡cÇŽ(,,Ô~k€9â'''3fÌ€µµ5ÒÒÒpöìÙ:‹OK³tý͵ÿÏž=‹’’x{{ãØ±cÕÆ·{÷îáøñã˜9s&nÞ¼);~MÿÊNœ8Ç\ÛŸ–?ä_Míxì±ÇЧOƒßÃl‰6’3~ê;êû挚Æ)Rç·3gÎè|ËNII V¯^˜­ ߥÚ/uüKÅTüKõ\uýÃXD&=\ɉSll¬èܹ3ûÂŒ-rªû©E‹"!!A<÷Üsì-s:– IDAT29::Џ¸8ƒÐ6æñ'**JôíÛW;ߺuk±k×.öÏ_œøÃ•VüÓƒL1gΜ:¹ÇšÈ’nß¾ùóçcܸqÕ¯S>ʦL™‚„„üôÓOôðòòBII ”J%Ôj5úôé£óÖŸyþ¢†IÉ. "úÏÇé‘‘‘ìˆbÉ’%ìbcc1qâDDGGãÖ­[øúë¯ÃŽ!bâMDúð—Ôˆ¨¶Ž9‚#Gް#ˆ2¼Õ„ˆˆˆˆˆ‰7o"""""bâMDDDDôˆ$Þú~MÌÐ/Œ54mý¥ØÙÙaÒ¤IHIIAFF’““Ñ¿ÿFÜ ±ý•ãëQеÚôCMSmTþ!‘ƤGذa<ˆääd_¢}”bäÀX»v-ºwïþзéaŒÚ_–n«Tùy|¥†­Ñ«IHHÞ{ï½G²møùçŸ1mÚ4¢K—.:t(233žmìíoÈ*£‹F£1ù^ ý²á£êé§ŸÆŒ3°téRdgg£C‡5jöíÛ÷Èʼn^|ñEDGGãÍ7ßÄ7xÕa|4Æã‹ˆ‰·…4mÚݺuéS§¹¶µjÕ ,ÐΟ8q'Nœh4û¶±·ŸmAAAؼy³vìú÷¿ÿeË–=’m-..ÆáÇ1fÌ´jÕŠ‰7ト‰·>žžž5jºví ;;;äææbõêÕÚ_×Òw¥«òknnnF·nÝààà…B_ýãÇ7[“’’Œððp£ëÿ ¾AAAX´h<<<““ƒ°°0í²¨¨(Œ;îîî(,,D||<¾ùæ›:Ù¹÷ïßǘ1c°cÇ!ô¾Ç××cÆŒÁ“O> ¥RY­kj_BBâããu~Uî™gžAxx8BCC|û÷íÛ‡Q£F¡¤¤Dûš>ûì3 :ô?‡R‰ÐÐP<õÔSP(ÈÍÍźuëPVV&kÿ+ Œ1=zô@qq1²²²ªÕ±OŸ>ðññJ¥BFFFµG{öì‰ÀÆÆ™™™8tèÙâSª|9ë[šÔö+÷—¾«æ†â[jÿj4,Z´H»ÒÓÓuú§.Æ'Cžþylذ¡æÁÝÄø•ZßÍÍ ³gÏF§N——‡‚‚tìØ£G6{[Õj5 €[·néÄ·¡ø•¤–›z|É9þë3>L=¾äÄïÞ½-Úÿ8::bþüù8tè¾üòKYÛ'ª7Ë3Ägßý®ý-ù¿K¿i¯ÑhôN–¿ÿþûbРA¢yóæ¢Y³f"$$D$&&꬯¯Ìÿߺu«6l˜P«ÕB¡PȪ“1ÓƒmÅÇÇ ooïjÛ—ªÿƒ÷GFFŠ.]ºT«£F£ÑÑÑÂÝÝ]ØÚÚŠaƉíÛ·›½5MNNNbÙ²e"))I 6L4iÒDg¹ŸŸŸØ¼y³èÒ¥‹P*•5ö‘¾öõéÓG,X°@ç½sæÌ¾¾¾Eû“““…«««ÎûÝÜÜĦM›´óo¿ý¶2dˆv~äÈ‘"88Xöþ7nœXµj•prröööbÒ¤I:ñ¥ÑhDhh¨P«ÕÂÁÁA,Y²D‡öOll¬pvv-Z´ÑÑÑÂÏÏÏlñ)U¾Ôúæ>‰?9eHÅ·Ôþ­¼ÔjµX¶l™èÞ½{ORSzzzÇ­9âWjýõë׋W^yE¨T*1jÔ(±e˳ÇŃiÏž=ÂÇÇGXYYÉŽ_©ñGj¹©Ç—Ôñ_ßñaêñ%ÿ–îÿuzöÙgÅúõë…‡‡Gƒ:ÿrz8§‹~ÑNÑQóµ9±Üiã' "?ÿºöÿòëϾû].Ï&'ÞÆœDmllDVV–ìõSSSE@@€puuµhâíéé)Ö¯_otý¼ßËËKVÿè[¿.¦víÚ‰Y³f‰””ñôÓOë$ŸÏ<óŒdékŸB¡ÉÉÉÂÅÅE-Z´Ÿ~ú©Î@ßÛÿÑG‰Î; ooo¡ÑhDß¾}E—.]ĪU«´ë%$$TksÕ× íÿÔÔTñÄOÔUûÇÍÍMÌŸ?_gÿ´jÕJ;¯V«ERR’ÙâSNù†Ö¯«Ä[Îöõ•!ßRûWßþ‰ŒŒ¬³ñɘÄJß…SãWjýôôt¡R©¡R©DzzºÅâbùòå:ôȉ_©ñÇØñÉØãKêø¯ïø0õø’ŠK÷¿F£þþþ"!!A8995Øó/'&ÞUo‹ÞjâèèˆÀÀ@tíÚÎÎΰ··‡B¡½~DDƇ‘#GÂÑÑÙÙÙHLLĹsçÌZÏ“'O¢¸¸½zõªUý?.k;¥¥¥Fµß\.]º„•+WÂÝÝÓ§O×Þ Òºukœ?^r}}íB`÷îÝ=z4Ö­[8p@çcì†Üþ‚‚899aèСغu+‚‚‚––†üü|íz•oCyÐæÒÒRÙû¿eË–¸|ù²ìzþñÇpppÐλºº"55Uç=åååf‹O©òoK©íö¥â[îþ­¼ÔjuO5¹q㜜œpõêUím•o 05~¥Ö¿xñ"†Ž={ö`È!8}ú´ÅÚº~ýzDFFbÒ¤I¨¨¨0*~åŽ?U—›z|{ü×u|˜z|ÿ–èÿÎ;ko‹j¨ç_¢ª,šx¯X±[·nÅáÇqãÆ áàÁƒ:ï±±±©ñdwþüy,^¼ R©Ð¯_?,]ºAAAf¯kbb"Þ}÷]£ëÿ09wîœÎ‰éêÕ«èÔ©Μ9S«òöïߤ¤$lÙ²~~~Õú¯!·¿  /¼ð°qãF|òÉ'èÕ«þøãíûmmm¡P(´÷‡+ ØÚÚÊÞÞµk×àææ†¼¼Ø?ÖÖÖHKKÃÙ³gëm|ÒwEsõêÕ˜6mÚ´iƒk×®aݺuf‹_©õÏœ9£óÃ*%%%X½z58`‘öaïÞ½xóÍ7±nÝ:³ÅomÏ_æ8þë3>L%7þë¢ÿOœ8Ç\¯ÂøE0S®lSll¬èܹóC{#ÿÃ^ÿvíÚ‰5kÖ4Úö7öéQÞæxîQ¨(Ñ·o_í|ëÖ­Å®]»x|3>Øÿœøpe}=\Y,uûë/ÍÞÞÓ§OǶmÛíþkì¸ÿoÿxyy!==J¥Í›7GŸ>}ª}Ç2ãƒÇûŸH—’]@µ1sæL8;;ãàÁƒøî»ïØ!DLll,&Nœˆèèhܺu _ý5bbbØ1DDL¼ÉÜV­ZÅN Gš%žçx”9rGŽaGÁŠ]@DDDDÄÄ›ˆˆˆˆˆ‰71ñ&""""z4oF£wÒ§ò-˜KMÛÒW¿ºÚf]Òh4ðððU¿úès”/'¶ÌQ¾©,Ñ¿•5oÞ)))xå•WjµO,]¿úˆ™ûnÏž=˜?¾ÁÂÐ×~Së¢ÑhðüóÏkç===uÊÔW~Õårëÿ0’j}³³³Ã¤I“’’‚ŒŒ $''£ÿþ ®}}}‘––FƒÍ›7[t|«Ëý£o[ýúõCLL lll̺­†2þføV¹OþO›6­^¬†6Ø›[HHÞ{ï½ÙÿæÜ–ø† sƇ¥û7,, 7nDFFFƒ¬_}ƈ½½=|}}±jÕ*„††âöíÛuÖ~üøã€ž={Z¬þd~øùçŸ1mÚ4¢K—.:t(233«%ˆõù 7!!!Xºt)Nœ8Q/ã[]µàÀðööFLL ÊÊÊÌZ¿Guü£FšxSýjÚ´)ºuë†S§N±3aË—/g'Ô ¨¨Ÿþ9JJJðÚk¯áïÿ{mûòåËx饗påÊ£’…†RÿƬU«VX°`vþĉF'·uÁÅÅ'Ož|¤÷ŰaÃðì³ÏbéÒ¥¨¨¨`poSÿZ®úxÕåAAAX´h<<<““ƒ°°0íòž={bÀ€°±±Aff&:¤³~Ÿ>}àãã•J…ŒŒ £þº÷ôôĨQ£ÐµkWØÙÙ!77«W¯ÖþúšB¡Àˆ#УG#++«ZRõ“bêúIIIFxx¸Qý¿nÝ:|ôÑG8wîœö5wwwLŸ>¡¡¡F×ÏÑÑóçÏÇ¡C‡ðå—_ÖIðj4DEEaìØ±pwwGaa!âããñÍ7ßè´y̘1xòÉ'¡T*ñ믿büøñµ¾’Rõ5©ø–b¨~J¥¡¡¡xê©§ P(››‹uëÖi<9ñi¨~nnn˜={6:uꄼ¼< cÇŽ=z´¬íK‘ªŸ©åWuðàÁj)ËÝ?úâWÎþÏÌÌÄŠ+péÒ%|õÕW’·[SE‹iÇÇôôtãWNÿKϦ¥Žo777£[·nppp€B¡0êø¾ÿ>ÆŒƒ;v@apü|ðoå}/U9ã§¡þ­»•¯ÂW®ƒ)çcÆ}í7—ÀÀ@´mÛ+W®ÔÙrúWª~†Ž9å5ÈÄ[_¢[9Àå|Ü5iÒ$lذ?þø£Îççç|ðÁ(..ÆÌ™3ѤI8p@ûžçŸkÖ¬³gÏÆ;wpìØ1Yu=z4Ž9‚+V@±cÇbΜ9 ¼úê«øË_þ‚eË–¡´´ãÆÓY_Ný 1u}8vìÞxã x{{ëmwMý¿{÷n 66V§?vïÞmtýž}öY„‡‡#>>gÏž­Óîß¿?V¯^K—.aРA Óž˜ýüüðꫯâƒ>ÀÙ³gkÐI%ÎRñmhÿªßßþö7äææj“±‘#GâÍ7ßÄÆeŧTý"##qèÐ!Ìž=þþþÐ&Ýr¶/Eª~¦–_Uyy9JKKÞ?¦ÄoQQ®\¹‚=z`ÅŠ&Å’¾ú›êÁøüçç±‹ŠŠ´WuåöMãsmÏrÇ_©ã;66Û·oG\\nݺetÝbbb0sæLøùùa×®]HOOÇýû÷«ÅOM·2HÕ_îøYSÿJÝjgêùCîøaÉ[M^ýu 8ãǯ¶ÿäćTý ÿrÊ'²ˆÀåâ³ï~?åœ?åœBqñÂ/€ä¤Ñhd½ÏÐ{5ðòòÒ»,99Y´jÕJ;¯V«ERRReº¹¹‰ùóç׺ž666"++K;Ÿšš*žxâ‰Ë’ªŸÔdêúêâéé)Ö¯_/ÙÏ•ç•J¥HIIjµZ»ímÛ¶ ¥RiTÿûûû‹„„áää$»ÞÆNrÛTuÿ%''‹gžyÆlåû^9ûßPýtæ …ÎkRñ)õzzzºP©T€P©T"==ݨíKMRõ3µ|}mú裌ڗ†âWjÿ[byMõ7Çqãææ&"##êCãsmö¡ã¤êñ+u|§¦¦Š€€áêê* E­û©]»vbÖ¬Y"%%E<ýôÓf;ÈßåôoMÛ—{þ¨i}¹ãGmÆ6¹ñ"Þ~ûmñúë¯Ý¿ÆÔOÎ{j*ŸSãš.^øE;EGÍ׿Är§Ÿ|,ˆüüëÚÿ?ȯ?ûîw¸øÖ‰µk×ÊŽO)gΜÑù’’¬^½Zûp–Ôö¥HÕÏÔòì·{÷îáøñã˜9s&nÞ¼Y«}¡/~MÝÿñññ˜1cúôé!îܹƒU«V]S~XçÁøhmm´´4‡GÍÑÿ¦¥¤¤¤ÀÅÅBܾ}'OžDDD„ìõ=Š)S¦ÀÕÕׯ_Gzz:>üðÃjï[°`fÍš…Ž;¢°°Pû²TýÍ=¾›2>ëßäŽ5µßñYÙO?ý„ôôt„‡‡ãƒ>Rõ³TüÕš)WrâÄéᢢ¢Dß¾}µó­[·»víbß4 )66VtîÜÙ¬%sâÔâ³®&…BÁ‡&9ñáJ"ª^^^HOO‡R©DóæÍѧO~‡mÿ‰ñišçŸ¾Úm”Dõ‰‰7Q#‹‰'"::·nÝÂ×_˜˜v =ô6oÞŒ¶mÛâæÍ›øøãÙ!ÄÄ›ˆêב#GpäÈvÄ#Š÷«Rc&÷L‰êš»€ˆˆˆˆˆ‰7o"""""bâMDDDDÄÄ».h4xxxT{͘õrÛjšê²Ï?ÿ¼vÞÓÓÓäí7ä>7¥ý•¨¦¡ô…©1cgg‡I“&!%%HNNFÿþýkU–¡þñõõEZZ4 6oÞüÈŒO¦ö_C:Vjßæˆß‡yü "&Þ¤G²]¾¾¾ÚIß|]ñññÑþ¿gÏžî’ÛþiÓ¦5ت­¿x7mÚ4 <kÖ¬©u êŸ,]º¾¾¾ù¦‚úJÖÌÙuà> ñMDÔ=ò_'Ø´iStëÖ §NâÞ¶€Ë—/㥗^•+WPVVÆö7"­ZµÂ‚ ´ó'NœÀ‰'̾œbÁ‚:ïŸ3gŽðõõÕY?44T¨Õjáàà –,Y¢-€xûí·Å!C´ó#GŽÁÁÁÚy???+œE‹-Dtt´ðóó³X;«N†ê§ÑhÄØ±c…‡‡‡Îÿ—/_nôv-Z$öìÙ#¬­­uêòþûï‹Aƒ‰æÍ›‹fÍš‰‘˜˜¨]>nÜ8±jÕ*áää$ìííŤI“tÖߺu«6l˜P«ÕB¡PTÛ¾Tÿj4-ÜÝÝ…­­­6l˜Ø¾}»Ùû½¦öKí#???±yófÑ¥K¡T*õ®c¨þRý+7þjª³Ôäää$–-[&’’’İaÃD“&MŒÚ?rëPÓ29åk4)ºté¢7†Li¿©Ç·©ý'5>IŇÔñeLÿè{ÔöM=>5ÞIÎö¥Æ?9㣹â'N gºxáí5_›Ë6~ò± òó¯kÿÿ ¿þì»ßEàò Ñ(oOOO±~ýz× …HNN...€hÑ¢…øôÓOu ª'7771þ|í|BB‚Îr…B¡óZrr²hÕª•v^­V‹¤¤¤:K¼ ÕïÁ:VVV:ÿÏÊÊ2i»†NÒ666:姦¦Š'žx¢ÆõSSSE@@€puuÕ{Ò’êߪu©º}Kô»1‰wrr²xæ™gd—/UÿªËåÆ_mÏS»víĬY³DJJŠxúé§kÿµI¼å”¯Ñh„——W­Ž©É\ÇwmûOj|’sü:¾LM¼¥¶oêñiÊø#5þÉÍœ8qj\‰w£øÉø“'O¢¸¸½zõÒ¾&„ÀîÝ»1zôh¬[·þþþ8pà€Áûtÿøã888hçKJJt– !PZZªwuuEjjªÎ{ÊËËë¬ÝRõ€ŠŠ ÿ+ ³mßÑÑèÚµ+œaoo¯S~Ë–-qùòå׈ˆÀ¸qã0räH8::";;‰‰‰ÚzíßÒÒR³¶ÏT­[·Æùóçe¿¿jý¥ú·®âïÒ¥KX¹r%ÜÝÝ1}útí­Z–Þ¾Üò?n‘ýg®ö™«ÿªŽORñ!u|Yúø·ôñ)gûR㟡åõDôpR6–†&&&âÝwßÕymÿþýHJJ–-[àççWmyUíڵÕ+W´ó¶¶¶P(Úû3 lmmµËóóó1uêTäçç×K›¥êgi+V¬ÀÖ­[qøðaܸqEEE8xð vM9A– IDATùµk×àææ†¼¼<½ëŸ?‹/¨T*ôë×K—.EPPPƒè_S]½z:u™3g,Ò¿uÝ?çÎÓI<,½}s–_ù8©í›£ÿªŽORñ!u|™Ú?RÛ¯ïñ§!Å5æt²³³« þù'²²²°`ÁäääàÖ­[ÕÖ›t¤P( R© R©P\\ltÿJ±TÿKÙ¾};"##ѽ{w(•J³÷¯¹ú§&111èÑ£lmmñØcaüøñ:Ÿ`Xzûæ*ÿÚµkðôô¬ó훣ÿ ORñ!u|™Ú?r·__ãOC‰¿„„f"Dˆ²15611ÞÞÞ:¯íÞ½)))˜üðC³ïŸš˜«ü `Ö¬YèØ±# 1zôè:Ù¾9úÏÐø$RÇ—©ý#µýúJüÕåí‡DTÿË3ÄŸçÐÅþ&àéNÏâÒÅ hÿäS¢Úµk‡3fÔÛ@ÄÆÆbË–-µ¾Ý€ØÿDDDdº‹~Ñþó¦X¸h1.]¼ {}MV&‚'LD~þuìý|7‚'LÄO9g?©‘z(»q]ñ®ÊÞÞÓ§OǶmÛê­uýñ+±ÿ‰ˆˆ¨~4ÚÄ{æÌ™pvvÆÁƒñÝwß1ˆˆˆˆˆ‰·%¬ZµŠ{ŸˆˆˆˆêŒ»€ˆˆˆˆˆ‰7o"""""bâMDDDDÄÄ›ˆˆˆˆˆ‰71ñ&""""bâMDDDDDL¼‰ˆˆˆˆ˜x1ñ&"""""&ÞDDDDDL¼‰ˆˆˆˆ˜xo"""""&ÞDDDDDÄÄ›ˆˆˆˆˆ‰7o"""""bâMDDDDÄÄ›ˆˆˆˆˆ˜x=\‰·B¡h4y¹4 4 öìÙƒùóçÃÙÙ¹Æ÷®Y³Æ¤†šº>Éß§DBÌj4xxx|¯——bbb///íëŸ~ú)Ú´i£óÞ6mÚ`Ë–-²Öç1Åñ,ËÔü…¨^﨨(°páB£ËðõõÅo¼3gÎ`ÕªUhÑ¢…Þ÷M›6ͤ†ZŸ'6"Ò'$$¤ÆeÏ=÷&Mš„µk×"!!&LÐ&êÇŽ«–H{{{ãøñã²Ö'óïD–Ê_ˆê<ñŽÇðáÃÆ C|||­Ê)**Â矎íÛ·ãµ×^ã^!¢:óÛo¿Õ¸¬iÓ¦èÖ­›Þeزe ®^½Šk×®áÓO?EPP6ñööö®–x÷Ýw²Ö—[?"ªßü…ÈXJSVž;w.>ýôSÌ;)))˜7ofÍšUëò>þþþèСfΜ‰sçΙ¥} …#FŒ@=P\\Œ¬¬,³¶ßÍÍ ÁÁÁèÖ­ P(ð믿büøñ²ê¯ÑhªíO}¯êÿE‹ÁÇÇ*• éééÕúGªÿ4 ‚‚‚°hÑ"xxx ''aaa²Ú'ÕRñáéé‰Q£F¡k×®°³³Cnn.V¯^ŸþYöñSSû䯗Iƒ“Œö›²8{ölË’’’ŒðððjËž{î9$$$è”ó`ßžúHö{ׯ_/^yå¡R©Ä¨Q£Ä–-[ŒÚ–Ô2???+œE‹-Dtt´ðóó“ݾ·ß~[ 2D;?räHlTÿDGG wwwakk+† &¶oß.«|F#ÆŽ+<<~ µON|™:Éi¿)ûWîø/¼½½«•Ÿžž.¬­­µóÖÖÖ"==];¿råJm¼¼ð båÊ•:åK­oŽúŠ_©øŠ_9ëšüüüÄæÍ›E—.]„R©¬± 5m_j¿›Ú¾Úœ¿¼fŽãƒãeÇSóNætñÂ/Ú):j¾6'–;müäc@äç_×þÿA~ýÙw¿‹Àå¤ÄÛ\'¶Ú&ÞéééB¥R B¥R9ñeêdlû-•x{zzŠõë×x‰)S¦"44TÖyâm(~¥âC*~å¬ohJNNÏ<óŒdäl_Î~7µ}Æ&Þ¦êwüáÄÄÛR‰·I·š˜›µµ5llld¿ÿâÅ‹>|8öìÙƒ!C†àôéÓf­««+RSSu^+//—½~II‰Î¼¥¥¥µ®Oii©Î“×rʯ¨¨ÐùåõMm_Ë–-qùòe‹µ?""ãÆÃÈ‘#áèèˆììl$&&j?J4µþÆúã? V«î¿ÊÔÓ>cû¯j|8::"00]»v…³³3ìííu–K?rÚg(¾Leîã§¶Nž<‰ââbôêÕKçõ›7oB­V£   V«QXX¨]~ìØ1í­%^^^ˆŠŠ2j}KǯT|HůÜõkÒºukœ?^ò}5m_Š©í3sêvü!²”•x0ÙÙٲߟ””„%K–`„ øþûï±|ùòZo[¡P@¡óZ~~>¦NŠüüüZ•ikk«S®B¡€­­­ÙúËÔòMmßµk×àææ†¼¼<‹ÔïüùóX¼x1@¥R¡_¿~Xºt©ö49õp­9´mÛ×®]3[ÿIµÏÔþ[±b¶n݊ÇãÆ(**ÂÁƒe?¦¶¯.âÛœû×ÄÄD¼ûî»:¯={Ï=÷þùÏ<<}úõ²DY]?sæÌ±Ø=¼DÄñ‡èaóP'Þ±±±˜8q"¾úê+lذÎÎΈ‰‰á^%âñCDˆåÃ\ù#GŽàÈ‘#Ü‹dæ¼”Ç1~‰ûã&""""bâMDDDDÄÄ›ˆˆˆˆˆ˜x1ñ&""""bâMDDDDDL¼‰ˆˆˆˆ˜xo"""""&ÞDDDDDL¼‰ˆˆˆˆˆ‰7o"""""&ÞDDDDDÄÄ›ˆˆˆˆˆ‰71ñ&""""bâMDDDDÄÄ›ˆˆˆˆˆ˜x1ñ&"""""&ÞDDDDDuOih¡F£Ñþ¿¨¨ÇÇßÿþw°çˆˆˆˆˆŒ yÅÛ××/¿ü2^{í5üòË/X¸p!{ˆˆˆˆÈ܉7!p÷î]ìÚµ :ub¯I)÷jµ8}ú´Îë={öÄ€`ccƒÌÌL:tHg¹F£APP-Zäää ,, àææ†àà`tëÖ P(øõ×_1~üøÿTN©Dhh(žzê)( äææbݺu(++Ó–…±cÇÂÝÝ………ˆÇ7ß|ðôôĨQ£ÐµkWØÙÙ!77«W¯ÆÏ?ÿ¬ÝþìٳѩS'äåå¡  ;vÄèÑ£%Û§Ñh°cÇ <ñññð÷÷G‡0sæLœ;wN§âââÎh#"""bâ]3F!nݺ…£GbñâÅÚe~~~ðññÁ|€ââbÌœ9Mš4Átʘ4i6lØ€üBíë±±±Ø¾};âââpëÖ-eð·¿ý ¹¹¹X³f `äÈ‘xóÍ7±qãFí{ú÷ïÕ«WãÒ¥K4h´‰÷èÑ£qäȬX±BŒ;sæÌAHH 22‡ÂìÙ³áï¤[ª}7oÞÄܹs‘€?þŸ|ò BBB0wî\v( FQ#'û|ðÁ¸}û¶vÙ¸qã°jÕ*\»v ·o߯G}„1cÆT+#==?üðCµÄZ©TÂÆÆvvvz·ÝµkWìÛ·O;¿gÏüå/ÑyOTTÎ;‡’’8p­ZµÒ.›?><ˆ;wîàîÝ»HNNFûöíµË;t耽{÷âÏ?ÿÄþýûáââ¢S¶Tû¶oߎÿûß:ÿ÷òòªÖŽ©S§2Òˆˆˆˆ9¥)+»ºº"55Uçµòòòjï;~ü¸Þõ#""0nÜ8Œ9ŽŽŽÈÎÎFbb¢öV’’÷ !PZZZc}JKKu®.;::"00]»v…³³3ìííu–_¼xÇÇž={0dÈj·ÑÈi_EE…Îÿyu›ˆˆˆˆÌžxçççcêÔ©ÈÏϯÕúçÏŸ×Þº¢R©Ð¯_?,]ºAAA[[[( í•r…B[[[Ùå¯X±[·nÅáÇqãÆ áàÁƒÚåIIIX²d &L˜€ï¿ÿË—/7kûˆˆˆˆˆ0étÒÒÒwwwXYÕ¾(…B•J•J…ââbíë§Nˆ#´ó8qâ„ìr]\\pãÆ \¸p˜3gŽÎò &`Ú´i8p æÎ[íûÉÍÕ¾¸¸8FQ#gÒï;w¢¤¤‘‘‘hÓ¦ ¬­­QPP ½b-%%%...BàöíÛ8yò$"""´Ë7mÚ„°°0ÄÅÅi¿ÕdíÚµ²ë‹yóæÁÉÉ yyyHMM…¯¯¯vù™3g´nÿ¹µeõêÕÚ‡'Mm_å?,ˆˆˆˆ¨qS.Ïc|žCû›€§;=‹K/ ý“O=òŠŠÂáÇñõ×_Z·nuëÖ! €‘ADDDÔˆ\¼ð‹öÿ›7mÄÂE‹qéâÙëk²2:¹öÂ+/¾fMÙÃDDDDD0ÓïÇ"qóþY¼Ú'¯÷žˆŠŠëØzt{—ˆˆˆˆÈœ‰÷©‹ðr·!Øÿ}vüßF<×¶;Î]9†²Šö0‘¹o++k!Pt÷&Šï߃(¥°Vð‡1‰ˆˆˆˆ3Ýã­nÚ Å÷ÿÄ«}'àî"”•+Ь‰ ŸÝ$""""2[âý¤³7òò/ ­“ ¬¬*Ppó\íÝÙ»DDDDT'â°iÓ¦—¿õÖ[˜öp&Þ®ŸÄ†Cp¯¤Ðʾ=ï1¥åwqýö5œ»v Ó?u‡µ• †u›‰~ÁŒ""""²ˆ°ÐP\½zû÷ﯶÌßßa¡¡õ^ÇZ'ÞiÿZ€YAëáêøŒöµ²²û(-»ïN¶x½¼ åå8ýÓ>ìü×jxw¦¶Œ """"2;…B¨… ‘ŸÇÿKûº—× ˆZ¸ …âáM¼Ëo¶DÆ×àØâÊ+Êå(¯¨€¨¨@yy***p·¸Nxù…—ñ„ o""""² ¬Z¹ ¡aa8sæ :wîŒU+WÁÆÆ¦AÔ¯Ö‰w{ÛAp¬hE‘¢Z!Büyÿ>JJJa[R‚Öâi”Þ½Ãh """"‹jÞ¼9Ö¬þ FaqL4š7oÞ`êVëÄÛºü:Dy3”WÜDÅ_ýß%|`Ó°nf;·Š`§´c$‘ũՎˆ‹kpõªuâ­¸¾AoíAÁåDTT܃Baõ߯TüwZµ›/>}M›õeQ£Uû¯TJ›æhÒ´¢  (­Šÿ{㺠@”ãÞ|(mTìi""""jÔjý 7vMPògþ,}vÍÝpï®M[tÀ½{Žhnß÷î5C³OáöÍËprE—ÙÛDDDDÄÄÛXí=FãÛŒ5(»_†+W[B©zy—¬l;áüù?qófä]ª@[gˆŠ üüýö65Zµ¾Õ¤ãóãq$e<ΙQQÿÜ^RQãûËš œ?³:e¯o¹líÔx9x{ˆˆˆˆH+vo"""""&ÞDDDDDÄÄ›ˆˆˆˆˆ‰7Qc¢déŠOHÀ¦M›j\þÖ[oajX˜QeòŠ7Qa¡¡ð÷÷×»Ìßßa¡¡F—ÉÄ›ˆˆˆˆ¨ …B¨… áåõ‚Îë^^/ jáB( &ÞDDDDDæ`ccƒU+W¡sç΀Î;cÕÊU°±±©UyL¼‰ˆˆˆˆjмys¬Yýþú׿bÍêмyóZ—Ň+‰ˆˆˆˆ P«gr9²oMVf½5ôÒÅ ÜÛDDDDTïy©ÅïÚÜ8n.BFÕ{^Z'‰÷Å ¿ÔKÅ|_îÏ«ÝDDDDTïy©¹ðáJ""""¢:À‡+‰ˆˆ1ó=°5ñ}¹ÿ#ßFbâMDDD¡à ™¶!ôÞ~ú(µ‘ðHÅkRâ&ÞDDDÉÃ~?,ÛHÞãMDDDDÄÄ›ˆˆˆˆˆ‰÷Cá§ŸþýP—ÿ¨Öˆx¬1ñ®¢ðæM,ÅÀAƒðbxeÌ+Ø¿ÿCÓÀño›\F÷^°Xù†Ênmoˆm«\®%û¯!1W;=Š©ááÚùŠŠ ¬Yß—_FïÞ½1wî\h—_¿~3Þ{½z÷FïÞ½1gÎÖXþ½{÷°`ÁBôêÝýû÷DzåËQTT${yMŠ‹‹1dèÐj¯aÚôéèÕ»7úöëgrýMÝ^ØÔ©8zôhƒçöïß_-ž¤Úeêrª_ÅÅňYƒ¾ýú¡×óÊÇ]÷^¨6y¿øâC7?LùJMcŒ9˺~ýºÞ}[ç$KÇÈÃÜïÛ·oãw&âé§ÝñÙŽ8úÍ7˜;gÖ®[‡/¾øâ¡pJKKêòÕº™Ë‰ý‹gU#$¬]‡ð©aÚùÍ›“áää„ý_}…ýû÷£ím1Á|íòÈùóÑ·O_h²²••…{¼ˆùóç×X~ìŠxòÉ'‘žžŽ}ûöÁµukDÇÄÈ^^SÏ›+W®T[¶mÛ6´oß™8xàºwïŽÔ©µ®¿©Û›> k×5Øcý÷ßGZÚ.£Ûeêrª_kââÐᩎ8xàÒÓÓáÒÚK–,ÑG+O±±±xõÕWª1øaÊW 1æ,+çß9ðõõ©¶v{ÿL¼7mÞŒAý0*P*•øË_ºcqL´Î úઙ¯/þÚ³'&Mž„?þøCç¯]»waØðáðòöÆ‹=zàСC²—ÀÇŒþýû£o¿~X¹r%ÊÊËu:náÂ…èÙ«F ûìY¿²ªþ•b¨¬²²2,~1^îß~þþÿZÖW¾T_è³uë6 2/xyUk»Ty‡‹=zàÅ_ÄØWÇáä©“Û^µþii;Ñ¿¼ÜÒÓbÓæMðñõÕ» ýE+·ßnݺ?Ü»wO÷Jiq1‚^yeååÈûõWLŸþ.úöë‡{ô@`PPµx¨é¯jCq$'NOŸþ/÷ïño½UãAª/Öä–/·¿õ¹|ù2æED¢Oß¾ ÅÙœ£êþý÷'`oßîîOk_KÛ•†!C£I“&hÞ¼9&„LÀéÓ?h—ÿðÃð÷÷ƒ­­-lmm1dðœøþduùoO˜`ô•OSÏå5Ïäh(ùŠœ»ÎòF_IDAT+¢†ÆcφÊúwοáÙÍÓàx]Ûþ®Ì˜¼I*CÿL¼:„þý_®öº§ç_°%y‹ÎÕŽÇ{ û¿ú š¬,ôìÙ k×V)ë0þ¾~=Ž;†åË–aî¼y²—§¥í„“SKìÛ·û¾üÏ=‡í))Úå7&ÁÛÛ‡”)S­ó—xå¿R¤ÊJMÝÖ­]ñå_`SR¶mÛ&ù—~åòåôEUÿ<òOüãÿÀ¿Ž¯Öv©òæÎ›‡åË–áÛo¿Å„ !ˆ^TsÛõ&c'Oa÷îÝxwú4D-ŠÆo—Çþ¯¾Ò» ‘ÛoèÙó¯HÛ•¦óú®´]ðñ饵5æÎ‡^½z"ýàAh²²0Ø0Þ_²TV= Å‘œ}óÅ_àË/¾ÀŠØX½å×krË7¥¿çÌ‹©a¡ÈÌÈÀ€‘–¶Ó¨ºgei0p€îP|ùÅpttäççãã àëë«]Þ¥K8p¥¥%(--EFFžþùëXQQkkkdïÎ;²—ëü·`tìÐAﲋóЦMí|³fÍðóϹµ®¿©Û€þ/¿ŒÌÌ,ÉãeSR8§–ŽXWë8•{¬'&&¢w¯ÞpïØÑèv™ºœê9ñÎÌDS;»ÿ%×eehÑ¢…Þ÷îÙ³}é¯hÞ¼y­¶eʹ¼¦ó™¼í6Œ|EÎQCcŒ±ç Ce=›ƒÃ_¾ýú¡Ÿ>Z½Z'É5¥¿ksþ—¡ÿ &Þ¿ýöüq½Ë …öÿ{¿Ø‹¡CÿwµcèÐaøþ{Ý+>³gÏÖÌ>>>(++“½„Q#Gê]¶3m†Vë²M9—›r>k(ùІÆcφÊÊùwûFVf&¾úê+8·rÆ'6˜-¨Íù_*CÿL¼mmld’—wYç¯gû-p£Êƒ5mj8 ä,¿páôí×Oçæößÿ]»üòåËhÚ´©¬ºJ•õË… pppÐÎ?Û©“Q!§/Œi»TyQ‹¢µhÆŽ‹üã’ILUNÜ66¶€–-[ÖêÀ3¦ßÜÝŸ†[7|ñå—ÿ=h C‡hݺµN¢ð÷¿ÿó""ôŠìz˜Ò—àêêj°|C±&§|SúÛÃã}ªR©pñâE#ëþÚ´qÓ»lÕÊ•Ðdea䈑:Ÿ.¬Y³!!ÁøöèQ9ro¾ù&Ö¯__ã6æÍ›‡3gÎÀÇ×o¾ù&^êÑÖÖJÙË&¬¬t‡±ÊóÆÖßÔ퀛›~ûíwƒÅTþÈÑÑ×®]5kœVv÷î]Ä®X… ê$ FµËÔåÔ`àÈ? $$¤Ú²s¹ÿù”¢}ûöµ.ß”s¹)糆’¯˜ƒ¹ÎËÀÈ‘# T*ÑÔÎÇÃç{ö˜-¨Íù_*Cÿ<ã¹µ}ׯ_¯öWäýû÷ñõׇ1pà ×-¯¨0j6´\ÿ÷ÿ›¬Š*Û2|Þ4\VÕ¿Ž+,^[åõ3v•ËëÝ«7¶oߎkW¯bcÒFܹ{ï͘!»¬ÚžËô˜1ý6fì$$$`ÄðHÞ’Œ©S§j—íþ|7¶lùo¼ñ:zôx ­Z9aøˆ‘iOÕ}£”¨·1±V›ãÀ0…N¨ºß½{v•>nÖ×w'¾í•®â;~ï¿ÿ>š4i÷ê«ð<¸Æ2ìíí±"v…vþüù_àäÔRörc5oaÒÒí[VVªó¹±õ7u{`gg‡»wïÊŽS@HÄ•±qZÙÒeË0þÍ7 ^—j—©Ë©a())ÁÊ•+¡÷øí·GÑÃÀ·™˜:KM9Ÿ5”|Å,U~Ó¦Mu¾ÕÉÔü¡6ç99Ø£Þk×»wO|wì»j¯gdfꜜÛ=Ñ·oßÖÎݾ ¥Ò|¿Fß¶m[Ü0ð`®­[ãÏ?ÿ4KY:tÀ­J_³”›{Þ¨ºš»/ä”çÞ±#zöì‰Y3g¼·Êœ~ÿí7“úÍÇÇ%%%غíÿ·w·1M]aÀÿ¥uƒ~X¢š¸l™BuN#“9-UªPuK”ù‚¸éŒšø2Í0º!›Î—Ìg&è`F1NT–-°,!;uà–©‚(åÞ¶h÷…¡/´Õ ÿßRN{ï9OϽçÉí=ç†^ß‚wÂ:~îÉÈø ße€z¶ry(DÑ=«³¸ã»±Õ×<}\·x,rSSìÔç}}}­&ñ@„R‰[õõƒ”ÑÿŽO&³ºÂïãããÔIíÚµ«5rdËíŒÆÆ»í¯››õæ¶ú;»?EÑê¶‹®<¾² wî`@À@õ£Ó§OcÃÆO,‡e9‰É^»\-§g¯±±iÛÓ°lÙ2uùMyäòPÕÁÞøëÊxæ-ùŠ7QD(ÑÐÐÐþúþý{:t¨ÛógÆGú@oŸÍhÞ¼Dää‘Ü\444À`0 èìYddd yyrûûT*Nž,„(ŠE…'Ov{¯UOÌš9§ O¡E üË“—['%¥¥hmmÅùóň‰µºúTSSÓ¾f©½mÅÇÇãøñŸ!Š"t:ÒÓÓmÖ­óöÝ {Û›3w.ΡõÁÔÕÕY@:×Í2™ ÅÅÅ0›Í¨©©AZZšU¹³q“I¥ˆ‹CVfÔjµU2€’Ò?`4QYY‰v–sW,;»ïkž>v|‘ŽÛ·oCä`̘1N}~È¡¨­­µú_TÔ =š£ÑˆAÀáÃ?`ö¬Y‰¹BüüŸÐÔÔƒÁ€¼¼<(#"ºÝ‡Z­Æ‰'`2Q]]ü‚|Ä'$8\î¬qãÇ¡°ð ŒF#ÎaÜÛc{\W÷µµµOœœ;KOÿ:-‚€¼£y åR?²u¬w^ Ër2¦£írµœž-MEÖ®]‡¥K–Ú¼¤úz5†Û˜´æé±ÜÖxf·ä+Þ$rú4;v F£‚   à8âçÎuK¼{:þÛë}!~6ïAؽkÊÊÊ Ž‰Á»“&áPN¶¥¦b¬ÅÕ’ÄÄDèt:LŒD䌸tù22vît[ãѬo†J¥Â…åšr¤~–Ú^þaRΜùÃñÿÛ}HMí([¸p!æÏŸé‘‘m+êÑÏÐQÑÑH˜7Ê©J›uëjû½ímÞ´ ™™™˜0aBû ÛîêæŠÇ³ÇW­B¼ÅÍ`xÐâ¤ÅX½j5Fvs Í[cÇòÁOäqçÏÅ¢¤%¸aq‹ÚóìÕàaOä&½­ÞfûŽíX¿n=ÑÃþz0; ‹’– êï¶ç}hï"·ø8휨ËC¡× ¨ªªd0<¤ªª¢hè6é&"z^ôïïÏ xo¢>䣕)سwá!{öîCÊŠ =÷V¦¤0 cˆúް°0„……1²ëë¯í¾‡·™õ]¼âMDDDDôðŠ7Q/Ôö -¶‘ÈëïóçÎ22DDDϱƒÙYl#‘·'Þ–ý$""""¢žk{jt`׉÷ãõ‰ˆˆˆˆÈµ¤[«ÕB:|€G“+>d`ˆˆˆˆˆÜÉÏÏ!¡¡õ{±-ñ~y€ Rc#CDDDDäF‚ ÀÏ×>†& Áç•’²«:p^0‘ëÉöã¿Z­‚ àÏ+:ì¿rUâ#•JÐO&AqÕ=&ßDDDDD.$ÝZ­¢(¶Ýf‚ß®›à'H>ÿõ|$f´Üh6 ­6ÜC_@€¯”Ñ#""""r&ùE´¢þm4á÷k÷1ÐWŠ-e•‰DY?™¤0ÃwÄK‰ÄŒ¢rùÖ}£FDDDDÔCAdØÿOõ£uº%0›ÿî¿ð “e×IEND®B`‚kildclient-2.11.1/doc/C/images/pref_appearance.png0000644000175000017500000010413711405233117016657 00000000000000‰PNG  IHDRNÀT çÀsRGB®ÎébKGDÿÿÿ ½§“ pHYsÚk¥óÎtIMEØ  ®c·-tEXtCommentCreated with GIMPW IDATxÚìwXÇÇ¿{Uš`o`D,Ø»Ø{ïÆŽiv£Æ‰Ý¨ÑX¢FQ4 ¶{Œ5{o1‰”ÎÝþþànÙÝ›-¨QßÏóðpw;;;3;;óÎû¾ó.:v5Ä|Û¯o2™@Añ6ã`0ÀÅÅ™ÿf´~XV“wusCÁ‚áàà@­EAÄ[)=ÿ󟜜 'G#'N+Âjò¾¾¾ÈíヤÄD¤¥¥Ál6C¢yâ2.Nã"<σã8íÿ8Žô¦·#?hý×ÇiU”™Îú—}‡ìwXË+>GV6ëqXê)Nk=&?G¸OÖ¶aVMt®¨ü\vÛDíTùqŒ¾Ñ}·='nƒ!ó³¨îòvâ iÞÖüXŸêÁÛSW­¼ê(/Ÿž4½UI'9GG=xÕîykZñ=‘§“ô?F;+õižnÉCž·Òõ­eÙ¹Ï6ýTé3Ïg^KO:i¬cžæø¤³¿jæÅx>$å3›m?p'I§Ø&¢:ªÖqÿøìÌs/K«Ø/YÏ‚FŸæåφÚsÀ˜/”æN©]æ/{ÛD2Îi̽Â3˜s~VòÓuoEõupp€Á`€££#Š)‚˜˜ÄÄÄðNŽFήnnÈíãƒè'Oššš-AG·@¥#?­ÁZÞº&Íû¯ Œ©L:¼lÒâÔŽ³(ù1Ö#¾®|’Ÿ#†T„Eùƒ˜á‰ÓèŒâòX“·†ð¤(€È'Ë€,¿&'¼ÍfæàªvMùà…¶VÊS<É1'vñd¨ô ˆ„`^6ÙØ´‹øyc\Wþ¼r"á\- ˆs8ŽƒÙl–üWz†ÅÏ9˜E“‰’ #Æl¹·LáHÜ.:ɢÍa>×*t¶µQ*Œ’ &š”Ò(Ö;§5M ý*«B“XÐÖ£=ÒcMàåÇ}Qq<’µWbBüý7=z„øøx899!ðóóƒ{®\úæ/Þš÷ãGÿìœEyç’åÚ¡œÒ6IÊþø1âããáììŒüùó eçuö/oo8;;ãÏ?ÿ„1..HOOϾ d‡jL¿ö”×ÿ_Ö öÊ6u¯î5VÅ’ÉW¦u’wR¥U¶dåÌX¥Xë§fšÚ’L®Ú•­,y¹¦H¯êÞÎt̼5ÒÉ– e3P«hZÓ(djæ/NfT\y‹\Æý—«êµ(¡}dy2'^k}­ZkS4«^f;ËVúb-kÅÏê«òrðÚQV:ÍÒÖfQ9íë¾).ª¦<™ð(Ñ.i˜Ú ÓÊÛVøl)³’YŽ©Rêïr3™S Í¢M6®sò{+Óø²Ò¨ MjZùœš²cž“ Mc<æUޱžža¾¶WÈJKOÇÛ·ñäÉx{{£téÒÈå¤$üóà¢Nœ@¾|ùXªUõÖ¹Î:>šL&ܾu Ñ11ðööF™²e%yŸ>F£¹ÜÜ$‚€ø||<¼¼¼ì²Ê• ²¹ž««+ñnhÕ²•v>2AGKë´û×_1kö,<|ø<ÏãÂ…‹ªÂ˜¢jSACÄ©¬•„!ÖD"žìY¶Òê“¥yQÒÈ…{„'Õ´9$<)­È "8¹¥²–åÅPx%“ £™ÅZ³ÙV{Ç2ó©h$˜”B?›& 2é€%dX…?…ÉBI«$6Yÿs2? µA˜Wt´JzTòIJ"¼¨LZb3¥ø\³H»c“–¥q°˜ÁFļ–þ!o7¹ ¡%0©šÛDãxìãEB­YÁ?‡™DÅ;§”N#«#¯Ó•àE M|…&¹—ÕWy¹À¤àk'i[‘PÊ\,3Ltâç<-- wïÞE.w÷ )W.€8pà /^I‰‰¸uë._¾ŒR¥JÁÙÙYñÙÏ}iii¸wÿ>Ü==3&µ¼/]B`©Rpqq±u¡ÍÍ/KÛ”žžŽû÷ïÃÓË AAAÚe ÚE ±Ï·ÑÚPV?­Â‡††¢Aƒ˜÷ÕW6Ç£££1bÄÜ»` UZX…“É„«W¯â³I“0vÌ$$$ k—®9cÒ³üŸ6}žNT/ɽ³ž'ÏOf>³–Ó,@¬÷–uD}F²ªeܳ¬¿š-“¨drõ#V[Ó‹Uâ>ț͙í*š”þÄe`îD²¤aý)¥WÊ›ÕNâ²ZË/äíÄj›¶“·“ìØôkVùDýGÞ¿yQû›Yi­è>˜-› Ä‚;€øY•B_ s¢úr²2˜eBÆNQÑs©ôÜòY ÔÆ°Æ/F~jé9•ùÉÞü%x1$ëÛ,Gpù½³ö™„„¸çÊŸÜ>HINFjj ÓÄž’œŒ¤¤DäÉ›¾¾>xúô)»"AöyBÜÝÝíÊ;·OnÄ<}*{e‹+½.?6㬌j‹«çÏŸÃÃÃ>¹}pýÚ5Lù|2îܹ+I{ûömLžü®]»’Ñ.y|«*‰1êõg€¤¤$€ Eˆ‹ÇôéÓ±fÍxxx`ÅŠhÖ´)SãõxÔË~/þÎ;€ÿýÇÆ¬u óæÏÃ/;A\\,ÎûðÇ™3X²d1þ<©©i(Y2 DÓf̈́ˈMƒÖÏ/^®qúôéŒ<þüSšGóæÂ +(¨,àôé3øê«¹Øi)ÇùógNŸÆbQ%1pÀ@4kÞ\¸¶5ó`ÕêU¸téP¥JL˜8 þ~~BÚëׯcéÒ%ˆŠŠB\\üüüð¿÷ßG«V­…‡ëôéÓøæ›E8wîœpÍ÷Þ„æÍ› ÷ìï0{ÎlœÏ¬ 冬ܒ~À1úxQ½”êž©E38IÝÁ3ÊÂÙj—Å¿ñÈÔ–Š —’rƒ8ƒb¹!.7£=å}ÅÚ ~nDyóBžžÖúfjKD¦nÂ=æ!Òrg]“‰ú/éœHð±.t­ã¶Axø¬í&”Ûr\îænÓÞ²²râçâ{Á³û/£oÂR/Åþ+ ,mi­—;p¼Ù"ò¢þ‹Œ>ÁAÒÞ‚VÝÒÒeka,}PÖçµ4d rårGzz𦉛7›‘š’OOÄDÇ ===C»ÂÈßd2çÍpgä}âÄ ,X0ÆGµj’¼===ó$i–¼•L•/Ò½{!OÞ¼XøõB” ½û÷±lÉ´jÕZ(÷€þa¨\¹ ¶mÛOOO̘1Æ Åô3Ѿ];€ç1lØPœ? }ƒzõB‡'ŽcÞWóðãºuàyÎF.ŽFør\F,Žã`}æ¸ ›±uR>+8g×·Å^^T¾zýN´VXJN£ÿÔÅíÞ*&ì—Y7›ëÛóGq×ÉÏb?á_@_f…M* c–9L¾CNÉ=@ÍDZ´H¬Í2 —>LòvÖaÆã´LË,³¦MzƒB¸yzÖ³ÁËÄq¶¿¦Éd‚Áà£Ñ<ÏãÁƒ¿±íÚu@‘"……tݿȭ‘èС * G£ŽNŽHMM…ƒÅ™[^~“ÉQÞVîÝ»‹©ŸOFrr ¦NžŒ%K—¡ˆe¾çy>#og'¤¦¦ÂÈ¢ý¢„&ñ=2™L0ŠÊÞ­û»8qâ8¢££1ú“Q9jfÏšsz:J”@·îÝ„²;99"%99c§Æ7nÿþý|ƒ ðäñã œJeÏœ9ƒ6mÛ",, ‡Æõëב?_>Œ?;w¤k½·ø… åçÏ_Ì×,>N—¯\Æ„‰Ñ­k7‰Æióæ- ”ÜÜ~ýúáôéSØüóf–*žç:µkÁßßÛ·ï®)×4YéÛ·/NŸ>…-›· d` ..µkׂ¿Ÿ¶ïØ pÊY´E‘(Y²¤¤±ûöéƒS¢<8ŽC\\jÕª ìØ±S¢qúùçŸQ¦LYð<äädWƒƒþ´h¯ôÃñãDZbù Ô®S‡©ÞíÝ»7NŠBdäV–*@ll,jÔ¨üòË.¡ýÒÓÓñãëP%8˜9¹(Úåí [Ø÷I-,Í.1¡)†€ÎŠQ"ßVÏ gÀÚÄ©ø‘±Âe(mÓ‡ÚÖcµÅˆÜQZaÄ<_iâÕ#4ØqœË¢Ï’½çØ+ éŒXB”Æ‚j“±^™ÑÔÂ.(ÅÝQìw,ÿ"†°¤´EÞ×x†? V›)ÆxÊI³yå÷Lg¼%¹óY–¹\(¶TŠÑ¤?0%%iéipsuÍpeùn%¶o߆ܹ}0eêT*Tþú ŸMš€ØØX´iÛ}û…ã8<{öà8¸»»3Û)55é¦t!o’¼ œfÞ,¹–µÌÏž=ÀÃÝ]s˜Óa¬e7™M’²ÿý÷|6q"ž>ÁÀÁlæáëãƒÉŸ‰‚… JËÎópm|ãèèˆ6¡X;©de׊,bÔâÉwÙH­åƒ²Á º_m fîÒb™Êåe„ÔÉÚ¦ÿ)…6P ª?ÆÁZÍ_SˆL®TNIÄpÖ†‚pÄx-ÁJ*@’FA —LôŒ"¼šp&jäþv²E‰Ø×O²Hµ‰MùDX”bTI„H7©ØãðS«íy…‹â±…gh7y‘Ϙ u]C¬‰çååE&e^ew'«µlÕΟCll,¾š=}ûÀª•+ÞŒâ~~hѲ¥ÈУbZyßyøï?˜;g¦W¿þ±ê»åµ>3ù äò6tiÙ_DdpV} *Œ!ÆâëùóÀ›Í0p 6\šÄí’a²Õ^°j NâÂܸ~ÎÎÎ4hüýü0rÔ(¬Y³£GFRJ2.?¸¤”T¼“¿ò{çÆ“ø8ä÷έ½bñçŸçÙ+Fç1 Šù=z ¶®eG–VÀ<8v츇ÚÊÔ "?~"C²‡ívy³,¼;+oÉàÅÄu?y2 !G|Ýó`þ‚8vì(ž¼ìž‰-jœô²>W¢1*c•Û`yê¹LáTð§'ŒE.³\§ZÚD$Ì R/¯WN<öçËŸc>€%‹ >>k¾[ xø+Š÷?†¼yóŠü£x Š ?ƒ!³<pì蛼Ä×:yüڴ·Ñ +ž#KX2ËpW½xxôð_lß/÷ŒgÐÌcSøz|/?òæË'iGG]"‘>ÁÉZ ‹/¢víÚøtìXÀŽ;±xÉ.W‡îÝÄà–íP¾¤?Ž\¹„Ï7¬EçZu‘ß;w–¶ê‘XÙ«òˆŠŠÂ™3§Q¯^}]ê=ùj])5³/ÛåfÍãôéS¨_¿Ó÷‚“‡i‚â8TªXÇOœ@ÔÉ“¨S§Žd5k"*T¨€“'O"êT6hÈܾŽCÁÂ…1kÖ,@bb"~;x#FŽÀÕ«W…º:;ppÉ•±eÕ`pDŽåód0”á¿àã¤ç•/ÀŸé¥øð(Ä€R}ý‡’¿‰Ns^¶ÛFOòu­äcÅ4Çé<‡u?Xf6ÍhìJ!  é7£æsÅÚz•X^ ­‚’vå¥ù Û¡U’×O(7ã9Q )À)¬e…Oá3VÒ{n°1ÇeH“Ï‹Þó§ä iN€É”±ãÔª@È›/>:Ë—.BZj*œœœ1ðýáãë+\1==&³YV©$x˜Ì¼w½ú àîæ†àjÕ‘ÛÇWt­8uU«×æíè¨8×fç*Já}äiÄíý?þð @±"EЦCgDnÙ„çÏâñãß¡OØ{ðñõÊîjÌaÁ Ξ;‡ž=zœ=kÚõìð?N¢síP”+æ¨T!£ñeKÏ ¤ê@®òp[Ó <ýôÇìY³P°`A¼óN <~üQQQظi#Ö®YË|ÈĦ‘!C†¢ÿ0Ìš5  @‰xüø1Nž<‰M›6bíÚÕÃ+’< ,(äqšǚµÌ¸>f°ƒŸ >}úôÆÔ©S1cÆ ”+W<À·ß.×Ӧƒçy : aaý0kæL’]sãÆpü¸öGp‡ýÃУg/T©Rîp·hÕ‚Ê•“ú:XL…f†©B5¹’¯M|¢ôœÇ3ƒÒë4 ìQÉ߇W骂¹FiµA„ÓzwœÊ«Mä¾`J²™f-——Ú4ÌâëR²*8g÷|Eÿ)¹ÉIiáÆŒ äÄ2K«HšŽÂ«yxç*ùJ±„ÅxWŒãf´º…è,K¬1ÊÌø®ÓJH£ðc±™•e®SºŽšÿ’<š¾N° 9àã$³rÚlj·ø0I”cqœ²ãã$øJÈL+â˜TIü™lÄq¹ÊøÎKËmñ}àE¾!‚K6}œä¾BJ>N—)›>NV¿0ú'yn-þ1Ö˜@B¾Ž“øÜdøAäÏÄ[|`Dñ’¿NçH£Ü–gÅ öŸ²\Ù sì³–ÉÆOJæ+ă—úÎñÒ˜XâzÉã!ÙúºYÎÅ2’ö5Î&V‘ÔGcúœAä›Yž¡n–zÄm̉â_I}¯$>bÖöÆû̸LÖ8NÎâý%,Ò¤&Vq'Þrß…¢K|žÄï›ä%}Èú›Xk®fªŠ‹ÇãÇP´HUmIJJ nߺ…… Ã×ÇG[IƒÇOëÏ»`!øZÌ^j󯳜ݲÄã¥qññˆŽ~¢»ìù ‚ê«çìÚUgåðáÃÈ›7¯DhWç Sõš5±wsz÷î•ß}O‘SµÍ{äÇ0¨©ì$Ò»aLÀ#Y(ÄɲÅÐ @Ã_‹õ>µÎé¼Nÿuÿ&^Ë|•e÷7ùŽE;„÷œÒæh ÛJ¦T^çýyaþNÚKÖ³˜Õvb½F‡å³$ÖºC§éòW ÉßQ©Õ_Á~Œ._(•ôšÏlí€ãµ®§âÓÇ2ã³^C%·¢ï§®E•?3’66ÈwëîUؾÓM‡Ðd­›——Léé¸té2òøú ÿ¥ÔÔTB`éÒÈ“'pÀ2×ñ<½¼ngÞV¡IYNiÞ“ÏýªÚ&yŸ·lºòöò‚ÉdÂ¥‹—'¯jÙK–*…<O/º'³ÙŒß~û Õ«W·9üNI\¼wÝûöA>7¬[·½zõBø†êÓ½ IDAT ptrŠå&yèy­÷Ôh5®Ü¤¡G8Ò%ø0¶£k Pš“c»«uE¯:±°ÞZ¯a²yg”Â{¶äªdáõ—Ñ¡4YjÎÈ6ÀôÏQü,túI±&K{ÎWy˜9ƒ™ªC£µ4¯Ðïy…p jN”,+V{+ 3‹Æªf¢ÓŠŸdßmÕŸ—R™Të¢ÄS³ eá,´î 4î³^S¯åÒ åö VÖ¬ »vÜWæØªcÃ|Œ¶1 jœ/yÖD¯ERÓÎ묔B‘í,w ×êóâ0$2!0þüpuuÅí[·pñÒ~ðfé&RRRà`0 Dɇ„ÀÝÝ©))̺ðò¾k ‰?~¸º¹á#oƒÁ€€€yçÊ…ÔÔT[s£xÎg˜Õü»77°âŠûŽÙ 3€|yóÂÍÕ·o߯ŋûÀó”½D@ T©ZîîîHIN¶k2Úʃ¶{_|>^žžX±b¾^¿Í4D¿âÊ`5;¹5|=Å´Öc¶–fÞæÑ³ÕDÙ¦ÍT­kç'|þñ*WÆ”Vì<Ÿiv…²°ŠÆÙ—žÏ I„kYÚžµ‰ôÁ2Cœµø<³h7¯øYþÚ¾ŒTîĪôY(¯¦ ¥-šƒ>‡uëkOl®#Ê9ÀÌ›¥¯"'Á"ôE±/”¨Ißó`idØôe©6ÍšoSªÌAÛv`¶y¹4 ½Œ4V›¯áË!¿¦¼aÍ*ƒ’=»/µó’?Ò2ñj/Å™·2w–«·< ÏË°Ëcf÷5Éä˜ÙglÍø™¿ &'q_á¥fD^¡Ø\Wøn¶CPÒ/V1ãbñÒ˜Væ¸Â{xùxæXÖØc¶.ŠxÉs)Iljk0σʘÍKÕ#²çCyÌæ3;}f½dý 55^^^ AÅJ•d\\\àìì ƒÁ€ô´4$%%Júºõ9âxq™2ç žç‘–– //O‡TEÅJ‘”œ"Ë›CZZ’%uåÁK4Kês,¯ÐnbaÊjRVé“â´¼9³ìUƒQ©bE$¥ÈÊÎqHMKERb¢ý‹·L§Gª>NqqqðòòbÛ ÓÒ°óLnþó7 ûæAJJ2BËWÄ;ù ªš=G½lØ=yÉŸå ¥hƒ…VtS¹}ŸSt.TÚÌ<ÆÙLDœÎö³ª€Å·öÊ—crÍmÛÂf2`EÚÖS8Ø¡‘b´xZ%¥>gÏÏöåa«¥RRaëÛ !²µ´&’þÃк¨iœÀCõ<½f>½Z%{'{óÒ*›Rý$¥^¤±’xÚ:Ö»ÉT5LP2ãðŠÚ£œpr2qÛˆ‡ý%ík+nª€xsÂWÒ>‰W÷boY‘´ÆjCÛÒ"aƒ—וµ±Yt—©[1‹vn)~–Ʊ¶i†yW¹l’‚WVÏÛ¬¢)VqLWØZo×BƒWþ™i̶&zÛh¦‚©D:ÉŠ„E“Œ–9II¬ä3U”’{ªeb‘oÍΪ¹M¯É9U±ª;¥T´h¼l…d›VÞžR…‚\3 , ±LéÒçU2yC]kf³ÀË¢ùLU>Ê‚)ÎF#dzXã oæÙ;FÕÂuÈÆ á3ÏK´UJc/óùä3#VÂ,h”¥cžõ;¬ R³TãÂmžsI{˜,Ód2#)) É“¢ß/u°Ö[iγ枘„ä¤d…MX¼Y‚çÙs²´ÛpÐv•ㄹHY¸Rï{&“ ‰‰I@b²Ï6ÕÙ¨.¤j~Æ1aÌ:&S"VÌ™ÍÒØ8jù[ý3^É3Ê!ØRŘÁ‹ãFQ e6 çÉt­½OL ̼e'†ìX†:¢Öò¾m¼T}+Ú’™‡„!Žç…ÎÉ£Ëó°]l7àˆ#•Ëw\2L 2Sm[èy·œ|W%+èªR9MK†ú‡©‰Ö‚G52»M=ÚOFÔÍçLV/¦à””‚ ‚ ˆ·W7[ßn5 AA„>Hp"‚ ‚ Á‰ ‚ ‚'‚ ‚ œ‚ ‚ Hp"‚ ‚ Á‰ ‚ ‚'‚ ‚ ‚'‚ ‚ œ‚ ‚ Hp"‚ ‚ Á‰ ‚ ‚'‚ ‚ ˆ7cæGÞò—=J”,K­ú¹yý5AA¼xÙ‰à”}J”,Kû & 07®]¤† ‚ ˆW€‘šàõáÐÁ½¿â%ßÊúß½}ý­­;ñfõ‡»·¯Ó $œˆ—ʼnc¿¿•õ®Ú‡í£@¼öý¡Nh#ÒÄk 9‡¯Ç¡F Þˆþ@}™ ^oÏgüAA"¹H$‘Ɖ ‚ B'$8AAàDAñš N;wîB@`vîÜE­OAÄkÅKG¹mZ·DÄÖmhÙ²9ÝäÄÉ(¬þ~-®\¹ ''GT©Rÿ{oüýý^èuÅÛÂ_Åñ:¡Të)ÏÁß¡~½ÐWzÿÔÚN^GƒÁŸÜ­[~ð?¸¸8Ó@mEÄ›&8=}úgþ8‡ý{w¡aãæˆ…··7Ý…`ó–Hœ:}£G GÑ¢EžnÂÕk×0cæôìÑuëÖ~)åxUqu²{Ý §üçc‰Ëg6óHMMADä6Ì_°cÇŒ¢‡€ÚŠ ˆ—ÀK5Õmßñ 7jOO4jXÛwü"9„ð›P½f]TªRcÆŽGl\œîãðõÂoR½*×ÀçS§Ád2 Çîܹ‹Aÿû•ƒk tÙŠhÖ¢ vïÙ+Éý†¨T¥::wí¡ûœÈÈmhШK—Gé²%ÇàÛå+Q'´!Ê–«Œž½ûáö;ºË¬—•+Wc¸1(^ÜF£..ΨX¡<&Œ‹¯æM=ýM{p \\\вEsì?ð5µAo¢à¹ :utêØ‘ÛlÒ¬Y³7¬Ã‘ß÷ÃÝÝ'MÑ}|ÝOàïï#¿ïÇñ£¿Áh4bñ’o…ãC†D½z¡8vä N<‚öíÚ`ÂDiþçÏ_ÀÑÃ0wö Ýçlݶk¾_‰kWÎãës1dèHáØOëÑ'OìÞµgNC³¦M0dÈÝeÖ g00'…"E cËÏ$¿}·ê{´jÓÍ[´Åü‹$‚ZÐFøu÷^tíÞ ¡õ£~Ãf8tè°püÙ³g˜>sš·l‡6í:aKÄVIÞb3‰V^°|Å*4oÑ­ÚtÄú 5ÍnYåËi3ñˮݒßvþò+¾œ6S¸fÐF’ëkµÓÖ­ÛѬEüïƒÁºêû×_0zìx4oÑõ6C¯Þa6ía/F£FÕr™Í</ù-ZµG£&-ñÁGCqçî=Ý÷•§V]ê„6ÂÁß¡Wï04hÔ ={…áÄÉ(ìÚµÝ{ôa¶Ï¡C‡Q¿a3Ô m„¦ÍÛ`ÄÈ1¸uûvŽõì¶•R8èCôé;Ðæz)))èЩž={F3 Aàd?wïÞC|\᳞vºrõ"6‡cℱºê;é³ÏQ³FuDFlÄŽm[дiÌš3/Kõ1›y(11O%ù¨¿yó*T ‘¤wpp|?sæ,ýþ;îܹ‡ó.054r´Î)Z´ˆb½oÞ¼ •ãÚeÖCϞ݌˜˜§¸|å*~ùåWÌšýÊ”.…/¿˜‚|ùòf‚[·ã›EóáèèèÖµ >< aýz y ú1 , ­#Ïžû“&~ £ÑˆüùóaÈÇâÇ*–K-¯Èm;0ýË)pqqA.:ä#|ðá,õ/5MÕáCûàââŒñãÆ`Ú´™˜=k¾œ> ÆQtÖÓN=ztƒ««+Š.¬«¾ß­\&|vvÞíÞß._™¥::99¡PÁhÒ¤zõ|W’N^®;waάépss´lÑ ?­ßh×}ç©§.£G€¿eÒ±C{,^ò->ùd8 `·O®\¹”œ puuE‡ömÑ¡}Ûl÷‡œj+µ>Ô©C;¬_¿Õ«e>Ë›~Þ‚Ñ£†Ó,C$8eÈ­ÛqïÞ}Ì™;_ò»Ÿ_1‰à¤%4¨7›Í¸|ñ¬0ÙÉÙ¾ +W®Æ€ýP·näË› 5SÍ_Ï9ƒ²â.=ݤ±V/³=f¼)¾Fjë×—.]Æž½û1{Î<Ìž5 pçî=4iÖZµÎ… R¼F\\Œ"s‡õšJ¨åuëÖmäÎ[ø^*0ëoº×ãØíïï‡öíÛ¢WŸþøàýAª» õ´“UÐ[_8á"NœˆÂ_ý…+W®åxYåúë¯È“ÇWøîááØØX»î«®Zu)V¬¨ðÙ* ÈŸ_±Üã?ÑcÇcß¾hݪ8‡ºuj¿°þ•¶RêC¡¡u°`á7¸yóJ”xgÏý  *K³ Aàd?üq...Ì··hÕgÏžC¥Jd¨ÎË— &i///Izµã~~Ń؃óô³±ï/ðññ\¿~C³ìY9GLñâþHKKSŒ´ÊœÊ–-ƒ¢E‹ }ÇnÂoÈóÔSÖ‚‚ã”Û§V­Xµr._¾‚£ÇŽãÄÉ($&&¡YÓÆ/¬/ØÛVJ}ÈÁÁmÛ´Æú 1~Üüüó´o׆f‚xl¼è/g‰ˆÜ†¾}ØDï^=°Eä$þÅÓñèÑ#$%%cã¦-¨\¹¢$½Úñ.;""r+‘””„¥Ë–£OßÂqOO:t)))¸xñFŒ­Yö¬œ#¦KçŽØ·ï’““‘œœŒŸÖ‡£MÛŽºË¬—¶í»Ø8ü€££rçÎ ùP¸pa<}šå{éáî.1Þºu+Ëy½óNqÉ®È7o½ÐÎ~çÎ]lÙ‰×|‡ˆÈm¸sç®bÚì¶‹o/ÅâEóѶM+”/_)))/å!/Z¤ž<‰¾Ë•³r^T]J– @Û¶­1vÌ(Ìœþ¦~1ý¥ˆZm¥Ö‡Úµm…áλ8uú4mÒA¼îØÊF/Ü9<==GG»¶­™Ç;´o‹Ã‡¾Íš5Aó–mQ¯AüóÏ?˜5cš$½Úñ°~}ðüùs„Öo‚ªÕjãdÔ)Ì™3C8>cúXøÍT¨‚£Æ`àÀþšåÏÊ9búõíËW®"´~T©Z»víÆ¢…óu—Y/ݺvÆ„‰“qôèq:th'ø¤øûCÇŽí1÷«ù?n z¼Û ý¾³ÙŒ}{vf»XŒû fÏ™i3f£h‘ÂèÓ§> ÂS×.±dé·èØ9Ã1:¸JeÌûjV¶î˨ËäÏ&`±è›¥HIIÑhÄç“'¾ÔQ­­´útìØŽI>¥Ù… ÞP¸ýû÷ó 4À£‡ÿ"---ce•”µ¸#%J–ÅÍë—²\˜€À ¦ ¢÷ø›Î¡ƒ{ÑÐÐÿ|„ë¬òìÙ3„ ø6…¯³9vüØŒ3é­ûërþ+üWûÃ?ÿþ‹ÇÏÒ,ûÛ<–Äë‚‹kF8'''äÍ—xù/ù%+­ZwÀî=ûššŠ˜§O±fíOhP¿5 ݇גÔÔTlٲ͛5¡Æ ˆ7˜ÿ”व£ڛŤIã°î§ hÚ¼ úôˆ´´4 z¯?5 ݇ג–­Ûãò•+èÓ»'5A¼Á© ˆWEõj!’€݇י½»wR#Ä[™ê‚ ‚ t"hœx>ã ‚ ‚È”‹Äòiœ‚ ‚ t"„#xøof8‚”äWŽ€ÐßÎAAèt8.˛˜]2ÃäËŸŽ€œÃ_CH8%‚ ˆW™ê‚ ‚x#9tp/ NAA¯ œ‚ ‚ Hp"‚ ‚ Á‰ ‚ ‚'‚ ‚ œ‚ ‚ Þdqœè+AAR¹(S>"AA„NHp"‚ ‚ Á‰ ‚ ‚'‚ ‚ œ‚ ‚ Hp"‚ ‚ Á‰ ‚ ‚§W‚ÙlÆÚB›vT¾ *U©Žþÿ‡?þ8kw^A zën¨V½sº]”ò[ûãO BІøë¯¿˜iõ”…•Fo?ÉÊõ‚ ⵜF}2“§|Ë—¯ %%ÏŸ?Ç¡C‡Ñ½G9zŒîÖkÂÆM›1åó/‘/o^¬ýaŠ)òF÷“'¢Ð£W?ºñA$8½€«×®¡[÷^([®2ÊW FŸ¾ð׃Š×a™„ä¿éÉ3rëv4iÚ e‚*¡eëöØ·ï€Íµ~Xó#ª×¬‹µB¾q“îö߸ 5j…¢zͺX³vð{ýM$˜×îßÿ A¨ß°™fž¿îÞ‹OF O|¿zJh¶‹½õ±·Ÿh]_«­çìÛwÍ[¶E™ JèØ©®\½&·§~AÄëƒU.ËFÿÓÅ‹—uëÔ’ü^¦t)¬[»Õ«‡¿>|ƒ‡ŽÀÍ[·‘žžŽ›7oáãÁÃpøðQÅüí9gÜ„ÏðìÙ3¸º¹† ÿ§ÏüÔÔT$%%ãè±ã6ü“lÕW+ÏÝ{öbä¨1¸}çÒÒÒpíÚu|øñPD:-¤Ù‰Ï§NCtt ž<‰Æ¸ñŸé¾þ¸ñŸáÉ“hDGÇ`Êç_bKD$ fÍê€#G[þg˜¾jÕ¬¡šßo‡~ǰá£`2™Ð²es”)]Êî6ÑS{ú‰zÚØÊ Á7‘––†?Ï_À¸qiD!‚x›5N¯šøøx€‡‡‡fÚÅK¿ÏóèÚ¥3Μ:Ž.;‚çy|³xiŽœón÷®8î4>Ÿ2 pïÞ}À¶­›sϦðuÙª¯VžËW¬ÌŸ7—.ü¥‹Âd2aåw«…4«V¯tïÖçþ8‰®]:ë¾¾õœn];KòªQ£ºD`²þ· TJ|øÑPpssCøÆŸqýú »ÛDO}ìé'Zèic+:uÀŸg£0wÎL4NbÓß‹2A$8Ù+—›dbTãüù €±cFÁÓÓcÇdhjÎ_¸˜#ç„…õ«« Š. hÕ²9 }‡.èÔ¹;|½qqñºëf6›m~ÓÊóòå+‚fªl¹ÊxÿÃÁ€sçþÌœ¨oܼÿþ{È•+½×_w™¬ç¼7°¿$/«€tìØ ˜L&;v"ã÷Õ5ó\¶ô :ééé˜4yªÝ}@O}ìé'Zèic+#‡…››Z4o HMM¥Ñƒ ‚§WG™2¥G—NnW®¢G¯~8q"ÓùÖ`›G†ñ‘ãT*jÇ9… ”|ÿò‹)2ø#T®Tÿó.Z"L²j¤¥¥ž>µ9¦•'KØ€˜˜§ÂgÎRxWWÉw=x{y,ÿ3Ú'_Þ¼(ñNq<}ú›7G 66%‘'¯j~‹ÎC­š5ЧOO”.ˆ¨¨S‚ùO/zêcO?ÉŠ@+oc+¾¾>'''5‚ HpzõtîÔ!C ør&Ž;ŽÔÔT\ºt£ÇŒÃÉ“Q˜>3s·”Õfæ¬9ˆ†™3ç*T(¯,˜Ùq޳³³ä»££#† þëZƒõë2ÌIj±¥\\\{÷îGRR|½È&Vž% æÏÁå‹g3ÐÕË™ÚÒ¥3fÎARR/Y¦»½—.[ޤ¤$,_ñ T©LŸ¤¦¯- OÛÔ ~=A›2e8ŽÃŒ™m­=õ±§Ÿh¡§åB±±±vi" ‚ œ²LûvmѬiceòäñ…··7¦Lžˆæß¨Q£š aqpp@µjUí¾ŸcF„·—~Z®ê{&FO}ìé'Zèic=Œ9 ¾¾>prrÂóçÏiT!‚xƒáöïßÏ7hÐÿþûÒ,¯©) YʬDɲ¸yýµê@§.ïâܹ?Q³Fu¬ùá;j‚ âµãÐÁ½è?hh–w<;9çÊøïä„ü âÀô’_–çÏŸ#11@†ˆ ‚ ˆ ŒÔ„œêuàææŠw»wœ± ‚ ‚ Á‰`pùâYj‚ ‚`@¦:‚ ‚ œ‚ ‚ Hp"‚ ‚ Á‰ ‚ ‚'‚ ‚ œ‚ ‚ Hp"‚ ‚ Hp"‚ ‚ Á‰ ‚ â% N<À[þ^Gƒt§Ý½g/J—­ˆª!µ`2™þ3uØõëž,׉ ‚ ˆœ…gÈFo¥ÆiÈБøzÁ\;úþ3åúxð0É÷¬¾Í™ ‚ ˆÃ[ù®ºôôt4mÒ˜î>AAvñFjœƒ¹ 5C`éò(]¶"vïÙ+³þ·~6›Í˜9k.‚Cj¢\…`tëÞ 7oÞ’ä·~ÃFTªR»ö~Ûõë4kÑe‚*¡YóÖøý÷#؉ÆM[Ú\îܹ‹Aÿû•ƒk tÙŠhÖ¢j¹ƒ‡:¡ ‘ ©cbb"j×mˆØ¸8À× ¿AHõ:¨\ŸO¦j‚ÌJÙµ®a5¡båjè×ÿ=\»v]÷qµ¶±2oþBT®êu°ò»Õ6¦Ìì”Ì¢AÄ[+8ÀÖm;°æû•¸vå<¾^0C†Žiþºqí¢ðyÕêžžŽC÷"êÄ4iÒ³çΓäwþü=|sgÏ~[½ú,^´çþ8‰Î;⃆ rëv¬Zù­Íu`Ȱ‘¨W/ÇŽÄ©“Gо]L˜8E±\àíå…Fâ§õá’ò¬ß° Ôƒ·—Öý´þþþ8òû~?úŒF#/ùVµ}ì-»Ö5¬æÏ×.âØ‘ƒhÒ¸†¥ÿ¸JÛÀÆM›G@Äæplß¾SRŸì–Ì¢AÄ[-8Mš8EŠ4mÒéééŠi7ý¼aýú W®\puuA§ŽíqîÜŸ’4ƒÞ777øù~ûbêd”(ñœœœÐ«g$''ã‹©“Q´(ûº[#6¡gîpqq»»;ô˜ͺ„õíÕ߯Ajj*€ SãªÕ? _ßÞ‚Õ¸Q899ÁÙÙú÷Åæ-ªyÚ[v­kxxx )1 àææ†ž=ºã—‘ºkµÍú ѳgw¸ºº¢páB˜8aœ ™òA„D>N¼åïÍÀ*èáîÝ{ÈŸ?ŸðÝÓÓ11O%iŠ)ls^ñâþÂgWW@áB…T¯uæÌYúýwܹsç/\ÐU>?•Åæ-‘èÞ­ ¶nÛ€€(QâÀÍ›·P¡Rˆä-§w{Ë®u™3¾Ä ÿ}ˆí;~A—.aà hܸ¡îãZmsíÚuøúø߃‚Êähù‚ Â^Mpz³0²§L“û±ÖoÇ)æ¹!|V®\ú¡nÝ:È—7/4j¦«<Âúb츉èÒ¹#–¯øŸŽùD8f6›qùâY8::ꮟ½e׺FÃõ°-ògœûó<<„C‡#!!íÚµÑu\«m´ÂFd·|A¡#5A†FçáÃG(T¨ >>þ…\gúŒÙØ¿÷øX4'ׯßÐ}nµj!ðôôÄw«¾‡ÙlFݺµ…c~~Ńò¿°6Òs2eJ£L™ÒèÞ­ .^¼„vºHµãZmXOŸÆ"O_À•«×r¼|A¡©˜¡&:ulU«@BB’’’±yK$rçÎã×ñôôÀ¡C‡‘’’‚‹/aÄÈÑ’ã®®®¸}ç?~Â}ähÙµ®Ñªuü¸n½°ûïÁßÃh4ê>®Õ6=Þ튟և#)) >Ä´i3s´|AA‚“NÂúõƒƒêÖk„ÚuëãÌ™?ðýªå9~Ó¿ÀÂo– B¥Œ5ö—o`´kßEÑ|תes+ZÚ·³)ÿóçÏZ¿ ªV«“Q§0gÎŒo#µkÌŸ7;vîBõš¡ v±é=®Õ6]»tFzz:ê†6B‡NÝѺuK‰Y.»å£pA„¸ýû÷ó 4À¿ÿü-ìÚJKMÌRf%J–ÅÍë—¨U‰N\\<Ú¶ï„ßì¡Æ ‚ ˜:¸ý ÍrÈG'7€““3 ,ˆ¼'kÐHÒ¼¹T­V‘[·#%%OžDcé²åhѼ5 AñRy#'kÐH bøæ2oî,¬Xñ*V®†–­Û#-- #†¡†!‚ ^*äK¼Ô­[[²“ ‚ ^äNAA‚AA NAA$8AAàDAA‚AAÄÛÃŽ Dɲt' ‚ â †ã¸ÿD¼FApâùŒ¿×zÕ AA¼™:¸÷•\×*‰Å#2ÕAAèDdªãe2AAÄÛ /ûO'‚ ‚ rˆC÷¾2³ÚË‚'‚ ‚ rŒ°÷Þì°“àDAA‚AA NAA$8å4~4{öîcÛ³w>úx¨fAÌÏ/šÃGŽ¢Oß’k‹ÿK—GІ˜6}’““uç«UññÞ}úãð‘£ô”AÄÛ 8Mž<óæ/DBB‚ä÷„„Ì›¿Ÿ}6á?[ö… cèÐ%¿Ý¸vQø»táløi-xžÇ”©Ó^H†ý‹-¡§„ ‚ ÞÁ)_Þ¼èÛ§æÌ/ù}îW Яo/äË›÷?Yî«×®!1) ÁU*+¦1(\¸† þÛ·ï|!å¨\ ¸zí=)A·ÀÇ©k—N¸qã&Îûpöì9ܼy ]»tÒ|½ð„T¯ƒÊÁ5ðùÔi0™LšùšÍfÌœ5Á!5Q®B0ºuï…›7oêÖk„¿ÿþGH{óÖm!êÔiá·¿ÿþ¡õ3óþõ×=hѼ©®ú¥¥¥ÁÇ'·®rɉ‹‹Ç§ã&¢JÕ¨^³.~\·Þ&MóæMñë¯{èI!‚ ²Äœ¹ólÜMXsæÎ#Áé¿ÇqøbêdLžòž={†I“§âó)“„ãë~Úù}?Žý F£‹—|«™ïªÕ? ==‡îEÔ‰#hÒ¤f[nzÕà*8uúŒvý†p”)] ›6m~‹:u!Uƒ™yŸ>ýªWQ½¾ÉdÂ;w1qÒ ò±®rÉ™øÙ4nÔÇ–ŸÃ%å³R58gΜ¥'Ÿ ‚È#G CÇíTÓtìÐ#G #Áé¿‚Ÿ_14oÞ ­ÛvDëV-àçWL$ÔlDãF àääggg èß›·Dhæ¹éç-ë×¹rå‚«« :ul/hµªWÁi‹à”ššŠ;Å7‹`ß¾‚¿Õ©S§QUApº~ã&Š/nó»X2/U¦7m‰Ý{öÁÁ`ÐU.9QQ§P¯^]899¡P¡‚?~¬MšâïøãÚõôäAYV`LŸ65`oÔ¨¦O› ŽãHpú/1p@?üqqñX¿a#ºuéèÒ¹#Â7þŒØ¸8DGÇ D‰wó1ÔoÁ`@ž<¾èÛ§îÞ½§«\ZÇŒFf»éñù"‚ 5\]]°tñB” ” ÄÒÅ áêêòZÕã­€éçW ÑÑ1vŸçï ßããã%BM¥Š±éçÍxòø ªU˰kÕªÇcݺõ¨R¥’¢ZÒÇ'7¢cô•)!!>>>ºÊ%ÇÃÃÑÑÑÂ÷«WmwÏEGGÃ'wnzâ ‚ ˆlãááïW¯@hh|¿z<<<^»:¼õ‚S—鉉‰HJJÂÒeË%'•èÔ±=V­þ HJJÆæ-‘È-0ªV­‚yó¢K—Žªs§XôÍRE3¼óNqܸqSõú&“ üù_ƒ®¢kh•KLåJñÚuHLLÄ£Gðå´™6inܼ…€€ô´A9Bž<¾ønÅ2äÉãûZ–ÿ­œÂúõÁóçÏZ¿ ªV«“Q§0gÎ ]ç988 n½F¨]·>Μù߯Êô5ª\éééèØ¡½Làꀴ´4EÇp¨^-'OFÙü.v*_}Ã"¯/>þèÝå3kæ—ˆŽŽFІhÙºZ¶ln“æäÉ(›4AA¼­pû÷ïç4h€þ~€ÔÔT@zZR–2+Q²,n^¿ôÒ+ñª®û¢¸yó>< »vn}åeiѪ–.^(Ù‰HA,Ü‹°÷†äøœ|èà^ô47®]|)çY1:ºœœQ°`!8p€4NÿEJ”xÞ^^ˆŠ:õJËu ¹sç&¡‰ ‚ ,‚ÏóÂñê2ä#,úfé+-âo–bÈÇÒÍ ‚ ÞJ¹H$©Yþ›ÔªYµjÖx¥eø~õ ºA!‚LuAA$8Añ2 {oÈ_G2ÕA‘#¼I;Ü• AA„NÞÓ¡ƒ{énAA‚“Jï|#‚ ‚ ÁIFV#‚AAØù8AAàDAA‚AA NAA$8AAàDAA‚AAA‚AA N0›Íøi}8Úw슲å*£B¥ô {gÏž{knh@`Ðk™7AA¼¼1ïªãyÃGŒFll,&O²eË 99¿ìúÞ{K/DHHUºãAAä€àÄàù×¶"Û¶ïÄÇñãÚÕppp899¡[×Î0p¦~9[#6Ñ'‚ BV¹H$½1¦ºð›0p@˜ 4‰éСæ}5[øn6›1sÖ\‡ÔD¹ ÁèÖ½nÞ¼% ®_÷ Y‹6(T Íš·Æï¿Á–ˆH4nڥˣtيؽçÿíÝ{\LéãðÏ4£fºa…ýí¢¬´݉¥’Jä-Ë.]°ûÝ‹[¾ì—¯]ë~ëë¶.»Öº­„HîkÛJÄ®b…\RÄZV)J5ÅLóû# £©™[ÓçýzÍ«fžsžóœçœÌÇsž9ýRëddÜĸ?…ƒS´³¶ƒOŸþåꌊÚOµëçææá?ÓgÂѹ \ººb[X¸Æ~Z¹j5:¹t‡ƒSÌž3r¹\¥üûõÐÝ­'¬;8`äG¸‘‘¡R¾q㸺{¢í»ʵG›~%""ªË”ÁIñÜ£.JI¹ GG{µe"‘mÞiýìÍÓÈd2ÄÇE#ñ÷x{{bIè2•u6mÚ‚5ß®@ò§1t¨þõÙxDí;€¾Gê• X¹"ã'„¼Ô:ã'†ÀÝÝ §ât:ƒöÇg~£Rç¾ý±uóµëÏüúxyöÄo'ã¹{'""öTÚGaÛwÀ ÇcðÛÉc‰DX³ö{eùöð033ÃÑ#p6é|zycüøÉ*uü‹Ÿ¶lĵ«˵GS¿ò˘‰ˆ¨.Q—tfÄ©  ¦¦¦Z-±;£`dd‰DŒ!~ƒœ|^e™¹sf¡M›w ¯¯GŽ@QQæÎ™…–-[zy{A&“½Ô:ûöF`äˆá‹Å066FpPrrrTêüjæt´h¡~ýÄÄ$¸»»B__o½õ˜1ãËJ÷;|Ç.xyz@__=‘{•å;vFÀ· !‹1꣑ؿO5ŒÍ= ææ­Ô¶G›~%""ªËtfrxÆ ñða.ÌÌšh\öæÍ[hÞ¼™ò¹©©)rr¨,Óºµ…òw‰D xû­·*­·:ëœ={ñÇ##ã.\¼X®¼,t©““ó"ѳChcm]é¶ÒÓ¯ÃÖ¾“ÊkÏ_ÚLOO‡X,®´ŽÊÚ£M¿18Õ;Úàsçàíå©¶<&özz¸W¸þ‹s}ÔÍ••¶¡ªëìØ 6!88®®ÝѬiSxxú¨,£§Wù  \.WnW$VºlII .§œCƒ Ô–Ëdrý¬n5µˆˆHWèÌ¥ºÁƒbÓæ­()))WvíZöï? |naaŽ{÷2•Ïóòòþ‘6/X¸áÛ·`ØûCáä耢¢¢*­obb‚ììlåó«WS+]Þܼ²³s*,oÝÚOž<©öþÔ–~%""bpÒ _ß>022Â'Ÿ~K—.C.—#+ë>~Ú¶ŸŸ„)!“”Ëñ„›¶   RiöDF¡qãÆ¯½Í¦¦&ˆ?ââb¤¤\Âä©UZßÁÞ[¶†¡°°™™™˜7Q¥ËûõÃÞ¨}(,,„T*źïÖcÔè`•ò_EQQŠŠŠ°=|'úðÓº=µ¥_‰ˆˆœ4X»z%œ1)d*l::¢·oœNL†õkñöÛÏæŒ‚P(„«»'º¹öÀÙ³`óÆõ¯½Í ÌŪÕkakß “§LØ1AUZñ¢yÈÎÎFw·žðí7¾¾½+]>0`òóóáÖÃλátb–.]¨,ý._¹ ·ÞptîŠ#GŽâÛU˵n¦~å툈¨Î瘘…‡‡þº}JäÅÕª¬M[k¤_»Ä^%""¢\|\4‚ÆM¨öípô„¼õv ÄÆÆêÆäðªŒdð^BDDDT]:œ†ˆˆˆèuÐc181818181818‘ªçî㤊:¹mÚZóHé0@ðúïÛX–‹žËG"]éP~Õ ‘nŠ‹®5má¥:""""'""""'"""ª…âã¢kÕeµWœÏ=ˆˆˆˆª#pìxÙuÙˆ#NDDDDZbp""""bp""""bpª²£¿D£µ,­l”›ŽŽ8yê7žDDDÄàô|h ™2 +W„"-5Eù˜?o6þõéx$&&ñ, """­ˆt}ÇOÁÊ¡èåí¥òúÀý ()ÁgÎÂÏGðL """t~ÄI&“• Me è‡È=;•Ï-­l¾cì]0ôýÊ×W®ZN.ÝáàÔ³ç̇\.W©§²rK+DE퇇§¬ÚuD;k;ý%šgÕ KC—©L•©è±4tƒS­ßy==ª¼váÂEœ<‹Ð% aÛwÀ ÇcðÛÉc‰DX³ö{åòšÊ`ßþƒØºyR¯\ÀÊ¡?!„IDDT/„Lž¿Á+]Æoð@„LžÈàT[½˜rŸ7nl0 anÞ ¾c¼<= ¯¯ƞȽÊå5•ÀW3§£E‹€^Þ^ÉdüK""¢zA `Áü9ðôôP[îééóç@ Ô‰ýÕǃ˜–š¢¢ž×¢ÅÛ*ÏÓÓ¯ÃÖ¾“ÊkB¡PërhÙ²ÿrˆˆ¨Þ …Xþ¿¥3îüþ{¢òu—NXþ¿¥åÞ7œêØÁ}^II .§œCƒ Ô.¯©(½$HDDTŸI$b¬[³ Ã?…«©©x×Ê ëÖ¬‚D"®Sû¡óïè"‘¨ÂÉØG‰†HTyv47o…ììœj—Q)lÞôÜܺcó¦`bbRçöáYpR(ž=tÈÊ¡™2­\xzþþN•ñꇽQûPXX©TŠu߭ǨÑÁZ—Ñ3ffMðãßÁ̬Iío¬2={Iç/ÕõòöBèÒE?!DeR¶H$R{§ŒÂÿ–­€[oH¥R¸¸tÂÒ¥ µ.'"""ÝQ/æ8õòö•KÉ—{~Òx===L ™„)!“Ô®£©\]ê^#""¢Ú³–‰ˆˆˆœˆˆˆˆœˆˆˆˆœˆˆˆˆœˆˆˆH环óû¨ò©:9USúµK:µ? 5ùˆ#NDDDDZÒ™û8ÅÇEóhƒ“&€G’ˆˆˆœ´Á;qÑëÀ9NDDDDJ¥ NDDDDÚ„¦ääd18UF"‘ÀÎÎb±˜Á‰ˆˆˆ¨ªœˆˆˆˆÔà¥:""""-©»T÷ìv E郈ˆˆˆžËFÏòGœˆˆˆˆÔ(½Twž—ꈈˆˆ4)½TgËOÕižžÇàDDDD¤%'""""'""""'""""'""""'""""'"""¢úCù•+ÏßP\À~!""¢zNñÂO€#NDDDDZcp""""ªKÁ©k7wXZÙàæÍ[¹\ŽŽvΰ´²A['ÈårÀÍ›·`ieƒ®ÝÜ–V6°´²yéí×T=µÍéÓ‰2t8l::¢£3ÇÖ‰}ÕÕãADD N5º}{À¥K—©©× •JEEE¸z5U¥¼}ûvÅÅÅJ¥066ªumüý÷DŒø0€‹ˆˆêQ­NÖíq,þ8R.]FŸ>>8—|¾4Õé顤¤Éç/ÀÚº=.]¾¢´ÒRSx+q÷î߀ø¸h4oÞ ÅÅÅøvÕòZÕÆ‘•M<®DDT[ÕŠ'kÀ¥Ë¥#JçÎ%<}úãç£Ñʲ^>ý`ieƒk×Ò?lØK+¬Yû ýú XZÙ —O¿ ÷yç®ts퉎vNøÏô™xòä‰ÖÛ×f_-­l P”~À­‡Þmo CCCµ—Á¶þ†N.ÝÑÓ«7ÎK®°_ÕmÿÅç»v톃S|0bàFFF~€¶Nhocƒý‘üôxV´ uÛ{Ùþ ""Òàd­z©®lÄiô¨@ùF{ùéˆS{ëÊ/Õýë³ñHKKÇ“'OpþÂELŸ>SY¹7 ³çÌGvvîßÏÆô_—[ÿĉ“øbÂd¤_¿™L†ôôëøü‹‰8qâ$ÀË«géHÎñ€?þ8§ÒÎøcÇÞÞ=Õ¶ïðáŸ1}Æ×¸wï¤Ò"ìŠØƒï¾ß õöµÝWmìÛßÌž‡àÖ­?ñÅ„É/u,§ÿ÷k¹+-5¥ÂË_7nŒø`.$'¡{·÷^êX~0ü}\H>ƒÙß|Ø»g'ÒRSpíêEDEî凴mcMôQ•©ÉFµæve¾Ã¶ï€B¡€-À¶cÈårìØYzI­];+èéUÞìI`hhˆ>½{?~üì :-ðÉ'cadd„qcƒÊ­áÂEÀ—Ó¦ÀÔÔ_NûwéëKߨíìlafÖ‰Ig~ý233áæÚ]üÏ iS3ØÛÛ©mßÕÔkŸ^Þ°³íˆ´ÔÄÅü¬õöµÝWm¤>½Ü8vL$ Æ Ö¸NIII…e£ ‘ˆÑâí·•¯%'ŸÇÂEK1uÚ €L&«R_gi7âô³±.ç¹7 àð4t”¨Ý{"Ÿ¬öëjÒä €¾¾~¹2 ô¾è±Då¹J§¼ÌOïZ¶¨žž<{z ¸¸ß}·øîûP\\Œž=ÔÖ­MÑ´}m÷Uem(ûYÖ/ê”ÍÃzðàa…˼õÿ§òüÇ›1Äÿ,]² z'ékì""¢:œJQ^Þ#•ÀdgוuÿéršoEPY`i÷®`ᢥJ¥Ê ÝÏkßî]À¢ÅK‘—÷‹-ØÚvT.S6e½Å IDATÏ)jß4iòÞëÚÍš6EÔ¾ooÏ Ûð®U[ÀÏG£•“±;wq­ÒöµÙWm´y§5`Û •J±vÝ÷å–‹Å€èèH¥R¬Xùm…õ¨<_¾¢tÙ¡CãÖŸ·Ÿ…Ÿ. ?|ø¹¹yjë|ýADDT7‚ÓÓOÖ•0ØvìPœ^xsÔfÄ©2c‚”Žlu´sFäÞ}.³cg»`WÄèééáóÏþ¥\¦Û{]ahh¹\{€££=är9 ñ^×.¶!8809d*†¾?”—–´Ý~M>ü}¥—H;Ú9ã÷Ó‰†Ú/&LFG;gåeSm¼Ñ¸1 ·ï|öùîßÏ4jÔàܹ¦ýgF¥ÇìuôQN­[[@")Ù°´l###嫹yédp¡P«¶–/µ>}|ðͬ™hÔ¨š5mйsʪÎË«'V,_Šw­¬Ð AXZ¶ÁÚÕ+ѵ‹‹r}}}¸¹vØÛ•^Vtrt¸¹u¯ôRQ_ß>øfÖL4mjCCC 4Ó¦†Tiû5åÑ`ò¤ñhØÐmÛZbåòPe_—™;gl;v@ƒ ÐÚÂËBk]ÿ’ÅóñNëÖhРºw[·”NŒ/›Ø=%d"š4yúúúÈÏÏW[Çëì""¢ÊbbbøófŠ‹‹K_È«UY›¶ÖH¿v‰½ZG( ´³¶ƒ\.Çö°-°·³ÅÏGÁÄIÿF³¦Mq2!ŽDDDuV|\4‚ÆM¨ö•ŠÒA±-[™#66¶vÜ9œþ¡Ô, kWœ8qRyÃÊ2es¸ˆˆˆè=vAý¶tñBôõíƒFA(Â̬ †óW¹tHDDD¥8âTÏ™™5ÁŠåKÙDDDZàˆƒƒÑ?B9ÇIñô¼÷2Õw 5¯qĉˆˆˆHK NDDDD NDDDD NDDDD NDDDDµÙ³;‡+(žÎ¯c«³´²Ñ¸Œ¦/ø³´²©ö—¾ª}*kÏ‘ŸAoïZÛV"""T–‹ 5Á©{1DèB°x¾ýŸ1Qå9CÑ?ƒ—ꈈˆˆœTedÜĸ?…ƒS´³¶ƒOŸþ8úK´Ê2{"£àÓ»»`ÂÄ)xøða…õYZÙ`箸tu…½£ ¦}9ss•å%%%X´8Nº¢ƒ­† ÿééוåG‰F;k;XZÙÀΡ3‚Æ"5õšJý/þ|ñ5m¶cieƒ¨¨ýððôU»Žhgm§²ßÚ\æ$""¢zœÆO »»N%Ä!ét ìÿÎüFe™Í[~† ßáTÂ1tïÖ?nÜRi[·†a׎0$±±1f~õ¬¾›¶@&“!>.‰¿'ÀÛÛKB—=kÏ„¬\Š´ÔœJˆƒ·—'&LšRne—åÒRSÔ^¢Ó´Ø·ÿ ¶nÞ€Ô+°rE(ÆO)W?18= {#0rÄpˆÅb#8(999*Ë|=sZ¼ý6 àëÛ±±q•Ö9cú—hÕª%ŒŒŒ8IIg”e»#0 FFFHÄâ7ÉÉç•å&&&J†††9b8Œªò~iÚ|5s:Z´hèåí™LÆ3Ÿˆˆ¨DõigÏž=‡øãÇ‘‘q .^,WÞ¡ƒµòw‰D‚ôë7*­ÏÞÞVùû›o6GNÎåó›7o¡yófÊ禦¦*å‹Îø?чáïï=¼¼zVyŸ4mZ¶lÁ3ˆˆˆÁI{;vF`ÆM€«kw4kÚž>*ËU»ƒP(¬Òòr¹\ù{OwìÚäóøø(((ÀÀý_z_Ÿßèéñ3DDD NU°`áÄDÆo¼¸v-­Ü2iiéhß¾àÑ£|¼ùfóJë¼r5;”N®ÎÍÍEÆ •eæ¸w/o½õ€¼¼¼rë·oßíÛ·ÃðaþHI¹„ƒý«œ´ÙÕŒz3ajj‚øø(..FJÊ%L™Zn™Ùs 3+ Riöí?W×î•Ö9wîdffB*-®ˆH88Ø)ˆø ÂÆM[PPP©´{"£Ð¸qceyß~ƒ±-,€¿îÜH¤>ÇJ$ÜÈÈ@VÖýreš¶CDDD NU¶pÁ\¬Z½¶ö0yÊ4ŒTn™~¾½áÛw:wéŽ '1qüg•ÖéããÞ¾àîá»wïbñÂùʲÀ€Q …pu÷D7×8{ölÞ¸^Y¾|Ù.Aã&Tûýº¤¤t|I,£¥¹bccucŽ“¦Q"""ª :ù]uDDDD¯?§Î°FDDD NDDDD5Ky©NñôADDDDÏrÑóùˆ#NDDDDZ©ä*ÇœˆˆˆˆJ£‘Bõ'8âDDDD¤5'""""-éÄ}œÚ´µæ‘$""Òa VÜ H¤+Z_¾ê…ˆˆ¨¾‰‹®5má¥:""""'""""'"""ª…âã¢kÕe5'"""ªÕÇŽgp"""""'""""'"""¢š&Òå³´²Ñ¸Lm¸™18ýã^ E–V6 JDDDTm¼TGDDDÄऒ’,Z §N]ÑÁÖ Ã†ˆôôëÊrK+ìÜ—®®°wtÁ´/gàan.Ï"""-, ]K+¥¡Ëœê‚›¶@&“!>.‰¿'ÀÛÛK^8x[·†a׎0$±±1f~õ ÿˆˆˆ´2y"ü¬t¿Á2y"ƒS]±;£`dd‰DŒ!~ƒœ|^e™Ó¿D«V-add„ ÀÑHJ:ÿ"""-,˜?žžjË===°`þ§ºàæÍ[hÞ¼™ò¹©©)rr¨,coo«üýÍ7›—+'""¢Š …B,ÿßR¸¸tRyÝÅ¥–ÿo)„BaÙNWC.——;àDDDT}‰ë֬»VV€w­¬°nÍ*H$â:µõ>8YX˜ãÞ½Låó¼¼¼rË\¹šªü=77 6ä_Q™˜˜`ó¦àæÖ›7ý“:·õ>8 ñ„›¶   RiöDF¡qãÆ*ËÌ»™™™J‹°+"v<û‰ˆˆªÁ̬ ~üá;˜™5©“í¯÷Á)0`„B!\Ý=Ñ͵Ξý›7®WYÆÇǽ}ÀÝÃwïÞÅâ…óyæÕC¢ú´³êî®§§‡/§MÁ—Ó¦T¸^PàhŽæÙBDDTÏqr8ƒƒÓkÅ/&"""'""""'"""ú'ޝóû(âa&""¢š~í’Îï#Gœˆˆˆˆ´¤3#NñqÑ<šDDDÄउ@ à‘$"""'mð–DDDô:pŽƒƒƒƒƒƒ1818½R"]ÚK+›*¯Ã»Ž‘¶tnÄI¡Phýx™ ö|™¦ÀV@WæÈÏ¿¼òð¨m}G‰F;k;8wzr¹¼V_]ô2çûˆˆÁ©Ö{•£VŸ1±ÖìÛø !X¹"§NƒP(ä¯gç"騥:zµd2zy{±#ˆˆ¨ÞâˆS xþòHnnþ3}&»À¥«+¶……—[~åªÕèäÒN]0{Îü /{•Õkie£ü=#ã&Æ}ü)œº µ|úôÇÑ_¢UÖÛŸÞýàèÜ&NÁÇ•ee—Û,­l`çÐAc‘šzM㾩kË‹JJJ°hq(œ:uE[' þ!ÒÓ¯«Ôµž>°j×í¬íʵýÚµ4øöT®î¢¢"tsí‰ÜܼW²]m‰«»'îܹ«|ž~ý,­l˜tFùÚ;wáÖÃKë¶…ïØ{G }D¹íis>Ut.VõXkÓÖ»"àÒÕöŽ.˜öå <ÌÍÕºµ9DD NõÌ̯¿—gOüv2‘»w""bJyØö°°°@ÂñüvòD"Ö¬ý^m]e—]ÒRS”¿Ÿww7œJˆCÒé ØÿùÊz›·ü„ ¾Ã©„cèÞ­+~ܸEYVv¹--5§âàíå‰ “¦hÜ/umyÑÆM[ “ÉÄßàíí‰%¡ËT–Ù·ÿ ¶nÞ€Ô+°rE(ÆOQ)oÛÖ5Âñã /¬wÝÞ낆 Mk|»U9&ÎNŽH:sVù<|ÇN´o÷®ÊqNL:ƒNÎNZ·íÂ…‹8y"¡KVù|ªLUµ6mݺ5 »v„!áx Œ1ó«oªÔšŽ?ƒ“Œ&©{T$11 îî®Ð××Ç[oýfÌøR¥<|Ç.xyz@__=‘{µnϾ½9b8Äb1Œ€œœ•e¾ž9-Þ~ðõíØØ8e™‰‰ ¤…R€¡¡!FŽŽÃ£j¤¯"vG"0`ŒŒŒ ‘ˆ1Äo’“Ï«,óÕÌéhÑ¢ —·d2Y¹z>ù6ü¸Iåµ-[¶aÄÃ^Év«rLœqæipzüø1ú«¿]_EAA )é œŸ'mÚ6nl0 anÞªÊçSeªz¬µiëŒé_¢U«–022BPàh$=7Ò¦M?jsü‰ˆj3ÎqÒr¤E] R''çD¢gÝjcm­Ržž~¶öT^«êDë³gÏ!þøqddÜÂ…‹Ë•wèðl›‰é×o(Ÿ/Z8ã>þ†¿¿ôzðòêY#}uóæ-4oÞLùÜÔÔ99T–iÙ²…Æzzõòœy qåj*Ú½k…ÄÄ$€½½Ý+ÙnUމ“³¶ï>r]ºtF«V-Ñ­Û{8pð0†½?IgÎbô¨µn[‹oWØ6MçSeªz¬µi«½½­ò÷7ßl®R®M?jsü‰ˆœê¹\®|ÉTß8JJJp9å4hP­ºwìŒÀ† ›W×îhÖ´)<<}T–®ßÓÃû£v#ùüÄÆÅ#>þ 0p`ÿWÖÏÓÓÓ<È) 1|˜?~üq/šÍ[·áƒ F›jb»U9&Vm-ñ÷½¿‘››‡ð»0iÂçÿ¡~X¶b||¼‘ƒ6mÞѺmš‚seçSejâXW¥­Úô£6ÇŸˆ¨6ã¿b5ÌÄÄÙÙÙÊçW¯¦ª”››·BvvNµë_°p ·oÁ°÷‡ÂÉÑEEEå–IKKWþþèQ>Þ|³¹Jyûöí0|˜?Ì›ï×}‹Y#ûnaaŽ{÷2•Ïóòòª]×ðáþ8|ä(ÒÒÒqêÔo8 ß+ÛnUމžžìíì±{îgÝGçÎ¥#,ï½×YYY ‡££½2¼¾lÛ4OšTåXkÓÖ+Ïm?77 6¬±s›ˆˆÁ©r°·Ã–­a(,,Dff&æÍ_¤Rî?Ô{£ö¡°°R©ë¾[Q£ƒ+¬O"‘àFF²²îLMMÅÅÅHI¹„É!SË­3{îdfeA*-¾ýàêÚ]YÖ·ß`l WÎÇùëΕKA/cˆß lÜ´J‹°'2 7®V]Íš6…‡‡;>? ½}zÁØØø•m·ªÇÄÙÙË–¯‚¿¿ŸJ :d0¾]½N91¼&Ú¦é|ªLUµ6m;w233!•aWD$ìªÝDD N„Å‹æ!;;ÝÝz·ß`øúöV) …üü|¸õð†sçn8˜„¥KVXߨ1A8È_y9nႹXµz-lí;aò”i3&¨Ü:ý|{÷ï tîÒ'NbâøÏ”eË—-ÁÁCGàÒÕ –V6ÊO^Õ„À€Q …pu÷D7×8{ölÞ¸¾Úõ}4ò¤¥¥W8)¼¦¶[Õcâìä™L¿Áƒ^ƒñäÉåÄðšh›¦ó©2U=ÖÚ´ÕÇǽ}ÀÝÃwïÞÅâ…ó«ÝDDu‘ &&Fááá›7Püô²P¨¨VemÚZ#ýÚ¥lgø]uºåö_aÄÈшã½~jK+þ½Q qªýo—\^:íB,£•EkÄÆÆêÖäðšüG]ÛÆ7’W£¸¸Û¶…cÐÀì ""ª5ø©:¢Zɹó{°µíˆ ë×±3ˆˆˆÁ‰¨2’ϰøŸ "¢Z‡“ɈˆˆœˆˆˆˆœˆˆˆˆœˆˆˆˆœˆˆˆˆœˆˆˆˆœˆˆˆˆˆÁ‰ˆˆˆˆÁ‰ˆˆˆˆÁ‰ˆˆˆˆÁ‰ˆˆˆˆÁ‰ˆˆˆH÷èÔ—üZZÙTy~q)iKçFœ …Öm‚XE— k5ü^Wݯ²mºÔ¦WåÈÏ¿¼¶ºêZ¿Öæ¿"Ò="vAåteDŠ#kuÛç_L¬±c¨©®ºv®ðÜ&¢×©ÞÍqš={6âââx䉈ˆˆÁ©2‹/Æ•+W`cój†ß32nbÜÇŸÂÁ© ÚYÛÁ§Oý%ZY~ô—h´³¶ƒ¥• ì:# h,RS¯©Ô±q㸺{¢í»ÐÎÚNeý繺{âλÊçé×oÀÒʉIg”¯Ý¹sn=¼ ÜåŨ¨ýððôU»Žå¶“››‡ÿLŸ Gç.péêŠmaá*Û.))Á¢Å¡pêÔl0lø‡HO¿^­v½Ì>iÓ_+W­F'—îppê‚ÙsæC.—kÝ/Òfùж÷2ýRvì^¼L\Ѷ¦N›Ž=‘Q*uìÞ³S§M¯°.uÛÓöœ}qÝð»`ïè‚¡ïÐê8À÷ë7 »[OXwpÀÈp##£JÇñan.º»õDAAÊz………èæÚss5Ö£é¼'"ªWÁiÍš5¸qãÂÂÂдiÓW²ñCàîî†S qH:€Aûã¿3¿yV>!+W„"-5§âàíå‰ “¦¨Ôñkl,~Ú²×®^ÄÊ¡?!Dí¶œ‘tæ¬òyøŽhßî]DDìQ¾–˜tœÔ®¿oÿAlݼ©W.”ÛÎ̯¿—gOüv2‘»wªÔ 7mL&C|\4O€··'–„.{évUgÝÊú+lûXXX áx ~;y "‘kÖ~¯u?Tµß*ÛÞËôKÙ¥¨´Ôåï•më›Y_᧟”aöÚµ4üôS¾™õ•Úº*=§µ8g_táÂEœ<‹Ð% µ:ÛÃwÂÌÌ GÀÙ¤Sðéåñã'Wé86jØžž=±=|§Êëá;v¡§‡;5l¨±Mç=‘N§Ÿ~ú þù'àôéÓX·nV¬XQåz*›^îMuoFޱX ccc ''GYnbbi¡`hhˆ‘#†ãðAÕ‘¹³gÁܼ —·d2Y…ÁéÌÓ7âÇãСŸ±úÛøõ×Xåÿº“’ÎÀ¹‚àôÕÌéhÑ¢…Úí$&&ÁÝÝúúúxë­ÿÃŒ_ª¬±;£`dd‰DŒ!~ƒœ|þ¥ÛUu+ë¯ð»àåé}}} 8h4öDîÕºªÚo•mïe׋*Û–D"ÆâEó1uÚt‰ýûöTé8@àè°ióV<~ü “ɰqÓŒþH«z4÷DD€OÿñÇñÙgŸ!887nÜÀ´iÓ ¯¯_åzª:ñôìÙsˆ?~·páâE•²E çaÜÇŸâÀÁÃð÷÷ƒž@^^=U–iÙ²…VÛqrvBØöÒÿ]>r]ºtF«V-Ñ­Û{8pð0†½?IgÎbô¨Õ®_Ùvrr@$zvjØX[«”ß¼y Í›7S>755EN΃—nWuÖ­l?ÒÓ¯ÃÖ¾“ÊkB¡°Zýý²Û{ÙãUÕ}³´lƒ#†£·ïLýw,-ÛTëïH›söE-Z¼]¥¶¦§§C,¿Ôq sØØXcOd†óǾýaiÙmÚ¼£U=šÎ{""N111¸yó&Ƈß~û áá¯~¾ÂŽذa‚ƒàêÚÍš6…‡§²¼§‡;öGíFòù ˆ‹G|ü `àÀþ•¾!¨cÕÖßû¹¹yß± “&|ðê‡e+VÁÇÇÙÙ9Ê7rCz•6Êåre[D"Ím*›+ò2íªÎº•õWII .§œCƒ *rÕ«Ú keËW¶½—=^ÕÙ·Òå/uNksξèÅc¢©­2™¼Fö‚GãËé3á?Ôëøÿ™öï*ÕSÕóžˆêžãdnnŽC‡aÆŒ000xåÛ[°p ·oÁ°÷‡ÂÉÑEEEå–iß¾†óÇ‚y³ñýºoòïê]ÐÓÓƒ½"vïÁý¬ûèܹôÒï½×YYY ‡££=A•ë611Avv¶òùÕ«©åþgï^¦òy^^^´«¦÷Éܼ²³s^ãùVñö^÷¾¥¥¥cÛ¶íøùð>„mß´´ôjï×Ëž³šÚÚºµžT ¢šêÑtÞÕ‹àô:-\0«V¯…­}'Lž2 cÆ©”/_¶KW7XZÙ(?±Tíàää™L¿Áƒ^6ƒñäÉ­'¿hñ¢yÈÎÎFw·žðí7¾¾½Ë½1 …B¸º{¢›kœ=û6o\_#íªÉ} …üü|¸õð†sçn8˜„¥K¾²ã¯i{/³ocÇaà å¥ßʶõõ¬Ù9ò弦6mÞÁ‡ŽÀ׳f«­«25qÎjê—€Ñáò•«pëá Gç®8rä(¾]µ¼ÚDZ¯oo´jÙƒ ¬R;4÷DD ˆ‰‰QxxxàfÆ ?½´$Vo^D›¶ÖH¿véÛ~W•‰‹Fи Õ~¯—ËKG­Åb1ZY´Fll¬nM¯É¤Mcè"""ª_ø]u EDDD¤%Îq""""bp""""bp""""bp""""bp""""bp""""bp"""""'""""'""""'""""'""""'""""'""""'""""bp""""ª¢š®0>.š½JDDD Nšö(18i#-5…=JDDD:‹sœˆˆˆˆœˆˆˆˆœˆˆˆˆœˆˆˆˆœˆˆˆˆœˆˆˆˆœˆˆˆˆˆÁ‰ˆˆˆˆÁ‰ˆˆˆˆÁ‰ˆˆˆˆÁ‰ˆˆˆ¨©ô»êâã¢ÙCDDDToŽôk—ªœÊ* """" ÁÉ­‡W¥©‹ˆˆˆ¨>á'""""'""""'""""'"""¢ÚLÄ. ""ª,­lØ 5,-5…Á‰ˆˆHW) vB ÕZÁ‰ˆˆ¨Žá­‚^ÎËÜà›sœˆˆˆˆœˆˆˆt_Ù¼'þÔîçËÄÄÄ(<<úk…ËoÛijç1zä0X¶iƒ³æ!çÁƒzÓ_ NDDD:J›”Uë~„GW‰ñèQ.† î#Ñ1jÃÓæ°¸zí:öõÁýì,¼ÙÜ vv°%lW½é/'"""¥Íʃ`blŒÜÜ\Ü¿wîü…!ûãhÌ1•ð´9lRSÓ1°ooܼ™¼¼\<..†±‘îefª­»¤¤ÛÃwbßû°îà[ûN‹sç’k<°¼®þÒ„7À$""ª£´ùT݈aC°ïÐôíÝ ™™w‘›› ==üôÅ€È̺ki70 üùçM y³7! {,“?ÿ¤\½ …“&OÅÇ1ë«°¶n¢¢b>ò3‚Ç~‚ukV¡S'ç:×_ NDDD:J›àåᆢ¢"8ü3úûú +3=Â]Á ä‹=Q‡`h(ÁÀ¾½qû¯?QPP333ˆDúØyÿ 6íÊÕ»ÿÀ!Ü»wÛ~Ú¡PÐ××ǰ÷‡BO Àœy ±ooDë/Mx©Žˆˆ¨ŽÒöX¿>½àãÕû…Y³f022ç äþŠIDATF~þ#üý÷] ê>žøóö- Q£Æ50Àø$x4:9;¨­s箌 T†¦ç <Ëþ·Díz%%%X´8Nº¢ƒ­† ÿééוåG‰F;k;XZÙÀΡ3‚Æ"5õšJ+W­F'—îppê‚ÙsæC.—×h18é ªŒ ôëí>Þ=±ÿÐÏxã7 ‘HŸŸ¿ÿþ ·oßF~~>Œ!écOÔA|8ªÂÐ))—áèh¯¶L$¡Í;­Õ–mÜ´2™ ñqÑHü=ÞÞžXºLY>~BV®EZj N%ÄÁÛË&MQ–‡mß $Áo'A$aÍÚïk¼¿œˆˆˆtLUGP|}¼àëí‰ý‡AãÆo@l F~~>ò òahhýbDî?„>ª44@AALMM«ÜæˆÝ‘ ###H$b ñ„ääóÊrH ¥CCCŒ1‡F)ËÃwì‚—§ôõõa``€à Ñع÷•ô—ÚPÈÓŽˆˆ¨nªÎJæýlHÄb””” ¨¸øée.Š‹‹!14†¾>îçäh¬§aÆxø0ffMª´ý›7o¡yófÊ禦¦Èyî&›‹Îø?чáïï=¼¼z*ËÓÓ¯ÃÖ¾“Jê.ÖT18鈪~JlãÖí¸xù*\»uÆ_ÝÆãÇOаa#ÈåOðèÑ#ÈerxõpžCG}zyVXWÇŽ6øãÜ9x{©_&&özz¸kÕ®çç(õôpÇþ¨ÝH>±qñˆ?‚‚ Ø@é©Ë)çРAƒWÞ_êðRQU•°aó6œO¹g{Üùë6 add¡P##èëë#7/9²Ñí"÷¬ôムĦÍ[QRRR®ìÚµ4ìß@ízæ¸wïÙ}¡òòòÊ-Ó¾}; æófãûuß"äß_*ËÌÍ[!;;ç•÷ƒ‘ŽÑvÎΛ¶!åÒ89ØâîÝ¿JC“¡!Žþz Ñ1ñ024rsâAN\»¹`÷¾ý†§~}ûÀÈÈŸ|ú.]º ¹\ެ¬ûøiÛv|>~¦„LR»Þ¿Aظi •aOd7n¬,ïÛo0¶……£  ð×;‰ž] óꇽQûPXX©TŠu߭ǨÑÁ5Ú_ NDDD:H›”]‘ûpáÒet´yW9Òdhhèé!îÄI|2&ýûöF챋%Ð×/ Oyy¹èÚÉ »"÷áÔïIåêX»z%œ1)d*l::¢·oœNL†õkñöÛo©mO`À(…B¸º{¢›kœ=û6o\¯,_¾l :—®n°´²Q~ÊîùõóóóáÖÃλátb–.]Xcý¥‰ &&Fááá›7P\T <‰ˆˆjK+( ¤_»¤|®) |ü)œ:¢¸X ©T ˆÅ†8}öÆŒ G{[À/1qØwègtv²Caaòó иñx˜›‡‡y:¶Nô_Zj âã¢4n‚Æ0%— b±­,Z#66–“Ɉˆê*mFP,Ì["+;Mßh…B…B€“¿ŸÁGÇ¢µyKde݇ Øwì€üü|‰ƒ½ ô  P(ðàaÚZ¶B¡€@ Pšlcmê/Mœˆˆˆê(mFœÆÿk,¦Ïš‹ÇÅÅ0Ð×GzF*FóÃ;­ðàa.dOž@^R@€Ž6Ö(*.F̱´jñ&þº› øpØZ†jº¿4á'""¢:J›ÐÔ¬ æÏú/ÌÌÌ •áÓ±p°í¡H‘H¡H„Oo ¡G÷nxð— ÷øñcö Ñ $ líì —~EÍãÇœˆˆˆˆÔ‘J¥ˆŸ}¯ß“'O 2Ð×Çý¬,ÈåreAÙ-Ɖˆˆˆê]X’H”—éìììРAÜÏÊ‚¾>ô6Ü’““!{ò„½EDDDõ:4•Íizþ2ÝãÇqîÜ9XYµè€@O€ûÙÙì1"""ª·^œÓ$‹¡P(u?B‘ÀÓOÕ}—Ú@P\ü·n߯£ü|Èd2öÕ¿ðô44Éd2äçàÖíÛx"{‚wZ·Ï}åÊÚ«B ÄÍÿTdçä°çˆˆˆ¨^kÔ¨:9;©Lüþ<>ŒÅo×­IEND®B`‚kildclient-2.11.1/doc/C/images/we_triggers.png0000644000175000017500000007566311405233117016100 00000000000000‰PNG  IHDRŒÓÃç pHYsÚk¥óÎtIMEÕ !#šòìd IDATxÚìÝy\õÿð÷ìÎîr‹ˆR©xáA*%¢æ ˆ¢bæ—„¬¾e*¨™þÐ2/4“ü¦•Wf"¤âI†`æEž¤ˆJ‡7 °âž3¿?¦¦mYV<@Ð×óÑ£Çì{?ŸÏ Ÿù¸ïýÌÌÎ0¾ƒ^%"†a8Žˆˆçyžç‰èÈþMô¨Ý®à’Ï«o”ž2)ã×RÞãY9q<ñ†A·<Œ+G7r§7ðGGÇq<à ›ˆxžRõá´¯kcõGÿм¬Õxì‰'»“4È˪‘Do ÃI$ô ÀCúóÈÎ@zŽ7xžc˜Ç‹ [LÕŽònësóõ%w¹Â ÎÀ=àʬdôŸmì­$ûs5GÿÐ>Â?ãì¾Ïí*.9::êõúÊ&=Ÿë>Äl±¢+ç‹}Qªððyy:ö}­²–1“|m­™W´iÔÈÙ÷ÅÞŠq°bžsa½šÈ­ÿ:TÉñôûOëôÏó ûw¶æ§ýu ü¸îïieo%ÉÍ×ÿü›öÑþaž}'\K‰1|¨T*Ý“œrûš§s3O“2š;*öTƒDѶïøþÎ5T¡á·œ¨ŒìiÛÍC~è7í9 æJïò¥wéj‰áÈïZñT£„¡+MÆ·¸ù­8æÅaDt8í¡Â##}•=_\á>¤i[ …º1ª‹uײ#¿iSÏ•Ier糈xª‘ˆV¼H‰¬0½ÞÞŸ«9ü»ù©pûÆRïfRGkÆFF•:ú½˜û­ˆ»tÛÒ,¼µ+KDçoé +jezkëÖª¸IïãY®=ëfŸ“ò¿vÃfÒßâú±ïÜ4­Úzúè«YÿÒŽ&‘»J«˜±«T\hÕˆÔV±æç;b™Ùƒí¬%±?–VpR Íâ —2:ÿÉeŽ\í$ÑìUw¹…©å÷ü‹ÄµÜ3XoýxQÓµ…ìÙFRV-—°©ÿê >èÉz7«Ñ'Òé†ý—ô½úŸ%† Ç*#{Ú:Z3ÿíc;ì‹á,Ã0Âô:ç–þ§ƒˆèСCî^~A^Ö=ž•3 ù]»;û.ÇSÜ+ND”[ ·b™åéå–·A×@~ w¥ÄÐÈNâj'½Q¨% ŽŠ@½p[uGÂ0Œ„±VÈl¬¤ Çq<‘ãõƒVkàx=ÇÏóŪJšeåVõ¡úRÙ뺮-d¬ØŸS7Qõ®•Ò29k+‘Hˆxƒc%…Œå8^£ÓsϲR©Tï"-½fPR•Ïe+†ˆŠïp¾6ÊÅÊŸ œñÇöY,¯‘0ܵ#ñ®›0•ÅÎ=ßdmk¸jãb#:[µta§ÏYØö¹fÔu¢É\\ø$$¡·‹‰èb¡ŽÈºwïÞK¾þ¿6n“‰hëÖ­cÆŒ0`ÀîOv¶l($ìéóÿ׿báê„›¹Ç?ûtù…¬´_ÙB³sÞ{1_›ëzÜ+¿X؆ÚíÆGG¸^ÁÅFò‡V'‘óŒ ¿Â’rg ǨI§± k`ˆçIÂð ‘AÊé5CÄóTXR^QÆØ)›Ô“ê©F"úkfüë }Õ Íœ¥åŽÒ»¬ÔÎ`àxž8ž$DR©D.“*ôlÙµT"±±R8ËJ¬ ÅeŒÒ¤ºT‘Z_ëiFæØÜñÅÿTY]i`y™L¡¾YÒl`£æk8%åaäÖ’n2"ZûÙ’—&-¬¾VD|±ÐþÕC…ZߪU+{}¡‡3«Óéf̘ò /HK—7¶“”–•ýúë¯Ãúu'¢åsÞz1ìC" êÕiÃŒú1íß¿¿ûÄO»tð7» e†}C7 ­¢}öð9 £ÓKY>)à±»U\ÖºEc­A¯×K¬r†a$‰ÑŒÑé9žçe¬äVq™ú®Lñïœh¶ºB.%¢;wµ÷U½i#G"Òè âÚ9ÙQîŸf«ß*3Ü®àÙIX­žˆèb¡™×ÌÝë<›²¬Tgfî#|#Hd2)+•htzk©L!gueùZGFb挺¾N-Ìã‰Ñȵ´UËåVN[óõš³ý‚㉨¼¼Ü©Ã µŒÛ¿|›óv§io‡KJ?xðúÍüKùêvÍlß7Œˆÿü3ke¯´·"¢’’eÇ"jÞ¼ù…ôoˆ>ÖåÖ¡kóÏp6r¦ê6èÈ=gžua‰èÔUF«“ê9l¨nÞ.㉿«ÑɤRÁ 5HŽ—0 ÷× >y½Þ 3XVqóv™Žs1ɉU«Û+þšØZË U5¯.D2i¥ZÇñ¼µ\ˆ¨µºêª §Y­'¢ür3Ó·rÕmÛ–׺…ku]pùj¡‹ƒíݲ ©«°1~ËÀñR ÃñTÛ‰¦,ï°î·ý×nöwojµZFÃ&—4í`çÞ¹†-ŒßTôÏ_­á¬$NNNvvöªèŒN ääë½Ýå£G&¢}{÷ºµõ=›Ï´kF¯¾:žˆ:Ô¨µª’kd'qvv¶wt&¢«W¯Þ)¹ùWG $·3nÐì6èÈOÉåR""•šÓ8㥸·<~E¥w8§ÓˆH¯çõRNÂ0Ãð<Ïñ¼^Ïë ÞÀ¸¢Ò;N©ÿ÷Ë&ÕíÆïº:Ù¹t½†ÕoÞ.oÚÈžˆl¬þ9i¹úÚ#w>oáÄjõ·RÈd2¦2ë+¦O41÷øé›ñ9ìWÖmʪ´S_Y¼xñ{NŽx¾¿Iᯎ܉ð‘îÚµkŹrÙß÷i¹X¨×è ™ôâÅ‹—/_öÝÿòmýírM#{…V«=~üø‹S¢NUªòŽ}üñÇ2+Ûû²bcc;ŒšSÝìÙì64”¶³„ˆn– <8ž8̰àñ+/¿ËWGóÄqd0ð Ãó ÃÿõÛ*"ž"†Uù]½‚7I‹ÆÕ«SÃêÂÚÿ•Ëîµvaöki†]É*ÏæÝèÖ΃ˆÔZÝÕ|U 7'á­U…F«—J$ óûÍ¢âò»ŽzƒI#×U†Ö®lSéÅ]-íþ\Bck]^“±vZ PëgzÜ)þÝCzQ&“ñ¼þbö™×+ÕUùÕí]‘¦GûG|YøAŠþøçù—ÒfŸù6Ú¸ä‹êo6o?½iªós]ý¦ïü{îK!ë ’§´2hïÚ¹µ²ryVoà'm-O™ñœZuSÂÊ<ž×èøm…Í»rh Ïs­ÿ·å ·Åf…_Þ®0T݆†2Ãv±•Ñ5§ç$:Žá0Àz@Uq—‘+•H$bˆãy†þúåÏóÄD"a‰ ©*îZ9›¦EãêWòU2VÊ0 C$T×é Å¥w8Ž«IubÈMigü®G§Ó¯[X;iõü_ç°Í&ƶ١Sy]Û´³RÞ Öê®–6wu,.«4p¸£Ö w…àxŽá$ qÂmK$†xžaÈJ!“Jž§;j­Ž3M‹·:i üßW‰W;Ǘظ¶t—Ûœ¹xìàÉ´»Z5g ‰„—Kk¹ÌÁ±‘µK ›Æ­¥6L~˜$øþ¼úywY_OÅ¢aŽïmW•«ñáýÄ è`Ö݆ˆýP$±Qkk Ï‘¥K*ꊓ{ÇNãÖ¤¤½­3ã>Þêd|•¸ÁB&ed¬}·ö}œšÞЖêï–qz„U°Ör{W…S3ÖÆ™—Ȫká“ô ¥­¤s3YÜ+N1ÉeÞVcÜëÑe R5@…sØHØ€„ €„ OkÂNJJ’Ëå ÃXYY¥¦¦ÖÙz†ÁÎ$ìšfëñãÇ'$$ð<ÿõ×_¿òÊ+™™™Øõ+a‡††nÞ¼988XX^»ví±cÇ„·JJJ­¬¬üýýU*•8-^ºt©‡‡‡\.OJJ²\rÁ‚;v$¢¬¬,…BѬY³õë×cöýÑétB¶Œ=zÆŒÂò¬Y³bccËËË###çÌ™#–¹~ýzNNNBBBhh¨å’M›6=zô(Mœ81::º¬¬lñâÅQQQØÇð`Ö® ¢5{Ïnèh¡ÜÁŒýá‘SòÆ) È-ˆ'•…HÓ¦M¯^½Ê²,Çq×®]Ê)•JãºÕ•,..vvv6^Á``YV¨e¼ê§YÞ¥ó­<;àö) Ș¥“‡vf×êÅ<*¼,,,”Éd²T*‹ ÙÚXu%Ål]PP°zõêÓ§Ogggc7À“¡N‰Ëd2ñT4%%%‰©W©TjµZžçyž×ëõ¹gÉÀÀ@žç#""öìÙƒ HØ÷-!!aüøñBίÞ:thNNŽ^¯_·n]Ïž=-4rÏ’¹¹¹Ã† óóó[µjv0<êôxppðæÍ›CCCu:L&KHH¯A‹7nÜÚµko¡‘{–ܰaCXXXQQÑìÙ³±ƒ ûs¶V«­wqqIII1 _&&.ß³dHHHHHˆ°|Är0î³Ï7}óíÂçËd²è³ìí§O›bÒì»ïM¿~ýFúþòóódž½öÞÔèm‰[Ðí€6ÀýéÙÓ×äñ¦™‰hð ³fF[&íÜEDƒ ô<ˆˆöìM®ÚlEE½ýÎ{¿ÿñÇÙÓYÈÖ€„]‹#r¹ÜøÉ]âs6ï«5ì¿úÃÖÖÆ$¢R•‘‹‹Òr°  ˆº¿à×ÙÛ‡ˆnÞ¼YµÙÿ›3ÛÎÎ.'çÂìbú¼4p_ò÷ès@®Å|ÉÿÍøÉ]„{}7|ÆÏ&8:: 3㢢bËA":ùËÑËÏ]¾x.7çlÕfGŒvôpæêÏãFŽ®*-3w>ú°ëbŽ+>¹Ë¤©¤¤$¹\.“ɼ½½333ÅwœœœzõꕟŸoÒTVV–B¡hÖ¬Ùúõ뉨]»v—.]"¢K—.yzzb7?ýúö!¢´ýéË–¯°1|(íÚ½çÄÉS­Ûx?±jk£^íØ¹›ƒ½Ã[oF‘ñ ûÞÓå‡ÌÙÂõÀÆBCCãââÔjuLLLxx¸OKK»y󿫝¾úþûï›T™8qbtttYYÙâÅ‹£¢¢ˆhĈ{÷î%¢ï¿ÿ~È!ØÍÅŒèéÝ»u]þÉÊÎ:‘B¡¨.8mê»ãÃÆ®\¹êÕ á½zõütElÕÖ>‹[Ñ÷¥>“"'6ªkWïÏV~‚€§ ³öp­Ù{vëDG åfìœb|àša᥸P“¹Iɪ 8ÐÁÁáí·ßîÙ³§µµµXì?þxæ™gÊÊÊÚ¶m+œã¬ÚšÁ``Y–çùÇÏ;÷Ç œ2eJ@@ö´ ïÒùVžò.¯ƒu=ß­ÇÛo½1vÌè7nèÞ­ëÖøo̱_,³±tòÐÎࢳ‡œg›ˆW©TAAAnnn'Ožã-Z´ ";;»¢¢"“*óçÏnÛ¶­éÑ£ÇÅ‹óóó?Þ·o_ììÇbÙÒEÛwììæÓsä¨Ñ/¾è³pá‡ÕàžÁï°k>Ã6‘””$“ÉL‚®®®éééjµúÛo¿ /.,,tss+--mÒ¤‰I•ÀÀÀaÆEDD<÷Üs:t "‰DâïïÓ£G+++ìæÇbÀ€~ô«IîéagØ“­ÇŸ`÷òòJLLdYV©TO¦—,Y¢Ñh¶lÙlR%77wذa~~~«V­ƒ#FŒX·n]`` ö1<í3ìÈÖâÁs™L–P5û®]»6<<|ìØ±R©Ô8»»»»ººöïßÿ›oLOynذ!,,¬¨¨höìÙb°wïÞz½ °ïûÇÓÊ‹oùúúæääT-0mÚ´iÓ¦™­",O:UX8yòdçÎ[µj…} Ou®ç·:9r¤ð›l€§}†]gàËAYYö.<1ðð$l@Â@Â$l@Â@Â$ì{ÑjµØs€„][ÕS8½½½±ç »¾3{³q$ìG?Õ^ºt©‡‡‡\.OJJƒ NNN½zõÊÏϯ:)–ÿð”xl÷¿~ýzNNNjjjhh¨xN:--íæÍ››6mzÿý÷«{tÏóün¨3ö£àiÓ§ïÀ'3aÇÄÄØÚÚët:18wî\kkë±cÇΛ7û¾A œ‚N€§Ïóy—Î?™ [©TV ¶hÑ‚ˆìììŠŠŠªöDƒ¾õ#ëáÑlRÝ$¨Ï{³¶WQÛ©ú1'l³ ÝÜÜJKK›4ibòVÕõ_Ý â&º¯?Û‰Mj ›õyo>1¦~]%¾dÉF³eË–àà`!"“É’’’*++.\(“J¥·o߯@€§GýJØîîî®®®iii ," ¡¡¡-Z´hß¾½X,((ÈÝÝ;žuzH\<…`|.ÁxyÚ´iÓ¦M3®,^C!,ìÚµ {0Ã$ì{Í¿àÁˆ?’4þµ$Tí$lóZ·ñ2ùïZ¨a°æÕÍÛšð݃­¢¶»®]‡.ÃG¾r6ûW …‡e²PK›dáÝS§N?±cçn̉¹~ýFuÔî=ûZ·ñÚ³7¹&ýóØw+X–š¶¿]‡.­Ûxuèøü¡C‡ëù*êl8!aC¹|ñœñõv;¾+((¨‡]w.ûdèèWfÏžk¡d^Þo& uìüùœÉo½3aü¸¬c‡"&…¿?{î7›·Ôͪø!uÐÀ?üR“þ©Ï#RÓöOš·rùå‹çb—.|û÷ŽÏjp«@†'pæýåWëz¿4 ]‡.©iýVòlö¯Á£F·÷òîé×÷»m;ÄÂ99† ?á?EEÅ&í”––…Oz£CÇç'†G”•• Á’’’W'„{w}1ñ»m5ߤ™3¢æøqÕ¸Ù­jÝÆkK| =zû¼Ø+%uÿ¡Ÿ÷ìÕÏøo1»aF*•Ž yùï”Su{„¯ùâ áÿf7 u¯ÿ}¾&0hDu»à­ùrí{SÞ lmmýì³Ï,üx~ö߇Ìv 0ËiÛ¾ó°á£ÄOÌè´»wï;~|^ÌGŽ»{W-ÿøãÏ!CGvóñMÛÿ£qÿO‰nß.?á?í½¼'þ'B¥RY–PgÞ2}ù²%ƒ $¢ !‹>þðô™³FQqqñذ×|^ìµñëoj8Ù­ƒU aÃ(?¿ õ‡½q+—¿;eº™1svĤð3§ŽGGO]¼$V,ùÍæø]IßENz}iìr“Fb—}2kFÔÙÓYcBG²b¥\ºlÅðaAÇŽþðž[¥T:‹+µµµ­É†=’®«n{j¸ŽŽvÁS:;7vu^ò<_VV.¬Ëìº"öÝ÷¦OŠxS&“mÙ¼ÑË«ÃtšF£9‘¹/ùû¹ÿ7_Ø F¡P”••9:8X®[ZZ*ì5[[[ñø£íxøÏ 1›šE·oßvp°?"êá*0Æ'Vø¤7ˆøÐÐW¾úâsãø¯¿ž>]\\Lª8::^8F8œ›ó×¹¨FUTT à~·!ÀP©ªôÈÑc÷Ü*Ëf7»aµÚKu¶fuëÞ53ó'ñå©SgF½jaƒ•JåæMN8:göÌI‘o>Ø6ÿôÓÏ]:w¯gìÔÉK¸è×Îζ¼¼Âr]GGGáœ÷;wœœœð¯¯>`YÖøÒÔ´ý,ËZEÎÂñ°š?r¢Vñ%lñîfõ¼M¨ ¿ýö{ÿ~}»u}~Ó¿/0^¸h©F£9tèð ALªôï÷Òå¼ß Ãwßm ‚öß³7Y«Õ®ùâ«ØŒy1,^²ìž[e™Ù «½^’J¥%%%Æ µ·æ¿FLœ°lùŠô™æBîÅæÆ„ÿç5 0dxrò,Ë::9–”¨¬Ó¾OI3&D|9:ä•ïSR‰¨[×çSRRO:=`P Iÿˆúôéuà@†Á`Hþ>¥ïK½ñ¯¯>ˆ[¹|zÔL!¡Š—s[Eôß¾#I«Õ®^óUýYÅ“°·lÙÂ0L||¼åbÞÞÞ|Õb›–§DPKjþ;쥋?ž6}fÿÏzxÇ?ú0føˆ—¿ß5ÍôaÛ³fF-^ëÕ©ëÆ¯7/\0_FM›²ÿÇô^}´jÕò6¸qãÆcÇŒ¾çVYfvà ³ÛÓ·o¿ÞýjoÈÜÏOŸÞ{á‚?ùäÓÎÞ>᯿ñò¨‘aãÆXØàE¸2nU{/ïw§L?1ïw›O:m|‘ÿà'NœÔét3¢§¯ùrmÄoÿßÜÙ&ý#zfô·ñ[;uéž’š6ûýøwZ 4pù²%ïN™Þº—ñåÜÕ¢éÓ¦ìÿñ@ž}š5k*^™ñØWQ˜µ‡+ˆhÍÞ³['Z:gs0cx䔇¿Ù¨Q£xž—H$Û·o·´YµðìR<@—ˆò.oåÙ¡¶Ÿ1'Ž–úÿxÍú¶Ø¤'i€A]îM½^¿}ÇÎ={÷mÞ´¡îWADµúÑ:fcéä¡p†ÍTÏB­;wîddd¬Zµ*==½²²²ê|WX6þ~~~ÿþý ÅàÁƒÅ“ ìY³¦qãÆ®®®;vìHKKkÞ¼¹\.OJJ deeùøø(ŠfÍš­_¿ÞlË_ºt©‡‡‡qƒP?EÍx¿›o§.Ý“’v}üÑüºŠšxÀ„-LUù£{Ý<99Ù××·yóæ=zôHNN¾gãD5fÌ˜ŠŠŠààਨ(±Lvvv^^ÞêÕ«çÍ›—•••››+<ˆSxwâĉÑÑÑeee‹/j™Ý¼ê¿~ýzNNŽqƒP?-[ºèDÖ‘œs§·ÆóÌ3 tµ˜°…äg29¾ççíÛ·>œˆFŒaù¸(%%eìØ±2™lܸqûöíã111ööö#GŽÌÎÎ~çwìì삃ƒÅ;ûŸ;wnôèÑ …",,Ìä“6nkkkÜ ÀãõP¿Ãr¶øË…Õjõ¾}û&OžLDöööjµÚÊÊÊdbm¢¸¸ØÞÞ^(o|=½««+ â Œ¬^½úôéÓÙÙ–nqU]ãÊjîüÐðfØ&9»&så^xA<~Þ½{÷ÔÔTãfߦT*…³ÝåååÆ¿¾µ|²<00çùˆˆˆ={öX(V]ãOÔ ÛÂ̸ªmÛ¶EFFŠ/'Mš´mÛ¶áÇËd²¤¤$ÿ… ŠïJ¥ÒÛ·o7jÔ( `ïÞ½£FJLL2dH 7)77÷Ë/¿lݺõìÙ³«¶)F¬q¨¹ƒû±Ø$ 0¨'{³öVѧïÀ†‘°kB«Õ9rdݺubdÔ¨QsçÎÕjµÂµ]ööö‹/ß rwwW«ÕË–- 0aB¿~ý6oÞ\ÃÕmذ!,,¬¨¨È8a‹mŠ‘kj¨¡üÞ½n'6éI`POöf­®¢nØZ׿Æǫއ|´>¼‡ú6Ô%$l$lxð.è'fØPGx‹Ð?<ÀÃëjãywõ|ošý“q%9>.ž¤O$$l€ú.''§ª<‘½„ï‚ð$A†lja˜yóæ¡,w‘øÿ’’’ÀÀ@+++•J%HJJ’Ëå2™ÌÛÛ;33“ª<•îië%†a,XбcGãN(,,|饗\]]W®\i9h¶“Û@†§4!a[fü ¹Y³fÅÆÆ–——GFFΙ3G(§V«cbbÂÃéšgÓ==½DDM›6=zô¨q>ø`èСW®\9þ¼å ÙN6Û&6::º&µ,ÏÛÄKI1½«{<ÏÇÄÄÌŸ?Ÿpêú~š#¢¡C‡æääèõúuëÖõìÙSx×ËË+11‘eY¥R)>£V¬òö’Y#FŒØ°aƒF£Y´h‘å ÙN@¾‡3gÎDDDX[[+•Ê¥K—nß¾]ˆ_ºt©S§NJ¥R<ÃdöºP†aœœœzõê%|ƒ6¹”T,¶téR¹\ž””$Í^> oÞ¼yøªt¿„ÍQllltt´ÍÊ•+¿úê+áݵkׯÄÄ(ŠÐÐЄ„“*Oa/™õñÇïÞ½»I“&â©h³A³ €„}ï³fÍÚ°aÃ… ¤RiAAŸ5kVDDÄž={¦OŸ.6{ gZZÚÍ›7_}õÕ÷ߟª¿zöúõë999ƒ>…ˆÙËGáNµÑ 5·k×.á±°...)))Z­öìÙ³^^^»¾¾¾999ƒA«Õ›Ty {Éxt‰Ë...NNN>>>–ƒU;#°ïáË/¿4 «W¯îÔ©SûöíO:%Ä<8~üx???ãkbÍ^Ã9wî\kkë±cÇ~ÿý÷Vckk¬Ó鄈ÙËGáa0¡°7kÕ„ ”J¥Ý¦M›¾üòK AxJXCüDª×÷W*•«W¯&¢²²²5kÖ¼öÚkgÏž%¢’’’ªWl𽆳E‹Ddgg'žÛ«nE&³—¦ÔÐ@÷æ¦M›j„§a€5ÐO¤z=ÃV*••áS¦L¹té’wpp(--­I ………DTZZÚ¤I“ûZµÙËG°Íxùå——/_žŸŸ_YY¹téÒ—^zIˆûùùmß¾ýÈ‘#žžž–[X²d‰F£Ù²e‹xn¯†WÏš½| ÛŒO>ùäÏ?ÿìСC£F²²²6lØ ¦áÅ‹6,..Îr îîî®®®iii ,"5¼zÖìå£K½>‡moo¿~ýúªñ:ˆ‡Çf¯ %¢iÓ¦M›6͸ä®]»LŠY¸¦T§ÓmܸQ¼|îËз ài°rꨧ}†ýáòQÀ »Ž<Ìu€¸|ḛ̂0à "¢½ŸÏ¹gœóÆÞ¨›Ö@Ç06ÔË£¿&ÿ~êL»–îGôkólódz¾?TP\úx·Ç×»íÌðQ{2²ÖíØ_ãÚþ¬©‡{³‘“ò'ÎŽóõn;óõ—Y©$¿HµbÓž_/ýùŸì5ìL±dôÿýõÆÃ ³M%, ¾L,cá¥X½¾ °ô‰„„ `^«Mæ¼²zë'ÎmU:ÙOyuè‘3÷fd=ÆMšùúËKÖm?z&{Çâ׬æ~».vב!«¶$¿ôƼÏëÕwÓÇÒ3xLš êÓ}òhÿ²ŠÊÉ£ýÝ›4âyþz~Qu/çÄ}+V‡‡‡sØð8íý|θ >õj“^ÜóÛ½™?ŸÊQku7 Šã6ïóôøëö´v6Vóÿ;6)îýÞgkm%þ /òÝøñ»;?›íëÝVœïülö®U³?›ÑÑó!èä`»ð½ñ;ãÞÿèqö¶Öbõ1½>Ÿû†….b¥’"Cxþ_ßúÅåf•ÿ›óÆÖeQ=º´5©;fHïI/zJöf»–î~»FD¬Trät.ÊùMÌÖbwYè7³;HTóÝg¼®ªcÃì(zÈ0U›Ðdð˜4µ|ã.©Tâ`gòÒO7íùäëÝ^ïG;›ÅÓ&lY:mx¿êçü ÀÒç;mÙw°^mU'Ïg޽(¾Ì/R­Ø´[Xž8²ÿúûC¦.ùáÐÉW‡÷˸89Lž¿zɺí3_Yœ‘˜üî¢-Éß{u¨|}ÔÀƒ¿œeê’#gr_y X½¸´bÚÒ –§k&mGöOùù䇫&µID!þ==š4Z·#í)Ù›ížs¿ðû5"º­* èEDr[uÖ+.Tí·êvÐÃ쾪c£ºQ$ô¡ÉfÛ4ù2av° ½ñHIS Ó²E“w®}ÎÝ‘0–_ï— #úee_šøAœGÓFøôC††—­ëáev¶Ö¥å•fßz±s›k·Šôîðé\_£I|òAµVwät.+ýëÔ¹Ëvmß²“ç³'ÎåMú¿ÿ Á®Zeþò«ÞÀefýêÓñŸ»ê>}A­Ñ>ðwlíqàø¯çó®Š+"¢à=^òéøÉ¦ÝuóŒƒÇ¾7e¬Ô£i£ËWoÑû+6·oÕ‚ˆ—G÷{¡SÍû­ºô0»¯êبn hòŸïÿb§m+f¬˜ùz¯®í­­äGö7®Uu°÷ÆCžªM©Ê§/Ý_¤š¾tCaq©å—ÆÕ»{µNùù”V§ßš|€ç°¡îÇK·ì;(,ÔÏ ‰Ë**ímŠK+„— C¶ÖV•j"r´³Ýµj¶ç¸2aù»&,]—4sÒ¨yoÑë ³VlÊ»z‹ˆìm¬ïªµDT©Ö:M’„Æï‹ñÓÿìl¬+*M7 µGS{kg»ÂZ»b®^íÍVM¯Ü(Ôë Dt³°xÞÿâ÷~>gþê„ÿ;öÀñlóß̪ô[u;Èò»–w_Õ±QÝ(²À«µÇ„÷Wz·{.4°×{¯ûô›=–›qo<äà±ÜÔ}í'Û;wÕDT\VŽÃ'0a‹%•Éd;vüâ‹/„»„2 s¿7Ey€*PKñÂB};.:Ÿwµ›Wë´Ã§…—ížsŸöÚðˆ˜Ï‰¨¼òîkïª7p÷l¤´¢rö§›å2¶¯OÇyoyuÖ§Bu…\¦Ñêl¬äeU>Ç­¸\©ÖØXY …¢ØõIÃúú¼:¬ï'_ïzöf»çš_øý¯+›–G¿>÷3":•ó›…Wí7Ë;èQí> £¨ê1pákÐÆé•jÍáÓŸ¾P“ÁfÜ9x,7u_û¥¬¢Røîëd§3< ú~Hœçyžç+++#""&Mšô0í`g?vCßZ NÈêmÂÞ™~ìµý^èä)—±Ï6oüNXPÒÇ„·²²/¹7i$•H÷ô^5ÑB#ŸÏÜ»[ƒ+¯¼+~>ž8—÷B'O©DÒ«k‡_~½üÛ¦7p¾ÞmrÙè?ão~Ï·k×Òý«ùoN>x¢µG“–înOÃÞlßÒ=ç·kÂò¹ËWúv!"_ï¶¾]Uí7Ë;èáwß=GQu‡ÄË-~?¨:ØŒ{ã!Ù¦l¿=sq o+í߆OfÂþë8˾öÚk999ÕMÁ— _zé%WWו+WŠAã…¥K—zxxÈåò¤¤$!˜””$—Ëe2™··wff&†EíÙ²ï`=¿¥Æ…ß®}öí¾ Ãû}·bƇÿ»ÿÈ™äƒ'„·ÖíØÿú¨ÛWÎÞÿ…¸o÷Yh$îÛ½aA/íüì}á—0BpýŽýCzwÛöé̞Ϸ[»ýA®®]Úøñ»WoþóˆØ; ñïófè‰)Æ… ·~Çþÿxöf»çÜsÿžÉ­OÚ?È×›ˆ¦¿6bá—ß™L^Å…ªýfy=üî»ßQTCU›qo<äà1ÛÔƒí—M»ôèÜfó’©…%esÑÆÓŒY{¸‚ˆÖì=»u¢£…r3ö‡GN©ãyªx[­V¯Zµê»ï¾;vì˜qÜø@·¸éééùßÿþ÷½÷ÞûòË/MJ2 óî»ï.\¸055544T«Õ‘\.‹‹‹ˆˆØ½{wTTT^^Þ“º¿ó.oåÙ!ïÒùZ]‹0Z‚ÞüÈøXß=oS€{c5 bobDÕÓÙ—T2 G——|¼fºù1°G¾Š•SGÕêG똥“‡v®ï 3c…Bѵk×uëÖÕ¤Jrrrvv¶µµõܹsÍ>h+&&ÆÖÖ688X§Ó ‘>}ú¤¦¦zzzãU-}€¢°7ë ²u}3íµ/tò´’Ë.þycŦ=}€5ÄO¤úž°k8§7.–ŸŸïääDDM›65[X©TšDâããCCCƒ‚‚äryFFF×®]ñ¯ Ÿž€½ Pͯ¬ƒÖ@Çðò;좢"q¹Q£F*•JÈÜ5¬îêêšžž®R©V¬X„Z€„ý(Éd²¤¤¤ÊÊÊ… ŠÁ#FlذA£Ñ,Z´¨†íxyy%&&²,«T*s?ö#Ú¢E‹öíÛ‹Á?þx÷îÝMš4ñð𰳫ÑþÖ®]£P(BCC0, ¾©×ç°«;-ƃƒƒ…˼‰(""BXpqqÉÈÈÐét7nn´b\ŸMqÙ××·êoÆà!á*3xJÔöOož„¶Y&LP*•vvv›6m2{•8fØß¦M›°_à ƒ§u a6ÀSâþÎa¯ûêè²­oß~ḛ̀  °àÁÕß§¼ñvÕ ÉUo¯G¼ëà ûq3±…¬Œl HØõwæ}â—c-[yîØ/ær++뜜•§OýÒ÷—… B¡èÛopÓfÍoݼ‘þcŠV«1ió™g[öàODª’â#G~ºuóF Ó²j›·nÞpwoÑ´Yók×®$nýCêƒù´.Fc±²¶‚••wîüÏëo ËÆÏÆÛ<žÚ€ÿ`ÿ¡ÇíÛ›Tt»£°Q W« …F£±¶¶¹GP£Žÿv#ÇqÕ5¥VßMÞ·S*•¶jÝÖßè–o7`”Àc÷„üûÏ?÷lÓ^*•vñîf9xåÊNNΉ¤MÛÆ¿\µ©—_û\ËÖ<Ïk4j…•†`†ýÈüòËÑŸïÚýô©âém³ÁãÇ÷ë7¸i³æ¥ª’é©U›úé§½ûôï×0Ïóé?¦`ˆv˜üØÚø¥¸¬Q«÷íM’H$žmÚÝ.,°üáûÝVQkûw[02 ûÑ{©ïÀÏÊdlaAÁÁÌ-°›ÌŒý5 4Dxø6 a<%îï¶ÙG^B’wé<:3l@Â@Â$lxrö–-[†‰# Ø, a?fÛ¶m9rä¶mÛª¾eü4k$ìÇæÎ;«V­JOO¯¬¬4yWœageeùøø(ŠfÍš­_¿^&%%Éår™Læíí™™)KJJ­¬¬üýýU*•…’HØ5•œœìëëÛ¼yó=z$''WWlâĉÑÑÑeee‹/ŽŠŠ‚¡¡¡qqqjµ:&&&<<\Κ5+66¶¼¼<22rΜ9J a×ÔöíÛ‡ND#FŒØ¾}{uÅÎ;7zôh…BVRR"ûôé“ššš‘‘——'wïÞÝ®];™L¼sçN %°kD­VïÛ·oòäÉ Ã¼ùæ›ûöíS«ÕfKÌŸ??88¸mÛ¶b0>>^¥R¹¹¹""bÏž=bÐÕÕ5==]¥R­X±"((H*•J­V+4¨×ë-”@®‘mÛ¶EFFŠ/'MšdöZq"ÊÍÍ6l˜ŸŸßªU«Ä ——Wbb"˲J¥²¨¨H:4''G¯×¯[·®gÏžJ aß›V«=räHpp°5jÔÏ?ÿ¬Õj«Þ°aCXXXëÖ­[·n-×®]£P(BCC„`llltt´ÍÊ•+¿úê+ %ê¶~n–\.¿|ù²qÄÊÊJ¸"Lüùµ¸",O:UXðõõÍÉÉ1iÖÅÅ%%%Å$h¶$fØ€„ €„ HØ€„ €„ HØHØ€„ HØHØOçΟç±jÕªÎ;cŸvý’ýÉ'Ÿ”••QiiéÒ¥K³³³±Ï »Þñõõ=xð efföèÑCŒgeeùøø(ŠfÍš­_¿^^ºt©S§NJ¥rçÎB„a˜ tìØ‘ˆòóóû÷ï¯P(,>F3))I.—Ëd2ooïÌÌL @Â~½zõJOO'¢ôôô^½z‰ñ‰'FGG—••-^¼8**JΚ5+""bÏž=Ó§OK6mÚôèÑ£D5fÌ˜ŠŠŠàà`±Jhhh\\œZ­Ž‰‰ Ç€$ìÑ»wo³ ûܹs£GV(aaa%%%BðàÁƒãÇ÷óóÄ)5j”¥¤¤Œ;V&“7nß¾}»}úôIMMÍÈÈ0®€„}¼¼¼®]»váÂ…?ÿü³K—.b¼  `þüùÁÁÁmÛ¶ƒ%%%ÎÎÎ&-ˆ‘ââb{{{"²··‰ÇÇÇ«Tª   77·“'Ob@öƒ`Æ××wÑ¢E/¾ø¢T*ã<Ï ÀÅ ƒƒCiiiuM)•ÊÊÊJ"*//wqq‚®®®ééé*•jÅŠAAA€„ý€zõêµuëVããáD”››;lØ0???ãß}ùùùmß¾ýÈ‘#žžžUÛ Ø»w¯^¯OLL2dˆ8ƒOLLdYV©TŠÓn€ú†­ÿ›Ø»wo­Vk’°7lØVTT4{öl1¸dÉ’#F”””|óÍ7UÛY¶lYhhè„ úõë·yóf!¸víÚððð±cÇJ¥Ò„„ @¾o<ÏQÏž=…1BD!!!!!!ÂòÔ©S……:\ºt©j ‚Æ8pÀd¾¾¾999PÏáÖ¤HØ€„ €„ HØ€„ €„ HØ€„ €„ ^ý½5)Ã0Uƒ<Ï3 c|ÃQ$ìÇIÌÊ&ÙžB ï¸8óffÍš57vuuݱcGZZZóæÍåryRR’P ¤¤$00ÐÊÊÊßß_¥R‰µ,XбcG"JJJ’Ëå2™ÌÛÛ;33£°kEvvv^^ÞêÕ«çÍ›—•••›››*¼;kÖ¬ØØØòòòÈÈÈ9s戵š6mzôèQ" ‹‹S«Õ111ááá €„]+bbbìííGŽ™ýÎ;ïØÙÙët:áÝÝ»w·k×N&“ïܹS¬5jÔ(;;;"êÓ§OjjjFFF@@ªo IDAT@^^F a× WWW"bY–ˆìííMÞ-,,”Éd ÃH¥Ò[·n‰qggga!>>^¥R¹¹¹Á[llì¸qã8Ю]»øøøªÖ®]>vìX©Tš€ÑHØÎä‡×âËê~œ-.»¸¸¤¤¤XhÍ××7''ƒê?Üš °° °° °°à)KØUÆeùñ\5l °ÿ–ŸŸß¿…B1xð`ñɘfƒ¢>úhúôéD”””$—Ëe2™··wff& a×–¨¨¨1cÆTTTGEEY /^|þüùeË–Qhhh\\œZ­Ž‰‰ Ç $ì‡Åü›OII;v¬L&7nܾ}û,‰hùòå[¶lùú믅úôé“ššš‘‘——‡AHØ‹ÿ71^\\looODöööâÑo³A":qâDqqñ­[·„—ñññ*•*((ÈÍÍíäÉ“€„][”Jeee%•——»¸¸XÑ–-[fΜ9gÎᥫ«kzzºJ¥Z±bEPP a×–€€€½{÷êõúÄÄÄ!C†X Þ|óÍ“'Ož>}šˆ¼¼¼Y–U*•U¯M@Â~d–-[¶zõj;;»;v,_¾ÜBPÀ²lllìŒ3ˆhíÚµ111 …"444!!ƒê?¶>oœñIk“HãÆ8`ò®Ù X%00000ˆ|}}srr°ï3l@Â@Â$l@Â@Â$l@Â@Â$l$ìú'''ÇÝÝÝ`0ˆžçŸ{î¹'NX®hüÌì¾k¹ vµÚ·oߪU«´´41’žžîêêÚ­[7Ë«Þ~ »Mž>> …¢Y³fëׯ§È ,èØ±£ñtÙlI":}ú´——Wÿþý LÖXRRheeåïï¯R©„`RR’\.—ÉdÞÞÞ™™™1€„ý//¿üòáÇKJJˆ¨´´4##c̘1'NŒŽŽ.++[¼xqTT”X¸iÓ¦G5®^]Éÿýï'Nœ˜1cÆÌ™3MÖ8kÖ¬ØØØòòòÈÈÈ9sæÁÐÐи¸8µZŽHØÿ"—ËÇŽOD[¶l=z´µµõ¹sçF­P(„\.5j”qõêJÆÄÄXYYõë×/99Ùd»wïn×®L& Þ¹s§ìÓ§OjjjFFF@@@^^F a›ŠŒŒüú믉hÆ “'O&¢‚‚‚ùóç·mÛÖ¸¤³³³IÝêJ6mÚTø6P\\lR¥°°P&“1 #•Joݺ%ãããU*UPP››ÛÉ“'1b ÛTëÖ­¾ûî;{{{!ïò<±gÏËu«+ùË/¿‘Z­nܸ±I¥R©Õjyžçy^¯× AWW×ôôt•JµbÅŠ   Œ@Â6ã7Þxë­·Þ|óMáennî°aÃüüüV­Ze¹bu%§OŸ®V«SSSGŽiReèС999z½~ݺu={ö‚^^^‰‰‰,Ë*•Ê¢¢"Œ@Â6cäÈ‘-Z´“ë† ÂÂÂZ·nݺukË«+¹fÍšçŸ~õêÕ .4©mcc³råʯ¾úJ®]»6&&F¡P„††&$$`ÄÀcÁÖ÷ícYã3Ç!!!!!!ÂòÔ©S…ãß^‹ËJæää¯B¬âââ’’’b²¾¾¾&å0Ã$l$l@Â@Â$l@Â@Â$l@Â@¾O;w6~ǪU«:wî,,3 óðí‹<’ÖžÒ„ýÉ'Ÿ”••QiiéÒ¥K³³³…·Œï3a‘¯¯ïÁƒ‰(33³GU'ÇIIIr¹\&“y{{gff ÁK—.uêÔI©TîܹSˆ”””ZYYùûû«TªêV—••åãã£P(š5k¶~ýzq]K—.õððËåIIIÌÏÏïß¿¿B¡ÎÎ{¿3ß™àR1ýñoÙµkW¿ß®ÀþàƒFu÷ÝwƯ¿þZoœ:uê!C\.×gŸ}¦·LŸ>ýž{îY³fMrrò—_~y®÷úøãGŒ‘››û /Tþ©*\àŒ3†~ÿý÷÷ìÙsÞ¼yz£>TÍápL™2¥ò À¥ò‡:ÃÇ 3¹Më•t. ll@`Ø€À€À>/¾øB’¤s]ý[’¤?¾WäM¨Ö=þüÛn»mþüù”€jØÅÅÅ©©©o½õÖêÕ«õûL !rrrz÷îít:?øà½¥Y³fiiiBˆ´´´ääd!ÄöíÛÛ·ooµZëׯÿÑG{ÆÓ¦M»êª«,Ë¿ÿýo½ñðáíZµŠ‰‰ùî»ïô—ËÕ¿›ÍvóÍ7çççŸëM °ÏZ²dÉM7ÝÔ Aƒo¼qÉ’%zãsÏ=wÏ=÷dffnÛ¶Mo0`ÀŠ+„+W®ŸoÏž=:uBdee½ûî»;wîܳgOéeÆÄÄ”y—Ë]º%;;Ûl6ëFc°±Ì›@[!–/_Þ¡Cí7íÚµÓ÷{'$$¸Ýn=Dõ9-K‡&OžÜ¹sgƒÁ „èß¿¿¦iú¾îÊß%22²   L¨ûý~ýMeYÖË¿)¶BÌŸ?ÿá‡>=z´>V|È!_~ù¥Ïç›.¾ lÊl„$I’.ùœPm7e6BÒ˜±Ïý7®€Ë-ðبÉ.÷Ma bÐ6 ° ° ll@`ØØ€À66 ° l@`@`Ø€À€À6 ° ° lp±L”—\“f-)ÂÅ‘$éÈ¡}Ôu{š¦Q‡êüå%°qY¤ÞO.ÔºÔUuïÊ®{T¯:yÙ%@ ° ° lJÙ²e›ßïçì²sá´.Ô%%%kRצ§Ÿ°Ûìö‰1”MQ”cÇŽoÿñ'¯ÇëõyõINN¾éÆŽv»ú\Û·ÿ´tõÊ}ûŒ¸g¸Õj•$‰šÐÃF ´&uíÁ£§,Îi§ÝŸ~:¯°¨HQÊ‚‹–““³xéâðHSÃÄø«×½*)!<Ò´výª¿ìWU•ú\r?ü°æèÉô^wôX±iù'Ÿ~îóùègÓÃFÍ”ž~"2¦ABÓv']þ[æååÙm6:Ù¸h;vîtå»ë?\Q½BMh…î¢}•½gÏžæÍšGDDT‡Ìfs ¨ö–-Û¥tß _Ý-:6_µq¥ÉdqÏ]ô³éa£¦Ñ4MÓ4EQ‹<>×'dO‰ç¼=ìï.nÚ¿$„Él4ŒQQ‘uëGûŸùÅ…žìÜ<ƒ$ŒƒdЄzK¿þCoòïÔIK;ZúÖ«7­{úå§O朔$I’„Á`p8#®í¼`Ù·^¯÷ûî §ŸM`#„G™é ½mÛzB¨ªz&3sþüo£££Ìfs˜=¬Â1hgë¶mK}×ÀÇ«#r¹\O·g゙Ÿœ³ÂFÔxEÅÅŠ¢¸\n9PUÍl6ªª¦i¢u›f×ß`1›ìƒÑh”ŒF£†´´c ¿[=hàé7å;ÿxùooÎ|KÓ´Wþù?ááaŸýk^^Þ¬™¯õëÛGŸaæ›3^|éåæÍš¾ýÖ̸¸X!DNNîÓcÇÿôÓŽŽÚ¿ùÆô¨¨(}Îgž~rÑ⥇ÑŸ†îÝb~øaÍ΃{Ÿ|þÉ3¹™zÑ4Mhš&˲dš¶JZ±q…ÒŸ|à‚öWXL¸bÖ¤®Ý¾;ÍîŒWUM‘ܾO|æE²œØ¤yýØ,f½Ó}ìTƧŸÎ=z”#"¢tf§¦®k{Ýu ×]×fíÚu·ÜÒO1mƃ ø`λÿøç¤àœ6¢ÆËÍ-ðx|§NfîÙ}8íð MS5MI˜ŒF!IBhBûmwŽª•¸ ¼3g½}íµ-;vhBñø£6›mÐÀ[gýïÛzËúõÿñ?/™L¦ÁƒÌœõvpÎ~ýú†………z…[¶lñê+/——dff®Ý¾éŽïðù}š¢ªª*Ëj~Ž»ó :´og6›ããã€Édªú‡òÅ$°+Æf³íÚw02Ûg» Ã#còrsóÎÎæ).4™L>¯¯ô4ŸÏ·&uíâ%K_úÛËBˆððpŸÏgµZsóòôí`BBß{Z5¢6ü§OåöéÕðª$‡Ï_ü{>ë}kq¶‡­(j `ðûüîBwVîÉýHzïýnذ©wïžqqqEEE‡#/Ïœ¹ÂFÔš+ÏÝ£[Ï›:]—ï>.+ß'ü6ÈQOkYVü¾@‰ÇsôȯaŠŠŠ®pqçÝ›—犋‹-,,Šû-˜ú‹ââbývM"I’ÕjµX,aáaÚÙc ªª(ª¦éS £Ýfˆ7 å«—œ|ͯ¿ž¼úê«ô§Ç§·lÙ¢’bØÀ•üyþè#£ó\.O‰GÓ´oü;&2Üb2 !ÿòø£ÑQN“Ùl4ÂÂÂbbbL¦ßWõ¥ËWÜu×Á§Ãî¼céò½{÷ìÓ§×ÂEKîøÓÐ÷fÏ N­°5žª¨^o <<²¸$§ÄSÌiMªªJ’¤ªúÎ[EÈ^¯ßí.Ú»çPD˜£^BÝ‹{ÇÙs>˜0î™…‹ëÃЄݺuY³&õæ›û.Yº¼G÷®å_b4].WtttHǶA2hš¦ÈŠ"+YÖTE?QS!I¢ÂA|BˆqÏŒùŸ¼ò÷—þÚ¨QÓ'OM6㹉ã*)fÍÀyØIF£Ñáp4¨_¿q㤤¤Äè(§ÅbÒ]†(§³Q£F““’ëׯVº‡½cÇÎÒ_ã›ûõùé§ŸÀø±cVý°ºK·ÞMš4N­°5^@–ãbcS®mœ“{¦¨°Ä]Pä.(.((*È/tº\î¼Ü‚Üœüœœ|W^AFFfvvA“¦Í/ºKW¯nÝö»lظiì3Oé-Ï?;áó/¿jÕ¦Ýò+_x~bù—ôèÑ­s×^5 ÚÅž¢Ãi9pà—=¿¸]E~¯¿’2u]»v¾mð ûÕ"åº{î}`ÈAíÛ·«¤˜ô°+œÙz kšVúð•$$³Ål·ÛÂÂÂ*üm¾zÕ²ÒO­Vëš– !ÌfóGÌÖï¹{¸þÀáp”oDmèa[,–°psÆÉYVTUßg«©ª&TMQ½oȲ,˲rðÀ1³!ìÚ”»ý÷á`Á!Ü¥ÇrŸëñ¨õà¥?CllÌçŸÍ-óÁJ¿dö»oÕŒjïÿùÀ¤§§ÊY–e%Ð4ÍçñŸ÷ Â!ƒ† Tá¤òÅ$°êÂn·g¹róJvåž>a·Û ç8Vw®+"…î2¸älvûÏ;vff’²ªªª&4MÕTMU5EQdY dYV„м_NNaï}5jXz_NHŸvõ–ºÎŠÅ‹ @éöˆˆˆJ.¼Zá·¸ÆW›ÀFÈ“$é–›û}úÙçû\g6›‡Þ68<<¼’3@؆⼞zò±¿½8IUªtŸ³Ùܵk—;v´Ûì¥÷åV}M«Íë¤Ñh¬S'>::ªÌ% %I*?8¼*«ÁÅ$°QC~¤ëcÐ|^ŸÝn/3Ê ¸Pצ¤LzåeYQªrÏ(“ÑÎýf.:³FcùÀ¦26jæÞápØívUU¿¡,¸hN§3<<\Ó/ov>’$ŒFS…g¡ê¨Úõ#:à’0Œ «ªÙjI ° ª á²X—ºŠ"€uêÀFµÆé`Ý£z °ªr­ œk‹Ù¤YKêpÑÕcÝ£z5øçË"íð~Šp¡‚{#©Õ£z!ZÀËŠAg„ØÔ :CèQ%;;§¨¨è\3Hƒ$„ÑhtF9£œN*æñxó\yŸ|2ï‡Õ©6›MQŸÏ—P'þ‰'kݪUDDø¹î:ŒÊ¹\®Y³þ¹}ãÆ;GüeذaV«…J‚À~wøHÚÇêõù-KE§Rh&“YÓ´ˆˆˆV­®mÖ$±yófµóF^²,çää;~ü§Ÿv¸ \uë%|»à›¤ÆIÅÅÅéééôáܹ_Ó<¹Y³f×$_sõUÂÂÂX»Jÿ.<’–vüø‰Jæ9ž¶þþ§Ÿ¾¹ýÀñsÂÂ#’’SZ¶°ÛíT6 „éé'ê7høê«¯FDDè'ê±­ŸE*˲,~ýõ¤Åbñx|ØíÛÝ@}lÔXƒÁ`0ÄÅÅ©ªª§µ¦©BHš¦ªª&ˬ¬ìÇ<''Ççóååå<ÙôŸŒŠŠúoÞ4˜ÍæP)‘ÑhlѲEçÎ7†……EDD%&)îB¿¦N:sæLvl|tffV”³q¤#\JøØzucOœÈ¸¬)´ ¨¯W^¯Çï äœÉ1‰€PUM!´¿/\1᯦ˆbçß>Ì0ºÌ}š5Ýïˆ.*ñ˲,ËòóñB«žnwú©#Ÿ¸¯¨¤ðøñcùîò𒥋ü‹_~(ù™.?’Ö½Ý ×ë¯mÚ<¥ÌÒŽÚW¦¥ió½1ø«œ‚I.IDAT`ààÛ—/]*õ)..Þ¿ÿ@|üã&³Eø›6k戌êxcûÜÜL¯Çíñzå@ :&J«5üäÉ“î¢ÈHGù"ü¾±0™fÍ|­_ß>•¼i°V ­ !T¡)Bµ†’‡nÔ°¢ Àýâ OMxÎèô×yþ³õ’{¼ïþúõë¿÷Ñ'²Ù¢ªJ™«{VeM»h!TOMÓY‰ˆ ošÒ¬ÄçuKùžt·…A“¥’K¢^èH`ÕtP§Nèèh=£5M“„¤ Mhšªª±1ÑÛ¶m5øVM{2ùÃ/òäšÊlª¾Ý Ι–v4´ê““µqãÚ-®¯ß ‘Ùl¬[×¢ªr½ºõ%àreûý^“Ñ\XT’‘ñë®Ý].wdd½Jþü+Wÿìk3¦^ô3´ („„Š&T­Äçs—x²³³¿ødÊv{ìnç³_‹iÐñ®»îŽŠ5Ûlf³Y‘„ªªå³ç&tH×SÓ4!$! E„AhB Öªòk˜_Â50Ô±¡Øjqq‘Û]àvºÝ…nýî·Ûívÿý÷»¶MyÔÕ}Uôο5mÖº*çw¹\®ûîuÝõÿõÍü2¿ñKÿ¨(ñx3³N8ðóÞ½?fd¤û²¢üáñ*ƒµ¸ØŸvôøîÝ»öîÝëvÊ—Ö¯oŸ×fL}jÌ8ýiA{ÔèGZ^Ûv䨇ÜîÂ23—ŸZº€•¿¶:­dBÓ4 àñxJJJÖ®]ë:±Ù¦%üí³Su“ºŒ1"**Ên·! IhЍÊRG~díºõBˆµëÖÿyô£zY/YÚö†‡ßuoNN®>[NNî½÷?Ø"庑>”ŸŸ\ß~ç½þ†„â )IR™Ó:.èv#eÖÀòõéÕç–ãÇÓ…»÷ìmÚsúLö™3îâ’ÀM7u<ï3x€vúŒ×Ÿ›8~÷Îíw öú3ËÌY~jéVþÚê´Ž UQ%IÄÅÅY­ÖEÿùj×ÂqolТןÿ<úÚk¯mÙ²eRRRRR’A2hªª©jUû×çŸ6íu¯×;mÚë/¼ð¬Þ¸aãæÍSo»mðŒ×ÞÐ[&O>pÀ­{výØ·oïÉ¥†kÕ‰_ðÍ—!´BZý¶ßBªdjÕ×ÀòõéÞ­ëÆM›…[¶lµÙl›·lB¬_¿±k—ÎúK23³V,[4kækÁÔ'°?‚ªªÑ1Ñ uê$$$$Ô­“pöQÂÁCÓö¼}_WëÒbö÷'Ú°A½°°°2gÇ6mžRúŸÞ¸6uÝ­·ÞbµZÿòø£¡^Ÿèèè:ìÝ»oMê¶wg™™UtìèÁŒŒ#™g~u¹r?q&3'+»hÕªí ¾]~òT†ÝqAƒuX½¦I“Æ&“©_ßÞ+W­¾„S«Ñ:¦iU5 »wï^º|)²ñ-·=صk¿ßŸ››{üøñC‡íÝ»WUU£¤Y ¤Nù5­I“Æ:´»÷þQ;¶oÒ8IŸí‰ÇµÙlƒÞªw¾õ¤4ðV“É4xЀ5©ë~­~}CåŒyMÓ¾™ÿíŸî¸ëŽ;ï~zì„`—ºtf¿ÿþ‡Ã†øÓwM›þúu¸Ë×§[·.›ôÀÞºmä÷nÞ|6°»t餿äÉ'·Ûí¥S?´p !ÛÃVÕôôôââ"}è®$4!¤ýû÷îZ?ý¥ûükyÑ{ Oß>lDJJ‹]»vZ­–2ãi+ìšäæåé›Â„„:¡^I’¬V«Íf ³éãf[mÎôôô˜˜ØãÇŽfeg †èèÈÄÄÍ›_-„f2M¦ Ø äå¹®iÑZ\þ,¦ÿfjµêÑŒš¡¸$Êሯ[wë¶ŸŠŠŠìv»Ãáp8Áëöhš&$ƒ"ËŠRÁ.ñ ×´î¿·O¿[_›>%ØR¯^]!DXX˜ËuvïwAAAxx¸"<<<¸K\BçÊkšÖ§wÏü)21¬[ÿ^Ž0‡7à3Hg;ŠF“1å¦fž"OANVÞ!eä÷ªªZõõ¡|}nìØñ¯ý»ßïß¿ÿÀÌ7ftëÑ·°°ð§Ÿw¼ùÆÙý¡~ÝC!Øš–P§N@ŽÖÏìÒ÷¬=üç;—Îlûá‚ÌÛJ†Ý5²uëV±ÑN›Íj0ªr{ù¸¸¸¢¢"‡Ã‘—çªU²ZÍv›µnRý쬬ºõÄD›#""[·¾zÏž_bssó…^¯Ïá¨RmÅÊUÁPw:›6¬9WÆÿ7S«S[øüŠ¡Ñ5_/['ûJdYQTÕ IŠÌÉh4J’Ð4¡È²!,& j%¥ŠKþäÓymÛ^÷ɧóþöÒ Á1qq±……EññqÁ*y<^»ÝV\\ü_ž‘x5ÚíöqcÇÌúßw–-]rËÀþ‘Æhí·îµ$I&³!?;[ɵÏ|ó‡ã¼'w•YËÔÇn·5oÞì‹/¿nuíµ‡£eËä÷ç|tMóf5ãëÌ.q„*EU ò Ýnw;??ÿÝwß ·Š¿¿—³öˆeÈmÓ““£¢£ÂÂ/à:‘}úôZ¸h‰ßïoöœòSF£ËbAn4 FcƒúuÃÂì 4t:£ìaa uŒF£Ñh°XÌ‹Åf³„…ÙÏ{Q£;kækúÓ^=»I;ª(Ê7ß,¸søˆ23W85XÀÊ_[­[ h²dS¢s½"ßo ˜#{¬l‰ Xœƒ½X³åÌy~ƒ-.1ÌbR«¶£5-íè¶m?~öɇ[·nO;zLoœ=ç¿ß¿pÑâàènݺ¬Y“ª(Ê’¥Ë{tïŠ+¤$I‹Åáˆ|ò‰ÇLÙ–%ß-Îqg‰ßV3Eœ8x<Ü7þ©qñqqV«µò_ÕeÖÀ ëÓ½[×wÞ}¿k×ÎBˆN7Ý8÷“Ϻüv» ‡P¥ªª×ëñz½š&„ÐÀâ%K5¿tU›[z6NjÑ¢EDD„ÕjqåeWøò2Ãkõý–ãÇŽóÌø7g¾õô˜'Ê¿¤Gn»öÚ¿wGhü Qål~há&“1)©aa¡Ël¶DG;ŽðØØh¯×o4X˜½¨ÐŒFc™½ÁB•9 ö¹gÇ?=v–-Ûš4nÜåTáÔ`+m5Ê!4Mõù}¹é¯ŽðµjÕ&<"Òl±¨ªê))).vçåäìøåøé|¿)2¡A\„¦*UYÓ^˜­?¾çîáefžýî[!TŸ@ àóû‚á-„d³[ívkxxxX¸UïU—ÞDʲ\\\l³Ù,Kð8b%ƒ£¢¢æ~4ç\…­pj°€N­†4!T¡*ŠœwêØ_ž©¨ÊâEß{½Þ;ï¼+ÞS\hj”ý뙜¿¿°¨Àœà,?J¼Â×±îݺvïv¶k8êÁF=ø@éÙbcc>ÿln% •Ò`0ØlÖ„„:Ç ›÷õçK.JhŸyâ„’k{ø©Gš4iv®Cו¬Ö§Iã¤àKÚ¶½®ôËÏõ˜À./Y–€Åbš&$¡iš,ËÍš5QÕh0HIÓôñЦªj¹=½—õúSÕDQQqI‰G¡iÂç÷êçŸ3™4Íëõæää:£œŽ‡Ýn9à/ò+&©J]¾ªµ$³­Vk\\ܸ§Ç¼óîûŒ½·nB‚Íf«| Y-_ lÔYYgŽÞo6ôØg{ÙB“ÎŽšÞ½Ö´œœì·»–Èh4ÄÅÇ™Œ¶Ó§s²²²dYvùr„$éá­ßÙLQ!Äñã§SZ¶‘$a0 î4%„‘‘Ž«bv®[æLhh±YÍH×”@‡LfstLLl|‚Ãá,*r*Eõ{UMÕTµ*'#ÔZúñl§Ó9ö™1‹ÙjµrÏ5\£† Ü/½ô²ú>^ýÿ%MÓ¤³O4ý©šÏç7™- 4¨mR‹ÕÚ"ùš›oî¿páÂ?ü—Éd ÈšÏç1 %%žcÇ2ŽûõÔ©lEQúö¹¹{·®v»Ílf³ „±±±ŒöÁÜyk7­Vdÿ?^9f·KƒÙlÙ°éG‹Å"$ÉSRœv<£Ð«Xía™Ç~©—ߤqc2û|™m5›ÍU<Ó6B[Ó¦Mþò—Ç222¼^_U.äpD$&^Z7vüïÙm¶øøøž=º§´l‘~"cËÖmsçÎ×!YÓ´Ä«‡Þö§¤¤ÄÄÄ«#‡#¢òеl…1%¥ÅØ1¡'íð~Š –X—ºêxv‰ll@`@`@µ(À(q—]Óæ)å«~ÌÀÁ·/_ºð‚–Ö´yÊå>Ç °Ô4Á켸MK;z¡K#­Qó°KÀ•QPà5ú‘–×¶9ê!·»Po\±rUrË6×´h=hðíÛ¶mö§+ìU—ïÇ¿ýÎ{ý )=^^ÞÝ#hß±ËÜO>«¼±ÂÏSz™å?@`¨ù¦Ïxý¹‰ãwïÜ~×ða¯¿1So|j̸¿½ôÂþ½;ž|òñgŸ1ØW®b¹N|ü‚o¾,ÝòÚë3{õì¾~íª#GÒ*o¬ðó”^fùÏØj¾V¯iÒ¤±Édê×·÷ÊU«õÆíÛmذië¶íݺvYóÃò ]f¿~}ÃÂÂJ·¤®]?ìÎ;l6Ûy¬òÆ ?Oéeþ—Ÿ °„¤¼<×5-Z7mžÒ<¹UNNŽÞøæÓÝ…îÑ=Öñ¦nûö]ðnÎÈ2-999‘‘!D||\å~žÒËü/?ð_bЀ+ÃétnÚ°Ædú[¡˜˜˜yŸ~ìóù¾ÿ~Ñè‡Û¼qíù.11Ñnw¡Ó™››[yc…Ÿç²~6€6€Ыg÷#iGEùæ›w¡7Þrëà%K–™L&g”ÓåÊ×F£Ë庸wéӻׂoÿí÷ûß}oNå~žÒ*ül  †{îÙñS¦NOiuýÜOæMzåe½qò«ÿ˜9ë­)×=5fܬ™¯é=ztëܵ׎˸±cVý°æÆNÝêׯ<¼]ac…Ÿ§´ ?ð‡a—8€?NéÁÞQQQs?šSf†¶m¯[¾lQ™ÆÙï¾uÞ¥•y|õż¹²,/øö»Ö­¯­¼±üç)½Ì ?@`À%0~âókÖ¤–”xÚ´n5uÊ«•46\13¦M®b#PÍq ØÔÃÆe±.uEÕš$IlTwÜŠ.9Ža@`Ø€À€À6 ° ° l@`@`Ø„8ÓÍvx?% Z¶¦iÔ €jØÝzô¡{ À•Â1ll@`@`€êÂD à2iÒ¬e­ýÛ%I:rh_%34mžR›×Ê‹C`À­vž_³.uUUf«g K’DÀššðS¦BÃ ØØ€À –`РÆjwc§ò?nÙD`P]4mž²dÓ¿ôÇžbOA¾[áñxÛÝØ)3›]âPíb¦Â‹ŠÔò+\„¨§âê¤F§2Μ9åñx=o橬ýsl¨^i½áÉñwéS&ž›6OYÜg0™}Òeø|¾ð‡ØP½8TÇV&­¸gTå¯Ú±cç=÷޼¶õ }ñï'Ožº¬?)B«žÇޤ !4µ²«ª­_¿qÀÀ¡É-Û 8tÓæ-çúc?ýìó©Ó^#°âÈ¡}V}/„v²õ´öfålÊÛ¸qÓäIÿ¼è+ØPc;Ù‹û ^Üg°7+'Ë[2þÇ •ÜßiÛ¶í½{÷ >mذᴩ“ôÇŸ}á¡Ñ£víØ6aÂ3S¦NΓ™™µbÙ¢Y3_{jÌ8½eúŒ×‡»ãýÙïLš<-ØòÜÄñ»wn¿kø°×ߘYýÓú‹EsΜÊÒ—í¼×[vºÝEeÚúyG×®]‚O{öì¾uëöÒ3|<÷Ó%K—ÍšùºÑh¼‚ Õ݃VU~7Æüü‚ؘ˜ '-[òý­·Þb±XXPà¶?ùäãv»½_ß>²,ŸMýí? 2è†ëÛ®ùa¹ÞòÃê5Mš46™Lýúö^¹juõOë"wQÝúunØKÿwË ÞßÌûÏÏ[wíÙ±ÿ×ôSqub‡pædf™×º\ùQQÎàÓØ˜˜<—«tZoÞ¼¥ÿ-7Ûl¶+û7r6T/ÁÝàúÓ«¾?sc¢£sóòêÄÇëO5Ms» ÎH!DnnÞç_|uàÀ/ý¿ã²QNg™…¸Ýngdäÿë’æ¹®iÑZ|e;—UIëô£ªªÖoT¯~£zBƒá÷©Á ɲrø—´oæýççm»Êœ„å,,,ŒŠŠ æwttTpêÞ½ûÞŸýÎä)Óþyçõ×_GPAZWÑ í®_»v}ð鎻n¿c¸þxÔèG„І¿cÎìw*_HDDxaáÿÛ]ìt:Ù¿ëÈ¡}Gí;x`wuNëŒã¿ªªZº]-¥ÀåÞ¾éçÛ÷”Ok!DÇŽÖ¤® >]“º¶}ûvÁ§S&¿"„7vÌ;ïÎÎÊÎ&°ÿoˆÙ€UßëG²g´ërÞ3©F¼Æko¬^³ÖçóýrðÐ__úû¨Ð'=z¬WÏ7\ßöÓó¿áú¶Ë—¯Ø±cgï¾ýõ–^=»I;ª(Ê7ß,¸søˆj›Ö§2Ψç>k+'+o×OûާeìØ¾»Â œ=öèï½>sã¦Í@`ã¦Ío¼1ëчG§šÍf!„Åbyñ¯ÏM|ö…@ p¥þXv‰@uIë OŽ/8pè@~ž>Ĭió”,oI‹¨˜ó¾¶mÛë&½ò×_ó±ÇÓbccG=xÿˆ{îÒ'M›òêØqϺòóôáÊ2q¸G{¢ ÀýÚŒ)zËsÏŽzì„-[¶5iÜøÍ7¦Wâý¸eS»;uëÝ©×ÍÝÌ– íôÉ̃ûdžÊܽcÿ¹.GÚ"ùšiS'½úêÔ#iiÍš6™1cJË–-ÊÏ–˜xõÐÛ†¼üW_ùçÿ\‘?Vú`S‘â½E»¿éä —P“f-Óï¯z`/î38˜Ö¥³¼%çwV­¬K]5êá1•à¦ÍS4M«z}*ïgwëÝ©OÿîFÓïÚ5U;s:kÿî_NŸÌ<°÷P5¹x¸^!Äý×¼knÁ£[ÓÀjAïR—ß”gyKÊ\ø¬Âð«pµ¤tz?[UÔ>·öÐ457Ç¥©ª+¯àdÆé¬3ÙçMëP© Õ(³«˜âµ6›+Ïl³Ù¤jÚšåë FCéIZöê‰À€KqT’ÙÉ-›Œ†½ãuå%¨9™ýËþÃ52­ l@MËìšú§ØØ€À –`”8àŠY—ºŠ"Ø@ Uk’$Q$Ø€*àš'çbÐ6 ° ° ll@`ØØ€À65—ôÁ¦"!ÄÆ£¾òÓLFîä ÀMV´2-[ÏÞÛi7!Œ¡¨BQ…ªQ.® £AhšP5¡¨BÓÎFòÙÀ.ð¨z—Úf’ ô«¸r ’¤hšªEÕ‚=è³]ì× ’0*BV4ö„pÅÉŠ&«BQ5}·÷ÙÀö+z¤k~YH’f¤— À•ìd !D@ÑMè½ìÿqih'«ìIEND®B`‚kildclient-2.11.1/doc/C/images/we_alias_edit.png0000644000175000017500000004257411405233117016343 00000000000000‰PNG  IHDR ’>!©sRGB®Îé pHYs ° aåF­¤tIMEÙ *¦>Z=tEXtCommentCreated with GIMPW IDATxÚíÝw\÷ÿðÏå2 # „%ˆ€à'@©ZªUë¶*mµ®:ú«u b«¢ÕZkk[[ënUuñ¥îZܳ€à”%a²sã÷G€&P[÷ó‘‡s¹Ïçî>îuŸÏ]Ì¡M?DSmBú2$¾oöï´<ÿûãªðþ“ÛW1Œ0Ó o›…R”k¡à%*«Ð$õÜÙ˜8ÃÞ–û–ˆx¡7N!ôäÖŒ˜¦`xZª©S@¯.Ç™,&›÷l]zu9›o»ž *my…¦äö‘çÎé4”¢i{÷¿*[¤Ô!„íÛšµÊ¢ ?ÏQdúê<ìu¨G¹ZWZ®.»û»oß(oçúΧӟ–ß?û+ÕaBÈŽÏùË"„_š¾ÄìÚ#,·X]§M‘š²’0ÖŒŒ¬;gþÜ4GWQ6õÛg¢€—‡(ȼñ· 9xtî$D5þÏ|m*À #Yv÷wï°q¶œ•¾ž9l9ö†”Ýý2Úttý¯ÊÚ ¸¯öd@ !D=s¤7ê5!Ž­£é%ƒFyý·UigvÚðl#þo‹Gp Â4æ]øøæßµÏDÜ;Û2kÏs¯ôËõパbAô¥ëÈqmåÿo<ñu+¾ó·úÙ"µÞ»Yw’*(„"·Ž…¬z+lk¹^†!„ÄžORÏ?`ŠìeaXå¹fÙ›ê)Ø©÷€zÊ"„LÅ;õP]¤æ”:e«1Í(é*JB‰IþùÛ͸µÚò—ÀÞ½'}%¸Ñ  QÁð$µìËõãƒkMU,ˆ¾þØ¿Æ1Úâ»ËPp¿´ê°^»È?Á ÈzT±lÍøBƼEËn?jÝQˆYª¦ix/ƒWˆa:H#DQ´õELoÊ:e·.ivþI«TWn¶ìíÄ?Le'­:Ô³?BèÙ)5ËÖɆºËS—*BÊüLJ¾Q–÷gï:u}ëžÃ†Áßh$ºfœºXyOœ½[P°G4©*{|¯ XE"„¸nUs²$^Œ?ÞE"¦Ø_n|\}ÓEYö­[nAÁ‚Zñ@ʧlŸ Î,SQÙ;>ÚEå°æ<5*l*ÁMÓ†üëéÙ*„b°9îRwWCˆ&Êçg稴F1X¶R{™§£—ÁŽÖ÷ªŽÑV7±ªc¬õe«g¨¿ìÖ…#'­:P'fž-[+ž]¶² !tïÔv„g\z‚ïèLÕwNÀs³¡æ»Ç^Þ1¨êÈNSdEqú£o‡Íìâ ¨3B”A­7õ–¦^ŒBÒ/W7u82|ƒjăA¥Ðv}KÆB¨4OïàÂîÔÓ™»½Øh‹Óf+Œ¾žáÛѦð&ávi®B5©§®?z¿¸•GõPÉÇ|<´‡3Gd~Æ“ßÏ=>X˜[X^ãTŠ:>?DܺKÈÔª'*‹®–+.ØÉ"ÆÌük¿È;8ôÿvâL w ‚,)º¿öGø…"ߎ¥V=}¤,×Ðu^B¦"B‘o‡A‹î–“5 V¾q5î* Ž['QՇ⨊ûŠìŠ%wj%(PUIÍ qDVd•æçétÝUbP„*OY¤Ðj !Û‘/óòY°õ„|nÊ©ÞaãÔZÝsgÖ鉲»¿ô{_©Öþ‡eBIå]ØŠ}|°0» ¬z>m™"aIŸ6Iý{Õ ¢èñom”¸N9ú]úÙ&-–´éÍá{Àî³x6g¤žþŦM¡-¿ž9•jÃ?üßx )Nÿ–EQ]™ Yвšs5å,^ݯî£iB]rÛ ËgÙ8’F=ß1Åq‚}õà²YL¿ö×çÎéÛ7Š I­ÞøŸ—¥éªlx’_ »^{[ž ëù˜4ɲ ÍkR6ïÂVóŸ‹ðR”*ÕM«¬é6'æµ ÿƒ Z7q9FÓtIq´„PnNöæM›à&TuA6€lÙ²dÈ üטÐÖ0?!h²Çz&“ÅjÀ@6X…Åbe=y|éÒ¥¢Â’$¡AMŽã‰SHÞ­} ßðòegg9sºOß~®nn  ÄšŠ¢r²³Ïž=mÃf»¹¹C6¼dÿ¼ðFÿ7;wîMhZär¹“Ôéıßß7ÁúRp lE~¾³³ ´ )rw÷Päç7¨dƒUH’„¡$@…ãxC/”Âñd€—– ÊøÁb‰¨÷7÷ 5¦xWB@Kî7ðÝ"ð_–͇Ûû²¡ Ó}ôŠ‘Y«¿¾ZA×~R§_6<ØU,‰-‰JTv,<{GG ”IDaŸN>¿fd{g‰È£oô©ÂÊ€1d[òNG¹D$öèõýµ2 v 4©l@ˆøÑ²®g—ld¨9UyzÚÄ8Ç™ûïææ+2¿jwî“Oã‹LyMÚ†÷§e\[);4y`LÙ¤£Ò/-\¼)Í€ÒÝ]=znRèwW2óÒæò·O\x¡Œ†Ñ*hRÙ€á‹>îX~BQc`IØç…³ú´±q¦­WäœÙÞÉÇÓ´!„øAsæ½ícoë9:€ï;}vO[a›Ac|JïäèÒ&í<‚øåŒP7ÛÎoøâÙΉûS4°Sà?ÖàÏE3]G®½eâ77û-¬žFýõý¼˜Í ÉzÓ¬W…);<ŸÂX\&“çÈ«ú?e¤BÆ’ôœ´í=å««kÂz)I„„‘GÓ#aß@é7 „»íÔ¥]Ï|þKº±r‚æÆòéÛÙSw_OÏQ&, ­ª‰åèéÚnÙõ¼â¢ÂÊGááH!ìhzÙ€0ûÞ ç·¯ø_¡é¢mÔl¾PÈcèr.o]{Ke]EÜv 3n˜³þô£R½Q£H:¾vÆÂ‹p½š`6 „» [:¦ðÀSð»Æ¬ê—:?ÄÓÙÅ#|ÞE¯‘mVÖÃi¿àÀ!IK#}]œ=‚ßßV$€ÿ1Œ¦é’â"hˆú­]³zÖÿ}êìì MhŠ-˜;w~´5sæædoÞ´ÉÚkÑ"±ÄÒKÅE…ÐîМX› ÐrÀwíYÇqŠ‚Ïlš$’$q‡lxù¤2ÙÓ§yЀ¦(+ë‰T&ƒlxùz‡†9•ððÁý†þ>ü·=†‡îÇíß×;4¬Aá÷¢­âææÞ·oDüÉ… ˆ@Sã¸ÄIÞ§¯››;dÃËÇd²ÛwlßšÐF£Ñh„lxÙÍJ Âíh!àzÈ @6€lÙàߟo°ŠÑh$ÚÐTõL&‹Å‚lxÉX,VÖ“Ç—.]**,€ïÌ48ŽK$N!=zx·ö~ÃË—uæÌé>}û¹º¹10h(ŠÊÉÎ>{ö´ ›Ý ¯T‚l°ÊÅ?/¼ÑÿÍλ@Sš¹\î$u:qì÷wÇM°¾œ[E‘ŸïììíhŠÜÝ=ùù *Ù`’$a( ÐDá8ÞÐ ¥p¼Ùð/«Há?"¡!d|r`v¸\îjz Í ”ñƒÅQåýà¹{ïkèzfö¯´ð´™ ‹.®Œô’˽"W^,z~oMû÷koõÙ•’•7ÀöÙä€&Úo°ë¹+£°¸H‘÷àôê.·MÜpßÐbÛMÿ8îÿt)äçK—~¹ôÑàÿ‹{¬¯¿QœY!ëæoW=Ï;¾`@—‰—•—'vœ³+¹‚‚w# )fCU¶c›7g|ä_p퉎R§_6<ØU,‰-‰J eü`¯¨ÄòÄñ^‘xh|Ní§¦Þƒ!ûØ’w:Ê%"±GרﯕQ•Ý ÏÐ%K't󔈜†ÆçÄn»fJhk‰H,qëöþ†ÛôëÐf”òÖ÷ïÙ*\|âðgý<<ú}vøÄbáÖ1ï}KI!„­Nýuf__¹\î2þëÄR !e¿Ë/Oò—Ëå#*ÒÞþæó³+Ww±íöÝþÏS%kàÝhÂÙ@J%üøÓ=IwÃéiãgî¿››¯ÈLüªÝ¹O>/DÍøµge'ãH¤kí§B„îîêÑs“B¿»’™—ž0—¿}â e¦£¾:u_zø×r ŽD R¥ìLêüåù̧ÙIûF䯵å¡á5¡bƒgí»¿r »i‚ûÀ•ñWöÍ 2Bê+ßÿ²`į·=¼üM÷ä=i*„„âÒ¶…C¶¥åææÆ °Eˆ¨P¤]Û‰˜Cà2qåg!x7šb6Tžû;9û„Ï»»e†Ÿ¸ÿÎ ;fõi-bãL[¯È9³½“§iŸW6içüÃ/g„º Øv~ÃÏvNÜŸb:kæùω}¯“»rµøí®šâ*°áÊzLœÚVq9S÷Ú·¨&eß)Þ¤ØÉݤ\ž´û”Ó<9æfã·þôó +ï(ÿïèø-jÀë¤!Ÿ‹¶ë¹ë¶éÄ¿Yô×÷ób6'$T޶c½*ž{YÖX’ž“¶½§|uõ¬—ÒTŠéèáPc•p[™°r|cqpÊ@!„„‘GÓ#_ß%ËrÔŽ}¥•ßie#ó—Ú\1ÊâþëÏŸ<ýí{“öÞßqzå©-ïÈpxCš\¿ÁÌ9òåÓ·³§î¾žž£(,,Lþ.XPyEÃ]ãâ@­§,GO×vË®çV> WG†5ñÅí]ù%÷•£"MaéŠ=ÃÖ;¤«LÐvæÆež×âRàz ™dmÔl¾PÈcèr.o]{Ke:> $¬âÔmeÔyÊm÷Á0ã†9ëO?*Õ5Фãkg,¼hý}œ¯ù±¼¶£"TÛ–n»Q Ó\ßòÙÆÇfÇÁT—¿X¶÷N¾Ž¦…w¯äs]„ðÕV€f’ ü®1«ú¥ÎñtvñŸwÑkd[ÓU^Ç)ã?†¹‹%Cã•Ïü·=†‡îÇíß×;4¬Aá¦z«¸¹¹÷íòDaâÐTà8.q’†÷éëææÙðò1™¬ÀöÛw€¦4E„Ñh46à‹Û ¬kVÂHð}x€–®7€lÙ²dÈ @6€lÙ²dÖQÆö¯„  €ïam˜3gÏž;wÞÒO80™Ìð°°ˆˆ¾fŽ2A?O¿}$RMøÚ÷½G`oÈPÇùóÖ®]Ëáphš6M¡iš¦iŠ¢hšÖh4111R©ÚªÙFM„fÍŒ)5 A‡$IŠ¢(Š"Âh4 ƒÁ ×ëM/)Šzj UÉ['÷òKD.Á#-ìé94^‰2~p«ðØ5SB[KDb‰[·÷7Ü®0…­¾·cF_‰D$ñí3ã—5]yêêºdé„nž‘ÓÐx%B†ìcKÞé(—ˆÄ]£¾¿VF™Y´.#.úív.‘,hôº«¥BˆR§_6<ØU,‰-‰J „2æžø|h°‡H,µ‰˜¾åŽÒT_ýKÑÝYÜ¥ç÷ !cæ½\BÌ4"„ô)_„t‰¹£Cˆ*»±ÑÌ6š¯Ör›Ô:…÷ì=,P&y„}r8ùüš‘í%"¾Ñ§ Ida•ñƒ½¢ËÇ{IDâÊQ#sca…«ÇšêÙkf÷2 ÍXuz†é¥êÌQ]]:áËòqq÷²rnÿÜçÁ¾4Uõ+);“:y>óivÒ¾ùkgmyh@©./›;äפ'ÙI;†ä¬ûÙÕÊêÔ}éá?^Ë),8)ÔÝ]=znRèwW2óÒæò·O\x¡¬îZhnÆŽŠNýþrfî½]#Ô§S5)OO›ç8sÿÝÜ|EfâWíÎ}òi|…úê²9G\—œNÏËÍ<µ,øÁá$ BèyKáø Ñ^¸^H""ÿü‘G†G‡/(HD\ýS2° ÇÒ6Z®Öüüu6+íÃ{‡Ó2®­”š<0¦lÒÑé—–‹.Þ”f°°‚È£¿ö´ë¹+£°¸È44d®q¬Y {Íâ^²¡y£,xN1MÊžS‚ɱ“º8q¹Ò.“WÎðâV½Äo¿pÕ¤W WÖcâÔ¶ŠË™:„4É{O ¦¬ž"ãñd!ÓWÈ;µ'ÙtØâùω}¯“›Ò&í<‚øåŒP7ÛÎoøâÙΉûS4µ­MÞyÜfÒW‡{8Ž#—,î!@HØç…³ú´±q¦­WäœÙÞÉÇÓ´a,‹(ÏËÌ*Ðó!„±¸L&Ï‘WõÊHճȚƱbÌï5Ë{Ȇf<¦Ôøl`:¸òKTL î+ õÏoïÊ+N­šIŸ¯ˆ'·¯J «šåèéÚnÙõ¼â¢ÂÊGááºwѰ=øÅ)ùµ—§¹±|úvöÔÝ×Ós………Éß L›€;výð›CÓr²n®óOX¸òºÚª¥`öß–þ}$n÷=··;{tzÛ5eWÜïÉ΃»Øc·Ñš•o4‹ˆ0 ý³»Ì6N£5t/ÙÐÒ³06B¹iɶë…:]Áõ-12´Ï™LDŦ…¯(t:ŕћ+"Æðž™ÛîƒaÆ sÖŸ~Tª7jIÇ×ÎXx±¢Î<ãé·ÎûîB¶Z_rïÀŠ/.©¢:#ƒÍ y ]Îå­ co™FÆ+.FÏ\¯HGR«º„bÍRpIÏh÷W—Ä‘!IÈ›¢¿¾Ú‡½ÙC‚[ÞFkªmüÞ²°¸@Â*NÍÑÒõ4N£5t/ÙÐŒ”¬Ê$Y¶s®í¯ÃüÝä§žõÙFȪwØöˆÝ½Hzh\€›<`Â!çE{cClÍÌÆi¿àÀ!IK#}]œ=‚ßßV$¨{Äê´dßþg§wñti;þà Bü®1«ú¥ÎñtvñŸwÑkd[S)APT¯ÂŸÆ´—;{öX”9dÝçÝøV.…éþ¦ éÔ7Ü•…Xn}úHH—È0çzï•¶¦ÚƲ´¼ŽSÆ ~ sKLw™kœÆkè^ൃÑ4]R\ a¥…‹¯_¿^¯×› .—»hÑ¢1£GuèÐÁšÚô)_„E•oøëËNp­²ù‚½ š–ÜœìÍ›6ÁÙLÃ0™LFÃb±llllllØl6‡Ãár¹<ËåªT*73zbºÊ*KBHuyEìäb½æéå‹·U„õ…CFó{4õc4Aƒ„‡…ÅÄÄXúÎ ÇÃÃÃ1¬îu×â¢ÂžðüØÿô~»2 üÖoÍÙþy74kó{4q0¦Ô` …B¡PXº´€a˜T*…ïÌ4Q¦1%è74úÍ\oÙ²dÈ @6€lÙàuß™a£ÑH´ ©ë™L‹Ùð’±X¬¬'/]ºTTX`éKXàuƒã¸DâÒ£‡wkè7¼|ÙÙYgΜîÓ·Ÿ«›ƒq€¦¢¨œìì³gOÛ°Ùnnî /ÙÅ?/¼ÑÿÍλ@Sš¹\î$u:qì÷wÇM°¾œ[E‘ŸïììíhŠÜÝ=ùù *Ù`’$a( ÐDá8ÞÐ ¥p¼ð¯eƒ2~°÷Ðxe hŠ„þ#*^EA㓳Ã}är×FÕÿ|¯º~@ ÈCÎÿVŽëí#•ˆÄÎ~}&®>ž®¡_MT?µ2`,o¢™QMû÷koõÙ•’•7Àö¬á«¨ßÊ­~ñƼÙ`xôsÔ¬SÞóOÎÊÏI9¶4¬ü· ×T¯f¥„‘GÓD ÿ£â/‹í€¸Ô;æÅ™²nþöø+ZÃW]ÿ+mÀk‘ ºŒ Ùmf~<¨­„Ëâ8ú„½·jçºpÛzÏÙÉ’?׌ r‘ˆÄ^½¦nOQ›zÆÜŸ ö‰%¢6Ó·ÜQ–ÅöŠJ,Oï%‰ktr,L¯³¬zg£Õ÷vÌèë#‘ˆ$¾}füR¹ÊøÁ­Âc×L m-‰%nÝÞßp»¢A] Zúë̾¾r¹Ü+dü׉¥TÕ¹°oIJ„úÊån#r«N+Føõ[ýõGo´•ËårŸÞþ|§Îâ¨ò›ßl7zÃm%UãÌhiÍNÚ7"í¬- ÖF©o¬|ÿË‚¿Þzôðò7Ý“÷¤U÷ŸÔi2ÂÖ_ÌÈÎŽPsMT÷v§¯þ||»n³òÛÍý ›\ÀâJ»GMöW\ybZ]qgã{oÍôÎÎãk‡¸ÛÔ¿Üš•kRöŸLZ1¥›”Ç“vŸ²b"ïÌo÷*7­ãìO¶¶³mÕ„?¿ÍäoxØÚúDŽj]z'W_ßFY¬ÐKUkìè­§¶LóvdãLÛVfÏh•rò¶áõ^Ól@ÈF1gÓÉÛO òÒÏkujÖ{??ª?lœü¤•‡;©¿X]J Äë¼tÛ'â3±£ºzÉüÞZp$Ûðê6Ž(Ëшü«Ö-k+Ñä–™¾1·• +‡Ù1§ ²úBY–£vô•V~k•¬z ánæ>jÎ8U/ΆƒS†ÊáÝÃý[££?ìbÿü=Q³r²LØðSª´«!ŽgOiêÆíWz£:çòæ«ÿVWÑfü³åZNWp}sÌu¿wyU\Œž¹.þ^‘ޤ†MÓ!\ a§æhë6êL·´,KÅyc"*6-ÜxE¡Ó)®lŒÞ\1&€gy­¼ÞÀk;*Bµmé¶:]Áõ-Ÿm|üc 6îþ=¼Ús߸±ë®+)«‹ñÚŽì[±uÉæk:]ÁÕÍ1[+úŽôç½ÀÁR…iêæW ô„:÷ʶÅk’ÕÏéLˆmJîçVí šÐ 6_hËÃu¹Wv,YuGt4§lt™1JxaÙÐWŸ~‹ovþrû _„l|&ÿ0×9nl[¹‹{xôÍ«¯üÇùŸÚÑMÞvän‡ù»–v „AQ½ Ó^îìÙcQæuŸwã#Äë8e¼àÇ0w±¤ö¡¹ÎtK˲TÙöˆÝ½Hzh\€›<`Â!çE{cC^Æm“‚®1;>µß;6ÈÛ»Û¬¿üÇú½Ø%–믯ms(jÌWWʬÛîŸý2_zäý oï Ž8GÿúY÷Û4 ²ZðÍçCQA^múÅÜn7®mýËk?i,ÿç7Z»š>OÇï‘¶(ÔÏÃ÷ßÂK­†ù à€&£iº¤¸¢~k׬žõŸ:;;CSš¢E æÎmÍœ¹9Ù›7m²vô]$–˜^\TÍŒµÙ-|«Up§( ÚБ$‰ã »‘²Á*R™ìéÓÆ—‡½êF{ÁÙþ«Õ²¡eΟ¿°víZ‡CÓ´i MÓ4MSEÓ´F£‰‰‰ J¥uKÚõÜÕtÿ,…‘GÓ#BHùbÅÿ+•OéKý~úG7›çg33¦D‡Ã!I’¢(Š¢‚0ƒÁ`0èõzÓK …šªôw?ïÜiáMmÕsíÍèN]?»«U§_6<ØU,‰-‰JX®Ã˜{âó¡Á"±DÔ&bú–;Jê™1šOÉ’?׌ r‘ˆÄ^½¦nOQÓæ+)‹ì•Xž8ÞK"WVU’cazeÕ;­¾·cF_‰D$ñí3ã—ÊuPÆn»fJhk‰H,qëöþ†ÛtÝ¥,´Œ¹F°°ÇÙŽmÞœñ‘Áµ':„B†ìcKÞé(—ˆÄ]£¾¿VFU®Œgè’¥ºyJDN–F“¬h4³+¬|v¶zV£wtô°@™DäöÉáäókF¶w–ˆ<úFŸ*¬ì·Z*ølcš].àeeƒ©£Py¬z†é¥êêÇöw,ïĦ«J!„håÕÍǸcÆÉ/N›ç8sÿÝÜ|EfâWíÎ}òi|‘¥ƒúê²9G\—œNÏËÍ<µ,øÁá$M½‹T¥îJéýã­¬œä=£ V[v]m¶fäÑŒ_{ÚõÜ•QX\T£¯#´0ýÙ^‚ÅÙT——ŒÍòkÒ“ì¤CrVŒý쪪ò•”I¿<Ÿù4;i߈üµ³¶<4Ô9m¾eд¡ôQÂ?Ý“tqç „twWž›úݕ̼ô„¹üí^(3í:uê¾ôð¯åXØLkÍì žmË«¡IûÃðÞá´Œk+e‡&Œ)›tôAú¥å⃋7¥ê-ølcr¬Ûw€¼MY`±@å)[õch¼Î{x”ìüÆóÅBTñ¹œßá-î¿óÂŽY}Z‹Ø8ÓÖ+rÎlïäãiZ ub,‹(ÏËÌ*Ðóáó.Æn™ágƒ6içüÃ/g„º Øv~ÃÏvNÜŸbZžÿœØ÷:9±-¾E¬Y¨Ðº]YÏjðƒæÌ{ÛÇÞÖ+rtßwúìþž¶Â6ƒÆø”ÞÉÑÕ_ðy xÙ`)êë1Tž²U?ŽD ™noOô½½ñDIäØxÛwòÛr&"‹þúöƒð±D$–ˆýg\yZPAZ¨“×yé¶OÄgbGuõ’ù½µàH¶¡þõ¶qò“V޲ÛHýÅêìR¢á•¼¢,G#ò¯Z¶¬­D“[fÂmeB¼úÀ‹S†gbÖBËX³þÿ4~NRü·Úò1„±$='muO¹)­:λõ4_ijj¦£‡C½—£¬j4ëve=«Áà‰ø „Æâ2™ÿ^Onoå=[Æüú?ËÑӵݲëyÿvááêÁì9·1YÑh–we­Ùê]F¯¿ùÞŽ…} x½²a޽§„m^´psqŸ)½EB´Qgd°ùB!¡Ë¹¼uaì-•åâ£g®‹¿W¤#)„U]èàxö”¦nÜ~E¡7ªs.o^°úïêc¥6㇘-× tº‚ë›c¶¨û½ȳP .°ŠSs´u·§ÎtK˲Tœ0&¢bÓÂW:âÊÆèÍcxV¶»…–1»þÖà¶û`˜qÜõ§•êEÒñµ3^¬°®¬5fi…ëÌÖèÕhhAK;ðR²²¬¾ãÒ³×”!$ì:i˜HœÔEˆBü®1«ú¥ÎñtvñŸwÑkdÛzFÿAQ½ Ó^îìÙcQæuŸwã#dã3ù‡¹ÎqcÛÊ]Üãov˜X]ƒÀœßù©ÝämGîv˜¿kiW¥Jx§Œüæ.–Ô¾§¥ÎtK˲TÙöˆÝ½Hzh\€›<`Â!çE{cCl­lwK-cvý­Âi¿àÀ!IK#}]œ=‚ßßVdåµkÍÒ ×mœF¯F ZÜ)€Ú'í4M—5¨ÌÂE‹×¯_¯×ëÍ—Ë]´hјѣ:tèí MKnNöæM›óÙ7&“©ÑhLŸ}3åA5Š¢T*ŽãÖ×&KêL).*„Ýÿ¡ÆdCxXXLLŒ¥ïÌÀq<<<ìý:HhÙÑ700@¡PXº´€a˜™/ÌÐŒ³!$•JáèÍü~È @6€lÙ²dÈ @6€l°ŽZ­†ÆȆ$&^*//‡ÆȆJÿúëÆÍ›...¯j••ñƒ½Íý¼¥é ­Z¼Æü¶ÏÖci»N< )êÙ—Hu®úáÉŸ~cþXì•XkRÏ]G"…° égÃ_%à12È@ ‚¢I•–(¾ødPÄÈyqç²F„»˜ùa8»ž»nCÀë®1cJI xÌ´\t7 ÝÌD73ééôµtê§uKq®xÀ ±$E+ k«SÆn»fJhk‰H,qëöþ†Û4BQêô㈻Š%"±sÀ %ñO‰ªîIÉŸkF¹HDb¯^S·§¨ŸùÙjCö±%ït”KDb®Qß_+«ìâÐê{Û¦ööKDòN£Ö\,!á /)BF©ôH£G‚6´‘¤Ÿ¤\ȼs¬}äbc „hšn@uª”I¿<Ÿù4;i߈üµ³¶<4 ¤<=mbœãÌýwsó™‰_µ;÷ɧñE¦ƒ¼*uWJïoeå$ïU°jܲëµoŠÒÝ]=znRèwW2óÒæò·O\x¡ŒF©¯-ÿEÁ¨}ÉYÙ7è‘´+UoxyÙ` FnžÛ©V)$m4R×O¬vnfïÞ•¤,§Byâx/‰H\ý¨ºÌo¿pÕ¤W WÖcâÔ¶ŠË™:„„ýw^Ø1«OkgÚzEΙí|mՇ܄=ÉšKÑ&í<‚øåŒP7ÛÎoøâÙΉûS4i’w'𦬚"ãòd!ÓWÏhÅ7˜Ál\1.ùúÊñu)—ãúMÞõäÞ¹ÒÜ”ði‡MR–‹™½Þ D·• qÓ3ŒÅÁ)…BdÑ_ßϋٜ\ ¯|­W…iÈÆÉOjcšf#õ«¯–5;5%é9iÛ{ÊWWOÁz)I„Pi¶Úñª‚lY[û2¼à¥eAÑlƒi£È¸q~çLeÑy´½‘¤ëë74ˆæÆòéÛÙ‹v_Ë_*d3{„üVMi Ã`„A‘VÌwµg"T,GO×vf¶bÕ®ÐÁ_R£`j¾Þ`F#Ç”Hµ y÷Íéû¸B§œ{§•Ü:IÚH¼¼l :#ƒÍ y ]Îå­ coU_Ðfü³åZNWp}sÌu¿wy5 rÛ}0̸aÎúÓJõF"éøÚ /V Ä ÛOµ¹²àµŸmÈÔÁ^b6д‘ Ü‚ûÍ8æèŒº›.J“õÜücézƒYü®1«ú¥ÎñtvñŸwÑkd[AÕKÿq~ç§vt“·¹Ûaþ®¥]µJrÚ/8ðCHÒÒH_gà÷·‡F B‚îKw-pØ=¼­›¼ã´?ÛŽóÀÌÀhš.).jP™Ð)Gb£'^{Dê ´‘¤õz}ÒÉeî!3<)MÓ½ü˜?oÙõýŒV:t€ö€¦%7'{ó¦M¹Þ€ãŒL…¡£“¢1’¢IŠâ·Š¤h’DF’NË5à8þl)‘Xb¶¶â¢BØðZiL6¼û¦ï/¿î!-Ü„ãøØ>f€ €” “‡øîn¯P(,}À à f¾0@3΄T*…£?4Wð»o @6€lÙ²dÈ @6€lÙ²dÈ d€úÕýMлwïB£@‹Ò¡C‡çdóshi`L dÈ ¼lLhZŽûiiΟW(H‚hÞ[Š3™R©4,,Ü×ϯžÙ¶}øÛéLl {ŸÃÆGG´úp°dà?Nøßÿ†éíí3›ùß>Iéééã°9OOO³ó8÷øÄåüÉcÂ}ZÉp¼™¢$õ03ﱫv¶¬‘}<Ÿ;?Œ)ÐRœ9ujÌØ±m|}›}0˜ú m|}ÇŒ{æÔ)µZm¾Ópäá„wzøµviöÁ€Âq†_k— ïôØräaAAd RÞÓ<77wº%qssÏ{š§R©Ì6ˆFO´r“ „º{j¿úô­fÿ/B¨•›D£'¬ÉŒ¦é’â"ø³ Ù[úÙ’5k×µ´­ž?wÎô3¥Ré³/õž¿aù„ÐWŸ¾uðàÁæÝÇŸ÷õI„ÐŒÏvþ4Ó-00ÐÒœ¹9Ù›7m‚ë ´(44Á³Œkö-sð`Ü•Ç ˜Æ”hIÉ@·¸‡5† ÑìÛaØð z«@¿è7ÔeP©žD/D!„0 Ñ4MQˆ¢hŠŽ'‹èÛÜΩã¼Ò~ƒN§y@Æ`! !„FEï™ÏápþÍm¼ú²`¡ßð\F•*kÒ$[.Q"ID’4IšþO“¤ñÛos —7ßlNÍ2|Äȸ^]ýeeå|[lX‡iFRk¤ôFJwöþ‘²²r©ô߈#GÎÿú$d 1ý£J•5q’€Ëý'Lÿ©Ê œ¢ˆõëó(Òå­·šM£ÄØÿªû BˆB1¢iétºó"GÜýײ0?\o eõêy*TOÞÿ@Àá ’DA"ˆÊ„ Óš p­–üz]Þ‰“ÍæzÈ#_íj „1ÂL#J†!ÑÿîåŸ#F6è­Ù@Kë7˜UOÞß–Ë5e¯{w–D‚H²2!a˜Ýðሢh‚`h4äêÕOO¯§Âã¡<éúÖqeý³=ßÊ~Ë>¸íò²A¿8ètÚ:/1a†QQF3pì_n«öC6Öo0h´'D ¹\S/Aл·4:Úù«¯˜IeÃdË—K>ýTúùç¦k˜FCÄ®È;_£]æáÅo·“ l…v­ûNßzWIþ+Ý‚ï7Œõâkb4Û¯,¯à<ÚaeeåµÖF †I#a$ÂHãÙÕÖ?ù}ñ ©ÀV( ¼ø÷,izù‰H×ÇËMóЪ¿7Žh×»1ý†‘£  ë7d9l'˜z ,‰Dò駈Á`J$.ß~Ë”J1 “ÅÆòÃÃB¶ÚeêL`juþêÕU•PåFüøzçÕ² ò3N.n›ôÛ ýw,¬ì7ìÿíÅ{ ;®,WóÒ;¹õc0‘^¯{¶ß@#a$bУx}A)ÿZ4pÖõ®ë.åd_ý¦ëµYƒ%–Óµæ!Šÿ\þö¨ƒ7þÞ˜~Ãþß  L ’¢FÓߘ]ôí·¦Sn¦““ü‡œ×¬1BHuêTùž=ÕW#h²êLÉü㫎y®Ú¾ø­6®£Oߙ߬ì-@QêGÇ– i'ÚÙ EmÞ\t"@!剷ä=—®šâng+´“ÿîVEe7@›¾n¤ŸÄÎÖ1`øW—K)„Bú¬ß p²³:½ûíÕ2ê%nþÈQ£_¤8A;®ÄVð¹ö¥h=‹…=;ÛC‰‰ÁÀk¿L)ޝ:"ݶ¨¿—#lÕ/z[¬üð'Õ[I²}Üêa¿^ÔÃá_ØFÈZÔ˜’%Tõõgš ”¿ÿ^°fMeÑìƒ)Šâ’œ«_·;3ûÿŽ4M#¤JÞñw—µ‰9Eùiq£ž~9}ã}=MÓêëK‡ÍMýñzŽâá¾QªS)j𦵷Wÿäï°näfÏß5ïl)E›†ŒêÿJ%kšeÿoûý•MF£qû•åeÜÔŽò0é JÏå1bvžxJ2éŒdòYÉ”ó’5Yy<ŒFFÓ€Â(¯½Úš§¹¾^Ýz iØù£S÷54M#D«“~žÐIÅÿÛ=£5j=÷ÿ¶¯Ao¸‡Pyö[yÇ*EÑ$©éãÁF(pÔÒ@„ÒþýË!Æä³ÃÝlòùÙ'?÷û-IÑû%mú¨Ñczèü§Çp5¶”ÒÑ%ŒDz𢢆øÌ£I!‚F$EId hI)Ú@aFš&F0꜖“ªB-ÏÙöŸ2Sè,ЪL½²ŠÛ+W8½üÆ8o΋lã‚uñ 3´ZÙéFƒ&ˆê`@$‰1Ü®]kÎÃjÓFÏáèsr(’¬Ž\^Y§·ç¨sŠ*´ì:ñ@'nXðù¶„äƒiÖ³X¥Ñ"=‰óYz­Ö4£tZ­F«ÍÏT9†:µVUùôANÚÖnN_TOÁz™*A”A«Ñ²Ù ëO?~‹õËŽm–Z¦þ`Ø}ëËRnJ—^­Ç(„a4(‘Q"hDP´‘Æ42ИÑÂ*Ç”t:í? 5àUV¡RË®<&…Y*¶ƒA£%õ¤mÇè©ö›¢&xØ29€5jKÙ±í^ ZÒcJ€öª?Ó€aN+Vúô©ùº\îsìC&#t:ÓƒÔé(fUpZ÷õÌ=~©¨î/¨in®˜ù‹Íä_®ÞÏÌ}š÷ôÎ7A‚zÇyXîüâ{ù†:=äŸ_~¢ÈÏ«|<=ð¦ð¥múø ï5. lîú9w"hAëJg¤ô$e iIëµDI‰þ±B{/[uó±êR¦êbFÅŸég«/æh®2ðÚGxŽO_Ïœ£T_½)¸x<Ç«7ׄ<ÿ·]`³þw¿½©¤þ•m„l Á,@UöBW^.Љ±}ã S‘’#G2gÎ4]{`»¹œ;Ç÷öÆb"„›>Îe”½5?òñgÓ×Î(7Ê2þܽì’á328|¡ëó®nùâ¶ÊT¤FÙšOyã¶Go¸˜«1”¥\õå5†ñÚ½?ÌøÓ¼Φ— mArüºÙKþR=[‰ùM{®Ý»~ÅÈ`0T¨*HŠ (Aé JOСThf”_ú»øØâ#ÊÏd«oéï+¹:ª”Djá ÄÀΨ½ÚLiäü9˧}ö‰Ê zrî›iËrÎ}S†Wm#ƒÛæýÍ'–;m5rÕ¥2¬ávïú²`1Ì>Ø"m0åå¥÷îéu:~ÇŽ¦¹KI=ºhÆÇÓ¦™âåâ"èÐÁ L„nU% »ž±‡¾ º¶è6nžm‡®I Ñž‡!~·Å_ôKîííêîÕwÁ_^#üÕ«Qg}LOùÁ1{VúŸÑ­µ[à{‡ù~< !nûy¿}’¼l`[WWï.·—ôž$0[ɳ+ΩÇG=¯3Þ¢qš)yWõ„¶Lÿ4£üêßEYçx¾ÑIDAT'î•ü‘£þ»Â˜O#†!Œ0 á Äøç1FbuV›a×sÅ¡¯‚®Î óvoÓkîÕ ¯âVö´Ãjµ §ÕØ'¾ò98nH#Övüø¨†½Qà·}h!–~¶ä³¥K;D’dÊè±ü¿þÂ( Cˆíííwþ¼úúõÌ1cÁ`:2‰§Lqݰ!+*ªlï^ÓáªÔIâvî¬P"y·zùÒ¥õü¶O›îc>~‹(V4bL©¤¤äáÃG'³~&[%ãÔ¦ ¨J¬v$ FU7Fk¤èŒ°¨6«är—³)’‹¤ëO\Ù¿íx¶ß`Ž3~Û÷÷¸ñçÏ3(ŠLOB0 †êײM›4§O32LG2™Ôõôi¡ÄÉTƒÄIj¶æÂÅëß(ãÆOؽkWƒŠ0™,GG‘öšv2óç2׳|aÃI"­Ž&ÅÀƒ8V4ÂÓCZ³ƒ¹\nõî°Ôz/±Ç¿ðÛ?°ð·@ JËãïL&³ÃžÝIãÇ‹ÏÇH’ÊÉaÔ²AQ¦k ¥..Χþ°srª.^TXÐt›eÏîÝ(Åb±D"†a65> •¹0Ä@:Ý.y›Ã6[Šmc#KÜÜ\y<^õîøZoÏîÝI… ?økTõðv»v%O˜ ={#IôÌeÓJäré 5ƒ¡©{wÜø=»w5¢ “ÉtttôññAhj|6ªð8Ç`I:IÍ·Î`p¸\—kccó/oãÂo  ë7TìÚíÚ• @K3™„ÑH·$„ш3™õ†%…=f,MÓÍþßêíµª‹ Ÿ‹ …غys¿þý=<=[Î&?yüø„„¡Ã‡‹E¢g_ðñ)‘whôyËiÕûr‹Ó/|?³UKóÀç¢hY"úõ;|èàÀ··òô¬ÿlº "óñãÇŽ¾ÑoŸÇ3;χC}~:ruÕžÎ\;)†5óAš¦´å Eæ1¡b³IYd-…§§ç›‘o;{fo~>IÍ{cq&S*•ö u‘»p¹\³óŒìãY^aÜ&Q«'Z€cƒ¿lׯ“££w!Ø-‹Z­V©T-aKq&“Ëáðùüúg+(((((h bÃfÛÛÙ9=ïs‹0¦@KÄçóŸ{¸lQœœœœš×Ǽ_ ¸O dÈ @6€lÙà¿ÆDåædCC¨†Íúh´€šþæÍ€ÛJf¼IEND®B`‚kildclient-2.11.1/doc/C/images/we_vars.png0000644000175000017500000010056311405233117015211 00000000000000‰PNG  IHDR‘÷]§| pHYsÚk¥óÎtIMEÕ  &2 IDATxÚìÝy\TåþðeaØÉÜ54-Å¥TL¡·ÈëÂmùeiZVzÉ®+¸¤×›V ^3oŠ âMÑ4MÊ4TDÄ[.!û* ³œóûãÔ¹ÓÌ0¢úy¿zù:<çyž³Ì‰/Ï9Ï|rsBÈ&bˆ˜Á¡¯ðÃk†aŽìKúã1”êòŠtõlI-«gïs«6Rú˳vJÑἆӿhšñx~Þÿ©¢6¿]»v:®Î#ðÉþ£ÍV+»~©ìÄgUrŸ/¾ƒ‹ EÙJ™öíl™¯k]V#lÜ[œ¶al˜'%==¤ílE³ÕVWý³uax-ìf¼ƒ=ÜÏFi#Ê+Ò¼¦iÞcósó`ÂØÂÅbñ¾Œƒ¥7ýœ¼üŒê4Ü©”ü’©É»rßv@Õ6pÛ~¬‹ ´ÚGvâšæNƒa éªê¹ªzºQ¡?õ_ðÌQÄÐE6O»«‰ˆ1Ã?Ï>š¾‰oÓŒw°íeÌÛÃz–>ɪ­¨kþ˜YUXÐðcRÀ3ý8Ž;tâl‡ÑÈl•ë¹ßެWråµÞ£=»ÀÕÐ:"Ÿ²í×Azêš&óbµX*cðlà¾x;ŠùgŽD´þø˜§t ÃHÈ`ÞÙἆïþk~@ÜÝMìï%ngËØI©NKÿ-g¯•±ù¥–Æâ¾®"ºt[[RÛ"ƒ\{÷ÎåƒÏdg¹º¸ttWæüg·1ïÑÇrëû{Ëk/7tîê7@×ÈöãǶ3*ywO•i…w÷T ]$#ºÊ7ž¼#Ôù`¤ÒÑV”ðMMI-+Ñ¢Ñ21£Õs˨ֳäªÍ{NYYÏ.ͬ¹ë [¹k¡ÕúæJC¿ÒŽ.âZ&’ˆÄbüÖày?‰¿W“~#ûM8_÷ЛÿZ¡Oþ¾.6о-óÁöc>+ûj’T"<ÆÎ½­û¶ Á´ý“NÔÃëì,r°«5ºú^ÏzÛsÞ z¢åÓõ*óc©N""ºð›N϶Լ3/ÿ¼Œ¼ê‚Ë"‘HÖÐpí»?EDe×~t­Ïý©˜zEFßuëFcÁ9»*Œ*$ŒsÔïªXéDDÇQʇaãÿžÎ¯½Vªë×AvyÛÛ\¿×ú÷é&3D$3gÖEõŽÝê㤠¢»S7Κ7óó M9¨„qŽf÷Á´Ð ×èKkYO1É”ZFÂàö8X…Ž"[†adR±NÏj´z=˲ÇqIJ¬^Ïêùˆ::0z–±†æµ ÜW?Ôý5È^,¢×Û‡m¼-á:êYʸ¤6}èë­ÔõwkpRÚŠÅb±X,—1z–cYŽ%Že9[ƒ»¶^#¿}Gbz‚|œ$D”_ªÓ¶äw»žþjnêhÛÈWä®Wè]"W…ø· ‰p{¬BiåÃ0"ÆV.u°³‹D,ËrDz–Óéõžåt,GÇ•WÖ5¨%™54ÿ­Jþ–¶_ih›¥ûIrxÏÔøl•¸Z&±‰DDœ^ÏJD"¹T²\ƒVDzœD"‹uÎ⪛z™üjv°aˆ¨ü«çZòû]Ù¡ïþ²s¾„k1ìÍS)®nL]¹Sàk»vMÜ´aµ±}l:9KÞY°´ë“^ÔoªÑˆœÿ;ˆC¯ï('¢+%Z"ÛÁƒ¯ø×ߺ¸¿JDÛ·oŸ0aÂsÏ=·wõîN.¡|Ì~gÑ?‡w‘/ÝZ˜w柬ºœ}è‚d ßí‚7&^)Òݾµî¥,ìCËžÆæÃÏ]p¶ý¢ÑŠd#BÌ€‡¯¤¢ÆÉÁNÄ2jÒÊ¥¹T¢gˆãHÄp ‘^ÌêX†ˆã¨¤¢¦¶šQ¨<¬¤9ÿÌ‘ˆf=ïþûøøÂo:ÓygNâšvâz‰X¡×³G,G""±X$“Šå:IõµX$²³‘;I+lõåՌʨ¹XÄ‘Z×â‘FÚ®}»gÿR{jC^ÂI¥rua…×ó.í{5q`ÊÄÂØí=Ü¥D”øCf¬Šm¼ÕÌ”r¾ÿúZµ®sçÎJ]‰“D«Õ¾ûî»QQQÏ<óŒ¸j•›BTU]}áÂ…1ÃúѪ¯?;ùc" Ô;ùÝ5½„ˆ>Üê'Oõ:7»meœó›ö¹®òî’ï.60ZX"Å/ xèn—WûvpÓèu:ÈV.cF$ íŽå8N*Ý.¯V×Kåމf›Ëeb"ºS¯¹§æž.툨A«¶î⨠¢¼_‹Í6¿]­/­e]¢‘Ýl$Ñ•3w°™ú[.~ž‰X«ç‡ð,Ãÿ] I¥b‰XÔ ÕÙŠ¥r™D[]¤±kLjÌ<`×µJMIGLƒÌ¥“½Z&³±š¦o×èæíg,GD555Ž=FXheØÿÕRÖß›æ¼1MÄБãÇoå©»yÙÿuÒ"úîäI‰R¥´!¢ŠŠ U¯"jß¾ýå#_-á·åÞ#Xb÷¿ qv2Ættm$MGg ýtCÛ ÑŠu,‹a6XÂÒjޏú­T,Öêõb½ˆa9ðÇqGœN§×êõ‰¼°´ZË:ÅDÓæJùï{[YIemÓ›ó%r©¸N­e9Na+ãKÔmcÍùgŽíl‰FÏQQ™A\Me©ƒ}'½žõíàÚØY¸z£ÄÙÁ¾¾úrƒØG"·3\¥g9±ˆa9jéXS]ðöÚá×§•õ…¦¡¡+ɨðì¡ðîÓĦl)ûßQ7°6"GGG…Bi¡‰ÖàIBn‘Îß[6~üx"ÚŸžîÞ5àç"¦›½üò":qâ„‹ï€Ê:ÖE!rrrR¶s"¢7nÜ©(üýDéõ$Svhv´mä+æ21Q¥šÕéY­žåÄÈ|_YÕVÏjuz"Òé8˜1 Ë0DZ§ÓqZ½^«Ó³z¶¬êŽžUéþ<Ù¨¹ÒQn¸ÖÕQq>ÿV›–Öxº(‰ÈÎæ·!-7O ©-ºšzèƒó_Í3¬yôŠúË­;Ïm™íôd¿ wvÿ1¦¨¤âŒ·:ë5õ ÷Î6ÎuznÆöšƒï>©®,Id>}´Üîâ®Ë&týÄ6Žc;ü¿N#Þºåw^ø±´Voºmeœíl/"¢›•¬ŽiY†Å8¬@em=#"‰X$‰ˆ!–ãúý»@ÇC"‘HBĈ¨²¶ÞÆÉ8,6¿^T)•ˆù7kñ͵:}yÕ–e›ÒœrW) ×úx8ž»rËÂÖ‰Hó{ÌÖsÅÆÞëÄOýºtIÄZ^­ÑÞ*©jïÚ®¼ºNÏr ‘T"bY:q® ¾œÈ¨“ÜÛZ_W‰{éʼnÙÜOÙWë§ðnxx²^Q%—7vTèõúvÕŧnœ•xõk¬“ÑJŒJ´zÙ»œ—ÁÿØ~ÐT¾¯©Õ“ûÓ/ŽzúE“?t¤£Ö^zà _ö3¿ 'Òë‰HÚe\\—qq¿Gzö; 4~4»ÖO&azzH‰è·üŸìœ<ô,ÃáMn`ªkë‰#¹L²œÏãO#—®GÕµõ½qXl‰æ…å5"†qwR‘—öšÓ_Âú}Þ¸Ùû®§'Μ¿œyæò¨g»1 étzVw»¬šˆD #1"‘¨ª¦î›3ynY±Q'Ù7´czÛ>)ûꇺfÿ½ÍV]ïǜ˹ÍÉûNÒ󧛌¤Ôç¥jÝ‘^Ù?«Õj­–Ôúl›îá¸d[šXD“ž¶%¢ÝçÕ$±e©NO ‡q6<|5uj""ޤñ/…eb‘X$â_CÍHÄ"™D\§Ö4h´ÇÕÔ©õzÎ(¢5{s–å†bDUÕª-7'¢­áóìFC2G/»ŽƒÖ|}êÛsA}:ùwñîèéüëíŠ‹× ¿ù!/ëû[¹ƒGg±ƒ‡^,gM:9œ×ÐÛKú× ûìëš’šfpù†5‰,Ü1vô»F¿¿SÜv’´i¯ÜæDİÿ˜7Þè`_dçÚÉ[fwþÊ÷ÇϪרY=‰DœLÄØÊ¤í\l;عùŠí\Œ¾­Ä;pIÝ×[:ÔO¾lL»·wVÖ¨ñûû‘ÒÃfr;"ZöŸ2‘Š$öz’r,Yšd ÐZ½{õž´´)5• {=k<Ò}¸ÍÉhÞ¸ÞB0e¤¥‡{÷`GÏß45%ºújV× ’È%¶2¥«ÜÑKbçĉ¤õ°úH­Ê^ÔÇKºî%ǸŒê_KÕ¸t1ŒHò× ÅÄþ¶D4ù_åUÿͶUùÔŽ%1‡?ÒÀ:<Ñ7Ä£“ÍõsšªÛ–kÊÚypb£ öp›?ùŒI¿PGD+ÝåíΫgu ¬¦žÕ5p¬ž‰E¹Hf+’Èͦ,5äd'Z0Jù´ŒˆÒ/¨¿ú¡îVÙ\@±Ì.èIé_ƒì;8‰‰hÒ¿Ê/žþF®ò–)ÝÄrû»^­‰Õ5èîT°Ú» ER‰½“H"·ªæŒr "f×ù:"Z}¸eßÍ̱ì›ÃÇô¶³‘2Dô[{ú—=KWKt¸ŒÚ•½ÈU!rWŠŸî ãSïýç’zñÞ›57ÎÉ<¤ •X®`D¼… ¹Ì}Þ‰„{ãÛâ±sÝ7%©?È¢ŸvxÊ[ÞÅ]ù”->ƒG@ÆÅº}9u'¾9 ±w’;zIlÛ‰¤6DDœÆš‹FoS…ZþÁ#Ã0E• kýÆjT*Uo/91ÔÕ]ÎrÇgnƒ6¢¤V³RWX¥¿~å¼^S'–ÙÚºtËíE2;‘DFŒˆ!ޱšÏŸrª4T¶ÎV9Ž#Ž-ºQqû-§×ý‡Õ«çX–0[© aø´¸ ?­1ËêIS§×6à~8@‹Œ³u®D$~Þ>µN €µ™°¹Š_á\´ ˆÙˆÙ€˜ €˜ ˆÙ€˜ €˜ ˆÙÐ4’&Ö;žu'ë‘<ôyœ€G6fÑ´Ø·p¾Çä_Âyx”c6ÿ맬MC´h»ð<1³³1›(--M&“1 ccc“™™ÙjÛe6 fßCÀž2eJjj*Çqÿú׿^zé¥cÇŽá3°º˜½uëÖˆˆ~911ñûï¿çWUTT„††ÚØØŒ5ª²²RÇÇÇûøøÈd²´´4Ë5/^Ü«W/"ÊÎÎ0`€\.÷òòÚ´i>c@̾gZ­–ؼñãÇ¿ûî»üòüùójjjbcc,X Ô¹uëVnnnjjjtt´åšžžž§OŸ&¢©S§Î›7¯ººzùòåsçÎÅg &ñ»Z"Ú˜þóö©í,Ô;žuxZì[˜S…a¡á3_âééyãÆ ‰D²¬ÏÍ›7ù:eee*•ʰmc5ËËËœœ 7§×ë% ßÊpÓ³‚üKýz ³ @2asÕ«á}è^ó 5#!”ò?–””H¥R~Y, Õø€m¨±šBÀ...Þ°aùsçrrrðIÀ#£UïK¥Rá±4¥¥¥ ÑW¥Ri4Žã8ŽÓét:¹kÍÐÐPŽãfΜ¹oß>|À€˜}?RSS§L™Â‡ma9¿*<<<77W§Ó%%%Zèä®5óòòÆŒ´~ýz|ÀðÈhÕ{ã[·nŽŽÖjµR©455U˜’–0iÒ¤£GvëÖ-%%ÅB'w­™œœø0 fߨÖh4¦åÎÎÎ4*4œ5&,ßµfTTTTT¿<{ölÓ mr— fb6b6 fb6´ß.=ùÿºtëíßïÙ×ßx«²ªÊšwøûï³'M™jX2:|œo—ž?ç\J~ιàÛ¥gXxDÿžÖZn€˜ -ëê•‹9çˆyyræ¡Ã|ð7kÞÕÉ/O=s&Û°ä…1aD´oß~¡dïÞt"3&¬)~õÊE\€˜ m‰\.Ÿ1ý/Dôí‰D¤Óé>þûÒ¾Oì×`Ü¢ÅZ­Vb¾2uÆ‹Q…wïÞùbtÿ6~þÕW)Ï ”ˆÒvï!¢‘#ž5ríKÏj¾&õÿþïµ®]»ð˳Þ|½w¯žDTXx›ˆö¤ýûÉ';&¬\óî{QII‰Ð*6vzß¾þDtûv‘åÍÕ4kì˜púã–8ÿï /„[غÑ!XÞÕÙoÏ5r$¾ÛçÚÚZ"zãÍ·ÿûË/?ŸËþzÇ6\Z`1›1 “É ßñ%¼”óžzÃç÷°øvéÙ«ÏÓ[¾üjLøè¸¿- ¢ââ"êÿLPÿDTXX(T¶··3lëØ®Hôû…çääÄ/óÉe“7o‰|1úÚÿ»téÇô猳ŽíÚI$"âoh[ØœQM³F‹Å3×ÔÔdúF,eaëF‡`yW”J¥‚ˆª«« ›˜Ýç¿-ø@¡Päæ^þàøà!ÏïÏ8€« sÿùƆ¹$ÞBþ½^[·nå_‚|àm‹é<,ggçâââ³?œvpP­2|͹ek>ù}²:á®5-l®)œœœ;þmÜG¯©©:$ØÉÉÉÂÖMÁB媪*‘HLDNNŽwÝç±cÇŒ5âÛ'fÞ½{ï‚…‹ÂF‡â€æg?ÈHWxÇ—QWiii2™L*•úûû;vLX›ššêèè8hР¢"ãžÙÙÙ Ëå^^^›6m"¢nݺåççQ~~¾ŸŸ>æV0ö…p"Ú³wßgòíÒÓèëUM¤P(ˆèÂ…‹ÛSÿÝ\›S*•ôÇ-hCüìñ½ûöÓ3Æ›¾uË•?Ýðyæ¡ÃD4$xð]÷9òÅè^}žvP:¼þZ,9;«p-@‹ÄlŽã0lóSg EGG¯[·N­VÇÅÅM›6M(?tèPaaáË/¿üþûï5™:uê¼y󪫫—/_>wî\";vlzz:8p`ôèÑø˜[ÁœÙ³¦Lž¸víú—c¦ øÉš„ûèdá‡ó_}ýÍü«͵¹E-´µµùëkÿgT>bÄs¶¶6Ddkk3rÄs÷´uË•{öì±|ÅÊ~ýüß÷Î]÷ùëÖ <#öÕð1‘ýúùÿcíj\KÐèP9ñ»Z"Ú˜þóö©í,Ô;žuxZì[†w°…{ãM¿InZÓ´“çŸÞÁÁá7Þ ´µµªýòË/O<ñDuuu×®]ù¦½éõz‰DÂqÜwß}·páÂo¾ù&44ô­·Þ Á'Í+È¿ÔÙ¯GAþ%œ €¶bÂæªWÃûP³ÌA{ÀѶ‘”””ÊÊʰ°0ww÷³gÏ å:t "…BQVVfÔ¤¸¸xÑ¢E]»våKxåÊ•¢¢¢3gÎ :Ÿ7<š!fßßd4"JKK“J¥F…®®®GŽ©¬¬\³fMXØÿòRñߥ©ªªòðð0jÊqÜÌ™3÷íÛ÷ûQ‰D£FŠ‹‹8p  >f@Ì~ €=eÊ”ÔÔT£òž={îØ±C"‘¨T*Ã!õŠ+¶mÛÆÏ37”——7f̘   õë× …cÇŽMJJ Å\xDH¤ñ}lá.ºT*MMM5 À‰‰‰Ó¦M›8q¢X,6ŒèÞÞÞ®®®Ã‡ÿòË/š$''Ož<¹¬¬ìƒ> ¬Óé³1›èÞ¿Tm¡¾°* 77״œ9sæÌ™c¶ITTTTT¿<{öl~áìÙ³}úôéܹ3>cxÜc¶•gA7nÿ]mŒ³[Ï}ü}`”6 ­Ã;B³11³11³ï‹F£Á'ˆÙ-¨¹^ÙéïïO³Û³ ɳ[dÀïãã#“ÉÒÒÒ„ÂÔÔTGGÇAƒ™ÍùeÃ-ßø­[·rss333£££…çÓ‡*,,ܲeËûï¿ßØ>8Ž»ï—vCë8žu'7ÁCŸdcv\\œ½½}DD„V« .\hkk;qâÄ>ú›6-ö-œx|pWé‘Ù*•Ê´°C‡D¤P(ÊÊÊLO®‰6wã$Àã ¢5Ϻ栕””QUU•‡‡‡Ñ*Ó(ðX±®˜½bÅŠ†††mÛ¶EDDð%R©4--­®®néÒ¥B5±X\ZZгoooWW×C‡-^¼˜/IMMŽŽîСC÷îÝ…jaaaÞÞÞøðà±ÒªÏ³…œ†O: —çÌ™3gÎÃ&¬ò™3gò {öìÁ'g´ˆ´´4™LÆ0L§NŽ;†Іc6¦?Ú¢££SSS‰hãÆ±±±8!gƒ•ÒjµüÔ‘#Gæååñ…ÙÙÙ Ëå^^^eÑÄlhUÞÞÞK–,!¢úúz¡pêÔ©óæÍ«®®^¾|ùܹsq–³áá;zôèÉ“'‰ÈÑÑqëÖ­|áÅ‹Ç/—Ë'Ož\QQ³€˜ Ÿ¯¯oFF¥§§¿òÊ+|aqqñ¢E‹"""ºvíŠS€˜ VÁÑÑ‘I1‚eY¾044”㸙3gîÛ·§1¬Bppprr2¥¥¥I¥R¾0//o̘1AAAëׯÇ)@Ì«ÏÇ옘˜]»vñ…ÉÉÉ“'OöõõõõõÅ)°Lb»¥Ñhd2™õ÷ M×­[·œœ'<­ IDAT†ajjj„¨¨¨¨¨(~yöìÙ8KV4ÎÞ¶mÃ0)))–«ùûû7û¦…>†Áÿ° s@›‰Ù_ýõ¸qã¾þúkËÕrss›}ÓBŸðÅl¦qZݹs'++kýúõGŽ©««3õòˆÿ >\.—9Rx…6Ã07ntsssuuݵkסC‡Ú·o/“ÉÒÒÒø ¦ÙµL{¶Ðy||¼a‡m5fóCUîÏî:„ÍÈÈhß¾ýÀù¯êZæÎ;a„ÚÚÚˆˆÃ`ÃB.R€æõ sК°‰èàÁƒÏ<óŒp#½ÿþ™™™† £¦aøäŸ|×ÔÔ8;;ñ-l«‰ÙµëàŒÙÔäiØ_ýµá[“g̘ÁÏ—J¥iiiuuuK—.ÖŠÅâÒÒR" IOO×ét;vì=ztwÉlv-¡OÁýuÐVcvSh4šS§Nñ¯OæEFFž}zRR­^½úí·ßÆ @Ì+¥ÕjÃÃÉhذaÙÙÙ|aYYÙ¸qãžxâ‰/¿ü§1¬‚——?ÑO­V …‹-z饗®\¹òã?â fƒUØ»wï÷ßOD;vܱc_xèСqãÆÉårÃܱ€˜ S§NøP½}ûö×_/,++³··'"OOOœ"Äl° ;v¬¬¬$¢¡C‡²,˺ººÖÔÔP#Yð1‚ÀÀÀmÛ¶QzzºT*å G½sçΆ††5kÖà fƒUX´hÑW_}ED¯½öÚ–-[øÂ… fddôîÝ»K—.8E–I·Öh42™ |ëóóó;yò¤J¥ºqã†Pèààðïÿ›_þË_þ‚³ÐVÇÙ!!!vvvÎÎα±±µµµMieù•_þþþM©-¤¼¼'àŒÙ“'O5jTYYY~~¾R©œ7o^SZYNž››Û”jˆÙ÷àüùó3gδµµU©Tñññ;wîäËóóó{÷î­R©vïÞ- š/^Ü«W/Ã4Ã0©©©ŽŽŽƒ ***VþË/ÄÇÇûøøÈd²´´4¾°¤¤dÈ!®®®k׮ň³ï",,lþüùÉÉÉ—/_‹ÅÅÅÅ|ùüùógΜ¹oß¾wÞyG¨ìééyúôi£:TXXøòË/¿ÿþûÂØÚt„}ëÖ­ÜÜ\þ­ |ɇ~~ýúõK—.á*Äì»øüóÏõzý† z÷îݽ{÷Ÿ~ú‰/?~üø”)S‚‚‚ø·yò"## …Q .´µµ8qâ,l(..ÎÞÞ>""B«Õò%3f̰µµ]¸p!®°V=o\¥Rmذˆª««7nÜøÊ+¯üüóÏDTQQáäädTÙ´„ˆ:tè@D …ÂrÊÓ·@9::òs=³ŸÀ£§¼´ãlR©Tü\q‡·Þz+??Ÿ/wpp¨ªªjJ%%%DTUUåááqO›vqqá“vñÂ:«ŽÙ/¾øâªU«ŠŠŠêêêâã㇠—íܹóÔ©S~~~–{X±bECCömÛ"""ø±X\ZZz×M;699¹¡¡aÙ²e¸J1û.V¯^ý믿öèÑÃÅÅ%;;;99YˆÄË—/3f̺uë,÷àíííêêzèСŋó%aaaÞÞÞwÝô’%KöîÝëáááããcú˜ õYõól¥R¹iÓ&Óò=z÷Éy†SÁ —çÌ™3gÎÚ{öì1ªf¶­³³sVV–V«Ý¼yó€p¡ÿüsœ—––&“ɆéÔ©Ó±cÇîµ¹À®uXÞÜ=íL+ï9`œÝ&=H¦3á%Ð\¢££SSS###7nÜ›——wOÍ…v­ÃòæîigZyÏãl€¥Õjù™€#G޶Ù$tEEEÇ—Ëå#GŽä¿¤g˜º®¢¢"44ÔÆÆfÔ¨QüÜ~a/•Jýýý…A¼aª»fܜ嵡¡¡|2€Œ=Ú(éb6´ÞÞÞK–,!¢úúzÃrÓ$tsçÎ0aBmmmDDÄܹséÏ ìæÏŸŸPSS»`Áa¿nÝ:µZ7mÚ4¾Ðì”…ߜ嵫W¯~ï½÷êëëß{ï½Õ«W7–zà>0‰ßÕÑÆôŸ·Omg¡Þñ¬ÃÓb߯ž¶® ÿRg¿ù-›ÕìÕrõêÕY³f8p@&“%%%M™2…€–••ñ9m†á›¸¹¹(•ʪª*???>g­°ÖÓÓ󯉄eYŸ›7oÑóÏ?ïààðÆoÚÚÚ6z¹7Óæ,¯}óÍ7øá‡ðßk*~µÞŸ ›«^ ïƒq6´__ߌŒ "JOOå•W„rÓ$tåååJ¥’ˆ”J¥i»’’©TÊ0ŒX,¾}û6_˜’’RYYæîî~öìY »Ñ,›³¼vÖ¬Y§OŸž5k>th^ˆÙÐJ+**ˆhĈ,ËZ«uuuDTSSãììlºV£ÑpÇqœN§ã ]]]9RYY¹fÍš°°°{Ú±ûØœåµëÖ­ ¸kòÄl°RÁÁÁ|Vœ´´4©Tj¡fHHHzzºN§Û±cÇèÑ£ùB!]xxxnn®N§KJJ ä×öìÙsÇŽ‰D¥RYÎ-ß,›³°677÷رcß|óMVVÖåË—©É©÷îJ‚S­#>>>**ŠˆbbbvíÚe¡æÊ•+£££cbb† ¶uëV¾O`§V«&MštôèÑnݺ¥¤¤ðk§M›6qâD±XœššÊ ’-?Q¾ÍYX;gΜ+VØÚÚ®X±bΜ9Be\ð€0íñòç ÅQüjm¢¶1ùƒL&ëׯ_vv¶P~]᪲Ø÷ÍÚŸgó³{êêêfΜ9cÆ „ @̶j‰ä•W^1Íi8z–KJJ† âêêºvíÚ&fÂ2›E 1ûž©ÕêO?ý´oß¾M©üᇆ‡‡_¿~ýÒ%óL3a™Í¢€˜}øçÙŽŽŽ»víJJJjJ“ŒŒŒ3fØÚÚ.\¸Ðl…¸¸8{{ûˆˆ­VË—gfffee…„„à²+díßõjâshÃjEEEŽŽŽDäééi¶²i&¬”””èèè°°0™L–••Õ¯_?\ŽÏ Ë8»‰ Óh¸¸¸ðoX***jbóÉ¢€˜}wR©4--­®®néÒ¥BáØ±c“““–-[ÖÄ~$‹böÝñóÈ:tèн{w¡pÉ’%{÷îõðððññQ(Mé'111..N.—GGG Y´¬ŠU?Ïnìa¶P¡Ñhøå™3gò ÎÎÎYYYZ­vóæÍ 0jbا°`úE2°rF&“á<ÆÙmXLLŒJ¥R([¶lùüóÏñ[‰ôôtwww•JÕ·oß“'O6VÍt†`c‚ƒƒqV1»mÛ²eKyyyCC÷ß~ëëë‹ÏØJLŸ>ÿ¶ÞêÕ«ß~ûíïðÊ•+8«€˜ Ðü´Zmxx8 6LH_PPÔ©S§ýû÷ 5wîÜéëëëîîžžžÎ—üôÓOÏ=÷œ‡‡G÷îÝ¿úê+a8nø¯ÑBrrr—.]üüüöíÛ—••Õ£G¡Ãgžy†ÿ~AAAÿþý-Œø×­[×»woË{r×ÍQeeeTT”§§ç‹/¾XUU…‹³Áªyyy­ZµŠˆ ßJùñÇÇÄĤ¤¤&À¹páBNNNRRÒôéÓù’×_ýÍ7ßüõ×_ãââøšåååFÿ.Ñ¥K—Ξ=»jÕª+Vœ={6;;[èpôèÑ™™™Dtøðá#FXØçÂÂÂï¿ÿÞòžÜusD´hÑ¢?þøúõëS§N]²d .¸?xçã¥5ßÅiA‰èÚµkóçÏ?|ø°L&[·nÝøñã‰ÈÏÏïÌ™3NNN†£Ûk×®ñYqT*•Q'z½ÞÕÕ•/4]kØI^^ž«««N§sss»~ý:ÿ ¾É™3g–.]º{÷¨W_}õ¹çžk¬“‚‚~ßîº'6GDݺu»pá‚D"aY¶wïÞ/^Ä¥ð()/-lwqJp®¡utêÔiÇŽ*•jûöí/½ô³+++ùðlÈ´¤¤¤dÓ¦M.\h,‡¼)"’H$Ddô•¿þýû_½zµ¤¤äìÙ³ƒ ²Ð‰á–÷ÄÂæˆ¨¬¬ÌÍÍ_‹Å¸àþàÞ8´’Ž;òùé†ʲ,_¨T*«««ïÚ–ðü]ô&nÎÂÓE"Ñðá×-[Ö¿¹\~OGÑØžX~A»““SQQQyyyyyyII .@Ì«¸mÛ6"JOO—J¥|á³Ï>»oß¾ììl sÁˆ(??Ô¨QÏ>ûì_|!ŠÅâûNZ7zôè­[·>ÿüó÷ÚÐìžÜÕ¨Q£®\¹¢Óé¶nÝ:jÔ(\ ppoZÉ¢E‹¦NJD¯½öÚ–-[øÂ>úhòäÉ•••7n´ÐöŸÿüglllEEÅœ9s„‘#GöêÕ«°°Pxllá ·‘€€Nw1Ûìž4åØgΜyâÄ ??¿ÄÄD\ p0íñòç ñšV[vÿðÿýö[\ðà0ÍüB£?†ÁŸmìʶ‚€MDS¦LY¿~½ðg„Õî'€!ëÙB0¶˜°áþ\¿~áÚœ¶7a˜Å‹÷êÕËp,^RR2dÈWW×µk×Z.¬¨¨ µ±±5j?٨ϴ´4™L&•Jýýý;†K³ïŸ§§çéÓ§ K>üðÃðððëׯ~kÖláüùójjjbcc,X`ÚgttôºuëÔju\\Ü´iÓp‰böý‹ŒŒ4J[‘‘‘1cÆ [[[Ãt’f ÷îÝÛ­[7©T±{÷nÓ>ƒƒƒ333³²²BBBø¬ÔÖ M~×Ë4;UQQŸ<ËÓÓÓraII‰ðå`ÃŒTBŸ)))ÑÑÑaaa2™,++«_¿~¸Jšëcx$•—bœ}\\\ø‡ÓEEE– U*•F£á8Žã8NgÚ•««ë‘#G*++׬Y†k¬Ä#³ÇŽ›œœÜÐаlÙ2Ë…ááá¹¹¹:.)))00д«ž={îØ±C"‘¨TªûN³€˜mÞ’%KöîÝëáááãã#<ê6[˜0oÞ<;;»µkךM?™˜˜'—Ë£££SSSq‰€•hϳ¾„mø£°ìì윕•¥Õj7oÞ<`ÀË…´°‰€€€ÜÜ\\ÖO£ÑÈd2kèÄ: 0ζR111*•J¡PlÙ²åóÏ?·P ÿÅw†a:uêdá‹ï–_eÈßßÿÁ÷ªY:ivͲW™lú)Œ³[ƒðΉ»ÂÃÂ?kˆŒŒÜ¸qclll^^ÞvØ,·C¬óž îôÀ£<Îë§Õj#""ˆhäÈ‘BÀÎÏÏïÝ»·J¥2ü®|JJŠ‹‹‹L&KKKãK²³³  —˽¼¼6mÚ$Œ ÿ5\0­o4Ü4m^TT4|øp¹\>räHËsÍvnz ¦%åàKMMutt4hÿ£ƒ2eÚ³Ù]jìVrü fÜ…··÷’%Kˆ¨¾¾^(œ?þÌ™3÷íÛ÷Î;ï…çÏŸ¿~ýzjjjtt4_2uêÔyóæUWW/_¾|îܹôÇà Lë›eØ|îܹ&L¨­­ˆˆ°Ð¤±ÎMÄl‰Ù|‡*,,|ùå—ßÿ}Óƒ2eÚs9þÚ:¼‹óñÒšïâ4ºZ®^½:kÖ¬Èd²¤¤¤)S¦‘««k^^žá›µ†)//ç󱘾F¯×K$¾°)ouk¬¾°,,¸¹¹(•ʪª*??¿ââ⻦aç¦bZâééyãÆ ‰D²¬ÏÍ›7ùøå—_žxâ‰êêê®]»ÞõÐL{¶|¼ÂÂóÏ?ïààðÆoÚÚÚ‶ò«µ ¼‹1¾¾¾ ä§§‡„„ð1»¢¢Â4]šiIqqñ† Î;—““Ó”mY®o6–——+•J"R*•–ï›íÜô@LKËÁסC"R(MÌ`ÚsÏrü´u¸7­ÄÑѱ¢¢‚ˆFŒÁ²,_èààPUUu×¶¡¡¡Çñ7„›²-Ëõ͆F•JUWWGD555ÎÎÎ÷ڹ阖4–ƒ¯¤¤„ˆªªª<<<šrt¦=7ñü Çb6@“'''QZZš0Ü Ú¹sç©S§üüü,´ÍËË3fLPPÐúõë…B±X\ZZÚôúR©4--­®®néÒ¥¦„„„¤§§ëtº;vŒ=ú^wÆô@LKËÁ·bÅŠ†††mÛ¶ñsô,šÙžÍî’)äøhëpoZI|||TTÅÄÄìÚµKWcÇŽ­¨¨øòË/-´MNNžÎ>xðà3Ï<#L½éß¿ff¦Ùšf“@™Mùd6’Cböùúë¯ccc…g̘avö85’ÊlÊ'³‰¨ ³ïŸF£9uê”Ê‘ˆ"##Ož<©ÑhL+óI |}}}}}…ÂÄÄĸ¸8¹\-¤|JHH˜7ožÝÚµk¿øâ 5¬•>Ï–ÉdW¯^5,±±±á'ˆ™¾,9**ŠOŠID³gÏærssºuvv>xð Q¡Ùš`ý4L&k+Ý<²ãlxô¤§§»»»«Tª¾}ûžøæ³ÁêLŸ>=))‰ˆV¯^ýöÛo?x‡W®\i‰ýl¡n³¡ÍÐjµáááD4lذììl¾°   ((¨S§Nû÷ïjîܹÓ×××ÝÝ===/ùé§Ÿž{î9îÝ»õÕWÂ@Öð_Ã…féÖ,ÓžKJJÆŽëááY^^nTßìZ•JµråJÃ×q fƒñòòZµj¾bòã?މ‰IIIY¸p¡PxáÂ…œœœ¤¤¤éÓ§ó%¯¿þú›o¾ù믿ÆÅÅñ5ùøgø¯áB³tk–iÏ .ŒŒŒ¼qãFxxøßþö7£ú­õðð8tè® ¸'xçã¥5ßÅiù®]»6þüÇËd²uëÖ?žˆüüüΜ9ãää$TS©T×®]sttä—:Ñëõ®®®|¡éZA uk¶ç.]ºœ={V¡PTWW÷ïߟ¿µ.tÒØZagàP^ZØ:ïâ”à\CëèÔ©ÓŽ;T*ÕöíÛ_zé%>fWVVš†.Ó’’’’M›6]¸páÒ¥&ý/ÑBÝší¹¢¢B¡P‘B¡0 ö­EÀ€û€{ãÐJ:vìÈ¿KmèС,Ëò…J¥²ººú®mùÏß”nʶZ¨[³=;99Õ××Qmm­éƒpËk³ÁnÛ¶ˆÒÓÓ…¬ïÏ>ûì¾}û²³³û÷ïo¡m~~þ¨Q£ž}öY!‰ÅâÆòÖµP·f{~î¹ç<¨ÓévïÞ=bÄ£ú–×Ü܇V²hÑ¢©S§Ñk¯½¶e˾ð£>š¸8Úö•ÝF¶Ê||ðpYõ½ñœœœÕ«WÇÄÄ888TUUÅÇÇ߸qŸào xyò䊊 ¾ðøñãS¦L âßÚÉ‹ŒŒä“Zû¬X,ÊCCC9Žãï„ …üTµÆºR©TuuuDTSSãìì̺ºº9r¤²²rÍš5aaa¸òÀjµòíXÞœ!Ó“`6g_ÓÔ2þùzQQ.KÄl3‚ƒƒ“““‰(--M€ZN]'0›öN,—––š­?vìØ”””†††eË– …ááá¹¹¹:.)))00°)›J¥iiiuuuK—.5ÝŠ…¸ëæ ™ž³9ûš~¤–;699ùžšb6<^âããù˜³k×.¾pÅŠË—/3f̺uë,´åÓÞùúúúúú …aaaÞÞÞdnÞøÒ¥K÷ìÙÓ¡C‡îÝ» õæÍ›ggg·víÚ/¾ø¢)›à§nõcºfYÞœ!Ó“°råÊ 6(Š]»v­ZµÊB[³GjÙ’%KöîÝëáááããÃßW€¶sÐ/qšVqY­V»yóæ””þ]·`Í¿Z…9hÖ;ÎfÌ!äxjã½€ÝØ…jµbbbT*•B¡Ø²eË矎k  ±Þyã¦ß±yTéþ iM[¶lÁ§ÐFµ½çÙ†/7nÜèæææêêºk×®C‡µoßÞ0ßSc‰¨/^Ü«W/ú#¶T*õ÷÷·1ûAåäälذá£>ÊÎÎÎËË3Je6•§§çéÓ§‰(::zݺujµ:..nÚ´i¸1»¥ÄÅÅ)•ÊqãÆåää¼ùæ› …"""B«Õòk÷îÝÛ­[7©Ta˜Î:22’Ÿ.œ™™™••RPP€«³[Š««+I$"âóFâQ1 #‹oß¾-” 9§RRR*++ÃÂÂÜÝÝÏž=‹«³[Šå ºwMDåêêzäÈ‘ÊÊÊ5kÖ„……ájÄì‡ã®‰¨zöì¹cljD¢R©î#9%@kz”ß’0iÒ¤£GvëÖ-%%Å´Bbbâ´iÓ&Nœ(‹SSSq5bö1úþ«éË’vv>xð …Þrssq@›€|ãˆÙ€˜ €˜ ˆÙ€˜ €˜ ˆÙ€˜ €˜ ˆÙL_ÛeùE^Mì1³ÿ¬¨¨høðár¹|äÈ‘Âk4Í þþ÷¿¿óÎ;D”––&“ɤR©¿¿ÿ±cÇpbv š;wî„ jkk#""æÎk¡·|ùòK—.­\¹’ˆ¢££×­[§V«ãââ¦M›†‹³›ógBùÁƒ'Nœ(•J'Mš´ÿ~ …D´jÕªmÛ¶ýë_ÿâ{ÎÌÌÌÊÊ )((ÀEˆÙÍ€û3¡¼¼¼\©T‘R©nƒ›-$¢ü±¼¼üöíÛü)))•••aaaîîîgÏžÅEˆÙ-H¥RÕÕÕQMM³³³…B"Ú¶mÛ{ï½·`ÁþGWW×#GŽTVV®Y³&,,  f· ôôtN·cÇŽÑ£G[(ä½öÚkgÏž=wîõìÙsÇŽ‰D¥R™NU@ÌnN+W®Ü°aƒB¡ØµkתU«,ò$IBB»ï¾KD‰‰‰qqqr¹<:::55´ kÞ9ÃØF%nnnG5Zk¶PhJD¹¹¹øìãl@Ì@ÌÄl@Ìx<ÜÛ¼ñð×㔵ikgGâ$`œ ˆÙˆÙ8ˆÙð¨Çì.ÿZú–Hô¿f3 %ýýÿ|}<-7LÿtÁ½®µÜ1Û’·K K+úvë$”ôéòdumÝÕë…–bf;<ª¬÷!Žÿø|ÀS?^*àøÔþã?ú=áõú„Ð'Û»Uß©ÿr_Ö¡ïÎñå­û²‚û÷|ýº€ÛfkQ'o÷¹‰¨¬©OJ«¬¹c¸E…ͼi}ºt¼ÿëòÄ]wêÕDàßõ½é/2 ]ÿ­ä³g^Èÿ `œý''Ï]îÞÙ[agCDö¶ò>]ž8þÃÅÙ1/ì:|*jNüæÝG¦G>/T.¯ªŸlؼ±šaCú¿½+;‡ç¼ïÎ]V7h ›7V3eÿ·­îç+¿ôïék´Ågût¹y»L§g¿;—ðTW¾ðâÕ_ûuïÔÛ¯ã füퟸbàa±ê÷gÿçÄOóþ2nÿñF<µjó"rTÚ~º“·û^n†5këÔFm«Y^]CD:½^iokÔ¤Â~Ïúøe–ýý­ÛñIiï͈üè :~þš-7nã¢Älc…%åuê†Aýº×©57‹ÊˆhÑÿMüþç+ÿ9ùSQi冿½j¡mc5ý|¼ò~¹%•Hªþü0›ˆjêê_yÿž5,¬ª­ûà“­2©dè€^½1áåùŸà¢€‡ÂÚ¿Ÿ}àÛ³¯OÍ8þ#ÿc{wç39ù¹7‡ö·Ü°±šÓ_|^&•ôëÞéÔù<£&Ù9ùÞ.b‘hd ÿʹSùÂO¾:øéz=[SW¯´·Ãg›wú|Þø ÓÄ×O¶ìû—qö¶;þsÒrÃÆjþ3%cÝû3‹Ë+W$í2j’´ëð»Ó"zwéx³¨4>)/\÷UúÛSƼ;-BÏr+’v⊀‡…Iü®–ˆ6¦ÿ¼}j; õŽgžûVØkÇ)kÓÖÎŽìì×£ ÿR‹n…¿Z8ŽÃ €ÇAAþ¥ýÕ:asÕ«á}¹KÚ ÄlÄl@Ì@ÌktoßõÂk+Ûº–ž1g fb6 f f·˜>}ú¬_¿^øqýúõ}úôá—†yðþ…Nš¥7€Ç7fçää¬^½ºººšˆªªªâããsrrøUÈM `E1›ˆŽ?NDÇŽ8p é9--M&“I¥RÿcÇŽñ…ùùù½{÷V©T»wïæK***BCCmllFUYYÙØæ²³³  —˽¼¼6mÚ$l+>>ÞÇÇG&“¥¥¥Yè°¨¨høðár¹|äÈ‘eee¦ƒxË» Іcö AƒŽ9BôÿíÝwXSçßÇñ“„PAܳZE­vYku¸PDÄ“%bq ¢(*à@EQÁ­uïÑj«¶®:p@Ù3ñüŸ”²´ýÙ ø~]^¹’;'焯wòÉ}Îáĉ;v,¼€••U```NNŽ···½½½ºÑÃÃÃÁÁaß¾}3fÌдøûû§§§;::zyû­q[[[WW×´´4???MûóçÏoß¾½mÛ6++«Vèââ2lذŒŒ KKËüǧ À{ô÷~‹ó܃-‰®_¿nccsíÚµ/¿ü2<<¼U«VêuŠD"õ33³J•*Mœ8±}ûöR©TýÀjժݹsÇØØX³ªZµj=}úTKKK©TÖ¯_ÿÙ³gùW¢¹¢¡P(´´´4÷&&&ª×¦Y²ÈV¯^=66¶bÅŠ©©©&&& V^òÓ.…þíŒ{½ÊŠrû[œ-Z´xöìÙüñøñ㯾úªð[·nMII177¯Q£Æ•+WÔÉÉÉ•+WοثW¯´µµE"‘D"‰‹‹+ns sçε´´lÚ´iþöüñ_ “’’*V¬(BÅŠ5ûÆ5ògR‘O€÷è¿Îl‘HÔ®]»… ¶iÓF"‘^ Zµj'NœHIIY¶l™¹¹¹º±R¥J©©©B777W¥R©T*¹\^Üæz÷î­R©ÔûÕK~bE®ÐØØ8++K„ôôô*UªxHþ/òiP†3[„Ž;FEEy0[=ß¾}»–––±±±&;tèsñâEu‹……ÅíÛ·årùúõëÛ·o_ܶîܹӷoß:äÿŽY‘Š\a¯^½öïß/—Ë·oßÞ§Ou£¶¶ö®]»²²²|}}K~Ú¼GZÿý&¿ÿþûÜÜÜâ2{ݺuöööÇ—H$Û¶mS7.Z´¨ÿþÉÉÉ›6mR·øûû[[[Ÿ8æ @™{ký`sÐÀ?Cf@f22ـ̀Ìd6 ³ ³ÿ¹-[¶ˆD¢âÎ.‰þû|PÚ3;::zÀ€ÑÑÑ”€Ò›Ù™™™§N >qâ„úw©Axýúµ©©©¡¡áºuëÔ-&&&±±±‚ ÄÆÆ6kÖL„Ë—/·nÝZWW·víÚaaašññâÅ‹ëׯ¯££³k×.uã½{÷¾øâ ccãÝ»w«[’““{÷î­§§×³gÏ”””â6 ™ý§ƒ¶k×®N:mÛ¶=xð ºÑÃÃÃÚÚ:>>þÒ¥Kêssó#GŽ‚pôèÑ~ýú ‚`kkëêêš––æçççââ¢YáóçÏoß¾­þqLÍÚöíÛ7cÆ M‹¿¿zzº£££——Wq€ÌþSLLŒ:ƒû÷ï£ ò¡C‡êééiÕÜÜüðáÃù3ûæÍ›C‡ÕÕÕ1bDrr²f…ÞÞÞ–––yyyê–3gÎØØØtèÐA=Raï޽͚5ÓÖÖ¶´´Ô ¾ o€RNë?ÛRNNζmÛæää$BÅŠsrrôôô^½zU¡BAêÔ©£^²sçζ¶¶2™ìúõëíÛ·!!!aõêÕ×®]»~ýzþuØJrrråÊ•ó·¼zõJ[[[}]"‘h lÆÙo>|ø»ï¾Sý¿o¿ýV½¼FiiiêU/©££óÝwß-\¸°C‡b±X„Þ½{«T*õNï’·R©R¥ÔÔÔ¹ž››«Þ¨\.W7Þ(döÑÑÑŽŽŽš›cÇŽUÏïß¿ÿÖ­[e2ÙÂ… 5÷š››Ï;W½c\„;wîôíÛ·C‡ÁÁÁ%o¥C‡111/^411Q·XXXܾ}[.—¯_¿^=j/n£ÙBnnîÅ‹---5-<þ|nn®¯¯ïž={êÕ«÷ÙgŸiîíÓ§T*íÑ£‡úæ† FŒѸqãÆ—¼¡E‹ùùùõíÛ700PÝâïïïêꪯ¯¿bÅŠÐÐPuc‘ 4­»!šý¿GÙ–°Ü™SÇ짨T*JV¦ÅÞ»ÕȤyì½[ÿêVè-xk}†…§:Y|)pîRÊ 22ÙÙ€Ìd6d6 ³™ ™ Èl@f@f2Ùـ̀Ìd6 ³ ³™ ÈlÈl@f22ـ̀Ìd6d6 ³™ ™ Èl@f@f2ÙÙ€Ìd6d6 ³ ³™ ÈlÈl@f22ـ̀Ìd6 ³ ³™ ™ Èl@f@f2ÙÙ€Ìd6d6 ³™ ™ ÈlÈl@f22ـ̀Ìd6 ³ ³™ ÈlÈl@f@f2ÙÙ€Ìd6d6 ³™ ™ Èl@f@f22ـ̀Ìd6 ³ ³™ ÈlÈl@f22ÙÙ€Ìd6d6 ³™ ™ Èl@f@f2ÙÙ€Ìd6d6 ³ ³™ ÈlÈl@f22ـ̀Ìd6 ³ ³™ ™ Èl@f@f2ÙÙ€Ìd6d6 ³™ ™ ÈlÈl@f€ÿ…%À¿$öÞ-Šd6J;•JE€ÌFiש‹ƒlxï8ž ™ ÈlÈl@f22ـ̀Ìd6 ³ ³™ ÈlÈl@f@f2ÙÙ€Ìd6d6 ³™ ™ Èl@f@f22”VZ”ï]#“æáŸ‰D÷ïÞ¤ô½Ò÷T*u(å/^2ÿŠØ{·(ÂßuæÔ1Š@ßû°}ê•ò/ûÆ(ÈlÈl@f@f2€bÄÅ%äææò•³ð]/”YYY'O~üø‰TOjnÑ»Š±±D"¡,øÇ ÅÇ.ÿòkNvNŽ,G"Íš5k×¶TªG}þ ¯^%Îóó4n§ ëëêêŠD"jÂ8åÓÉS§ï&¶Él”O*•J¥R)ÊŒlYvŽLž'ÏÎÊ~ë8{ï¾›´Ø·ÿ`‘÷6nÒâQ.ݼu}ÈP‹<¹,%%)%59==U,Q~Ú¸ÞÃÇ÷cccãââŸ?¡ùŸ››ûßw‹~ËA©“’Sæûù/_¶sý¸AN!QÁ‹}–Nš1ùá£'ÅÅvHhø[[Ê%Žg£óç軹ÏJJJ \±´Gw3õ+–/ñš=·‰Iã•Á+ªV­"Âë׉S§»üúëÕ6ßµ^¾ÌßÈÈH½ä´©ÎûüxïÞ}õͲû£2Ïž½X±zåæ‘«¶¬²`¾{ƒƒ¥ãTmgø­ô ð[>Å}ÚŠEËM7ü[SÒBBÃÍL;Ÿ9{Ѹ²QîÝÊÙœA2eÒÉS§/ÿ+5¬¦TªAhÖÚ¬ZÝÆryƒFMj§§£­z?|ñ4"bóرö+TÈÛ§Niùõ×5jÔøúë¯NŸ>Ó«WA/YÖ¯¯ùºÐÕóæûj–,²å^bbjv¶ìÅóøë¿ß‹½÷D¥RªT‚ ´$A$• úÿ:JUFFVZjΊÀ•ŸÞ¼Íw­«T©Rx…wîÞ;yüÐÙ³çWZXô>väÀ¹ó&O™ñÇ­ßÔ œ;ñâùS»vï]²t™ßBA.ò·0ïºm{ôB?ÿE~ ÔKV¯V-fÇV}}ý²Ø#GÛÍ›7¿GŸ‹,ŠØa;À.hkà[ŸÞ#ØMœ2ÁÓm–õ›­["M7ÔÑÑy÷ØNKÏï4öÉÓ—×oþѮͷ Eù™ÝBf£LzüøI½ú Œ¶LËÌyó*•«róä:ú†•ŒZ‰Åo^Û‰Ù¢kçw%%%Iõôògö¡ÃGMM» ‚`fÚíÐá£êÌ>}ꌗ§»®®îÄ NÛ¶G«—,²åž\®Éäwï<þæë¶#GØ)…âßôU‚\.W*UZZZ÷522lß®]á¥&Oš```н»é¤ÉӶܬ¯¯ß£»Yþ™’“&8éééõµè´RÝröìùysfkiiõëk¾"p¥fÉ=ºëëë—ùìÑ’l‰Œ¸yãæï9.3]ï?¼v{ÈØS½'NãêäpðÇÙ?ÌÁÀÀ@&“éêê&&%©ß kÔ¨þçx«¨F| òòr_¾H4ëV·~ʲÜÌ?#Z=ÂÞŒ³ e^ž8W–›–ž–ø<)9±ÈµWA:…¨U«¦ úúúÉÉ)ê–ÔÔTõ’)))š% +•ƒòÖ¨Q=77·sçï>|4còŒð]áv–ö‘Ë'žá³|ާë¬+W~5ÊF!WÔ®]S¥R˜›¢Nñ??8ýu##£'îkiieggëT(OÝ’ÌF™Ô«g„„Èë¿ìWÈ*•*.>¾sß‘FÆí“â lРD" "©Tj9 ŸT*Íÿ ýìÙó_}ùŦˆ0õM›QvçÎ]05íZµjÕŒŒŒŠ+&%%k.²UrRZ—N]Ûµÿ:%í‘\‘—?„|-—+reyYÙÙî? ZFF•‹\Ý[÷ë&%%W­Z%==£ZµªÿŸÍ†êÉ™™™êƒÙå‰H$ÒÕÕU©TµëÔv›íuxÿáµ;ÖŽµtœòäãܜDž­–åÈ*W6*rŠ@•*ÆIII𛩩iÕªVÑü×dffÊåy¹¹yúúR±¸\^‰ÌFYýî4nlRrrvV¶J¥Ú³Ë¸’Ž–D„ LœàTÙÈPK[["ëëëkiýÙÕ<|dذ!š›C‡ þñðSÓ®ffÝöí?8xåšPͽE6¢ÜS*”99y•2³^gegj¢Z¥”J¥H$R*•J¥R.WÈóä99¹ii7®ß­ _±Všÿl‹!¡ë\gLÛ·ÿ€zVš :uåØñ;™6jô©æÞ"QîåÉåU«Tiñù§¯ã2Ò³ÒR3ÒR3SS3RSÒÓR3RSÓ““Ó’S_§¼~’œ”úôiü«W©7ÑŒ’ÿ®Z5k¶nÓñÜù Ó§MV·ÌtwÜõÅWß>rÔs¦[á‡téÒ©Ã÷ÝÊz© }ÏïÛ©ß¼À¹–úΛ:ÆÅ×AÇŽ³²²ŠÛ?Q·níÆîÛ(t}ÄÞý?6kÖôË/¿Jz¯Y熑Ϟ¿èÖ­kfF:ãl TĶ:‰U*•¶¶öŸŸÜ‘¶Ž¶Tª§¯¯_ä þıCùoêêêž<~Xmmí°u!êFëáVê++V,܈aœ­£££o ýôùk¹\¡Tªgˆ«”J• T)” õ;/O.—ËårÅÛµÅúŸ·h!•þ9;L3©;ÿìîâ®ÛÛ¶·ÿ9T©b¹)¼ÀËÿÕÁå Ô©©©¶ÖvÝzt›é:³¯eßYî³FÛšéæyþüùÑ£F¨Tªâbû“úu>oak\µº––¶\ž—ø:>;;ëÿwQtjѼieãjÙÙ™ qÏÉl t‘J¥ ɉIY¿%¾|"•JÅÅ|MV­¸³S•ݯÍཫQ£†žTzåêµø„ò<¹R©Tª•J©Rª”J•B¡Ëyyr¹\!ªœlÙë×é¦]º×«W7ÿ2ý]¬ÿLÍš5:ß®WnÏŸ??þã/_¾ùÙÛ#GH´Äb1?ùü?&7E ³ñÅ69÷E,–èèÐPúz&%€Ìd6d6(…˜ƒ†Å™SÇ(è{Td6J;¾³úÕ™²á]NCâÞ4‹<»Þ±zô=ªW¾?ñÙøW”ãóý{4»%©Õ£ze´€ÿ6æ P6Ùـ̀ÌJ;…B‘••}ÿ~ljjZÑ—iéÚLR*•qqñqñ kBBããwìØ~íÚµªUoß¾-—çzÏ™ëââûàÑž=û’’S²²²èZ>&§¤>rìÉÓçÅ]-ôô\˜û$ºR%ã]»÷¼NLÊÎΦt ³?]ºty’ódmmí .œ?^}©¯¯þüy£G¦¤¤DGGß¼yKGÏà—_®|„ ¥Ryî܅Ĥԥþ:vЉÙìî1+p…Ó¦Ÿy{{öë7à—Ëg|, ^¹¼vÝO—?~ò,55Þ• ýƒ·oí:õ§ºxÖ¨Yg¹¯oºŸ,›7¿vúó}ªT­1bDÿ1nG#'Vûb̲+>iÐÈcöüÔ´t…BAõ@fo|öÙgaaaƒ k×®]HHH»víÖ¬YÓ¾}û5kÖtèÐaõêU]ºt‰ŽŽvppøõ×+Õª×|ðàáÇ6Ú~ù2N,Ñþñǘ+ÖĽ¸3ÓÓÇwWó-‡ܬÙVV{÷´gOd``È&Oq]²ÄïÕk%üéÅ‹—VVC.ß‹[àÿÄa¿ U/í÷ ^õâè¾…A+C—ùî?pîèæIÕ?w ˜=3`éÒ='¶esüø Ž5)''ÇÅmæù‹— \Æ'¼¢8d6ʳ۷o;998pÀÆÆæÄ‰vvvÇ·µµ=vì˜úr̘±QQQzzzÍš5«\¹òpë险©©ÿûȵ UÉØØx÷ž³XtðÀ¶‘£'=²Çcæ¼=»£ø.^³:pÖ¬9>vvÎ1ÑFŽœ¸{ׯ.³öîÝ÷oýËP«U«¶xY¥ÙŠÕ¿a»×Ç»¥ÍØý¾sZrÝÏbiHıˆ‰5¾t ööš¸jíÚ ãGXÎñ hÕªUNNζ+¥,}ˆŒ‹ëÕ«Ïù«çÝÜ<¶î‰=Úní–5=zô:sú ŸrÞçAC™g¯^³vÛ¶m«W¯îׯ_pp°••ÕÊ•+­¬¬V® :ÔjÕªUVVV›7E,]ºt¹ÿ¸ .ŒØ9`ÍVÍBBà ¬sœƒm–Ðpu£æÊŽ˜=Æ,+ï/ÏŸ?4Èê葽Ö#ÆíŒ‰t?}ãÆà•뢶íÜäí½h÷î6#'Äìjå0eŠ“ó¤i…‹ðç|±ØÌ´sß”°QM­ŠT¶ øêÕ+ש“Vo;0u‚í­7flܲï^çЃ-û¬ß¹ûX„sõ¯ÇmÙ}úÜÑÇgÎt ܸsæ´‰?ýôÓëa«§ýce¨ž*•ʸ²ñÔÕ®ö ‰ ñš>ç‡eîgMr¿fÙj¥R)‘HŠëQ«’Ù@ig;::îÝ»wôèÑ111ŽŽŽ;wÆ888ìÞµËÁÁq×ÎŽŽŽ[·l}æÌ™3ÄÊáÇð©Õ[9EFn Ý»wïðá÷oßîä8vù†êq¶®®nÉ=íà¡£Ož>áÉÓg?:ö¦=x¸aã–={fg¿Ùµž³ïÀ¡Ðõ‘ÉdšÞxåêoÛ£w—¹Y­Zµ%Ë—Ø ³.&t²õô¥a¾.c<}æ·jÕê­;ù‹ì…ë³u[Œze«×!¡áññ ‚ ¤¤¦nÝ£.ݵ߮Gnݺ>âá£Çd6🎳÷íÛÛ¯_ÿ­[·ôï?`Ë–-ý ز%rÀ€["#¿mÝzõŠIKW˜3¥_»Þã—.õ:thzzú[×üóå+&&ÜÝ\³säÆŽê]š…ÇL¥VݺuNr䋾C‚ƒüº÷è·6dÙË‘ó²]¾l‘©Y?k;{‡;¶·ù®õ»¬Yý›ƒŸggç}ûö=zÏž=ööövcÇ1ÚnuàÒw9žÝü³¦QÛw<%;;3/W&‚‘‘Ñ“G÷µ´´²³³õ *‚››kddüäÑ=--­œœ}ƒ7ãB©T÷âI™˜4®R©úõ5ÿÁ{Þß…'®Û³'tÇÚ±ƒ=ÜÔãì ÿU¾Ás\\Ýùùn‹Š,a2Za…ëS§vísç~ÒÑÑ}ý:ÑÆÆ& `¹X¬ŸÐ¬i³¬¬ AôõõÆ=U—î¿ù¹k2x3o<22róæMãÆ9EGï7Î)&&Úqܸ/Z4:yúçÙ“úuêï|æÌ©9sæíÞ=ÝÅýܹscìí ¿uhÑ××ϓ˕JeNެ|jâ¤ñ~~QQaÞsDE…/Y¶:,,|æÌ7F,\8ÇÍÍkÁïY³ælݲ¹Ó÷íK^áÃG5¹®££ãíí]Ü;ìÿroég»MuŒÜ;c†ó4÷ÙŽ¶ÖÎÓÝÆµužî6ÁÁÎÎqâ¤qövŽƵ5fÜäñŽ붺MŸúÓO?51ü­=íú[5kÖ¸|ù—–_µP·dffÊåy¹¹yúúRõÁ¥R©T*óòòtuuó—K©,§m‰D*•jŽ·×ßEímVn šd=y]tèdëé?,sŸa?ÓÏđӂW­Ø¼y£úÜßê꣥%122üí÷Õ«U«Tɰjã‹?ýll\ÙШòã‡o¾®,ãg¼aß8Êê8{÷îÝææ›6EôíÛoó¦ss‹1cì=½|múöævöÌiOO¯]»¢G¶Zðý÷߿˷f?ù¤ÞÕ«WU*յ߮ñj‹333ËV¡\\<׬ ˜>Ý+l}ÐôéžÃ×8;»l‹Ú0}ºÇªUKgÌð ^êî>{õêeC† )yÏäÃGOœø´a…B.B½zunܸ!¢Ø>©_·ðéÕJ‡‰Dººº‚ òœéµ-²ó]—oZ6fÐXõñlÿu>ö–ã7F¬ Z¶\,ééé•<ö-Ћ¬OýzuOœ8abÒX–“S»vÍóçÏ›˜˜äÊrÊÍ™g£¬Ž³#""BÖ¬¶8hÓ¦ˆaÆGl 755óõñŠØ½wïîÅþKöìÙåä4qcøºÉSgœ={¶À8ÛÍÍ-ÿMõ ©6­¿9sî§/^¶þ¶eáíÖ«WgÁ‚cìlÊD• E³¦M'Ou^¸p鶨õã'¸:ãæî½)"dÚôY&Œñòšïë;ÛÅeÖ¢EsÝݽ׆¬éØ¡­: ò¿uj %‹-Ì{uèØ)>î™ íÚ¶Þ·oߣGŒŒ ô³¨S¯aþ#¬EÞ«. ãØÑ%?¶ôŒ³=¦OÞ²ßyDßY —Ïšâxèðá%sÝ£¶ï˜ë¾q®«sðÊà #z.X2×cíÖݳ\§gîi~ºÔ¡CÛŠ [µüêäÉÓ=ºwÁÐÐpÃÆÈÚµkèß/3#]„vmZŸ9wáéÓgêÆ¬Ìô²Ø!E"‘žžnNŽÌuúô¥Aˇ± Ž œl=}v€›:°çϯ««£¯¯_\`Û‹ªOÝzu.üté˯ZfeeÔ©]ëò/W¿øâˬ¬Ìróî'Zw!C„5û²5,a¹3§ŽÙ;Nál5e]ì½[%|}ö}ù·7qøÈ±&M›¿~ýª{÷Ñ;¶<$:zûÀƒW­ 6ÜúèÑCC‡ß¹3zðà¡;cvôêmn=l°›»Gýzu+Uª˜ÿI¹S,רUWWWš”˜P­z-u£æ/ªY»^Ü‹§ÿÒߥy•½—êÉåò}ûW©áë»|çÒ€5þ‹½Ç:LŽÞвe§íÛö ö;Öyݺ`›ö_Õ¢bÅŠ"‘(ÿnØü…R©TñqÏÔ‰"‚D"©^³ŽTj—›÷,7W–¿VEÞ[³v=}ý îß.òÞÒS=ARSÓ†Ûß¹ñ‡åaÖ½Ú?yô`ˆÕp—SìÇŒ»qýÚpë‘áë‡YtqŸi3Üjå–}~îz÷º²^ÝÚ*T(¹§ÕªS?5%)+3Cß ‚¡¡ñœ¹ó/^œø:¾²qµììÌ„¸çêq¡D¢U£V==}u£z(™ÿõõ¾:ä{¯^*•*''G&ËõX2|ب°½!ÃÌF.[±$hÙr]]ƒöŠ—Ø‹¨¶ŽnýO=y|?/7WOOªþD˜““] tï÷mJ]ÀûwoþKoÃÂS,¾dœ²:Î^¹:""bûö(«aÃwíŠ6Ì:zǶIΓwìØ6|¸ÍÎ;† ±Ú½}à !Ö‡Lš<½À8»„³S)•Ê—ÏŸ¨¯§¥&çsAþ½À~ïRRR›7oáæî²páÒ°°@ÇqÓ¶o m;qÓ¦5cÆLž8Ñ~Ö,Ÿyó<]Õã쀥K‚—%%'W6.¡Pùk¥P(4µ*ðѧ¸{5,òÞÒ6ÎvŸæ¹o†Ý é3øq÷Žu¡!VÃlæÍñÚ°1rsÄk›Ñû÷íž2i‚Ç‚eÞÓB6í˜åîRxœ]8 TUSÏ”äÄ”äÄ¿î,‘¿xö¸¸ —¡)‰ôôôA˜éæ1w¾O‹Á Ì‹Ø.‹ôõõKì·õÀ"ê“—+Ó”('';¹Š»^†Ù({nß¾=f̘íÛ¢XŒ‰Þ>pÐõetô¶¡C‡íŒÙ1hÐИèí–ƒ†Dïˆ:ÌÆzØwœœmÍk¾¸qv¹!•J/œ?0y²KPТŋƒó³·l ™4É54t™³³kp°ÿÔ©K–øŒåðàÁÃ&MËd9ZZ%ªüÕªHÕªU›0mfÔ¦ >Á§8ÙµÕrààQ6Ã&Ou  ?qò÷m?Þy²Ë¸‘~k6ùy8÷`ººÀ¼ñ"#§@Ußã MKylçäÈæzÏ^´xiÄÆ ÚZ©TZò1ì¹’Ù(?ãì¼ç†‡o Yd5|dȪ@+ëQêëk×Y õ¦eU •õ¨UÁË&>ž]î_ó™™]ºvñðð˜:Í%(Èo¬Ã”ðð•6#6oZc?fòĉöžžóçÍ›9q¢ËÒ¥ lmΟ?;iâø´´ôêÕ«óæ(‚L–3w–Ûï\'Ïš·0j㺈ðõ‹ü—…‡­í=ÿÐû­GŒŠÚ²Ùn¤‡O€÷ŒñA;fº»ýüóÏ {ëÊ Wõc¨³úضL&óœé®T*Þ:éì#ïEbÞ8ÊžŒô´±cÆôµèSµzmóÞ=«Ö¨cÞ»gµuÌûô¬V£®yŸžÕkÕ³0ï]£vý¾½?müÙŠå½zõ’Ér>ª*)äyóçÏ_⿨eËŽNNcZ·î2w®G¯ÞƒçÏ÷7nªÏ,‡I“Æ:êÒÏÆ9:¤¤¤T©b,L[A¨Zµª¾TgÜÈ!¶cGµìßÏ¢q“ϦM›bÖ£ÏðáÃŒ*WíÕ«—~…J¶vö#úwwœ8¥wû–›6oîѽ{nn.Õ+!¶uuuµ´$ïØ ³Qæ5mÚ¤jÕÊ«Vg¤§¦§%«/ƒ‚‚ò]f¤§gg¥/_ J©Túq•I¥ªW¯^Å !kVååfÏŸï;dÈ Nz8àë¯;Œc׳ç€à !kB´$„ ãóòrëÕ««R©Jùצÿ»7G±ø‹/>¯S§ÆŽ­á tW¯^•+ËZ¾, ;+ݱ_ZjÒBßùÙYé‘›6T0ЋŠÍË•­ Z®££­>p‹b["‘Øÿ ûÆQöH$’fM›‚P¯nA6¨ÿÖËú šµjÕ¡__sA~»ú‹ Cõa¥… C÷á«/[‚PŸ2]«pl7lÐ@„Úµj ‚P·N­·^Œ³™ ™ Þ#Žgã_qæÔ1Š@õ¨Õ™ÒŽ¡TêQ=Ù(þ½“îÀÇŒãÙـ̀Ìd6 ³ ³™ ÈlÈl@f22ـ̀Ìd6­¿µtì½[” €ÒžÙ*•ŠzPÚ3»S3Ù|@Ï€Ìd6d6(´(üK™4ÿhÿv‘HtÿîÍhܤÅÇÜ7J.™ ÀÇù›3§Ž½ËbçWˆE"ãlŸiÊɧ™âp<€²Ì€Ìd6æ Ê­oÛ¶/ÜøËOÈlJ‘ÆMZ¼°]}=;3;5%M„ììœoÛ¶/£±Í¾q(uISäùF>ò“üFƆ‚ |Ò°Þ‹§qq/²³s²³sâ_$”Ý¿ˆÌ€ÒØçœ]6t4+Л´8`ÖØþ?|*“ÉÊÇßBf@é’zûnu=ý}ÜÚ¾äG]½zÍÚÆöó/[Íòò~þüÅ¿ú©¢lÕóáýÇ‚ ¨”%síìÙóæ–ÍšenayáâOÅý±›"-^JfAîß½i~l¯ š¡¶:°s^_ˆ/6‰oݺí4Áy”õåŸÏ9ŒµŸé9{Óæ-g‹œt&•ê‰ÄÅž1ô÷ë7ÜgzÍôpýíê%7·é..ܹ[x±›oܸéæ:Ìü…z¨­ ìÛ)I ®ÿRÜK¬Y»nêç^½zH¥Ò >ñ]0÷úõš@²8ô³_·ïÐeGôNÍðqmèúï;›6kþÕ‘£oΦùèÑã>ZµnwôØñ7#þÔ4û±ãšÞÒÖÞ!--½LöÄc ÇvvvN us™Ö±c{]]ÝξŸ2eRHHheÂ7n:þÂBßùÿËÙÂÉl(·Cífý˜õËIx“åò˹~ êҥ˦¦]57ëÖ­»x‘¯úº›»§ÃXûß®^ruæ·È_³L||‘CûW,¶e˯}}æ,?!¶J•*öv£FXSßµØoÁôîÉ))œK^‰›ëŒqã'¥¦¦-]â§nñpw™:Ýõ§Ÿ.5úôÓåËüKaÑ~ùé·mÛw2mß­g'm"íåóø;·îÇ¿ˆÿýê­âÎWúY³¦‹ù.X°è~l¬IãFK–ø5oþYáÅ4øÄr@ÿ¹óøÌŸó¡þ^Ѻ ‚ ¬Ùÿ{”­!¯x™4½wëÝ3û€Y?M`çoLÈÉzë4´RåÌ©cöŽSJ~›´P©Tï^Ÿ’GÛLÛ›õî,Ñúó »J©Š{™pë÷?^>¿}ãn)9Á¸º2‚ ü­ÿÍaá©N_2΀ÒB=°.ünž“Uà´hEæ_‘+üHJ§m+J³>]T*eâëd•R™œ”úüéË„¸Wo ì2T=2JQl¿c´ñ\rlkkk)Uª“‡ÏŠ%âüwýݲ—Zd6”± G ±Ý¬¹‰X".»¿]2æÊOlÿqë^y l2PÞb»ÿud6d6 ³øØ0oðÁœ9uŒ"Ù@&•v"‘ˆ"Ù@&̼3N‡BqÞ/æ @f22ÙËTtâIDAT€Ì€Ìd6 ³ ³™ ÈlÈl@fA­»!Âù²Â÷iIøåWþkr…ª@K‡OuÍïgJÅ‚ HÄ‚B)(”‚REÅø0$bA¥”*A¡Tª?#ùMf§f+Õk=-‘˜Ñ5ŽX$R¨TJ… Pªò¢ßdvf®J,$ A®P±K€N®PÉ•‚B©Òìü~“Ù¹ u°«rå‚H¤’0ÖàCµAò*…JPÌl¹*ÿB‚Àm>‘H(<|þ?îãS¹8'&IEND®B`‚kildclient-2.11.1/doc/C/images/we_misc.png0000644000175000017500000012323511405233117015172 00000000000000‰PNG  IHDRìÙì—tâsRGB®ÎébKGDÿÿÿ ½§“ pHYsÚk¥óÎtIMEÙ,¡°ßÔtEXtCommentCreated with GIMPW IDATxÚìw|ÅÚÇ{RH! p1¡÷.UDÉ %( ¢ÒÁ+¾ "*.b•PB‹XQA/ˆRš€ÒQˆTÓsξ$g³evÏžðûú‰œs¦ììÌìì3Ï<óŒTö£#P3,í”üç¥,B!„B®.Bý±äpŠäþ.Ë2|%I‚,˘$•%_D5®,øÁÏð÷‘Yk7ÙÆ¿fiEÈ¢0Id¹à³!‘EØu\·°ª£ü{•eYù Y.µu ©ÊŽüòËùíæþ,©Ûú:nKÉÃ}jêäê³EB–5c…Y½Y)×Ë}ºû¸ìá>QšïUõŒªÇ å9¶»n¤>kë$Ëžßqê§(ïZrã’í”í a²C–ñÒOûó^-!ñG0Q>+×®Žðò¨æDù@>|çòÍ. …3÷èõ¿nAÎ"žF@*¦<õ‚Haï*AT4À Ãôét/=}À$IÚÁV¦‹¯”]-`ê„ Mݵ%›uã1® $/„zM9%ÉÐ7  ¡€mh{õ=˜Äs÷+Ê(©ÛTpMaBžFè‘eH‡X¸P]ÓÝDqÔýÃìšêÏqÔÏ•Ùuõ÷£y&MÆ ML~„}Ûâwwú¼õ×V l²‰n¨WYVú¡Y©Ÿg—8úçÏêºîú4ksÙå*øl6¡Ð]Óô>\.MÿÑ_SŸ—;½,zÎm!{º¦Uã‚a\¶d= ¤Þ²I¾fýÔPO6ÇseÂ(ˆ¯~oÈúçÊÓ{ËÝ&Â*§“mÖÕs¨ Tc°7ò„UÞ…ÍS?öž‰§ ø;S—|pñüß8‘z/ìÚ'9dY†ÃÇ!áåѼ’‚(¬[OÀeá¿úH6üDÿZ>ªÁÖ΃RØò{¼/«{0:¥|ÁQèL4‘"!Cya©^<ê—¢:?«ë@¦Ž¯¤ ¾(·*¾l3žY|Ið‚ Ôн¬…qÜ‚¾þE¡›¸…_Ñ5eA~¢I”K=‰p¹4E½pµ°!x jÊ'Ëy—nR¬¾¦¬¾O³ºSÅSþD/QÕw—ÉuÕuãr¹ új~|ƒ€œ_VwM_2§=޹&ZvY¯Ü¼?4'u^º6µ©R^ðj¦a/ªÐ-®¡z‡V^œ2KzZN>sçÎáòåË(S¦ *Vª„ê‘‘.’씞žŽS§O#õìY\ºrþþyyW¯®É»4Re÷uȨêDví*™–%ûþu9 Ù²ÊæP/dç-ìƒRh­{qhÙõ|ƒ‡ÝI€,Ð&ÀD˜1èLN‹[80«l“¥WýÄA-„› NÂåmOÚsu9-â·ð\X¡&>·`l–§'C}ï²Ë%4ßQk¿Ô‚ÈÅ x0•‘ušJ+sµÖÝjR+ „qIP¢gÖ¥Ól©5÷"¡ÄlRkõüZ™úšêYÑ ×¢¾"š ¨moÕý×tLq÷&]ØÇõ+VfýÙƒ îù‹fB©Zp™M–ô«fB³Ê4G¿ŠsÝ ë6Ma4ýLТçZ¤}7Œãº•Oïƒ)Œ‰Y¨]7y?™iší ×…Y/ª¼b¥]÷$dçææâèà\j*Ê•+‡ú·×GÙ²!ÈÈÈÀéS§°ëÇQ¡R%ÜvÛmðñññJ^ÉÍÍÅÑ£G‘ššŠráá¨u»!*¡Þm·Á××·TÉ…Å]öòA@¶ä‡3³à ~>°msùòeøúú"((È4Î¥K—æÕM6jÔÐ2|ß¾ý¶Ò»ãé¿›ýfÆÝ½îÆ©“'±vÍZÔ­WOùýÙéÏâãÄDôêÕ³gÏV:qròo0`ñÝwßÃÏßßró™¼aÀýûX Ò D+ñJJËnKS ¬aaRc°[ÖiÌ%ÆN-|j4ÒÌbôæ/²™Í¤@»-Yh_õÌ®…Б0d¶ô-0Ù,ʨшê…ä|AÛÓj¬ÚR%Œë S ½‰ÖÙTp7ÑüºÔ/$µ¹ŒèyÕ ï&K½†¼[ WicE/EÓý*áÍ¥¶¹¶±fW».JMV4Dí§±m×kì­4–jM–! LÑ ¦z ¸‰ $©a3ºúùšb „Dµ .šäiÝä_Ö= jU3€q_€¨_ Íjì˜ÊèV™Jƒ°.œŒê·a·®YqµÐtëãÃŒ¦ lÜM…OM¼·Âwqk× £Ø3Ë377ÇGpÙ²¸­~}—-«LfjÖ¬‰ôô4ü~äw:tõêÕC™2el•!''ÇGÙà`Ô÷"ïÒ@I”ÝO’áçÈ׸€Ÿ¦0î¸]:wÆÜ¹s a©©©˜4iŽŸ8­_]¨¶#L_ Z·nu'Ob÷O?iö_~þ9ïß½¿h:õîÝ?)éüüü fí&‚™mº7½•€íÑv­86žª^.V¦1BÁ€œ?ˆ–áE1ÁÄ@hŠ ·»Ä×ÛHªíEB»Yü’ÚE˸BÓÁ ]hó 6¡›0=][´ W6hu§!OõKÙŽi‰@¢Y×MÒÜZwOÂ;Ì6°©&:jû}µ g&˵HË vÚj2d¥u´#È›ÙΚÙL›M\@/Ðë'f²®.a&ê´¡–ÚLµ¶Z'¨›mî´Ô…š`“U+IÐÇ “<ݵ%Ý8 ·6µÿMjÍLä<Ö">€ëNX‡—º>¾Ù ”™ùŒ§øVc¡'<½«=¾ÓMž÷âÚhêÎëìÙ³ˆˆ¸* 7'©çÎj®ëp8€Zµk!88'OžDõêÕáëëk)·¸\.œ=w*Dx•w5àããsMeÆ’,»~°Ã›9Nœ={9¹¹†°-_î=z`ë¶m3zô5¸÷íÛ_$á¿më6€Ÿ~Ú­üvñâE;v púÔ)œKMU:Þž=y{‡ŽÅ/›µh@0¼ü,4G^MT/RÙbæï•í™JPVÖ’‰9‹z©Y̆ø(Øä&ZBi”Ü›Íô/sádD_†Í¢j™§4ÞÄl‚ÆWoÐä+ë0½-·{ÓœÞ+ˆË¥Ô…zã¡z)tB™FEŠ´nã!t¶Üê¸z\V .­¿~ƒ¦îúšÍÊú?AéÓÈê2é&.ö×=€‹ž)e£¬þ³»Žš ¬&/d÷SýŸY|³¼e]Y 6[Ñm4Õß›{EAÝ]º}ê:]WÔwõíehýFRýµÔ÷¬kcͤV—¿fS²jr kèïºrKj-»ª¿¸týʰ9Yýlª70šôuY7Á)Ì"ºMÛÂDH÷&>ñ5c¶ÉÄ&c¼©bA=ÙͯgI°QÕàà ¿¯‹LÐDf„²~ÉÃûY4ÑŒº¶,ª&]³²nÃF?!øçŸŒððp¤§¥!33Ã0Ƹ\.¤§§ãÊå˸å–ò(_¾<.^¼è±|iii ò:ï .\s™S]öß~ý³f=cÇkâüñǘ9s&L*TÙ½2þÉÈÈȳ©)_^c"óÒK/ai|Š ÎüïjÏ1îhE;¦µÙÌk†ÁBB^w~2‡dÜû CÖÔ‡fÅÁ¡]ýp(ßÅõ¡.f’® û®$“kè5¥ÛR׿¦×—lôQE`Ñå­«Ä‚k˺pɯÆÔ@r?WÆ{öm• )i,d8$ɼ>ä|±G³‚b^Êwu?s¨Wfõ¡ê½ÊÄ3?CçòQéP™ïÉ2 Äwhï jA³C½pæôæ~Z[z‡äÐÜ_Я_qkûµO¦°ß©¢H0›ã´eÿÑŒ’nÿ‰þ¹ƒ¦ßi÷¨\¨ªâjÝ5ûƒ¬*‹¤+»¬·![;ŽAé—Ž‚ÎW ”ë*2Ô=Eÿtýº~—7^¹òïÑ•ßï\† ñ’b®UзóÚ;5Gv)uçPõ]å»+_pÉýÇÝH(œ G—Ë—ìB`` ²²²<®À»\.ddd lHY\¸p¹N'|M´Éy 'ƒ‚ yïÚµ óß~ £Ÿ‹Í›{÷ÕЮ«Ë¾víZ|üq"¾ýö[¼ù曈ŒŒÄ±£G1fì¸pþ<Ê”ñǸqã½.»W»{†Y­rrs±*!¯¾öΞ=‹Ž;âµW_EµjÕJ´b¶nÝŠ§Ÿž†V-[âÃ><9uŠ-»76ìåÊ•GݺõœüŽ?ŽÈÈHüòsžLÏžwá³Ï>Å/{A÷=pìØ1¤¦¦¢V­Z¸õÖ[a}Ô¨ÇѬYs|¾á 8L2?þ,xíÚµÓ\oUB „ÿ<ù8T¾ªÕÝÖmÛ0mÚShÕª>üè#H’„©S&{4q@FÙ2>ùƒ…Ÿ²4£Ör»5?’$Á¡ûÍ¡ þ©^o(Q·NêÍH(á(ôæ!:¥¡m¬`9Zxø‘ÞäÆÌÎYdšãi5Èl¹Ý"¾¥Éƒ—é ¬—øEz,˜1[ò6ü.0#“ óÜ©Wq<õ 9˜™ÂC¸Q݆¯z½¹‹Ðûné>ËçÏËŽdQ;xQç¦Ï–•ËZѾX{u±ò£ïkJû˜Œ¹`ðB#y裲ÉÁH¢65½ÿ"úZ‡~…*A[IëÈOãÐåá°üWÖµ¿Zз«µw:dÀÇá€ËåÄé3gðÙ'Ÿ wŸ>¨’/ûÀ©“'ñù矣Ͻ÷¢råÊðñõ…Ÿ¯/²³²àk²ÿÑét”¼Ýœ8q³_zYYY˜ýâ ˜7ï T©ZU”íä]ÒèË> &»wýçÏŸÇÿ== cÇÃësçBv:Q»vm S¨²{%°ÿõ×_yjý£Gѽ{w¤¤¤ RÅŠ˜7oܱ¸2Û|ê²/~0aâ$DDD&NšŒAƒ{#´mÓÉÉ¿á§Ý»óö_òö¸¸8|öÙ§Ø›ÿýg·v½C¥“¿óî;p¹\˜8q"*ä—sÂÄI™Õv±¦›ÆvËz{w F{j½½­é‰Š›k¥_ëþdAýyÎÂFÞàmIgÇ­¾O}Ùõõd6qíPï0ó`£Ù¸¬¶·Wõ —h2mÒe«çÎìYR×¥^««³£Œû64n#Ms‰6° & .Ñ Ÿ…°njsîAP×k´­"ßúꃬDã´»í5sÕø+Üë$pç+Y( ô„õ^¬&’²îݦGÙ}_šm……¦ÛÎTÃ@ïÍÉD1èé¤e—\Ð=ïºÕ#«²oÍ›‹ƒIûñæs!AFêÕqçw<Ç*­¹éÄe<ûןš¼žzúi͵Ξ=k;ï’F_v¨\ùVŒ= åÊ…!4$åÃÃ1jÔhEX/LÙ½Ò°§¤¤ L™29r$jT¯ŽI“'céÒ¥˜:u*2²³pèäqddç fÅJ¨^©—/¡Rx¹ëvi¸y‹ðóóÃî={ð믿"++ 7Î_ h„ N é@~Úó3Ñ¢EsÛy»t‹{—°G_äÚ23 ¡Ö†Ýe°aÏvY9.äÊ@v.唑“+#Ó™gÓ®±Y¿NlØ Úé’°a‡À§/ÔöÚùÿ¿Ú6ì*ÛYÑ ìT·6Û{KxnK%_má®¶BÔ‡l´Ë7/›Ê;ŒTОyZzɲ>ŒöâÚ}-µ¾ìº|==I2¬Ò{ÓGíÕ›y[JÂ¥íSv‹þ!—ƒòïסµ]†ÙÝÓ+éSáØ ™^[m?®Ü›Ûst{ ”j›~IWV}m_Rí ‘t¿élÓ%HŠ­»¾>d]}(6زlÚÖÂñF#‰úc{Oƒá™Õ¾ˆ4vùî66ìAQ­ˆI:¨¹Ï” žOµ·ªlúg@†,¶Y×}wÛß«·Jêgн·FUÇÐxɳ-ÕŸ~ÏÛ†n›v ߦݡš<¸òëD}_²aEÒ¡ÛQpOyûd÷{IYôuké ú¾¤òÔf¦ÐÓ¯LV¨P&MÅûï-À•+—±"~)|$ 2²FŒ|·Dhæ—‡Ãöªç®4䥾ÖO»~Àݽﵕ÷ÕØõ“ÜsgÿÂ'‰ë’·OÁ%c}âZDT¨ˆˆ l×K¡ö¤¤$´oßOýç?€Ï7lÀü P¥A¶?‚'z݇†ÕkbǯñüªeЮc± ìõë×ÇÞ½{‘œœ‚èè<ÿãÉÉ)%ÒhÔ¨1~úi76mܨêиQ#lØð9¾üjNž<;îè ??%ííQQøå矑œœ‚¨¨(H’„_KDEG 5Œžfá·×¯_öîEJÊaDGGC’$ü–Ÿ§fÉU·<)²a—òý‚ºLµÖÐa×v½4Ú°ël³¯Æ"™•íì5±—¶ðS~]¢÷2ba–!é%[½­¾Í³ ƒ°èÐØ0›)ÄyIöƒB¼‰ŠÿYœ\\èüí#b¬áÅ^ ½K<;Ϲ@;k™F¿·Ä¤l¢¥ì(s eîbrú±ÎÌ «¥Ö&,vÓˆlÚ%ÁÊš•ºPI&èoz“(ÛZtAýLj$Gþ>‡©ÆÛ̆=¯lÊ^Õüp½a­Y¨™ §aI–átåyƒrË *`äã£ñáâ…ÈÍɆ¿¿?†Ž‰rå œ“8NȲËãAAê¼Ûwì„àà@4iÖáåÊ\kÔìݳM›·ô*ï’F]ö çÿÆê•ñðõ‘P­jUÜÕû^løl=Òþ¹‚Õ+ã10îA”+WÞë²{u‡¿ìÝ‹!ƒ+ß_}åÜ7d0Výü? èpDÖÜÝ(¿a]Å^)Æ Ç„ ã1÷¿sðò+¯æþwŽ­´åʕDž çñûï¿£V­Z¶Ò´nÝ?ý´kÖ®ÉÔæ ì ó÷uk×:tì I÷Ø£aÔ¨ÇñßÿÎÁË/¿‡Ã7^Ÿ ‡ÃGG>*-ÌO$I°á#0~ü8%OI’4÷nfÿ+ ÜÚY-}Y.±–/olÞEvÊ’Ù ÉlpÕy`ð8 ìÖ­ì-=¥‘Ì6» N´Œ¯šô¨Íi¼ª`R‡f/cƒm¢™ l±â#Áüà 3›T‘ͪRO‡¹–ȦW÷²ñÔŸaÒÇ5íaÑNvîÉ´ß›,k{¥Å)ÂÄ·¨éÍžOcH𵣡®áaS¨Hà€xó¨•OiXy¡²-íi1»'³1I¶×l®ÆÚ±E/¬.œŒzë ØˆnÑ®êçÌ`rhµÇÀ"GÛ† .ÌÇL .¤€®Ÿ¤zòÔbf¯.ò¹îR™(Jª~£œ¡ 8Ѱ^Õ—u“ øøø =#eƒƒ d«ò· fàìþá;´jÛQ#¬À•þ¿™¼3jLÐç^®:w»S(Ç©·“wI£/ûoÀß×åªTA¯ûîGXX8†ÏׯEzZ~;xmÚwòºì¶×Ž;†sçÎ)f¨\¹2Œ~ |÷Å—ÈÎÎVÂîˆn„Æ5j{}ã5þ¹éÖ­ž~NŸùwöèŽáÇ¡Ï}}må=zÌh„……¡oßû<ž¬ê¦m›<ìiiiðóõET¾Vÿ¶úõáïﯸºìØ^+°·k×óç/@®Ó‰»ï¾ ={Þ‰ÌìlÌ{>Úµkg|Õ-™¼X»víŠYÏÏÂéÓgpç=0l؃¸×ìÞ>ÖíøkõxƒÊÏ:,Žq¶³™NŸ¯¢¡”Çê„R÷`%› º—ZÓ£·±6}ùš¤1ô½õÏîÖ |ÆÛ¶y·ðÁnhgu:ÕËÉ£f›vçríw]úS&ÕýÀíZçߥ·é`£úú£åu×ÖÛÙ‹|´«Ë!ò-²3×ÛŽ«mÄ ¾Ñuvà’¨ÎUvãú?QÜ¢¦–Eu¿ßíúûÔÕ,š¨}± öè÷£¨óí»Ðû‹Wÿ«<Ôi5¶ÞªrhÊí~—î Ãþ+{xO~ÒEÏ¡[to| CðXùB]O-OŠ à­zNM'´i,5ñ*AÖl³ªl²1Z†ql÷ºè½i8ÔKðLÁä=-º†A°×]&i -«É¶zåJUGeÊ +33ß3JUªVÃ}¡r•ªšßsrr™‘ÀÀ@ëÍõ’„À€aÞfØÍ»¤Ñ—=ºQS4kÙ ÷ôAXX8 ,¼îéƒf-[¡A£¦…*»4`öWò nÐöÖ\ˈ «Va„ ؽk—âº&-y¿ÿu׬G›è†x÷ÝwR´%hØØäi÷T§ ÈtÊÈqYf6ì¹²â‡Ý– {® YN©À_{Ž\*lØ¡óPbX¥U}òh¬øbÖ.h›Ù¹J%iÃ.›+ÚMý°›Ü[‰Û°Ëªz“´4‡C ­—òïOµ/@cçëÖ6¨ì/aRj;Uu«9t'—H}¨}w‹ÒÛôî^ÐÖ‡9’õóe÷°iîÜÊŽ_Ôÿ%•€¢ß7!)‚¯Îïv~µ»9õÍ(>õ¡uk§¶ývÛô*+G*éÚMÖ’C»ZgôR¥Û ¨~u¾æm!‹ŸEa;««\²ϰ¯E¶+eU\‡f%B›§æ¹²z¶ó2Ò¸ Tú§¤´9ÚÓݦzÿèßÿ*Ô!9 þüeIÿΔ…õUѼgõöæ:{{aKZí»þ™qß‹,C£Ý— [íÓùP×Ú°Ëš³=$ÍxW`þâôí ¶Ú†]²oôZuƒ–×áÀÅK—pö¯?Q¹reKípVVŽ;†ª‘ÕQ¾|y8s­åÌ’Ì»¤)ɲÿpÆË7ï³oóÝwß¡B… aËäÙm·nÛ_­ûC‡Åû‹#4$„·GŨ,>j^õ¢“L„s³¥,QþIFYGÞƒêðSD3vɦïuÉáÐ}r IDATد—vYp¼{1_À£]o‰]_°|/x^{u+ûGm%ÒÜI6ëXºZ÷\ˆûæa6ÃòÖ¹8®oVe-ÎçÖl¿‡¾}õu [˜G‰Î`£fîH-û¦…{E³~mËFeK_,c§},V¦}ú¶7ÄííÐíMÊlÇ}®Y|3YýŒºëQ`Ó.yz¾<˜Ì Ó™xUòä¢ÑÊ«KFÛaG·j ÿ– ?õP&¯nÏ=åÂÃát:q89aáa¨X©’Æ;;;gNŸÆßÿúQш¸åƒ+i%™wIs5ÊnK`w¹\øæ›o7‡jš×ª‹¤ãÇ0ðÁP1 Ë—/G\\V¯Z_??ø\û¥_™.Y¸šÓÄ\Æ®©‹{[R¹êiôM_^ÞÚ¼Clën5Ú“$¡  »ÞæÝò% ³‹¬mØE¾ÌEEu§äE+žú’¨¼vÓ› n^¤·êŸ’Å$Õ*^¸°:Gµ ô…mæcX˜ÆªE‰‰­¾© jv€‹q¢¸ìàí\ת̖—EÛšù×öô|Š®%Y&d§ïX)RÌ0ù^·3)µ=)ó¢}…‡‰yáÜ“Ou³Ï¢qά­lØõ¶ÿvÆfQŸE{[ çEz'é&7¦>ýáÙß¹,°SW&{n÷ º½"÷g—`†º  KïÉlù²Ä¿*UBpP~ÿýw|·ý[8].ä8ÈÎΆ¯uëÔEËÖmP¶lYdefÚ«J2ï« Ô)é²ûÚÑáœ=û.]º„¸!ƒ ñz·h‰“aÓ/{0kæ „…†bÑ¢E˜·b)îêҪפd^h>¯]43`¡ B%¡Vp׆éÿ5̬ÍâH’e>Âßä‚%M„wÙökÃàgWEµ¤.Y¾zTwçRk)D×ÓÞKAÔƒK3ðºTB‰¬©/Ù%Žç’]º£ÈeUÁ„Æ“E‡i¸ýxi510žiª³6ÑÌI°%ÄkÜ*B=?riÖ\eU=ØI7³æiÅT•.­¡Íd]ùô¶«jqùÿ7Áo.—qÒ¥zi O•cj—¦@¹¾ùƒoÔÜjÒo¢²­d‡lùÝt¢’ßjŸÖ!L]ú>«¾–”WêvÓvW—¡ßÚ^*pÉgèT¿+nýšKµ WÓ´"…Éx'{½Œ"{ÐÝ®@ô‡F©¢ÑŒ©z!"Ú¥6 ´¬Ú½êM’ϽÚ\I­qÖì;Q™Š¨ÛH’ŒïYýŠq¹T}V¶¬/Y8Fɦ û £Ó¢»ÔýÓþûR]_ê0Ù=nÉ¢÷±8ñ»[¦›´ÈS!“;YFvvÂÂBÑ¢e 4mÒYYe(S¦ ’„ìœld¤§{%”–dÞ%/³—lÙU6ì9–/]º„°°0aXVN6ìÙ…#gN£Ê-ÈÊÊD§†Q«ReJÝÅÜôšqO^U>¾e²³²‘•eóèµÈ»¤)βÿpÆOkÃîIÐ 3ãï뇾­Úe5Ø[q1 ZÆ£Ða"dŽÊïú¼!™]W”^6„™-Óé~ÖÆGͺPÛ®ÒèCàBÑXoZ!V}}%LO­­Òk¨\.µÖ[{õ€Xà^Kw©ËèÆK-Œ¨—4õn:ÍŽ­6­;AKÞˆÊÛÒ«ž+þIXÇúúQ¹-s‰4Õ"¡O•¯‰Éƒ•¹†X`“„}ßÊÜ6®YTíË[ —¼ìaòk*¨»?«v¢Š'’ÆgT™`AìEÃX‡0‡Ú±M=1ÖjÅEe/¸Oqÿt¯œ¡÷ê%©¸eM^Ô“R—Ë(`º\ÚQ¡sý'JŸ§±/¨[÷x§Ó >„GûYvéµù².­±Ž]ÊõòÒKÂ*S_ÇÝkæ!ýÚìpñ³`æaEV”2î8êº×,öHâw±Þi4+޽˭º–ÑMÑå§Ó‰ôô =£Øež’Ì»¤)‰²ûzÔ˜@k.¡~ÊP›h…'÷f Yuj˜;ެ™íê:52˜f¸’5 cy?IÞ2ô1T mš8²ziHušr™‚8ºm/ڲʪ%1ÍÓg\n+8Ì@=°ÊÍ´'h ÉðÄhÃÁežöŽÝ#¯bb"å¯ìIŠ?øuUµ› c{J2àr¿£]r¾ ¶í$Yef!kÛSÝÖÖqÜý š:×ZÎÈŠ7YŸq$5Ö·¬î£&m"«ú¦Z–•õ¶¬ñµ_Â!„\K4{gt“7÷{¯ÀÄHÒ‹OB’F(.ˆ£^iSë „§HKgÙÊz/1’Îc—,Pxéã(ïÉxb®âéÊí-HG†ÆkNÞ\QoÎ*iÞ¥Ú•Zh®+A2”×ý¶vï”õ{ØÅžàœç*£1M›@œØ«nU[©îWÛ€nÏ_²ÅõÕ'…«òT{mÆ1žË¢ùI¯ ½dCu‡’4•&iÊm&\F,m’‚zQ‹¢8}_³‡PýYòðÀzx¢­7ÝØ·Ô CzÚ§’ÎÃÎ&C/ãh:—n@5vnÉ0-‘T½‡ ɤLЧӎÀÆpÏVavÊàM<ÉnÊd'ÛÏ !„\'ØV>µk׆üýý‘˜˜èUú÷Þ{aaahÛ¶- %%}úôAxx8üýýeÈ“B!„V`·,´Ã²eË*ßßyçÔ«W'OžÄŸþ ???¼øâ‹š4Ë—/ÇæÍ›át:‘€ØØX¯ÒïÞ½§NÂÒ¥Kä­ôêÕ gΜAjj*âââð裲GB!„bE0û+yP·Fhý¯låÇ̌˶oß¶#FŽƒ\;U%I2ä«ßÈéoÖ¬¶oß®ñ§NB§NpäÈ%]JJ êÔ©#Ì¿0éõdee! @ÉST~âGR¢vÝ(I9ÈÊ „BÈMA@`¨òùúaù–ý¥×†]„ZV ï‡BHHˆ&®¯¯öÖjÕªeš¯ô5jÔ0¤Û±c6n܈””ìÞ½›=ŒB!„;7„v—Ë…¬¬,7™œœí:EJ¯à.\ˆ#F Zµj3f ¾üòKö&B!„róì~~~¦›8áçç§|¯S§Ξ=[èk&ýäÉ“ñí·ßâ‘GAûöí‘‘‘ÁÞD!„Bn=!!qqq¡]íŸÝ͈#°téRüóÏ?HKKÃK/½„îݻ۾VaÒ‡‡‡cãÆÈÌÌÄž={0dÈö&B!„róìýúõC||>^ãòq„ ¸|ù2jÔ¨ˆˆlß¾]ñæb‡Â¤_¼x1fΜ‰ÄÅÅaÊ”)ìM„B!¤Ø)µ^b¡—B!„Ülˆ¼Ä8X-„B!„”^T®O¨%'„B!äÚb”É©a'7-[·}ƒûc!ªAS4hÔ}îí–.»j&^uêE£N½hÛß !„rsâË* 7#Ë–­Àôçfi~;ôëo˜ùü‹8þ<Æ{‚•D!„R5ìä¦dÞ›óïÌöý„}¿ì ³žËæ—'”Š2NNÂáä$6!„B›§3ðëoÉÈÍÍEPPbÿ=‡““°ëÇï4qW­^ƒö»¢aãæxjÚ3šSpÝf+«W¯EÓæm0hðJØÆ›Ðó®{P?ª1zÞÝ_nÚìUÍLd¶lÙŠ»z݋ۣ› ÿý±øõ·dMº¥ñËѲutí~~ùe/Mk!„ ì„\Ä ¸ðú¼7ѾcW¼ðâË8uê´!Þ_|‰iOOÇ_ý…ŒŒL¬^³ï¾÷¾!Þ´ÿ›Ž+W® 0(ðÝw;ðĸ‰8òûÈÍÍÅ‘#¿cÌãñÝw;Š\öÇGÅáÃG““ƒ}û`Ú´g”°O>ýÏÍ|.\Àñã'ðĸ‰llB!„;!×S&OÀãD@@ÒÒÒ°äƒÐµû]xvúLddd(ñ.Zœ'ØÏ}k׬¬Y›hÈoÐÀcÿÞŸ0ó¹góßy²,ãß1°g÷ˆÐ²,ãíùï¹ì÷ßßû~Ù…9¯½  û’%ŠÅþ½»Ñ¡};66!„BëLš8ßm߂ɓ& 44N§ËW$`†j3êoÉ)€žwö@ãF q89 Û¾þÒßðá 00U«TìßðŸ''#44ÿy2ï$ÜýŠn“>iÂ8áî»îdgz–œrðÈÃ#ˆ‘#bcB!7ŠÀ.Ë„Ü,„‡‡ã±GÆ×›7bÌèÇ¿üÊÏårYæskåÊÚË¡ Ëù>U%©èe¾å–òÓrºÿ d#B!×j™\Ö ì„ÜL´ëÐuêE㣥˖–†ÀÀ@ÔªU T äÞV¯.àËM›• œ­Út4äW¦LÍ÷Ûëßxù•×pùò¼üòk€F¹ì’…Ô_»VMÀû‹?@FF¼ó›B¹Î¡ÀNnJÆÌ|þE4nÚ Ñ ›a⤩€1£Wâ=ôÐ0ÀÄIS1à߃@1E±âᇆV­A³m°zÍ:8MÞ%r_ÿ X¾" ·ÀÿÛÅÆ&„B(°rý1fôãxrê$Ô­[þþþ DÓ¦MðÎü71dð@%^ï^wã¹Ï B…¡_ßûðäÔIóïÞ½+æ½þn«W~~~¨S§6¼ýÚ¶i]¢÷7d&N‹°°PÔ­[o¼>@žÍ>!„B®O¤³¿’uk„V•²”³2¯ØJ¼}ÛfŒ9îªåNn.ޤDíºQ8’r•aY–Q?ª1œN'V,ÿM7—›¾Âø SP±Bìø~+‰B)å” Q>ÿï/¬Ø²¿d4ìÛ¶]0$IøçïïÄÄDCÜb›Ác^„\ÕÙ·$¡mÛ< þ Áàöè&?!Ï;M÷î]YA„BÈuJ‰ì]ºt)¡]–eÃ_BBâââ4B;5ü„äñÚ+³Ñ»×݇""nÁÀØ[f<„B)ø–TÆ111X½z5:wî\¬ùöë×ñññˆÕøŸ&„·`Þ믱"!„ˆÛtºzõjÄÄÄ‹¦]$´çää(ßÕf,‰‰‰ð÷÷‡$I EÏž=qàÀMÜE‹¡R¥J ÃðáÃqþüyáuRRRЧO„‡‡ÃßßQQQHLLDRR64ºçËÈÈ@ÕªUqáÂö,B!„RºöÎ;—¨ÐnFll, Ë2NŸ>¾}ûbàÀš8o½õvìØ“'O"44=ö˜i^½zõ™3gššŠ¸¸8<úè£ˆŽŽÆ-·Ü‚/¿Ôžx¹lÙ2tïÞåÊ•cÏ"„B!¥[`w í£GF—.]žž~Un(,, iii€²eËâñÇ×hØ`îܹ¨]»6BBB0qâD|ûí·Â¼öìÙƒÇ ŤI“pîÜ9ÀèÑ£1gÎMü7ß|ÓTø'„B!¤»¬û+¶mÛ†·ß~[·nEPPÐU¹¡%K–`èС¸çž{˜˜ˆõë×â´iÓFù\¥J¤¦¦šæ·cÇ<ûì³4h4h üÞ¯_?$%%aß¾}€íÛ·ò&„B!Ä;Œ2y‰iØ·mÛVbO­¸çž{ðóÏ?ãÞ{ïÅ矎ѣG#>>^G}ˆŒ•Ç… bĈ¨V­ÆŒ£1ñõõÅÈ‘#ñßÿþµë„B!¤d¸î¼ÄyKýüüLÛ4i‚&Mš`äȑسgš7oޏ¸8%|ß¾}hÑ¢àüùó¦6ç“'OÆáÇQ¡B@RR’&|äÈ‘¨[·.¦NŠ-[¶àý÷ßg"„B!ÅJ‰z‰))a=.. ÂðFaÁ‚¸r%ï´ÖcÇŽ„ûñãÇãôéÓHOOÇâŋѶm[a^áááØ¸q#233±gÏ 2D^¹reôîÝ1110`BCCÙ£!„BH騷nÝZ,ºè¤ÓØØXÄÇÇ£_¿~Â4+V¬@BB*Uª¤Ä× ÷ýû÷Gtt4jÔ¨'Nàƒ>æµxñbÌœ9!!!ˆ‹‹Ã”)S qFƒÒ†B!„”%bSº7§—ªãFGG{t#9qâDLœ8Ñc^ݺuCJJŠ&\¯eŒŒDdd$š5kÆÞD!„BŠ« ðdffbþüù:t(+ƒB!„”¾¬‚ÂsË-· U«Vذa+ƒB!„P`/¼1µñ„û€&B!„B(°RʨS/Úë4‡““Xq„Bñ Ú°RdY¶ýg‡o¿ý±ãÕ )š4kÇGÅáÃG®êä£0‘kÅÆ/¿*ÕùB!Å'°Ë€¬ú#„\}â—­ÀŠ•«0ëùØ÷Ë.ìüþŒñ žzúY|µy +HÀ˜'Æ—êü!„oÉä4‰!¤”ðú¼·ðÍÖMÎ{8}}ѲEs¼úò‹2t8ztïÆJ"„BnBhCHiylذÑð{Õñý·_k~{oáûèЩ+¢4Å¡ÃðÇÑ£JXzÑX™°M𵯀¸\.¼üÊ4oÙ 5GìÀ89ò»×eô”OzÑX¿þStéÖõê7Dý¨ÆØôÕæ"å§Çý›ú_õçU«× uÛŽhÒ¬5žüÏÓ¸xéR¡ó#„B(°B1 O=ý,îèÒOM{ «ÖàÈïâ­X¹ Ø´ñ3ìÙ½=ïì±cµíß;¾ÛŠ9¯Î,ùà#äææbû¶ÍØõã÷èÑ£^3×ë2ÚÉç“O?ÇÒßGò¯ûñƼ9;nR‘ò3ý÷pr’f3ïҥ˱:a9¾ÿök”-[Ï<û\‘ò#„B(°BŽ|ëWcæsÏâÖ[oÅÚu‰èy×=è,ΜùS‰—°j zÝÝAAAÀC‡àÓOÖiòùÈC Bõê‘€5k1|ØF``îïß{÷îóºŒvòyö™i¨Zµ*àÎÝ‘››[¤ü¼åéiÿAdd5cÄð±{÷Oì\„B(°BЇèè(ÜÑ©#žó8V­\†µ«W Y³¦-ñ‘#G`™OÕªU4ß;ŽJ•**ßCCCqþü¯Ëg'ŸjÕªk~ÞÒ¤I#åó¿þU©ÈùB!×n:%¤Ó¸q#Ô¨Qí;vQ~ËÍuzLçããã1ŽÓé,–2êóq8ÅšŸ·e¶sïÅ]„BHIB ;!¥„¶íïnõ÷÷Ç-·”W¾×¬Y999^å]£Fuüõ×YåûåË— UÆâʧ°ù?qÂcž¿þ–¬|¾t銔!„RŠvYõG¹Ú öF?1_oýW®\ÓéÄÑ£Ç0}ÆL<òð%^Ì€þزe+233‘™™‰+W¡Ï½ý-ó¾¿_,ùà#¤¥¥!##ë×£\¹r^—±¸ò±›Ÿ¯¯/6}µ²,ã£G1cÆ,MúÀÀ@üqô(ÎKU~›5ë%œ={™X½&M›6.R~„BÈÕÅ(“—Z »$IWíZk×®eß ×œ‘<„‡Ž·ç¿ƒº¡aãóÄx´lÙqC)ñ†=8‡~ý :÷@³m±qã&¼õæë'>>>èxG7´ïØ{öüŒ—,,Ô¤¢8ò±›ŸÛËÌm·7ÂÈ‘£14n°&ý#À}}cÐ¥[Oå·ž={à®^÷âŽ.=pæÌ¼2ûÅ"åG!„\s¹xÀì¯äA]¢e¥LåÇì¬4[‰·oÛŒ#ÇÙ>vÝ[]¾JÇ®^ÍkûI9ˆÚu£p$å`©,_a|uÓ]`É· ë˜BÈõŒ™`åó®³X±e?7RX(–섇õK!„äq]l:•$ ñññ¨]»6|||àïïÄÄDMø¢E‹P©R%„……aøðá8þ¼&\”§þß«i†C'ÝГ-znn.[žB!„P`¿šìÛ·Où|þüyËÃ\~ÿýw¶ôôt,^¼mÛ¶UÂüüü˜˜Y–‘œœŒÑ£GkÒ#99þù'{!„B¡À^ôïßÑÑѨQ£Nœ8>ø@ s{•ñõõEŸ>}0fÌMÚ)S¦ yóæíä !„B¹Ú”Z/1j‹"w‹úß&Nœˆ‰' óêׯ²³³MÓOŸ>Ó§Ogo „B!¥S`—Ð9!„B!בLî`µB!„Rz¹!vžPJ!„BnT|Y„B®¶oÛÌJPÑ©swV!Ø !„Òň‘ãX È[]>’rAvB!¤t «7"’$Ùº7O'zBnXvà„Bȵ†ZsBnvŒ29½ÄB!„RŠ¡ÀN!„BvB!„xË•+W0âáGqåÊV!Ø !ÞP§^t‘ÂK’_~uÓÔsi.¯Ùçk]OE-˦¯6£~Tc´hÙN§ÓðýZpîÜ9H’døs“‘‘Áƒ#44å˗ǰaÃð×_Ù¿V8NŒ=Û·‡Q£Ç]³ú%„P`'ä†äprÒ5»ö˜'ƳI‰1vÜ$¼1ovîø>>>†ïׂ¤¤$téÒ²,kþÜ,X°uëÖŹsçpìØ1T«V C† ±~­˜ùü‹ØùÀ?üˆ™Ï¿ÈHvB!ÄšÜÜ\ÜÙ£;üüü„߯•ÀÞ AÓð/¾ø½{÷F™2e‚‡~[·n…Ëå²~­xnÆ38œœ¤ü=7ãv@B(°BŠ ½9ÄúõŸ¢K·ž¨W¿!êG5Ʀ¯´§5¾ñæÛhÙºš6oƒ™Ï¿¨Yúv›Ô©ÆM[a؈GœœbyÝ:õ¢•Ï.— /¿2Í[¶EƒFÍ;0GŽünZvO×;zôF>: M›·Aý¨Æèywlúj3.^º„º"--M“_zz:Úw슋—.y¼×¢Ö£7÷ï-|:uETƒ¦2tþ8zTs½• «Ñ¤Yk ø÷àBÕ¥šu‰ëÑó®{ЬEŒ?/^ôX§v˪çwaîëoª,"“u¿R÷/QóÔÆ¢z-ª™ÎÁƒ-ö_ýµjÕR¾GDDÀår)¹§pB¡Ànµ>‚‡Râä“O?ÇÒßGò¯ûñƼ9;n’¶|EjÔ¨ï¿ý?ìø¾¾¾˜¿à=%Ümrp89 ;¿ß†Ý»aÜ„ÉÂë¸MHÜ9XòÁGÈÍÍÅöm›±ëÇïÑ£G7¼:g®iY=]oìøI¸ãŽNØùý6ìþß÷è{_üß3Ï!<, ݺuÅŠ•«4ù­LX®]î@xX˜Ç{-J=z{+V®BDD6mü {vïDÏ;{`ìØ‰š<öï?€ßmÅœWgª.Õ|øQ<Þÿ]ìüþth?ó¥î IDATß‹—|ä±N½)«›%|„‹/bÂø' U+ôýKÔßì´±¾^‹jú”””„„„”/_ááá˜0arss•ðsçÎ!,,LùðõõµN!ØK)7ê)zäÚðì3ÓPµjUÀ=ºk„‰• «Ñ½[øûû£L™2xhăX—ø±‚Œô @PP† ˆ/>_oûÚkÖ&bø°ŒÀÀÜß¿/öîÝgßÓõ>ùx † ˆ€€”-[†óçφ?8|¸ÙÙÙòÌ%–|ð†=8ÔÖ½¥½½„UkÐëîž B@@:Ÿ~²N“ÇÈGBPPªW,T]ª™þÌÓ¨Z¥ Ê”)ƒ^½îÂÖ­ÛlթݲÀ²å+qüø üçÉÉ….KQ±ÓÆúz-*IIIOáW›íÛ6{ü#„Ü\P}@ÈU Zµª¦aGŽüŽFMZj~SoÞ{yö ùè(|öùˆ‰é‡ä@÷î]m_ûرã¨T©¢ò=44çÏ_0oçz{öü‚íß~‹£GcÿÊï5jTGttÖ%®ÇÀØ|òéç¨S§6j×®eë^‹RÞÞÇ‘#GMªU«V)R]ªiÐ Jùˆ#¿ÿa«Ní–uõšuX¼äCÄ ¸¿Èe) vÚX_¯EåܹsÊg??? >QQQ˜5k€<¹ËåRq—Ë¥)“§ð«ÍðGÆzŒ3bä8¬„ÜD\·v—Ë…©S§¢|ùò B‡pèÐ!Mœgžyááá¨P¡æÌ™c0s± ׎GíÚµáãã$&&zu-r“?h;—Ë…CI¿hÌ ~;T µíÚå|º~-ºuë‚­Û¶cús³°~ý§E*•ݸ§ë%¬Zƒÿ<õ¨\¹2†Œ/Ô¤høƒxoáûp:X¸h1†?ø€í{-J=z{¹¹ž]äÙÚìºÚ³<Õ©²þôÓ¬O\µkñ÷ßç ]–ÂÞŸ7m\ÒÂpHHRSS•ï+VTV} ++ þþþ¶Ã¯6GRzü#„Ü\\·ö¹sç"''ÇŽƒæÏŸ§žz œ·ôºxñbÀ©S§ššŠhÒ{ ׳|ùrlÞ¼5kÖDbb"bcc•ÞÛ¼QS½z$þþû<þõ¯J¦qn¿½>n¿½>ÆÆ )é îëƒûîëc+ÿ5ªã¯¿ÎâÖ[+._¾ì1Õõ^šý*¾ÞüÊ—/HI9¬IÛªUK„††bñ’ár¹Ð±c{¯îµ8±ºš5k ''Ç+ï&…©K7‡Áí·×\¹ò¦<Õ©²¾øÂL8<òÈp¼>ïMX²PyÏÔ© Y–9>râç¤|Þ}.+¶ì/°a¿ÞƾºuëâôéÓˆŒÌs vá‚ÖSCƒ ššªØ4îÛ·Ï«po(μHéÇ“6°¨>¥ !ÈÛœ;ÿíy7a2æÍ}íšz®!„\=D2ùuk3lØ0Ì;W®\Azz:>üðCDDD(á=öÞ}÷]¤¥¥áÔ©S˜8Q{Ȉ§po(μHéGíýBôG!ÅEHH/z!!!¬ BnbT»¬ú+H’$ü€ &À×ב‘‘¨R¥ vìØM›6)i~øaäää 22­ZµÂÀ5nº<…{CqæE!„Bnfdƒ\®Ø°·¨P`·ž›“a+»ëÉ–ðÂ… hÚ´)Ž=Z¨ðâ¼±mØ !×ó{§0¨mØ­  ;!7.¾~ÊçŸR±bË÷¤ÓˆˆÌ›7÷ß?.]º„9sæ &&Ævxq^‹BñfRB!!þF½±eË–áÉ'ŸÄðáÃŽÁƒãå—_¶^œ×"„R¼Ü¨še»û`¸_† ì7={öDÏž= ^œ×"„R|Ðe.!„;!„RJéÔ¹;í¶ !7V!„B!Ø !„B!Ø !„B¡ÀN!„B¡ÀN!„B¡ÀN!„BvB!„BvB!„B(°B!„B(°B!„BJF`ß¶m[±åµjÕ*H’„U«VyvíÚµ×¼‚õe$‰½ŽB!„\[½K—.Å&´/]ºƒ B||¼×i pÍ+X_Y–Ùë!„BȵØ &&¦ÈB{jj*vî܉ùóçcÇŽøûï¿Ùb„B!俨eYVþŠƒÕ«WYh_¹r%î½÷^„‡‡£OŸ>X¹r¥&\d^âþMý¯û³ËåÂÔ©SQ¾|y¡C‡8tè&íÚµk…2eÊàöÛoÇ—_~‰>úõêÕƒüýý‘˜˜¨¤IIIAŸ>}DEE)á¢2¨Ël§<ñññ¨]»¶ðÚ„B!äÆB#“Ë:½¸éܹs‘…öøøx >0lØ0¯ÌbÜõ$dîܹÈÉÉÁ±cÇššŠ¾}ûâ©§žÒ¤{ýõ×±víZ\¾|#FŒ@¿~ý°lÙ2lܸN§ ˆUâÇÆÆ¢W¯^8sæ RSS‡G}Ô´ jì”gùò娼y³ðÚ„B!äÆG0û+y`׆h‘¦üèÌÍ´•xû¶Í1rœA•$IùmÆŒxî¹ç––†   Û;|ø0z÷îß~ûMzo»í6lذuêÔ1\Gtm}xƒ °aÃDFFÈ3¹iذ!Μ9£ÄOJJBTT ==ÁÁÁøã?P£F á5ôdee! À´ êïvÊ“’’¢Ü¯§kßhI9ˆÚu£p$å ŸTB!„Üøø(Ÿ÷¤aÅ×JÖ­ã¶mÛðöÛocëÖ­^ ë@ÞfÓaÆiÕáÇjó©zpë­·*ßË•+‡sçÎiâÜvÛmÊgw™«W¯n™ïŽ;ðì³ÏbРAhРA±–§V­Z칄B!71%&°oÛ¶ 111X½z5:wîìuúeË–aÚ´iŠý·$I˜6m–-[fš&77×ëë8Ní¬ÆÇÇÇÊãÂ… 1bÄT«V cÆŒÁ—_~Y¤zÓ—Çá «|B!„ ì%@Q„õ;w"00Pctïþ+S¦ ~øáaºßÿÝ2ߺuëâôéÓÊ÷ .ù>'OžŒo¿ý<òÚ·oŒŒ ÛiK¢<„B!„»- +¬yæ0cÇŽ†3K—.øùù!11²,#99£GÖÄ Frr2þüóOyWç΋+W® ==~ø!"""ŠtŸáááØ¸q#233±gÏ 2IJ jJ¢<„B!„»G¶nÝZha=''[¶lA\\œ0|èСشirrr¯)¾¾¾èÓ§ÆŒ£‰;eÊ4oÞ\±Ÿ0a|}}‰*Uª`ÇŽØ´iS‘îuñâŘ9s&BBB‡)S¦X–AMI”‡Ø£N½hÔ©eËV˜†]/÷P’å¾^ê‚B¹‘)/1„%é%Æ-„†††`ÓÆÏq‹!ìprR©ØÕå,‰r_/uA!„Ü(\u/1„”v._¾‚^œ}CÜËáä$ Ö„BÈ vrSÓ¨a|úÙìØùƒiœ?ŽÅ¡ÃРQsÜÝ÷õ‹ÁÞ}û•pµyMËÖеû]HI9Œµë>F‹–íеû]ØýÓMžë?ù =îìÛ£› ×=}±eËVeýhé2´nÛmÚuªÕk ázó•ß’“;0Q š¢aãæxàÁ‡pòÔ)Cü+W¡]ûÎhѪ=â&Bvë¢s—;Q§^4Nž< 8qâ$êÔ‹Fç®=ÙÑ!„ 섎çgN‡¦OÙÙÙÂ8&NÅ?îBff&rrr”tSŸœfˆ7ý¹Y¸páŽ?q&cÚÓÏââ¥K8~ü¦O^‰·é«Í˜4ùIüqô(rrrœœ‚QcÆa×îŸLË™øñzÌ|þEüý÷y¤¦þiOO÷xoã'LÁO{~Fvv6222±cç?aŠ!Þ³Ógâì¹s¸xñ"f<7 ŸoøÂ4O«ºhÛ¶5àû?äÿ»Юmv4B!„;!…#:: qCá£Gñλ‹„q>^· ‡““òÛ¬O\ 8vì¸!Þ ³žÃ'çi¾““Sðì3Ó¸nàð‘#J¼…‹–^Ÿû*øïÌN§ï/þÀ´œK>ÈóŒ406{þþ3Àã½?~ðé'ës™5«–âÅ ¸¿ìù1úå—ÏÛºhÓ¦µFPwÿëä !„R8|Yäfgℱøbã&¼ûÞ"Üwï=Â8{÷îÆ/¾Äwßí >¤ëÞ>½Q¦Lå{¿¾÷" oãˆú@¬C‡~ƒ¶{ïÞ}¦e<|8Oàì±GŒ‘ŒšÅ¨éÝë.¬K\¾ýbÐ : :uÀ°@XX¨&Þ¨Q#Q¶lY<öè#X½f’S[ækVnÁ|çÎát:±sçy¿·¡ÀN!„jØÉMOpp0žyú?ÈÊÊÂôÏÂ/ù÷Ç ‚$IxíÕ—Ló ÔœL$<©Öår ÓŸ?o~p–û´ÝÀ€@Íw+^˜õÆ>1M›4Æé3gðæ[ ðب' ñ2Òµ‡}9æy[ÕEÅ P»VM\¸pëÖ}Œ‹/¢^½º<„B¡ÀNH¡¸û£SG|÷ýCØëóÞ ¸¿ŽŸ8©ü^Xw¦õêÕÌ{ý5JúE1Wùí¹†½þmõ³_~ ˜¿à]×ñóóÃØ'Fa劥X¹<ϤæçŸ1Ä{ç½EÈÈÈPLrêׯoš§§ºh“o¯þÆ[óP»N!„4‰!$ŸÓÿw÷¾™™ÚsÊ—+‡ôôtÜÕë^@Ù²eñÏ?ÿ 5õoT¨àýÉ´#†?ˆ‰“¦bÜøÉšß»t¾ ß›/LóðCÃñĸ‰Hüx=?^/ÔÜëé,öí? ù­q£††xŸ|òÖ¯ÿTs-3<ÕEÛ6­±lÙ œ9“w²/7œB!E‡vBò©V­*F=>Òðû«¯¼ˆZ5kÂÏÏ:´ÃÒÞžÿN¡®soŸÞ˜ýÒ¬ÿgïÎêª7Ž¿ "à< 7‡4ETœAœÔœRÄœïýUWs¨Ûd×2Ë1›K¼ÎYj$âP¦8$ ^sµÒr@sb†óûÃËÑ#Ó'¬ïçyx:笵×Y{í}ìe³ö:jذ¬­­U¹reÐïÏ*p›ž={èÍÉ“T¹reÕppÐÛSŠ^%æ£ç¨s§Ž²³³UÙ²eååé¡Ù³§çÝ¿éï¨zõjªV­ªÞú–zt÷-°Í¢Æ¢}û¶Æé:VVVjÛÖ €»Ä7¢ÔºŸßtŠû÷-¦ŸÖÞ½ûäѾ1Ðóä÷M§·¦ÄºÜ¥ëׯ+%%EÒÍ¿ €bÊ'“3‡À=ãÞ®ƒìííôô  àÇ€p;×׿–{=F’%îa`¸ †|sÓ)PŠ•ÚÀnaaaòcmm­ÚµkëùçŸ7Α-©o¾ùæï ð§ ìÒÍ/cÉýÉÈÈPRR’žxâ 3æ®Ú àÈ€À~O;ji©råÊ)88X+W®äÈ€À^•)SF666Æç S¥J•äáá!IÊÉÉÑK/½¤ªU«ÊÞÞ^:tСC‡Œõsÿ›û¸°ú¹f̘¡ºuëÊÖÖVÞÞÞJJJ2–™³}®ˆˆÙØØÈÂÂB+VT=tàÀÎD<Ú=''GgÏžÕ[o½¥à`Ó¯Nßµk—Μ9£¥K—J’æÌ™£ÌÌLjÔ(EGG+%%EÑÑÑ5j”±Ì××W11qf·=éßoÊ×§«vÄnWÄ7+¾Ê¤ü˯V¨~ýúŠ‰Þ¢±?ÈÚÚZŸ~fRgÍÚõZºx¾’ïׇÌÖ˜±$Ýšþr,)Ñd*L~e•+WVttÌí®“—g{UªT1O¿Ç¼0A;wR\Ì6íŠQÿ~}õú¤7o•ÿoºÍ±¤DÅÅlS7_7±ÀqxÎLIRÕªUUÃÁA‡1–­Ž\£ÀIRÀ?­ºmZÌá#IrppPåÊ•%I -QVV–¶o‹RÂÎuëæ£™³ç˜¼×þýûãVÍž9­ØÇ#?¿9ãtóÂ%úôã´÷§xøëÿž£È5ë´p~X¾muNäŽ%àÑC`J(99YÆç?ýô“IùíÏkÔ¨¡‹ÉÍn;!a—:wî(Õªõ˜^{íe“òå+¾–¯·lllT¶lY…Œ|F«"V›ÔycÒ«ÆiÝ»ù–è{‡ yZó,2ymÉ’eütPþ!uu¸† $[[[•/_^!#GèÒ¥KÆò *(5%UÒÍ¿< Ÿ;Oß 1»};;;ýrâ„.\(z^} y{wÖócÆéÉÝ \ÂR’*V¬ íÛTzzºjü„—LÊ{÷ñÓ²/—ëÆ’¤3gÏšL5)ЧG{Íœõžøå[0ÀOÓgÌγœãÿþZ¸h‰nܸ¡ÔÔ4­ŠˆT•*UîÙñ(®¢Æ©$îöœ”^và.Lÿ‚jÖt³sS………éôéÓÊÈÈÐéÓ§¦fÎΪYÓAãÇ)V»3¦OUrr²:têª^}üԫד&åÁ#†ëúõëêÔ¥›ÜÚz)>a—fÍšfvû¡£Fª_ÿ@³¿ tØ-ÌÊ IDATاuìØño6Í5íÝ·õÑ'Ÿ©¥‹»ÆOü—FiRþþœ™Zÿíµóè$G§fÆUcÌååé¡ôô õéÝ3ßò¾}z)==CžwöàÃeee¥Ž}äÕ±‹vïþI‹λgÇ£¸Š§’¸ÛsPzYLÛdÔµ¹ZW½u…ГaÖÆÛ·Eiäè±úOØÇŒ$î¹.]¼Õ°‘³Ž=Xêûš°ë¿Z±2\ñ;t1ù¢ªW«®¶íÜ5((Pnm\ùcñë™3<ämßʼn Àý ç–6ÆÇ?]*¯å[°J p/¸»µ‘»[›?å¾¥§§kÙ²åêßï)4@¡ÜÚzªeËš?ïs€‡ ÔÎaïï¤FNMò-käÔDýýoÍ¥ }îõëö÷zï <,û÷þWË–.2YuØU­Zu5kÞ*ÏšÂeÊ”QË–­Uí¶/¡axØ‚³gN«nÝú&¯=þx}9sš#€¿„R=‡ýä‰_Ô¼E+ýüóQãkO4pTbâ>5k~ë«ÑCBŸ3^e¯W¿ºúô¥¥¥233uþÜïÚ¹ãG]¾|ÉX¿e+W97k![[;?ÿ»b¢·éÊ•?Œå®mÚª©s YZZêØÑÃÚ¹#F999…öµb¥Êj×ÞKû[-Y[[ëêÕ+Ú•°C'Oülìã[£äêÖVåËWÁ`ЖÍßË‹z_ ¹·õScgY[Yébòý¸}«þøãrž1(鸀À^,çÏÿ®êÝdm]FYY™*S¦ŒjÔԹͿ¸MWŸÆ \¦L96j,oŸZþ•$©IÓfJMMÑ7_©ƒA;««OE¬Zñ¿òæºrå-ÿr‘$Éͽ½Z¹´ÑO» íkWŸî:rø ¶lþ^–––rvn¡»˜ò†ŽôÝúH]»vÕ Îÿ̬÷mÞ¢•,--µâ«Å2 jêÜBnm=µñ[³Æ²¨q@éTª§Ä =ó«ê>^O’T÷ñúúíì™B¯vgdd¨ŒõÍyï™™™:tð€I(mܤ™~þù˜233••¥ƒ‰ûŒaýfpvÖ©“¿(;;[ÙÙÙÚ¿O7¿Þnõª•:tð€²³²”™‘¡û÷ÈÖÖΤN\l´®]»ù•è'Oü,KKK³ß·‘SSØ¿W™™™ÊÊÊÒѤCªá`þW5.(Jý²Ž§Nþ¢†ŽNúåçcjÐÀQÇ-´~ô›Õ­Go5hØHGŽ” <ù‹±¼rå*ÊÎÊ*pûÊ•«jøˆÑ&¯5&WÍšSí:õT©R%Uw¨‘§<7¬—ä}+V¬¤””Æçééé²µ³3{‹”æÀnd0”Êž9sZ:u•­­­«UG?ñM‹§NÐêU+äàPS?^OuêÔS™26:vìˆ$ÉÒÒ¢Ðí-,¤…ó?WNNv±úÙ¸‰³Z´l­ýû~Ò™_O)%å†fRÇPÈ—ä}-, Þ—Û¯Þ›3.(òÉ‹¥þ {VV–ΟûMnî:þweff¹MròE%'_ÔáɪVÝAýýƒé•+WdiiU`0¾zåŠìììtãÆõbõ³];/­\ñ…ÒÒR%IUªT-ÖöE½ïÕ«Wdo_Nׯ_“$•-[¶Ðö*T¨X¬q@édù(tòäÉ_äÔ¸©N™1…ÃÀ 5unn\¿½|ù &SKŽ>¨zõêËÊÚZVÖÖjÒ´™ünû¦¤¤CrlÔXeÊ”‘µuµri£ž½úù¾ééªS÷qYYY©ZuuñîV¬},ê}&Ró­þWn­FNM”––f,ÏÉÉQ½ú $I•*U–§W§b J'ëG¡“§O0÷¢lݲQž^Õ®—¬¬­•““£-›¿7–'Ø«6níäÙ¡³Ê”±Ñ¹ßÏjsÔcùý{ÕÆ­½‚ —u™2úíìý°mS‘ï½}‹¼:tQÇN]uõêíùiW±B{Qï{`ÿ^¹·õРÁÏH’Ξ=£ ß®1–oÙü½ºúô………®^½¢„±ªU»®Ùã€ÒÉ"`Ú&à ïæj]õšñEƒ!Ó¬·o‹ÒÈÑcõŸ°IÜs]ºx«a#g?zÁpnQÆøø§Ë´|ËGcJ ðWE`ìJÂxÓ©±ªü29WØ€RÌš!î^BÂ.-_ñµâv)99YÕªUSÛ¶î(w·6 (1®°w!;;[“ß|[¯¼ú†z÷yJññ ºvíºâãÔ»w_ýëå×õÖ”w”]d[ŽNÍ86|¿©À¶7nŠRçVrs÷4«ß÷Sn¿ºtí¡_ý5Oy||‚ši÷î=yÊΞýMÞ>=îú½Äñ(ÍrrrôÕò•êï?PÎÍ[«¥‹»F‡jÏž½¥~<î<ÏïÇyÂ=¹Âú#‰{îQX}Öì9ºp!YûPùòå¯×©SG¡¡¡zúé§0`€f¿÷^zq|©é÷óÿ|AÇ’Ïob,[¹Fþ’¤€~Zµ:ÒXvøH’T¹rå›ArÑeeeiû¶(%ìŒQ·n>š9{ŽÉ{íß@±?nÕì™ÓŠ}<òSÐø›3N7!\¢O?þ@{ŠW@€¿þï¹1Š\³N ç‡åÛ¦9çDq%&Ê3Õ(—µµµ6xÂäµÍ[·ê‹% uôÈíóÇ ¨m¾Z¾RÕ«Wׯ ë´{Wœztï¦1cÆxž›3Fwö!÷;ðJNN–ƒƒƒYukÔ¨¡‹ÉÍn;!a—:wî(Õªõ˜^{íe“òå+¾–¯·lllT¶lY…Œ|F«"V›ÔycÒ«Æ?çwïæ«¬¬¬bïã°!Okþ‚E&¯-Y²LƒŸÊ?¤®×Áƒdkk«òåË+dä]ºtÉX^¡B¥¦¤Jºù—‡!ƒé»õ‘fõÅÓÓC±q7§Å\ºtI‰««wIRWï.:xð._¾|ó—©Ø8“é0áßD(xÄp•+WNvv¶àß_{÷î3ithˆìííU¯ÞãÅ>ù)lü‹'Iz{Êd5lØ@666:d°ÒÒÒôö”ɪ[7ÿ6Í9'ŠëƪX±¢Ùõß~k²qüJ²Ïwƒ¢¶Y±2\½zö½½½lmm5|Ø­]Sð/SæŒQaç<,,ë”PµjÕtáÂÕ®]»ÈºçÏŸWõjÕÍnûҥ˲¶¾õñlæìlR~üøÏjéânòÚÓrƒÝÝèÞÝWS¦NÓá#IjÒØI »$I..­ Üf÷î=Ú­'Niÿ&eÓ§MÕè¿?«uë¿S` ¿,-,åëÛÕÌÀÞ^‹—|¡‘#´nýwêÓ»§qŸ­¬¬Ô»WO­[ÿ† ¬˜Ø8ñŒqÛ“'O©fÍÆç+VÔ¥K—MÚ¯S§v‰G~ŠÿÂÆI’žx¢¾ñ±­$©v­Z¶gÎ9Q\•*UÒ\QõêÕ̪·ûœß1(l›ãÇËÖÖÖìý1gŒ ;àaá ;PBžÚ¼y³Yu£¢¢äåU¼ oŸ[kmm*rrrt(qñÏýÇ’uäécKË»ÿx[YYiPP üï*ûâ¥ËôtW×¥›W<_~åu=öØc6l°-˜gRÞÕ»³ÖF~#omݶ]ÿ~ómEF®5«/mÝÝ´wï>effjõê[Óarø+rÍ:effjßÞýrss5{|Í ·…|ÿq-dü‹§‚úcaaQ`›æœ¹rçuß9¿ûN-Z4ÓO{öX¾eëfaIö¹¨m²²Š7Gßœ1*-+#@þÝ`¸õSЬ\¹RZ¹r¥Yõ ûZi÷(÷ý¯(8x¸fΜ¡”””B륤¤hÖ¬Y 1Üì¶+T¨ äädãó#GLW˜©Wïq%'_z û9hP ¾Û°QÇŽW\Üõ{ªOuß6SË¿Z¢ jãÚZiiiyê4mÚDƒ‚õîÔ·öùÇšðâËfõÃÎÎNNNNúfÕjYZYÉѱ¡iul(ƒÁ ˆÕ‘jÒ´±É•×úõëéܹóÆçW¯^-Öu<ŠËœq*®âœ·Ö–=ôëßO‹/UNNNž²£GiíÚu÷uŸ‹Úæ‰'ê+33ó¾Œ<4&™ÜpG`/¥–.]ª§Ÿ~Z_|ñ¥J“ÆNòðh'??]¿~=ß:×®]“¿ŸŸ:xyÈÉ©‘Ùm·vi¥%K¿TJJŠÎŸ?¯©ïL7) ð×êÈ5JIIQjjª>Ÿ;Oß 1»};;;ýrâ„.\(z^} y{wÖócÆéÉÝ \ÂR’*V¬ íÛTzzºjü„—LÊ{÷ñÓ²/—ëÆ’¤3gÏšL5)ЧG{Íœõžøå[0ÀOÓgÌγœãÿþZ¸h‰nܸ¡ÔÔ4­ŠˆT•*UîÙñ(®¢Æ©$îöœÈOŸÞ=U®\9ýãÙêàÁCÊÎÎÖ… õŲ¯ôü˜qš8aÜ}Ý碶 ð׿Í[•––¦´´4}µ|¥ú>å_ày~?Æ„RØ/^¼¨¸¸8}úé§Š5¹Â”Ç¿ š5äìÜTaaa:}ú´222túôi………©™³³jÖtÐøqcŠÕîŒéS•œœ¬ºªW?õêõ¤Iyðˆáº~ýº:ué&·¶^ŠOØ¥Y³Ì_;tÔHõëhö7ò´Ž;^àͦ¹¦½û¶>úä3µtq×ø‰ÿÒ¨Q#MÊߟ3Së¿Ý väèÔ̸jŒ¹¼<=”žž¡>½{æ[Þ·O/¥§gÈóŽÀÒ… äá᡹sçÊÉÉÉX>yòd}òÉ'ÊÌÌÔðáÃõÞ{ï¯&ÔwC)›’ô0?zP 9?ßxš°ë¿Z±2\ñ;t1ù¢ªW«®¶íÜ5((Pnm\ùcñë™3<ämßʼn À}uë/Ï{þ¨ å[K÷ö/¾øBÁÁÁ7¯¤Œ‘gZÌ?þñõë×O¿ÿþ»´`ÁI7×l~ê©§4wî\“úaaaêÓ§ªV­ª   õêÕK¿ýö›.^¼¨¡C‡êïÿ»Iý/¿üRQQQÊÎÎÖŠ+tëêâܹsU³fM:ts)9 8ÐXþùçŸËÉÉI¿þú«~ÿýw•)SFï¼óN‘}Ç£ÉÝ­fÍxWÛˆÒÁ{´ý‡(ÍšñîŸ"¬§§§kÙ²åêßï)4A©½Â~ìØ1õîÝ[GŽÜü¢ƒÁ ÆëÛo¿•£££$é±ÇÓ©S§Œ_¡þã?ªcÇŽ2 :zô¨ºvíªcÇŽ©lÙ²ÊÌÌTÆ õý÷ß«iÓ¦ù†[[[ã¾XXXèèÑ£Æ÷Ê}-·ÜÍÍMÑÑѲ³³Ë·ÿ®®®Ú¾}»q¾ï™3gÔ©S'?~¼È¾ã¦Gé ûŸY‹VmÔ²e ÍŸ÷y±–Ð%‘÷ {©]‡}éÒ¥1b„IXÖ_|¡É“'Kº9Ç=7ðæ†ä\5’«««/^¬Ñ£GëË/¿”³³³IXÕ† tôèQíÚµ+O4hP`ÿ:T`XÏ-¿}:Ž$“›ë ë;Pšìßû_€‡¨ÔN‰Y¶l™^}õUYXX^}õU-[¶ÌXÇ`0ܱ6²éïãÇ׌3”­™3gê…^0–Í›7O#GŽTݺuõüóÏëûï¿Ï;8…¬£\Ô·Fæää(==]ƒÁøsûòcEõ(µ=..Nvvv&a7÷§lÙ²Ú±ãæ×“W®\YçÎ3n·ÿ~“v:wî¬Ê•+ë½÷ÞSNNŽzô¸µ"ÆÄ‰­ÐÐPyyy)55µX}trrRFFF厎Ž:þ|åEõ(µ}éÒ¥3&ÿeðžþy-]ºT’Ô¾}{}üñǺ~ýºÎž=«qãò® räH-]ºTׯ_×7ôî»ïÊ×××XnN߀RØ333µyóf :4ßòaÆiãÆÊÌÌÔ¢E‹tîÜ9Õ­[W-[¶4Y¥%×ÀÕ A nú-“ ,Ð[o½¥ *hèСzñÅ‹ÕϱcÇjïÞ½ªW¯žªT©¢ððp…‡‡›ü¢põêUÕ¯__Õ«W×öíÛ¿hH2«ï€EÀ´M† ;V‰±(%ë°ã¯UbÀ_á¶5aö> ë°uv€À€ÀØØØ€ÒìÖB·¯¥nÁÀÜí™ü¹Â”bv€À $¬àî%$ìÒò_+>a—’““U­Z5µmë®AArwkÀã ;p²³³5ùÍ·õÊ«o¨wŸ§Ÿ k×®+>>A½{÷Õ¿^~]oMyGÙÙÙE¶åèÔì®Ê‹cÃ÷› l{ã¦(5qn%7wO³ú}?ݹÏ999újùJõ÷(çæ­ÕÒÅ]#‚CµgÏÞû6V÷kÌ„.]{è×_Íóz||‚ši÷î=yÊΞýMÞ>=îÙ1»ŸçñÃ8€ÀÜ@`}‡QÜŽx­ŠˆPùòåó­S¾|y­ŠˆPlÜIJz$ö+++KÝ»ùªL™2½/uêÔ1>^»î[;wN æÏ•‹K+ÙØØ¨bÅ  —_š¨)S§qRÞÁË«½bïìéééÚ´i³>x¶¾ß¥ŒŒ ÓÀ»C^ž ^>ç ØGÌ¢EKõâ‹/ÉÞÞ¾Ðzöööš0a¢-ZjvÛW®\Õ+¯N’«[{µóè¨e_.ÏSçÃ>‘{»jݦ}ži7ŽN͹VÞ>=äÔ¤…š8·ÒÆMQƲÜÿÞþ8¿²^}úçyß´´4yuìª+W®æ);qâ¤FÿýYµnÓ^Mœ[©GϾÆ÷•nM·qtj¦V­ÛjÄÈP%%-p\Zµ4>^ùu¸F…ç{ÕßϯŸæ¼7Óäµ… —¨cg5jÜÜdÿÍé§£S3-_ñµ\\Û)`à`³¶‘¤°yóÕ¡SW97o­!ÃFè—' ssŽá}(.öí´cçNn[Ówóæ­ruuQ“ÆNjݺ•¶lÙf,3 Ú/OÏ›WØsrr4}Ælµq÷Pó–m4h¨ŽÿÙì>šsß®°óÖÜã¶áûMêѳ¯š6sQ'û(::F«#åÛ½W¾mun?€ÀFýûõÕë“Þ¼Uþ¿é6Ç’³MÝ|}4vÜÄÇáý9·Bxbâ!¹ººä[ÏÚÚZ š9{ŽÙ},ê<ÎOAç­¹ÇmÑ¢%úôã´÷§xøëÿž£È5ë´p~X¾mun?€À­°°05svVÍš?nL±Ú1}ª’““Õ¡SWõêã§^½ž4)1\ׯ_W§.ÝäÖÖKñ »4k–ù+‰„Ž©~ýÍþFËaCžÖ±cÇ ¼Ù4×´wßÖGŸ|¦–.î?ñ_5j¤Iùûsfjý·ÔΣ“šW1‡………>ûäCµquÕ¸ /©Y W=Ù«¯âviþ¼ÏT»v-³÷¿¨~–d›Ï Ó¡ÃGÔ©K7¹ºyhÆúø£÷ ó»=†Åáåé¡ôô õéÝ3ßò¾}z)==CžwöàÃeee¥Ž}äÕ±‹vïþI‹λgçqq•ä¸åA()‹€i› AÞÍÕªò•[)Þ¼¹˜Û·Eiäè±&kü÷Êñ£Õ°‘³Ž=Xêûš°ë¿Z±2\ñ;t1ù¢ªW«®¶íÜ5((Pnm\ùcñë™3<ämßʼn À}”c¸u/ξ?*jùÖDV‰îw·6rwkó§Ü·ôôt-[¶\ýû=Åà! °(”[[OµlÙBóç}Î`ðPûíÓZX&Àÿìßû_€%Ÿ©æÜt ”bv€À€ÀØØØ;;@`ðÀX3J‹íÛ¢™ÃÜ »´|Å׊OØ¥äädU«VMmÛºkPP ÜÝÚ0@ Ä,ùÝpÛ³dggkò›oë•WßPï>O)>>A×®]W||‚z÷üºÞšò޲³³Íj/''G_-_©þþåܼµZº¸kDp¨öìÙ{Oû½áûMÌGDDÈÆÆF666Šˆˆ0)Û¹s§:tèg ‹|ÛJKKÓÀõÁÜu¿,,,Œ?³ŸwöðˆË'“s…¸ ³fÏÑ… ÉÚà€Ê—/o|½N: ÕÓO?­€4û½ôÒ‹ã‹ø|4nüKúã?4ù×äìÜTiiéúnÃ÷ ý‡>ÿô#¹»»Ý“~?ÿÏt,)ñ‘ã   ­X±Âø8##ÃX6qâDÍœ9Ó¬v’““¤çž{N~~~÷èßTÃCïgnìðçE`JèÐá#ŠÛ¯;ãeooŸoòåËkUD„Úµk«#IIjìäT`{k×}«sçÎiÙ‹dee%I²±±QÐÀYZXhÊÔiZ³:ü/7Ι™™Æàš™™i|=""BûÛßäááQdÇ×ðáÃ5{ölµoßþ/ÝOÀ£‡Ub€Z´h©^|ñ¥Ãz.{{{M˜0Q‹--´ÞʯÃ5*$ØÖoçç×OsÞ»u…ÖÑ©Yž:·¿¶qS”š8·’£S3µjÝV#F†*)é¨I=G§fÆÇ999š>c¶Ú¸{¨yË6 4TÇÿlÒö†ï7©GϾjÚÌE=žì£èèE¬Ž”o÷^rjÒBMœ[i㦨Bûx¯deeiÒ¤Iz÷Ýw‹¬»sçN=óÌ3Z²d‰I~üñÇuêÔ)ãóÇËÂÂBÑÑÑÆ×N:¥zõê=Ô~æš1c†êÖ­+[[[y{{+))‰!Ø&6.N>>>fÕõõõULL\¡uÉÕÕ%ß2kkk5lð„Ù}3v‚>ü`¶Ž%%*.f›ºùúh츉’dœ s,)Ñøxá¢%ÊÊÊÒömQJØ£nÝ|4söœ;~AY¢O?þ@{ŠW@€¿þï¹1Š\³N ç‡)éð~}øÁl;ÁXÿ^M¹)S¦Œ"""¡2eÊH’æÎ«®]»ÊÑѱÐm###Õ£G½úê«jذ¡IY‡ôã?Ÿ‡……©U«VZ°`ñµèèhuìØñ¡ö3·š5kêСCº|ù²üýý5pà@>„@`P˜ääd988˜U·Fº˜|±Ð:7nÜPÅŠïIß*T¨ Ô”TI7¯ð­ŒŒ >}Zaaajæì¬š54~\Ñó -,,ôÙ'ª««ÆMxIÍZ¸êÉ^}Ÿ°Kóç}¦ÚµoÍÏ]‘¥qÓ–=ú9 :ؤ­÷çÌÔúo7¨G'9:53®“+tÔHõë(oŸ’¤àÃeee¥Ž}äÕ±‹vïþI‹λ«±¹×Ë:¾øâ‹z÷ÝwÓG¤¼7z¥Q£Fzá…ôÜsÏ{VV–žyæ“zÁÁÁÊÈÈ(Q`¿ý;v¬öîÝ«zõê©J•* Wxx8@ø‹°˜¶ÉäÝL-+þa|ÑÊÊ`ÖÆÛ·Eiäè±&ßöÜ+ÇTÃFÎ:~ô`©ïk®ÿjÅÊpÅïLÐÅ䋪^­ºÚ¶s×  @¹µqå`šéQú7Å¢Tõ³´õ‡c d²³oMÅÜwµ²VlMd•à^pwk#w·6 ¸çìPB¹7¤>Ì+Ûz¥ ¥eú Ó`àÏ›N;€’`J €R‡U; °(¥˜“ @)Õ©‹/W׸sØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØ< ©©©v ´†õ}ûö)#=À”6vvvjÙª•lÊÚØ€RÉ`0>$°¥Sb€RŒ)1@iÇ” tbJ PŠ1%(í¡ÝÖÖø˜À”bv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`€ÿoïÞìª ýöe†AP<Š÷ ˆÚEB.æ¯~J˜‰z´2í˜vôh–i^RSL±<KóRš×N';_¦)¨ Ìüåµ4oˆŠRŠ& Ì0³÷^çpŠÓ £¯×ó̳‡½Ö¬Ù~7Ïû»ø®µÁ‚ì ØÁvì€`Áv@°€`;v@°‚; Ø@°‚ì ØÁ‚ì€`Ávì€`;v@°€`; Ø@°‚; ØÁ‚ì ØÁvì€`Áv@°€`;v@°‚; Ø@°‚ì ØÁ‚ì€`Ávì€`;v@°€`; Ø@°‚; ØÁ‚ì ØÁvì€`Áv@°€`;v@°‚; Ø@°‚ì ØÁ‚Ý€`;v@°‚; Ø@°‚ì ØÁ‚ì€`Ávì€`;v@°€`; Ø@°‚; ØÁ‚ì ØÁvì€`Áv@°€`;v@°‚z€êÊ8ÈŒ§§IXƒ½( £kb°úðhg×`²†; Ø@°«KÕo•­·ÝÎ ¬"¥R)ÏLŸºÜmÛ¼k°Z…V4î‚è‘Üqnå›t×ms·æ^5“¤UA°˜,±&I/kØ` &Øè^×îñï{\•JûŸwkqஃ³ý:­ÝOV*Ö4«ÞÖÛngYÆ*0é®Ûò¹#OxÝ‹N‹¢èûmÞ5x¥_(ùNóäwÑi½þçuðS毛ñwNµ†è¹¿8+3Ï>'óïÿM6;ö¨l|øg_³O££#¥¦¦”*¶oU¬ßüàó¹úö©ER)Š¤È’Ç#o’ö]óï"´:&;‚è‘þx͸üá’Ëò¾Ü+“Û/½$ëîö‘´ нϜ›oÉŒ/MË›çÝWþ ÍmdàÞ¢èükõF‘+o{&g¹[ú´ôJ½(¥ÖHE2Q-çþ×/zD°¯Žq³†èqŠZ-Ïž}nvÿò)0thZúôÉö{ì™çÏ9¯{Ÿö¿Ë̯#{Ž›÷í<2ÓþéÀt<7Óà½EÑ™$ÏÍ^FcÉôWo+Ù¯OKî{üùLšò|îœü|~ùÈ éÓÒ”žr×ÉÕ±†]°=N©ZMË&§cîܤ­-ÅüùÙ|çÓ9ýé,˜üX‹åé#Î:(-}údó#2b=ó̱Ǽ·(:ïrv¾úÿL¹¼dv©TJŠ""éj$µ"]õ"]µ"])¯¢{š÷ÄÉŽ`z¤ÍO;%“'NL6Ú(EggJóæeØÇ÷É̳ÎÉïÇœ’AÃG¤ÿ A)ÚÚR,^œôê•rsórÕh4rí¸ë²ï'Èvïží‡í˜Ã>{D&O~ìÖ«2:‹"w×ïrÍ]¿OGgãÏ“®,9ËÞ(’Z#©7’Z£”z#i×¶ÂãM¼éæðéƒ3dèûó¾íwÈŸ>87ß|˫ŋç¸Nʯ¼ªÇLv;Ð#­7z·t–’?=ñDJ½{§1~62$MµzªsZó®ÝvK㥗’¢È¢ òðOš­/¾p9AYäÄ“NÉ-·ü2gžñÕL~äÜ;éŽìµ×ž9üˆ£òàƒ½íÇrUEgGg=玟’§_^œ“½ìÆRR$iK"½³ž´-ìHÑÙ–Áû/÷xß8çü\qÅæè£ŽÌý¿º;>p_Ž9ú ¹äÒËósÎÿ›¯§µµ5GyL>þ±½sØgYã';¯rÑ)Ðcmño§gò˜S2úÔ±I[[/¼Q‡žT«)fÌH1~ƒçž /È  ÎO¯-·xÍ1&Þts^~ùåüøê¦²ôN2ÍÍÍ9ð€ýS.•rÖ7ÎË„ox[㪈Ηç¶çìkËvïÝ?ðžôjZ2¶ûŸ}û2ûxÑ„$I¥RÊî;n›±‡|$š·à5Ç›4éÞÜÿ¹nü5éÝ»¥ûùï2*;Œž}öÝ?¹sF¹Ü×3sæó9ù”±ùÊØS2lØÐ•:Ùq—€X{Äð4 ˜Y=”·Ü2imMºº–„ú¬Y©Ž_]qEÖ?øŸÓoäNË=Æu×ßÏþÙîXÿKûí÷‰ŒØaD÷ŸŸ}ö¹œsîùyð¡GÒÞÞž¶Ì˜“NȻ ¿u^.¾ôòüá/¦\.çÒK.ìÞž$W|ÿùÑU?Μ9s3|øÐœ}Ö™ÙjàÀîí—^ö\uõµ©ÕjÙoß}òÕ¯œºÜ×¶2­ìèœòû9¹è§Ó²×¨yï óô¬:°_¾3ö€TËIµRJs%éÕTI¯j9½{5¥ïZ½R*%¯Ì[”z½Ñ½ÖýUW_smŽ=æ¨eb½ûïÁÚkçøãŽÉÕ×\»Ü`ì±)9çÜoæ‚ož—-—3i[Ó&;Í’ Çj,Z”öþjß¾KîãÝٙƬY©?ùdšvÝ5¿0!Í6ɦ_8b…ǘ:õ‰Œ1l¹ÛªÕj¶´U÷ŸÿÒ˜ì²Ë¨üú¾»òÐoî˾ŸøxNÿׯ-ó3&þr¥Çú«“Á°–––ôíÛ7‡î°Ì™3g™}Îø×¯dóÍ7O’ì±ûèÔjµîm㯻!{ïµgÖZk­´´´äÐCÎÄ ÿݽ}Üøë3z·]ÓÜÜœ^½zåðÏ}&ÿýÓWùP®¬èüöO§æ®i­ùç}vMWšòììöIJårJår’RŠ”Ò(–\dZo©5ŠÔëEŠ,ùà¤j¥œÅ]µôn^ö_æÎmÍzëýà ÷zë­—ùóç/óÜUW_“'LÌOn¸6]|YÚÚÚÖèÉΊXôHÏ_xqz··ç=Ÿü§4~8éìLšš’r9E­–µúõK±hQê­­©ôÞx…Çéׯ_Z[ç¥ÿõßÐï}ä‘É™tÏ=yöÙ™yü·¿}Íö-¶Ø|…?;cÆŒ´´´¼Îößeûa;.ó\e5|Bëʊήz#)’F’®z‘Îz#Õz9Eg=óÖRJ‘j¹Hï¦RZšJii*w_4Фœ´ôjÊK¯´eó ú.sì¾}û¤mÁ‚¬Û¯ßrwkë¼×L¼ž{nf.½øÂ”Ëå|ñØ£rÚWÏÈå—^´Ò';«:ÚazœW~~sþÿ_æýœÆÃ§¨×SùàÓõîw§iÏ=SÌ™“Êܹyïî»çùó^ÿ û!ƒóèäÉ+Ü~Çww?þº2ö´Ó³É&›äCÊÿëû¯«òŠóªV«¿îki4ybêä<3}j÷×SOLYå㹲ΰŸºÿìôî~7áÎ4¥–-×_+ ÚëyᕎÌ[XKGg#µzþâ«H­¾ä {½ÑHSµœ~}zçš_NÎNÛm¸Ì±G žxp…¿û×÷?¡ÛYæ¹Ó¿:¶ûýØ}ônÙpƒ òãkÆ­‘“Á¼m,|ò©<öyÙùóG$?žú¬Y©žé·Þš›Ï8#mmm©l³Mê?œ­FŽÌ‡͂߮8ªöÛ÷ùá•W¥Ñh¼fÛÓO?“‰oêþó¹ç}+ã®ýQ<`ÿì0bx:::ÞÔkßj«éêêZáö¶Ì+¯ÌYícº2£sÿ‘rÔÞÛæ'¿˜”—f¿’÷l¾v*åRvºqv²QvÞn£|à=f‡m7ÌЭ7Ìv7È6[ôÏ¢ŽZ¦Ìx)ç^uwš+Eþq‡eÿ¥â9(_rY-ZôÚ¿ æ²Ëþ=üé×}mcO=97þlbž|jú7ÙìÀÛÆ¬‹.Íð½÷N¯Å‹Súé4™YS§æ÷OLË ³¿–É&¤2lXŠŽŽäw¿Ë°},3Ï}rÔ1ÇeÚ´'R¯×3{öŸrõ¯Í?1'9±{ßuÖY;“&ݛŋgêÔi9iÌ)oêµjÿOæöÛïLGGG:::rí¸ëòñ}>¹Ìö6!‹-J{{{Á>¼IDATþã{ßÏ¡Ÿ9|•éʎζéŸo¶CîûÍä<øîõÓ(’/û†œxÁõùâù×ç¨s¯Ëçϟþ>>‡~m|Æ\zS~ôó‡²ç° sê§¶Ï_Ðé¨Q#ó¡‘;ç€ÎÝ“îI{{{ÚÛÛs×Ý“ò©ÎN;}0»~x—×}]ÍÍÍùÖùçä´ÓNO{{û7ÙYkØ€eQ#3ýšqÙpذ4í¹gÚZ[óÈMóÞƧצ›äWý8³§OÏzƒ§6eJ6ÙwßL¿÷ž´ÞqWÖýȇ_s¼R©”ï~çÒüç~˜Çœ’çž›™>}ÖÊÎ;ï”|ÿ»Ùl³M»÷=ïܳó¯g|-§žvzcŽþBÆœ|ê~í‡}æ\|Éå9ã̳²`Á‚ìøþrùewoÿìa‡æÛ]’QÞ=íííùÀvÌœ·ÊÇtUDçf믕 ü?ùæõ¿ÍÄ;Z³ßnïO’Üpún÷1¿rÚ)ùùÍ¿Èåßù<ñÄ“I’ÁÛ½7Çó…|tï½ÞÐ1Ã;4ÿvæYùæù笔ÉΪŽöÒþçÝZ¸ëàl¿Nk÷“•JáÿÀ*·õ¶ÛeÆÓÓÞôϽøÝï¥íg7eè¨Qyছ²ÅEd­¡CRÉÂGÍO?3£¿üåÔ|0ÕáÃóä­·¦uÐÀlñ¥ãÞã:é®Ûò¹#OXaHnó®Á)Š¢{ìWet6Š"WÝþLš1/³fÏ˸±»¤(Š”J¥”–žF/—ËÝß÷ô1ÿßN€êõ?ÔùëfüSazŽz½ž®®®ô;ô_ÒY©æ7×ßuŽ;&µ­¤µuÞ’ Jc³M3óÞ{³Ñ!yôúë3ûÅ3èä/¥^¯/sו7³du,}x«¬ìÿ¶F£‘Z­–z½žZ­–Oì¸a6Z»œ+ïhËœ¹s»÷+—Ê)—K)W*©”Ë©V«©T*©V«Ë\¼ûf—ì¬Î÷Ê',U«ÕÒÕUK­Ö•Z­–µöÛ'MÝ+µZ-mm R«×Òh)—KiþÂyìäSSÜrKÖ=ü°lqÀ§’^ÍéììJsóŸo•øvŽð·*:ëõz:;»ºß§®Z-µ®Z¶Û¤9Çî±iæµÎK£h¤\*§R­¤Z©¦Z­¦ÚTMSuÉ÷õz#ÍÍM=â}²†`©ryéÙØ¥ÂS)WRTÝÛ*õJŠ)¥”Ê€-Óç'ã–„`µ)åj%•J%MMÕÕr_óžfeFg©TZæ}Zr½œr¥œ-7X+õF½{IL¥\I¹²t{iéþårªK߯wÚdG°=>Ø{õê•æææE‘F£‘z½ÞýX¯7R¤H¥\N¥RYñK—D¤›ã­ŽèüË÷©Ñh¤(Š¥ïÏÒ¯F#)Š”Ë•T*åîÇJ¥Ò#ß'gØþÊ«+–—®yfÍŒÎR©Ô}–üíü>ù¤SVKtzüûWÇv·uÞ2ïmy}oö¶Ž¬¼1OÜÖ€•™¬ù; ßzú vÑ‚xgóÁEÆ¿Í]b@°‚; ØÁ‚ì ØÁvìÀ×ÞÞ.Ø`Mõ)S¦¤sqÇŸƒ½Ñ00°&èÝ»w¶:4Õ¦^I’êú}«©tÎ[f§z½d¤à-ÐÞÞžÞ½{§eÊ”ttt,Y³ýö™ôû®¬Ý»’R©’Ò©7Þ“¢(Ò{~¹h¯5²Ó >Ù|Ýæ¬ÝR1z°:¢½£#µ4å…¹]¹gF[Öi©äëÓÿXJ’jQ)Š"‹Ö^²pýÖimÅËm]F V³þ}«ùÞç.¹ tée¥ÿÃ.ÀÑŸ‡·IEND®B`‚kildclient-2.11.1/doc/C/images/we_trigger_edit.png0000644000175000017500000005245411405233117016713 00000000000000‰PNG  IHDR¶ñÁÒ pHYsÚk¥óÎtIMEÖ "V­Yž IDATxÚìÝwXÉÿðI) Õ®(¨ˆ tQ)¢4õ,ˆ ‚J±àÙ»ÞWçéÙõ8 ö¢"6äËYõ„³`AìÂÑ[@Bòûc½˜ IEáýz||6³3³3“͇™ÝšŽË牋Ô@ 8úêU~ &BHU%€ ¬¼(‡WVPϤ¬¡¤Ö®iÖ#"?Vài€z¨âóÊ ¾«_ñÔÇOÊ Qä¨6µzþ" ¡á™€zà•Ô»¸¡Aêã'е¦VÏ¿C$MVˆ¬®,£ÑtEv=‚êÊ2«Î€–‹F“@ä­¡©Õ#"i2kLÙ1NC·¿®ëòÿé(H?»®²ðÉŒc8IZrˆ¤58$Ñh´&W¼ m¿ª4_Àç‰æ)|~;ýÌZ^yAOן°HhђШšZ=ò.´ùU•„%5*OuEé«?v¿O<­ÀVÖ÷Ú¤¡gƒS 햻Ю®(!„°5:ÓüÉç^_Ý÷±4O½Gßž®Ë™jêt܈YÆ5X5Ó·_zuâαÄCµÝ,ÚGÞý°íâ+BHÔãj¬yGŸ&½(&„˜wSåU î¿*-²ÊM×ÁPSâ¡g„=¦3Zi |Bθ¾ÜB‘AÛýÝ„øï¾';|ô¨j“2K•˜ôYÎÚƒ 4è4ríIaNñÇIv#ïæl¿ü†ÂV¤ÏrÔ’¶W‰É˜>¸Ó@}VlÆë¼Šð;9äQM¸ú£©ØA³‹?âeXh˳@¦t5s–VNþz|÷?9<õ;BˆX|”PyÚež©u·ÐvšE#$ïñoâ·Ñ×g²Þ3Ôíi ZüŠÌê J¦´kXi¦²ç\MWP4 øYUµ`õX]Ën*…¥•×’3Œº·×íÜúßABÊ?dÜ}®Öµ5K]™õ0ãCrÚÛ’¬d5]+aFEe BˆpæH•U`ÿ+|ûÛvHÎÌTU>KºF|zRÕò«5~ÓÛ¦§Z~IÅõäÌ>ºí ÛB* Þ–gg(uÐýyt7i{•;èn×øK«'¯ žf}h¢³l„6½ªä÷§UªÚÝ’®ÈÂ+ šËB›.c*o 4šÌzäJ¯µßýÏOíõïø8DZ{ÄÚRCdÉëÔ–n„ЄôýsZøLÚcÛ‚¦Ø™Bçè!|¾üÚk¶j/vˆ¬d}“~–ÝTøÏêˆÌ÷EÊêš§Ù©µJÍâû.<¶ê®¢®Ì ÿãÁ¹;Y ŽZue9ƒ¥,ÞGé÷œ¹³ûô[™¦È!ÿ\2è¬J·é©&ßÕ/>+k´ŽZ>¼K;UBˆ€÷Qö^“.lã.­Þü]2qå1šûìŸ/C™`ÓåäÍìÖ]kTÀç«¡k€f4‹$DÖ,RÞôÚê ™¢'ºT÷;&«=ò,´+ ÞT•å«v1¢2°ÔÚ÷rŸL>¾xŸxUËÞ‚ºt¨ÀÑT—É÷‚§B~ þ#ââiu!ämNQÆÛ<-Cº"'åe©0DÒþãè Ÿ¦`,Õ¶Š*­é ±ö‹>¢Õè]â“×lŽ,N~µ°âžU!ïóŠ3ßå«t1¢+²_SA¢Û^YÆÞï:¶"„hµUI:8Kx­vj¤ôƒ@½c̓Òè \ô\‹¬¹@–Zœé2ë ™ÜS8¤.e†LÑó;˜^kЗµÐ.|qÒJË@˜&(’›Wü6Û`| M) 4¢ "ç|šÂi£ÍTm+ºGðÏlŽ®È¦39 ŽŠ€Á’6)¤Ñ>Ç:S‰®À”z¤Oö_åKÊ?28­éŠlº"K˜“NW`Ñ™l«•‹#öDHÝK'„§/ÿþ%øý©à*VUH:(@sZhK¸ƒ2YWZ~¿ƒÏ%ÔPËm¹ÒeÔ#lµ¾ö;øœJ ™ÜSZ{äšEfÜUl¥Éyÿ#¦( DC×üuÂùGÁ3 }·×XäÖ! !„Áâ'ƒ„EtBH§¶j4[•Óé …>ZÊÒfÔ|ª:íŸpO“=ý{Èçóit:5÷îJ{WL]èÝ£íËjºš2k@ÏW0Ó³ËeíýPNéÒ^íMAe»]ÿ^mÇÐNy‘ÿœ›)Œý¢Å‹ ZòBûeÒï:–Ã%Îþ$Öóéæµ| mÙ·}¨øHÝÿPFð¤²Úóïk‘’Ö}AAúm5sѽ4v7òñ]W{ïªJ·ēþ`<-˜ÆP”ÿZä?·k˜Â8}7³tïìk©2l{`ñˆK©fºí´4YÒþV–ó!3F÷fÃ]|ò¤Æ‹5¦f:ÆM[ÿ$×ö»6»&¿(4èªÑŠõyï›üÊø§y¶ú­%îMÌ,yú¦H_K-ô£î½,sìÝ^MI!ùék~e…‚Z'h® mÿà̬»çd^|{Hÿ:õèô!¡òZßô#q¡ý±äo·¤S?OÑ½Šª&‚ŠL~yªžÛ2E%µ7 ¡EÏO©êXÓÙ]åÏš·kž¿|W–¾ö°TÛ)uê¥ÀRÎ{ô¿ºJ¹£[³ 7÷EEþ[>¯ŠÎd©j›*Öhdyö‹²Ïht†Z7sÅVŸ?•ø÷ƒ‹D h¥eÄÖè@£+B¨j5»~çëbò>'÷vʳWoÞBÛ¶`”ƒI×MÇâÂo½Ñè¢ïmÝå݇l‰{•:ê)0•¸¹Y•%¹¼ò"RÍ# L¶Z;¦ZK‰ÁTªyP€f£üï,£ú~-åÑã'JmušZ=µÏ" ! ‰ïv¤)2Ô,õ:¶r»ît‡F“TšÏgkv¦)2Yh &õÇ€©Úš®È¡fÎJí»ÓYJ4ƒÐhìÖ]è :“I£Ñ Ÿ_³ýLµ¶4íÓwYŠìUnß¡¤AYPÕòéŒá&šÔ:|pì~;-¯ºò=Í*ÿ{Ïé *«ß÷Qï`ÛVâ^B£:ÝF›ÎRTWÓŸÞòÉ`µb09„&á Í{¡]Ÿšò×X|µ/4ã´ë.;Kµƒô²=Dc §­¬ÛD UŽ„ü(uè%­Ú¥QoüÍéÆ=Ú²Ôª¨ªNÉÈÙ•ðæïb­®„F_õZÚ^NFW`©u”ؘšhVK톚ȿ¦SÈB;í~Þ‹)yÿ¸ª$¿º²ŒTóNWä°5;+pT™*mh4†¬½tÆZ&^EéÇ’Üz¯m=~ÂTi£ÀnÕÔêùwˆÌÆÏ{B¿ª²²äoš@@£+P3m]AAI…z’ì½-7JrK>–äÖ¯,S¥G¥iÖ#"+ñ4Ôôù­ãõŽ»ÍS¥ ùçv ùX’{ØKƒ@ñ=žËTiƒ{H… € € € € € € € Ð\4«ox»~Ï(ÈÉÎÞ±e…HBȤ€¹xâ V #ýq‹ ‘TÏñô€ òG ®E D D D4±©«gq"ªfbSîÞÅ‹mllØl¶ššÚèÑ£?~ü¥HÃÏÀ´ØYä‰È“………ßJßvîܹ{÷î={ö”””¼ÿ~Á‚S¦L9sæ žuø"!rÞœY7ÿö­ôíçŸ 522RTTTRR²µµ=|øðìÙ³ñ¬À ‘¶¶ÖeeeÉÉÕÜ••õ2`Ú Só~úÆ.CG\º|E¸½4dØÈï Mœ]†ÇÇß<}欣ó0=ýÞúÆÂl„íA»,­lL̬Vý²–Çã5|!O§Ó###ESzöìùúõkj;==}ĈêêêL&ÓÀÀàôéÓ•rTT”¡¡!‹ÅÒ×׿xñbhh¨žžƒÁ`2™¢Ù8о}{555ÿüüüš XµjUÛ¶mÕÔÔfÏž]UU…³  ™‡HBÈòÿ-Ù¸é×êêj±ô9óÚÛ¼•p-åÞw·åÿ·R¸+äð‘A[ï§Üõðp›>sÎÙè˜Cö¦=}¸}[àœ¹ ©Êó ˆºz†TÀ:x(„N§ûûùˆ&ŠâñxúÆTº®žaìùh]Ý„.·¢·±ùõk—´:w«s¤«{xX¨’’!äýû^ã}¯_½X×ÎÄ]¿2)`®è§kRRR>|ø˜˜xáÂ…?ÿüÓÜÜüôéÓ]ºt+XUUÅd2©‚4-55ÕÀÀ€R^^®¬¬üâÅ áäQ˜íêÕ«ƒ "„deeYYYegg‹f033‹‹‹kÕª!äõë×ÌÌÌÄ Ðd¤?îÑÓ@ögl|—0UÚÔçˆ~¾½Çû~ÿýÐvmÛŠ¦ßKN‰OÈÊzõðÑ#ÑônÝ>ŇMéÜ©“„gdö1±>d02¦¦¦„¡C‡®X±âÏ?ÿ Ÿ6mÚùó穽7oÞ¼xñbzzzRR’h©^½zQTÈÖÖÖ–Xy¿~ý¨ --­š í'Ož¨¨|þ«£  €óà›SŸ×-ƒÁX¼xÁúõ›¶ü¶Y˜v<"88ÔßßÇz@ÿÖmf8» —ï$¾-†Ïç§>Lf±X_®«ýúõëÕ«Wç&°{öìÙ²eËüùóÛ·o¯¯¯_§‹f“Ö#.—Ëf³q’|»êùÖq s3‹uóÖmaʦͿE„ñöò´´´¨Ç­ mí®yyùÛ·Ž;н’Åbµýgæ»téÒ„„„~øÁÎÎîãÇõ¨ÿÁƒÔF~~¾†††øu ]Ýœœœa-1DB–,^°ek𡪪J\\BeeejêãE‹~¬kmînÑçbÊË˹\îž½û}|'7¼oóçÏ3fLLLLQQÇKOOŸ1cÆ’%K¨½êêê±±±ÉÉÉ'N¬GýóæÍ{÷î]yyù¡C‡ú÷ï/¶wÒ¤IÇŽ+---++[¿~½££#Î6€"555ÝÇŒ>ܰ~MÐÎÝ}L,,Z:ujœ¿ŸOii©½“E_뻉I¿þºáÓ\¬oúY²dÉ’%KÖ¬YÓ¥K—V­Z¹»»ÛÙÙÍœ9“Ú{èС_~ùEEEe„ ¸Y'®®®:::¯_¿ © ‹‹‹uttÚ´iwäÈœmßœ:ÜÑnújÞÑþ‚÷Ïkøæ|‘;ÚÒ&t yë"@SV‡‰P- ¾ ­ž°Ê@ˆ@ˆIšá§âäÿm3€–"q‰"%³³wÄ®E D D D D D D|cšÕû"ã®_Á3 r²³¯ý·šÛ§k&Ìŵò|ÒD¡YöO?È ÿÇðp-!!! ‰…H]=Cá¿^ßõ`3èç•«ËËËe—нxYâöWpòäÉÿ¤,´ÐYäó´TêߓԿþ¸|¾k×.¿¬^'»È¬Ùó$nîîîÿIYhé m:ÎápÜǸ]ˆ½„A„H  º¢¢"µ•õ2`Ú Só~úÆ.CG\º|…Z›‹®Ð…ÛT‘íA»,­lL̬Vý²–Çã —óá‘&fVîc½©‡g£c;ÑÓï­o`LU+¬YFýOmBV­ZÕ¶m[55µÙ³gWUUQ‰§OŸf2™4MUUÕÅÅåÁƒËBdðùüœœœ »=Üݨ”9óÚÛ¼•p-åÞw·åÿ·’Z˜‹.Ï…Û„°ã::Ú7ã¯Þ¹§¨¨¸k÷^aå>º•p-póêattLhÈ´§·o œ3w¡pÉ/»…Ôȵ±gÏžž={¾yó&;;›Éd®]»–Êæéé!Þ½{çêêêååU³, DÊE8ìml1Ñw²ªªÊ¢…Ÿ./FŸ‰òöòäp8ÛÏwbAAìªÂ#"1™L‹åïçsêt´pWÀÔÉJJJÚÚ]©‡+~Z¦¥¥EqvrN6ëjß¾}#GŽd±Xl6{Þ¼y¡¡¡TºššZii)!¤U«VÓ§OOMMÅ9Buû¢ì¹Û½ä”øø„¬¬W=ªµªŒŒÌ>&–"kv†p[K«³hÎ.]´ÞÏ'Ož¨¨¨|î¶Â§ŽLf±X5w‰†KBÞoÞäóù\.—Íf‹¥92)))))éüùó±±±………¾¾¾8- ‘Cä¦Í¿]½rASS“ò,-­ÖüÚÚ]óòò;uêøuú©««›““Óµkך»ÌÍÍÍÍͧM›vÿþ}„HøS^^Îår÷ìÝïã;¹Ñû¦¤¤ôôéÓììlBȤI“Ž;VZZZVV¶~ýzGÇOß×»wïÝ»w—””B233…7èEËBdCmX¿&hçî>&– -:õs¼›:e’ëhûÁÎbÛþ~>¥¥¥vöN}­ï&&ýúë†ºÍ k{Ó!dñâÅݺu#„ÌŸ?¿¸¸XGG§M›6qqqGŽ¡ò?~<""¢}ûö4º»]³,´X´€£¯Òs>~,É=ì¥ò­w&îú•IsñN-#ýqž²¿5Ò÷x S¥M®EJ›¸ÕúE€oTB$B!´4ø24„H„H€FÔ Qþß6hY!ïø„HÉìì1…€F„k‘‘‘‘‘‘‘‘‘‘‘PC3ü¦y~ù‹àKÔ ÅÎ"µi`xm9šà€Ä^¼\ïfãù„HhæfÍžWï²X:B$Bä—·ek©y?K+›ƒ‡B„ 4]=óÑ1ƒ‡èé÷Ö70¾tù •Îçó7n 4·ìoÔÇÜsÜ„ŒŒLaþðˆH3+÷±ÞTÊö ]–V6&fV«~YËãñ$^%ػí`#Óñý^deQéYY/¦Í05ï§o`ì2t„ðЗ._Ñ70ÖÕ346íë7iêÓgiªdËv Ã»wï©íôôçºz†‰I÷¨‡ïÞ½·³w¤¶ƒƒCm:ôìe$Ú_i•K±Õnlì¥!ÃF~ghâì2<>þæé3g‡‰‘Ø_ê‰ÐÕ3¤6¤•´f×ú½¢¢NQ“îYZ˜SÛW¯]?œþì‘heT.q|Ä„>²3hëý”»nÓgÎ9sèÀ^±"ûK­”Ÿ§¥RÒÆJZ³k}e<ï€ Ÿ…GDzóäp8;wZñÓ2Ñ]+~Z¦¥¥EqvrΞ¢Nžö÷óQVVæpØcÜ\ïß Ì0u²’’’¶vWªZG‡AL&“Åbùûùœ:]óÐ'"O~?lˆ’’›Íö™8þ\ô§°}&ÊÛË“Ãáp8l?߉TºŠŠJyY9!DIIi¼÷¸ØóÑÂ.È>–…¹Ù½{É„ÊÊÊØ‹—vm½zíFYY!$)éžÅ?!rõ/?Sí¯ŒÊ%Ž˜5«WöèÑÉdNï]QQ±fõÊ®]»ˆ‘Ö_yÆJZ³k}e<ïÐ2)`$JKK×ÔÔ ¶ Dwué¢U3ÿË—¯Ú·oGm«©©åç~=kiungddö1±>d05«ÊÌÌd³Ù[u/9%>>!+ëÕÃG„‰Ö­ž6}VÌïÆŽC§ÑËy,s ó°ã'!±/è߯S§Žv¶Ö1¿_ðëžt/Ù×g‚Œþʨ\b~1ݺéP›Ò¹S'ùû+çXÕÚ ‰d<ï€ ŸUWWKxÓk™z Ñâ¢áƒÏç§>Lf±X2ŠóxÕ4Mâ<88ÔßßÇz@ÿÖmf8» §Ò9uâá£Ôë×ããâã‹KJÜF’çXz=u?d(**Ž85ÞlBȘ1£Ûæââ”——ߣGwq\F嵎OÍ:ëÔ_yÆJZ³km§Œç"A$|èõÌÏ/hÛ¶ !Dôˆ4::ÚÙÙ9:u$„K˦­Ý5//ŸÊ&c†UUU¥¨¨(–¾ióoW¯\ÐÔÔ$„^´èGaþaÃ]……S×_¿~­   ÿ±,,̶l rwwÎæÜÜ\wìÜ#¼W#<•7´þr8ìŒÌ¹¹y2Æê«=ï€ÙBõpçñx¶vƒG7|ø°Zç)þ~> Ãv ƒµ­}JÊ_‡ƒ÷KËVZZjgïdÑ×únbÒ¯¿n¨™ÇÏwâãÇOlìÌ,ú_¼xyGÐV*}Ãú5A;w÷1±\°héÔ©ŸCÒÖß6ÿ~>Öª¿®ž!uw[þcY˜›ñx<·Ñ®¢±žÇãYÔ"婼¤õwê”I®£=ì;Ë«¯ö¼C³G 8ú*=çãÇ’ÜÃ^*Í£Kþí¢¢â‘®cn\»ŒÓ¥EÁóÞÂù/aª´i†×"ò!3]=Cª¸E_ëŸW,wvr())=x(dèœ1-žwÀB[®ðº%pÓ¾}ŒMûîZUUµ`þ NK€çÄàŽ¶d¶¶Ö¶¶Ö<ï€Y$ D D D D D D D D D´PÍêˆqׯà9 æ³¥„HBȤ€¹xâ V #ýq‹ ‘TÏñô€ òG ®E D D D4Éyþ|¬®žáùó±òd޽øù§‘äüÕ­FtòäIi»dÿHt“"£Õoh4šzˆ}šÊ–žž>bÄuuu&“i``@¥‹õB lܸQKK‹Íf4(--Mx”-[¶tíÚ•N§‹Ö)­µ“'OVWWïСŽÏ{ IDATî]»ð2hœyæì¹1cFBƸ¹ž9ûy­v<¢ukÍËc’“n»8;Í™³@¸²~ž–*¶Ä åñxqׯ$Þ¹éää°9p‹pWttLhÈ´§·o œ3waCVèÔRZ ×ÔIIIoß¾=räˆh¶C‡1Œ·oß&%%………Õš¾gÏžž={¾yó&;;›Éd®]»V¸Kbý”mÛ¶EEEOž~,É=ì¥";ëË—¯¦L~ùÒïÔ‹ÖÉåûƒû÷hkw%„ŒíÊápÄŠèê œp{è÷£îßÓ©SGj:3l¸ëí›7¨ \¾@U(VVNqׯL ˜+Œ‰4Mt;==]WWWlW¿~ýΜ9Ó¡CBÈÍ›7mlld§›™™ÅÅŵjÕŠòúõëfffÖ¬_l™ššj``@)//WVV~ñâ…ŽŽNÍF UUU1™L*]4ƒ¹¹y\\œ²²rÍC¤¥¥õìÙS¬Ni­íرã«W¯ ! ¶¶¶øH´(é{ô4ýßã%L•6u¸yælô˜1®Â¡û˜Ñg£ÏÍ™=“’™™Éf³å¬çåËWíÛ·£¶ÕÔÔòó „»ºtÑúrƒ"ŒJ¢=zÔ¶m[aª5ýÉ“'**Ÿÿ–(((È®ŸÒ«W/jCII‰¢­­-1ÛÍ›7/^¼˜žžž””$1ÃÓ§O©jêÞ½{ÍDi­ÍÍÍ¥â#Fñ‚¦!òltÌ«W¯ Ü*LÑÖîJ…H¯º~oÕÕÕŸ—ýô/ø>MÑp&Äãñ$f––Îçó¹\®Ä¿ë§0 ±I_Í<{öìÙ²eËüùóÛ·o¯¯¯/±UÒÆYì²[K ;UDF³@Þ”’ò›Í¦., ÿ1™Ì¿þºOéÖMGx+@ŽÙœvvvµ]\\üßößÈÈèï¿ÿ¦¶}š-#Ï?ü°oß¾òòò·oß.X° ÖôI“&;v¬´´´¬¬lýúõŽŽŽÕZuuõØØØŠŠŠäää‰'JìÅäÉ“cbb***¸\îÞ½{MLLd×)­µýúõÛ±cGiiéÛ·oçÎÅ×Ç48DÞºõ稑ÃÅG»ŽLH¸Éãñü|'>~üÄÆÎÁÌ¢ÿÅ‹—w}ZŒO2Éu´‡ý`gÑRþ~> Ãv ƒµ­}JÊ_‡ƒ÷×2ªïÇr/^laaÑ­[7y¦L™RUUÕ¥K—¾}ûŽ7ŽÉdÊNŸ?~qq±ŽŽN›6mâââ$Þ¿®ŸC‡ýòË/***&LX²d‰Ä^Ì;7%%¥K—.'OžŒŠŠ’]§´Ö†„„üý÷ß]ºt166ž0a^ÒÔáŽvÓ'vG»® LMM³²²äL€oTãßÑ–=•ûú.l,mÚ´ =ztQQQ`` ‡‡‡ìthQä ‘ßn”íØ±cK—.õõõUWW÷ööÞ¸q£ìt@ˆlA\\\\\\äO€ß € €…6©Ëo›´¬‰¯c„HÉìì1…€F„k‘‘‘‘‘‘‘‘‘‘‘€ ð¥B¤®ž¡<ÿdÔp.æüØqã{[õ1;nüùó±õh´ð±/KË“pó–¯ß”Ƭ‰>“nÞ’¸ëÒå+úÆ–ª««›Î³+c|¾hY€–;‹ÔFFÙµë6î?phÆôiwnÇ%Þ¹9cú´mÛw¬ß°¹®mþάÙó¤å Ú5oî¬Æ¬¹sgíØ±[â®9snßxûÖ ƒÑtž]ãóEË4_ïËÐnÄÅß¹›x"ü(›Í¦RìÚ™›™Žtu·³³±пõ,-­òãGSS“Æí‚…¹YYYÙ³´´^zzb»x<ž³“#Î'€–>‹¬·cǎϘ>M)***sfÏ=rL¸‚޽4dØÈï Mœ]†ÇÇß<}欣ó0=ýÞúÆ—._]h ÿ¯¹´¿xñ²‹ó¿Ö–­A¦æý,­l æÏÊz0m†©y?}c—¡#„õKËO2Äùb¨XKtõ Ã#"M̬ÜÇzBø|þÆMæ–ýú˜{Ž›‘‘Y§ÎŠ’Q•ÄöˆµêDd”U[3«¥?./,*’¿,BäwÿÁC s³šéÖú''ÿ%|røÈΠ­÷Sîzx¸MŸ9çltÌ¡{Óž>ܾ-pÎÜ…5—ÛÏÓRkþ€í½{)¢ÇŠŒ:Å`Ðo%\;sêDô¹ß?¯Žç-´·x+áZʽ;înËÿo¥ìü„ ssÑÖJkÉÇn%\ ܼÊãñâ®_I¼sÓÉÉasà–zt–"£*i—#D[uäHXdDØÍø«ÊÊÊË—¯¨SY„È/«°°HCC½fº¦¦fqq±ðášÕ+{ôèÎd2'Œ÷®¨¨X³ze×®]!ÎNŽ<OÎc¥?ÏÐÑÑ> ˆôçÉáp:wî´â§eÂôè3QÞ^ž‡ÃaûùN,((ŸÒ­»NZúóZ0u²’’’¶vWBHÔÉÓþ~>ÊÊÊ{Œ›ëýûêÝYUÉcù²»ví¢¬¬ÔÓë)œp=}–&Lß´ù·ˆð#Þ^ž––UUUµæ'„äååijhÔ©1::ÚÙÙ9Ô¶è%…z§ª¬¬—ÒŠ ûRTô¯™»s¾²²277oÏÞýC‡¸È..-bb’††Æ· ~êö¦Ÿoh2gÎÌ;÷9@Ù¸iÓæÀÅKþ§ªª:rÄ÷K/]VZþ;÷Ì™5' ÚXh·Qhöý”ø)c\•€Æ_h‹  Þð­ã‘‘‘‘‘‘‘‘‘‘€ € ÐêöM?¿X¬&|¹´ÐY¤ 6²‹Ÿ‹9?vÜøÞÆF}ÌÇŽþ|l=-ŒÔ±¥þMÂÍ[¾~Sw°&úLJ¸yKâ®K—¯è[Xø¢?E-çŸ(ÙD›*¬°Qj@ˆlµë6î?phÆôiwnÇ%Þ¹9cú´mÛw¬ß°¹®õg©³fÏ“–'(h×¼¹³·ýsçÎÚ±c·Ä]sæ.ܾ-ðö­ £‰?å¢MÅ| 1Ú q#.þÎÝÄáGÙl6•b?ÐÎÜÌt¤«»õ€þx¬gii•?ššš4n,ÌÍÊÊÊž¥¥õÒÓÛÅãñœ¿‰§üj*@ šE;v|ÆôiÂøHQQQ™3{Fè‘cÂå^lì¥!ÃF~ghâì2<>þæé3g‡éé÷Ö70¾tùŠèªPøÍEâÅ‹—]œÿ¶l 25ïgiesðPˆ0VÖË€i3LÍûé» !¬_Z~BÈ!Îk¬îÅZ¢«gibfå>Ö›Âçó7n 4·ìoÔÇÜsÜ„ŒŒÌ:uV"iuÊh¹´¦Ö¬|{Ð.K+3«U¿¬åñxx‘Bä×pÿÁC s³šéÖú''ÿ%|røÈΠ­÷Sîzx¸MŸ9çltÌ¡{Óž>ܾ-pÎÜ…5—ÛÏÓRk®ïÝK=VdÔ)ƒ~+áÚ™S'¢ÏýþyÉ9o¡½ýÀ[ ×RîÝñpw[þ+eç'„X˜›‹¶VZK>|t+áZàæ „àPwýJâ›NN›·Ô£³b¤Õ)£åµ%ìx„ŽŽöÍø«wnÇ)**îÚ½/@ˆü ‹44Ôk¦kjj ®Y½²GîL&sÂxŠ5«WvíÚ…âìä(ÿŒ&ýy†ŽŽŽðaxD¤×8O‡Ó¹s§?-¦GŸ‰òöòäp8ÛÏwbAAìü„nÝuÒÒŸ×Ú€€©“•””¨_ÜŽ:yÚßÏGYY™Ãaqs½ÿAÃ;+­N-—SxD¤£Ã &“Éb±üý|NŽÆ‹Z²¯w-²U+å’ÒRu5µš¡SM$±[·O¡ÃaB:wêT¯p\¨®þ¹Î´´tMM jÛÈÐà_óÍ䔸ø„¬¬W=’'¿ºšZQQQ­ ÐÒê,Ü~ùòUûöí¨m55µüü‚†wVZ2Z.§ŒŒÌ>&–‡Mÿî@3 ‘f¦¦wî$Š]"$„ܹ{×Ĥ´×$F«Ç±ª««étºèCi‹ÊààPëý[·™áì2\v~ªyò¼­GZd¢Å¥³¢u6ü-G|>?õa2‹ÅÂkà«.´'NðÞº-¨¼¼\4±¼¼|{Ð.Ÿ ã÷Xššyùù‡zz=…ó¬§ÏÒ„é›6ÿ~ÄÛËÓÒÒ¢ªªªÖü„¼¼Ö[b/„¢ÙD›'­ÙÒÒåiµXÖÕ346íë7iêÓgi5G#+ëeÀ´¦æýô Œ]†Ž z*Úìš#Ó6°Â½µ¶¹Ñ+”vJÈ>ͤ½¸DÛ{iȰ‘ßš8» ¿yúÌYGçabUÕ:þ2^2u=KåŠf"¯\¹ê7)`úô€®]»ˆ¦‡ÐÑѾõÎí8EEÅ]»÷ÊN'„9v3þª²²òòå+jKbÙU+W=FUééÏ [µr…ì´n­yùbLrÒmg§9sÔº\zž–ZsÝr íéÃíÛçÌ]H%FFb0è·®9u"úÜïë  åñxqׯ$Þ¹éää°9p‹Ä]½výhhpú³G¢õ˽‡ÝJ¸¸yƒìöKÌ&­ÙÒÒålµX~ž–zûæu'G‡yóIXPÏ[ho?ðVµ”{w<ÜÝ–ÿßJ±f‹u¡á# q`Åø2ÚÜèJ;%dœf2ATÈá#;ƒ¶ÞO¹ëáá6}朳Ñ1‡ì«ªÖñ—ý’©ÓY*ÏP4·yähØ™ès'£ŽoÙTRR"º+<"ÒÑa“Éd±Xþ~>§NGËN'„,_öc×®]”••'MòMº—\ópËr8ìM×-Yº¬  `ÉÒe›7­çpØ2t"òä÷Æ())±ÙlŸ‰ãÏEŸª_ßWü´LKK‹âìä(ü;é5ΓÃátîÜiÅOË$Œ:yÚßÏGYY™Ãaqs½ÿÄl«ù™úõZ±ú¥^ÀÔÉJJJµþà­ÄlÒš-#]žf¨¨¨”—•B”””Æ{“ø3èÑg¢¼½<9‡ÃöóXPP »ý ‰+$O›½B§„´ÓLÚ ˆZ³zeÝ™Læ„ñÞkV¯¤æ1¢UÉ3þ2^2u:Kë1¶ßüµÈ—/_mßH§ÓgÍüáËWìØþù¯_FFfKáCƒ!;bbÒ‡ÚèØ¡Ca¡„…¶´²ºº=¼½Ç 6rÉâ…ºº=dgÎÌÌd³Ù ï{—.Z5ÓÒÒ555¨m#CiƒÖ¾};j[MM-?¿@þúeŒž–Vgyš-1›´fKK—³Ö­ž6}VÌïÆŽC§ÑKlÒ½ä”øø„¬¬W=ªµý ‰[×67n…2N‰ºž¢ºuÓ¡6¨ICçNê7þ2^2uj^=Æö›‘ÿ·üGjÃÉÑáöí;ÇÂÂÇ{^^I}˜Ìb±j^v‘˜.ã™–§,!„ÏÈ“™Ç«¦Ñh²T]]]ûtN¯_AQ@Z‰£ÑÑ“‘MZ¤¥ËÙ ‡AgNxø(õúõø¸øøâ’·Ñ£j^< õ÷÷±пu›Î.Ãë}4dêÔæ/Z¡Ø)!ñ4“ýBÖ0‰§½<ã/ã%S§³´cû͇HQ?.]4~¢¿¹¹™~/=Bˆ¶v×¼¼üN:Še“–Nyú,­·‘!!¤¨¨HMM­fieŸ?Ï8vìøÅ ÑS§Í4îÓ›šHJËÜ­›NUU•¢¢¢Œ¾de½¬ß èéõÌÏ/hÛ¶ Õ‰ytt´³³s¨†ש~£×Òš--]þfz#Ož>1Ò­æKbÓæß®^¹ ©©Iy––ö_@ÚÜèÖõ”hÄAgüåyÉÈÙ¼FÛoàv“ÉܼqÝÿþ÷\.—âáî}.¦¼¼œËåîÙ»ßÇw2•MZ:!dÍšõ999\nEdÔiSS o’X–Ë­X²tÙ¦ë4557mX»dé2.·Bv®^»QYYYQQq<üĈ‘nŸþ¶((\º|E d¾x±rÕáA9vFæ‹ÜÜ¿¤¤äñã'Ûƒv9‚J ;¡££}3þêÛqŠŠŠ»vï%„X˜›%ÝK¦2DœˆêÓÛ(êŸYgbÒ=K sjûáÃG·®nÞ ¶¦õÒ*—V¶fqiÙ"£N1ô[ ×Μ:}î÷ZÓëÚ hA!Rx¯FO¿·©y¿‰¾“òòò–.YHí ˆttÄd2Y,–¿ŸÏ©ÓÑTˆ¼w/™RYY{ñÒŽ ­W¯Ý(++#„$%ݳø'DL¬¤¤¤­ÝUÚ¡%V.gYÙÂ#"½Æyr8œÎ;­øi™<é l|M _ó`ÔŒ¬¼¼üÀÁàcaá±ç£544„{322û˜X 2 Bˆ¹…yØñ„Ø‹—ôïשSG;[ë˜ß/xŽuOº—ìë3ʬ¥ÕYö¡%V.gYÙÒÒÒ55?uÁÈРÖô†7šmˆ¤())Í™=³ºšÿÓÏ¿lßH§Ó…«ïÔ‡É,K4³^OÝÙŠŠŠ#NDÍŸ7›2fÌèÀß¶¹¸8ååå÷èѽf¬‘¶´¯Y¹œeed“öŽ%ié o4Û…¶¨¹sf‡„ S´µ»æåå‹·N716Ž:y*/7—ºòØ¿ŸU^n^XX¸™™ Mô^L+o8=½žùùÔöÓgiµ¦¡f@s ‘t:ý×M‚CB³³³©w·ès1ååå\.wÏÞý>¾“©t ³-[ƒÜÝݨ‡4ÍÍÍuÇÎ=Â{5Òp8ìŒÌ¹¹y2*—³¸4Þ^cÃ#"¹ÜŠìììuë6Öš^f@K ‘„Ž;,Z0oÍ?Äßϧ´´ÔÎÞÉ¢¯õÝĤ_ýto×ÂÜŒÇã¹vãæÊãñ,j ‘S§Lría?ØYFår—f¬‡;dzµ µèг—‘¾ñ¥ËŸ>z‘•õ2`Ú Só~úÆ.CGÓuõ ÏFÇ v¢§ß[4?!dËÖ Só~–V6…ˆ®+·í²´²11³ZõËZ'mAª«gH­mŸ>K.¢uõ uõ ‡ wÍ_QQam;¸¨¨X4±Ö£ÔªÖ±âóù7š[ö7êcî9nBFF¦Œ1m¿Ø5‰%¶Mˆ41³rëÝX=hþ!r÷îÝ/^¼ kÛ¶­Œl©©OÌÌLÄ'± ::Ú‡W¯]?œþìÑömsæ.ü´Hœ·ÐÞ~à­„k)÷îx¸»-ÿ¿•ÂüÑÑ1¡!Òž>ÍuŠÁ ßJ¸væÔ‰ès¿ 3‡ÐÑѾõÎí8EEÅ]»÷J[>OK½}󺓣üù‹È?wŸž§¥>OKUWW‹KøÜ€s1Öú©©©Öé(µªu¬‚CBy<^Üõ+‰wn:99lÜ"cLDÛ/Z¡´’ááÃG·®nÞÐX=hž!òرc¯_¿&„$&&îÚµkÛ¶mµ)++SUU­eµþËÏÚÚ] !ÎNŽÂYIô™(o/O‡Ãá°ý|'ó¯øi™–––XþðˆH¯qž§sçN+~Z&Ìéè0ˆÉd²X,?ŸS§£k6@EE¥¼¬œ¢¤¤4Þ{\ìyñ<Ç{8,|zÌÛËS4ƒV/_¾jß¾0s~~A­c(ÿ@É ¥Õ¹q{ ÐÖú·n3ÃÙeøç90]Â,¸ººZbø|~êÃd‹%£‘ƒÎœ:ñðQêõëñqññÅ%%n£G‰f`0ã<= ùuÓúÃGŽyý{ )çQe¬„h—%މDÒJFÑ'¨Qz Ð<Ú„mmíóçÏ/_¾\Ή먑!‡ðù|±‰LÌïçeÜ´ù·ˆð#Þ^ž––UUUµHO¯§pVEÝoù§Á]óòòåO†^ãÆ®[»jÿ¾ÝK–JX~Žçqñâåôôç·oÿ9jäðÃ"×Q8V::ÚÙÙ9ÔvqqqýŽ"m Dee½”~4BOšmˆ¤æK–,‘3óÈßsØœfÌ~üøIuuõßç†96köüE çË.¨ªª—PYY™šúxÑ¢k=·×ØðˆH.·";;{ݺÂtw·ès1ååå\.wÏÞý>¾“k–6ÜõXXxYY!äõë× ŸfÙ;#óEnn!¤]Û¶ƒ œ=wÁçV­Z‰Õ ÏQ>VcÜ\ƒCBËÊʸ܊“§ÎhhhÔã(ÒJAAáÒå+ óÅ‹•«ÖH+Þ(=hÎ!²Nh4ÚžÝAf¦¦ó,6ìmæ2txÒ½äC÷tîÜIvÁ ë×íÜÝÇÄrÁ¢¥S§Öþ:ëáÎãñlí3nøðaŠŠŠTº¿ŸOii©½“E_뻉I¿þº¡fÙ­¿mþý|¬U;]=Cêî6•>uÊ$×Ñöƒ©‡Ç{=žá]c•-çQ>Vþ~> Ãv ƒµ­}JÊ_‡ƒ÷×ã(ÒŠºÞë»>Ó¦Íòõ™ ­¸ŒžŠ¾mHÚ6À7pôUzÎÇ%¹‡½TjÍýÍ}F»¨¨x¤ë˜×.7nµoß¾óïÓX_šÝ£§Áþ­ã_h d‹»~eRÀ\|Úš&ßã%L•6u»]óEÏæšñ·~‡³èkýóŠåÎN%%¥… âÒ¸í¬¨¨8zì¸ë¨‘ÿá“'ñoU]‡ëK@3Є~»¦±âï–ÀM›6.^ò?UUÕ‘#¾_²xAã¶ÓÒÊÚÄØøÀþÝßúX}é@ˆlŠlm­mm­¿\ýïßÃ@´øJ]„H„H€F¤€!h ëýC€ÙÜÐh4 B$H†÷N4Y¸ € € € € € € € € € € 5Ôí3ÚßÜÏ{|½I²3HûÞiáµ~ñTWÏPbAiéu­€|åoúA0€oK£]‹\½zõõë×1 €)nÓ¦MOž<144¬w ºz†g£c;ÑÓï­o`|éò§oáÎÊz0m†©y?}c—¡#„é„Ógκ nfÑoî¼E………5ëÜ´ËÒÊÆÄÌjÕ/ky<•XTTü¿e?™š÷ë7ÀîØ±ã8àˆÈÝ»w¿xñ",,¬mÛ¶ ©'::&4ä@ÚÓ‡Û·Ι»Jœ3o¡½ýÀ[ ×RîÝñpw[þ+…ùC=xpïí›7l¬û «-ìx„ŽŽöÍø«wnÇ)**îÚ½—JÿéçUŽƒïÜŽ;uò4ÎhüyìØ±×¯_BwíÚµmÛ69§Š5ÿ ÷®øi™––!ÄÙÉQ8é‹>åíåÉáp8¶ŸïÄ‚‚aþŸZ®Õ¹3‹Å6lȵkâküðˆHG‡AL&“Åbùûùœ:M¥'&& hËd2;wî´|ù8@†zÞ®9xðàÌ™3ýýý_½zµdÉ&“)O)Ù·kºtÑ’˜~/9%>>!+ëÕÃGDÓŒ ¨ ‡“‘ùB¬TFFfKáCƒAmäç((|굡ÎhüyõêÕ—/_üùçŸaaa3¡¥K˜Ò†õ÷÷±пu›Î.Ã…»dÿ*ŸÏO}˜Ìb±j®¦"¦‚g4~ˆ$„hkkŸ?>00Pbj,›6ÿvõÊMMMBȳ´4Ñ]ii醆„²²²Ú×h^×¼¼üN:Š¥«¨¨äææ¶oßžòäé3œ kêÖ cÉ’%_´}ªª*qq •••©©-ú×¥Ã5k7äüýwEEEô¹ßmmmÄ z¸»EŸ‹)//çr¹{öî÷ñL¥›š9V^^ž½zÍzœð¥Bd]ɾ]#цõk‚vîîcb¹`ÑÒ©S'‹îþýÐaß»ZZÙÄÅ'Ì›3S¬ ¿ŸOii©½“E_뻉I¿þºáÓ´tãÚ¼ü»Áßps9gÈ@ 8ú*=çãÇ’ÜÃ^*òÄ8y*ŧhà[ç{¼„©Ò¦n×"û÷3Ú_Á×ûŒ6B!|sð}‘‘‘‘‘‘‘‘‘‘‘€ € € € € € € € Ðl‰ÿvMÜõ+h±ü§ÎÉH,5DR90LB¤½£hhÉp-!!!àkPÀ@³Ô£§F£=OK•‘AWÏ£D‘1J‘Ðlµð÷fÈùg@ÐÂÿŠ` ø[RÏ¿"¸ € µ¡.M¶œÿåZ‰}•žóñcIîa/œ"Ðlôèi€k‘“æÖz»F P¥«g(;ss""åvïñ¦JÌ"€™wu›ë|Y¸]äËÍ"-ú ¨™˜ôç­oåïB$|©Y¤®žáù['¨mn·¨°˜ÂåVXôðßFIùÿ`¡ ðé5#qñÕrÞ\ý%zª®©FÑîÖåÝëÞçp¹\nEö»œoèïB$ÑÕ3L˜½(ØÆQ,Lèêþî8RFìàóùÇÃO¸º50256íë7iê_ÝÿFƒÚ—»ùòÅëÊÊÊZ³‹9?vÜøÞÆF}ÌÇŽþ|¬ìÎVVVΞ» äð‘/:tXhòÿíyPSGÀ_d5 ¨LE.gZGñ ÄD#2 Z«¢c=FnTPTb9Tkm-[j-È¡àŒDlE£ŽÑ„p‚Ä D sTxé¯óŒI—¡ßoç½Ï};™Ùß~ûvߊ -"±…±‰Z/ºá¹VÞØÔÙ#J¥24l»D"Ù³;ÚÞ~¢B¡¸zõÚúÀà¤Äxƒþ)Žz²äãê:A”¨’@ìôS–˜Ÿ÷óø…a¡¬é :@äñùûö(+¯ˆŠÜ¦µ¼D"am ÷ö^3ßÝ ²HÐû´k‡ žHâ~,hx®#ëihh8sú•ê@"‘(ÊÊ•ßDFnÛû‰6ÂG©Gëú ™l¬Ã·¹y<~á…Œs®s\LLLÈdc×9.Y™é×®sîÜÕ,ÿäI}ÐÆÍa¡¬Þù±GY$(Þƒ%’¸E’æ˜ Agµ~]€jpÙÒ%ñ‡a×µµuA69Nsš`ï°`á’k×9xÿÌfçÌuûjü„)ìð¸R©^¾>^X<ã|fFZ2‰DB$Àßw—+d³>²È¾Xóc[kÛç– ÏÅ‚!ó\6‘@0"0n3ÎÊaÚä´3YjÏJ$-#F ׬ÓÜܼµµ¿M9—Æã^ÌJ Û>æH¡ôþƒ@Ø =„êâÌ"»Ë^dff&‘´Œ5RG™¢â’¼¼üÚÚ'÷ï«Æ­­­4 ×ÔÔ¨M61=ª™Jeà·jSûEb~¬«©GQÔÒzŒ¥õAˆÄ÷“T"‘ÐÞÞñ°êQæ¹ìb~™Ú¦ÈaÃ>û»­m¸™™¦:ÍT‚uuOâ"‰[6oŒŠÞ}4þ×~`¢ ]/^keòdû’ÒRÍø·ð rdä. /ÏÕ§N&~ÐñˆZº^{{‡Öã QVW‹…ØŸ¢r=5B_üX_ûEQµŸÓò¦µ° ¸¤°BÓ‚Ðy¼BÍšy|>•:¿Ý‰µ›»Û<‹Ñ£SÓ2úa<EàÇ÷‹3‹8lìdÙ¥2–-õ8ûGŠšÄâ‡9WþÄ®üå|FŠçšÕ ýÝ»w]þ’qãì´³µµyýºYßíл,óãóú—(ÚéѼMÍeEÂÚGõ%…åZ?ªññö<|$A*•ª¥Ri|B¢¯·—Ö:#wD\ʾ\õ@¬ïñ u?æ‡D`~ÄgåÒ‰ÃÍ»|ÖcÉ"²1yã¦ÊJQGGÇ«WMÉ)©[BB#ÂC±¦¦.7_¡P…•‘]V¸rÅò›·n+ ¹\žžqa‰Çr<ξœ#•Je2Ùñ§|ýÖ œ,Rp¯Àsq ;ë/…ü­^QÙ#ÙáxRÍÑ14lÛ¤)´  ŠŠÏœ>>v¬%V vßO Ç’¦Ra;»öš¿ŸOe¥ˆé2FŸ™›{ýhÂa,àïÛÖÖæâêNŸ>‹_(ˆ‹Ó˾Ë^¿‹Ü+àÞ(¸™ËíhïP+Qå‹g •åUOëž•—Têþ({gÔöàࠣǎ3f03˜G“‚ƒƒ¢wîÐñˆ­¿¿ï÷{öêu<€ó"ÁI÷Ï‹Äz‹ª ¾?éw¦›…±Iwm,ý|^$ÝÉ™éêäöµ«R‰¾nz£DÑ7Í-Ïê_4¾|%º/þßöÑÑDˆÎó"aEêhvj±PÓ›=ÊD>E±öñ7 îМŒ Q¥òVnÑ€¨úO}ÉéôtQ7«E@/»å ;ƒ¶ïßhc–œ`ÿ%рأ´±ÿ[ÞEЯY$nɪʇsZÝý¼ @ï­Ñ¥%ÓxŠ`¾7€,€o!òw÷ÇØô Nà?‰í馟!ÛDlú@·) : @ÏÒh=8EÐó U†Ôú,´’þ€mP$( ŠE LþÛôC¢ŒòKo‚æÀ­ˆ¨î‹ÄîœAöóìá˜IEND®B`‚kildclient-2.11.1/doc/C/images/we_timer_edit.png0000644000175000017500000003435411405233117016367 00000000000000‰PNG  IHDRÛP8Ü pHYsÚk¥óÎtIMEÕ „Ú+ IDATxÚí_hÛØ¾ï½¨°¡´P…Æf c³ ;fç!*9›ŒC/¤fö¤{`79…ÓäNë݇âö@wÒ‡¹Íl˜[OagJ3pK\8¡îCÎö†q!¥.LÁ† HPƒŒ ÷A¶¢Øò¿4IÓôûA´Š¼þH¿µôÕoý´$Ÿ¡MˆÖùÿºMv€è™I"âÄÙæíêŠ,Ú› Å°kºLwWd§s"ÎI3I¯rnîÆÎIÉ“Q¡Bù UªTzEd¾wí$1’? 婇É2H¥ÊK::0ï6>‰ybŒœ®qô‹³E'"27ÉqI's"Æ⦥Ï;­AL‘,é¡Ô?©¤¡íˆˆQÄO‘cDDºI¥u›ðŸÑ³ÕV<"Òu=~~z“"ç359æ&•tÚåó^b¤xˆˆ2Ïh¡H†‰†ÛDàCÿ„|Ò9•t"&`?ø[ŠDL "Zù¥8sc–¬“ÛöŸuNù ‰#™c]•Ë9•ëái™ñ^s1dÑü/´¸Ð…Õß(ùˆÃÌÇHöðrÕÙh€íd "¶¥\\甫RÈÇ$FûÑÜrF`D¹ÌmË;οԉÈRbÃä5MçœjÁ +ˆa’$Iåu6«úrÉbD… -!Ç-ÑLšYæ3ÃÌçaå*'âev‚]“>ˆ8Ï¿äá£(ö™ZÔàB…“ig…6¸HÄbI+Í7‰LƉ×ê$ÒuÎÎÛJ.OíV^ê1'+ÚR^§ì R’̨T­ vÛË.I«‡.L^¨ðÃL9$‘Ps‰H`¢TKʼn4]“Û6ÝéóúHôÔüekÌ;5ꉸ¦[a]& DDåßtÿa™sNck&œ¸É™ÀÊ¿é^¯ÄLÞ*—xð†ÑœËˈˆr/¶g‚]›B¬Ÿ¢?lˆir¨C–æœÙß %*Uòy™:™[°ƒQ‡ˆÉ^Ñ5Íê¯å6Ògå2~m§÷~ 6ä"“‘aÖ"eƉɒTSäŠÎislR_׈ˆs ô{[íz~­Ì<¤¯kÞ$¾9 œ{™äX‰EQ,¿28çÜ$;—5ô.–‰Ì^ÅŽQôŽûÝØqÿ˜q¢ô?ëÅšœˆÿ,Y¹¬"Zü¼±œèZ;±ý“s‹µžú™Ç?a:§äg‘cT©ÒÌ2/Vj…¨ý,þ óy¨¢SªÀs/6žxÀ§‡X¹JÓ÷»l¼ºN>ÃàŒ<8}Øî¨…CÄZúgœÚH_Mñ0~7È$Q›smUW`Eb’‡ý¯š£^­?ˆaÖVÊ:ç&'Óȯ•[É1™7yYߨo;7‰Lî7]aäDn’3—¥Èå*¯ÕÛýBŽ½Ý¼¨ýlüŒ1’Mü‘mJi¯7ÐeMEÿ1|J 1kÖ°ÏCÌJ>̦þÄ|""ŸD—‡˜ÿsfOŽ0‰ç=¸^µûn„°>²SÄZÑVúÊšVeÑ–cÁ47TW«Ÿ×5™y6FÀYg¾í5åß4ùCïfÇ^+ëšåSëUίM"væ’½ró„úå\ñ¹Ë¾tlÅ¿HÎ?OþC'¢ØGŒˆ2Oin™O ²ÈGÑ nÒÉèÿ*ÙYzŠ„8·Ìþ7/–éöiæ“hö¿yé7ºõS¤ZšXѵ%ž}Á³ä=Î/7ŽÖÚIÆzžhÜ6ša˜Î¶ÙGvˆi¯ŒÍÞ1—?ô¶—>2™öʰ"í“b›ï öNX›#˜Hd8öà *k†R)k†á2¯ v°ö^ cóÞ·ÁÊU»¤™ÛàñĉH9DD”z¬k&OXä#ÉþÉ™¬y½M™­¶dŠÜ09‘¯aÝJã—ˆˆ.³Ëõhß·){ª k&§^îjz=ŒˆŒ*'ç»HÛDƒˆñºtZþ¬Ñ$bÍÒg4 Ä]sDd:æÉÛPd2‰ ÄêBMò™`ŸøÜå²fÔC" ²%ßqy±r=ÿM7=€Â “t[{båÒ9IŒd‰´ÊVlþ?nÙL"ëáïV‘ŠVëîÓv[ ‡{ï\'Óy½Û@b›²—õžßÚa=M£¿Òé dàì`g|d§ô±úyÊm'²ôQÃ-Á¾½ùµr£`ÖŠ;TÅÖ N&qÕÔ$­VètËšát¯‰DVÊÚlbg®¾Ýo ®–Êv.s‰±#”¹Û¹ö‹ëä÷ÑÄK.Ñø ֜ҹ. Ìh“mµh¿^\'ÿ!J<Ð3ÏÜo]ö f}ŒˆÊëš|ćÜl;®Ò×t&v%}–`Zêê—Ògk1§MâPWd&Ù—î‹@ŒH6]ˆÈËçœ µˆ³ÆkÊÕò`ØF®’NŠDêGlne+àòÿæsþø{…ˆæë·NI‘Xä#ÖF.õ*IzøW)ûŒ&ªì„"§Vô™SRrDJÖ·g_ÐäÝJû+J"1&PñE‰›L3E(2;ä#Û"&{½íE¬•ô•5ÍÒ̲¦Y…4ç"b$lz° ®È\¯Ud=l"0õ«38‘@¢\`$×SÛ®qƒ \89s=/k ¹˜@œsg.2¹Î™"±ÈGláŸoüÂ7Ó ¢ì/Æ5FƒÍ-ë—‡%û'g²Ä’ž‘$F¢À7ýêVfË-m×3¿D41 )‡Hç”}Ê“KåÍ1“^HDT\«HÑËH0Ý€íö‘{±VÒg…O­\ša4å"29¯Ík°Nd9ãÈDD'“q˜ã™?ë2ɈL+²b½¨“ã Cï-ä*ë\ò±é!)ûLÓ»¾ÇøÏR›_Ó?kéŸ5{Ý5Wö©~ªõT…sK7ëD”ùEËü¢õºÿ®L z‰_”Š/ʾ£ Ãó!ì»%}ÜùÖ‹&¹i`®þ1›éæüG˜=ßB®’νòyXjLŽßqÎðÄ>Çÿ(Qn¥(I’÷‰j/Zl'»&}®xýú5¥þé"„z¹\zZÐ~ëàÍy?T”‚’,o9—H¤c>×ùôÝr¾Œ^±x.{-9Ný”-­s¯O‘>”­Ø`ÛÙ5és2þ ÛPä…Ÿë·›¬ 5?œkšÑi¦°(0æõ²ú(zk¹˜@!“<Œˆþ©Ï-k«¿½ïÝÂ{ÔÄ©aI‘-ÜÏ+ºï°âýPbÌ 9`ç»!}&qÚx@.öŸ›" DÂ[ Qú}L9T«¼¤óì3N&ËïW Cö0ÉKŠÄÂGYí½/JÙå7I:${?ôÞúÀ»®ûDdn‘7+òÿTˆQå·ç1"ÅÇdOÍ_~Ï)¾(×*ùge¯‡I‡dñ‰1Þ1ûÍϯÅþè˜kQ&©9ÅÛºrŸº$ÞˆÌÚSjïçºÆ ÎKƒ1&Š>?1¦3‘ ŒL†iÈìWj>ràï{ïÓó&'2È$nèïiãXPd$ˆ›?ˆØo¬þ»´¡È…g\f˜âo2—ƒÇý/ØöPd€"€" È ÈE°UðÒš®˜º8 #¶Fzþ^åeWŸ ‚"wK|,#z%<†¼#DNÅ`@Oèz¥ûĈ#À^ŠÜ3€Pd€"‘|¤ïÞO [`Ax;>òÜ7)ƒsX Þ¾"ŸýzV€·¯Èñ±3¹å\ùeãdŽ|¡ ŽDe¥Ï ¥œ·6ÊGúÒ?Ìû‡üÁPv)›]^ñC²Ò·ø c%0ªzü‹¸¬ôÅÆâF•Û¹Ð*(rW$.M'®&6N^˜ž:?Q^[M\J8ÍWó+¹™«ÉäÙÕB>¿’»ýÍ­³ç&kE]¹ü·dyíùè§Ñk×k¹Ê¿>G« È] ¢ÜÊŠscîÑÃèH„ÿ,Æ«æÄ…iÑâ#‘âÓâø—ã"cÑ‘ˆýqûÌR& ($Pd$²¸”EcÞs¶òÌ^òJbü¯™û÷ì-š®§¾KŸ–ŠOòΔÞC’]‰èiü¸½¾®Ë b°U™ˆäþð`8ýü½%>çœÇOÇn—ê¾I’Ê¥çå_k EÞ Sç'Rß§í?‹ÏJ±S±pê‡t÷…¨ÃêêZ‘LJß]ˆœEc È[Adlâ«qûÏ[7gΞ› „G•î I^I$®&åþ¾Ô·ss7gj8æZÞW¼~ýšˆ ϸÌÊ0GË1ÁÅéøXÜz÷Û5£@Gt½"I¾öïG.s9xŒQOwö\½WÄ`»èA‘!¾°£àÝo=ƒŠ û|Õ©[ƒើÎPä!=F@‘÷]~ÙÞđРРPdPd€"€"À»æ#wÅÔÅéwb?»y’%~ftöÆ Ú(ò;L|,¾Ç÷0<¶Vð´7PäýõÆú= „€wđРv¯W†€"ƒ½"Çeö¡"·ÿJ´¶®oïžíñRsÎå#{ZéœB¼gEŸ`G|äðú™Í¤Ñÿ=Zy¹wï¤5K0Û6×B×õ÷ÇjáÁpêN*s?³g÷PÓÊèܼ>²|¤/u'<–•¾Å{ìi@ªÿ".+}±±¸Qå¹¾M…‡N†Âå—"*½¬XShó…‚:••>0”þq~ïlWþüû¬+,>ÈÈJŸ¬ô©ÃÑüãB›¦4ª|ü˳J uabòÂD›¦L\MÆNÇJÅÕ˧&ÏOÖ¯RÉÑO£åµçñ3qg#6t"J^OªCj±Ï?É·¯(rW\¾0!2‰éòkf)P(2Y\Ê:…Lô0uHÍ.g‰(»\SäÜ£‡Ñ‘ ,þYŒ×1°Ë üq ³”Í-¯¨Cjn9צ)³K™è°JEOErÖ6>ÊÆNÅH È°šu4zsWÉ,eã±Qhº®æ­jŠÜ¢Gjó«¾®ËJŸ|¤/p_ûÚxߨ‘§¨%I*ò­ÊóäO\Mø?ò‹ŒQ|, ÇOÇ|ÿ6qò_¢h•·‚W’î¦É¤{?-Œ~/ò­šRòHd6öI’Œ*=Ìà\’Ú]°}‡|Úºî=$9gLºÖ|ä­k»}?GVW׊dRúîBäÔhsÚ蚺3­O˜+>+ÅNÅ©Òh’í‘W¯Ü¼´ÏŒZìÁyÁ` á À~PdPdx/ÀWº%<Æg“Pä·O7ßxÞ#ÄÏŒ¢½xGÁì7xËleö€Š PdPd€"€"@÷à ‘®˜º8ýNìg7O²ÄÏŒâmœ@‘ßmâcñ=¾‡öW ñ´7PäýÏÞc=Ú€wđРv…Ž<@‘ÁîÉ1D€}¨Èò‘>{Qúñ/Ïjë;ø÷-|{ëâœËGöœê9…¸KQÎ>ÊÆ¿p¹ip<Þ -µå¦ìþ+‘íS.>ÈÈJßøWgÛ'³íhœ6åÄÆâÙGYˆ¹%å_Ÿ[Ëj!ü$˜hûø7$<¤îšÞ¨.“Fÿ÷hååÞº«Ö,Á݈ròÆìåÿH4àÙs“•Je/´Ô–›r»¾yöÜäíon¥¾¹Ý¾@û×71NòJ"y}"EîŒèa_Žgvò®ë»çy½I]áÁðÌÞ›Þ«i忥}–ÜÊŠ$I¿¿a{äôhò?.ï‘–zûÝÆ¤èH¤û9Jo²?¿_’¤Üãt ŠÜ…(3"³>ª­êñ/â²Ò‹UnÇÒw vzT«÷K×”ùBA‰ÊJŸ?Jÿ8oå\tF•yVé„OæŸk¤ë±±Z±v]Îìöº|¤/u'<–•¾Å™æººÞZ$®$üù÷AWÈúiôÚõ¤,ÿ8·ZÈ~:š¼šl“ròÂôÔù‰òÚjâR"q5iú\†‰«ÉØéX©¸zùâÔäùɺ,&G?–מÇÏÄW“íw¾ôk%·œ½ýÍ­³ç&›ëêux‰ì®{\~lÞ®¶w7X¯›†¼Þ‡÷w¹Û´éD”¼žT‡Ôb!Ÿ’wô´ÆJ[•ß\ »qZ¯mçìe‰(û(«Õ.Á?„á#C‘©Cd-¡âÓ¢=ZÏ,eŠBEF"‹KY‡{5-2û,fÇ7\Sæ=ŒŽDH`ñÏb¼Éwh »”‰«$PôT$÷èamã£lìTŒŠ «Ù¥±”Ë&DÆ¢#ÛÇ–k¦(ÊÒMCDF"¢‡ír·iß2KÙxl”š>¿!©­voË=ª}êºøÈRäuhÀÚèWËqï ½=³g]íd®Ý˜¹‘´Î+"Ò×uYq*ö‘èav4Í5¥¦ë©ïRŧ¥¢ÃCiEE×I`ÍÑ:kgDÆ:FîDô&&;pà€µb}¢pßÀ«Ü²¡=ÊÞÂݰnâ­t›ö@×uï!‰ˆdŸocc‹ÝÛrj_ :ž<7©éz¾Ow˶UOð~)r-¶5©¬ëgÏO§¿»]‡JR±o.L[×½‡$£ªûùÚ¤ŒÅÃáøé˜ïß&NþK´}í’G"³qÇ%I2ª\ô0ƒsI’šOÝm4Ù>bæa– ßdZBû†hN¼kݦ=¾C>«RçdµV»÷&ÆiS èaþý³7fBÁísUÎ< :…¨EÆ??cÆâýÚ} uX]]+’Ié» ‘S_§ŸýzŽLš¿{/:m“²ø¬;§~H;/®Jª«Ùå,™´ø {íÆ¬Á9%¯$W“r_êÛ¹¹›3ޓܧø¹å•˧¬-®)oÝœ9{n248:_dX CÍõ&¯$Rߦäþ¾k7fo}=co¼·°(÷÷-ÜM'볤­;-¡a‡>í¬«×¹{“æ¹ng¿…OW~Îm¡.§õ\¢»ÙmÚsùRbåç\p0<ì¸{obœöªƒa2Éy%[ù9nýlذÆà…g\fåí-Z>Ò·]Óòß:S§ãcñ½ÿî7Iò‘ã%p¶_ì”ã‰s®ïGÎ?.$®'3?½å¹Vû©Ûô|]×£§GíûÕDùl4y% !Uû›2—ƒÇõGnå<¾·çÏ;á){½rGïØ"t"È«|µXl~Hì&¥¾OE†7&S®>)rÎ!Çï=(2”w„/Ú¸4uí?gÓß߆ÝvÅ~LßIÙ[®ý}6q)Ë@‘·É‡‚¿k¨Cªú¶_RñÞv›ÒÚjÃ\ßCð6Nx|ä}Fx0ŒÏ& ÈoŸn¾ñ¼GˆŸE{ðŽ²ƒ³ßtƒ=û qdØ+@‘Š Š PdPd€"è3K}Ÿî˜2ìø>¾ðÛ¬Èå—•ÒÓâìõdéi±ü²Ã D]×a_Ø)EN}Ÿ==J=OÍo¸ÉF•yVé„O柩¦°ƒöŠ¦ë±±¸¬ôÅÆâZ]²å#}©;©à‰°¬lÄCè@‘[cRún:~æ ÅÏÄÒ?¦É¬ý’¸šŒŽ•Š«—/NMžŸ¤z˜¢9X‘¸’ý4Z^{?O\MÚÛK¿VrËÙÛßÜ:{n²æ#Ѐ"·bq)ã?æWŽ*D¤U”£ÊâRÍŸÍ.e¢Ã* =É=zئì£lìTŒŠ «Ù¥¬½ýò… ‘±èHÄVyxßèᙽÔ÷é•ÿYqR,‰QE×I`Ý¢ëºèaD$2æ 4‹ €"w…uO¯\z¾‘ÃäþáòËŠ|Ø'y$2»*L’$£ÊE38—$¨0lÐmÔ"õ}zü/›4W`·îï©Ãjv9K&->È„OÚj¯5M·P‡Ô…û dRf)««hèY‘3K™ñ/_~6þÅxæ~†LJ^I¤¾MÉý}×nÌÞúzÆú52¬‚¡†,É+‰{ ‹rßÂÝtòJ¢M˜kxß8ðúõk"*<ã2+혺8‹ãÝo€^ÑõŠ$ùÚ¿¹Ìåà1FÝÇ‘Û{¬˜©oN×wö ¹°ÃàÝoE°|Õ©[ƒើÎPä!=F@‘÷]~ÙÞđРРPdPd€"€" È È°¿èí½’$2ÆÚ§áœóªÁMØvÒGæÜ ‘ÐB”­ŸL‚ÀŽ+²¦ëDTyYÊÜÏ4/¥gE"Òuͨr×ìò‘¾æå3YöQ6ÞôYîæ#mµâšlË´/¡ý¯Úº¾]uî9½Ôµµb·°‡í[g{ÛbkEíÝöT#¾­º¶«½Œªÿâ¬ÒPüñs“ÖžÇÆâÙGÙWd}]#¢òËrá—¼^ÕÎ9iU]×Ý­Yþõ¹µ4¬¿[$oÌ^þDû4ïÄq…‡Ôw½.g±ûéSö±ìf½f'˜û&¥SVŸäWç•ÃòÜw)"J^I$¯Ïn¡´ÞâÈš¦[™‚Ÿ„"ÑƟ#"ý7²ý:¦È­¬H’ðû÷Á±´ºp¾Cuíæ!ìû6z:ÌŽ šWr37fDƈhü‹ñ‰Ÿ"¢€ß/IRîq!|"¸ƒ>re½LDLcÔ¼Xª]Õéwޣϗ•¾ØXÜwÈGúÒ?Ìû‡üÁPv)›]^ñC²Ò·ø ³‘àî‚âÄNjõÆÓt=6V+ÊÞ(éK}› $¢|¡ ŽDe¥Ï ¥œoN—^”ˆ¨ô¢ 7ïmæÁâh$JDápùe…ˆVŸå#}ùBˆJk¥ð@¸§Ñê“bxèdìôÆ»¤!v‹û‡Ò?.´7c›_­=´÷Ó5»kENZÙ³a`ØPW«fjßâÍu5ë8>þåY¥?<™Rl³«Í´ïíˆîÝÏøoÚíVÝ;u'<v¦lP7à⃌¬ôÉJŸ:Í?.¸æ²{rËÓªé¬qMÙÑÚ›{—‹Á[µ²kȨÁmêêxŒ® íº‡Ý·W{Ë—ž•Y¶Ö¥CRñ—Zùшš¹ßó·‡zSäVâÍ7­§2Wg.ÿ-Y^{>úiôÚõäÆÙ^\ͯäf®&“7fW ùüJîö7·Îž›ÜHð8·ZÈ~:š¼ZË•¸’ý4Z^{?O\Ý(JòzÞ_$¢É ÓSç'Êk«‰K ×êšý¯,eeÕ¡¨‹ü¸ü$HDCjv9KDÙåc,·œ#¢ìgÕG[©Ò¹¥ÅÉsãGÑ a“ëIuH-òù'ùŽflõ«;j“ݵ"'­ìé:ߨ«E3µoñ溊ul2v:V*®^¾85y~²§]mß:6z±XÌ?Þ´Û­Ú¥ôk%·œmèÒíívöÜäÌÕd¹ô|êÂÄä… ×,vOnyZ5Ÿ5n)»·v+ƒ·jeW¬Ñ¦®ŽÇèÚЮ{Ø}{µ·¼^ÕEOͳ½ûàÂ9·qØ &IDAT ç¶Æ‘»P[£Ê^æZd–2E!"#‘Å¥Xxâ´èaÑ‘HñiqüËq‘±èH„%OŸŸ‹}ËÔ#èÙGÙØ© V³Ž¢"#Ëd¹G£#Xü³w\]ìêºøÈ:!WÔ¡—®ó¢¤(JíÔ}”#¢ìrvüÏãYëä|´Ò«"O_˜$©ƒª}­ â°X6%¦}«}®.ÊtIàZѦëS {våµh¦ö-Þ}]Ù¥LtX%¢§"¹G{ÊÞ¾tlô‰¯w»•å/_˜hîÒíøã@f)›[^Q‡TëbЌݓ[ÕÛ|Ö¸¦ì©e] Þª•]éÉíÑuÏ]÷°ûöêÆòÍ‘`¿¢Xã­Œ#¿êÜÑ«½ùÈúº.+.Ãï!ÉÞAû´iürØgýd_”t½v±r^©œÙ5]O}—*>-7;}vu ²$IåÒó-L½°f™UÝwÈgeÅU Î%É¥ãcqÎyütìöw©VíÿØ?{c& ¹6!ó0« ÑÃüG•Ôw©àÇA¯$?Î~3üØïzñè|œûê;ÜÑ ¾C>+—s†Pû\ËtMàZQ÷öÔZœ‡›i u5![ÌÞ¾l¡Ñ·Ü½]åcánº¼ö|æzr´ÓüËVõºž5Í)»·v+ƒ·oem;nÜu¿ç®{Ø}™í-¯SÊ•[Yþ£Š-`¶³Š¬W5â\öù¬‘»‹snpNÔÕAVW׊dRúîBäÔh÷g¿ž#“æïÞ‹ŽDíAåÂý2)³”U‡]¢Åg¥Ø©ØÀ@8õCºÍ¸5õã|«àƒrX)•Jvʹ¤ÔÁ0…éÿ›R{ž²cEv9‰tiè°šžO“I³_ÏuiF÷_…Ã5kEí)Ð⃌ÁùìÍ9çÆº:5SOu5ŸÛê°š]Î’I‹2áÁ“Ý7}7 ×Fßr÷n>ÀðàIëótö:[ÕërÖ¸¥ìÞÚ­ îÞÊ®}£Ó÷tŒ®{ݗÙÞòê`85Ÿ68'“/ÜÏØ7„K¥’rTÙñ;{œsæ¥C^^Õ­…8·k>²õo÷$¯$W“r_êÛ¹¹›3ÝgTû ·¼rùâ”]Ô½…E¹¿oán:yÅeÊð­›3gÏM†ÂÖ–RÃdR+¥Ÿ®üœ³ûœ®ëV¨ƒaιÚû$Juh 8žÿ.uùR¢Kƒ\¾”Xù9 kÚçrý52¬‚¡6 \+êhOë>IèDØß¿±±¡®öÍÔ}]Îb›ú6%÷÷]»1{ëë™î›¾›Ðk£o¹{7à­›3×nÌÊJßÙs“ƒc­êu=kšSvoíVwme×¾ÑñÀ{:F×=wÝÞÊlcùø™xn%×ç(þPv9;ñUíÖßÊϹð‰p¯-~àõë×DTxÆeVî˜zæÆ5ÎÃðª>þù„kk‘ôíÐÚº==ê ÿ;É?.$®'3?Ý#°OißÞivî¬.•ÏF“W¡`Wó‘Ë\cÔë½ñ¯&Jk¥â³"Õòößðz½­:„Ë®ì©.bRêû”ËÃ/uB'‚¼ÊW‹ÅýñèµÐ «OŠœó.åxs´¦¼’ä= nm/÷þõYñ‚ŸÓwÚÝÍH\šºöŸ³éïo£Ûí?ºétäÚßg—[ÈØ[ÔÀ¶cG-ðÆzØ+@‘Š Š PdPd€"€" È ÈEE(2€§·7ÖK’ÈX‡¯«rÎyÕà&l ;é#snÀš¿š^—wF#“ ǰã>²¦ëÒ!¹ò²”[É1AløÕܯóëºfp=-ŸÚsý€c÷_uÄ÷ûA‘u]#¢òËrüÌY"J^½,–­-‰+×ˆÈøÝЪ:¯’èñµ*jÛ Èår%èÈ”¸r­TZ%"E l¨öod°,ôJoqdËGf‚xë›k‹¢l9¶ÔY«êô;ß®ÈGúRwRÁaYé[|±6æ u$*+}þ`(ýã¼xõI1²í¥Nž›¶ƒvøBQdrþГɷkÿâcqÎyütìöw©MJ½®‘Á¹OjqI’Ê¥FÜwÈge±þ€w?jQÕˆsÛÍ\-晇1I*­­Ö$›sƒómÜ¿â³RìTl` œú!íÜ>ûõ™”]ÎEG" YÔauu­H&¥ï.DNÕùè°šžO“I³_Ï¡Õû!jaT9çœyDM+ÛÌòùdã•ÆMnmi_HóC"mf(ߺ9söܤ¦kÓÿ:±Iv‡‚áÀ1åöÿM5dI^IŒÿubåVüÇ”Ô7·­—/%ΞO ¦—tíØ‹xýú5žq™•;¦ž¹qóS)´ª>þùDà¸Æ€n(s9xŒõì#5QZ+Ÿù«–·ïüÞ€×ëíÞA&<Å[ð‘윌÷#À^Š PdPd€"€" È ÈEE€ýEã»ßœß{°£ÄÇδSä©¿ ÀîPyYj§È ?Ø5G(2(2@‘´C€ »Li­”ÿ¥P(äóOŠåÊþü§ì“CÇýÁ`(ôqPéWºÌ…/Ÿv•ôó3_ßz¯yúüdüãðåSÀ[`êRâ}“c"šùúÖÔ¥D7)µ`û1L"âdîÓȈ‰½‹GêN*û(k­ŽÎ| ù|¾}i¤J¥²ú$?ÿÓÂê“U"Ê>Ê¦î¤Æÿ<Þ>¢l«sÎM""&ÈXíO³¶ñÆä›E™1c"c]°Z,Æ¿¬éÑøŸÇãgâÖ:cŒLÎëvk¬èÝ„›Ä"1ÆÒóéÔ”µ=ý]*à÷·‰ZÀG`e‹ô*wŽ?EƈsºÖ­½+1ŒsÎ9'Ó A$“s"Æ9IR—¢\øgÁr«ýÇ£±Q^Õ-e·D™1ª)ÞeS™œ›dY‰“h]iFc£Å_ …BÞ2‚«"#jÀöSÖuÎ9ˆ›Ä‰$‘YwFœy˜NÄ«†a¢(Zž`e]W|¾n„$ÿd•1‘ˆ"ÃÛJdrf ºÀØ>P#³v]Ùd%ÎÕ!µø¤H埬ÆÇŠ Àn ýV?ðr“ Ñ´Ž­æÌ™¢ahÆ+.~à%"㕦1敤ŽZRZ+Z…(Çü–š;­$ ûÅJµØË&+)G.#VZ+¶/s-ØÆ¡½u6drã÷ZHTö‹Ü8“›D¦a9€œs"ÞM.f…'¬H±iì±ËxBp ŒL£¾‘£Ž·à#°}RUÕÉë5~'ÎyCpu{EÙx+÷ MÎâ–Ö˜Üø‰qεWš$I¢§ r\·Œß‰›D¿“DûêŠ% Dãœ[—+˜(}³·cdŠ Àö)27,µâ&íÛ©o¶Ãkr"‘sƒÌ®‚3¢ÈêV²|dNæöOTŽ\&OVß¶•8cÄ2(2»„aÝd7­x³NHƒí7P°œLÎM&š†Á9797¹ØqŽ„ :òVèc{ozÊGúWÒ554 M׉ˆW¹r<°û¢lùÅÜ$±vÈŒ² #@‘Øy™Û>2³ƒ¤&'¹Æú”>"z^zÞ¼½yãÛÇö­`mxÞ ö€]«rÅ "›œ›ŒLn˜l[®XL²î*¹G9{ÇÊímZÌ$2 ­Ê™@bQ ÜÙ`;¹%êø`HŸÒ—ûשÛR-]vn_Ž4lÜ;Á û ¸IVļÛȃÀj‹uÛ³^Ú¶ïdéY©ûëÄ.ª~—‰§BB‘ØFE6œsçÉé²iO‹²Èì8™¼Oé{86îð°\–R±ÿ<Þ×ß:J};×*Ù¶,}JŸ½¾éêR?ÀCîÂG¶–Ú]¯‹³—Ö:š®\©Œ5©øŠ?0þÕd¹Rq†>§îÌÏÜœ}£Øç$tugŠ À¶a¼ÕHß ›:—Õâjt)CD·ÿ¤öõ¸I}ý‡cã|½œ+—]³p“J¿–G¿ˆÆFó…|z>½ðS&õ]Ú5å¶,ön4.Zr+E®Ó âÖk˳G\oå1O;WÔ¨êÉë3Sÿ6Qz’_}œŸŽ%oÌÖ3„M¤îÌkZyúÂTÝÀt¹T‹b}ò€]‹ZØþï†SÙ饖›ð×丨i×~)¬W[DjüóñÈH„ L9¢$¯&~Zصaø¦Pƒå8w¨G-6Dܺ ê²^åx`êâ¸r<`ý¹±·UÞ¬’ö2ûu*>Wúý1bl`H¹1“š¿gb§LÝ™/kå‰óS=í•ÃbÆÆuKk€"°KŠl¶ØÒ"&°ú$o¹É‹Ã‘Åá_/— >ýóÊê“|«,+²êpØþÓïWîÝM[ëÅBaô³ÑÀñ@x0¼PßðÒß§Ô!5p<]ÊÔdT×'ÏM†Ž¢#Ñb¡`oÿËxàx`üÏã\×—{½åvõ¤Œ=9·yÑ+`àÞƒT¥¬Yë`£³¬¯k…•U]kt~3K™æWÈgd¶Ìÿ0_ÖÊSç§¶²s›ÊšUºxVs-ØV¹î‘±ú™É©‡76œýïìê“|›åJE‘Ý?H1})1u~"<¤fîg’7’±ÏF­í¥—åÌý…ÜJnòÂôj!ODÉ›3±S‘[7g2²ÓW‹?ݳ6&.L+ýÊÂO÷f¾žI4½Ï×y#Î>ÀæZ0q“•6Çsõ¦Ë¡{Rü•ᓽ‘Sª]ÉÂ÷‹$ $}èUŽ*±¡Ô·÷$²ô¢$yXƒh)’czÌü÷é{÷îݽ÷¦÷ÍÚ£"Ö{òl#@‘ØqŒ†Û\¯Is«†‚!+Raý]Êä ù^§Àt“3·ïýtÏZ‰œŠ$®$ìr&¿š$…UªG„³²‰‹ N¤©êZÛ¸”M\Jp“þ¤Î|=7}1ÑèÛO?·9äöQ‹ÖNqO7úB¡{R¥R™L.–åÃò¦òëµ”ŠÅ…îåV ù•MVessö7‚K©ïÓ•JEé÷§¾OÛo }S]X-pE`—hÒš6ïü „rLݹœ²O.­•¥î&›´ø_‹ÑH”ˆ4M[¸»PzQ²bÐE ëÖŠ¾®ó¦çåt]CÍ{Òa—ÌîìÕ+âÎì†aX?u9’ †m9nµ'¼jäŸ+ÏʹDžür®!¥|Xæºî¼û§W5å°b'+=+&.%Ȥø_ÆýJÐa–.ƒW û¸IL`¸³ÀÛ‰Zlr“M£5-º”±¢É3„ÛW<Ì-çì?s+¹…»µ;{Ó¦ ÓˆŒDf;MÕ’$©y±$I¹å\n¥¶¸‰¯Ë±ôô„ˆµ¼öŽ!Ãé}[oî´Xr\þµÝç5ÊëZþq±ô¬œ{\È=Ê5¢©ÅµÒæy/%k¬`]A§/&¬÷©Î\ŸI^Ÿ-—µÞ&¨8b;µ«70û €]Wd³Å0ÜÒ²úçþuÊ’ãéŸWrˉ¨lp¿×Ûœ¸a‰ŸMÿÊ.-†¶ú$Ÿ¼‘ŒŸ‰Y?•^”Ô¡pðcÿ½»éMjg¯¯‡B¹Ç92ì£lìtÌÞXZ[%ÓXü÷Æÿ2îž½ýavŒZÔŸiéTvZrKÙÑ‘ñ…»™VW‚rE+Š¥¥ÂãBn)ëZÈøØ™ôÝt©X$ΉóR±¸pwþÌç±æ›™^¯8uqjúâ4ñ&q;gY8¢ÔÍ\ D-ØÁ¨…õpšx°¶b£=-Zrü0ûÐøfžTO.GnÿI ž|˜}ØÒ½=äK\MÎ}3—¸zM’¤ñÏÇþ¤Z…OýûTâJR×õñÏÇíª+öúø_&’דÓ§}>_âRbcãÕdá—‚rX¹|årCvûă[ŒZX¯o¯‰¸S˜LN$Ö?ºÑ9*½¿¨žŠQdDm0KŽË¿– ¿³÷[>½r&þ<>ûfr+" 'þ:)ܘ(íÌèWÔa5q=™¸ØÝ¤ ¡é(ÆMò2‘1fŠ À.D-Ü% AŽ-ýµV6 ŠÁe±ó»w‚Ÿo{»y»u›ÎZŽÙu9ëµ37fš£377ÚY¡ã!»D-ëè0»-ª&Ê&©§T"ÒÖ52¹®ñÒ‹²V®Éqû¼JÉ«Iן¬!‹“ÑO#ôi¤ë«òÆQØsÝ8çL`âA±cŠ À¶aü^™Š‚Á„–*Ö¬Åmdº+MÇÒv&=osŒŠïÙ<×B`¢`ôªÅ ¢ÌƉ²²N%ë(ÇáÁ“]jñ6P´Ä˜äaí&„"°ÍQ ñ é[ÍÝ°î²øvDì%jaûÈ&‰‰ .3»×w"Z\XŒÆ¢þý$ÐâÂb÷…´²aOµw0K=‚Á7kO‘‹˜kÀ.F-xÝ…]ÎÏw‡Ð0Kk¨—¹$ˆµÅöˆëVÚ²..,):åxáü–«iÐÁšÝà#°[ŠlÚ§"ßßGjJ®û¹vÔ¢¦¿Ûd¥=*Ç—.f²—‰^ˆ¨»ªS†Ácœ³ïr»FÄ{ÁM¶ä˜1ÖÓA1äŒ0ÆÈdµG¨…ýf(ª?ðb[‰1‰<Ìi(2;|2Æ9÷zg¬ö¸ú4¯}» A$[G¤iz÷¯ìðz½µs‹"¯ê^¯ÄÝæ&ï#C±š•^q"b&y˜×šrE`Púý¥%¯7hMr²^ cÛ'*S3V;¢Ò‹’÷C¹K‘XímÊa_éeÙë•jSÁLN&í+Ù¶b´a%¯(2Q<È$Ì~`×ý,š¼šT®Ïx?`âAVûœYåNwuö4õÏ•2Ƽ7Éx¥¥¾OG†ÔM·°ÚD<<µ÷»EF¢sÿ¸¥MXVÒ^Yåó}&ÊÞDËJ wÓKŒ1WD€]#|b 2™¾8=þEÜÿ‘ßë• rÜÎúÝxwmC+Mι‘/æ¾MùýþP0äe®Â…ŠOW“Wñ3qå˜ßùÐÄ~жsn¬‹©ïÓŠ¢„‚!¯$IžÎV:ðúõk"*<ã2+ãŒàÍÉ­¬¤~HŸä5]ß¹¯É½-˜@Ì#)Gu  †$I’eÙ+I½zwùÇ…ôÝtáI‘Wµ}Ù ˜Ç«‘ƒŸCÇ;[©Ìåà1E`‡Æø¤éº®iZí 5ûî"y“¼Þ-È1¬ÔJ‘µ`GNE¯$1óuúÈÞ;í,“ÀDm]E`%7 ìˆ(‹#b"L+u ž¢(2(2@‘@‘Š Š ïµùÈœx‰{[ü`[i|"†9žÙ«½C 2­pX vÎæf³.×¹¬ëÖs~Œ1&'F&l;gq"có‡ ëQ Nœ8³|dB¼v³ö¯ó¶"–ÍMƒH„"À.é²iðE¶_…Ç7o°ƒ›¢Éµ÷#xëü2÷ªp ÅšUIEND®B`‚kildclient-2.11.1/doc/C/images/we_macro_edit.png0000644000175000017500000002300011405233117016332 00000000000000‰PNG  IHDR­ÛQ8Y pHYsÚk¥óÎtIMEÕ{¾£ë IDATxÚíohW¾÷¿¹Là7 Â ŒI 2¨ÌÖbó"*y™,Ô¦8¢…]· [g ·öæE£Í‹ ö^§/z“úD ¤È…ìÂSìÀ5Q^äÁ¾ÐÅ*¤X‡(ÐÀ˜æ@ò¼˜ÑX–üGöfÓHþ~ÂøÌœ33¿Éùê÷;çÌ9{ÒoŽ"@¡ÛÓ×@!]ÄÀÙwkUoO«R !ݬ†ÿë]ÐVSödÞU¡þ×µF™T ¶§¦”÷2nÎÐ7Ä(¯`q+5TŸÞnm† þÌ}H€oŸ•šª:üÿLH[Ä ‰jF?0TÃPý½™ÿº¦V8J"”×2ÿkªº˜†_ÃQøU›ïnÈ$9 އêE›²uÅÑÄ×±Pg8Ž“ýóø EPy¨:xÉÕ˘˜}€é \/n3z÷cäuÄ"pªÎ÷ž²¥3a ~ªä/] 5Ö"GaqEé€â‘¶ÊU – N‹Ún.ÑÀäO˜Y¦ƒ³5K¿ ¹SÄ#ʪù/—fÒ±£\ÊQ˜¯¡/&† ÿ7‰ô©LinV S7®øžàâc€¯®§%ÔPJ!ý0ÙƒaÖðý‘à^v+åÌT(‚íb{˜¸«&NI,"VMŠRH:š—&8Ð¥«Ô!C4 ¾™®8 Þ`yEÁó‹óƒg¥Jƒh0"~£@y€' *¸&à8JiJDv’+tŒ~PìÙÖ”!}qAµøù„t(/Ip¤{ª¼¢úˆ¹Ï Î Mt#8K¶c‘xàQz~C£ÆúåŠò‚ XŽ ÍÆLl?WÂ0,<†UÛžÕ¦†×q†¾UéjÜOÄ${ ¹9µIáWÿR=TO‘Ñßnv¡—Ïô=•>$"pW"«¿a„t^ˆóR'3¡A¾¡F §´úIÊvüæ:Ñ5°~qâJ)h" Í‘—« <%šX¿8Ѩ!žÚ(—¾w×u[sE潘¡9›âøfU¿ò'·È u³•Õýv.ô2©:X©!x<Ƥ“ã›éˆGõuÏYúÙÚDpü\î³çáùÑ×ô¦\ð× bhKÄ4$n®8 k™œ'6¥Ð{$ºÑ­/.[óÄŽ¾f¨µ¹ )xˆê{ü“u]·žºJ)å!ÌåGs ð¶ëa €ëë¢<&Ù߈Š?Ö‹õ€™?~.ÀÌÛë–#VjHÆ ”R"’Œù¢³ZZܱ~IÄIºzWUêY2 ɾ.††Ò#\^püß¿hî–?)V ãß;R‡dä¸Ä"XqP(«ùGÛ³ÃÒÄ"¢k®«Ö&Ò±qqƒtlèÍ(l"8ÎìÝã>sáA×õÖ\«EÕuÏ4ĈȿNi­>\Ù v,G)OÁs—­Dž«Œì1i,6Z R€‡dL.œ_[c.œ”dL¶e§þa/éd°Q:6bSÁ±l».…z(‚ëÈ”·ªuv½úþ DVƒ*~ =D×úÅŽï®ubm˱}ÿÑ©)õ,ôט+·>Hß‘ø|åa˜+ì1óžÑøç_: €Ùû¸zWžÌÑæHVyxãKçö_Œ0˺Ì.cðu¤Éô=•:$aJXÚ»7ƒ¼æ>¹ö–ÄŒ ýì1ðñœ²j¸ò¦¤Kaaõ ýòMÖouAöKæ(²IYØŽKh«Ð†®ë¬N¤SýÁé`?u×z‚*¾?º¹àÀû©ëÇ›Ë4ÈÚÆt-¼ ?YÐD܆ûpËvàݲ]·!ŒuŸº²z}¿ÍÇös*¬Áö^€;ãB0÷@áÇöT¡,™£Fx¨ñ´ÖýæÖ·š*¯Hò É(¯Àª-a®¾’2¥ÿ€´ÞÀÌ#O¥¾l.¶PvlO¡†ðÌË Ž«ÔåÉ5û6»¥V¢àÖ•‰t,MÒ¡ê‚åûnn‹t´ ŽÛê­›Ëà5Œ°¬ê <( R/ÈÕ¡-¬_Ê—BËvëÁµ.š‹PhDÝÏõð[oé(׃ã(ÿNü\Ž‚!ˆ°Wvb»Ô®—ÍüÏ7Š…7Úo)§TQɘäOJ•†Î†’ÆØïeòG•»å‡uJöÖõÿ[Ò=ÀCL«¿˜ítÂøCЧö.+ép°Qp©×:L›€¦–žýÑÅe«Y¦ê³±®i«í†”&ny°ƒ èΉe»®¤@ü3ƒÑ¹zö¯ßÁ²TµÂ\¶R†HÿA,>Þ‰íÖmJ¨Pc'ƒFÀÙû*üàÏ/Áo|œº§Â/ýôÊ$ö!}UGŠÃ†£þr¥ÑÃo¼Õd c'$Ùã ²²ÎhÑŒ ë‰?ãLÒ¹¬+8-ÿáÛ_¦|Mì;oœPÖôÍÖuPŒPxUCà èÚUQJ‰´$ÚJ¤%׆#«¹ªLé£rua'Cgÿ=Öøgטּúƒs匑9*™£²®öÕF·ÿb”àÜwëø•ŽÇQåÇHðG8ªp€^P‚B,‚©· ?E4ˆˆSS…g⌑?mÔÕF*\Xp®¼¹æV¯.8íÛ!sTDCåQUyb{:utº?JG<Ý\:6˶}¥²lÛ/¤5 ÐÖŒ·­ë r‚ ùC²5±•[×`q AO×¢‘ ÝV®hÊЀÆ\-»)—?¥1<å(1 É•éÿéIf<@é'÷cÁè Àջ΅SFx¨ñ´Üœ“?m]SkŽ®*– `êž“<`ÌÜsà¹ð\`µ´±ïVògb¦…GjâŽ3õÇØ¹~Éß²gr£‚цh˜½¯&欵ñòêµJ÷Ýñï0zÂ0÷¡ú—ï8óÚ6‚†‘~@eyňèQ¡±Ë˜t¬?¸MéØHpüf1?—íº-¹O© oÖ¯/±5탠)x¢4HÃ÷(þ°gxp5ÀócwJ.¨¦@o¹,G1?i”ØNÛ_•ôþïê&G‹ÿ°‹ÿ°Ãýus•îÛ©ûö–…Oÿh7 tã¡òcwàË꺇o`ó{ž½oÏÞßÉÀ؉¨iHåQµòÈŠ2…£¨I'ó²G5~}Üâ¶´»¥××7<ÑÎ$Jîí WÕQÑb) dz×Ç‘ |]ù`~¡bFô5Á k„t$/MpÖeÏóçÏ~\G~˪Þ/Û¿T7¿@t¿iMñøŽsé@ú°Ä"¨™3ƒ|Í„Mpœm¬‰ÎöABÈn‡:H¡Bu°Mâ{¦¾›nJùo}Ïž=|„—í^ý¢à*.0LÙÅ:8ò§ìåϯÒj„Ý«ƒÙá³ówç­ÇÍÒ‹årúô@ÜìI$ûŠßN†Qsñ›Éı¾D²¯4W*Ý]H$ûâfÏÌ­Yÿ·ædßÉÆÍžÁá¬[S¯B¬M¡nMî£ñÜ¥|Sâ¹ÇÇ>µ–—rå.V–æ'.åóŸ^^*/..Ì_ûâÊ»ïŸ Šº4qáïykùáÐ>þ$Èeýüo…òJë`ª¿ÀüÂBcâüÛ§3Ð$ûæ ª­6 æ>×#2p:S¹_ùÓˆ.2p:®39;7ÛkšÐ9™™+ñeB~vò=Iþbnä/£³ßO…)¶ã¾.TîW+÷ÏŒî3‹è-ë²;Oœ¸É(˜Òiþ €øXêDªøÍd˜’Î*¥²o ^ûºÐ~9†aXÕ‡ÖÏÁÆ—Aé0öÁháF1ü³ò :xf°¿?Uø¦Ø~!éSé¥å <oNgÎ ñeB:Iu‘Ñ?„^ùlâÝ÷Ïõõ§z™ÛНs—òñ#=…¯®^ýl"p6Ù_Ly¹ìyþü9€òëտݱóãÙá¬?ßÌž=ÁÍBH޳b±Íç´T95=Õä æ.M\ø{ÞZ~8ô‡?Éû‰é“éÒ—”î”Ò'üD.þIél,\Ÿ´~±‰Dñ›ÉÆôÙ¹Ù^Ó„†ÌéÌÌ\)ÔÁ™;¾.¤OöÓÖ„W“í}OR]^Ê’‡‡Áá¡ÄÑDßñ¤Ÿî™¦¡ !ݦƒúŽ'‡‡Æ>ÊÈ_Ìå.åãGz _]½úÙĪžHÁCúÔª²¿˜ÒÁqqkWovølv¢†1ým±5‹yÐ4›æØ&…BHÇèàF®Ü†Òæ¡p£9•¡• !]ënŽ™èM¾ž,^/ÐÊ„.ÑÁíR]^¢} !¯>œw‹B°ÓHHmkÆmBé*,NNñBvµ¶¹ !„´Û !ÔAB¡BuB¨ƒ„B$„ê !„ìF:lüàØùq¾3BH;'§ÚqÜyßÕe‡³|Á„Í × îN93È×LÙ„mÍBÀöABÈn‡:H¡Bup[ÌÜš왹5»å™ö'Üç2u„îÑÁÂâÙáÁÂâ–g¦–-æ2u„.ÑAëñJõ~åò'ùêýŠõx‹îÇqh_BH·é`áFqè­!h2ôV¶0¹êº55ò§wÍ#½©o,Þ«„p‡;¶ã gãfÏàpÖ® eü`Oáz!y<7W#n†Ò„WO=o³gÏÈž,~[„É]ʾ5X­,]8?vîƒsa Üç.æ‡þ0`-?ÌžÍæ.åÃôêÏ+ówK×¾¸òîûçJB^Qœ™›MN˜‡Læ!Ó¸¹wÆ1.„Î¥í~*!¤Ká|3„ê !„0.î,R'RÛšq›BºJ‹“S|g„]­ƒm®ÂG!íÃöABuB¨ƒ„B$„ê !„P !„:H!ÔAB¡BuB¨ƒ„²›ØÞ÷ņ¡‹l±>§RJÕ\Åeˆ !]é*åB“ —*öy BºÖ´ÇØ_y\_˜Mo:š8–0'ÇvüÅÚ[Yw“íNú?ØÓšeÝÄö³B¨ƒmá86뱕=û.€ü¥ ñq?%wñcî3×®9ª=Û¨j!¤ƒuвV’ ™r?®V—˜fïªVþbc¯Ð²„Na{탾?(š~å‹`±vÓì EÐ×D»æà™ÚÁ­Äö®’ÇSq³gæÖ¬Ÿ¸X.§OÄÍžD²¯øídxòÒ½JêäƒoemÇi*Ç­9Ùw²q³gp8ëÖTÑgÇúŠßNó­Bv®ƒ¡¬˜‡Lû—5ë¾Û¿X±&Us·Ô»¦-}2])/.Þ[ä['„ü³þàæØŽãnÚ_lýü°i ]øpT8A½„ù;·Ng IöÍAU[u3Ç?<MÒ'Ò³wJMåÏÎÍöš&4dNgfæJõÄRvpÆ?8Ç·Nid›ýÅOƒ ´ú¨:j<ݯV—bL§fïønôˆÑªª…¯ •ûÕÊZ?.‹ù·ï´ÄÅÎ'nö´(¸Ýg¬f$„ùƒ¡Gvîýñ0dÓì…§ÔSO½¨ûËg•RÙ·¯}]X£O®R1£Y: ðªÍÎfl_ÌÏâÿK!;‹k6” ]ª¥Ê¢DD £º¼¥R®R/ðþ*ªƒgûûS…oŠé—?¿ ¥»ó§3MYÒ§ÒKËx(ޜΜ œÖSéâd.~•o²ó¸Ø­)¥”DtÛ¶Bá ±XÜ}j+Où)›Ò:”z“…W>›x÷ýs¶cÿutØìOö§z›×þO¡)Kþbnä/£ ÿ³8l¾¸æ'^ø(÷îû#…ÅÜG9\ç{'„¬²çùóçÊT\¬-Ïžøôc¥¶è¶kÎÈÛ£½Ç4.!äUÆRñäaÙ¶?8òçÑêrµò ¢žnØ’ˆöF£ÑöAð BHùƒ„Ò}þ ç$„ìv¨ƒ„ê !„P !„:H!ÔAB¡BuB¨ƒ„B$„ê !„P !d7Ñ<ßLãšp„Ò•d‡Ïn¦ƒc»@Bº›•ÇÕÍt°é0!„t=l$„P !„:H!ÔABÙ½h4!»„êruñ§r¹¼¸x¯b­tçzDñX¼ïX"™ìëûMÒiÛÖø‡cÛøoà­ó©ëõaCÔAÒõqqèë­:P[}\컄½‰@+¶ýñOå¥ÊÒÕ²0òöHætF41šùKùéï¦_Z ·&˜õÄö#Ðz\¼*~ŸRƒ|lw3õŽ1õú®ÞmMµjS¸]þ¼ΚG."ý'ÓŸN&§ÂBÂ3 ×'-Ûý`l[wÕ`1wõ×BÓ PI—ë ·AÊQçÒ½Eß%œ9•™9•QO,ËUãÿXXº·¸Q–…;¥ô©Tøg"aNÝ,úû•ryèÍ¡Þc½©©ézbo¢·x£>™î=Ö[š› ÄËqν®ïXïÀéJ¹&޼7Ò{¬wä#Êq=ÜßðÛÀO¦ku™·Ko²wêVaŲýýÞd³cè<±Ë KŽÝìèÍÎͶNŒ:{k¶)eò›I˶Æ>ÛÉÍ­}(¿g\ÚQÏþbÒþ`Ýûz}PØÆ—³ïþ¿ÒÒ½ÅÍ¶Ìøú“”û`4u2=ûýlþÓüà›CA{Ùcköûéù…ùsŽ/•ä?›<“¹òÙÄìÒøÅÜÌwS~bîÃqóˆ9ýÝÔÄç¹–ùò»5ÂÜF±èk¬´¶Å@°=5ì=Þ7u« žº±x4s&^dúÆ 4@ƒ±?j2÷¾šj¦ê£ª‘&©ªüTACÿäâÔ÷ÓS7§þÙž/PíÏÍ:Hº·}°©Ó`uj–õ£¡¾dŸ ûÌÍ.–·ð°4q<%ë8õÝ”¿“9“É]Ì…åœûó9h’:‘F½¥¯t§”;ŸS@úd:}2$Εr唇þß§'>¿:~>×ìñ…ßÃmòÈ›ÇÅ;€Ûê6éëU¨V-x*~ ?_S~ý*ÕJeú›©ù…ò⫊&ë9¶«Í…Å••óH¢p£ÎöϪ¡&AhL$]NK ßdN½TªQÑž{Å«ËUÓ¬»„fþ{f 3À¶íé›ÓÕGU¿mqµ(mußßqž8ªå[Çqú’}­w²Å-yÛè'©_H5fw]×?Ô¦×Üw"ŠàFw¢jîâ½ÊÊkþ‡òâÝù¦3ãâÊqûRœšm0ÃÓª*¹rð}o¤÷ˆ™l0K›Í#MC‚”Ñ„ý$dwÅÅk\BÏÝD+¶=07ë·Nü¶?ÕŸÚüÉãÉù»óáŸó óÓ7ƒ~’ñÇ]ÏÍœÎ\Þj‡a­ƒþ Ø¿;?¿lëIÞ:ϲ­qÔþæª`†·ÑÓôgîÛjóEÐúy³©š­'öâ•êkþ‡òüùÖBÒ'Ó•åêÚ¾ûªïû¿[ãçsþÌiŸLä?¹lYöö:ÙZ­W.ÇÍ]£ƒÞž¯ õ-ÕŸšÿë˜/‚ãÿX˜¿{€åªD4ÚzrÓ–}k¨øM¡47ãºöÒ½Åü§ùìÙAÿPõQ5}2•üMbêfql…Ù¢Kå“IDATëû©þ¾ùæá¹¥;¥Á·ÃÄêòŽzCj«m~®4tzdúæìFúk­Ø•r¥ú¨Zþ¡6 cäí‘þß§ýÂÇþ6–»˜wgäí‘ðÒ;áþÈ{£ùOòãçÇc±Xî£Üjâ¥|ù§²yÀ¼pñBSöðô½;Œ‹ýIIél”Oz}ç­[KßÏ¤Ï ÈœN7Ɇ/‚ÖÏVù§Jéû™ ÇxïÅèG.ÿçÄüB@ª?9ú—súÞÕ{˜éSéÜ'ùÜùö:޵–§ÐDyˆŠ."¡¨ƒ¤‹ãâõ+^“úªç﬩ƮŠë[Ï<|=yí«k­é~§‡¿?øÖ`x­Æë†!ðħ­qñÄg͉a–¦GØò‘7iÜ0”öÚ-*Bé3iöžrlU}dÙV ‚›—Ýoä/å×=ä»ç ý!ƒ?dÚþ-\}Šp”ŒRJ4Ñ÷ê[¶RIÇã> b]sEÛP;ZpqlÂ?gËÒþ¥ˆ†0ÊÛä›u6²¶¿X]s·«€MR(š( t«Ô¨[Š`êÄm*à  >]£!bDdó]¨ƒ¤Kâb}/œænGÎ^²ämêîÝN\úƒô½PÚ:#ÛWU3Ó3ƒ‰ß$ afz¦ýB6²á¶®¾…Yê1²hÐ÷ByÁw…:û‹É.ˆ‹UÝ]ÒשNCõ¿†c;ýÅÐô` ½¿º•v,@3Ó3•Ÿ*"ø Ѹò”çbo`7úƒ¤ÛuÐ +€êî' —àh¿¿8Œ‹Õ{AVzEEpõCüGŽŠ茋I÷#\W‰ˆRÒäI½¨˜ëUp ÃÊ·õP1#P'ÁGuZ· õaá¡•D D¤ÑÔAÒ¥:(¢”ŠFE‰sÏÔˆtMt M‡¦ü'²m§ýO§£Ñh°€Ÿ®«šj½±„]d( ¬ôTˆ‰úCD©ƒ¤‹1$ªªÑhÒáOàBº¤n×ÛE‚'ª>ªF÷ÇÛ¬»†_õšbÕÇV4jƒH<Ýc¥ÐV‚U+Eu]t}¯7Cºž¡7ò—òæ'Ñ×Dß+Á„ì^] ·j#¥©/®$"Ñ× <¸OíÂbædzM‡À&1u$˜S&szàê—WÌC9ßJöS¿|ÕeR}M÷­4}³ØÿÛ”!"‘¨ÎöAÒõ¤Ž÷gNgÆÏ¼“MMD£†‹†Îgnç>ÚªByJ)w±\¾úU!‘Hô%û¢²õçbA!"Rýý•ûKùK¹ìÙ¬y8Ñ8´¸›ZQ•r—*•¢iš}ɾ¨a‘­­´çùóçÊT\,Ö(Ò¹Ì/,¾)Vî-ÚŽ£ºncÑ ÃÃ0âñxÔ0¶ëÉ,þP.Þ,–ïUTÍîÊÿ‰šãÉד}Ƕ¶’¥âÉÃB$Ý…ÛqÛ¶Õ¿dµò_ Ð$*bD£;AZi#d\LºªD C"Ûjq’Žv ¡‰®ÉÎë.­´žrÒUR¨kˆNSÐJmÃïê!ÔAB¡BuB¨ƒ„B$„ê !„ìF‚ñƒ ªª¢$„® yܸ¾' >EÖ€`MeE‹BºÏñS^«ÖuÐrÿ 6#„tJ4(À]»ÀK=.VPPâûƒŒˆ !Ý{kÖx uÐõ=Få¹€N$„t¹z®jÒÁpúµ6™BºmM+a0ÿ !„ìZþ?O×g9ò5t´IEND®B`‚kildclient-2.11.1/doc/C/images/we_mainwindow.png0000644000175000017500000014111211405233117016405 00000000000000‰PNG  IHDRæÛ¶}E sRGB®ÎébKGDÿÿÿ ½§“ pHYsÚk¥óÎtIMEÙ &RÏÚ_tEXtCommentCreated with GIMPW IDATxÚìwxEÛÆï='‡R€HH"‘f!ÔÐ  DB/ HyADPlˆô¦‚ R’(~ J"EB/RS)§ì÷Gr6[fËINB€çwÁ•dwvvvvvæžgž™á|¿:'<”~•¿–’‚ ‚ ‚ ‡²þ%°êßÓœø˜‡ó—ñÜuž3{ Ö“U‘ ,f%Ì”i#^ô³ qåuì”Çç8ÆYžwž|(óZý$÷À–Åï>÷= ïø!x¯œôó<Ï.× †ò‚ç \ïÜ燔”kq¹~WùNÈçԨϲ«Z_‰ß«jÛæÆüqgMO²í@¶ƒƒ²Q6À‹7ñ/~Ù}Äé_ÇË*5NÖhʯáâYípœ¢Ñ5’7FÄ9/»¯Iô»8­œ8†§ÏyNãž’w$!ò¼q–-YC—bNMœKòJ\.äù/«„ßeù¢÷M²®Jg—ùMç^«7óÞ¢käéWÄ#ÛÌrãŠ(ÅÍÓpÎ<àRžç%aä"^’?ò6…•oŒwƳÚšuOp¨¤Ë(×iCwµ:9÷8«næ5®áÕ EŒ¶‚—ŸSim Ï+ z×Èõ&DöMŠêUÞ šrãI> FÓH°±9€[Î¥š‘|û.ÞLÃûÿæL`2{À¯TÔ/oG9åjÂR­ràäbÕ@AÇ)®ÀÕîåÎô»rN.UžYM ÂO㜚âdR\1J*fyÌØœH@j oæ;f]“OK“–¨r6̆ޥìùä¿‹ß±â÷ÜŸâ²'ÿ]†•Ïâ†e1”ˆ@£–·ûNïYyž‡CvžõÅ¢JÞy‘—-^.’E×h6þŒï‡çy8Éž‘^^£ì©¦CV/1[ç½dß%«ÜŠóR¯lgQ.7(:iŒúµ0¾CÕoR&Xy™ӨÇÝU׉;,ªmÁ6D\Ïä·àtD1«-Ðl'TŒVjmhaµÙѪíqî³›L&Øl6¤¦¥"Ûš ³9Ç­‚3™$:ù³j¥[·ÝnGZZ*¬6+L&“fR(hÚ=L@ù’<ê—·£T™@Xí9yå1àîe¾æÓUQ9À š¸"N bmw÷‡¥ÛCW.„׬ D=dU 9뜊PgU¦ZB]Q)2,yª©(¼Ú5¬û"Ä•÷¤^$j$lÑûàÔŽ3~çeÏ,îXHîa2±-x2á¬pU­áÈne ˆEŸšhçO>Â)Ò-Î3•‘ ¡ÄùŠ”õüLk©8Tâ“׋µÂš()Zf=!nâ4±Ò Hwn¹pÈŽ©åd‘%@Y#¼ÊÈ„ž…™5ºSâ¬÷¶{Óªîp(… käÊáP¾k ½nÞ¨åk~­åê>#uª¼3Á*;¬:gŒ(ç ᨔŒ>>(Uª4B*„ÂÇÛŽÜr­5 Æd2ÁjÍÆ¥K—œ|wïÞu9îû…;ÓîaâQÉߎ쪡x%=‹÷ø/5 Ù¼e¼¬†“šš øøø¨†IIIA@@À#gU×ú`ŒŠ|–EÚ%á­Ö¹P©TókE†¬Db_ËrβR°*O-¯êÆ¢rœÓi×h5²!S]q®ã¡Vi nGŒgQ4 *–.V£«÷¸Ü^½ØZ¥ú¹ábŠa †J§N.¦Y"Ž— ?ñè佉ßm®haæHtËE"S Ëâd5Ôb QœœŽ‹dñr¢wÇ9’—S-nä{•ä5”ÃøLÉ–v8ŸA>:Âa 4Fòz“u\xQ¼òúTÒ燬|°F¸X#P ­%vÁv¿àåb^@6gÁÕ䬜ɟ3 »¯´hÙ­[µÂ'Ÿ|¢8wóæMŒ?.^DB||‘eT½zuGþÍüÛÂ[KøJ†±4>^­Æ™ö¿ÿ>¦yÏ:uj áŒZÏÝ%òZ͵*=5Ñ­h¼Åµ¬bÕéP±–ÈDqC­6b`Ä_ZKœëYÍVxÆýYáXvÕ†_f9çéáæ}U-"*~ÉâFW,öYB^O0I„·SÀ0Þƒõ\j>‘à§AËMCáªÒ±“Ï÷¯‚ˆUiÌÔ\´\GÔêŽáFãPM²‘…/­H¼ë WK„¤lÔ‚W«3Dñ;ßC­^”¹DðZ#gbk¬ŠÐ–‹hUë÷^œèñ ^žNÎy­2M<—Óñ0™¤¢Aø[ô^ ¹‹þ÷ÅÓù>À60òŠUNïJ܉_Çs.~³à„gæUÞ…²>àË­J˾ô[„+ù!ˆ]ü?¿ÄúÊ+ë$±õÔÄÉ:ÉòN‘ìÄ6/Íù7+éj¿GyYUä¹ÈjÀü¶Ñ E>3ߣ¨þPˆ#M1ÊIÒ"t\‘7ê&tÇÄé–”^6_‡e[Þõy¯Šê>ðÉw˜÷œ¼²,qøÜðœð<¼fù¾AQùàyL¹q唇èÝæÕÎzYø[hˆ¹u3' ›3zÇçރϩ£4½ÙlFJJ2:„êÕk JÕj°;yïÇéÚ( +S¦ 6n‚cÇñØc¢°›Íf¤¤¦àðáè^­zŽ{‡lÔéàŸQ¿ä˜‘¸ VÚ/\¸€ŽÑ1æµ×0D¤Ë/Z„ÅKãçŸw¡lÙ².§Ý%aþßÿΞ;‡¨¨(œ>}å˕üyóÐýÅ }Y›„„¼õÖ›hØ ¾üê+Àÿ&¾¡k=wÅç<¢AClÙº>„ºt¬å 4Àþ°wßïèѽ=’+äñž={0rä«xæ™úˆÝ±&ŽÃĉo`ĈáX´h±DœÀ×kVãÝ3Q©R%Uÿµøøx¼õæd4lØ_­^ ð<&Šž™õy˜?/snï×ผ RôS¼Ìsõ .×r)Td¢p¬ÿ®àÎežÔ¬ÒE¶¦l8¼@ëÁ!j“ÛÏ#k›7¼ÃÁƒcÉ’%X¼d1&ŒŸ€À2eà°Û]N»KÂüÂ… €U«V,رcBBBÜöð,_s§ ^¹ràõqã7~z÷îå¶û7Èõ£:rø0`ÏÞ=0™Lxó­)xñÅnø}ï^ôèÞC8_¿AžßÕ’¥Kàp80nÜ8”-[6'­¯CLLo,^’#ÌÅ•ÈÔiï råÊšÂbUî37à8ãÇO@¯^/±‡’E…|‰ÕÙÙnÜxH¾™‘Ös(PcE5Ãé eBŇU­Ñû‚Ê­`ªK+º°©ËlåÊ¡®lDÄŠ[mc ÕÍ6XK&ª¬°Æ*&ʈ=QT1¤ åda-kŽQuE¹ÔØ G1_D­±7àOîÒÒ©Zë&»"Ö\¸Nob)§1ÜÏëÄÅZ ]mÃ0­÷mÄgœ%åþØŠrÉX·5‰Z.ÊäÏÀ\RSì/û&µ–AÔÊ›Bñ%7 6Yá5ëIyý­³\­šˆ×œwa@Ä«njçʆ;ÎwY€N´XP;r-ѼÙ\g{Ϊ‹%¢Ü…͉Xya2™–– OOOøÃn·áÊ•+èܹ3F… ù´téR,[¶ ;vì@Ù²ea2q(áé«ÍÆ\"Ðd6Kãvä Ô¥K—âëukѬY3¬\¹>>>8p (]Úq6ji0`xžÇüùóñÇ`ÿþý?nzõî%„q5í. óÓ§OÃÓÓ¯¼ò *U¬ˆñ&`õêÕ˜8q"2²³ðÏ¥ Èȶ¢r¹ò(_ª4n¦¦ |©Ò.=¼–Uûĉ€5ª ÇÄ¿»§ŸùÙ³gqçÎmìÛ·uëÔA•*UðÔSOã}û|ç’’’P¾|y„‹|‹þIL<þx ÁZñxÍljÇ+>ò*Uªè~´ÿä>sõêÕ„«Æã54-æZ£Ë;„¹*ʵÖ'ÖªàE+¨­L¡fIãU²*rù ,P¹—d%]DyÙ:݆×:—[ë´:Kôª t†8/2œÚj&rÿo‘ß-s9?ÖºÞ²÷©X¶N>'@n©“ -!í,Ëš†õJ¾ôkù<–æJiÙ¤cùÄD*KΩlàÁiXmUwÖgF:uš"[,0ïEk I‡Fv K€sòQ.w#ž .«`XEU…¥Ê¨šÖFOÿmYg@²œ!ØK$*–Ü“ (0&ÀŠ&e3¿!† —Ï;q°|¨Ý(ȵ¬äªûaÈ'÷Š–;U]©ETs`o†Ãýjmsâ¥ó:F‡IóÙb·@í¥ÁÝ=´ýZqêuìyÙV+|}ý`2™ààyc䨑ø|þçà 0Ë–-òeËðúë¯#00Pœ¥àpØa·Û˜ß£$îÜkÄqõîÝ_~ù>ÿüsð|νœhÆ]£ˆ¬´@ÿþý±?W”7kÖ /õê¥தÝ%a~üøqDFFbò¤I€Ø;°pÑ"„Ö©…ÝÎ`tÇP·beì=‘ˆß~îM›»,Ì‹N?ó5kÖ -- -[µ´jÝ þyk¾^žçÑÀe+—øÃrîš•_Ñ«&¸­vY¹>ã™6^ÝÇÜÆ#Óéc.ò9϶YVþñ1Vóó–Çšosa¶¾ôݲ|ª×¶¹àß-너ýÅ¥"̙漸µòLˇXõ]ʆÓ|^¥¿8ÏÜâsïjÚúi‹ýR¡ãS-»·ÄߟUþ9•ïK²¸÷æiçóác•2ÇòÓÎñ© jƒù!Ég‘Ï4„!|H:Õ’cNb§rî ç½åóœs,Ä£G‚Äæ¤~¼N7±¹Ø7'å> b!)÷ vÆ™'Æ•ïŠçù¼ŒÍGp¦Cd"Ïñòy!¹ïHgЄã”=ø¼÷İ:;ëÎ$Úw@î"ç £Qwß8‘5T򨃾¾ˆ|ùóÜÊœeüÏ÷æ/ˆýÜeÏiVi’O¥”çŽWøÒç-ù iš…úWÖAgÖN×àô1‡hî ïìÄ9>æbŸ÷ãIîó:9óYœ>厜°ŽÜk~ÿB[Æqð÷óƒÕš¬Ì,X,€ãзO?8ì,X°ûÿ8€`ìkcñRÏ—à°ç‰P«Õ Ÿ’°XJ ;;[ZÖL&!îÌÌ,”°XpõÊ,[¶LW¿¾ýápðX¸pž{¶£à!¡waÃJ»“åË—cÿˆŒŒÄÿýßÿaÕªUЀäzWÒî’0?|äúÄÄÏ3/ô‰Á·‡ö£{³–¨óX%@ËÚõr&!ºy¸¡fÍš8räN:ÚµsÖñ>uê´Û_€ÓÏ|íÚµ9‚¼U«œŸ-[á£?ŽGDH—Éy¢V->tH’¾“'NjÕ®¯]?Ï|òä)Ô©S<Ïã´è™Y½ä&xZD=c†¹óã4™L¹ ižEÐ$š™]ì}Ì›xn§Y:I²Xø« Uó`M#Tvfh¿_m¹Ñ±dó:n+EZæ;¹b¹ç´æ)0ÜltÝ â–ÂXUˆåªÅÜË@fñf­4£¶Ž¶^Xµ5©9K¦ë¸ÜbÌk„3ü®Ôæè0\…Tó_Íâ ¶ÛŠ®ËŠ^&{wÂ15Ê%Vrý7xƈ¥«þäªÖnI¾çu¸x ŸråOq™É±à n‡BGÌI£Zí·ƒçQºLp‡ô{éðó÷‡Ó ×§o_¤¦¤àëµk1dÈtïÙC⎒mµÂlò€Ÿ¯{5:‡Cˆû^ú]˜ýýQ.¸<¶lÙ‚   I\}ûöųÏ>‹ÒeJÃî°ëÆ]èU!#í°rÅJ¬X¹¯y =_ê‰Õ«WcÑ¢Eàyýúõ3”/ùæçΟÇ7P¯^=áXHHºŽßOŸÀÿíü/5iŽ%JâüVZš[3fàÀAxýõ±øäãðÁœ¹€O>þH÷ºÒ¥ËàÎÛHJJÒuqZÌ ==aaá¨V­ bÅŠ¨T©Î;—+Ì¥óáÆãÕWGà“?ÂìæÀd2áÓO?ÉdÂ+¯ sYÈñ—$Ä]¦tiæ’‰âãzq6¬´_½r+V®À˜Q£Ñ½û‹pØíèžw`É’%èо=‚‚‚\N»áÅ ÿøãsø/5ðË®]xùå—‘™™)’ Ü…+Ô«WWñßIÛ¶m1cÆL\¹z íÛEaРèôBÝ8Gމ€€téò‚æFFNœ~æ@ŽûŠ˜V-sþ BÅŠ%çš6mŠ… Áj·ã¹çžE‡í‘• "²iS—Vp~0mÚ´ÁÌ3qåÊU´oß@gñ3çV‚¼ÁÕ¸*„ ÀÜuLíZ5‹Ÿb'7H7„átvÿtöR5E™5R² ¡Èê/^7Z2s?wòŽx#Ö*#?ÙÜkœ¶Ce'I­kx,‰Ï«Þ5²ðâÏÁ°VÊ—º‚èÝð,¡(ß–\\îTÒÂÉ@qxËXô rË•3²-¥…|å1/[Çž—=›xËoñ³É·J—?«xÓ!gšX;:ã’?gPtËÓ,ÿÏËÂèý׋ÃHG“•1Åó‰óJô)òMm}jQ\bß~Éúãâç’ éÜë%e"÷:qÙa FÑ3q2Ë¡üžâºLíR„—¾9µðòg`}ûšåÉ@xÖ5’oìɵŠûg¾wÛzhRÁ¦Ù·=f vïþ G’Ÿ²ö ¿p~—¯c×÷›Ù´)V¬\?¿bb*ú!kÝ¡ ù„ E-~–uÆ)¬í<‡LkÎ:æYVG®o8rýÎóüϳ¬d;›Ý¹†yŽyŽïyŽy±ö1ç•ëKÎ3¯Ï§9äCѲU@4|ª ìc.[ Xìïα¼"\ð©6ä îbœÌüûæ ;êÉòX´–±Ä§ÔÙaümå /ø ¢µÏÅ+ÍHV‘[½¤–Ïœ ¤;î)ž/wwQùÚÐyçå“)9ýwaÔÇ\¥|hsÉí²4 |‚Fñ,ùÌÙNˆ&NlÑ…2ÝÒŠVxN,u|î¥Î¹-õ×—ïE2/$·L³çäÅÇÉÖS×z'¼üûâyÝo²µÃ…tª Îñ¢÷`’Zå¾Ð&ÙÊNNxq~ŠÅ«Iîc.ö›RËKkù;0q2VžOºøÛ”„ƒxzÑËa|çâºÇ¹|¡<óT`ò•±¤n'<ÏØB”ÏεÔ9ç{‘¥c̓aŽ&ä<§ÅÃ/o/ƒ'ž¨ kv¶L€æÕ»K fÜj‹»hÆ ;íû®z`í®£Æ\Y~ýu75j¨8W¿Ju¿p½ôC9/o¬]»}ûöÃwß®‡‡Å³©èwhºŸÖ ˱ֵ†vùYÏ=ÌüÌfA<°Ö0Wó1W[ï¼8¯c.ÉÓ»I†þÝuo­aiî~¥O4ëR8ÆŠ$jî(Š [\Ã¥A²Z ëZQ¾qX›ü¾å}Q{*.*òwªëŠ ?Ç)×7ò~d»Ê×wéþ®Ô/Z;ÒªÔYâpjeˆ¹ÒúÀ¨4¯S×əൠIDATŸƒÒõDîN¢êKÎåÔ Uõ=g¬~¥ðg-Å©c“»­ð «¶‘]wåa•>ë¦Ü•iLº£ÜòµÎbNÑ€ç9¦f0‰&/ó*õ´Üý3;; –<õÔÓ0™MØ· OèÒ•Ä £šËJ^›g݆9™’lé.N–7Œç*Wñ9ð:ãKœ¡(Î@ ì‹“ç±Nø<+Øç9•²Í+‡Z¥¾êìïA¸ËO—±RÏZ.Sl…ÒðU®‘¬í_ •|Pí¼«¬¿_ØYÝûL¿xe-Ÿ}AÈgˆF2Xb-Ï E}h^êK®^þbNV~˜£™{Jp¬4‹â–³–uÈòFl:cí€*/ò¼C°Þp²|ç½`ù• [Š_cÎûʈƒ—”IqÞ‘ÏÛUN&o˜“¾gðJË{nÂxY<œówñÚÃòŽ/n¤a¤·a‡Q+ž×Þ8ƒ âA2.wº~Ïâ—À<<\qÝþýû‡3g’pøð!*IAAÄ£!ÌB\.ÒyžÇ•+WQ¢D ÕkM&õ#×Ë…úêÕ_aÁ‚9r$Z·nƒààò¨_¿>•&‚ ‚ "ßKW‹Å¢:™266‹Eø»råʸy3ÿn$ù¹~êÔ©ˆE¿~ýѨQ#dddRI"‚ ‚ >a¾|ù >L!ÎÅË(:éÓ§¾ýö[¤§§ãÞ½{øôÓOÑ­[WÃ÷ÊÏõˆ‹‹GVVŽ=ŠaÆQI"‚ ‚ >aÅ‹—`èÐ!’ †XË(>iiixúé§P½z5üþû^,Z´Øð½òsýgŸÍÇܹsP±âc>|FE%‰ ‚ ‚(\÷Ù?ó½ÛÖC£àl€Íf5ta|Ü. ú xž§\$ÜÎùsgQ±Reœ?w–2ƒ ‚ ˆ‡÷ìý×,X÷÷ƒ·\"AAA<”B=ïW²|AADÑ!Õßd1'‚ ‚ ˆb€eñ¨Q?"BõÜŸºõ^þù'/YŠeK—PÆAAœ î¯ÐRšAA0'mô¬ã»ââ°hÑ"\ºt áááxuÄ«hÓ¦µpÞiyŸ5k–,Y‚Ë—/£Fõêxûí·Q½zu‰eÞù»»-òAA<<9A0Ø·o&Mš„sçÎÁf³áìÙ³˜ø¿‰Ø·oŸ"ìäÉ“qîÜ9X­VOLÄŒ3( ‚ ‚ aNF©!ù/fÅÊUày]»tÁ/ xá…Îày^²ë¬“Æá×_~ÁÌ\A~êô¿¤Öñ?$k9AAÆ„9Ïçü'øçŸDÀk¯½???Œ}m, 1÷¸˜ÿMš___DEµX­Ù”AAèâÔßN N>æÄ#‹–›ã8Éß·nÝb€°ÐP€ÅR‚2• ‚ ˆ|C®,Áàñ5óæ}†{øâË/µk×V~D&ýÏ(99iii”±AA0'Wèׯ`ÓæMhÞ¼9¶oߓɄ—‡¾ìR<åÊ•´ŠÂ´wÞ¡Œ%‚ ‚„9A¸BË–-1ëý÷Q½Z5X,T©R~ø!4ˆp)ž ã' téÒ°XJ ==2– ‚ UÈÇœxä0º:JûöíѾ}{—â‘kÛ¶ Ú¶mC™NA„.d1'‚ ‚ æl‚‚ÿCB‚«ç®ûAA s7oÞ’ü_¾|†&ç7oÞ¢7HAA0w²gϦ•[þÏž=ù¾Gtt4/^‚¡C‡ÇÄ–îØØX„„#8¸>^~Æ hÑ¢J•*E¥‰ ‚ ‚(¨0çEÿó/ÎW®\…Áƒ –ñ={ö`ðàAX¹rUE¹þþþHKKƒÙlFçÎqà€tuŒ÷Þ{•*U† Œ¸¸8f< 4h0¼¼¼àç燑#_Å­[7Ѿpá…à8p•$‚ ‚ ÂE¤úÛ­>æbq>gÎE&Ê`þüù5j$Z´hŽ>˜ »Ý.9‘·þtPP®^½¢×þýû1{ö,¼üòË’´GGGãĉHLLìÛ·<ïÄMAAùÁí“?â|Μ9E&Ê }ûؽû7L: »wïÆ´iS¥*Ú6çy8f<«W…1cF#44C‡ņ „sèß-ZX±bH¥ˆ ‚ ‚(0…²ÁPdd$.\¸·Æ ‹Å¢z¾V­Z¨U«Ê•+‡6mZcæÌ÷„s‰‰‰xê©§7nÜ@@Û'|êÔ©8xð ƒ'Nœœ0`5jˆ &à—_ðñÇS)"‚ ‚ L¡-—X¢|øðaX¾|…Jg )6oÞ ›Í†‹/*ü[o½‰k×®!==+V,WÝZ= qqñÈÊÊÂÑ£G1lØ0ÉùòåË#** ãÆÃóÏw‚ŸŸ•"‚ ‚ ¢ÀxׄÉ7ý±X,X¾|¢££™á?ýt^{m ^yåe˜Íf…€4hÚ´i »Ý.]^ÀçŸ/`ÆóÙgó1~ü8Œ3UªTÁ¸qã0|øpI˜!C† S§NˆO DAA<¼ÂÜèÆAâp 4ÀÞ½¿«†íÞ½ºwï¡O‹-+ºÈ¯ CXXêÕ«G%ˆ ‚ ‚p &Ê×ÈÊÊÂÊ•+ѳgOÊ ‚ ‚ ÂmxP¸FµjUñÌ3Ï`ýúo)3‚ ‚ æ®`Ô5Æ/^¢RCAA¸re!‚ ‚ ˆb@ŽÅœxž2ƒ ‚ ‚ Š ¹þ&‹9A<Àœ}‹äyŠ­ü*H^ö{)ª< ‚ ÜK'¶ùð8å"ávVu÷)¶i›1c6l€Q#GÁÛÛ©©©XõÅ*,\´£G*Ò´X­Ù:_P&MžŒÙ³f¡eË–Eò<ʼn?¤ç$‚ Ü YÌ ÂEvÿöž¾J–, “É„R¥J¡¿þؼy‹$ÜÒ¥K…–­Zaîܹ°iXÔµÂZ­Ù˜:u*"›5C×nÝp<1@ž%³~DÓª©vþë¯×¢ct4"4@£Æ‘¯t׈€ÍfÄ7Þ@ƒ† ‡óæ}†ÖmÚ id$†Ž«W¯J®ù~Ó÷èÔ¹34l(¹¿ÞóˆÃ¨sZð5j„^½cpèð!ÃÏf³Ù0cæ ´ŠÂ³Ï=‡;wj–ñ}µž«¨ß‹3î7 ** m£Úá§Ÿ~Ä_~ÖmÚ(â¾pñ"ÆŽ}-[µB£ÆÑ½GÉùü>§ÞûP+×Îû9rm£¢0`à@Ãy u^/í42@ s‚x źoÖ!==]8ˆ¸]? oܸe‹ØíÛQ«vm|³n3>½°+W®BÆ ñKB^}õU¼;}:€_°@&Ö~ÁâE‹p`ÿ~ÉýõžÇN þÞ½{1tèLgºág[¿þ[‡`û¶møbÕ*¬]»Ö¥{«=WQ¿':ŒM›6áõ±¯aÚ;ÓqùÒìܱC÷¤I“ѬY$~úñGÄÇÅ¡ãs1ó½÷ üœzïC­\;Ù¶m¶oÛ†9|`(Œä‘VÚid€ æñ2ýw±qã÷h…1¯½†o¿ýGŽ•Šíï7£C‡gáéé ___Dwìˆ7²…¹NØ]qqhݺ5, ÚEEaýúõJÿ[o½…ð°0@ëÖ­a³Ùò•n[·mÅóÏGÃËË ^^^xþùNøë¯¿$a&NœˆÐÐPæý ŠŸ¯/ÒÓÓa6›Õ¶-6oÞløÙ~øa'^ìÖ ÞÞÞƸñã]ºwAŸËÝïeÔÈ‘ðóóC‡í‘#†ÃËËK÷گנ{÷îðôôDÉ’%ѯ_$'ßqËsj½½r=`àx{{£|ùò†òÀHfÙ#‚p´ó'A¸ÈOÔÄæM›ð÷ßÇðçŸâ×_ÁG„1£Ç OŸÀÙ³IhÙª•ôc3›™ñé…½té||ÜçsZ¡‚ê9WÒÍâÂ…Kðóóþö÷óÃí[· ß¿ L{gÆŽ}kÖ¬AëÖ­1tèP˜sÓ¯÷lIgÏ" ï=׬é¶|½ïÅ)h-–€2eʨ†=rä(~ÿ}/Î_¸ˆ»í9µÞ‡^¹ q)ŒäQa–=‚ 7 sZÈœ Œb2™ðä“õðä“õ0xð ;v oM™"sžç±ï÷ßa±XtãÒ ëp8Üšv³† s%ÝF±ËÒo2¹o NîcܼYs|óÍ7¸þßX¹j%cü¸q†Ÿã8Cù¤V&ŠÓ{1šžM›7aõê5èׯ/7n‚²eÑù….nyN­÷¡W®å¢Z/Œä‘;ËA„{êoª¥ÂEÚFµCff¦äXÍš5‘œœ,üŽÛwîŠO/lHp°â~……+éfQñ±p¤¥¥ §¦¥Áãðæ®\¾¬8V½Z5DFFâ oHüÄõž­jÕªHIMþþ÷ß3ŦÌô½hñÉ'ŸbåŠåèÚ¥+žzêIdfºwŵ÷áj¹Ö˃ÂÌ#‚ ˆ¢‚„9A¸H×®/`Í×_ãâ¥K°Ùl¸“œŒo¾Yçž{NóBçÎØ»÷22‘‘U«¾ÀˆWG0ãÓ Û6* {öî…ÍfC||º½ø¢pÎÛÛ.\@ªHPŠÑ;ïjZôèÔ©¶oEff&233»};*¸à> —^$$$€çy\¸p³gÏ–œïѳ'~úùgØìv\½zUÒ)Ð{¶—^z [¶lFff&nܸ>ú¨ÐÊPQ¿-üüü°gïïÈÎÎÆ‰'ðÖ”)n{N­÷¡U®ó“…™GA$Ì À’þUõDó\ÔXÒ¿ªá¸â'ÔÎW¾\ !%$Ç"«ù!~Bm4­ê'9P_®V û4½„qF žç1zÔ(4kÞ={öÄ›×1îõ×…0111¸›~:uB›¶mñס¿0ãÝÌøô¾}úàYQ§@ŒÞyWÓbäú7nàÙçžÃs;âxb">ùøcÃ×ë¥×¹’FÃFðÚØ±x饗$çßž2K—.E“&M„AŒ>[tÇŽ9?Ÿ½z÷F»öí ­ õ{ÑbÚÔiX¶t)š7oŽ)o¿ýû¹í9µÞ‡V¹ÎO4h¹D‚ Š\÷Ù?ó½ÛÔEƒò9CŠFýYããvaðÐWÐzî±b÷Pñjãäµ Løî<Ò³ò|P½-&Ìë]ÕÊyúÆHÃ[–ǵT+6º-Ó6O…—Äá‹éø,.omç.O—A°¿‹ýÏ-Ïþ0lú´ª»*VªŒóçÎÒWJAÄC‰sîËë^X÷÷û*ËžÓЦ¦?¶Éó9lQÿŸICµr^±°Ò%0¢U0ê…ùÀÓbÂå;ÙXñ×ñ§SB7~Bm|üÓÄ4*‹òþØyïn»$„•ÜÿLú4*+æ•|± á*F¶–®6иŠ¾þã†Ë÷ó0qÛ.ͪùÃjç±ä×kÒ^¼Ò¢<:Ö-¯d`Ηñ_ªß¼R#×&áÖ]*zbÕ j±& '¯e ¼¿ŸöªŒÞKOÑC®X~iín‚ ˆâÅC+ÌN¤àÍè0‰0ªU ®¢_“²Â±·;…#öè¼»íÌ& ëÓ×.„)¶ YuŒÿö®¦d£YuLí†ö'*¿œJAžðô0!Ëæ@9ÿœ•þHº‹1mrþ\OµÂÓbBå O¿œáòýº<]ÿ¥ZÑké)ø{›1½s¸äÚõqë® =—äìž*ƒ¡ÍËã½ØKøûò=<Vñ'RP§‚xu*øàäµ <^G/¥Ó×A $¶ ‚ \ÚÉŸ—“³a ž€@_”ò1ãÜÍ,I¸a_ÁÖ÷‘esà^¶ß¼‰R>êý•ùqWq5%gÕ‚ÿ; Ç çày¾Ž§+ ˆ¨è‹?Îæ¬V±ÿì]4¨è xæ±’8t!žwù~mŸÀö#wiuàzª ¤ógë”ÆÇ“‘eu ËêÀÇîàÉðœuƒÿ¾|uÃr~¯êƒ}gÒP;ÔP/ÌG.Þ£¯ƒ ‚ ‚„¹{H8™Šçê–α¥ðëI¶¼v Š,‡)χaå jšq^I1¾”ØÞ3ih\%G€GT*‰ýIwäXÍ#*ço\Å{Ϥåë~•=‘’‘çCêºté±ÐÒ%pWäcŸ–é@éÜNÇß—ÒQ/¬dîó{ã›ý7Q»‚O®0'‹9AA s7òˉD=³‰C»Zˆ?‘¢]¯4&>[×Ór&jNüî¼fœ¼ û08{ÏTô…‰ãP«‚ŽäŠÝCÓñd˜¼,&.-[4—s8˜7ï3´nÓM##1|Äp\½zU8_?"ßoú:wFƒ† Ѩqc$$$¾>!!7F£FЫw >$‰{ÓæÍˆj×-Z¶Ä{ïÏBFF†pþÂÅ‹;öu´lÕ 7F÷=$÷¶Z³1uêTD6k†®Ýºáxb¢äÙ–.]Ѝ¨(´lÕ sçÎ…Ín§‚An !!={ö€·7<==Ñ£G9r„„yqá³Ï>C·n/¢ÿ(]º4, š6ÄÂ… ±|ù2IþÎ;ï Zµª E×®]pñâEfœzaƒ‚±ÿ~Ô¨Q:´€œ^[H0‚ƒË£eË–Ø·ïwúz‚x$éС¶lÝ&9¶cÇ´k×^rlíÚµ ÂÎ;‡ÈÈH|¾`¬þ‹-Âýû1{Ö,Lš<Ùðõ“&OÆìY³°wï^ :Óß™.‰{ýúoñŪUøñ‡X¦4æ}öYÞµ“&£Y³Hüô㈋CÇç:bæ{ï çW®\…† â—„¼úê«xwz^Ü7n@``ÄÆÆ"vûvÔª]ß¡ˆ Ü‚Ãá€Ùlþ¶ÛíŠ:æ÷‘ØØíèܹ³âx“&M±kWœð÷âÅ‹P¾|yüý÷1œ>ý/¢¢¢0sæLfœF®[·‡ÁÊ•«C‡Áòå+pùòŒ?£G¦¯‡ ˆG’ð°08ìv$%%nܸÛw’QµjI¸­Û¶âùç£áåå///<ÿ|'üõ×_’0'NDhh( uëÖ°Ùl†¯÷óõEzz:Ìf3¢Ú¶ÅæÍ›%qO?aaaðööF÷îݱwožAeí×kн{wxzz¢dÉ’èׯ’“ïçwÅÅ¡uëÖ°X,h…õë×ç óï7£C‡gáéé ___Dwìˆ7RÁ 7мY3|·á;dff"55 -‚ý‘z(…ùùóçñØc1Ïq'±¬ôêÕ ÞÞÞðööF¯^½±wïæuFÂŽ3>>>Bƒáïï´´4˜Íftîܤ¯‡ ˆG–öÚcËÖ­€~üí¢¢a.\¸???áo??ܾuK&´BÕ{è]?íi˜öÎ;èÕ«–,Y¢h¼ëÖ­+ü^ºti\¿þŸäü‘#G±xñbL~ó-ôèÑSrîÒ¥Kðñña¦ëìÙ$´lÕ õ#"„ÿW®\¡BAn`òäÉ8vìZ·iƒþýû£IãÆ0›=Ègñx_P‰% …KJ:‹€€áïR¥JáÆù.ù{þüùˆ‰‰ÁÂ…  Þ µAŸÿ9JX<¦Sñ±p¤¥¥ §¦¥)êV-Œ\_½Z5DFFâ o`íÚµ’s§ÿýWøýö­[ðõóþþä“O±rÅrtíÒO=õ$23³%׆#33“™®ððpܾs‡ AgÎü‹ºuê<i•ëï‡Ò•¥}ûvøõ×_Ç·lÙ‚eËò&V­Z)))ÂßÉÉÉªÖ WŠ©U«VΚš³fcñâÅôµñHÓ¾}¬^³íÛ·gžïÔ©¶oEff&233»};*h¸®¸z}ž=ñÓÏ?Ãf·ãêÕ« ÑþÑGâÆ¸—‘o¿ûOÖËsmñóóÞ½¿#;;'NœÀ[S¦H®m…={÷Âf³!>>Ý^|Q8÷BçÎØ»÷22‘‘U«¾ÀˆWGP 7еkWlÛ¶ Vk6’’’ðý¦ïñR¯^ä³<”Â|ذáøüóϱlÙ2ܸq™™™Ø²e Þ~{ Þ|ó-!\ïÞ½ñÍ7ß #·¢\¿þUßtWÂ:‰ŒlŠÍ›7Ãf³áâÅ‹4„IÄ#O»¨(x˜Íh§"ÌcbbpãÆ <ûÜsx®cGOLÄ'l8~½ëßž2K—.E“&M„ZÄt±;úôí‹N:#==ï¼óŽpnÚÔiX¶t)š7oŽ)o¿ýûI®}yèPüôÓhÖ¼9/Y„3fHÒu7ý.:uê„6mÛâ¯CaÆ»3¨@„˜9s&Ö}³Íš5ÇØ×Ç¡[×®xú©§ÈgáºÏþ™ïÕ¦."ÊÞséÂø¸]<ôðÅÔÿåܹ³˜6m~ûí7ddd N:˜<ùM´iÓFãp80}út¬Y³Ç¡uëÖøßÿ&¡Zµjr–@¼yó–Ëa8p¯½6ÿþû/Ìf3–/_èèhú‚ pþÜYT¬TçÏ-Vé*Ži"Â=ÔˆÀŸi’>A7âãvaЗ ¥ýuêÙsg“îë3þyÓëâŽ=œ“? R¥Êøò˯4ØL&LŸ>Ó§Ogž mWÂ:iРd©-‚ ‚ ‚PÕ¦”AAAœ ‚ ŠäÆBÅ“AC^~džÕƒ^7AAQ\y”æv‘Åœ ‚ ‚ H˜AA+ A¸L|Ü.Ê‚ ‚ H˜Äý„ã8Ê‚ ‚ H˜Äýæ~o@@AÄà ù˜AA s‚ ‚ ‚ H˜AA s‚ ‚ ‚ H˜AA s‚ ‚ ‚ H˜øûž ‚ ‚ yaž––†ÿýo"j×®… BРA>úè#Øív!L‡Ϻ§«á]!((Pò¿råJèÕë%$%ÑšÙAAœ0çy<Ï?5vìk¨U«öíû—.]Æ?þ„””d¼ÿþûB˜ìì,—ât5¼«Ü¼y 7oÞÂ7qèÐa<óL} 4ˆJ(AAÄCŠ ¿y™0˜øñÇÑ«WoøùùÁd2¡L™25j4Ö¬Y ÇBíüéü=)) 111¨R¥2BB‚Ñ´iÄÆÆª†wþ#>‹`—GË–-±oßï†ÒÎqJ•*…1cÆàâÅ Âq­ô9ï½ÿ~Ô¨Q:´§’NAñ€ñP óJ•*aéÒ%HKKŽ•+W'Ožcvþtþ>dÈ´k…ÄÄpêÔiôèÑãÆS ¯ÇСC°|ù \¾|ãÇÇèÑ£ §?55óçÏ>'ëÖ­ÃáÃG°rå**ÙAAãC-X°ƒ¬Y³Ð¢EK´k×uëÖEÆ U¯IHH~÷òòÂÈ‘¯â½÷fæ; þþþHKKƒÙlFçÎѹsgÍðr <ÇqX°`¡Ké3f |||àããC%› ‚ ‚„ùýçÉ'ŸÄqðàAìÙ³;wîÀ”)oaêÔi1b„êuû÷ïG||ΜIÂáÇ ”†ùóç#&& .@tt4&Lxf³Y5¼ØŸ––†7`Þ¼OѳgOÃé §]DÔˆpùš?¤Œ#‚ B•‡v¹D“É„† âõ×_dž ±}{,V¬X¡~õê¯0fÌh„††bèСذaƒK÷³Ùl’¿Û·ï€Ý»ÃÔ©Ó°{÷nL›6Õp\~~~ˆ‰éƒ³gϺ”>*ÑEˆÓµÉÈ¢ð8yòeåå1å=#A¼¸òøã###Cr¬^½z¸}[] M:±±±èׯ?5j„ŒŒL—îyþüyűZµj!** ³fÍÆâÅ‹]Š/##¥K—v[úˆâš>?–ù‚ÜÏ]×kOHH@£ÆÓ§¯[žeÀÀÁšçÝ}¿‚>Aârg¼zùV娨ãUcÏž==fŒÛïïŽ<.̼Òû6Š*ÆïÉexÔèÑØ³g5”$Ì\úõë‹… âìÙ³°Z­¸uë–-[†îÝ{a|||pæÌ$''¬¬,=zÆ “Ä)o±X žçqæÌLœø†$|ddSlÞ¼6› /^„Åb1œþÛ·oãóÏç£k×®Â1½ôă¤ɓ1{Ö,¬Yý•[â³Z³‹ô~F(,·%wÆ«—oŸ/Xˆ1£G¹=Ÿ‹{ë}Å%ÄïÉq¿6f4>Í9#H˜?pLžü&xžGÏž=P±âchÖ,×®]ÅŒ3òz £F£M›Ö¨S§6à³ÏæcîÜ9¨Xñ1 > £E•4+üòå+0tè”/_11½1tèË’ðŸ~:sæ|€ B„Z´p.ÅX¶lš4i‚Û·ïà­·¦çõÒG<ü8­[5B¯Þ18$›g°téRDEE¡e«V˜;w.l¢ µX\ºt “ß| -Z¶ÄÈ‘#‘øÏ?Â9‡Ãyó>Cë6mÐ42ÃG ÇÕ«W™ñØl6̘9m£¢ðìsÏaçΪ÷¬›Í† o¼¹“±õîU?"ßoú:wFƒ† Ѩqca2´Ó*U?"‚i¡ÊïýŽ9жQQ0p ê³|ýõZtŒŽFDƒ’4‰ÓådÑ¢EhÙª¢¢¢°fÍÅy­¸äÏãŽxÕòM« ¹òžBeêÔ©ˆlÖ ]»uÃñÄÄ|•¯ü¼/½oEÌ_ý ?T¯^ƒ™ÏZåOë^ùÉã /bìØ×ѲU+4jÜÝ{ôÜËÕw •w¬oC«¼©}_ù͇‡ý{r¥ éÝ»zõð÷÷áCQCøðP:%›ÍfL˜0&LP 3qâDLœ8Qø»E‹8p@ÚÃ[Øåᣣ£qõê5Ix±/qƒ °w¯±µËø ë¥ü˜~œÖ­-Z á—_0ý騼y3`ãÆ  ,ƒØØXX­Vüº{7¾Y·}ûª»oüoÒ$Ì3Óß™†;vbãÆ ¨5åmÀÚµk„;v¾Ûð>_°ïÍT®T´~ý·ÁömÛ’’‚7ÞxCÓBU?"BbM2r¯„„_°xÑ"„††"!!“&OÆûö1ãsÇý¶mÛ†íÛ¶!55UõYvÿ¶K–,AxX˜$Mr¶lÙŠ»wïbçŽHII‘Ô#®Æå®xYù¢W†\yϰrå*4lØo¿ý6~ùõW¼;}:Ö¯_ïrùÊÏûÒúVäÄÅÅ£}»(N1»üiÝ+?yÌǬãgFȾԠ1ckÆR&¦”aKöŒŠ,M¥r~¤3–³$#|߯W¯Î9×}Ý×vßõ=×¹ïëtóÆÌÌ 333ºuëNLLѳ5?þ¸›Þ½z¡P(°²²âƒ‰ j—>eM™2…:uêàééYèfëÒ.oÈÐ!( jÕªUì~¦OŸN]uÚºAƒQ±bE¬­­™4ir‰÷õ4÷«ë2tœ÷íß§§'*TÀK©Tå†_%/mçJAqñq4kÖLû¹¢åø3¤,]}¼~]~~~˜ššR©R%’šz§Äc`H??Í¿OúxÑÎ'CŽ!}ÊnÖ¬qñqòð% Ëxñœ˜=g6&¼OHHžžžª—àLH¸ˆG»vš'·–å9Þzë õc333.]º¤~~åÊ5ÌÍÍÕÏ«˜›s;¥èOe.&$PµjUõó7ßxàvéSVÚµK­õ)ÏÚÚZç~ô­Ó… ¨Y³æ?ýóæ%Þ×Óܯ®cÈÐq¾víZ±ß©`ÈñU’ñÒv®®çuêÔ±)ñXR–>çi\\e+ ÒÒÒäŸåK@.e¢ ¨_¯ 5^»˜@½zõ5^kܨ®®®Lž4™õë׫_¯[·.·ïÜ1¨Ìüåݽ{—5jä«O]îß¿¯~~ïþýb×Éoذ!wó]‹}þüÛ®Y¥Ó×ÿnyÙ’œ”¤~~îܹ2¹_]Ç¡ãlmeEFFÆAIÇ«¸s¥ 33³BËëJß²tõñÒ¥ŸñÝ·+ñíé‹] 22>Ñ<ÍcýÆõë%á|*í²322033“–˜ !þ }úø± h! dçäpéÒ%þûߥøûÿsƒoŸ¾}Ù³w/Ù99$&&jüƒíáãÃá?ðwz:ééé¬Z̨ѣ´–¹hñ’““IOOg{h(ÿÜTÔ½{wví '##ƒŒŒ Âwí¢v1Åúûûóý÷addd””Ä’%K j»!eE¡PpåÊ­7j–fy†êÝÛ 7ðwz:·nÝâ¿Kÿ[&ö[°ßtC†Žs¥’#‘‘dggsà@½z÷.Ñ”d¼´+ÙØÔåêÕ«%?wµ”eh›››s$2ЇræÌ¦Ï˜ñDçZiëåË—'""•JÅ•+W *q?¼ çSi—}õêUùvo Ì…ÿ–Þ½ýèоcÇ£M›6Œ7¥²¾=ÿYË~挬X±‚Ö­[«W@È3`À¤= {÷î´ïИØæ}ž=k6ÿ·bnnn̘9“!ƒžè\+Íc=hÁ¦N›F+ggÞ›0ÿ÷ÃËp>•vÙ1±±8ØÛË?Ë—€‘_Ð^U¿öÍp´Ì½v)ÿõkÚØ¿áo?¾6UˆÒuùRõ_mÀåK e²~%ùV·§õ%âùr'5•€€víÜù\ì÷EwâD_~õßêø®‰—Qi.§(çÓ“•="pïOxŸ¦M›Êù‚É‹£c’+²áÀïró§%ñ<ÙºÞTȈÒÕA©dÒĉtèÐÌÌLÖ®Y‹²ƒ²Ìî÷ecgׂ´´tΞ=Ã믿!Bî—C>|ä©Þ{!ç“þeŸ={†ŒŒL Ê_2c.ʤ²>c.„¾¢¢¢øü‹/IH¸HåÊætíÒ™ñãÇQ¡‚I™ÜïË(22’›6ñÅçŸKg_ÿïkÖ¬YKЂê/7’óéÙµiü{ïÑ¿_?Z·n-ç ¨àŒù?¹ÅƒÜÀ\ÏeÉ$0˜ !„BÞÞÞdeei¤òÉ'¼új† N×®]ed…B!Äs幘1Ï Ê‹ãää¤~liiIbâ Y!„B!y©W²\9½ÓU*=*vÛììlu!„B!ùÓpúôiõ㤤$ªV­Vì¶—/_–QB!„˜? Ó§ÄÍ›7IKKãÛoWÒ²å?—¶T¨PððpT*.\`Ê”Éy+V¬È… HMM•£A!„BH`þ$† Fûöž888pÿþ}¾úêkuZÞ*.µjÕdÀ€þŽÔÈ;vì8Ú·÷¤iÓ&r4!„Bˆg¦L®Ê’颖1,øšŸ_üüú¹/oooo›Ê”)L™2EŽ!„BñL•“.B!„Bs!„B!êKYT R=— oìB!„Ï¥ñ·Ì˜ !„BQH`.„B!„æB!„B Ì…B!„(#Ô똫¤/„B!„ø×Œ¿eÆ\!„Bˆ2@s!„B!$0B!„BH`.^:]ºvÅÑɉÄÄD=z„G»v8:9áæîNNN‰‰‰8:9Ñ¥k×§RG''œÊt…B!¹OMÓ¦M8ùûïüù矬]»V!„âeÌŸµääé„”B¡ÀÖ¶!>ä§={¸“šÊ›o¾IõêÕyýµ×¸}û6dddРÁ«êËGþøã4ï½÷æææLxo§¿žß 055¥V­Z\¼x€aÆR±bEòTêX\ù11¿ñÙçŸ1çñLyvvv¡r‡N¥J•6l8ç/\F!„À\»G1gÎ5jˆM|}{š\°àSlmðúë¯ñ¿ÿ}]h\[zÁÇkÖ¬ÆÁÁžš5k`mmExx¸Ae‰²%ïR‘Ç3ÂöØ;Øç¾þxV9ÿM•FFFûHII)òu+++çy›(Šbó”F‹+ã¦MŒ|ûŒ(ÇÇÏ-¶Ìôô Í?åä}»B!¹Ë—/£V­Zœ<ù;çÎG©T2þ|uúºuë¸wïññ'Ù·o?Û·o×ȯ+½ ððpBCøu+‰•+¿%0pD‰÷%ž½¼›+Ï?Ÿô>víírÿþøÚí¼ààõ×^àóÏ¿àïôt‚W¯.60611ÑxÞ¸qc>ûì3ÒÓÓùöÛoŸJ‹+ùòåøøtçÚµê×U*Í/&==µksƒþ×·Y~w IDAT!„˜kýúõôë×…BB¡ _¿þDFQ§¯Y³šÑ£ÇP¹reê֭˧Ÿ.Ðȯ+½   …Ô¯_ooo²²²J¼/Qvsȶ³³Ë zíí4¶ËtŠ››»ví¢\¹rŒÌ·òJqòòî §­›;wî|*u,޹¹9}úöeò”ÉTªT €Û·okl÷ÃîhëæÆ¶m[së=(@!„Bsí.^L jÕªêçÕªU#))Iýü?þ víÚêç-Z´Ðȯ+½ ¼ ¼(†îK<{ ¼ªN5jLåÊ•GÕyõÕW055¥a£Æê<,øôS7jD… °µµå?ÿù-[:é,ÏK©dÚÔ©T«VW^y…É“'?•:çã¹s¨_¿>*TÀÅÅE=ƒ¾òÛ•Û͘1êÕ«S½zufΘIûöžr°!„ÿ¢ò¨€k?oò¾  ;;§ÐÇôùéJ/ôîE˵¶†îK”w£åÊqð—_ŠLÛ¶uk±ù:vìHÇŽ‹MÿíøñbÓüüüðóóS?ïçï_êu,®|{{¶oÛ¦s[ßž¾øöô•D!„ø·ˆ!ŸËó† m¹{÷®úyjj**TP?óÍ7¸yó¦úyþ/SÑ'Ý¥¹/!„Bñòz.óþýû³qãFÒÓÓIOOgÓ¦Ô«WO>tè0V¬ø†´´4™9s†F~]é†(Í} !„B ÌËKK‹"Þ}w7oÞ¤iÓ&4kÖ”ØØXBBÖ©ó P(°³k——’^½zk¬T¡+Ý¥¹/!ž…ߎ×zŽB!þF~A{Uý<›bÿÊ}ŒË—×+ãýûøösq}uJJ JebcO”(½4Ëú¹|)ú¯6àò¥é !„B¼rá_ìs6øýÅüæÏ×^kÌÖ­[ÈÌÌäîÝ»|õÕWøøôÐ;½4ËB!„B/d`¾|ù7|ùåW¼új}ZµjÅÇ™LŸþ‘Þé¥Y–B!„úP_·ò"-ø×¾}{Ú·o_âôÒ,K!„Bˆ¢Œ¿ËI—!„BñìI`.„B!„æB!„B Ì…B!„À\!„B!¹B!„eHyé! çèädpùÚ{!„BH`.ÄSœœ¢÷¶––ÒaOÉÙ³gxýõ7¤#„B<÷äR!ž±^½{sýúu×~ùåœøåàAׯ_¿N¯Þ½ÿµºåÿd $Ÿü† ^fꢭÊbÿ=iÊê1!„˜ !4,^¼˜#GŽèÜÎÝÍ#G"5^;úëQ6´å×£G5^?|äînîϤ=eõRœ¬¬‡r°=#ry–BH`.D™÷å—_pîÜ9ÞxãuÛz´sçð‘ÚùÑ_yoü{D ÌÆ£]n`îèäD\\<”J†  À•«W™0á}<ÚµÃÙÅ¿>}ˆˆˆPçwtr"4, ¥—î|òéÒÓÓõjSÁÙóí¡ÛéîãCËV­pvqÑ(`ÅŠ(•J<ÚµcñâÅdçä¨Ó"""pvqÁÙÙ™~ý{"¶Ørµµ)¯NŽNNEÎÞzwëFRR 8:9qêôiéÖ½;=âóÏ¿À³}{Ú¸ºòî¨wILLÔhoÁ¾ÎÎÎfÞüytP*éÜ¥ »wïÖه׮]cÚGÓq÷ð`̘1œþãuš>ux’1ÑU_}Ž‚}P°N¥5æB!¹J•ûó„ô™!ü7œ<ÿR–-ž½ï¾û–Ë—¯°bÅ ,,,unß¼YsΟ?Off&7oÞÀÕÕ•œœõóŒŒ .œ?OófÍÕywîÜÉ®;Y´p!S§N£m[Wöüôöï§k—®ÌÿäSò6mÚLðªUüôãX¼RÏ¿ø¢D팈ø™åË–q,:š  ˜:mš:mÛ¶­XX¼Bxx8á»vñV“&lܰA>uÚ4‚, 22’ÀÀÌ3·Ør´µ)oÆö·ãÇ‹œ½µ³³#66€qq—›'&{{Ö¯_¥¥%»øû÷ãêêÊW_­±¯‚}½iÓf¬¬¬Ùµs'Á«V±~ýz}öáÔ©Œ;†}{÷âåÕ‘mÛ¶ªÓô©Ã“Œ‰®úêsììƒüJsÌ…â¥¡Ž¿UóRÒ£‡O©ç{÷îÁÒÒ‚½{÷œ·S§ÎϬ –-7þ½Ø¶lÙ¬¾F<&&†àà`>ýôS½óÓÒɉcÇŽ¹³åm]]hÓ¦zÖüØñc´lÙcccuÞ!C‡ P(¨U«Vnp·.???LMM©T©IM½£QÞ¤‰`ccƒB¡ÀÏÏÈȨµ{Ê”)Ô©SOOO²³³ÿ Ò¶‡Ñ©SgLMM©\¹2Þ]»²mÛ6uºyåʤ¥¥allŒ²CŠ-GŸ6ÇÞÎŽ˜ØÄÇÇáÖÖ“ñ¹oœcccppp`ÇÎtëæ™™ffftëÖ˜˜}ìëÜMï^½P(XYYñÁĉºûlòj×®‰‰ ;zqêÔ?3æúÔáIÆDW}õéç‚} ˜—☠!ÄËꩬÊ2|ø0¾ûn®ƒ‹’ ^M@@«W¯ÆË«£Ay>Ì|fZ°lCVïÏŸuëÖ1eÊ ÄåË—?~<&&&íÃÝ݃C‡Ó¶m[~ýõ(>>>´uueçÎøöìÉ¡CGpw÷ÐÈgmm]h_qqñDEErùÊUþ8}ªPz³fÍÔ«W¯Î­[•¨Ýuj×.6-!á"íÚiþ±É÷†böœÙL˜ð>!!!xzz¨ñ†ÃÐ6ÇÎÞž-[¶¨÷1sæL¦ôQßb2d(W®\ÃÜÜ\¯Š¹9·SR´öõÅ„ªV­ª~þæºW†yë­¶133ãÒ¥KêçúÔáIÆDŸúêê碎·§5æBñ2z*ט÷Ý*†öD3ç7nÜàäÉx.\ÈÉ“'5®µ„¢g¡ó^Ëÿ;ïñ£G˜3g5ÄÆ¦¾¾=¹zõªFÞààU¼þúk¼þú넆nç‹/>§Q£†X[[þÏ?¸‹0`¶¶ °¶¶¢M›Öêô¢ÊÎ_W}ê±fÍjì©Y³F¡²EÙö=âÌ™3:tHT¢u›ÖDGG“““C\|<ŽŽ¹3¹NNNÿ-†ôôt¢=Jë6­‹ |BÃB™ûñ\jYÕ¿o_¾þú«Â'}¹|W°ªGJöÇ£\ñ>T*G£¢Ô—˜üvü8¿þú«:Ý­­7ndܸqD‹æ³Ï?/v_ú´©8 mmINIáÊÕ«ddd`og‡ 8uêéÔ«[·Ø¼9ú¥|A¤‘‘‘ú±~A¦‘Få}t©oòËý¶>c¢«¾úôsy-m,Í1B ÌK‘««ëç!!kñó냉‰)}úôaíÚµzçÍ›¡NNNQ?^¾|µjÕâäÉß9wîÀÄÄÔàü lll˜z¯ú ž%ÊÉaݺu 4€²n]9EÌékýúõôë×…BB¡ _¿þDFj¾i˜1cU«V¥W/_233™6m …ooo²²²ÔÛEDD0lØpÌÌÌ077g̘Ѥ¤$—Z=‚‚R¿~}€Be‹²ËØØ˜qãÆ—8¿‡»;¿ŒŒŒ ’’’X²d‰Î~Y´x ÉÉɤ§§³=4êP¾|y"""P©T\¹r…   ƒÆDW}õ9vþ­1B ÌKÙ‘#GøöÛoùþû(tÌò´oß^êÕ«­­-¶¶¶Ô«WŸ}ûö–¸>/j^_Y­Z5õ2jyònšÊ›ñÌ?›UPtt4AA 9r¤A×ÒëS¼ \¼\ÜÞmÚ´Ñx½mÛ¶éÚÌž5›ÿ[±777fÌœÉÁ…¶ñëíÇÀAƒèÞ݇´´4æÌ™Sêm0`Òн{wÚwè@Ll ó>ž§NŸ9c+V¬ uëÖêÕ:JÚ¦€€Hç.]ŠÌooç@VV-Z´ …*• {{ú&%%ѹKºtíʩӧYúßÿjm£w×®¹¿»u£_ÿþxuôÒÙ/:zá߯J//bcb=z´ÞuÈ[e¥•³3ïM˜€¿¿¿Ac¢«¾ú;ÿÖ˜ !ÄËÊÈ/h¯ªŸgSìªçÎ6•¯PA¯ŒöïcxàÛ¯“ü‡¥¥ß¿ã‰níß¿‘+±tìØIýñ§¥¥…Æ¥"ÙÙÙXYÕR¿V0½víÚ\»vM} fNNVVµHJJ.r{mÏ×®]Ã×_͘1cxíµ×±²ª…££c±eçnh=Š{íEwùRõ_mÀåK e²~%ùÆÃ²ðe,ŽNNò¥0B!D‘ýøªˆ©ælšÎøñã4f°´åÍ/0p+W~Ëõë7˜8q"ãòýcÏ¿ˆˆŸY¾lÇ¢£ Z°€©Ó¦©Ó6mÚŒ••5»vî$xÕ*Ö¯_¯‘wÛ¶­XX¼Bxx8á»vñV“&lܰA¯ýçÍ*æÍVdggGll 'ââ022"...7OL ööêmwîÜÉ®;Y´p!S§N£m[Wöüôöï§k—®ÌÿäSýoÚ´™àU«øéDZx¥:Ÿñ…ÞéºÚ­«ßJk|tÕcê´i-X@dd$#˜;g®Ö²>œ:•qcǰoï^¼¼:²mÛV6´¥JÕjDEi¾!ß½ûGZ¶j¥WΟ¿@ýúõ5&+N:ý\Ÿ7ºŽ€?üåË—“Íßéé,ùïyÂûzŸ;%G!„xæ¹êñOYôàÁ‚ƒWáãã£ñúøñã©X±"uêÔ`ýúõôë×O=«Ô¯_"#»_]ÛïØ±oooLLLèÑ£‡Ö;o~UªTáþýûãã㣾&S¼¦L™¢>===ÉÎÎV§ýøãnz÷ê…B¡ÀÊÊŠ&NÔ Ì·‡Ñ©SgLMM©\¹2Þ]»²mÛ6½÷¯½1±'ˆÃ­­'ãso€ŽÁÁÁQ½í¡CP(ÔªU+÷ø^‚ŸŸ¦¦¦TªT‰€€¤¦ÞÑØÿ¤‰`ccƒB¡ÀÏÏÈÈ(½Óuµ[W¿•Öøèª‡yåʤ¥¥allŒ²C´—5y µkׯÄĄ޽8uêúöíCHHˆf`ºy3~½{ëÕ†{÷îR±bEõóòåËÓýûtþè¢ëø¨U³&]ºtaÝúu„„„àâÒš† mõ>wJ:ŽBño)—Ùoþ̻ܤ\¹rXXXйsæÏÿDc›ºuëj<¿x1ªU«ªŸW«VMýQ~QtméÒ%*W®\¢¼ù}ùå— 0€ÿýïk¼½½™4i2ÆÆÆr4¾ êÔ®]ü1– yœ¼ùÆé ñh×NãµòŽ mûׯÎÞž-[¶ÏÌ™3™þÑGÄüÃ!CÕÛZ[[ÊOTT$—¯\åÓ§ ¥7kÖLý¸zõêܺõ—ÞéºÚ­«ßJk|tÕcöœÙL˜ð>!!!xzz¨õÜ}ë­êiffÆ¥K—Ôo–,Y¹óçiܨ±'N R=Òè#­¸U*Ê•Óü€óYþ 6b¤Îm†¾­5]×ñ“Çßߟá#FpõêU¶mÝjйSÒqBˆg¥Ìæy—›h­|yÝÕ7tù®üÛ?zô¨ÄyóëØ±âÆ,]ú_îß¿_èM†x~ ˜ 222*6˜R©TŠ*t™–!û/NC[[’SR¸rõ*ØÛÙ¡N:EzFõò½±-Є†…²vmƒpqiMøôèYl½T€ªÀù¢-]Ÿvkë·Ò]õpkëÆÆ¹õ×_|·ê;¤¥1ñƒ´¶Æ¾óæAÊãëë˺uë˜3{6›7oÑ{¶ jÕj<|˜‰‰‰){Óo•*UžÙ1ùRB©ž7E?ší¯ÊÝÔTƒÏ’£B<£˜âEjLƶܽ{Wý<55Uëm]Û󯯼a­¤e½õÖ[(•J,bùòårä½$6lÈÝ{÷ÔÏÏŸ¿ ‘^·n]nßy:—$Ѭi3V¯¦Eóæ´hÞœUÁÁØç»¾¼(K—~Æw߮ķ§/vv-ÈÈ(¼ú˹óçÕo§¤PÙ¼ŠÞéºÚ­«ßJ‹>ý߸Q#\]]™ŒŒŒ ’’’X²d‰Fz~ÿ¿G«V3jô(½÷¯P(¸rå ÷ò±ùÙÙ· <üš=Ì›7oÎÏ?ÿŒ£ƒƒÖýš››s$2ЇræÌ¦Ï˜Qh›%KþCRR§§³yËfZ4o¦wº®vëê·Ò¢«}úöeÏÞ½dç䘘¨óSºE‹—œœLzz:ÛCCqÈ×Ï–––´uuå“O>¥½g{*Uª¤w==<<Ø´idff†›[ÛçúÜÐuüüuë{÷í£Gžôôõåd|.\4øÜ1t…BóRð¸yó&M›6¡Y³¦ÄÆÆ²N>vì8Ú·÷¤iÓ&zm?iÒ$BC·S¿~=‚‚°,ßl®¼ù}öÙç,Z´Úµ­Õ+´ˆ—ƒ÷ãåð¼»u£_ÿþxuôÒH0`Òн{wÚwè@Ll ó>ž§÷þ8p ‹™}µ·s ++‹-ZÐÂΕJ…½½öÀ|ö¬Ùüߊ¸¹¹1cæL† (´_o?D÷î>¤¥¥1gνÓuµ[W¿•]õ˜9c+V¬ uëÖê•=´éÔÑ ÿ~ýPzyÃèÑ£5ÒûöíïÑÑøùõ6¨žƒfÿþý4lhKãÆØ·oo¿ýÎ3?¾o&ÞàÓ§Ô?7oèW×ñ°páBÞ9cccÊ3~üx–~¶ÔàsÇÐqBˆgÅÈ/h¯Êß³)-ªæÎ"›˜šê•ñÀþ} |ûñu”B”®Ë—¨ÿjƒR¹–U”>G''­_£+ýeuãÆ F¾ý6á»v=·[ŒŒ¸ôø’•JÅÍĤ¦¦baa‰S+g<¸Ïí”^m`‹J¥*ò–ãC!r=ÌÌýòËø»UÙq ù|È–-[ñöîú´ÉÈȈZVÖ”3.‡½£™™ÜNI‘ÁBˆ’À\H0.Jʳ}{š4i—E|‘Îó¬\¹rX[×!++‹ä¤[2ÐB!¹¢,½A‘70…9|ø…mÛ£G¸õ×Myƒ+„O¨œtB!„Ϟ̘ !„0Èýû¤„Bs!„x9”Õ‰.åû¥ÒØN!„æBQfÉ2´B!¹Bˆg¬}¥¬ß/„/)¹ùS!„B Ì…B!„˜ !„B!¹B!„Bs!„B!$0B!„BH`.„B!DY ÌUÊOOO¶nÝRdÚÖ­[ðôôT?·´´xêõÉ_Æ¿QžB!„xñ© ÄàerÆüäÉx¾ùæîÝ»§ñzZZ_}õ5'OÆ«_KNN‘QB!„Ͻ2{)KçÎ] Ý®ñÚÎ;éܹ“Ækùg°ÃÃñ¶¶Âʪ=¥N{ø0“Ñ£GQ·® ÎέˆÕØÏ¢E yýõ×°µmÀ´iSÉÎÎÖYÇ‹/2`Àlm`mmE›6­ רۚ5«qp°§fÍX[[i¤ë*÷Ñ£GÌ™3‡FbcS_ßž\½zµÈ¶Ú¢ôÄÆÆ0cÆLºz{ÓºMºz{3cæ,bOÄJç!„ÂÐÀ\ªÇ?eD¯^½X¿~½Æk[¶l¦gOßbóŽ`åÊo¹~ý'Ndܸqê´¥K—âîîÁ… ùè£éŒÿOZpð*jÖ¬I\\<'NÄaoïÀŠßè¬ãˆ#ðòRrúôüùç9úôéË| ±Mxx8¡¡aܺ•ÄÊ•ß8Bïr—/_F­Zµ8yòwÎ;R©dþüùz÷¡¶þO.''‡ …‹øxÞ|:vêÈÞ½û¸té2{÷î£cG/æÎý˜E‹‘““#õ={F:AÆ@!žOâï2;cÞ Arrr8{ö,7oÞ$99…7Þx£ØrX30?ú+拓ùáÃx´Ë Ìœˆ‹‹§ƒRÉ¡C¸rõ*&¼G»v8»¸à×§êüŽNN„†…¡ôòÂÝÃO>]@zzº^m.8“¼=t;Ý}|hÙªÎ..å¬X±¥R‰G»v,^¼˜ì|ÇnÞ,¶³³3ýúÐz=¾¶6åÕÉÑÉ©ÈYZG''²³³™4y2-[µ*ÔŽ¢Ú¦/mmÈÊzȬY³pmÛß^½8uú´FYÇMWéJ×g<òxwë¦~ƒŸ€£““º~‰‰‰tëÞ½PŸdgg3oþ<:(•tîÒ…Ý»w껂c°nÝzºz{ãÔ²¥Öú!„xNó:uêРAæÍ›‡‰I^}µÎ>=Ø·oYYYìÚµ guÚÀÙ¼y3iiiüý÷ß|öÙg:gçªV­ÊþýÈÌÌ$>>žwÞyÇ ¶é*·ÿþlܸ‘ôôtÒÓÓÙ´i#õêÕS§W¨PððpT*.\`Ê”Éz÷‡x2wîÜÁÂâŸpò/áYð¹¥¥%·oß.v_ÆÆÆ´trâØ±c@îlyÛÇ—EµiÓF=k~ìø1Z¶l‰±±±:ï¡CP(ÔªU €õëBðóóÃÔÔ”J•*0ÔÔ;åMšø666( üüüˆŒ,Ùj=S¦L¡N:@îwäÿÄfÛö0:uꌩ©)•+WÆ»kW¶mÛ¦N7¯\™´´4ŒQvè@XXX±åèÓ¦gA[öíß§§'*TÀK©dÓ¦My Ž›®þÒ•®k<ò³·³#&öññq¸µuãd|îñƒƒƒc¡B!ž£À¼G”/_^ëj,y>ûìs-ZHíÚÖêIÔÁȤI„†n§~ýz-`Ù²fß}w÷ïßÇÞÞŽÆ©‘^œ/¾ø’Å‹Q¿~=Þ}÷ÆkPÛt•û¸yó&M›6¡Y³¦ÄÆÆ²Nž·ÊK­Z50 ?#õîñdªW¯NJÊ?kè7oÞB#=ÿóääd^yå­ûsw÷àÐáÜËY~ýõ(mÚ´ ­«+G£rçC‡Žàîî¡‘ÏÚںоâââY¾|9Ó>šNŸ>} ¥7kÖL£·nýU¢>¨S»v±i ñh×N}yƒ£“7nÜP§Ïž3›ÙsæÐ¯_?¾ùæ÷?èjÓ³ ­ ×®]£bÅŠÅæ-8nºúKWº®ñÈÏÎޞؘu¿2X=có[ Ž…ò\LмßåM-7áZ!„ÿ(_+•ÿKƒjÔ¨Qèºëüéù·lÙ²ØÙ?…BÁªUÁE¿;)WŽ™3g2sæLõÉÿØÝݽÐJ'~~}ŠÜ¶¨×t•[®\9æÎËܹEÌïííMbâÍb÷¯­?Ä“iÕªÄß߀Ï?ÿœ &w‚-ìøì³ÏÔÛþòË/8?¾¾¹8­Û´æ«¯¿"''‡¸øxõ˜;991{Î\ÒÓÓ‰þõ(&¼§yç›= eíÚáâÒš5,ðéѳÐq•G¨´Ü¡õ]½Žû'ŽFEû)[[76nÜÈ­¿þâ»Ußñ -‰–5¤MO"»„7EkkÃ#}ZpÜtõ—®t]ã‘_C[[’SR¸rõ*ØÛÙ¡N:EzFõêÖ-2Ÿ‘‘‘ú±qúEŸm„B<¹eÝÀ˜ûñÇøøø P(°µµeÇŽ…¶KOOç믿*öÍUžŠ 666Lž<™Fabb€™™o¾ù“§L¡n½zT||³iq–.ýŒ߇Q­Zu.\¸Xh›sçÏóÖ›op;%…ÊæUJ½êÖ­Ëí;w¨U³f±Û4nÔˆÆaaaÁÀAƒŠ ÌõiÓ“¸Q`©JC×k++222Ô7?iéÓŸú222¢YÓf¬^L‹æ¹÷+´hÞœUÁÁØq}9@Æ ¹{ïÕ«Uàüù òG@!ž‚rÒB” kܘ–-[2dÈ`ÒÒÒŠÜæÁƒ 25l¨sŸîîürð`¡e7Û´iCTTI477çHd>äÌ™3LŸ1£Ð6K–ü‡¤¤$þNOgó–Í´hÞ¬Ôû§‡?„ÿÀßïXµ*˜Q£G©ÓûôíËž½{ÉÎÉ!11‘òåË—¸M …‚+W®pïÞ=ýf#Ê—'""•JÅ•+W *Qµµ¡ƒRÉ‘ÈH²³³9p BçÚóºúKWº¡ìì[þÍæÍ›7ççŸÆÑÁ¡Èíýýýùþû0222HJJbÉ’%O4B!$0¢T3†5,iÓ¦5kÖ¬æúõë<|øëׯ³fÍj\]ÛPÃÒ’Ñ£ô  òVyÉ»¾}X»v­FúÊ•+±±©Ë‰qüøãO,_¾€êÕ«£T*Y½:XcûÕ«WãííMùòå1b^^JNŸþƒ?ÿ}ùàƒ4¶'44Œ[·’X¹ò[G¨Ó–.]Š»».\䣦3~ü8uZpð*jÖ¬I\\<'NÄaoïÀŠß謷Bˆ—ÓåK :„˜?3999¬[·ŽAƒ0`À@Ö­ !''G½Í¶m[2d+VÄÆÆ†ùó?Q§9’eË–ñða&;Kýÿ·‚Áƒ‡Á°aÃ133ÃÜÜœ1cF“’’¬Q‡  …Ô¯_ooo²²²Ôi;vìÀÛÛzôèÁ¡C‡ó½XC¯^½133£J•*ôíÛ—àà`½ê-„B!^^eòó}ûöR¯^}lmm°µµ¥^½úìÛ·—N:pöìY^yåuž-Z¨7iÒ”W_mÀÆúˆŸ~ZìâÅUæ.e¹ví¿ÿ~’7nœœ¢þ¹~=÷fÐëׯðæ›orçÎu¾?þøCc?ÞÞÞdff°lÙÿxðàJ¥—:mÖ¬Y„‡‡0gggÒÓ3 ª£ éééE¦5hЀäääbóꪷx~äää´pÏ›OÇNÙ»w—.]fïÞ}tìèÅܹ³hñ"K°Ä‹áìÙ3Ò ÒOOåoʤɓˆŒŒdÒäIò·C ÌŸ½µ¼óÎ;˜˜˜j¼njjJ`` !!¹7ŽdݺÒÓÓ¹yó&Ó§Oר¾|ùò 6œÅ‹0Xc¼jÕªì߀ÌÌLâããyçw ª£OöíÛGVV»víÂÅÅY6pà@6oÞLZZÿý7Ÿ}ö½zùªÓuÕ[|„¤¤d¾þßÿtîkÀÀAìÞ½»È´Ý»w3`à '®¯£“S™ëÃüuzÖõÓU~þô!C‡?Qß>­¶–µ1.ØOeÑÖ­[ }:›ššJÿþý©W¯.¶¶ 1b8·nÝzêuY´x1ÇŽàØ±ã,Z¼XþÐ !ù³-صkC‡+2}ذáìØ±ƒœœúöí @‹Íqww£gÏž…ÿ)   ¾‰4Ï_|ÉâÅ‹¨_¿ï¾ûãÆ5¨ž“&M"4t;õë×#(hË–ý³²Ê»ïŽâþýûØÛÛѸq#¢¢"5Òõ©·(ûÎû“ãdzzõ*UªTä6•*Ubõê5DGGsîüy­û;{ö 6l(´Ìçßéé¬YR*3¿?^¦ûôY×Ïò³²¾ÐcQZž´Ÿž¶+W®¼ºÐëË—/£qãÆœ=û'§NÆÕÕ••+ÿï©×gÚÔ©üvü¸úgÚÔ©òÇV ÌŸccc>RìuuUªTáÈ‘HõuÙãǿǟžãÏ?ÏXèÛ3-,,¹|ù µjÕÒxÝÝÝcÇŽsóæ_DFFáç×G#oQß™ÿ5…BÁªUÁܸ‘ÈáÃG°·ÿç:âråÊ1sæLþüóׯß`ӦͅÊ×UoQö­[¿±cÇ¡P(´n§P(=z ֯׹OwöìùIãµû÷ãáî¦L\½Ê„ ïãÑ®Î..øõéCDDLœÈ‘#GÔÛþüóÏŒ—»œgÁÙémÛ¶¢T*é ôbÏžŸ^Œgûö8»¸¨÷W0_Q¯²/m îs{èvºûøÐ²U«"÷³bÅ ”J%íÚ±xñb²‹ùØß»[7’’’HHHÀÑɉS§O˜˜H·îÝ •ŸÍ¼ùóè TÒ¹KO3ò¶strÒȳnÝzºz{ãÔ²¥ÎvÚÖ‚Áî¬Y³pmÛß^½ÔmѧÚŽ¼ºÄÅÅÓA©dÈСzå)®>Åõ“¶q+ªüˆˆœ]\pvv¦_ÿÄæ»YÿI>!ÈÉÉaüøq,Z´¨PÚ¡C‡ð÷÷G¡P P(ðõíÅñ—äÍ”Bs!ž;ÑÑѸ»»ëµ­‡‡¿FGëÜ®S§N|¿c§Æk?üðC¡o½:umÛº²ç§Ÿ8°?]»teþ'Ÿðᇲ|ùr²³³ù;=%ÿý/ïOx¿ÈòbbOÊûÞcöœ¹\¿vƒÝ?ü@ЂL6Í þ(Í}剈ø™åË–q,:ºÐ~¶mÛŠ…Å+„‡‡¾ko5iÂÆ ŠÜ±±1œˆ‹ÃÈȈ¸¸8~‹‰ÁÁ¾ð º›6mÆÊÊš];w¼jëó½±Ê›íΛÕÌsðÐA¾ùæŽ;fp»µµµ ï¾[E«V­ø9"‚Ñ£GóñܹéÚê¡íØÉ³sçNvíÜÉ¢… õÊS\}Šê'}Æ­PùÓ¦´`‘‘‘Ž`…Æ¢$–,ù;vâ­·Þ*”vþü•¹*W®Ì©S§åŸBs!Ê¢;wî`aa¡×¶–––ܾ}[çvumlx”“ÃÅ‹HJJâöT6´ÕØnýºüüü055¥R¥J $55÷†âZ5kÒ¥KÖ­_GHH..­ åÏ3v̘Ç+uäáÇŒõ.fffxzzj|[­>Js_y¦L™B:u ígÛö0:uꌩ©)•+WÆ»kW¶mÛVä~ìí숉=@||nmÝ8䮨ãààX(Ï?î¦w¯^( ¬¬¬ø`âDõ>}:u/Éjh»µµµ }û÷ãééI… ðR*Ù´i“ÞõÐvìä2t …BýIŸ®<ºê“Ÿ>ãV°|óÊ•IKKÃØØe‡„……•ÊëèèhFUdú½{w©X±¢úyùòå õSi:°ŸÎ!ÄË¡¼t†«^½:)))X[[ëÜ699Ycízm:vêÈ÷;vðþ„ üøÓx)•EnOTT$—¯\åÓ§4Òüýý>bW¯^eÛÖ­Å–•øT¨»´§¾u|ÚûÊS§víbÓ.âÑ®æ³b–µ³·gË–-ê~›9s&Ó?ú€˜ßb2dh¡<¨Zµªúù›o¼ñDõ-ͼ׮]Ó Ý—¶c(ò˜Ö–GW} ·‚åÏž3› Þ'$$OOOŸh™Ùû÷ïóᇢ±tm~*•ªÐ’¹OsiÛa#FêÜfxàÛò‡W Ì…EiÕªÄßß_ç¶¿üò έZé˜{u$`ð`ÆGxønþ³¸ðõ¯¡a¡¬]B@À \\ZS£†>=4o"®Zµ*wSSµ–¥m­~mŠº–»¤û*iýT*G£¢¨P¡‚Îý4´µåÿÛ»ó8=çCÿÿïÙ²4b ‚Äžžž†,ÄR‘ÆH,AT4z´ÒÓVµõ¥DÔÒ-uT(QK…"%¨q´h-Aü,­%²D"ûLf»D¦Id™‘D2<ŸG™™ëº¯åsÍ=󺯹îûþpÆŒLž2%•••éÚ¥K I^~ùåTTVfÛöí—{»Æ¾ßÀê„[cÆoeªíhÈ÷β¡¼ªÛ¬j{{Ü–]}{äöÛoÏ￟n¼!óæÏÏÏ8ãSõO~ò“|ÿûÿSÿŠåÙh£SUµ°þÕÁª««²á†®µŸ'“Þžè‡* ÌáÓ:~À€ ½à‚~øá+}hEEE®¾ú·ºÌuÀ+²å–[¦}ûvùíU¿M³²Ò¥Þ­v±+®øuîýó¨l¼ñ&I’7ß|k©é#GŽÌ~=¿žººBþ÷šß土½F÷ýÝßK`]jß¾}f~ôQ¶Üb‹UÎ[TT”]wÙ57Ý4";uJ’tîÔ)7Ž±Ô·—ŠùvÊì9s²ÉÆ'YtÍñúb«¶mSYY¹Ê'/Ϫ¾w>Ím³=9nKê°óÎé°óÎÙl³Írü·¾µZa~×]Ê]wý)§žºôè6m6«"~‡2cÆÌú³÷sæÌM‡_öƒXë\cŸB‡²Ç{äÄOÈüùó—;ϼyórâ‰'dï½÷ÎÎ;íÔàexàA¹ù–›sà.wzëÖ­óÄ“O¥ªª*¯½öZÎ<¸~Úû|‡y$GqdŽì×//Mx±AñµÒG便7n\ …B&OžœK.¹dÿ‡žî **RQQ‘o‘Ó¶Âù»tíœûï »~æ:uÊc=–ÝwÛm¹ó÷ïß?þó¨TVVfúôé¹ì²Ë–šÞ²eËLž<9sæÌùÌ÷½WïÞyâÉ'SSS“G—£Ž>ºÁ·]Ù÷Χ½ÍʶgÙqjìqK’o{lÆ<üpjjk3mÚ´”–®Þù¤%߸nñ¿Å__¬gÏž9rd*++³páÂŒ5*=zìë Ìa}õ?ßû^6ß¼MöÙçkùÃnÊ;3ªªª¼óÎ;ùÃnJ÷îûdó6m2è´ÓµÜz÷NiIIXA˜Ÿwîy¹nøðôèÑ#ƒ‡ ɉ' ¬Ÿv饗æÔSNIIIIJKJòƒü WüúŠÕÚÏůì±ç^{凧ŸÞ ËwÖ¶dÞüyéÛ·oöïÕ+㟟a [áü]»ì–êêêtîÜ9IÒ¹K— …tíºü0?ôCýØa9î›ß̰ÔôæøãÏÁ}ú|æû~ÊÉ'g̘‡²oùݵ×dذa ¾íʾw>ímV¶=ËŽSc[’ <8ÇÏ×¾öµúWhYlm½¡Ò 'œ±cÇf§vL‡;ç‘GÉ©§~g­Û÷¦½›W_y¹þß{ÓÞõƒ¾`ŠŽ¹äáBÿòŽé´á¢ëQ›·hÑ >:ö‘œtò©) F‘5nÒÛ³Ýö;4‰k/ŸáùÜ}÷¨Œÿ\fΜ™M7Ý4»í¶{Ž:ª_ºvéâ`Â:´¾ÿ®***ÊÛýU«P(ä½iïfÖ¬YÙl³6é¶ç^™7onfΘ‘íwØ1…BÁõèð9³°²2I2aÎÆ9îeטÃêêÚ¥kºvéj XëVv†ø9o€Óäe˶[¥¸¤8]wï–… +3s†7 ƒ/aÐDˆïÏ¿âââlµÕ6©®®Î‡Ó?0 Ì€u¥®®.¼ÿž€/âƒsCëž3æ°=:öƒs¾Ö×W3YüŠ,kj>@˜ÀzËËúÂÖ±ý{õöÚß@“áÉŸ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæÐ„”¾HvïÖm¥ÓŸ{öÙ5ºžÅË{î¹çò»k‡çºá×®p@˜kÙ©ßùÎZ{shr–Œá±~dìØ\sÍ5™:ujÚ·oŸA§ Êþû—7zže׳ì:—]ÿâÏò“Ÿä†nH]]]¾sêwrì±ß¨¿ýëo¼‘K.¹8/¿üjJJŠÓ©Ó®2xH¶Þzkš8טÃþþ÷¿ç¬³ÎÊÛo¿šššLœ81gþ¿3ó÷¿ÿ½Qó¬Ž_ýêW™9sffÍš•KqiÆŒS?íœs~–^x1ÕÕU©¬¬ÌÓO?“ŸsŽÂ>_~Ã) éwä‘ylܸqÄá) ¹þúß7jž%-yFþ¹gŸ]å%,ýŽ<2ÿßÿåˆ#O’Ü|óÍõÓ¦L™š$¹ý·Õ/kÄ7:p ÌáóåÕW_I’üð‡?LëÖ­súOO’¼òñ×:Ïê8餓ҪU«ü×”$yãÍ7ë§xàI’ã¿50'œxb®½öÚÌ™3Ç€ÏטÃŠŠŠ–ú|ÆŒŸøzCæY•K?z.þ÷ãçÁ眓­·Þ:Ï<ýt&O™’á×]—gž}.×_7ÜÁ€&ÎsXÂ|ùËI’ßüæÊ,¨¨Èˆ›nJ’tìØ±Qó¬È¬Y³2wîÜ•Î3bĈTTTäæ›oI’|ùãõ%IYYY¾s꩹þúëóûß/ºt楗&8pð9àŒ9,aàÀyþ…rϨ{rϨ{=z-.Î)'ŸÒ¨y–µÅ[äƒò_Rø IDAT>H¯Þ½Ó³gÏ\~Ùe+œ÷È>ðïõ}k`ýÇ'œpB^~eéKfvÙ¥£MTEEE’õ„á€ëÙ³g.¾è¢tØy甕•eÇw̯~õ«ì±G·Fͳ¬Ÿüø'Ùd“MRVÖ,óçÏ_é6 |N6Ùd“l²É&2xÈR/Ãx饗¦{÷îiÑ¢Eš5k–½öÜ3Ã.æÀ@ò &¤já¢ËX‹Ž¹äáBÿòŽé´á¬$Ió-´ GÇ>’“N>5…BÁ¨²ÆMz{b¶Û~‡Lz{âfŸ½(|±,¬¬LEee^¯j›‘ã^vÆÖ™%Nr sX–½”Å“?a=áøbiÙ²e:uîœ×«]JîŒ9¬+.e€ukÙKY„9¬‹/eiÖÜ¥,°nã|‰—*æ°æ ÌaÂæ°)5Ðx»wëÖèÛ<÷ì³X!gÌáSúðà þ÷EñϾÖ$—½.·kmï×ú:nŸ·ïOaŸ»wëö‰{í½wÆ÷‰ùÖÔúÖ†¿}Ò—-{míÃg½]k{¿Ö§qû¬¾×ÕX,¹¼õiœ›âÏÃÏË÷4–KY`-ùå/™}öÙ'Ý»woÐüË^ê2nܸ 2$–òòòåγ¾©®®úÌ–½.ÇbÉu¯î>¯Í1[߯íóüý¹ªû3ÆÂsX ®ºêʼþúëùÊWþãS/£¼¼<–³Î>»þkKží7n\öÚ{ïìµ×^9î›òü Ï/5ß=£F¥÷äë={æç]œŠŠŠå®gò”)9ýô¥ç~ûe¯½÷Î1ßøFÆ—7ß|+ýû÷ÿÄü .Ì!‡’9sæ,õõÅÛ¶øŒ’ÔÕÕå7¿¹2åûïŸ}ºwÏwOûn¦M›V›UM_Ù²—=;¹²ý]ÙX-éÐÃËôéÓ“$'NÌîݺååW^I’L›6-‡õíû‰íYv»’äÖ[oË!‡šn{ì±Ü¿|¬l¿rûáǧwïÞé¹ß~ùå/™šÚÚ/Ùq»ë®?¥wïÞéÕû€ŒóPFÜ4"åûï¿Zëmè8®î¾îÞ­[î¾çîô=üðì±çžët¬W´¾†nçšÛݯ{ŸX¼ý/¾8!½z÷Ήßþvƒ¶¹ºº*çž{nºï»oúuTý66ô¸Îž=;÷é“ ,u»ùƱÇÖÏ¿²åÔÔÔdØ…ÃÒ«wïܧO|ðA¿œæðEsà ¿Ï¤I“3|øðl¶Y›ÕZVyyyjjj–;í¬³ÏÎ%_œ'Ÿ|2'ŸüßzþÐ¥¦yGFÜxcúË_²Ù¦›ä7W^¹üåœuvöÝ·{Æ<ôP;6‡ô9$þü¢ì´ÓŽÙp£óÔSO-5ÿƒþ%{ì¹g6ÜpÃåžåzîÙgë?¾í¶ÛÒ¦M›<øÀytìØtïÞ=¿½úêúÛ¬júÊ–½¬•íïªÆj±.]ºäùçÇ'I^xñÅåÅ_\´îñã³[×® Ú®Çÿúx®½öÚ<ûÌ3¹äâ‹—zpµº·¿ë®?e³Í6Íý÷ߟûGÎW;vÌíüc£–¿¤ñÏ¿{î¹'?:ý‡9ïü¡ygê»yðVk½ÇÕÝ×qãË﮹&Ï<ýô:ëUYÙv®±]Ñýº±÷‰Åî»ï¾Œ¾ï¾üâÒK´Í7ÜpcöÜsÏ<6n\ ” †mÔþn´ÑFéÞ}ŸÜu÷]K}ýî»îNyù~)-)YårF޼#mÛn•Ñ÷Ý—7Þ˜Ûn»Í/(„9|ÞÝyçyçwEÎøñ1bD.ºè¢µ¾ÞÖlùó秤¤$½{õʨQ£–šþ“Ÿ‘víÚ¥eË–9æ˜còä“O-w9·ÝzKŽ9æ˜4oÞ<­ZµÊÀÇgÖ¬’$ÇûÜrË-Kðw䘣nÐ6Þ{ß½9ì°CÓ¢E‹´hÑ"‡Ö7ãÇoðôÆXÙþ®j¬ëÚ¥KÆ?ÿB’d„Ócßyi„$ÉóÏÏn»íÞ m9çœsÒ¾]»U>¸ú4·¿ëîQ9è ƒÓ¼yól°Á9ôCr×]w}êï£ÿùÞ÷ÒºuëtЩªªÊi§}7-Z´X­õ6fWw_Ï<óÌl³Í6ëýX¯l;×ÆØ®ì~ݘûÄb'~ûÄ´lÙ2[n¹eƒ¶ù‘±cS^^ž²²²лwFŽÙèý=®ÿÜzëmõ— ÕÔÔäö‘·ç¨~G5h9ù˃9ú¨£Ò²eË´mÛ6güøÇ~a±Þs9¬¦[o½5gžyf¾õ­oeÒ¤IùÁ~fÍš­õõžwþy9ýôå–[nIyyyN>ùä”””ÔOßu×]ë?Þd“MòÁï¯pY/¾8!O=õd&Mž’W_y¹þëååå¹ì²Ëòúo¤ÃÎ;çù^H¡P·Ô²Wfòä©iݺuýç¶n™3f4xzc¬lW5Võg#»vÍwÞY?&C† É9?ûÙ¢]Ïω'~»AÛ²ÍÖ[¯Ö±]Ùí'N|+=÷ÛoéäËÙ—†ZZee‹¾g7ÝtÓÕ^ocÆqu÷µ©ŒõšZOcÆvE÷ëÆÜ'Ûj«­µÍS§NÍ—¾ô¥ÕÚß¾œvÛ´Ë}£Gç¨~Gå/ùKvÚi§´mÛ¶AËykâÄl´ÑFõŸÿçW¾âÂ>ïFús¦L™’3ÎøQž}öÙ\ýõŸÉz{ìÛ#·ß~{>xÿýÜpã ™7~~|ÆõÓ‹‹ÿý±B’B]Ýr—sϨ{róÍ·dàÀoeソ–Í7ß,‡qdý/¹~ýúåÖ[oÍùç—;ÁgËW¤vÛÑÐé+²²ý]ÕX-¶ÓŽ;æÃ32yÊ”TVV¦k—.)$yùå—SQY™mÛ·o攬F(¯êö…B!ê©”••­‘ï£%Çme³ÞÆŒãêîkC·]õʶsmŒíÊî×¹O¬(œWµÍu+¹7fû×?¿ýíosÄáGä7ÿ!ßÿþ÷µœ¢¢¢5v¿„Ï‚KY` hß¾}n¿}dÎ8ãŒ4kÖ|-wܸq)-]ñãç;ïœîÝ»ç§?ùé'®Ÿ|ý7ê?ž9cF6h½ár—qſΠ¿¿>ýŽì—.]:§²réW®8ú¨£2vìØ¼óÎÔüãOŸ>}¼ýÛmÛ>sçέÿ|ÎܹKíϪ¦7ƪöwecµä/ñ]wÙ57Ý4";uJ’tîÔ)7Ž‘®Ë\_¾.¿×f~ôÑz½Þ55Žëj_?ëõ¯±]Õýº¡÷‰O»Í[µm›ÊÊÊÕÞßòòòTUUåÖÛnÍüù Ò}Ÿî ^ÎN;í”ÙK•ªªª¼öÚk9gð०·iÓ&ûvÿü¢ì_¾ZµjµÂmnÙ²e&Ož\ÿŠ-}ûöÍèÑ÷§²²2•••¹ôèl½ÄŸôW5}eË^ÖÊöwUcµ¤.];çþûÈ®GO§NòØce÷ÝvûTÛµ*½ý‡žî **RQQ‘o‘Ó¶Æ–¿¦ÖÛØq\ë\×c½>íªî×¹O|šmîÕ»wžxòÉÔÔÔäÑGÇå¨%þÒÖ˜ý--)É1G“ë†_—~ýú-õ—‡U-§ÿþùóŸG¥²²2Ó§OÏe—]æÂh˜eß`謳Ï^ê5Ì—5dðà ><_ûÚ×ê_aaIÇ}LŽÿÖ·Ò·ïá™?~Î?ÿüå.ç¼sÏËuǧG«>`À€LŸ>=÷é“>‡’—_y%W\~yýü«š¾²e/keû»ª±ZR×.»¥ºº:;wN’tîÒ%…B!]»îö©¶kU{ûdÞüyéÛ·oöïÕ+㟟a [cË_Sëmì8®‰u®ë±^ŸÆvU÷ëÆÜ'>Í6ŸròÉ3æ¡ìÛ£G~wí56lاÞߣî—$9òˆ#µ ‡rÈ¢ÿ;,Ç}ó›9àÀü¢a½WtÌ%ú—wL§ g%Iš·hÑ >:ö‘œtò©) F‘5nÒÛ³Ýö;dÒÛ×Ûˆn¬ÏòM3vïÖm®ïÝwßÍ)§žšûG^o‡7% ©Yøñ%_ælœ‘ã^öäOø4¾HXUU•;ïüS=ôF=XÊÐ8ÂX©òý÷OÇŽsÕ Þ Hˆ€0>ƒH~âoûBí/¬+žü Âæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ Ìasæ€0asæ€0asæ€0asæ€0asæ€0asæ€0asæ€0asæ€0asæ€0asæ€0asæ€0asæ€0asæ€0asæ€0asæ€0asæ€0as@˜€0„9s@˜€0„9s@˜€0„9s@˜€0„9s@˜€0„9s@˜€0„9s@˜€0„9s@˜€0„9s@˜€0„9s@˜€0„9s@˜€0„9s@˜€0„9s@˜€0„9s@˜€0„9s@˜€0„9s@˜€0„9sCÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ ÌaÂæ Ìasæ€0asæ€0asæ€0asæ€0asæ€0€&¢tu0éí‰FÖe˜ #ë2Ì÷ïÕÛÙrXC\cÂæ Ì€ÅJ °.l·ýa +**ÊÛßZî´íwØÑ­+oa4)^ámÍytì#«œÇK]¯ÙAkš0ð`ˆ5ü èÓp9¬„9s q9ÐD-|÷ݼ}þÐÌ~ê©´ûÁ÷³õ)§|bžºÊÊ••¥¨¤Ä€­'Fÿcbþ0æµÔ I¡B!)dÑ“R{ìÚ.gÝE˜4ïÝrk¦\~yv9øà´ýñ3öÊ+³É¤åöÛ×Ïóáý÷çõ‘–íÛç?o½%ÍÛ¶5pëXm]!7>ôj†Ú+­Z4Om¡(5uI]!™³ &ßðà:Ì]Ê4)…šš¼5thøéO³]çÎiѪU:x`&]0¬~žo¼‘Içž—ƒÎ:+»wÏKG™ŠI“ Þ:ðösSW·èŒøâ—kܨU‹<ñÒ”<>aJƽ0%cÆOM«eù¢¿š£0š”¢ÒÒ´Øj«T~ôQ2wn sæ¤]÷îYøÏfîóϧvÁ‚¼vÒgÏÒ¢U«´Ûm·ìvàù×w¾kð>cO½ò^κîo).^ôšßEEEI¡ºBR]—TÕR][HuM!•UÕ)^ ¯ .Ì֢ퟓGN¶Ü2…ªªÍž.}ûæíó‡æÍžž»vM›wLaîÜ.Lš7Oq³fî3R($·ŽýgnûÏTVÕþûAU5¯+$5uIm]RSW”ÚºdÖì¹_øqæ@“³ÙfaQQ>|õÕµl™º9s²Å®»¦¬¦&¥3gæË½z¥î½÷’B! æÍËs÷Ü“W]µÜe}4kV.¹ôÒxÐAÙkï½slÿcóàƒ®7ûº{·nMêØTTÕæÂ[ŸÉ¿¦-È{/=±()$©+,ŠñªÚdîüʪæ¦ãöm–»¼ùÍo®Ìa}ûf¯½÷Î!‡š+~}EæÌ™Ó qºóÎ;síðáMbì<ùh’¶:4/œ~zzÿ¿ÿ—Ì›º©SÓ㤓’ÒÒÞ|3…9sR×±cþzÙeéðë+Òb»m?±Œ¹sçæ;ß95Çw\NûîwÓªU«L˜ðbÎ=ïüÔÔÔ¤oß¾ºÞ›¹ Coy:_í°mØë+i^¶èÕpŽ_ûZ®><›o±EªªªòÏ×^ÍOÏ<3¿üÅ/²á†®p{îuO>š5+ß9õTa°¶lØm÷4Ûq‡L{öÙ´ÝvÛdÖ¬¤ºzQO›–ÒÞ½óÔu×eó³qË]ƈ›nÊAœ£úUÿµÝvÛ=Ã.šË.¿¼>Ì'O™’Ë/»<Ï¿ð|*++Ó¾}û|oР”——'Yt¶öœs~–o‘÷Þ{/ÅÅŹäâ‹ë§WWWeذ 3öÑG³Å[ä /Lǯ~µ~ÇÏwܑꚚvè¡ùÑg¤´‰½Äã‹o}˜_Ýù|ú|}·üçŽmóú´yé¼ýF¹ú¬cSZœ”–¥YIÒ¼¬$ÍK‹Ó²yY6øRó%3f/Hmm]ýµè‹ÝvÛmùz¯ç¤“þëßñÚ²eºvÝ-}î“[n½%ƒN´Üí¹÷Þû2}ú‡9u9/£¹¾r) Ð$Õ.XŠ)SSºÁ‹^»ª*uÓ¦¥öµ×RV^žÿïÞ{SØf›´tÚ —1nܸôîÝë_ïÚu·Üü‡›ë??묳³ï¾Ý3桇òèØ±9¤Ï!¹ðç-³¬Çò»k®É3O?K.¾8g}vý´n¸1{î¹g7.ƒ ÊC‡ÖO»ë®?e³Í6Íý÷ߟûGÎW;vÌíüc“:£ž|+¿¹ç¥ô?´G¶Þ²MÞxw^êê yeòìüsêìükêì¼þά¼ñîìükêGù×”yåí÷òÞŒ¹™þѼüsÒû)]ƒ¾¤‡Æ<œÃ;t¹ëÜsÏ=òøÿ=¾Üi<ø@Þÿàý&åÂhš …¼~Ú l·Ë.Ù|ûíS7uj ³f¥nÒ¤·i“Ù3gfÊk¯e§__±ÒżóÎ;Ùzë­—;­h‰W¹íÖ[rÌ1ǤyóæiÕªU<>³f}´Ôügžyf¶Ùf›$Iyyyjjjê§=2vlÊËËSVV–z÷ÎÈ‘#ÿæwÊAœæÍ›gƒ 6È¡‡’»îº«ÉŠ_Ýù|}éÃ|óðýR²¼=½"…$EÅÅ)*.NR”BŠRWXôdÏÚºBjê ©­-¤Eo0TZRœ…Õ5iÙlé¿Lž<)[l±År×»ùæm2õw>ñõ1cÊ5×ü.Ývß­É}[»”hr&ýâ—i±`A¾Ò¯_êž{.©ªJÊÊ’ââjjò¥6JÝüù©5+%-[®p9ÍÊʼÎ_œ§žz2“&OÉ«¯¼ü‰éÛ¬ ð“dêÔ©ùÒ—¾´Üi'¾•žûí·t 5¡ËXªkë’BR—¤º¶ªÚº”Ö§PU›ÙókR”BJ‹ iYV”eEiQV\ÿq¡®'-š—å½sÓn‹¥¯¯­­]áz‹ŠK–zð³øД)ïäúë®Ëé?:#¿ÿýõùÒJŽÿúÆs Iùð¾û2÷ÁÓmÀ€Ô=÷\ µµ)Ù{ïTÿǤ젃R˜93%}”ÿ<à€¼ýóŸ¯tYíÚo›éÓ§âë .̘1Õ~Ϩ{2ô‚¡Ù²í–éì±¹úêß~2ªŠWœUuuu+œV(ò÷§žÊsÏ>[ÿïÿøG“9g·{öýꦹýÞÇR–šl»Ù—2¯¢6SgTföüšTVÕ¥¦6Kü+¤¦vÑóÚºº”•g£V-sÛ˜Ó}—­–ZövÛnû‰¿L,6sÆŒ´k×n©¯Mž49ÿýß'eË-·Ìñ¾™Ë/»¼I}o s É˜ÿê«™tÁ°t?ùä䥗R;mZJ»vÍ¿~8œ{næÎ›’wNísÏe‡}÷ͼgžÍÜ—^Záòzôèž<ýÉ~ø‘Grû—›\qůsÃï¯O¿#û¥K—Ω¬¬jÔvoÕ¶m*++—;­}ûö™ùÑGMú¸ûõó½¾s÷ƒç½é3ò•v­SR\”^Û¦ç®[¦ûW·Ì^_Ù"»wØ"wÚ"_Ý~óìܾMTÖd›ïå’[OóÒ¢²ÇöK-·OŸ>=úå®óÅ Ò³gÏ¥¾¶ä“D;ì°Ìühfžxâ‰&3Ž.ešŒ©—]ž.}ú¤ùÂ…©~ýõ”õê•i/¿œ·_{-;_|Q^¼ù–ô8å”ÔNœ˜¼õVºvX^2$»ŽµÜå}ó›rÒI'eáªxÀiÕªUÿë_sÅWäÒK.©Ÿ¯uëÖyâɧr@ïÞyë­·rþÐ µÝ½z÷ÎO>™ýzöÌãÿ5¿½ú·¹ûãëÈ8üðåä“sîyçfðàÁÙvÛö¶DP0 Wÿïÿ¦oß¾Y°`Aºuë–a k’Çg›6ä×ßûz.þãs¹ïÑÙé×k÷$ɨ¡‡}ªå5kÖ,W]uU®¿þ÷ùöýW>üðôiÓ&½{÷ʅÆ­2¶7ÝtÓœrò)¹äÒ_äâ‹~¾Þ_Ñ1—<\è_Þ16œ•$iÞ¢…{=°Öm·ý™ôöÄFßnêÕWgÎ=£Ò©G<=zt¶»êÊ´êÒ%…B!óÆÏ´³ÎNïŸþ4µÏ<“Ò®]óÚÃgN‡³Ýg|®Çóѱ䤓OÍÛßZîôíwØ1…BáSycÕ ¹iÌ«yúõ™™6}Vþ4äà …E¯tST”¢,º&ÉW¾iŠcd…ãÝ ?¾¼iœ3rÜËΘMCMmmjª«³É·¿ª’’<}ûÈl|úS³ÃùhÖ¢ŒÙi§ÚµËä¿ý-[îºkž¿óÎLŸ6-Î:+5µµK½ÚICßêþ¹gŸ5ø ‰ñººÔÔÔ¤¦¦&µµµé·×Öi»aInxxNfΜY?_qqqý¿’’’”””¤´´4¥¥¥K=¶¡ÇçótŒ„9°þGyMMª««ý_S“ Ž:*ÍûöMuMMæÎ›šÚÚêêRT\œƒNË„‘º¿ü%›žzJv8î¸5ožêªª¤Y³ú8ÜköASuUUýñ©ùøX}uë–ùAŸí3kÖìÔêR\TœÒÒ’”””¦¬lQŒ—–•¥¬¶6µµµiÖ¬YJ¾ÀÇG˜ë½%ϲ¥¤¤¤þ%‹‹ŠRRW—EoY”’í¶Ë£îIIiiÊÊÊR\R’â’’”••5¹·¹o2ǧ¨h©ãSüñ› •”gÛ-6H]]mý¥,ÅÅ%))Y4}ÉùKKKë£ü‹J˜M"Ì›7ožfÍš¥P(¤®®.µŸe]üq¡PHÉÇ^òñeEK„ŸÍñ©««K¡PHmmmjjkS÷ñqZ||JJJê/c).)q|„9Ð}|ÖuÑVÖ¿ã³ø¬wiiiš’Æ=À1 Ì€¸”à åѱa_U´q]IDAT ×¥¦ú†>Â@$‚0>ßVç­Ì1ÞŸGžü Âæ ÌaÂæ ÌaÂæ ÌaÂXVEEEýÇ¥ËN\XYi„à3ˆò &¤dÇM’||Ƽ®ÎÀÀg©eË–éÔ¹sJËš/ óÍ6(MIÕl#Ÿ¡ŠŠŠ´lÑ"Å g§Í¥)Þpëâ¢gߘž‚±€µã‹ÿŸ0aB***òMÏð÷f'IYiQÆýsŽ8€µå&LHeeå¢ËX:uÊã«ÓºeIŠŠŠRôÓ»ÿ/…B!­æ•*jê²ÏŽ­ÒnãfiÝ¢ÄèÀšŒóÊÊÔ¤,S?ªÎ_ßœ› [”äü×?(J’ÒBaÑyòy­ª‹’¢<üÊÜÂûs«¬%m6(ÍuïTTWôï¯ýÿ„B fg‚ŠIEND®B`‚kildclient-2.11.1/doc/C/images/we_timers.png0000644000175000017500000007330011405233117015537 00000000000000‰PNG  IHDR‘÷]§| pHYsÚk¥óÎtIMEÕ '6}›½ IDATxÚìÝ{\åþðïì•ûeQTº¨yA /˜ˆ—´TP×BTÌøq„¬N§£‚™é!Ï1E©·»¿UÙÊ™9~öζÌ÷— ÏëÛ·Åцq²as“yw’;ÛÞüÀ’ã©êç4†åˆãŽ‘1 CÄðïBD%&ó^vµõ1ÛÉWä.U°$îÒßJ $ÁÇãÐ&ÜÐÖJ†‘0¶J¹“T"á8Ž'b9ÞIJËñ&Ž'žç˵uzL¦°i Í«d¼jÔMØ×fÅ’ “ì¦>ÁVI«2{‰DBij,'“H”rÇñz£‰ãx™L*•šÜ¤•WX5øÓìdÃQy-Çò­ùý.™â‘À…¿¤-’ñz Ã]9žâÞ±SWî:üe™s3Wm^mò›ÇÝd –¬èõ˜' а˜‘ ÿÄrè•åDt¡ÔHd;räÈUÿã ¹D´cÇŽéÓ§?óÌ3{ßßýx‡@!³,ûïØ'”+Ö§^+8ùŸ¿w>ïàO²aB·K^q¡ØP|ýjâóßYCënÆ–#\»àf'ùÅ`”(xF‚Ì€û¯´¢ÚÕÉNÂ1:2*å2¥\Æ2Äó$ax†ˆ•r&=Çñ<•VT×T1ªNm¤¹pΑˆþö¬ÇÍùñO¿™^wæ*­v–Öˤ,Ëñ…=}Å8ª‡òù矟ðD#×<×x;ãäädÞäÜu# ·Ù¿'߈S—Ó’L&»™Ù=G)ÒO}Ò644Ôǃ%¢?üÐNÕåßðºÕÚË<»ÖÀ Y’±ÄãîòÐTT×q<Ïr¼„ãXŽe9 Ë0’ߟ·Ár,Ëq,Çs<_Q]g²±ŒEóæBâZx²g—oÏþÚœæ,ÇÞ¨¬íàl/¾z¥D[RQmeíD¤3É ,‘©±/DU× FV&“²÷óղǻü)ÿ®”h+kê¢òʺ•µ{ìÏÔy[9#“2õÆÖ Ψ7œ\O ãú¤}ɱšž=Çš¿=E¿ÐÒó[†?êÀ²¬sUÉñ˧džƒšêdâúR‹#K{÷a±Â]FD…BM#KƒŸ›0ø¹ÿБOX{IìA0våa%bY"’?1%î‰)q7“žûcbñÇFÇÐö)dŒw'9ýVøƒk'–cx<É Ú€ªšzâI©qïõûüÓ¹Ÿ¯OU5õ2Ö2[£ùµòj Ãx¸:‘Ï]¬4§ß¿„uóºñF?w•¹>ròÇóY'ÏOxª7ÃÉÄŒ¦ëeUD$a‰„‘H$•Õu_,pêø('µ±è$ï²1¤¿íðÇŸ~W×â·¹ÊKƒ˜Óù×yåÀ™,1ú°‚‘Ýðz¾Ê”ÝïñNÕÕÕì/§WyÊ;὆=ªPÈ(ë¼Îd2²$5‘„ÁÓY -dv­ž'RÈ¥lÓ¤TÈxž¯ªÕ;ñ–±Øâͯ•U1<ñâ¹m+͉H8‘-Ó7=Ï&"»N}>LÿÒh2 ÷–H%Á8d[›TB3ÛÑîu$³å¹‰%†Ç<î¿ê:Or™ô—keR‰T"a2©D!“Öé zƒ‘çùê:Ëò‰ÖâÍ9Žgbˆ‘ðTY£³ÞœˆôFóóÙML†.žvŽX³ëø×§‹ü<îóD×G;»ýz½âìÏ×¾ú® çÛ|[¥S§îR§N¬TÉ5èäP¾¿§ü%û¼K†ÒêpõÒI¬|bìÒógºùtNiû¹!I»öâSv]\¤YÝwG³ì<º³9Ï3˜g@[P«3w‹àxŽá$ qÂM$†xžaÈF)—Jž§ZÁÈYÆâýmNDÂû÷ëÆ›œìKìÜ練ûñ·GN¬7è8–$^!alr'ç¶nÝì:öÚu°ø¶’à‹sº]åO÷T® qþ{š¶Z‡¿ß¬€¾6áCìˆhå—e;ÉìY’óY»Èà^qéÚ¯ÿÌÍ©éè`Ïr–3ÝûÛœ,®g­„)#—9vòè3Ê¥óo†êRS}gÒKdJ™­“ÂÑ]éâ)³så%ò¦zx?»Fe/à)O|Þ%.£ê×::F"{ÉßaÆ[" ÿ¸¼òy¶*/’Ûq$åñ4hÐéqŸêK§ •×­×T8wâ¥6¡v›‘pñ³ÿ§:"ZuðOwæ9–3é9C=gÒóËH¤™R¢°•Ȕ޲Ԝ«dÉÇÁ^ "Úÿ“îÓïê®–ÕâzHvþÉ_ò·ïæ*%¢™—Ÿ=ñ•RÕUáØQª´¿åp/q&½©¶‚3Þbê(‘ÛÈì]%2e›j¾x‚1ŸÿXGDïjÝg3ó÷Ú—þv6r†ˆ~«äNü¢g9ºXjÂaÔî¨ì%îGéàn áÖ{_žÓ-ß{¥úòi…S'¹ƒJªt`$2<… ¥Ä<ëJâgã<×êÙ™øUiêwаÁNOvU>á!Ÿú¤-öÁ ãlݾüº£_}!³wUºxÊl%r""žÅã-ÅÀšÝS…ZÿÄ#Ã0ÅZýÚƒ¿qF½J¥êï©$†zy(9žç…;·A;QZÃ^Ñš®U²—.üÈê¤ [ÛJ•ö…D¦ FÂOHl€–ó§{ªèµ×îÍZyž'ž+¾\qý#Ïš¾äŒÄ±<Ç®VjGᶸŒpY1RŽcÉPÇõø< UæÙ&w"’‰?ïˆpÆFhk¦T),H°-Úd62ÙÈl@f2™ ÈlhY3ëÉ9„õÀõô³ØlfQdôëØ^žç‹ Ïa;<È™-ü¹Ç&k×ÖíÎg ³™ €Ìd6QzzºB¡`ÆÆÆ&++ëž­—aìl@fßF`Ïš5+55•çù?þøùçŸÏÍÍÅ>hs™¶mÛ6µZ-,'%%}ûí·ÂK666&LÐjµâäxõêÕ^^^ …"==ÝzÍåË—÷ë׈òòò|}}•J¥§§ç–-[°™}ÛŒF£Ø‚iÓ¦-\¸PX^´hQBBBuuuttô’%KÄ:W¯^Õh4©©©aaaÖkvîÜùĉDUƒ} &éX mØfG„³•zGrEF¿~—÷TaFìA<Á,”tîÜùòåË2™Œã8//¯+W®uÊÊÊT*•yÛ¦j–——»ººš¯ŽeY™L&´2_õì¨ð\÷ž}qg€vdúG•sƒÐíÞ­‰Q*üXZZ*—Ë…e©T*VÛ\S5ÅÀ.))Y¿~ýéÓ§óóó±§àqO?—Ëåâii"JOOÓW¥R žçyž7™LV:¹eÍÀÀ@žç£¢¢öíÛ‡ Èì;‘šš:kÖ,!¶ÅkÈ…—‚ƒƒ5ÉdÚ¼yóðáítrËš!!!þþþë֭ÀÆ=ýl\­VoÛ¶-,,Ìh4ÊåòÔÔTñ’´„„„™3g>|¸wïÞ)))V:¹eÍäääðð𲲲ŋc2ûÎcÛ`04,wssËÌÌ´(4¿jL\¾eÍÐÐÐÐÐPayÞ¼y +´G¸w)2ÙÈl@fÀ’aÀméñ„·EÉÅ g…‹Îbû ³¡­‚Ù"¤‘Ö÷>‡–™| ).,ìÞ½wêsaC|‡¯ß°ñÓOS†9z̸Ü#_‘Édúç¿V Øúɧo.ŠYºäÍO?MIüÏb«Ó§%mü€ˆþö÷gòÊübß–¤?ñ÷y±Ø¤Èlhýë˽z=!,ÿíµWú÷ó&¢k×®Qúî=D4~ܳÆ#¢}û3ÄVÇû g«©©!¢W_ûûÿ~ùåÌé¼];·c“ÜëÌfÌ( óg|‰å¼­Þ°ÿÚ&gg‰äæ¡åêê*, ·-))%¢!Cýøøѵk×ÄVöövÂÂ?–,vppÐhÎ/~+nÔègd|M pW™}g‘ÉÿÎü_„û?4ÜÜ܈èÔw'.^8{ñÂÙÍñ%ñiè“'‡œ8–»þƒÄ)S&i++—,]†íp·óì»™éŠÏø²è*==]¡PÈårŸÜÜ\ñÕÔÔT—#F[t•——çëë«T*===·lÙBD½{÷.,,$¢Âž={b7·“'Ñž½û¾?õC'¼gΊhXgêsaý vrtzååh"rsSa»Ümfó<—±-\6l.,,,11Q§ÓÅÅÅEFFŠå¼víÚ /¼ðæ›oZ4‰ˆˆˆ­ªªŠ‰‰!¢É“'ïß¿Ÿˆ¾øâ‹‰'b7·óçýmVøŒµk×½0;rĈáÿ^“аÎ×<=zÔœè¹Á!S òùÏÚ÷±ÝˆˆI:VCDöŸÙál¥Þ‘œC‘ѯ›‚Í0Œð£¸Ðœy¹E͆<ûì³NNN¯¾úêðáÃmmmÅj¿üòË#vìØO>ùÄ¢IrrrxxxYYÙâŋő#GšL&d6 ³‰nÿKÕVê‹/ùùùi4š†æÏŸ?þüF›„††††† ËóæÍN:5`À€îÝ»cÀÞÙmü.(S¦L¾« €yö½sÿ>¨ªªÂÞ€ ž€Ìd62Ù€Ì@f2ûŽ ì9@f·¢–zd§ö ³ÛFoH€Ìn• ÷êÕ«½¼¼ EzzºX˜ššêââ2bĈâââ†SsaÙüÿûv¿ñ«W¯j4𬬬°°0ñüôÁƒ¯]»¶uëÖ7ß|³©'|ð<Çí†{ãHÎ!lxØŒzúÙ6³ãââìííÕjµÑh —.]jkk;cÆŒ·ß~»¿]‹Œ~<Ïž{`3[¥R5,ìÖ­988”••5Ü8&ÚÝÜöù|fÓßæ}Òðëïã{|¨> eæâ…³÷f]mëYœ¥¥¥•••:u²x©aŠCÛwþÕy7ÄÏðÛø8¼·y߇ô0ìúûø’ß,‹7{o´­ëÆW­Z¥×ë·oß®V«…¹\žžž^WW·bÅ ±šT*½qã*m+³»víêîî~ðàÁåË— %©©©aaaݺuëÓ§X-((¨k×®ØyðP¹§Ÿ‹§7ÌÏs˜/ÏŸ?þüùæMÔjµxUyTT”°°gÏì9À<ÙÍ›…À}dþõK¼{ã2 =žð¶øïzhfaó›7ZmGêgw¶Šöµ;¬¼ƒžÚùÙ®æé…1ËþùNÃòFGÕã ïí)©C‡ô}jDfÖ¡£ß>bŒù{it`myû “áÿ¾ÇÞÿý`C`ÐägÆ^ºt™ˆ.]º<~B°•×6&ýýõׯÛÚÚ>úè#+ÞY–ÿûTìÆ²Y³ÿ¯·OÄÿEiµÚ†“-qÙúÛ±®¾¾þÛ“'ߎ{ëø‰oëëuBá/¿ü:1xÊ`_¿ƒ‡¾²èM쳩á5<°Û ¦v±õ£ºÇÞ2¾8xXØôY7nÜÞ3¤RéTõ”‹ þ!Õè-//Ÿþ¢ïS#>úøó½Ü¾622(ÅÅ%Y_îO\ûÞß^_ ”,|cqÔœÈ8;/~U‚Xó“m){Ò?‹žó—Õ ïYt’ðîû‹Æœ97=lÚûkÖ …«ß]3)$èÛãG~ü1¿ùã6l¨“³ó—™-Ê›UÁ…ÂÃ_}ù¯eÿHLüo~þO‡²˜¿—FÖ–·¿0‰þßÔà;º»§}–2æéÑ_ý†ˆŽ~sì™gÆXÙDÍqòdžÐ‰ k×®«Wݼ%ÃÊU ÁAóünܸgVÆ'ÜñÛ±.'çÈ@Ÿ'ssˆ»/lÚó?ü`ÅÊÕMõÖÔðØmPS»ØúQMDG¿9~ü›œ)S&½ûÞšÛZ£^¯ÿt{Šwß>Í©üÞûkÇŽýuî¡‹‹šù×™ ÐbSºFO¤½öÚ+¶¶¶ãÇ=k2™„’/3öNœ P(&…WVV‰5ÿöÚ+J¥rذ¡9¿ÿI}•}¸{÷Çe2ÙøqÏ<”-ææ™81@©T¾ú8Ò? IDATúÊÜÛê›oÄ~°þC‹iq“£úë+öööãÆ=SpáÂìÂíììÌßK£kSnë[•ˆÆggg÷ôÓ£„Ìþæ÷Ìnj5‡V[éÖØýŒ‰è믿 ž(“É&…Î9rÇoǺ/3 ïâÙgÆŠÿb;™÷ýäÉ!ƒ <üUfS ›Þä^jj[?ª‰è¯¯Ìµ±± ž˜{äëÛú 0pð°Ì¬C+Wü«9Mrr¿žú¼Í__}¹ewwû…óÙp45×qqv¶()++ÿtûæ|Á… æåîîˆH.—kµ•MÊË+zõ ~øv³Ÿòr;;;"ò𸽓ÓNNޝ¼üÒÊU +ßùç-G¥R¹Š+µ··oÎÀÚ”†Ûÿ–ƒwvv"¢§†ú.|ã-ƒÁPp¡pÐ@+›¨9T®®eååÝÝ…yž¯ªªVTYY)lX{{{ñÃg‘Å÷M¬¼ë“¿Ã9¹2¾XúeŠôz½R©¬ªªrvr²Þ¶©áÝÙHv±õ£šˆ:wîDDvvvÚ»ü `e‡Þ¸qÃÉÉQüÝ¿­£ól€{$rÎKD|XØó›>üÀ¼ü§ŸÎ ^ÝÜÜ,š8;;Ÿ?÷ãÅ g/^8[ 9#vèС¦¦FøÃt»c˜0®R[yüÄ··•õG¹7:°öÂúàårù“úoøpÓàA%‰•MÔƒ‡ ÊÍýcÆöÃ?N}>L†p‚¹¶¶ÖÅÅ¥Á]{÷ïô믿yr@á^¼p¶ï£G‘ƒƒ}uuÍ-·’•áµÓ]lý¨§ª«kšJÓ;f¾CU*Wáã.ûìØ}û3 Æ7ÝÁ0ÞŽ{+~Õ»·•u¬“J¥Íü˜1£ÿóxúÎ6ÑÍEÌ~÷½5Ù‡sõzýù‚ o-‹ü¿…—Fqøp˲_d>=z¤P(“ɲª¯×}°ac3ߎ_dfMŸ*þ8-ôù/2³ˆhð ™™Y?üpú™qMõÖèðÚ‹;>>?Ü”d0öí?0~\Ë<1ºÑúì3cÓ>O7 ë7lÂÆû“ÙÛ·og&%%Åz5Ÿ_µØç-ÿ ­¡ù_ ]ÿÎüoŒ}6ðQ//óòý3nÒäç>MÙ3ßòá܋ވ‰_•àÝÐGo[±|™P3ÿõC_eõL÷îßÁ€;vì8cú´[ŽÊºFÖÆ=ýô(ÿ‘c›3ø§G²±±9Âÿn6‘`à@ŸËÿùþûÿàãù——ž›:%|ætá¥7߈ý4eGÿ'‡df\üæB¡P¸ìh䨱=ºwoæÛ±â‡N›gÏ„ñÏ~ÿý)£Ñ¸0vÁ†IQ/½ú¥‹›ê­Ñáµw||vîÔÉ÷©G¿96ÞßZd$îÐó_?ôÕáaÃGyzvÎs“t¬†ˆ6ì?³#ÂÚ‰#9‡"£_¿û[•M:•çy‰D’––fmX­ðìÕ‡êy®M)*<×½gßÖ~@žx´´ýgq¶‹q>xoó¾éaØõ­÷où ï–]µÉdJû|÷¾ý¶mMn³Ûùâ…³­ú§uúG•sƒÜù<›iš•Vµµµ999ëÖ­ËÎή««k8ë–Íÿ_\\}:?ßÚ °šê\ÕĽÚå<Û"¶›3c:t¨øAú!C²²²Ì+4ú <•J%œù®®®6ÿV®õç<ÏGEEíÛ·ÏJµ¦:xÐæÙVæÇ íÚµ+::ZüqΜ9»víš4i’\.OOOŸ0aŠ+ÄW¥Ré7:tè°ÿþ©S§îܹsâĉÍRAAÁÆ{ôè±xñâ†}Š%wÖ94ß‘œC'Þf[Òðëïã{|H~³ÚYf7‡Á`8~üøæÍ›Å’©S§.]ºÔ`0—z9::ÆÇÇ‹¯uíÚU§Ó½ûî»aaa³gÏ3f̶mÛš¹ºäääððð²²2óÌûKî¬sh¦öò=ø‡äûúmðmÞ÷!= »þ>¾GÜ £U¶ê=þ~6Ü_÷øûÙØà€?­wïn¿Ÿ ÷2™ -Ïφ{¡9W£àü7Ü_ƒA¡P´vüæÙÐðVaûÜ{ååå]»vÅðDwð8ÁÖx!~ ™ rùòåqãÆ]½zÃi4š{Й ·gèСÂ]„1<ùCÿ***mll&L˜ Õj… ééé …B.—ûøøäææRƒç ³ Uœ:u*** Ù?úoÑ¢E ÕÕÕÑÑÑK–,*„……%&&êtº¸¸¸ÈÈHjâiÈlha;wÆðš²wïÞÞ½{ËårµZ½{÷n¡pÔ¨QYYY999EEE8„™}/ ìu€¶†ù][Lii©\.gF*•^¿~](LIIÑjµAAA§NÂ.d¶¥¢¢¢€€;;;77·èèèšššfþò[yU¼Îg¡ÚŽ6ué²J¥2 ÂxL&“Pèîîž­Õj׬Y„]ÈlKááá&L(+++,,tttŒmæ/¿•WÅë8Xl€Ì¦ü1**ÊÖÖV¥R­^½:--M(/,,ìß¿¿J¥O51 ³|ùò~ýú™O †IMMuqq1bDqq1ýù:Oój«W¯öòòR(éééBaiiéèÑ£ÝÝÝ×®]‹9ÀÃ@xô%$$ÄÆÆÚÙÙ­]»vÓ¦M«IIIqqqJ¥2,,,55Õ¢ 2›‚‚‚-Z”œœ|þüy©TZRR"”/Z´(**jß¾} ,+wîÜùĉ=}~øá¡üÈ‘#³fÍò÷÷7¿zsêÔ©=,]ºÔÖÖvÆŒ_|ñ…•ÅÅÅÙÛÛ«Õj£Ñ(”dddÌ™3ÇÖÖvéÒ¥8JZc¶~ á–ÚôýÆU*Õúõ뉨ªªjÆ /¾øâ™3gˆ¨¢¢ÂÕÕÕ¢rÃ"êÖ­988ˆçŸšZ‘EIqq±‹‹ µù¯Ä`>ø5Ä<»­d¶p­¸““Ó믿^XX(”;99UVV6§‡ÒÒR"ª¬¬ìÔ©Óm­ºC‡Âý„áÈlkž{î¹÷Þ{¯¸¸¸®®nõêÕ£GÊýýýÓÒÒŽ?Þ³gOë=¬ZµJ¯×oß¾]<ÿÔÌë<'Ožœœœ¬×ëW®\‰£Ù·ðþûïÿúë¯}ûöíСC^^^rr²˜Äñññ!!!‰‰‰Ö{èÚµ«»»ûÁƒ—/_.”4ó:ÏwÞygïÞ½:uòòòjxšàÞkÓç³·lÙÒ°¼oß¾âçäóó4æËóçÏŸ?¾yÍ={öXTk´­››[NNŽÑhüè£|}}q æÙmÔìÙ³U*•ƒƒÃÖ­[7n܈ ˜g·¢»¹HrëÖ­88ól@f ³™ Èld6 ³™ €ÌnYâS] Å AƒòòòÄò;è ;Ù­ˆçyžçëêꢢ¢æÌ™s7ý`g2»ÕÉd²_|Q£ÑX™=‹Ë¥¥¥£Gvww_»v­Xh¾°zõj///…B‘žž.¦§§+ ¹\îãã“››‹ÃÙwH§Ó}ðÁlNå·Þz+88øÒ¥KçÎk´ÂÕ«W5MjjjXX˜P–˜˜¨Óéâââ"##qX2û¶ ç³]\\>ÿüóÍ›77§IFFÆœ9slmm—.]Úh…¸¸8{{{µZm4…’Q£Feeeåääá°dömÎgëtºcÇŽõë×ÏJ5q¹¸¸ØÅÅ…ˆ:wîÜhe•JeQ’’’¢Õjƒ‚‚<<úÈ×××¢‰yŸâ²ŸŸ_Ã/’`žÝºfÏž­R©¶nݺqãFìcÀ<»Úºu+ö+`ž Èl@f ³™ Èld6 ³Vm÷ž* Ã4,´¸›)Ã0MÝß™}ˆal%˜ØððhŸ3 ³|ùò~ýú™ÏÅKKKGíîî¾víZë…666&L³mÑgzzºB¡Ëå>>>¹¹¹8D™}ç:wî|âÄ ó’·Þz+88øÒ¥Kçγ^¸hÑ¢„„„êêêèèè%K–4ì3,,,11Q§ÓÅÅÅEFFâdö›:uªÅƒ±322æÌ™ckk»téRë…{÷îíÝ»·\.W«Õ»wïnØç¨Q£²²²rrrŠŠŠpˆ2ûιººZ”»¸¸Óeë…¥¥¥r¹œa©Tzýúõ†}¦¤¤hµÚ   S§NádvKêСƒprº¸¸Øz¡J¥2 <ÏóúÈ×××zaff¦•Uøùùi4€yv«˜={¶J¥rppغuëÆ­`ž}?mݺµ™…˜g2™M€Ìd62Ù€Ì@fßGÛ·og&%%E,aÆb™}ÿíÚµkÊ”)»víjø’Å}ÈÙ÷MmmmNNκuë²³³ëêê,^çÙyyy¾¾¾J¥ÒÓÓsË–-BazzºB¡Ëå>>>¹¹¹BaEEE`` Í„ „Gk7U™}222üüüºté2lذŒŒŒ¦ªEDDÄÆÆVUUÅÇÇÇÄÄ…aaa‰‰‰:....22R(\´hQBBBuuuttô’%K¬Ô@f߆´´´I“&ÑäÉ“ÓÒÒšªvöìÙiÓ¦)•ÊðððŠŠ ¡pÔ¨QYYY999EEEBáÞ½{{÷î-—ËÕjõîÝ»­Ô@f7—N§;pàÀܹs†yùå—8 Óé­YRR²lÙ2µZÝ«W/±0%%E«Õyxxœ:uJ(,--•Ëå ÃH¥Òëׯ[© €Ìn®ÌÌÌ¡C‡ò¿2dHVVV£5yžŠŠÚ·oŸXèîîž­Õj׬Y$ªT*ƒÁ th2™¬Ô@f7×®]»¢££ÅçÌ™ÓèÕãDTPPâïï¿nÝ:±ÐÛÛ{çÎ2™L¥R••• …ÁÁÁÆd2mÞ¼yøðáVj ³›Å`0?~\­V‹%S§Nýæ›o CÃÊÉÉÉááá=zôèÑ£‡X˜””§T*ÃÂÂRSS…„„„ØØX;;»µk×nÚ´ÉJM€¶FÖ6‡¥P(.^¼h^bcc#\ &~-[\ –çÍ›',øùùi4‹nÝÜÜ233- ­ €y6 ³Ù€Ìd62Ù€Ì@f2™Ý† 0Àü±ëÖ­0`ö ³Ûœüüü÷ß¿ªªŠˆ*++W¯^ŸŸ}Èì¶ÈÏÏïÈ‘#D”››;lØ0±|¸° –Qhhhhh¨°¯­× ­¶íË5Äû•}èçÓë¿<Ç0té·Ò?Ëú©ðWÐfµïóÙvqŸóuÿMùbfð¨žtŽ~{ýªÍioüå9áÕˆ)c·|~(tÞª/žzaÒÓb«òÊšù«“‰è¿<÷áÎLõßVnÏ8ò÷‚q42»µ¤øº^g8ñcÁ£ž÷åäéô†ã§ dÒ›oê©O\¹^fb¹c§ üžì%¶:vú¼No ¢³Ôçñþ=ýþlÑœüG´e²v=úÊšZ"b9Žˆêu‹Wì÷¬[,,sÜÒ®©Ó «7§¿1gêÛ¯N7™ØEk¶]¾ŽÙ­‚ç­½Z]Wÿâ›ÿ6±\Ó‘_·øßÛrÙÓ¾ýÞ~uú ‹þÚ¬ùûÙyù…];uJ$ã‡û¼ѰÂKçŽÜ—e¹êºzG{; €yöý±ùóC #ÕýŸxôJñÕ›ÓVHütÿßg…,ŒT³¿jsŽ@fß‹/d‹?6õ¥mq¹º¶~é¶[éíüÏWæþs=hpïRd6 ³Ù€Ì€;u{×7ú|LhGŠ Ïa#`ž Èld662ŽÌfæ–%wÐ 2ÙV\\½¦¦F­VÇÄÄX)ÄÇÇŸ;wîÝwß%¢°°°ÄÄDN‰ƒÙ-€ù3±<33sÆŒr¹|æÌ™°RHDï½÷ÞöíÛ?þøc¡‡Q£Feeeåääá dv àÿL,///wtt$"GGGñcðF ‰èûï¿///¿~ýºðcJJŠV« òðð8uê@f·"•JUWWGDÕÕÕnnnV ‰hûöío¼ñÆ’%7o¼êîîž­Õj׬Y„ƒÙ­( `ÿþý&“içÎ'N´R(xùå—O:uúôi"òööÞ¹s§L&S©T /U@f·¤wß}wýúõŸþù{ï½g¥P “É.\HDIIIqqqJ¥2,,,55´ ²¶<8óØ%;v<|ø°Å«ŠM‰ÈÏÏO£Ñ`ßæÙ€Ì@f2ÙÈl@f2™ Èlh‡™­Ñhºvíʲ¬XÂóüc=öý÷ß[ohþŒíf¾j½ 2Ûš>}útïÞýàÁƒbIvv¶»»ûàÁƒ­7lx‹rdvëš;wnrr²øã–-[^~ùå¼¼<___¥Rééé¹eËq¢¼|ùò~ýú™Oš­ID§OŸööö;vlII‰Å+**mll&L˜ Õj…Âôôt…B!—Ë}||rssqÄ2ÛÒsÏ=wìØ±ŠŠ "ª¬¬ÌÉÉ™>}zDDDlllUUU|||LLŒX¹sçÎ'Nœ0oÞTÍÿþ÷¿ßÿýÂ… ßxã ‹5.Z´(!!¡ºº:::zÉ’%BaXXXbb¢N§‹‹‹‹ŒŒÄÈlK …bÆŒ)))D´}ûöiÓ¦ÙÚÚž={vÚ´iJ¥2<<\ˆsÁÔ©SÌ›7U3..ÎÆÆf̘1kÜ»woïÞ½år¹Z­Þ½{·P8jÔ¨¬¬¬œœœ€€€¢¢"1€ÌnDttôÇLDÉÉÉsçÎ%¢’’’eË–©Õê^½z™×tuuµhÛTÍÎ; ÿ (//·hRZZ*—ˆ‘J¥×¯_ SRR´ZmPP‡‡Ç©S§pÄ2»=zôprrúì³Ï…è äy>**jß¾}ÖÛ6Uó»ï¾#"N×±cG‹&*•Ê`0ð<Ïó¼Éd ÝÝݳ³³µZíš5k‚‚‚pÄ2»q/½ôÒ+¯¼òòË/ ?„„„øûû¯[·Îzæj.X°@§ÓeeeM™2Å¢Ipp°F£1™L›7o>|¸Pèíí½sçN™L¦R©ÊÊÊpÄ2»qS¦LéÖ­›˜¯ÉÉÉááá=zôèÑ£‡õ†MÕܰaÃÀׯ_¿bÅ ‹& ±±±vvvk׮ݴi“P˜””§T*ÃÂÂRSSqÄÀý"këã“ÉÌÏ"‡††††† ËóæÍÌ¿“-.[©©ÑhÌW!6qssËÌÌ´€ŸŸŸE}̳™ €Ìd6 ³Ù€Ì@f2ÙÈì–6`Àó'v¬[·nÀ€Â2Ã0wß¿ØI‹ôððfv~~þûï¿_UUED•••«W¯ÎÏÏ^2¿g8ÜçÌ&"??¿#GŽQnnî°aÃN‘ÓÓÓ …\.÷ññÉÍÍ û÷ï¯R©vïÞ-”TTTÚØØL˜0A«Õ6µº¼¼<___¥Rééé¹eËq]«W¯öòòR(éééV:,..;v¬R©?~¼ø NóI¼õa´ãÌ1bDvv6egg1¢a…°°°ÄÄDN).Z´(**jß¾} ,Kª««£££—,YÒÔê"""bcc«ªªâããcbbÄò«W¯j4šÔÔÔ°°0+ÆÄÄLŸ>½¦¦F­V›7oæ°Z“t¬†ˆ6ì?³#ÂÙJ½#9‡"£_¿ËO°†ÉÏÏŸ5kÖéÓ§ ðÑG ùD(IHH˜9sæáÇ{÷î’’ÒÔº’““ÃÃÃËÊÊ/^l}Tvøî»ï†……Íž={̘1Û¶m …+×ããã­ ÝÓkÐà¾Ã5híîOë}» î 2™ Èld6 ³™ €Ìd6 ³Ùwnûöí Ã4u‡p†aîý&¸/+h뙽k×®)S¦ìÚµ › ífvmmmNNκuë²³³…çRÑ7žyægg礤$¡¤gÏžEEEDTTTÔ»wo"ÊËËóõõU*•žžž[¶lçÇ«W¯öòòR(éééBaaaaÿþýU*ÕîÝ»…’ŠŠŠÀÀ@› &hµÚ¦V €ÌþCFF†ŸŸ_—.]† –‘‘!.Z´hæÌ™ÅÅÅ'OžJ‚‚‚²²²ˆèàÁƒ“&M"¢ˆˆˆØØØªªªøøø˜˜±Ã«W¯j4áá˜boQQQûöí[°`X’P]]½dÉ’¦V €ÌþCZZšÁ“'ONKKƒ|Ú´i666b effšgöÙ³g§M›¦T*ÃÃÃ+**ÄãââìííÕjµÑhJŽ92kÖ,a¦ND{÷îíÝ»·\.W«Õâä»áJÚ8Ù=[“N§;pà@jjêܹs‰ÈÑÑQ§ÓÙØØ”––:88Q—.]„š£GŽˆˆÐëõùùùÇ'¢’’’õëן>}:??ß¼O•Je±–ŠŠ WWWó’ÒÒR¹\.,K¥R±Ðb¥˜gß”™™9tèPþwC† >÷ð𨪪rT¨©P(†ºråJ‰DBD<Ï z[_‹““See¥E® a¥&“I(l¸RdöM»v튎Žœ3gŽpõøäÉ“SRRôzýÊ•+ÅWƒ‚‚–-[&|0ND!!!þþþëÖ­³¾ÿ´´´ãÇ÷ìÙS( Öh4&“ióæÍ¬½©• ³É`0?~\­V‹%S§Nýæ›o Ê+öìÙÓ­[·>}úˆ¯Nœ8ÑÖÖvüøñÂÉÉÉááá=zôèÑ£‡õ­Zµ*>>>$$$11Q(IHHˆµ³³[»ví¦M›„ÂFW Ж1IÇjˆhÃþ3;"œ­Ô;’s(2úužç±ÉÚµ¢ÂsÝ{ö-*<תkÁÑøÓÚ‚¦T97xáÞ¥í2™ Èld6 ³™ €Ìd6 ³Ù€Ìd62Ù€Ì@f2™ Èl@f ³™ Èld6 ³™ €Ìd6 ³Ù€Ì@f2ÙÈl@f2™ Èl@f ³™ Èld6 ³Ù€Ìd62Ù€Ì@f2ÙÈl@f2™ Èld6 ³™ €Ìd6ü{÷ÕDö·ü&¡%¨AÅEŲºEW]{GEAì‚Ò›T‘ŠéMQDÁ† bEE×ÞËZ°‹€ô–’ÌûG|³, ºûÓðùON23àëͨÏ÷æMÁÎ]I!¡.Þ.Oó_p¹\ô¶‘ÙÐa½|ùª‹¼’’Úqå[·ï”••ñx<”þµ›·n•W”kÌ7~âà)Ó~:}¨ÆìQ ŠÒwïÞ­««k#¿dCCCǨvaañÖq>«×%f'ù…º®v}öü%b™ EQEñù‚6—Íáòxì:ö'ûÙ™‡³Õ 9œu¤Å¹j†|æDèî?¸»x‰V[QQVQY^]]Igúª©<ù4??¿°°èíÛѿ¢úúúÿ¾Áhi/è¥.+¯Øàï¶%~ÿË…V±iQ¾Á¶«ìŸ¿xUSSó±ØŽKøä” 糡#dv“—Š¢(J ÐéÝ+=vìøtõiÇŽåÌÑšBùùù={-yýæ%—[O#DLœÁ 3de»tW–Û(£¶šý¾´ŒN£Ñt:NÆŒYóçÍýGQäç?ë=ì þ›v'§E¥DÏ3‰J‹t4v Œõ Œ´rXÑGµ·´´t‹ç¶ûõÜäN«Í§ ³ÚÑ 3aH_¹rmì4mBˆ@ (,*ÊÈØ/''+..Îb²Z’Æf³/_¹r$ëà,͹l6G8ª¨¼¼ÜÞaÕÝ{÷==\DK¶8:¼šÚZ>Ÿ_^^Åkh(qq†@@Qùå×þ¿ —cÒé ƒÆ`0¡çç??|ðô-MÚÿkÞá^¿nMXxEQ¾ÖJK³\ݼÊÊÊ"ƒgLW.ä½zÝ€þj[¢ÂºBJJJœ¯_¿9ê÷‘a¡²²²Â%W:Úee}òä©ðeûýR™7o ·nINL‰N6žg’pp§ù| G{£Uþ[|CüÃÜV†oë¯Öç I‹K˜6uâù¼Kr²23¦Oe±˜Èl€oìLîÙ«wò™2ŠE4R]±—Z §Úo€ò2K) qa×ûyÁ뤤d33“Î:5ŽíÜÜsÆURR:ô׳gÏihÌ „…jÏÑÜ·uý?Ñ’-N„¯´´’Íæ¼-º{çIþ“W% (BhDŒÁ 4!¡þÿ Ž€ª©©«ªä„Glùé§Á£~Ùµk׿+|ôøÉ™SÇΟ¿±EKkÖÉãÙy.Ú;¬úóÁmáyþøãBAÁ¡þ›| !›6jiÎNˆÛ³7c“àfÿÂ%»)*îKßÍb±Ú{`¯_¿aÆì›7nN:œd4Ï8rw„ƒ‘³o¸Ák=œs²r¶í5›gîècãhêbegRTø.+ó`qqNŸêA]]Á ÉÉTæƒÁ`³Ù,éN©Y"³¡]Ò˜9£¸8åîµ,>OQTaQѤ9²òcË _œH‹PUUe0è4Bc2™óçi3™ÌÆ{èçÏ_øõ—Ÿw%Å _ê/7ÎË»8mÚ…šššÎ;—••‹nq"|¨ò²ªÉ§Œ;´¢êÿ×UU¢1ÂÀæñøõ܆:6ûÙÓ7t"&++×âê>y\·¬¬\A¡kuu¢¢‚(x„ƒ-jkk…'³;&))IQ”rOe×ÕÞ9Y9ÛÒ·™Í·pXc»ÊÒÍÊÎ26r+—Õ““mqˆ@×®ò¥¥íUVV)t•ý×ÔÖÖòx õõ ,“NïP·WBfC{ÝI·²4++/g×±)ŠJßw@¾‹´„ƒ¢ªªj³ÂJNVFL\œA§³X,yyy1±¿šúќ㺺‹E/—,^t4çø´iSÔÕ§Î:²háü˜Ø8ÑÜ'B‡'à 8œié.µu%uìZQTSÂNž@ àñø¼‡S_UUsïîãN¬Î=”ºÿ»Ÿ·ÝeÕÊÃYÙÂQi„‰ÇŸ9“;sæô#Gs&OšÐü- £¼¼\NN®]'wUe•³ƒóÎýñFsÂv…:¯ò _ëéâ•——gd¨ÿ±ÝßGüvàÀQ¿ÿÆbJÕÔÔ^¾rmüø±\î‡3e¹¹¹ƒ©å?{Þ·jG:™Mp}6´S £sçÎ=••ûöíÓ§ªœ¬Œ„„˜ð46ƒA—•‘QQQéÛGµOUeåÒÒ¬Æýì›7o‰6‹„™3Ô¯_¿ÑÐÐàìäpòÔéñ§õë×W4·Å‰Ðá5ðx ]»ù©oIiaMu]UeMUemeeMeEuUeMeeuyyUYieiIEIIEyYåë×EïßWöS ê%ÿS=ºw9j|Þ…‹N+í…S<Ü\Rv§ýü눜ã'<=\›¿eòä‰ã&Lm稜‘‘ñ Ø0g¢öúˆuó'.ð‹Xïhêì¸qüøñuuu;>¡¢ÒS­_ŸÃYǶÇïÊÌ::pà€_~ùµ¬¤H´Î‰)¯ß¼:uJmM5úÙm"¶…ILQ”¸¸ø_{î„&.!ÎdJ±X¬?ð§OküRRRòÌ©Bˆ¸¸xüöXáD½¥:Â';wn>¾‡~¶„„KZüõÛ/GˆSE_Àö°x<Çã?zø\œÎúiÈ&ó¯Ña¢AÝGw칉±¡‰±aãß¡kWù”] M~±Æo‰ÝÕJ]YYi¤gŸ_WÇ~ú4¿²²ªåǪêgÏžWW×””–¢\„ÿ¶ àÆÍ;cÆM>rìÔ„Iê‡[´xiÁ»ÂªªjŒþ׸\®»§Óáìã ‰I<_  &€Ìø›ªê7w¯’²*»•啵¶öN+ªêV:¹–UÔ8»zÖ7P÷ï?øn3I ÇÄÆ•¦§ï½uë–‚‚üÇy¼zŸµëœ]óŸ½8tèpYyE]]šV“]ÃòŠŠœã'_½~û±ÇÈÈMžž›ê_eté"àà¡’Ò26›Ò2à/W®\µµ³¿xñ¢´´ô… „,ëÂ… 'Nœ¨¨¨ÈÈȸÿ„”ôµk7¾Ã@ ÈË»XZV8nüÄ}û’Ýܽ"ÂüÑÇÇS[{Þµ«ç|7nŠÚ¦Ü뇈ˆ°—¯ÞTVV¡u5îC¯ññSîÙÛÑÙS©{Ï0?¿ž½~]¿A¹gï ¾]”–-›kjîz"ÅFñgÓÐððTû¹¯ÞPYUÍçóQ=@f|ðã?ÆÇÇ/Z´(>>~̘1±±±cÆŒ‰‰‰;vlLL̸qã¶nžtæ²ÉrýS§Nã\C‹8޳«Ç…?®4y,*~â ³¡#{øð¡••Uvv¶¾¾þéÓ§O:eddtòäIᣩ©YZZš””Ô Aƒäää–ê-«®©­¬¬ünûê?ÉËË<´õšÍG²÷Úž8~ÈÝcý¡ƒiýb¶Fxy­ ñ56¶Û—±ÓÀÀæàÄUÎ^™™‡¿ê¯Ô¾ ¨¨¨i<_=|kâ„eF™¾>ÃôͲüÖ_na¨­›t2ÉFé‹(ïuÑÛ¶í´^6­ÈðáÃ9Îó¶¯z¾+,ÔИ}áæWW÷݇R ·¥ÆÌ˜¡qîì9ìå|>Ü Úe?{k̶={ölݺU[[;**JGGgË–-:::[¶D-Y¢­££“¼+)888,ÐòâÅ‹ &…Äì­!6.¡É:-ÍšL‰KN=ÉØŸ©»dA{Ù¾¼}ûváBÇ3õ–Yîß—be픘µeG||dÚžý‰ ‘>>›LÔ7X±/=~‰Ž¹ƒƒ•íÊæE=§ÑhÓÕ'÷Qý¡•*ªU‹ÚWß¿ïâh»uO¶ã £÷î­JLÍÊÌ´‹K\4öŽýO&Ùuj™šš’q6ïDNއ‡sDâ~•6—.]Z¦§ûZÚ¿ÖŽêIQ”¼œ¼ãV—ìCGbÓb½Ö® uw³ñ²u¶Ž Ý* ÆÇZÔ?jÈl€¶ØÏ¶°°ÈÌÌ444Ü·oŸ……ÅþýûÌÍÍ8`nnq`ÿ~ ‹Ý©©‹/qsÒŽßõ‡·Íl=s·—/_vST­$  Éj›ßµ±_ÿÁùOXš ŸTTTöêÝ÷õËüöÒM´µ·ß¿?31!ÎÄÔ*+뀑‘ÕÁiööö§8®\³gwœ¹¹sò®XÍ9zëÖ¹™™Ùœ>}zè¯?5Y¨P÷îÝÛ½{·”³G÷n­ü\a­ZœÕî èä±öÀÞÝÞëý£BüÓÓÓ§OŸnj¼poà±8 ¥Ö;wîŒÏÊÊ2000·´^i»BÏÄ*:Ø—Ë劋‹ÿ£–öï´¯z;;º$ì7Yhâê¶ÊÄcó¶ +½¯_¿®Ö¯O+oü§-°cñqh—ýìmÛ¶iiiíÙ“6{öì””äÙ³5SSRfkj¦““þå—5žKbvœõ¶Õ:Å$÷ÌéþjjÍ7ÿB8Îá¬cñ )ÿ|ÔxO?ÿÉáþ¾·÷êöR¥÷ïß;::o‰òŸ4yzDøæÉ“§ïÛ·[{î’}»µæ,Ù¿/E{žþ–¨€I“goôõ44´ Þ4uêÔW%¬S’>KczVö1éN !7ûèñ¸IYGr¸Üú&oi>·q[o[êgÛŤe[™è§¤¤Ìž={íÚµ‹uÌ&8vn•’’—™™¹téÒ½{÷ZY˜…íLö³%%%[oiÙG¿zý†òêõ›#GO‹ó4ÿÙÎÄÔƒ‡²ëê>Œ<¯«cÎ>·#)ûÈqÑñöظ„ë7níÍ8Øî¤¢¢bPXñBÓíûâìõœ‚ãýœM=ýB6 >ü“CD[lÍ듚–QQQI)~_—PTTL)¯¨HMË–îÖí»É©{·mO|þâ%2à?íg>œ©­=w÷îÔ¹s祦¦Î7/55eÞ¼y©))#FŽÜnž½ÖA{Ì,ëààÀ%K–TWWrÍ—®\0@ÍÍÕ…Íá5é; i6ï3µY½zõÌ=sJ}úüèè ¹ótwÆG««ÏNLˆ™¦>+2Âoò”Yá¾³††ø.Õ3Ûä·ÁÊڞͮm}=ºwJÝ{B®\½>nÌh//)S¦Ýø˜NÿÛ±ÍæsEì×pëïm;i©3{ËöDcc㬬¬1cƬq[¡0dYZÚî;âóòòlllòòòÌÌ̶Åíp0Zä6zôh.—ÛúšÇŽþýú;’R—/_Ÿ:uråÞ„ªj¶µ•ÙØqãï=xÄ`ˆBþ¸|µ¿Z?ooÏ#¿}ç¡èè±j5c£å¾¾ÚKƒ½/..vYé’°?Þl¡yDjÈ*Ï ~žN«¯]»F§Ó?óãؼ>½Uz±¹vìØ¨¨( sÓˆ{½]›÷³›·499ÙîJŠfõPVêßPII!D]]½sY9Ö£G»*t#„¼yS0jôv]­œ ëÑãÇ]”„+üé§ŸtúÛ×ÏÛEZ§gì?–sjá"ÝGOž†Î7Þñ÷~6“Ùiá"Ýc9§C>3¹…-°y}TTz>zôˆÉ’~[ðnĈߞ>}ÊdI¿yS Ö¿?»®–2}út&“Õ¥“¤(øÛœÏ†öÚÏÎf&†^ÞÞõõõL¦”h%-žeds8r²ò¯_å³XÌö^%öøñcOÏÕ±±¡îîžF†z«œ=45g­Y³vÖ¬™vv3}}7FD…„„mrwó¤ÓÿÁN<‡ÃÝä úYÒº”¼/ü"sÛN?ÛÑÝçÀžToïõQQ!'NœxõúmRRRHHÈáÇíìì>lhhxèÐ!c3 ;kËe†Æ[#‚?ç|öƒìI?à°ÐžÍ®m¨çBddd^¿Ìg0l6›%݉Âårå亾zñDLLŒÃá°¤?ô Y,VÑ»×íâ–EiÏÑ\ã³~£ß¦Ó7NÚw(.}›Ù" ÏWa?;20Ú/j­³‹ëf¿=i)­ Fk®y}”{ô8þ ÉÒÒ2}}ýÐÐpQXTüã ëêj„¥{^ø¡tÿÍ×]#³>ŒOIIINÞeii•‘‘niiµo_†…¥åÏCú9{yµ­öĹvçÎå®]»þà 'g·¼¼k7¦¥%…ÄÇoOððX•˜˜´iÓZWWï}¼¼ÖîNMž8alë+|þâ¥hK'))éããó±-ìÿ2·íô³]í"R2W­²[é¶ÚÂHÏÎÉÕÚÌÈÎÉu…¹±±…­¥‰±Å k3£å¦–öÖ!Ûw»:9^ºtImÙÒO¶´{÷*)u»zõÚoC? ú«­­åñêëX,¦ðd¤¤$ŸÏ ’’’Ë%´«¼h4EQk}¼7úm^ª§¿ew¤­žýöŒ8{=§5¡n«L<·ûÚ¬ŒŠONN$„|r¯±I lRqq199Ù[·ï**(ÈÈÈv•—»tùм¼œŒ¬ÜËç®´ó;ÞàØ8´×~öÁƒ55µvíJš3G;yW’¦¦–©©‰§·¯…þœ™º®çÏõôô>p c¹¡IdxÈ„ >çªYUÕÞ7oÞ¤(êæ­;-n€jkkÛW¡œ=cbBœœ¼ãwD:9y&&ÄØÙ9ïIÛéää¼j•gTT°›Ûê­[C/^Üú‘Éç/^ž>snŽÖ,áb?ôîUXXøôñýì›ÄR‹sElý½m§Ÿía½dVXÒAkÓ€èx cƒˆ»í­Í#v¦ÙZš„ïH±25 Øšdal—žãl±l½àçœÏ./¯x÷®ÈÈpy~þÓþ‡šçææBËö¼oU>ŸGQQéyÿþ}Š"Ïž¿ü¡w¯æWc·ýI£Ñ$%% ¡yz¸¦íI™ôó”°]¡¦ ̈́糷ûšÌ·NLÚF§Ñ¤¤¤Zïû6i-ÖG¥WÏ3gÎ ПËá(+wÏËËëß¿=—Óa~6´×~vRRRlÌÖù îÚ•¤«»4)1aÚ4u?_ï¤äŒÌ̃A‡°²²ILØnï¸êüùóMúÙ®®®_ GHý>bع¼KÇߎ>´ùÏíÝ»—¯¯¯™‰A»¨ŸÏ4p ½£Ý¦MÁ{ÒvX¯p>vlŸ«›Ï®¤Ø•N^+V˜z{oðó[íììµyó:77Ÿm±1ãÇöuo:E…¢Ñhs´f?±¨ð !dô¨™™™/^¼““;G³§JŸÆgX[œ+, ¥¹Qëïm;ýlw'û¨Ô,»es¼6…y9XËÉ Zç–¶7=d{|Bâ:»¨-Q+ xn Zç¾m÷A/§æýìæ-íâ¥+ãÆîÜYfø°_OŸÎ9c*!DFFfgbJJóæj×ÖTBÆŒyöü…ׯß(+wŸ7W»®¶º=6H&%%Éáp]œœ‚#Ö.ÖJ‰°×sZâ* ì ë6HJJ°X¬öÇZ`‹õQéÝëËWþeh]]M¯žÊ×®ßúùç_êêj;ÌÖ¶ýb !$&ëNš‘L+ËË=ibျմwùO´rùì—òµDÎñ“.)y?}úŒŒô½ -ÎÈØ»`Á¢è-QºKõNœ8¶dÉÒýû3-Z²_ºÆ,M=ÝE®nî½UzuéÒ¹ñ/ÙâL:®Ô£—¤$³¬´X±[áDÑ_Ô]Y¥°àõWú»DŸ²/R=w8+[¾«RFF’Ÿ_ØF_Ïà˜À3sÇŒŒÃ†MÜ»7~Ñ"£¨¨@33»íÛ£ô—™ ýuHçÎi4Zãð EQTQáa¢B F·î=™Lé†úú¢Â7õõÜÆµjqnwe«Ó³§[œÛvªG©¬¬Zjlž’¸&,^Ocì«Ïë,u^å`bjyïî­¥zI ;tõ œÝ<ô—êlI=ìï¶bÖœy q[Tz)wêÔ©õ–Ö£gïÊŠ²ºÚ–t'ùµëÖ”–ÉÉ+²ÙµÅ…o…ýBCL©GO))–p¢°+Ùøóõ¥ä¯^Eq8.·>0$h©îòøÌX]uƒÐð ÈÐ0II iiéVŽŠ·Ú[¨¸„dïú½zù´¡¾^JŠ)Ü#äpØMJ÷e7SÂ>}|ÿ+mt*­´~A?Úk?;jËÖ¤¤¤½{Ótt—8¡««—‘¾ÇÖÎ>=}ÏÒ¥úû÷§/^¬³?cï‚…‹wµwjÒÏnåîTàÝÛWÂçU•åãœòõû‹«¨¨|hjjºwOÚ¼ù öeì]°p±ð1#cÏ’%ºû÷¥/\¸d_ÆÞù g¤§-ÑÕ×Ó]ìæîÎáp$$ÄEŸùõ³; &“yñB¶½½sd俀€¨ÆýìÔÔX[[—¸¸P;;—¨¨@GG÷  _ÃåæÏž=0@Ë刉I·R¨ŽW«)**®Xé‘¶k§oT¢ƒ•éž´Ýó,Z®¯kïèœgmcôÈáå†&ÖvöΖþ1»üÝí´çÍÛÚdÜx‹‘Ó¤ª_ð†¦m<¶9î:ŸÕ›‚“wŠ‹1˜Lfëç°¿çˆÌ†ŽÓÏ^ã³.!!1vk¤ÎRƒØè½åÂçÛb"u–.ÿ0%:BGoytT¨…•MóóÙþ3_[[3yÊdwwwǕΑ‘þfæ [ô ¬’wŘ˜ÚÛØ˜xznX¿ÞÃÆÆ98x£‘‘Õ… çmm¬«ªª»uë†#!„Ëå¬órup÷Yãbïµ~SZâö¤„›Câ·­öÙpìh–Þ²åi©ÉÆúî¾!>«¬#“Ò=Ü\/_¾¬ÖO÷“+o^Õï¡ÎÂsÛ\.×ÓÃM àrÐÙwÞ[„qãÐþÔTW™™šÎÑš­ÐMYsÖL¥žš³f**õÔœ=SQ©—æì™Ýz¨hiÎRRî=GkV_µÃÃB444¸\ÎwU%YY>¯aÆ A›‡ oee:rääuëÜ5f-Ú°ÁÝÒÒÑ××K_ßÜÖÖzÉ’åW._´´0¯¨¨èÚUž [!„SÂÒ`±‘©…Á’ùsµµÔü¸r¥ƒúŒÙK—êÊÊ)hhh°:u126Y6wº…ì±Ãv%'Ϙ>½¾¾Õk%¶%%%ÅÄŸ؀̆voàÀ rÑÑQ5Õ‘ÕUåÂÇÈÈÈF5ÕQQQìºê°°BL&óû*E©¨¨tî$ÝPÏÞ°Áoñâ…'Î\°`ÞСãLMgΜ+Æ +VX74Ô«¨ô¢(ª_6ýßméôŸþ©gO¥ôÝ ¤%·n®çÖ……†°ëªü«*Ë6ùm`×U§ìÚÙIZ*-)®¡ž&!!.¥gÒú»nÞ¼¥§oôÓ/ý¼}Þ¾-øª{í«žÏŸ¾$„P‚Öî¹vþüM­ùƒÿª©5ÿâ—>öÇ&íJÙŒÌByúø¾æÉLBˆ¨«- lNqÉÅ¢&ñƒ­VØ-××»z9ÏÜÌÄÃsõ®äÔï³€-:c2¥hôÞ1ôÎÝ{nÞî.·o^quurvvÿóÑãæ‹%&%ß»wßÕÅ ™ #ìj‹ûaEÙÆ»×>öÅ1Û¶;:ØihÌ`2™ªª?øm\w÷î=Q Í_°äÇ!CÇŽ›œž±_Ô}Ü·c¤iƒÿzüć»i¾xñr¶Ö¼á#Çœ8yêC¿²ÊÄÌrðOÃŒLÌ«ªªÛE`Û¬2mÛl6§•wÅÆÆ¹:¯?~¬¤¤ä¤‰lccãš,“¸ëÂ…‹›ü6ü/w GftØ®v¶ºv¶º6§¸¤˜Sç|-¯•o‚ºråê´iSD/{õê°ÙOøÜÕÍÓÜÌäöÍ+..+ý7Š–)**>~,+"<ØÞa•pJ`PˆÎ’EÛb£ý6ˆ¦¸»:ß¹uUWgIHhxÛìÔ¬¸Â‚báóæÉ]VR~íÒ­ªªš&ӯ߸9aÂxÑË)S&]¾|µñ;’Ž=Â`0¾í߈ÌhëŒóN¶þÕ•]åå[œuìHæìÙÚs´*+«DÓíìV0™ÌÓÕy<Þ‡à¿z}îÜ9ÃvæTŽpÊ©Ógúõë+&&6cú´'O·ýÀ®©ªé®Üm¦ÖTá?9ÓÒ“ݸ|ûîÍo^(të:_G³ðmQ“÷–—WÈÊʈ^v•—/+/oØüqi–ÆL))©oþgâúl€¶Et<\øRódæ'¿kY^N®´¬¬›¢¢ð%EQUUÕ22]!¥¥e)©iþùèñßÎÑÊÊÈ4YIUU•L—.똖•üñáóoÞÅüd`¿|öZ («ôPVéA¡Óÿê”Òé4ÿäÏüôäC7®Ünrq¶¬¬Luuµ¬¬¬(ÂåädEsïÝ»¿-6z“à·~ûm(úÙÐr`¦á#~;{ö¼èåÍ›·,Ò>71³$„ÒÑYÝúJ:u’®®þÛqc™?Ü~úøþÓÇ÷=¼Ó–ûõ‹7 ñtA#•åUW/Þ¸yõnóÀ&„Œõû™Ü³¢—grÏŽ9BôÒ“/!d•“CôÖØâ÷ï‘Ùð·À~XQ¦y2SxV;hÄøO^^eb´<(8ôô™³\.÷ÏG½Vû˜ g={ö|ê”ÉÖô©‘äÖ“süæÍ[Ó¦ÏN™:eÒÓüg|>?=}ßbem6° ^ >~)WIqÙíë÷_俾yõN‹·?³¶² ¿pñ††† ÿ °²0Í'„HHHx{¹»ºy644|ÿÇÆÚJ`çÙ9W>|ü°¢L8âLmÀbNݲòŸ|ï°aCý|ׇ„„Y¯ÈïÚµ«‰ñòezºÂYþV¹•WT¬°²h}%®.«,­m++«‚ƒü…SÜÝœ\.]ºÒ¯oß°ÐÀ6X´k—.Ž=vâ´±SgN—h!ÑÞ½-zôàiQAÑ›>v¿Ò Øì·qãæ§ùùýÕúùücóÅTU˜?oîºõ}7¬ýV/mûÅBHLÖ4#|f¾ ~ýç?yðù™­®- ìÆ‹9uŸ†Ö¦œË=ibáÐú/¬6`EQŸ_ŸÖ{Û§UŸ5‰!ö×IwJ@¾+~pçÏwo‹Þ{ÜFn0.¬ !äýoê&TZiý‚~6@[!ìX7ßšsêšÜ­Åükq…ßI鄽m_ >{2E JKÊ) ¼¬òíëwÅ…ï?Øí¨zÈl€6ÛŸäßm<·ÛââbŠ:“sžÎ 7žõOËÞf!³ÚYC+±=hp:ƒÞ~¿!»u7'¶ÿ|ð¤£62:Zlwà¿™ €Ìd6À÷ãÆà›9—{E@f “Ú:†" ³I€Ì€Ï†Û¡ 8_Æ  ³™ €Ìd6 ³Ù€Ìd62Ù€Ì@f2¡m¿XC¹ðŒÛ|žßü ð_ãñ©&SÆõ•$¢ïÏ–aÒ ! :á _@*ðm0è„¢ˆ€"|¡¨¿"ùCfW²Â޵”ŽÞ5À·C§Ñø%ྀj܉þÙµõF|ÂãS8$ðÍñøO@øJtðûCf×ó…ÁNÕóF1Ð×ø–]mBiàS|ŠPM3›G5^ˆœÐøfh4Ò¼ûüRªÊš‘CqóIEND®B`‚kildclient-2.11.1/doc/C/images/we_statusbar.png0000644000175000017500000010743311405233117016251 00000000000000‰PNG  IHDRÔã½0² pHYsÚk¥óÎtIMEÕ ,o5§H IDATxÚìÝohY¾7øŸfËG‹ú¡nPæ¼h™ŒÌÚbüÂe<`™4D"XtC2 {7Ön¢›Añ…Œœ´•†îV‡íFÛÁ <Æ Œ‰ò"ƒty’µÒX ©° ”Ø6«bc¨ÃMq½/J–eY–e'‘íäû!„rU?®*ëütΩ*›û÷~FŒ6˜¿Ÿ$€º|>Lĉˆˆ•ÆÚȶ1ø@د3ÊˬH ›û÷~"Æ6„œˆs*™¤/snîÝ_IH™ÈˆˆòEš/Rq™ÔDæ;zŽEFÒ{$·“ÒAÖa).sUÇÅ-â™S ¶¾ocâb˜ÚˆˆX9ø0-äÖ"U's"Æâ&­ö™ìÁ†–É¢Õ¾Râ'RK8ãk‘ÏM¾ˆˆt“Ô%Žc­h€f•fšˆt]O~%‘Íý±ŸˆU"n’ªÓ¾h¦DF²ƒˆ(ý˜R2Lœî:ºÞ§ÐoÉå “ªS¥ã  5ß„e‘˜@D”û¹0'AåŸVéœæ‹ÜNÄIlu0f+œ“ÆË»JŒ·&HrMýL³‹øN¿©…_)z"ÌÅHrpmÙºà-Ѳ–wG©¸Î)»LÝ.&2êùÈÍy™>ÿ¿¼ßá^ÈýŸDÄMúŸÿ·Nÿe¶ý7Aø ÄíÿM`D‚À„ߘæýñÿ"ó?É4¹ÉMÇÿêøõÿ]æÜ4ÉäÿU®‹@Ë­Iuà¿“C |‘þÿ‹Óþ5øÇMzôÿ˜øßÇŠË&‘‰€·FËZÞ¥2M"ó?¹öÿqé¿3á7$ýoÒ?ñµF(_äd’5CDºÎíD\ &è°&pFÄM"“qâœóÊž\àŒ±Ö¥r”g˜&pÂhK´%Ê<%å IŒÔåš/ØÇöt{]Ž)™<_ä=Ln‰HXÈM“5¡T`v±¼'*é%Ñ!•ûNLkòˆ5ÞQ¾a—›å4½D‚átÉÔªTnQ&¢ÜsÒ–·w†¦OÖé- Üä›íimª^v»Xð0Eæj“$Ž1‘Ñè iËœˆ’Ç™ÕÀ[©$›Þ¯ÞòJN{Ýœži[¦2^®Töw¾g¯IE&'"Ã$âœiŒÉ"“D±ÜHu^ IÊ&K%"✺97û…ç5æ }©ä|OäëS‘À¹ƒ‘IŒ¸Ýn7 ƒ9ß³/¨7iËTN»Í*Ân·k/ Îyu*«i/hDæv§š2"ºQÿ©þÃ,øãDÉŸV³59Í~.Z©¬"šý´6Ÿ…"õt0w;e¹ç}+ú#&û}^(rw;#"u‰[z²ÐærPQ§DžgŸ–‹³òÜáá>¦-SxF/ŸÕ_s³6ia‰\f ƒ3rààmP·å%È$^~joÜònúý–oÊÞf3^d’Ýnߘj-«Õ`C™è`¿)wÚ,¯>•Ë,/h:ç&'Ó˜_Ô6‹<È4¸É5}­Þ•TÜ$2¹õ›[1„Ón/Sß*•Ó¾.“޳פ²‚m™—kÛü?ªú×ÿS±Ðïc$2ù˜­Û³²\£*yA#"’Û‰LêjgD”þ™QW;#“äv"¢È$‹]èc.‘K¤ }ÌãbÕE™ÈˆóÚ 7ªasÿôåÊõ„ûƒÞ–žz-/·Ú_“Èä[·¼›i˜J+•Vã{%ò¨˜kFiµ*÷|0ÇZAVCUé 1´_KÒûÎõ<%M/Y=%ú2ç/ËÙ¨N%9¥z¿Š±ƒT݇¤láI%U%¶Ú™Ù?‰Õ?ö¥‘ÿCFDé_(~Ÿô2߇Dë5¸Iý_éwÿ,V’T+‰ˆÜíĉ<."¢džü¿%·‹8‘[$"ʉ›ô¬”ã#=Ì÷!=,÷tí—±êÀØZéÖ–5ÜR‰Wa˜"þbÞ†žª6”Lfõy¬ûž¼UËKD¥Æú>.½ïÜ"•ÉJ/ k¨¥ql@±õ …JÕ­ÕŒ ÌNdTÕà ÒJFeLH+FUo¿ñÂ`md_]nò`½JªrÀ$PÉ| ßà âåN ¢Ä½dòDžù>+›ªwÛ¸\^crUwÉ")0ƨ°D× K.w;õ$¨¨S‰ë•‚&rºÁùDŽù>Ýíë2Läõ’ÉiyÛ5Ü’ÓÁˆÈXæDdÇß+À[¡¦½¦ÕöÞZ0škyùöS­•U½fC*ƒˆÌr‡;'²¦•Ȉ ÄV32„rtÄJ;Å­øC+«c7v&T‰nªâ/+Õ“_Kvˆjf²4›ªr@ “t[õ·RéœDF’H¥âNΓ÷ËzÉL"ëYò› µl¶¼ÖùÁe‘ {åŸs2Éší<,Ñ|‘׿`’KX=fuÚ†üÍæj¸ë±lú ÚD¯oQÏGu{MÄV[‡¦ÚëMR•'94HU3Sµó}çü¢V[Öj›UÝØUøÀÉ$.°r³oR©\€½ú›µV2ª;MÙ‰¬=Ë-kÝT« ¹ätn™ªóýúó[T­’ªÄ¹ÈXÏš¾“óTw¨¢°Dnô°è…ް{V/Ûfl˜9‘F¾Ézˆ}Våܤ¬Êý1·‹ˆ(¯•s(,‘ÇEc½,z‚GŠë Ú0žTIظ†1<.FDÚRI:àÂóQÞÛmC·×ëަÚk+6°‘îCÒÆ²x9òàUD¹±íðªqˆÙ…u¡9ãœ3¡<;¤ÄÛ<•V*YiK/ M×§Úô°µTªN²Hʇ,žÛÉݶóÿâªþ±ëoE"Š?Ð'о™ïCV7àX=,$:èîŸÅÌc½½®eþùÚÝBÙçÄMÊ>_·ÕÊ!‘Ó'­+(žÓ7‹rª×lYÃÆ|2&Pá©ÊMV2í>Þ¦žæÛк-¯ätî Ušx­T²2Ù˜Šˆ‘°îùR«Á×ËYÏ+X‰«38‘@öÊî#œŽòú7˜ÀEÑ«§z¢•jR18çÕ©Èä:g²È|²ÔO¯ü*[Ó ¢ÌÏÆeF#½"ÅïëÄʦêÝ"sztPÙ¾n+Q¡hpSd–ˆ/—ˆH×¢.ºDkkÉjï3¿áÛ4Ò+Êí¤.ÑÄ==û¸´±>;©a…zD"*,E‡ÝÉHpà À[Ñó±Í6tg-ïf©ÖÞØ!°’alHEdr^¾GÄjw\T=烈Hàd2.«zBªõd2ɈLkhˆ1&0bœÖ´,•¦sÑÅÂ}bæqIoú9§]ÿ®6Øš|XJ>,U–ë¦ÊüRòþ²i¸Óý·Úü•¯ê”˜þ¥”®—ÉÆêÕ¬Ù¬†[ëuÊ"+ÖÉ7Iù¸»ûd¬™_Û}€ÑjÿËR©:w:Èå`‰“RðFõMÈPËÿ[{èc‘ˆ²¹‚(ŠÎ÷Dǰ À[a·×uÙVVVˆ(ñSÖ[×4õ—|éWµqÎ÷eùC(I-Ne'R>`.–xø–6¯á ¬eo£ N+òHÜΨKÜé’Å÷%k Þ{¼½®ú-[ >RWçNZï­ʽ+¼T2¶z–†]`Ìéd«]ù­LÅêv1ÑÁˆ(õ“¿_Zø!‘³”íc¢,2"JÍd EÝÕ!;ßs"òx›ìéöÚzÖêêxÿw®zÁ‡@$ì³)n“ÛËUVužyÌɤ‚ö.ŽÄH&:I™÷`ùåv…§jæ~ž›$¶KÎ÷]Äì ï³€–FT~è{½àã?ŠDU3@öÛ7cF$»˜ä(÷‚€v‹ó5§ƒ‰í’ý=‘1;ú< ¥Ö?ÓÿqÕÝ.‰÷Ø_¡Uá1‘¡‹‚á|È,?Íó]Sâ\/qƒsµhp"Æìv—›Ó™ ŒL†Ç{À®+÷|týM[",NdIÜÐßék=¬¶‘`õv CvßÂ_ŵà#ÿ˜K ·‹À›¢qÉó#¢ßàX@+!ø€àÁ ø@ð>ÁÀ›×ì{ÆÆÎ…q°ÞÉ©éâsÇözðADWb8^Ðºàƒˆ\2Ù¾†>Øu˜ó>Á‚@ð±•Ôí”­Íf±Ûí™{™–m³Ùp¾Þ­à#u;Nÿ8½²²²²²’ø.1ôÉPîŸ9œ€w‡ÐÊÂ'Ó?Nûù­‡O“I¡?… 8ïˆÖ»˜T‰<ÊñǧÃóùykY×õ!ß­ÍÖÿ‡~]×­•6›-þe\: ÙÚl©Û©Æ{Nü}¢ËÝEDù‡ùnO·­Í&IRâ›N3À»|ÔóÂç±+±ceøøpä|¤²ƒªªê¢:ýãtàD ñž¢(fsY" ~Œœ/Œèx4ŒÃì%¶••"Ê?æÓì7v.`Ôâ9Õ6F!ÅbÑÖVç†+òXׂn²g%òЗôصXáçB>ŸÇÉØSZ;ì"PeÞ†%u;U‰ÄvqååJEƒl¶ÜST8ç¡ÏC³3³8Çïnð1ýãtp8X‰?*wÞZ?ú}…_ dRâFÂÛãmÏ–{~.‡ƒÞ^oüzç`Oié°‹ÿ˜?9• œY.¼úÎÛøÕx`8¹—qèž¾5Ý Ÿ-÷L~Ÿ ”–J‘‹œc€=¥¥Na×aÂ)ì–Ê„S¼ÛZ Á ø¯…€CÛ%è¬Y£={‚ÃMBÏìöìIåßÎrÈærþãI€w z>`×NqÞAèù€×Ǥè¥ËîÃݲ»+zéreµt S:Й½Ÿóñº=ݳwÒT5v³q|4%v=ÿ&9ŽžÄ¿IÄ®­{¶ý|~>~mB_Ò#—¢T5MóE|4ÅêϰþYk’7“Dä?æóõU~¬~ôé!¢âó"ŽÀ»¬¥s>l6[uÉÕ/v±Ùlßd[7·í&×hcE±X$"»C´WýXáE4 Ö÷|¬¬ªyÃ-ˆ·€Ëå"¢’®—t½ò#Àë >l›k2‡µ7ÜÂÛ"x,@Dé™tz&MD¡O·¸™…9ˇÁÇÖ¬ŽŠ•õh›þc~2×¢k!u;ek³ÙÚl]‡»rÿÌU¶&n$ìïÙ½½^}I¯É'ÿ0ßíé¶µÙ$IJ|“°VvÊêc•ˆÔÇjç!ÜOÑ á³c# E¯Ä"ãÑ‘?Œži¼l<Ê ~¡@ðÑlüQÝÏñºf`N&¯M®¼\‰^Š?_ûꜻŸ+ýZ Ãçµ_¸? FÎGŒFtgà- >ènTIÝNm¼ÕWlïfî/ŒÉë“ÊàZÐ`Ý·©ëúÆ{(”A…sú<4;³Ö)ÂÌó;OäbÄÛãeŒáL¼=ÁÇŽ#àppúÇéšõ‡:S·RDä•1"ŠŽGɤäÉÀ±Úd ?‚ÃAo¯7~}Ý#5‡þ0ÿ&Ž1€w:ø¨Ü‘8HN%+«HÞHF.Flm¶À‰@uh"˲ÝiOÏ¥cã±Ú$ß'Dz,ˇäêõ¾A™d=möˆòtüc.1­Á~cçÂWb®ywj¹£i%ÅbQéS 8ÍkÇä¹êê‹ÏU h1Kž½Íïv1iòúäÆžØ]ÂÛú‹Ùß³{{¼³ÿcçÁǶí`ÌÅ0 œ]€=è78€à| ø>Á øØsº=ÝS7§jVNý0ÕíénÊf³5“yç¡NõñÚSÆS·S6›-u;UY£>V;u6Ÿá¶ö@ð±åÊǮƪßm«ëzôJ4ÿS¾Aª&ŸH6||8}']ù1}'íþșˬ…#3)ëéì;xÄìËàƒˆŸ’7“•“?$_×ëZþ@jf­Ÿ#3—‰ÇÒsë‘À'\"¯Îà6ïŸ89œø:Qù1þuö úJ¿–òÖƒFÎŽ Ÿ^1VBŸ‡ÂgÃVYVΙ¹ c,s/c-[å¾Ý2s™ÐgA»ƒ‘SG¾U÷f½Õcsͬß“†}Ûz Òk(ô {C5Ü2Û½dÁGYàDÀêüH|«7-üÇýŒ±Ð§¡ºŸk‘‹Ƙÿ˜ŸÌ:9ûù­‘—Jà;ê³F^Ò3éÀÑ@3ÎÞ™ }""ç#•ÝÒwÒÁ“AÈÌ?=3måœçÒ#© zÞnR‡¯jq¶‹…ü¼µl,ëÁÏ‚’Üé?4–yMº[eúã)ùP—··þQV»â7vÈo\?=“vî–äÎÙÕé>+PCI×ý'Ë{–V/6é@gâFÂQ²òܬ25++ËÖ°Ž$w*Có«ñkÝZYpîNÞLÕ?Ϋyn¬Õë=,u«]“í|>¯ Ir§ÛÓ¼9µq‡æF…Go_¿ÿøÚYØXVù |ðöõk|ìÀðÉáäͤ¾¤'o&‡O¯û"µ¤G.Fþ€u[ÊF¢(6ÈYéS²¹,™”Íe­~¥WÉæ²œó̽ú}3,.Åv‘ˆ\®êŠ1#"Ƙ¾¤[eeîe8çóæ#ç#ÙY]×3÷3Ê;ÐýíµÉäíiÏoäbdv.³P(¬s—bþ-ª-> |2ty¥ŸŸ4¿e¶5µz½‡¥nµk²=;3¢-.DÎG¬ÃÕÌ‘©{4j$~HfçfGO‡¢«gacYå¿V§óîÌì¶N ø(“Êòrè‹ül¬Eƒ ç<ôyhvfv'Y äñxîÃ]Œ1kÒ«‡ƒò!ÙŠ¶äjw‹E"²þ/굋|™_æVhÂÌý¡;þe¼ÛÓ-Š¢÷ˆ7v%æù­§ÉRöµ®Ãî|.›ø:îj—ß%ú}CÓ·Ëß°Ósé.Y&|ƒ¾Ùª[lÍÌ¥‡hè¨/{ïî¶j2òEÈÎØÐ ¯ÒqÕ¸Õ2÷2þ£~È7 TßuáìHMžÛÒóqOz.“½ŸSú”ìýlƒZ¥ç2A€ ŸÝ2ÛmÕj‡¥nµ«eïÝô‘À‚Çü¼^ßIóG£Føì( LéUÒ÷2Ëò úìïÀß‚7%8LÝNÕŒ¹QáçBp8èíõƯÇw–sàX u+UÝÉ1tt(u;å?êo>‡Ä™­ú‚èô%o&ɤÔÌZæC¾¡èx´ÜÅÒ§Lü}bÈ7ôî\jÝÏ虑ÔÍälj:z%Zé"’äNé@g×áîêè­ÁÖ¢®“°ÃŹ¡ãªqÖí©ëVKfg¬zŒÏî_å°$¾Š†ø,Øu¸{áQ¡A­t]w¶‹D$¹\[f»­Zíà°Ô­vµ’®Ç®N„¾õöz_ñhÔ(ÿúÂÚ ’ÍÊBä€àãÕ‚ãA"ªs!¢ä÷ÉÀñ€,Ëò!yg9û}Œ±êàÃ7è#Çš½É6v%–½Ÿ•dÉÛ³öÁ¿Ÿº9e³Û’?$+Ó|ƒ>]×­qe@᜿ >ˆÈ}¸ÛàkßG»{*͆(ŠšúD{VþW“°îVÑ!®Æ¨ÙÓšý`pÞx8oK¥ªØÅ)Š©[ImñIl<ø,Ø V®v—u«j nåÝò°Ô­öº¿Ù“AÎyð¸ÿÛï¯x4j÷_Ò­³àZ= Í—>¶Vyº—«Ãµ²²"”kÖûûŸ,>)•Jcÿ2VY¹q6PcÌ0 ÷‡îêÝ•—+Õ8gÈl6=«=Ó†OWVŠíâÝÌÝ•—+³éÙJCåù­gee¥çã"êù¸geeÅó[Ï»p‘ù”ø× õ©J&•t=ñ]"¸ú°e@YX,IÉ[)߆¾u·*Jæ~†Lš½“ööö—wÖµak6[ß°ˆú{ö)©™™”žËÔ½jëBš½“68Ÿ¸ºÖQçíí·¦y2ÇZ‡JÝZ (É©$™4q-þª§ä•KÝjWg[x¬úú{z¼‰’õËmúhÔ˜¸'“2÷³C«±{ý²Á¼Ë"ç#Ù\ÖºÁÛ§¨ÅbôRùΠèÅHäRT:Ô™ø:¿«IXwkôb$ñuB:ÔyùÊÄäµX%¾éª÷ÐýÍÖ7.b³=§S³Ò¡ÎÔ­dôb¤q°U·PkFg÷¯»ª£nòjìò• Iî´(Ò VÎGr³ž^¯çȫƬ¯~XêV»:ÛÉ«±S§G»{¼]åºå646D=žïÔw‰ «÷—Õ-«îvØklÖ—õüc.1­Á~cçÂWb®‡l_+>W]rñ¹ŠC-¦qÉó#ÚÖ³“ˆhC_îe€mAðÛÿú‚h^æ|‚@ð€à| øÍ*üRèÿC¿Ýn—$iâïw¶Ùl8£>v®ø¼¨ô)¡ÏC¥R){?›ü>ÿ2Žs€àãM‰^‰Žž>9Ì“?ß$xk%‚7'}'=||¸ò£çwžùü¼µ¬/éýJ¿­ÍÖÿ‡þo¿¬»Õf³Mü}¢ËÝED©Û)[›ÍÖfë:Ü•ûgׂ""í¹&oòšÊ‘³#Ã'‡WŒ•Ðç¡ðÙp“[EQÌæ²D8˜¼6¹òr%z)ü<ˆë eöô[mív{©TbŒmÜä|ß©©s0ιt@*ýZ""›­üël¶Õxa0#¢~¥Ÿ16ö/cÞ^oÝüßVx«-ìZŸÂê[m÷tχ|PVŸ®5“œó©¦¬e}I·ÂƘ¾TgØ¥îVk%Mÿ8Í9údÈétææqA´Ìž>”%u;Uù1}'»³–Åv‘/s"âË\lk6Þjíp7s×xaL^ŸT\>ˆˆÆÎŽÅ®Æ¦nNqÎóó#gF"ç"Ö&ß /y3I&¥fR¾A_MÂÆ[‰¨óPgêVŠˆœ¢sã|UxGƒù <ýãtìJÌþžÝwÌ9ñ÷[›âWãS7§lv[ò‡düZíÃ?o%¢ädäbÄÖf œLÿ8ë e„=^?¥O©Ü^[Í7©YiÍ6Ýr+õü¾g¡°€Óßz†IDœL €=0»°Å´"ìàœ›DDL ;cåÍòJh“¯ˆ1foὟ> 5×:é˼ú¢³3Fœ“ð.Ýè °p“qÎ9çd$ØÉ䜈qN¢Ø²øÁ´‚¦ëœs&7‰‰#“H@àÐjŒ8s0ˆ/†aØív"â&—tÙåjM\ðœhÒ¯šuq†A¦°kFcŒ1f'“/JÖjãE©¤ë­™“‡àZsNDdœsãeyÄÑ.]o»…p“¸IÖwBι¾\2jf„¼¡’·µ÷Ô­ NÖ¾¦ôÈ»R®¾Ìï“ap2kouAüM207 žÔ­©±¿^¨~ øÖLÎâ«_ ìïÙõeÎNí­¨3z> %ÍÆr‰Lƒ›Ä9_ ´¹a¢9Ø 9ÿ IDAT•)w&/ßuhÆr‰›œïÁž€)ßêbrn«\Ù&'!þ€ÖãœO\™˜½3[\*º\®àñàÈ™x«>u—ôðùpö~–ˆ”>%:Ū—TE«ËL_æRË‚œ!hÍg½ñ²<²ÈMF&ç&#"FZ/|6ìùȹ“f¦/ë‰ë‰‰+—ÇÎŽáÈÀ>¶¾Çbä/¡¡O“×bD”º•ùËHòF¢:à¨|!´>–—Äy랉àZ¡2›zÝ߉ÀÖþZ(s/cÜ$ÆÄàC¾AßȰŸ¿ã­ÿ,Í=ÌÇ¿I1"òõE.E*;0¡N°RÿƒúÙÓs> Γ7â#_‚Ãý#g‚Ó·§*›J[½ ®ôʯ‹ žè¯ü }6kÅ"®ïþUpkªéÚà˺€Ö’:¤Ä×kßEQÌæ²ÖráQ!p,Ðu¸ËÛëµ^?ID]î®ä÷I¥Oé:Ü•™+Ï»ÏÌeºwu¹»†Ž åóyUØSz~דžI“IdRúNÚó;Ϻ0ÅäÕ å™¼u]Ñ{ºç#q}B>$Ç®%íŒˬ#i« Ò1ì»"69;–¼•ô ø¼=ÝR‡ì>T¾,|.øòÇh˶Åî`¾cþôL—÷Nƒ£Î߉ÀÐó»B>äNϤ ÙÙäÔtîa.z)êôÑôíòk®}G}‘‹k=Õ£_Œ’À¼½ ™ånÏo=™{I’º{¼é™4.fØåÙõWàå¿M„>? ’IÉˆ]‰5VêP¿›Á‡Ë%§o'­hƒˆœ¢˜ønšˆ‚'ú­ÿ­ž õq!ñõ„ú\bàxHðÕìPY¨^ž›ø[„ˆ\r英®Ý jbpžžIùËß6”hå<üéHæÞôÄUÄ(uàú‹Þàd·n4Ø-n·ìvˡς…ÂÂØ¹ˆo@!¢R©4u+¥>Vª? «ú°6¹Õ}>=3Ê–øzÒíîÂ!…½Óó‘Íe£—.0"(xܯø†êô|¬Þ´žòW3c±+Ñ̽twâù¨Ûù¾K>(QòÇ»ÕñÄäµhàdÈ{Ä›¹ŸIÞˆ+¾šêšø[$ô§1eÀ—Íeâ×£ñku"+ˆ©ýyl³+$ÑK ü ÔëùØpM[Ô#;´žoÐ7š¶^iAD²Ü¥ëºõq.Ì?ʧïL~Éüù‚·W© #Vã¥×—øj¢Ù/=yæd\.Éãñz{”ºû¬ÍùàEr¹J\OßÉøëjTŸªcçFd—ÿ&¾î­¾VMƒˆü'ƒ£_„”>Ån·ëË:.fØížuW 2 Lÿ˜ô øˆQêVJPêfÃðåÝ >Ê!Ènù7VbW#ƒcYOß™VUu[—9‰_^þ÷0‹^ŠÉ4v±3¦ôù7&—ˆÈ£ùžã%‘½­¼ÐJ¡ÏCÑñhòf’/sQ•%ôçëRûëXäbT×õЧ¡Ê…Z½PYŽœ‹D¯D#/“@Ñ‹Q\ɰ»j®À‘?Ä¿ŒÇ¿ ‘Ò§Œüe¤²Cåƒ×Þ†žºš¼>]iÑåƒîºÓH/_ »{”¾!Ir…Ïžjtn–×î¿u:ÄÈÅ™”¹ŸŽŽG¬Ù$Òr.:Äí–å£gÖ{킱Ù:@ˈíbìj¬î&¥OQúÊßpüÇýÖÂÝÌÚneÙý‘;ù=&xÁÅûëØØ_LJ)L Êï¹5ŒÖõÞíéç|xŽ(é™”V,’IƲ>{'UÝíQ‰$Ôçš·Wq»=é;©ÍBù9ƒóÔ­µOб3Ál.CD¢ÃÉ—·x(ˆ±¬§n'+£3›•›2y%ÄÆ$S€½ÆÞVçþ—w´ç#x2¿MÏ$9çÌ!*½Jèóòû<¿ë9õE 9u—ˆFþ26y5ª/ëþc¡µÀ¥j‡±¿F'þa<¹öú†ÐéHâz4þ÷ËÖõ+°:á”9Dowxµôº%BVocŒL{õµŽž€] 5Ê¿cŒcÔÚaÛÊÊ ås‰i ö;ž¸ËäTœ³}Mé‘]rñy«Ï£284ym’Ln½aÎz¿‘Õ‚ø`W‚{•J:7It0»…þ<»•ÉÎêWнV—<0»] 5Dã˺Ó)rsõQë«/t®™ñ­‰?H°“À™@v;+•ôVމÿ'Z@>ä¶î bŒ1Ƭ  Ï`wvÆìL Ƙó=FDêSÕù¾Ô² ô|@+Ž E/Eåñ˜ó=focÆËò{Œ båèZÃzÆ£iEÄM2^”ß'}} ¬5ý> ¼Gz|ƒ¾ð¹pè³ ûC·Ó)å7‘ñ’è%žÎÐ"kƒÝ&çܘÏçã_'Ünw·§ÛÉXeLÁ¼ FOt{º?$ã×'K«²€ÝÂbQ>(û}ÝžnQE§Ó¾ƒáã ÎÖ¾Öúû\ªy{z¼GzJº®—J%kÚ)B€Ý% Ìɘèt:E‘0ìoåUîEæ`.“£ó`/`‘ÀìÄSx›ã»Àˆf™¼›p«- ø¯…Íf{-ù‹Eœ9­ã>ìÆ™@ðÑ:ú’Ž3€àcl6[ü˸t@²µÙR·S••‰ û{vo¯·^TÔXËÕÿ‚f©ªª.ªÓ?NN*+s÷s¥_KÁá`ø\x³„+++•ÿ`ßÙµç|D.Fcþcþêg\F/Ec¡OCò%çà­´k=¢(n\éêps°âîg@ðñæY÷Ðêºîr¹j6a’)‚×/:%“’?$ÇV'‚”ºâœG.EÖö‹ øxdY¶;íé¹tl|‚€& 8°-ÒκëµgO¬MÚ³'o¤8ܸ#çÇ”>¥zÓv‹{•€mAÏlöì‰õ¯îo®Ð…ü¼Ô.ÿxj¡PÀY@𰈼¡Ì¢8v6L&Å¿I´ 8@ðû€t ³2Jb-gîçÔ%»»"ç#dn‘¿Ûí&¢l.[SÜ|>ï;äNùP—ÿx@]T+[ggÒîÃݾ£R½—©OUÿñ |¨K’;•¾þìýy{û¥êSÕÚA:Ðéíõâäìïà#u;e³ÙR·S[îi½äöµ«ÎÖf³á"xsæsÙä÷ ]×/ÿm‚s}z*Y,ÇΕߦgÒÑK‘Ø¥h⇩èՉƹÙ¬îU:=’ÿ)??›ü>‘û|èÌheS&—œäÊGÆ£3ùóhp8 îþÙÂcuäì) Íþ#CD³é )}C8•û;øˆ}ŠßrO÷a÷›¨@u¶x²Ù5r:Ôå.í±3#ÝOuô¾“&"ß ÏwÔGDÓ·§wVŠ®ëDü<¨>UŸ,.dîÌV6EÎ…ýG"ÊÌe6&Lß™uàŽŽ_=;Z©˜¯O!¢Ì4¥çÒ•pv9ø°m®qBõ©ºðhaòú䣫g»Q£R¯«üÕ½¡l¡^_…Xw¹úDtîî<ÔEMtt•tˆ\í®šõ±ñ(s°Â/jø\¤ËÓ==“®lrŠ¢U® ÔH|è÷ žª±+±ÊJoOs°ÜüúTÍ?Ì3Æ”žœJ€Ý>¬ƒ•õšéHH|~dŒ? &¾NTG35ËÕÿ[ U¿Òok³õÿ¡¿ÒØl¶øWqçûNçûÎôL:3—‘$ÉÖ¶6¦“˜ïötÛÚl’$%¾IlÌvëü¿ŒKÖå ¯‹(ŠDô¤°P¾eFÝböh>?ODÞžîšõcþ…üü·_Oúùø2Ÿ ¯Å+Kº±Ì‰Hl7fýÛ}{}Òí®êcHéõÑØ¿FˆÈÛëÅ é{"ø°âŒšˆaë! “7#_ŒÑÈ#‰‰s k¢™‘³#Ã'‡WŒ•Ðç¡ðٵ֥𨠩Zâz"|>œ{˜SÕé§'ÖÖà§ÁÈùˆñˆŽG­6i³ i³üUU­É^߀BD©Û©ùyé@§2Ðhj…Áyâ‡)häO#5›”Á¡ÎC]R»>;FDR»TÙ4q5VÜé«3t":˜u M}Ÿ\—ဈrÿÌm–^E9bÈ?æÓì7v.t'n$œ¢XSÙ™tø|„›Ü?蛺•ª¬/-é]žrÿÊ|.+u¸ðIðê4.y>`¯!øØV«Üÿ‡þšyÊ€r÷w› >v¶ƒ¾¤Ç®Å ?òù¼úTmj[ù#øØû^ñI¦Þ¾~õ±êùÈ®š¾ ¯%øx w»4Ù$[SMW^®Í1 cã´ÓÍfƒŠí"_æDÄ—yÝñûº”A…sú<4;³E²³üáícp¾P(hÏ5" ~ÄxíZw«mâëDøl¸zîclôÌhyÚ©@©Û)ÎyäRdma-ñ ú’7“dRj&åô5YháçBp8èíõƯÇëf[±³üáíÓéîê÷ IÒØ_Ç‚'‡q@ömðaRêvjäϵSÇþ26ukŠL²ftJ’ä9ì©lõõ;%§µ¿Ÿº9e³Û’?$ã×âM›ü>8eY>$×Ͷbgù޵㇯kêM}’½w7|f‡àMx s>`ywæ|ÀžûZøç|4Á ø>Á‚@ð>|‚ÖáË|ǫ̂$I¶6[ç¡ÎËÿ~¹ù´6›­ÁÖb±ØäžðZ¨‹ªÿdP’;=žîò«[«´ÉÛ’ë’t6Ρîð6Á?岺¨®¼\™0_*•"ç#M¦µÞY³÷aw“{«ӊE߉@p8¨-.¤nO'o§7Zxû”טÃÎ^Yû øHϤGþ2ÂŒˆDQŒœ‹Ä¿y=ï›Õ·ó=^QüzbäóPà¨&”'¯Ä’S©×A×õ]ÏöAð!”£ãÑÊb»XúµTi þ€Ýnï<Ô™˜·VÚl¶‰¿Ot¹»¨j0Åf³%n$ìïÙ½½^+æ°6UïPYˆ—H¶6[êvªRP¿Òït:ã_Æ1@³3™{™¡O|•»»3s³ÖrI×­áÿÉ`iµu—t&n$~4^±ñXðÓàZ€"ŠÙ\¶&ŸÜý\é×Rp8>¦Õq–º£-ªªª‹êôÓJAÃ'‡5MË?ÊãrÙ­¨ÉrÝM‘‹ÑÀ'CÚâ“àp0ri-ÐTŸ³÷3ß^Ÿ‡jó……ù\6v)½2±ŸŸÏe·¬!Fmàg³Úàüc.1­Á~cçÂWb®Mš7*÷¹Ì½Œõ/ù}røä0I’¤ª*clÝ/c³/ k˜Æf+ÿj6›M{¦¹:\|™Ë‡dMÓª·ÖìY*•DQ¬^)I’º¨2+>/J¤ý>A¤ø\uuÈÅçjK{°u-<š·¯?Y÷áîù\Öî`çÝG¼…GóVÇÀ“¼Ý!ZËVS]w¥ÛÓ]x0O•t]ðåd‰ÈãéÎ?È’Àjº.*M~ÝTnOwv.ãlµb±ûˆwc|PCu­òóÎv‘L’äÎ'…»ƒmYC€wô»(—<0"ö~]{>îéù¸ç¿^È?ÌûŽù¬à£¸Tdõ3+ò¨áêpY›ŠKÅÆeY‘ǺÖz©håie; uHÅgš|h5r5ùôL:pÌODº®[­µ±êIVQcãJ}I—äÚ!Œ¢®×DͤÒuÝÙ.‘äÚÞ‰¶RYIö —_ݲÞq{zØÅù¾“s^ùÑó[O¥}E‘̦¿î‹Vëârm;€EÑ*´úî\Ø¥W©Ì ¢Ù{Ùøêݶ¢(Z3! Î7F~ÍœM}¢=+ÿ+¯tlqmÔMåjwY7Ó–^ëdäºe øØ»G›P«d’¾¤O|9ú4dmò úÒsi2)u;Õyh‹o–Ññ(™”ü!8VžÉAB³7¼Ž7dRõÔWؖСø7‰é™´Áù|>9;=RŽKú”ÔLŠLJÏe”mß « ( ‹2)y+å;¨¬ÌÜÏI³wÒÞÞþʯLh­›jh@IN%ɤ‰k›ÜQU•Ã+ÖÁÇÞfîgºtÛÚl²[Öži±«1kSüj|âï6»-r>2}sºq>²,Ûöô\:6^Nî?êwJÎfêM§¦¥’·Ç‹ËegäWâëxüz¼ÓÝúb$|ftèhùæ—èÅÈtjV:Ô™º•Œ^Œlû ¹‰\ŠJ‡:_Çã«×Fôb$ñuB:ÔyùÊÄäµòJ߀ÒåénêÂùHîaÖÓëõñÔ-«:‡W¬!îv€wÜ>˜púª¿aÕÜÒW¡/éò!¹T*íëó½+NhM8Ý]N§súÇio¯7z%ª¼òS2¡FMfE¼ |l!~=üc°X,*}Jòû$ÈkŽ‚m øxû¼â˜ËðÉaëæ^x-~ƒC>Á‚@ð€à|‚=ÇVÅétN*oƒ³Ùl;È çÁÇVViÏ´ÀÑ@ètèU²ÂùØuûæ §ÌÁ†O¿Jðûˆ»(2Xy•Iº®snààì_ûiÎçœU¡UÕƒ)•e]×û•~§Óÿ2^YY½ÿ2.lm¶Ô픵2u;ek³ÙÚl]‡»rÿÌáÊØÁ³‹"ãœÓê?Îu&Ã+‰|´"òXæñ¯âãfvŸ ŸÖ4-ÿ(_wUUÕEuúÇéÀ‰r†Ék“+/W¢—¢Áσ¸2vŸÉ97t½¤>Us¹læ~&—ËêKZ¹ÛÃäSK:×þɳwÒo¢Ž¥ÕIHkR³Ð¼$@ðñª*N%Y*,&¯N6“jvf6x2È‹^ŒÖÝ!r1Âóó“Y^£ô*é™tf.ãô=YÄ«Vw™Á¹Á97yá—B6—Õ–4ιÁ¹±Ìµb±´¬&7–·ˆ?´gO¬ß^Ÿ=~ñ‡·Oi~g¼ÂÀ²×û¯w6K´¸TdFD®WÝDQ¬Ycõ‚ }2DDÙûYÏï<¸8v‘¾¤‰¢s¡P(üRÊÞ#=¢è$"nr}©¤-iŒÙùrÉÎ$Ú0·ÑР®Ñ©Ó£šúš›]×q²¶ëíy·^Õ.Š¢Õ*‹Å&“‹íâÝÌ]ã…1y}RTpeì.M+’@êSUr¹¼==ÒNû{Nû{N§Sr”™`'“´_‹%ΛÌphÐWéå*éºÿdP’;ý'ƒ¥zуt 3q#á9⭯٘ʩ;2bíì>ܼ™ªÎÖZ˜½“–äNIîT†æä+[“·R²»Ë<°±Vóù¼28$ÉnOwò攵ÒÓãUŸªD¤>U½½^\6€à£UJÝNqÎ#—"•ucÄ™6™Mç¡ÎÔ­9E'¾Îî~ðQÔìŒñe.µKb»T³•› ¤ë%¾Ìwyäb4ðɶø$8Œ\ª…¨ÏŠÙû™o¯Ož:=ºY*k¥î`Jt<ªô)…üüü£ù[O]Šjꓱ³#£gGÖ"ŒÙ…ü|à“@tC­FφÇÎŒh‹ ‘ó‘J•>%ó eîe”¾!\6€à£E¬áI’<‡×Jbã±éÔ´t@òö4ûu0y#¹±µÙ'Ó?NãÊØuÆ2g¬þŠèprnË|g÷ÜfîeüGý$o@ÉÌeêîsá숱êþ’fRU¤ç2A€ Ÿݸµçãžô\&{?§ô)ÙûÙÊúð™°1ÿ1ú^mþÙ{w‡}$°à1%äRú”Ù{Vð‘SúzpÍÀþé7ØÃLø¨lòó¯¼,/‡þT~ ˆØ.ZŸéú’^™ÞQIRme¹ç÷= …\{„]‹šÖõ¡[t:7nu¶‹EMã&§—;É\×u»ƒ‘±Íz¹ìq©ªwv¶‹D$¹êÌ:J|ýi$ðY l65ÝuØm­—:\DdwÔÉ¿¤ë‰ï…_ÔBUWŠÒã==ZÒõùü|ò»I\6€žÝät:3sÎyôJTéÃŽýG> «ÏU—$1#“/Ê?kõ¹ÆÆìö&3œ½“®DÚ¢(ZwÊœoœz¼™m¥rµ»¬»pëÞ‹ëÅÔ­¤¶ø$6 |¶v_·µ³±¬»ÚkC–àÉ ç.ðe½ø\Íý33}+5ÿ(/:œ’KÚlRˆ¥ò±S§G'¯Å†}ÖúèÅÈtjV:Ô™º•Œ^Œ4Y£º©|J—§{ãÎÎGr³ž^¯çH{¶'¯Æ._™äÎS§G+!É.ÙÝ•½Ÿ»pnlc’S§G»{¼]åuÁG¯—Lj>„Ø lÖ¤‡üc.1­Á~cçÂWb®‡l_+>W]rñ¹º/j«=/Î?šW úr‰L"˜`gQ’$ùÙ}@¶7=h²÷I:wð²Ò’>t<½w×6ìƒOu.y>`´^,ï Éåò:¼’KÒŠš®ëdŒÙí.¹CvIN;ßõdRâû„oÀ‡Kö°§/O§(:="`Ûv0æ¢.âæpØ—~ƒC>ÁÀë°wç|Øl¶+k¸n³Ù<‚|lC%ªha òØw0ì>²ÙlŸèrwQÕÐŒ®ëýJ¿ÓéŒßråoÈÖfëÿCåµÕy¦n§lm6[›­ëpWîŸ9\"ïzðAD¢(fsÙê5ásáá“Ú¦åå·\»[1V†GÎG6æ8˜¼6¹òr%z)ü<ˆKd1³»\NW‡Tþç’³ãÈìkûàÝ.5s>l6›ñ°^gZÙ$I’º¨2+>/J¤Æ+µg ¤/éîÃnMÓjòìWúccÿ2æíõ6~oÙ~´¿Þí":ìÌÁ8çlõ}ñÜädç7ñÇ °ÏTÞí²/{>6¾H½¸T´Vº:\[¬,mm6›Íæ|ßY,7æ9ýã4ç|è“!§Ó™˜Çµ²kLι¡ë%õ©šËe3÷3¹\V_Ò87¬­SW^i+è”äNëö•MÛ­Ë’¼º])ô U¬´¤ï—ª¾kg`W¼%WEQ×uQ«ã‰ú+ÛÅ’Vjð{‹íâÝÌ]2)ñCBTJ¿–p•´žÁ9™œR« …‚S³“@Æ2/é嘒8Ùº¦*,Ÿ½“=¦k44è£=ÈêØæyû”£y:°¼%w»Ž7dRt<Úx¥oÐWø¥@&%n$¼=ÞYuêLÝJ‘StVf¤B‹éK- óù¼ä’”^Å7àSúé ìE]/qÎu]Û²ÿÃ24蛼;uzv×N(þ”›Q ‚ IDATàí >bã±éÔ´t@ªŽ'ꮌ_žµÙmW'õ^š¼‘Œ\ŒØÚlé§q‰ìÎwk­H©OUÉåòöôˆ.‰#ƘCt”™`'“´_‹%ΛÌphÐG«ÓD*à³wÒ’Ü)ÉÊÀÐüƒ|ekòVJvwùJšÌù|^’äN·§;ysÊZééñªOU"RŸªÞÞ:mÝTuK¯1=“vî®6*éºÿdP’;ý'ƒ•êUwéW–¥‰¯Þ¾þ&˪Î!ùÔûp·ÛÓ™ËdîçÜžuuXWĄ爷îÖÊrõÿDd,ëÁÏÊ¿‚±Ì›<uaÝ X‡È}¸;y3U÷¬[VÝZË<ôÇSò¡.ooÿü£BãSÐdM¶u.|ìšš'‰UÿXYÛÅìý¬¦i¾Ÿ(ŠWÞýÇÝ•—+ ܺ7æÙóûž…ÂÂÊÊÊÊËÿ1?.‘Ý >Šš1¾Ì¥vIl—j¶rÓ t½Ä—ù«”rêôhìRTSŸŒ=;²ÖÎ=È.ä矢—¢5IFφÇÎŒh‹ ‘ó‘ÈêV¥OÉü#CD™{¥ohcAuSmVzµB¡0ÿ ûíõÉJ·Mäb4ðɶø$8Œl¨^ Ñé¼;3ÛdYëZúÂÂ|.»^™XÈÏÏçÖÕ¡šú¬˜½ŸÙlkùl>{BUƒ5‘K± ÿÕŸ>º<ÞìѨ{ ëV :Uú”B~~~“žºeÕ­UäRÔܯ.œ=³Å)h²&Û=>ö.§Ó™™ËpΣW¢JŸÒ`%ìÆ2ßìn#ÑáäÜ0–yyòéNõ|Ü“žËdïç”>%{íæíð™°1ÿ1ú^¦&IöÞÝ¡A ,xÌ_ }”>eöž|䔾žÕMµYéÕF¾Ù«î¶ÉÜËøúI ߀’™Ë4þ}ƒ>kZL3eU‹œ ÛlhÐWø¥úcmª]8;Ò`k]é¹t—,“@¾Aßì꯰e ëúHÏe‚þ >3Úüy¯[«Ì\zh@!†Žú²÷î6>MÖd»çÁÇÞ¿þ1hÏžÿ)¿o°ö»(5­ëC·ètÖ‰5ÛEþ‚s“ÓËW*%ñUÜ0ŒÀgÁ®ÃÝ «êD$u¸ˆÈî`g*”t=vu"ôÅhõðŠÒãÍ?Ì—t}>?¯Ôv©›j³Ò×ý¦«=vº®[ñ„±-'RT&ä6SVÍ&*ÏGo<«×î·{Øõ%]’;¥]‡»+“Á·¬aÝcX·º®[õ—\®æÏ{ÝZuÖä)h²&Û=>ö®á“ÃÚ3mååÊÝÜu­þ×] û‚|@VŸ«.IbVwV©ú\ccöf86{'½ñ'§(¦n%µÅ'±ñhà³µÊY÷…˺«½ö² ž r΃Çýß~—¨nãݹ'®Äº=ÝÛªÍRmVzc¢(Z3 ÎÅ ¡Ii“pdge½¢Í*#Š¢¦>Ñž•ÿ5Yúǰ.W»Ë:ƒ›Ýß[·¬ºµâÆƧ`Ëšìʹ@ðÐDðá’Ȥ\.Ë9¯™Ø¡/i™¹Œú´àEæhê)pÖ­¶ß^Ÿ¬Yïíí·æ²õ×âdÒÔ­é¡ÁÚ …Ǫÿ¨¿§Ç›ø!Y½^éS7§6Ý«›j³ÒSú”ÔLŠLJÏe”Õâš½“68Ÿ¸Z¿‡ogeíPÝÊk±ˆ2 ,,Ȥ䭔ïh Énvä7P’SI2iâÚ6ŽFÝZ)Jæ~†Lš½“ööö7:Mפ¥çÁÀ60ævw—t=s/›}Uø²^|®æþ™™¾•š”NÉ%5~må!c§NN^‹Yù¨6y5vùÊ„$wž:=ZšÈ.ÙÝ•½Ÿ»pnlc’S§G»{¼]×=íWéõ’I›5EuSmVzcÑ‹‘éÔ¬t¨3u+½X~?€5ɱûˆ×}HÞ¬uËzO¾ª[߀Òåé®ü ‘KQéÐÿÏÞÝ…¶qíûÿÿê‡#ðxƒèˆ¶DGæŽÅö…Çxƒ%R¨D ±h¡uZ8±O`Çþå"ÑÎEPr ;rìzªhP Và¬À6Q.Rä Ò†«à¡ Ä  ü¿-+ÖƒçÉNÞ/DQGó°fiâùhfÍZîø733—&;¬V5ßèÌé背¯ÏïûÐ×ym4-Uìl4þM\;è>qjúòd›¯ ó’ìì{Þ2{ {u¼D{«{õâ“åìÃla)o®–¤"bÅîPºTMÓô÷uÏÝ¡ª/}£Ú÷:Ñ*­˜Á#áZ›Ä½"z:Zß ¼Ú¿êݫ۩ ìZšËåïòk.­¸\4MS*eEq8»]ú~Ý¥9Šº[ Z‘øwñÀ``ÏÕ°ÒÅ(}ÞÂvõáéTU§Ï'âÛÍÅÔ=^ß¿úWã{®‚£§Ïp” |oØî¹–©7è NáãYÉ[I›Í–¼õÌ0 6›mË@øx9f¾žù|dæëæìoùìr»½ÍGáqañáâÜÿ›Óu½ð¸ ¿Ç³¾ìm»ýÊGü›xäÓˆ¢(‘O#ñoš›mŸÍ{È»ðÃBu¢išÁ@жÏ6ðçZƒMçïXø¨Hüj|ô«Qýj4~5ÞfäÌȧ‘èéhùi9v!6qj¢:1üIxúòôÚïk±s±ÈçëÃ(Lœš˜¼8¹V^>2=m3'x·ÂGòvÒëñêïë"¢¿¯ëïëÉÛÉV3/æCGBŠ¢Œ|:²9^CŸ‘ºJϧCGKëPÎÝžóüÑ#v ž½5ÛfNðn…™¯gÒ÷Ò¶ ?,´jv*"æŠ= ‡ÂÃUÌ~?kYVð£ ÓéÌ=ÈU'.//ÛöÙl6›óÎÚØÙMçÄ›¥ØEQ.—Óµ_[¹4E¡SN |¼Õ¦¦k¿¯Õ”ËåŇ‹…ÇÍÇ%1† ˲F>™»=W›¨v«wÓwËOËÓW¦!£6±~µmæÄŠCU˲dãeY¦b…¾ñ€ðñ*Ä¿‰Oœœ¨GQ”±cM›ŠHþ§|d8âïóÏ\Ù¼:â>èNÞLŠˆSuÖîņùŸóÕ%þ^›9ñ&U,Ë*›f©ð¸°°IßO/,dÌ•¢e•«Ÿ¶_º6¤­vÀ­éîê æµž·,¯bô×ÝéÝÙSoÐný Y‘ä­döÇì–Éãÿ9îõyc皌Ùø.>.­”¢uƒ\'®&F¾ »Ì~¿Þ¼cæÒLx8œ¾—öüÑ3{s¶ÍœxSÊ–%KìRø¥°˜Ï;UUQb—òªU2—•.EDÄGõM µŽÒçî¤ÆNLÈe dG¨^"[õ¾CîKSŠmæ?51uqÒµŸn6ö¶å'×~}ùIa——³ø¤ ªÎ¯…üÏyý=Ýÿa¯ª:EĪXæJ©¸RT‡µZÖ\šØ•V¿àëCÆÜÔ±ãcÅÂcÇ–µ½ÝW>g^ÕßvKó½¯c»`— Åe±KáqAs¹ü½½ªKEEQºT×{ºbwHEŠ¿-—,«Ã‡µç´kwæî¤4Ý­énc0˜ý1Wû4q3©{¼¡#áRà ¸l.g 5Ýíñõ$n\¯Nôõú«M‘ þ>ãÖ›.ÕtëõšÎP^5#ŸE4Ý:)¯Z­‘/Žé½þ¾ìÃ|ubÉ4CG×ç¬íˆvÀ¿÷}诿UÓs¨'q#Ù~ëðR>°+ÃÇrÑ¡(Öª¥ukj·¶åS«R»˜fÉZµ^d+ÇŽMž‹ ÆOŽŽÝÌ ?fsÙðGáÆ|c''ÆOŒ—£§£ÑO~#ý´ˆ¤ï¥þ`㆚.Õjëí‹=7y毱âÒ£ðGÁóbc¡#¡B~ñÌ©ñ±cëÏÆÂ‹K"ÑhÝŽ~]ÎÜO{eúØñõ9cbF¿‘Ïe³³ÛV>ðÖ*¯ZŠÒü–ŠÚå´¬ryÕZo|ºS½ÿÞ›šOgî/ýFæ~¦6}âÄ„CQB‡R÷Ò[ÉÜ» ˆ]‰|ªE£ß˜»W  Fo㆚.Õjëí‹—šOyu]ì Ìͯ/=Ÿ b—àá@æÞÝõ‰÷Ò¡Ã!±K`ÐHÏoîÈ™“£E©¿”šOGBa±ËÄFpé¤x@øÀ[Å¡ªËÅ¢÷ÕélüÔÙ­ZO-«bÉï/´•ø×3år9üYÄ{¨gqãn…ˆhû]"âèRŸ{*™æä¥©‘¯Æêo¯½þ܃\É4³¹¬Ñì¶KÓ¥Zm½ý 抩éní€Û{¨§ÖKͲi6¶}1M³Ú ס<³#Ž.µqNg·*"šËÕyñ€ð·Š~@/<)¸4MéRš>U[xRTìŠâè´Ã±¹;©ÆG»œªš¼™(.=š¼ ¶Ù§~iÅ‘òªéêvmY$r4bYVäHèÛ¿ÇëNçŠçÏÔÅÉ_OÓ°M—jµõö3¨ªZ,<*þºþÚ¸¤6Ž< ªjµQHÙ²TUmS9®nWu—«ÿí°x@øÀÛ>\šTda!cYÖ–†æJ1=Ÿ.<Î;UUiû¨m}ò;1ñí•é-Óý}ÕF—ʳ9¦.ÏHE®ßœ mmÀ‘ÿ¥:êíõǯ%ê§ýFüÆu£¿y÷tM—jµõö3ƒÆâR^*’¸™ ×&¦ï§¥"swRþ¾Z‘’·“R‘Ô|Úl×o^pÐH\OHE¦.Ït^<Ø1ºŠÄ®¤(OOf!¾—ñü±¨ëºæÒªŽ->Ì~-hÐ4—ÖªQHÕfYvùöÊtµ“zÓ—&ÇNMûj¬:ÃfôÙïÒ=^£Ï?}yºq‘cÇÇJfiâ?Ÿiƒiôù§þ¿©Vçø¦KµÚzûbg£#ÿ1ºð¿ ž÷õø•okÇþc4òÅ1ý=}úòdýœ§£F_ïôå™6uætôØñ‘x_"z:*W;-ìý|¼[öJ?UÅ'ËÙ‡ÙÂRÞ\-IEÄ.ŠÝ¡t©š¦éï랺£íÝ„ÙYG¥3x$\kì hòW}£Ÿ®|`÷Ò\.—_siÅå¢išR)+ŠÃÙíÒ÷ë.ÍéPÔÝRЊĿ‹|eÐ ÂvõáéTU§Ï'âÛÍÅÔ=^ß¿úWã|cЉ]Ýà´Ç×s}£;Èšë×®÷øzøæðŠìàžKai1y3áè¬õ+`W‡Ü?s“—&ë[Ú›¦»Ëý“Ξ |¼á‰›O'&®%B‡øÚ |¼*ÃG‡ãßlÞJŸùf&òÉfG¹¹_mŸMÓ´øÿ¬Ïfšf8v8îƒî܃õk$6›mêoS^WDÌsÀ°í³ üy vY%y+iÛg³í³yy~XàÈà úûºˆTï³,üï‚TÄó§öiäÓHôt´ü´»›85Q8qj"òi¤ü´ÿ̕͡+CÔ|J*’¼•¬¿"R?CâFB*’¼ lŒ÷á>èNÞLŠˆSu2ŒÖ˵9ÆJ³‰M?mª~ÌÕΗ>v>ŽDDdË=I|— 뺮ܼ"2sifêoS6‡-z::{c¶qm3—f®ß¸nsØ×3n%®&¢g£¶}¶ð'áÙïg92v!ݘ±;è °KìêîÕk­J]û]õ-LkïCGB¡#ëÝ~Œÿe¼úFíVïþãn«UÉÆ–-3ôþ©w1¿È±›qE Þÿ‡*ÀkS2ÍÐшçPOâF²ñÓòªù,¢éîÐÑHyÕÚòiõ>KãÍí€;qíºçPÇדžO§ï/x|=šîž»“j³ZîÚáï„Ø…˜ÑoäsÙìÃlã§Ñs“gþ+.= <!¶åÓê}–¦w[²ùÅìBfò\,vqj1—Í.d¾½2}ìøX›Õr×x'¤æÓ‘PXì2qb¬Ù§)¯®‹]C¹ùt竞œpt)Á¡@þçüÈ#E jO<íxµ€WÄNàµ1MÓÙ­Šˆær5ùtÅÔôÜ ©®³z,7-»ãÕØó\ݮҊéìVëš­QU5ŸË¾ôCò­°cÜvÁë4×R‘©Ë3ŸƒÆâR^*’¸™ 7Ê¥çàeûÕx[9]xñõù}ú?FÏÅ´ƒîø733—&g ^_Ïón´éjyÚÞ ]=°^:–¼){i`9ìu\fÔ#|àÕG]:ÕÔÙ½ÏØl¶Æ‰kkk6›­¾¯t@øx9j cKÚ y°§qÛ>ڪݎ±Ùl3_Ï8ÿàtþÁ™ºJϧ5M³í³%o­Zfšf0´í³ üy 6 ªÍf›úÛ”×ã‘ä­¤mŸÍ¶Ïæ=ä]øa£ÂÇ6òóÅB1~%>qzbáÁBa©0ûýlø“õޤ&NML^œ\+¯ ŽžŽÖ–RU5³‘ð'áéËÓk¿¯ÅÎÅ"ŸG8x×v?[Ú|Ôþ×f³•~+©ÝªTĶÏV~ZVº”ú4M+þZ»˜+¦ç§X,V?­Í9` (Š2þ—qŸ_Q”wáû¦ŸÀ›Rëçcox¡Ö(¦4Œ(¶¼¼lÛ×ä‘™ÚœÕË$Á‚"’¹Ÿñý›#cWQì"v‡ª*bßør+bš¦e•©Ø»Þæá¶ÔnµT,µÙEµ[½›¾+‰_‹CFé·Äî ŠCéR,ËR6¾D«b)v»Xªöª·ùi—ÀP ÿs^*¿÷÷úgpt'o&EÄ©:Íç± ¯VŲ¬²i– ™ôýôÂBÆ\)®_ö¨Xí—Ö¸7_º{îNêU”±éð¼%Ùò¦st à­ô6_ù˜¹4§ï¥=ôÌÞœmœ!q51òåHø“°ØeöûYŽ†Ý£lYR±Ä.…_ ‹ù¼SUÅ!v)¯Z%syýÆ™%Ž®v-uj=«ÎÝI˜Ë ¼ÜrúûüÃl‡3ÓÓ+ì™ð±¥W±Úÿ¶êy¬ö^íVïþãn›µõþ©w1¿ÈA° ™+EUu.æóùŸóú{ºÿÃ^UuŠˆU±Ì•Rq¥¨(kµäP´Íæ ­‡rYŽ+^òéŸ f°t2†Ý¨X\»4—ËßÛ«º4QQ¥Ku½§+v‡T¤øÛrɲ:\ap( ÍDJ¦:Ñtwèh¤Ô,=hÜñ«q߇þúû5KUï‰4½3RÙs¨'q#Y¿Ú꛹;)MwkºÛ fÌÕ>MÜLêoèH¸±TÙ\Î jºÛãëIܸ^èëõD¤ð¸àïósØ |/>–‹E±V-­[S»µ-ŸZ•²ØÅ4KÖªµƒ•GÏÆÂ‹K"Ñè¹XÓy ¿.gî§¿½2}ìøX«¥ª·QšÞL‰]ˆýF>—Í6»)sìøØä¹X±ðhüäèØÉÑÍ„ñcf1— Ž5”jìäÄø‰ÑâÒbôt´Vf£ßHÿ#-"é{i£?Èa€ð¼òªÕªóµËiYåòªµ³gnÓ÷Ò¡Ã!±K`ÐHϧ›Îsæä¨CQꯗt²TMj> …Å.'Æ?íý÷ÞÔ|:sÁè72÷3µé'&Šú8”º·uý™{wƒC±+‘CµÈeôs÷ªácÁèïå˜@øvΡªËÅ¢÷ÕélüÔÙ­ZO-«bÉï;Y¹išÕ–ªEiÕhÃÑ¥î`©ú™Ýªˆh.Wã§ñ¯gÊårø³ˆ÷PÏâÃ|mº¶ß%"Ž®&ë/™æä¥©‘¯Æêo¯½þ܃\É4³¹¬Ám„àEèô“‚KÓ”.¥éSµ…'EÅ®(G‡+œ»“ªµ®VUµ¼j‰HÙ²TUíp ϵ”«ÛU} ·é³¸NUMÞL—M^ˆ…?Ûì׿:syÕtuo,‘£˲"GBßþ=^—Ïž©‹“=¾žNÞáh>\šTda!cYÖ–†æJ1=Ÿ.<Î;UUéêèŒ[}ÔöÛ+Óë úäí¤T$5Ÿ6‹Ô|)»4m²4×R‘©Ë3ŸúûªíX•g/rL]ž‘Š\¿9ÚÚ€#ÿK!t8ÔÛë_Kl)UüÆu£ßà˜@ø^Œ¢x<=%ÓLßËd~Ì~É[«æò“ÂÂéÙ›ÉìÜÚåÔ\ZûyjŒ;>6}y²ÖÉGìlt69§t'o&bg£–¨éRAÃëëiœùÌé背¯Ïïû°IŸýÓ—&Ï_œÒt÷±ãcµH$"ú~—îñfî/œ95޸ȱãc=½~ï{ÏŒ¯dôù¥"G(Ø öÀÀrx‰öÖÀrÅ'ËÙ‡ÙÂRÞ\-IEÄ.ŠÝ¡t©š¦éï랺£ã›&»ŸvÀ½ƒ^ÈJ+fðH8sï.Ç6€=ðWýíXo7Íåòwù5—V\.š¦)•²¢8œÝ.}¿îÒœE}×+¨"ñïâÁ‡ €½…ð]}x:UÕéó‰0àpºÇëûW_âjœª@øxil6Û–¾Õ§ì`%À.´ƒ{.…%°'Ñà>ác·1WÌcÀ¶Ï6ðçZO M'Öœÿ¯óÑÓëOH&o%mûl¶}6ï!ï >ÖÙžU›>zrtøèðZymä󑉓m&VÍü÷L±XŒ]X‘+üIxúòôÚïk±s±ÈçŽ^ßÉ}7÷óѦÁ©óÎb¡¨t)–ei´Òo¥Vm6Û·ÿ6þM<³°9‚×€1 (Êø_Æý}þöU½eöV?€·I­Ÿ=|Û¥Úµ¶¢(æŠÙf¢ˆ¤î¤–W–—Ÿ,צÌ~?kYVð£ ÓéÌ=Èq@ðÚìÕð¡v«Õ!?¬UKíVÛL‘Ùë³±³±ñÓãõ‹ßMß-?-O_™6†èšÂÇvCÄ„T$y;س£éD» :œ˜Ïýsý"‡û ;y3)"NÕ¹íðèxS»(ŠÃårºökë/—¦(joÀÌ¥™ë7®Û¶ÄµÄÌÆÀ¡M'ÖL^œœ8µÞ 5q5=µí³…? Ï~?Ëq°KÇâPUŲ,ÙxY–©ØE¡c^ØËvõ_ñÆžIkSª÷M¶|ÚtbmcШ þÙû§ÞÅ<½Cîn˲Ī”‹ËËæo¥rÅrØ]×”ê.KìÛ i[˜{eº6ªí†pÛÙ¨o/èlô¬´b:»Õ=QÔwíÛÀº²eIÅ»~),æóNUU‡Ø¥¼j•Ìåj³b±ÄÑÕ.ÔþÖÏÝI˜ËRÍœ^Ð*Ðßoäf©:„ì^æJQU‹ù|þç¼þžîÿ°WU"bU,s¥T\)*ŠÃZ-9­ýõªàP@.˱ãcűã }¡´¬P‡îÕ±+[—Å.…ÇÍåò÷öª.MEEéR]ïéŠÝ!)þ¶\²¬W Heý}íŽÌÜ”¦»5Ým ³?æjŸ&n&u7t$\j8efs9c(¨én¯'qãzu¢¯×_x\‘Âã‚¿Ï߸õ¦K5Ýú³·SžC=šîž»“ªN)™fèhDÓÝ¡£‘Zñêï1ÕÞkÜñoâþþ·U¿†ÄµëžC=_Oz>¾¿àñ=S†g6q5îûÐßôÓÚûúÿŠHyÕŒ|¶¾ åU«ÃÚhZ‡M P­"Ï¡žÄdÓlº­¦¥*¯Z#_Ózý}Ù‡ùö_A‡%y®ï |¯1|,Šb­ZZ·¦vk[>µ*e±‹i–¬UëE¶rìøØä¹X±ðhüäèØÉÑÍóÜ™Å\6üQ8v.¶e‘±“ã'F‹K‹ÑÓÑèÆ§F¿‘þGZDÒ÷ÒF°qCM—jµõzù|>ûcæÛ+ÓÇŽU§DÏÆÂ‹K"ÑhCñ¶Pλ·ç:ÜÖ3gúübv!3y.»8µ˜Ëfž)C½Â¯Ë™ûéVŸ®›¿>’º›5Ñs“gþ+.= <¡ÓÚhZ‡M »3ú|.›mq£§é¶š–*z.:*äÏœ;±ÍWÐaIž÷»ÀëS^µZu>«v9-«\^µ,«ü"›èý÷ÞÔ|:sÁè72÷7;À81áP”ÐǡԽô–E2÷î‡bW"‡jÑÇè7æîUÃÇ‚ÑßÛ¸¡¦KµÚz½Ñ¯FŠRÙ&}/:»ô|ºý†Õf1l«^ôä„£K ò?çG¾ØZ†zgN޶ù´©Ô|Ê«ëb—ÀP`nc¶-aÓ:lZ€Ô|: ‹]&NŒuþ½7-Uz>4Ä.ÁÃ̽»í¿‚Kò¼ßýèÍÛ IDAT@ø^‡ª.‹Þ?zT§³ñSg·j=µ¬Š%¿¿ÐVâ_Ï”Ëåðgŋê"¢íw‰ˆ£Kil©P2ÍÉKS#_Õß^1zý¹¹’ifsY£Ùm—¦KµÚú3{ªn}BÄ4Íjžp(ʶ )j r;ÙÖ–YoÖ¾U¯£ë¹Ÿa1WLMwkÜÞC=ËËË–°i6-€i®?Y£¹\ïMKµlšŠZ}–äy¿ €ð¼&ú½ð¤àÒ4¥K‘J“{+…'EÅ®(ŽN;›»“jl]íTÕäÍDqéÑä…Xø³ÍñK+¦ˆ”WMW÷Ö³WähIJ¬È‘зןã=x¦.Nöøzš6€mºT«­·§ªjµEBÙ²Ô†hRjGv¶­Ôª0ªª Š¿®¿:,aÓ:lÊÕíª~ƒ¥•稦¥R»ÔÆ+:í¿‚mKòF¾ €ðt>\šTda!cYÖ–†æJ1=Ÿ.<Î;UUéêhPÀꣶß^™Þ2Ýß7Pm¨<{‘cêòŒTäúÍÙàÐÖù_ ¡Ã¡Þ^üZ¢~ºÑoÄo\7ú›wÕßt©V[oÏè7’·“R‘Ô|ºÖoØeîNªlYS—fš.µ³míPÓÂØ7³ˆ1h,.å¥"‰›ÉÀáp‡%lUó‚ƒFâzB*2uù9j£i©ŒA#}?-™»“ò÷ ´û :.Éký.ÂðÅãé)™fú^&óc¦ðKÞZ5—Ÿ~HÏÞLfæÔ.§æÒÚH¬pW_ÇŽM_ž Ö÷¸/""Ó—&Ï_œÒt÷±ãcõÑDßïÒ=ÞÌý…3§Æ9v|¬§×ï}>¿T¤Õ©¨éR­¶Þ^ìlt69§t'o&bg£Õ‰ÕFŽ=ú=õVhº­gºb{Iš&0hx}=µ]ˆž‹iÝñoff.MvX­j¾Ñ™ÓÑ…_Ÿß÷¡¯óÚhZªØÙhü›¸vÐ}þâÔôåÉ6_Aç%ÙÙ÷¼eÖG¨ÏýbiJ±Í|ã§&¦.NºöëTÙž¶ü¤àÚ¯/?)ì‰ÒŸ,gf Kysµ$»(v‡Ò¥jš¦¿¯{èõåwš¹³ž(K+fðH¸Ö&q¯ˆžŽÆ.Äøwà5ýU·4ßûÊî½ò‘ºrþÁi5öâPMÓ®o<åß2RÙlÏûiûEðFh.—¿×ïï3|>¿~ЫÐu]÷z<=ø<º¾ƒ¦Ž¯JEâßŃ=WÃJ£ôxvi§Ã}¿ž¸–ùr¤~züZÜ©:‡·_¼qPìÑÃÓ©ªNŸOÄ·›‹©{¼¾õ%®Æ÷\GOŸá(@øØ;;9¶%|L]œŠ¶½É ¼ Üs),1H!<‡ÝÛà4p8 v©©Û©Ú”êûá£Ã¹¹_mŸMÓ´øÿ¬ÿÜ´ÙlS›òz¼Rw¥éœ"’ûgÎëñfÃÃx¦iAÛ>ÛÀŸjmÑ“·’¶}6Û>›÷wᇎÞÂð!"Ñ³ÑØÅÍÖp±‹±êeȧ‘èéhùi9v!6qj¢6ƒªª™…gz l5çÌ•™l.;þÇë'VMœš˜¼8¹V^>2=½~•%üIxúòôÚïk±s±Èç<šÀÎíö§]¼‡¼‰« ß¿ùrr‘O#‹ùg¯oWĶo}l6[ùi¹ÚñƒÍfÛÚìãÙ9‹Å¢Ëå’Š85gé·Rý"š¦-Š]ÌÓsÈS,EdÀPeü/ãþ>ûÇ;w¹½õ´ àm²ÛŸvÙ¼Úq6V}0v!Vkía®˜Ñ³Ñp(ì>øL/]NµšÓUííØÞd¤ïååeÛ>›ÍfsþÁYëeyöûY˲‚NgîQ°s»=|„Ž„òKù…òù|í!cȰ,käó‘¹Ûsío5gµ©‡eYýg«ÝêÚïk5µ‰wÓwËOËÓW¦!ƒã€·6|ˆHìl,t$TÿKþ§|d8âïóÏ\™i¿l«9£ç¢R‘ô|:üqxË"¡@þç¼T$~5îï]ÂÊ}м™§ê¤Gd^„}÷1t$”¸‘¨ïÛ#ñ]"|$\Z)mûØm«9CM×¼ï\r뵓™K3áápú^ÚóGÏìÍÙõõ\MŒ|9þ$,v™ý~–〣{õwËÞjpªØEìUU6‡Š­ˆiš–Uæ«€=§ÖàÔN]`÷†Å¡t)–e)Ç©U±»ˆ]¬ Õ{á»UŲ,±*åâò²ù[©\±vE×5EQ«Ÿn^iæ™ñZíòí•éÚ¨¶;:ng£ÍíEïΞ |Ï([–T,±Ká—Âb>ïTUEqˆ]Ê«VÉ\^¦ÚGW»üQ;‰ÎÝI˜ËRÍœ\€ðle®UÕ¹˜ÏçÎëïéþ{UÕ)"VÅ2WJÅ•¢¢8¬Õ’CÑÚ_ÿ¨ ä²;>V,;àÍû?Tv¡bqYìRx\Ð\.o¯vÀíø§ã_œN§æzOWì©Hñ·å’eu¸ÂàP@6š‰ÔîÈÌÝIiº[ÓÝÆ`0ûc®öiâfR÷xCGÂ¥†Çª³¹œ1Ôt·Çד¸q½:Ñ×ë/<.ˆHáqÁßçoÜzÓ¥šn½^ÓÊ«f䳈¦»CG#åUkc¢5òÅ1ý ×ß7}˜¯N,™fèèúœµÑ¸ãWã¾ýšîž»“ªŸÓs¨'q#Ù~ë@øÀÛ>–‹E±V-­[S»µ-ŸZ•²ØÅ4KÖªõ"[9v|lò\¬Xx4~rtìäèfVø1³˜Ë†? ÇÎŶ,2vrbüÄhqi1z:ÝøÔè7ÒÿH‹Hú^Úè6n¨éR­¶Þ¾xÑs“gþ+.= <!¶11:*äÏœ;1¶>ñl,üQ°¸ô(2‰ÖíHá×åÌýô·W¦_Ÿ3v!fôù\6û0»måáo­òªÕjµËiYåòªõ‚ÏÜöþ{oj>¹¿`ô™û›CNœ˜p(JèãPê^zË"™{wƒC±+‘Cµècôs÷ªácÁèïmÜPÓ¥Zm½}ñRó)¯®‹]C¹ùõâ¥çSÁACì<ÈÜ»»>ñ^:t8$v éùÍ9srÔ¡(õ—‚RóéH(,v™Ø.x«8Tu¹XôþÑ£:Ÿ:»Uë©eU,ùý…¶ÿz¦\.‡?‹xõ,nÜ­m¿KD]Jco¶%Óœ¼45òÕXýí£×Ÿ{+™f6—5šÝviºT«­·ŸÁ\15Ý­p{õÔÆZ6ÍÆ¶/¦iVä:”gvÄÑ¥6ÎéìVEDs¹:/>ðVÑè…'—¦)]ŠT¬òïåÚ«:CáIQ±+ŠÃÑá çî¤[W;U5y3Q\z4y!þ,²™VL)¯šCÿDŽF,ËŠ }û÷xÝé\ñ|à™º8ÙãëiÚ¶éR­¶Þ~UU‹…GÅ_×_—‚TièøDUÕj£²e©ªÚ¦r\Ý®ê.WÿÛañ€ð·+|¸4©ÈÂBƲ¬- ;Ì•bz>]xœwªªÒ¥t²¶ê£¶ß^™Þ2Ýß7Pmt©<{‘cêòŒTäúÍÙàÐÖù_ ¡Ã¡Þ^üZ¢~ºÑoÄo\7ú›:Øt©V[o?ƒ1h,.å¥"‰›ÉÀápmbú~Z*2w'åï¨)y;)IͧÁv£!Äõ„TdêòLçÅ€½>z|=×7šú×\¿v½Ç×S}o³Ù^ʆjëyY+Äë¦(OOÉ4Ó÷2™3…_òÖª¹ü¤°ðCzöf2û0§v95—ÖªQH•vÀ]};>6}y²ÖÉXÍô¥Éó§4Ý}ìøX}4Ñ÷»t7sáÌ©ñÆEŽëéõ{ß{f¨£Ï/iuŽoºT«­·Ÿ!v6=ÓºãßÌÌ\š¬MŒ×ºÏ_œš¾¼9q69§t'o&bmGA:s:ºð ãëóû>ôu^<ØùiúuŽíb³Ù|ÿæKϧkMÓô÷ùó?åkƒ×¿¬ðQ]aí ªöÖØ.Å'ËÙ‡ÙÂRÞ\-IEÄ.ŠÝ¡t©š¦éï랺£íÝ„ÙYŸ¥3x$\kì hòWýMíþ(œ¸‘ýõ'÷סCç:ÏW‚&9Àåòwù5—V\.š¦)•²¢8œÝ.}¿îÒœEÝ-­Hü»x`0ÀWxÝm>†Ç¿Ùls7óÍLä“Hý‹ê›ä­¤mŸÍ¶Ïæ=ä]øa¡:Ñ4Íp(ìp8Üݹ¹ÚÄ` hÛgøó@›;Ó¹¹_mŸMÓ´øÿÄk››ùïí€fÛgKÞJ¶Y¡¹b[&ÖßÓi_rì]œªÚã󇑣ÑOGÂG†~C?¨;ºÔÝÓ=¯îñf²ã'è veøÐß×E$÷Ïœˆ,üï‚TÄó§É’OÂÓ—§×~_‹‹E>_O'§&"ŸFÊOË“&#ŸnNœ¼8¹V^>2=ÝòÆväÓHôt´ü´»›85Q›^( K…Ùïg߄۬pôäèðÑáµòÚÈç#''Úì`Ó’cÙÁ=—ÂÒbòfÂÑYëWÀënó±¶¶vþ¿Î-N_™>öÅ1]×ÏüõLcc@Q”ñ¿ŒûûüµF…𦠅-m 5M+þZ»˜+¦ç§X,Jû6±íÛü´T*U ÔælºBçœÅB±:¼»v@+ýVÚ²òö%ß=öV›À[õën£ÍÇxÔvøèpâFÂ\17ÃG‡›Î3ûý¬eYÁ‚N§³v‡eye¹ñt¾¼¼lÛg³ÙlÎ?8k}.52WÌèÙh8vt×Ooìÿ é ͳúT§¢(æJ»Ç›–Լ𡿧ëïë#_èïëÕ»0ÔnõnúnùiyúÊ´1dl…J“9×~_«iµQcȰ,käó‘¹Ûsí‹×t…j·ZímÂZµÔnµ1Ù´/9x“áCD"Ñä­dd¸e“÷AwòfRDœª³ÖÀ30Hͧ¤"É[ÉÚŒÀP ÿs^*¿÷÷ú[­0ÿS>2ñ÷ùg®Ì´/[Ó†‰ ©Hòv2Pë.Â.É[I˲¢ç¢íKÞtø8‘V÷\D$q5=µí³…? Ï~?[8sifêoS6‡-z::{csâØÉ1›Ã6ui*~5Þr…ß%ÂGº®ë·i¶Òt…3—f®ß¸nsØ×3½@V›©jšæ;äk_rPóZœâ£Á)àMy“ NÀ»ÌN`RUǶ*[–e­–­ µ{ W>°YVYìJÓáéEdý£Š<€ð¼%Ó‘å'…ÔíTã«ðK^DL³T^µÚ¬¤¸¼<òÕ˜îñêïÈWcÅÖÝÀTiÜo`O[tÓ´0µ‰µ~ýod_¼*^Ä.ßå׬ýAµk¿ÊmK¸ƒ{ý áx%Ì•’ˆŸs?eÍÕÒ–—eY"RZ5Û<Ì\^5c&Çÿ2Zx˜]ü19Š]œ,¯îº‡ŸýýÍ;ƒÙA/ïÛ®ÿe­ó5W^©WqT¼©¯ò÷…#ðu¢Ívåà’Y=<}ÿÚÓd´XEó·’ìkÙ.dêJ|äÓˆ×ãG—ƒ†ÑoįÅG>Ù]1ëw³‡:›¡_œ·çÇÃÞü*9_'®|`7Z^)Šˆbw(Š"¯j@Y5å÷–·]RwR[ût±ËìÿKUßjÜñ«q߇~MwÏÝImYÖ×ë/<.ˆHáqÁßפç:í€;þMÜß? "åU3òYDÓÝ¡£‘Úm ¹;)MwkºÛ f\ïe¿qÎê¥ÝöÃK¦:ñêIÜH6ÎÖtë[VÒxQZ;àN\»î9Ôãñõ¤çÓéû _O}U´_­ˆ”W­‘/Žé½þ¾ìÃ|}Q«K•6þŽ×ï]}¶Ôÿ–¢6-@}µoþZíõŸ,‹ÈâüvÀÍåD¤°T¨õ8{;å9´ýÞµ?$D$›ËCAMw{|=‰×_°NÚ×ÿ¶34-LÓ]hüÔ×yÓƒvÛƒíſʦ3l[ì¦3ñ^:t8$v éí Ó¦þÛ VíÏœîeD$}?=òùHº>î-ÔÂÇèWî]û"eîÝ Ä®D>YÍÂñsÕIûúßv†V…iÜ…öÇÏ31®ÙAÛÉ—ò‚_eÓ¶-ö¶3´_Ó/«©Nþ`hóݨôtû›¯æj»€¢í×Ê«Vý‰ªdšú{›7b]jË?7½þ±ãc%ÓÌæ²‰¿O7§¶fsÅÔô­—jã_ÏŒ|9þ,¢Ø•¹ä¬÷§Õœä0ÓÙ­Šˆær5ùtGë‘ê:«¶œÎ;Yí²i6>mšfuUEÙööy›úoS€Æ¢½þ‰SeËÊý3ÿz¦§7^^µ2?f¾½²þÅ5^k½òvE*™füïñüÏ…|‹ŸÚÏU'íëÛZ¦qÚ?Û´/^oÛ~•MgضØÛÎÐ~ýM¿¬ÿ5ÀÞÉ[Ép(<›œ }j:ƒÍfk3>í«ó¦¶‹&—(6~Ì9Zý¨XÖSKZ_ù òKùßæ°;…¥B“¶«-þly>ðL]œìñõlûJUÕ|.»å_’SU“7R‘Ù[Éðg‘|.ÛjÎm¹º]¥ÓÙ­6}|qgëÜÖ¶«U»T©lýû¡ªj5ð•-Km8å—ž§5_çûåèR<ïéñ¿Ç}øœªêûÀ7ueÆ÷§éýE*-r4âïóGŽ„\øsð¥ÔÉŽm[˜ŸmÚ¯·í¥f3l[ìÎ÷«éú›~Y/þ×{·]f¾žù|dæëjí®jX–æréºÞ¿–XÌç¥"R‘Å|>~->z¼ÓG]Œ~#~ãºÑÁ£wÆ ±¸”—Š$n&‡ÃÕ‰þ¾jã;¥kó÷nÓ9žÍY98h$®'¤"S—g:Üú–ߥçoÿíjA#}?-™»“ò÷ Ô*-y;)IͧA£V€¹;©²eM]ÚîŸ|]Q·ß¯g¿¬™¯ãFŸ_Dü}þøÿÄ>ãEö®©ü/…ÐáPo¯?~-ÑjµÖÉ Û¶0?õš´;¬·çù*›Î°m±;߯¦ëoúeµúÇÒù_ìÞðQx\X|¸8}ezñábµ 1Ш¼jY–¥t9Ôn§µjV_bYÕWµŸêÛü^‰žž˜úÛLµ“±©¿ÍDOEÿô4úüR‘Nα³Ñ蹘vÐÿffæÒduâô¥Éó§4Ý}ìøXíúÓ9ƒ†××ÓfýgNGd|}~߇¾·þÌ íÖßùNm™!þM\;è>qjúòdmâlrN;èNÞLÄÎF««í{>ô{¶Pº¾¨Û`˹Á4Íê“FŸß²¬öç‰çZyÍô¥ÉcÇÇzzýÞ÷ôV«í°N^ܶ…éðøÙ²Îƃvgõö\_eÓ¶-vçûÕtýM¿¬VÿX:ÿk€Î½îQm£§£VÅš¼89qjB±+±¶ÇæŠþ$œÍe'/MûâØÚÚš[wß½wWO/<. ”Ÿ–'/LF>Ô&N^œ\+¯ ŽžŽ¶Ú.vƒ‘¯FCaý Wsi­^þýN§óU¨ßÅÛ4Ѹ«/¾)à-·Ý_ì+É[É™ÿž¹›^Ïþ>ÿÄÉ‰êµ MÓòój·ºüdY; ­­­¥î¤âÿŸMΆCá‘/Gªù£v4Øö­—Üf³•J¥êeŒZ‹QMÓ …–aQ5M+þZ»˜+¦ç§X,6Ý.W> ôúþÕ—¸oÓh °ã+¯5| üy`ËÓÿÆ q÷wEĶ϶öûú‰¿š!,ËÒh¥bI;°ž$Ìsòòdþ§|.—+<.ÔÂG-1ÔÞׯm3gÙlõÿÛ8ç»ð´ áðÆÃÇë»íRmjºöûZM¹\®5;uu»–——EdycèQEQz|=c'Ǽ‡¼ÕkÆaYÖÈç#sÏvqØHUÕÆ‡0Õnµ~ëÕ‰Û¯Ôë ñoâ''꟫VeìÄXü›¸ˆ„?W›€Äêúß fþ{¦vÃ%ÿS>2ñ÷ùg®lólU`(šOIE’·’îƒîÚÄüÏùj»“Ú¸M· ö~ø¨HòVrô?¶Ž0þŸã×o^—ŠL^œÌÜÏhºV‹Õ¸Pû¯ˆ$¾K„„u]×·{foæÒÌÔߦl[ôttöÆlmâØÉ1›Ã6ui*~5^Øt»àÕyÝÚâÍ¢ÍàMyCÚ€wá>á€ð„@ø„ |>á€ð€ð@ø„ |>á>€ð@ø„@ø |Âá>€ð„@ø |Âá>á€ð„@ø | |>á€ð€ð@ø„ |>á>€ð@ø„ |Âá>€ðT |Âá>€ð„@ø |Âá>á€ð„@ø | |>á€ð€ð@ø„ |>á>€ð@ø„ |Âá>€ð@ø„@ø |Âá>á€ð„@ø | |>á€ð„@ø„ |>á>€ð@ø„ |Âá>€ð@ø„@ø |Âá>€ð„@ø | |>á€ð„@ø„ |>á€ð€ð@ø„ |>á>€ð@ø„@ø |Âá>€ð„@ø |Âá>á€ð„@ø„ |>á€ð€ð@ø„ |>á>€ð@ø„ |Âá>€ð„@ø |Âá>á€ð„@ø | |>á€ð„@ø„ |>á>€ð@ø„ |Âá>€ð@ø„@Ô=jCŠIDATø |Â@'ìÏ5÷ò“U^GøH\Ÿ¥²Àë \ó/m>á>`ï±S¼ˆÂR!ûS.—Ëfæ‹ËÅ·r5—ÖsÈãóõô|àÓê/¸6ÛÚÚšˆä~±4¥ÈÀsIܸ>yyúÚå‰c‘£Ã;X°hi¾÷á¶ ;6~:ú®%™¼<=~:ú"kà¶ `劈XRyKwÏ."Šãùχñ«ñô½tõ½÷7ôq¨çP«[}++iyÅÌ>Ì&o%.ŠHú^:~5>òùÈÎÖÆm@ëØaYVEDD±‹CQÖÿ·²>q«XÏæE±‹¢(Eép‹ù|ä‹õSïȧ‘Èg#ïH-%®'â×Õ ‰¿Ç½Oçë«ÝváÊ Õ¹GÌU«îò€8E,K쟢w+«¢X–eY–TÊbwHŲDËUí0äþ™«^,ñò†?‰X–õŽÔR8ÎÿœÏå²ÕJx®ð±cøÇhþ;Õ4-ËRìbUÄQíŠTDìÊ[°kŠXJ—bŠX«år¹ìp8DĪÈòŠ©»\œ³Å!"ÁÀ»VKF¿‘˜»d.FŽîdÍ484Wú­X=Ù”Ëe©”ߪ}³+bWEQ‡T¬òÓRurùi©dš´n),å«+ÑßÓßµZÒßÓ-»ˆ(…¥üÎVLø4·Þd¡R–ŠUþ}½€Ã.ûÛ¶›VEª¹aý.ƒX,U=-¿‹µTÅ®ˆ";nÔÂm@‹óͪ)Ngùw±,kKû…—{f-¿‘†™K±‹U½?R±Ê¿+»X–UzZRUÕѵÍÒŠ}s="òNÕRu—{]%>/'|Xåê)ǪÈ[ûœíÆÏz¥b‰8,«,•Žž•u8”×PKžCÞÆ‰ÙÜâ¯%EEQûvØ´…ðhñSÛ²¤R®>5*¢TÏ=eQ^úoú7î¬?JZ±¤bYÅQ)—-˪XVÅrÈv§U»ãU×’vÀ=·0»~âj•Ì’ˆX–Õãó¾¾üÑ¢–DÙ§Ô*ðxI¿t-«ö›^©uùP±Ä®4½àÖÝ"ò¨ð¨qzãÄ7¯®‹TÖw¹µ;Ï[KSUEDô÷´Ìýl­`¯{옵¤ØÅñ·]hp h>Ê¿¯7*ܶ×,·îÎüçø·2ª¤~úÜ``ËÄݲƒu;eUÖÛmtzëÄ®T_ÏUK;Px\ì<½¾ZEıã'йòh>6­”eã6„U¥Åà ¥ŸóšC©ÿ¹ì>è½{tÄZ)nù ýÌÉu©½[øßUUG¿ùbäÕí‘û ÷ÑÒâæ9uó÷ýúnîòs\ùx¾Zzîð±ThABD–—‹± çÓ÷2"bôû£§Ï¸\Zã.W]ÿ.Q4Íñ£&¦µd§Á)à(—­&ç<»²õœ$""‹ùE¯Ç;7øöO†û ·ú¿Õä‘)›.""Åb1üY$z::óõL±Xœ81!¢D>‹¼ÚßñµèЇšìr«ð±ñdËsÕÒ¶ü½=™…lã¶¶\ü¨_³µjÅ.N|9»8)É,d&/ÍDOG•.¥qæÄõ„iš£ÇG;)[›Zr8ÖŸ4ÞÙ·Àm@«+Vµ™aõ ´Ñ¡Å6·ª?jÉ#_*ÿ)·˜oÞ@2~5>òéH`( Øý€;KÞJ¾Ž][oºùf½Aeç78ên»ì –Z%ÑS£þÞž&_Dk3ßÌDŽF<bWE1úØ…Ølr¶qÎZòx µdw¬×áðÒ/4™R±š¾fƒó)™ Ì ¬•b±lMb™f}>¨½o¹ƒ¨v#æ°?w-µzù{{wË¿«)¤1‚˜+¥ÜBÖ*Y[Vž¾—Ö¸¶¬-u'µe—ßÅÍ•åѯFž¯`-jI©Ž¢GƒSÀË¿ò!"õÝ[=çúc?¤fÛÌP\^Ö5½éG§££_dÌNœ˜ˆ]œªM/<)¦n'§/MŽœ¨N‰]š dÌŽž8­MŒžœXÌeƒcòòd›Ÿõõ;øO»(ŽêëÅkIDü}þÄ„õ´ä: ‡ÕWàp ùÝln!›Ïå‹‹ªËŸl}ڥ𸠪Î-ó?ç·\óHÞNu~ÍcÛZªŽ\Ýfhóh®¼¥õåæÐ¦Í/¶÷øz6›—ŠçSÙ\v›Ó°]1+–Òl…³·Öo¢g£µõŒ}5&vÅßgHeýGyú^:z*j‰ý†Ño¬OœOGOG­Šôþɘ¼<3q*ºõÚÆúUr»]n[òõEVKÏUKŒ~âN¢P(HE´ýš¶_Ûr~VD¬Šò…äµÙìB.}/³¥V›]œØ @ñïæŠé9èI\Ÿ ~¾ƒ U-Ù•õ;/„ÀËÔÐÒpó†Bão÷^}òèðB‚æÒ K]߸øQ‘¹ÌA)•JÉ›ÉÂãBµ½Èæªì›ï«oÌÓªl}DÖ4Í_OcI¶)R幜>W-5 ‰;‰b¡°õߺÿ5W­üÃÅÂ/…ì¹Ôô–]Ð÷ë¥ßJŽÙ¼Q~ZÖ÷ëµÙ ¿&NMHEFÿsT×uo³^SŸ÷ÀPÖœ£Íà¥jrž®4¸µ–<ò¥Rp>Umù1ùo½þ^ûMø>ôeîgjÿ›YÈ$o®7889Q®”C©KSíW¢ªjc窪fîg2 ë¯fgÐ&ûò\ŒU_×RËäñk±ÍVÍ•RöÇl-y4»pb?ó8náq¡·¯·ö¿§&ª¡-v.vþâùÒo¥çÉ-jéŵ%|Z„Jó÷ë'¤—¿×ŸùÏñjò˜x°¹WDŠeËãt6μå9N\‹§ççÊåÒâÃlìb,2ª~Tx\0úý¾<³7Ïœk‹o¼÷÷öd~ÌH¥œ¾— Õ&–¥Ržû³#_Ž4_¼ýn¶W{Ú¥³ZjúJÝž‹ E’7SÒ"ôŸ³¹|áq1ûc.u{®éJ††’·®ò‹R.K¹\È/^¿y=r4ܸËN§ræäxô섔˯]-ÙåEžvá¶  Õ¯Þ†~qì[SSú9_MwÓwË¿ËÝôÝc Ú燿oànúnË‹Ý®è¹ØÌ•™è¹óªªŽ|:Òû'£ºòñÿ;=3MsäÓ‘Ú¦ëßÔÞ|9»›85ár¹¢§£›ÏÅþÿöî´+Žãø¿ðÿ2¼-TÐB-DС2Í`A†h«B†Út*J¶6KIèèD‡à¶PÈâ¥%£½™n›¥Dƒ^ .4 ¡…t¸9p‡'ËöY²tò¥uäïcË'éäûƒùÿîîݻ޳^ý­úoîäÞ>Ú[™²É“Xk‹Vi¬Í­íµÕkñ(H®'÷Ÿ÷wwvûöwŸínnmO\›ÑŸ¹þãzï·žˆ4?lÞü⦪[±ú¥Fûj§ûÃw·¾º5}'WɪUÕÃ">åù˜0ú2×cÔˆŽõÎ4Ôìô=ãæ͇ž\GÆÇ«Ÿ¬Ž>ëèçŒsë÷ò׳8çÖ¿Ï/½eR#/0éj¡*MÏYè\o‡L’¿ü5Ø{ÞOúÃäqúÜë®{·;ö©“ɯs½Ó‘Î,Ø)UR£¶bçóAøLî=FŨ5©šÓºéÉ7)‘äÄ×L]ÛK¥æð$Âì‰ÁÌ:{•¦æ5DÿòøèXŠ©Écl K/c®JNÕUu4‰*áP’,ØŠ æ}÷,Íï?Χ³•"§]Ž\ír–*åòGãý†šéã¬á°JªqªùV€SÀxñ:5"Æë= ápCŒŠ±ñ`C‘éÕmü*±J›[Û³œd9Uª —Ì·ZŽ|&„lØuÔ„ÅÞR5RôVp.wÛ¶’ªt®’Ç)Uòj}ÕrÚP~³IÓ ª!hnox¾‘ çMÜ­=UU m”VÝE®’ª“ªŽŠ@ø”>TCÞkЃ{·Ìë°0'_ÄX1!nQ’ fŸ5Ë{ˆ\Ì*iU]U½÷ó­1€ñêï5âÔ™q"íx±ÅØ› UÕªUõK*"{ìù7j3î•»áôâZ»~áªäUk+ê¸ÔP®µ¯uïvëß®û%µM_ oΞŠÚŠÌ=Øð\ÈR‰·†WõK2IÿI6~zÔ¹Ú£³ÿ°U•«´Ö½w±ªÔ¾ÒrªZõ–1€rµ.¯t>êÜþúöÏ>m\jxïR92¹Å‹ôÕÝ´Ã"Y!}ÚëݰÑh4–›Ë^g5<^hÚº²ÒÙ¹XUj]nyçܼÉCD^Ûßß‘Þ}þÓ9¿>y²ñó£Ý§É`PàÖ'¯5¢UW§Þ^i-7—sµZÍ;Wtßœ*Í¢jÍw•ð˜A&É`0H’$¨\¸æçîôªÎû9z*U*>8í˜Þu¼sZÕ7³°x»õ£{1jÎß©R‘ÀôvaЍ¥Té̸Ô>á€ð„@ø„ |>á€ð€ðð’˜ø#HØ ~“Åe¹ßƒˆæ WÕaÚÈ$dñi€30²“ä |ôkTŒ¨ª ¢'_ PDP#A$ aLøA‚G>„.  Ùð{ÈÆ„4 Y*b  Ì’¥!>$ 1›„ã‹ÎÊùñ/„Ðó,² ÜIEND®B`‚kildclient-2.11.1/doc/C/images/we_macros.png0000644000175000017500000007674511405233117015540 00000000000000‰PNG  IHDR‘÷]§| pHYsÚk¥óÎtIMEÕ '+»_ž IDATxÚìÝy\TÕûðçÎÊ2 ¸‘¥&Š Š”(j©%.à2.eFBšm.˜™†–)IFøõ§¦¸d}EÜ0435QBQqÃÜÙ†}˜™;÷÷Ç­ûqAGý¼_½zÝyæœ3‡s¯ó̹+ãçJd "Žã†á8ŽûmÏ:zØ Ê Ig47KX‚§…TÌô|AÖ½¥Œˆ q"†Á°<ˆ²«?s¬1pÄX–%–8Ž3°Äô x‡ãXŽã„¢~YÛ=8rY{à¢VÇrXOŸæâ@O+g…HÏ’ˆ1ˆD"Œ À*½²]Är–5èYÆÀp÷¯œ-dkÖ@¹úsyúâ*C~¹5ÜççYIéí—mì¬DûÎU¹¬}ˆÉÉÝËå5j¤×ë+Ýz<ßm`­Å ¯ž)<ø}‰ÜÝgØ4¬þe-e&øÚ6²fŽ_Õî=«AÚ¸'vVŒ½ó¼“ÄÓMÚÈúï–ŽJ/meX8ÆÀH†!b8ŽöC܃ݷ••è\žþ÷KÚ‡û·µyeÜõäè!ƒƒÄbñΤä‚ëm›¶1)S]¡–\NaEò¶¯¼qß?; žÊ«¹ Ç+Ã{Øz»Ë^ÒVT³HÛõWRÅ•Tѵböð_Zᘣˆ¡?Ù oÑ.†8†8¦÷À Ǧí^Í×yˆ{°meÌǯ*X}—V^\ùðsfÉ­Üêã«}_êÊqÜÞƒ™-Î’YÛ½ÏÝL]jÇ•7ؤ­¶†G#¤³u×Ò×´)§KÅRƒcÛ÷E8æHDKT¼Õtˆå$ Ãýýźï\õ¡¿jŸ·k,öj*ndÍØH©RG..˜›‹·v‘љۺüò™äÚº¶*rëu4#ÍÅÙ¹¥«]Nòÿy ú„þI7þØÜ\^~¶ºUÛ6>ú:>ÑF&‘?—Ô,0ãça¡•³äµ¶ò¿Wef½nç`-Šþµ,¿Ü Ѽö21£c¹Ï“JY¹(DýìÔU†)ewý‹„O¹kÐbýz¾ºk iKgqµV#IDb1þá€%èßFâÕ´^ßHY7Ù}ô½ú•bví•á=lY3ï÷¶ôý+?õÝ/!¢ý»âˆ(ç¶þ·ÜêšõŸw¤ö¹VN"{[±F«¯ªÖ³¬¡¹-×\AÏ5¢œ;tµ¤ö¹T Gº©g uÞYS/ÿsIçJsÏŠD"Yuõ¥C›ŸóAD…—Ž»Tåüy‡:„¨îúé&sÁ©ÛŠM Du`·âHDüÿøÏG~¹‹÷R¾k ÙÙ s]'uëä!3D$3G—Œèþ“»£‚ˆ~Ùž°âȰ•§êóGEu¨µ5ƒèN[Pnhb/&™N¯•0Ø=¡¥½–Èša™T¬g ZË Žã82 ,k`ùD-íÖÀXBõòjî¿Ç*ßíi+Ñ{½lƒ¶w“ð…X%ÑÔ<èÛÜNß­qµ£µX,‹ÅrÃ8ƒ3g0pnÖz{W]•V~»BRs€Ü%Dt¡@¯kÈk»žë;1'!BRy›ˆ Y[%v®vM=è\âÙÂÒç¡ç$TOÿ`óÿÒ¡µTêk£´%çh„àâ`‡ÅF§Ö_;uðÃ-j~ùb>ÛµõêÕë§£GFõí ”y¥w¯¬œŒQ>¯ÑÁƒ›{ö ô´îÞRÆ0tø/íŽì*GK†;ѹ;z+ ³8µÌ|tOÈ%rW‹Yg…ÈE!¾™¯%v€E(PWˆ†1Ör©½•X$2 kàô,«Õ²Noàˆã¸"ueµF"‘YYBõ›%쉺®-¤í­ì& ?É®k¶R\*“ØŠD""Že ‘H.• \µNo0p‰X,Ö;‰K®³JªñÕloÅQQ…åòú.‰ì¹€—·Î”pÕ"Æpýp¼Kc7¦²È±Ç$‰M£z~´q±!¬^p’L›½ íóM©ëx“9ÿ‡ÏCïm*"¢óù:"ë^½z}ýÃç/ºN$¢7Ž5ª_¿~;¾Ýþ‚sŸ³§Íû¿¾/Ê,O¸uîè¾[|6cï)Iw¾ÙÙ“GŸÏÓæÝ¾±dø13}hØa|xøsœlD—µ:‘ŒcDÈÙðøå—9ÚÛˆ Œ†tr©D.•° q‰Ž!bÅ}µ!â8Ê/.+/eJ7 ©Îs$¢û»þ=?>uS_ó¼3GqY#q•D¬`YÇ‘#‘X,’IÅr½¤´B#‰l¬äŽÒbk¶¨”QšT‹"Òè<ÓH5kôòÛ凗W²N*•kn7íïܬC='¦Æ×¦‡o,nï*%¢¸ÿ|ÝgÂâðºk…Åñí_+fË5úV­ZÙéóÝ%:nÆŒ#FŒx饗Ä%‹+D%¥¥§Nôj7"Z<û½—Ç~AD~×Έ!ÕWD´oß¾nã¿ëܾ§Ðx­}xRæÙÙ7uýÚÊÛ¹I®ftz±DŠ/ xìn•¶nÑXËêõz‘µ\Æ0ŒH$2š†1:½ã8©Dt»¨TS%•ÿ;'ÖZ].QE•öžª7qnDDÕ:Vøtg»r§Öê·KÙ‚rƒ³Bôº‡•D«'":Ÿ_Ël¦ê†s›&‰XÇòSxÃÿ.‰¤R±D,ªÖé­ÅR¹L¢+ÍÓÚ4bDµ`×?’›¨hós9bªeÎ/Øjd2+‘A[ÿÏ5Ùyû½#¢²²2‡ö¯™©eÜþŃWsš:9TÄPê7nå]ÈÓx4µ}wÌ ":ôûï+;¥+;øQ³fÍΦþHôÿY®í{KlþwBœŒ©Ùýr;š–N"úóš®Z«ë L³ÀÜ*(别ªÖIÅbËŠYcàD càïýIœ^ÏêXV"‘ß*(ÕœLrbÍêvò¿'$¶Ö²|uyý«ó¹T\©Ñ8Na-ã#­®®êü1ÇFÖŒDËrD”WVË$®L]`oûËZ·p©k.^Ëw²·­*=[-v—ÈmŒßb œXÄ8jè\Sš{Hwi_µ‹·]Õ-­V[]]Íå'7i¯hÞ©ž-¼±¾ðuµÁÞJäàà PØ™©¢3:’“§÷j.9r$í޵˵­ïÉ<Æ£)½ùæDtðàAçÖ>êJƒ³Bäèèh×È‘ˆ®]»VQ|ëïbY’)Œ¬µº'äs™˜ˆH­1èYƒŽ5pbÜù¿Â’ kÐéY"Òë9½Ø bÃpgà8½žÓ±¬NÏXCaIkPêÿ}þ²Iu;¹ñ».ŠnÔ³ú­‚²&ÎvDdcõ¿Ýæ«Ç®XÖˆ$Z=GuìwU—–KÄ kàNåÞêЪIÍÙ¹7 §°‘UTTTÉ+­$ÿÊÙü¾ñêÞ7^­¾YñǪJ±S³>“4E×KÒŠ "*ùí?¢ e §ú4b<…ͺ®ëÝZ>|øð/ÖrÎs¥–³‘1öööÆUÎÜÖ ‘]»v¹ùŒÏ¼¦Ù…$Éß9»M¯¹Õ!­GŒáåÊÑ÷ßo£lö¿ß7œˆîÖ‡'ež]¡åø]:–$,q¸»<X€â²JDZNd0°–5ˆX†ýó¼ ÖÀ²kà W\V©·2M‹ÆÕùŒk¢s›fœ¾RŸê¬-(©pnd+¼{ýŽúNq™™O'"ŽˆH¢e‰ˆôµ]UV¡ÕêX‰DÌ —n¾Ðì_ùïúuIyCTTRYPR!²ÕHþÝH•޳–21S¥k¨dcÐUk.'†iÔk 'SÈÝ<´/M¤cˬäR©”©ÌXÅôŽ æ.—ÄϾ¦p}F¥Bs5**êû™Cºô5)¼êpE˜øçŸŽ9]&ýç.çóõÕ:V.Ÿ?þâÅ‹Þp±@_PVíl'×jµG}ù£ˆ„?+Õ¹|õÕWR+Ûu»3¢££Û‡Ì®k]kž”y¶£ˆˆn•°,G¬#æÙðø••U1üÉÒ IJÃpÃp_pEÄCÄ£.«ÒË9“´h\½.õ¬Îú¿rÙÝ>]˜››gWJ”'soz{¸‘F«»–§náêÀ¿uG]^­Õ‹E"‘ˆùëVaQYU#=kÒÈ 5ÛÚEÒÄ^|þŽ®Öw:¡±µ.×m´Âù~jý\÷Š¢¿ÜÅç¥R)ÇéÏgo“z¯«úÐU?‡›îö²2ÿ³dýÑeþåyöÎ:ñßã’ûÏk~üikÖú)ŽÏwí9mû?3`±úNÒG­Xm•µ••SK=ËMØX–<ãyú–H"³wïR­ã¶ßi»pìÜ«7pœ¡Õëï¿ðÚd¡Y¾óÂË‚r¶fž”y¶“­ˆˆ®« zƒHg` ˜g€P—W1"’ˆE"‘ˆ2pC_ Äq1$‰$DŒˆÔåUVަiѸúÕ<µT"f†!â«ëôlQI…Á`¨OubÈU©0~×ÝÍ!ëü 3ŸNDÚ¿s6ËÕ•Û¦ÿÌíúb ™D¬Ó³­îF~I3—FE¥•¬cˆ¤‘Á@³r«ªIÁ‰Lɹ­kí"ñj&=}«Ar6wí`gÛ;‡ÊÛ(Úô5þódFäŸ]Ó£¥‚eÙF¥w_Ë”4íZW#—ç›Dt,‰l]ºG$ñ/›ùçƒ|IK®ÞÃx«ñCG: öªÐ¯ï“üKIJD$}qhä‹C#ÿÎô†ÿu@¨"¼¬µ–O&a<ݤDtóŸ6Žn¬áð$7°¥åUÄ‘\&18÷æŸ&Î\ºE•–WIXÓ´ØÕo•‰ÆÕQAD^/63Sþ¹ëïóÆkÝï*q|î艳)GÏxÙƒaH¯gµ:ýíÂR"1ŒHĈD¢’²Ê_ž³oÜÒ ¶2i$ãšnPGëÏËþ{¬ò¡oJ®ve²²osò.cXbþµ³‚‘¸/Õ§vxÁ­¬¬Œ½œu¸´©ÄÎ ›ì#н¥L&¡”³½^Ç’XO"OgKÈÙÕ‘L*fëNHr™„ã¸ÒŠj{Î4->ôê· KŽˆ8áØ¶™êDÄÈ–T×=Ï&"·vß'îÑéõ=Þª.Óàûû©åßÞjl7"Z¸§Pd£$‰-KRÎ@æN²xTšwè8fA}JÚ)lYƒéL÷ñV'“óÆY3É”‘JìÜ\ÛõvhrS[–¯¯*5è«E¹ÄÚ^fç"wh*±qäDÒºZø6µ\i+êÔTºd¸CdRé• 6§ #’¼ÛS1º›5ý¡¨ä¯ k¥;Im $æð# ,Ãs]üÝ^ð*»š¥-¹m¾¤¬‘'¶2Ij·:ñ'Ÿ1»NUÑ×{ïòtgÎÀôÕm•A_ÍXF$Iä"™µH"¯õ–¥ÆmD³Øy»Ëˆh×)ÍUÞ(¬ÀôËlz>/}·§m G1ù¡èô‘_åÊæ2»Æb¹í]7 €GÉ ¯ÖWtw™:ФV[G‘DnQÕg °'"fÛ‰J"úv_Ã>›™3>xÕaPG+)CD7K G.W³º˜¯ÇfôÄQÚŠ\"W;±w ë½=g4ów\/»–%³w“*”b¹‚IðN€‡ezGös†ÏK~ÍO8&SyÛwn.ÑUÒÙëà)tºrgvåÁ_‘Ø:ÊšJ¬‰¤VDD‹Æ-ktOjø Ãä©«c÷Þ4誕JeǦrb¨­«ÜÀqç6xBä—³×Õú[%ìÕó'Xm¥XfmíÜR,·ÉlD1"†8BÆxxþuO•jõ­Gó©ÇgÈ»V|û²Žcõ{ :2°œÁ@8[é Âð·ÅeøÓˆ ,i+Y]5ö‡4È<[ïBDáõÆñ0(–fÔº~A„±x" g gr6r6 gr6r6 g@ýHêYî@Ú> ÖS£÷+ý1OmÎ&¢Ðð0^OŽãr/œÁ8<Í9›ÿºÇ=Ñ­ž\8ž €œ ÈÙÈÙ€œM”˜˜(“Ɇ±²²JIIydŸË0 V6 gßCÂ~ã78ŽûᇆžžžŽu`q9[¥RýôÓOÁÁÁür\\ÜüÁ¿U\\`ee5`ÀµZ-LŽ-Zäîî.“ÉÍ—œ?~‡ˆ(##ÃÇÇG.—7mÚtÍš5XÇ€œ}Ït:Ÿ°y#GŽœ1c¿>^­Vºººfff ñ-Z‘B¡(,,4©rçÎyóæ·mÛ–tïÞýüùóyyyG}å•W°¾à)ðrvýçÙ&¥R©IÐÅÅ%55U­VÇÄÄ qþª¡’’777“*Ç………íܹóï¿J$0`@ddd÷îÝ­¬¬°š9ûöo¼‘`÷ôôÜ´i“D"Q*•ÆS꯿þºººzÆ ÁÁÁ&UÎ;7hРž={.]ºT2dõêÕXÇðtx g„ÜGÂö¢K¥Ò„„„š 8...44tôèÑb±Ø8£7oÞÜÅÅ¥oß¾?þø£I•µk׎;¶°°pÖ¬YB°W¯^z½9³‰îý¢j3å…·|}}srrj˜:uêÔ©Sk­2bĈ#FðËS¦Lá233;uêÔªU+¬cxÖs¶…ßeèСüµÚ˜g?:÷ñû€¿ÀSÏ@Îäläl@Îäläl@ξ/Z­k³ÐÃzd§——Ö g?j½!9rvƒL¸-Zäîî.“É…`BB‚ƒƒƒŸŸ_^^^Í©9¿lü€gÇc»ßø7rrrRRRT*•p|zïÞ½·nÝZ¿~ý§Ÿ~Z×>8Ž»ï‡vãq mž5½_éÿÔæìÈÈH[[Ûàà`N'çÌ™cmm=zôè¹sçbõ?ÑBÃ? À³ƒã¸Ü gžÚœ­T*k[´hAD …¢°°°æp`›xâ¶`Ëïä³³Ï{§0V½†û“/ž?ýh>˲žÅ™ŸŸïêêZRRâææfòVÍ,–ïüê|Â>| ï'þRŒFÏòÿäGòÎÿú믫««7lØÌG¤Ribbbeeå‚ „bb±¸  ÿ<à™bY9»yóæ...{÷î?>IHHP©T-Z´h×®P,00°yóæXyðLy¤ûÆ…ƒÆG;Œ—§N:uêTã*ÁÁÁÂYåaaaüÂÏ?ÿŒ5˜grvýfáOãËV0φ'Xë=Mþ»ê¬õZ‹mLØ|ñÄ­ã—ëüï׋cC­ËŽ»[¿è¹sW’™2AƒCžîmæÿí{´ïóuÔWØJë²gOÊkýûíÙ“<(h`]ers/=Y›ú#þ·Ï²ìƄͳfÍÙµ3ñéþÁ<žæßà+W­îÕ§ŸGûÎ){ÿ¾Ìñdö©à‘í<½zô|eó–mB᜜³þ¿1îíÂÂ"“vJJJC'¼Û¾C—ñ¡a¥¥e|°¸¸øÍq¡^]_Þ´yKý»ôÉŒéó¾¨%{ÕÚ«Ö/znˆOx©{/Ÿ—ý’SöüýP¿Wÿ–Z;fQÖýðãï¿Z¸àKþþ5;üú€ Ë—¯ÑåËWú½ð n¥UUU=:7ò³ÃGþ¨ªÒðÁË—¯ êíã»w߯ÂÐøÿDTPPøÆ¸·Ûyz;L­V›ÙæŸb±8$xèÅ~ÙÔ:{–‹ŠŠF}Ëçe¿u?ü(žÍ1DΆÇ//ïNÊž]KbøÑ4>2ã“YaBOüy4"bJÔ×ÑBÉŠÿ9qsø„wE›îÅþæÛ™3¦ŸÌÊ¥ùmL,\ôMÌàA>pâDvýûÓ½ûKöíIÞk¯«WçÎ_Øÿëž/ç}¾dÉÿegŸÚ—²Ûøo©µc–cíºõI¿ìYû­X,®«Ãýû÷Ý¿?ˆÒüöJŸÞÏà&š–v ‹——«««—WçôôÂ@©F_ùý²  S@“‰à¯£ƒfŸ8öÚkýFE›ÙæŸÕÕÕÿÝïÙ¾]} /þ6¶ï«}~Kßwñbn=¿7³Ûù×v IDATò”ºÖãÙ|ðžµµõë¯õ×ëõ|dOÒŽýe2ÙàAA%%¥BÉ?xO.—wïþRÚ?ß›‚_S÷·jõ‚D"yýµ~{÷¥òÁô´úËåòÉïM¼§®~úIIJåß›L‹ëìÕûïÙÚÚ¾öZ¿sçÏ{s¬ñßRkÇ,'a>|$À€•••™‘ì߯oêþ4>g÷éÝëÜt÷$ïí×ïU~(„sG3Ž2È»k—ý¿&×Uñ·ß~4P"‘ ¸?퀙mþYø·ßÅ»{rʾ… ¾¬×ï¤ôßFŽneeõþäIµxÖÆP€ãÙðˆÔu,Ê¡Q#“HaaÑ7lÌÉ9{îüy㸋‹3I¥RµºÄ¤JQQqÛvøeaÊXXTdccCD®®÷vpÚÞÞî½Iï.ü:záW_ܵWJ¥£ð¡¶¶¶õ阅8uêôÊï—-ŒŠÎÌÌêÚÕ«®{yuúëò傂“'²_~ÙçYÛn«««÷§¥ïNúeÎçóøU\]]-—ËKKKÙÛ›¯[RRÂo¶¶¶Â¾ñZ·ùgóß¾ ãK‡ ìíí„õõùÞÀ<àñð.§R _õý2“Ç:99™TiÔ¨ÑÙ3'.ž?}ñüés9'ù ³³syy9Ÿ‡îµþ^+Q—>òÇ]{eþQîµvÌBD-œODÓ¦~´lù÷wòóëê°H$êÕË/vÉR/¯Îr¹üYÛûí÷Î:òrñüéŽ=
›³ÿü3ëõ×ú /¼ÞÿøñLN7#bÚŠ•qaïNþ|Î,þ­W^éݳW_㺟~ñßø;wKNÙ;ëÓø¨Y¯Þ}[·j%§Mýh߯û»÷èÝ´iþü¿â•ÑŠ]'7Ž7wxà@Ú¾ÐðüVe!!!ljD¢­[·šëV<ÏÄ%¢Ü gZµißÐɶËçÑÏÇþ—>òÇW_EÝ÷eµÏÔX=ãîèéõú­Û¶ïܵû§õk-üO¾xþtƒ~µŽZW21¨Óýϳ™º™©UQQ‘––¶téÒÔÔÔÊÊÊš³^~Ùøÿyyy}ûö•Ë寿þºp`ƒa˜+V4nÜØÅÅeÛ¶m{÷îmÖ¬™L&KLüû;%##ÃÇÇG.—7mÚtÍš5µ¶l¦ñE‹¹»»7ð,›8郺NßhÓg|êíãÛ±s·ÄÄŸ¿úrDpŸ9›Ÿ°rÿFw»gxRR’¯¯o³fͺwïž””tׯ‰húôé£F*//ž>}ºP&;;;77wùòåsçÎÍÈÈ8wîÿÔNþÝñãÇGDD”––FEEñµjí^]߸q#''ǸA€gÙ‰?úû¿Žq€Gæ›E gÎ9µ1þÇçžsÇ€P(ÁÁÁÂ=úOŸ>=räH¹\>vìX“³BêÙ¸­­­qƒÝ]ŸÍ§máÿæ k4šÝ»w'$$Lœ8‘ˆììì4ñÍjm¡¨¨ÈÎÎŽ/o|Ò¿‹‹ I$þ-“ZwîÜY¾|yVVVv¶¹`ÕÕ¸R©Ä–OÏ<Û$m×gÆüÒK/ ;Ò»uë–’’b\ Öëð”J%们¬Ìøª\óÎ8Ž Û¹s§™bu5ð´Í³ÍÌkÚ²eKxx¸ðr„ [¶lîL€±Âè=ñcûˆ¯Ï†Çë_Ÿ|µ>¸½>1älälxxðülxêsN Ž`ž 3 ãc!:uê´téRáåÒ¥K;uêt¯¿Ìöïßïéé)•J»térúôióUj>­àæÍ›õ|„Á£üÑy¯ýâ2™¬k×®–ù[³àI•ýí·ß–––QIIÉ¢E‹ÌßL°VãÇ_¸paiié°aÃBCCëÿcŽ?~œ¿-’Eýž»~òñÊÊʰ°° &`ëälx²1 3wî\ŒÃcT^^¾råÊnݺ __ßQzzz÷îÝ…x­ÏÁ+((èׯ_£Fâââ„’W®\Ø­[·•+W–——ßµKÇ7îŪg?%É[o½•““#lóóçÏïСXYY 0@­Vóe2™T*õòòJOO7¬µz­k³BÂ&"äìǘrÞ}÷ÝÎ;Ÿ9sÆøûÝÏÏ/55•ˆRSSýüü„x­ÏÁ›9sæ˜1còòòŽ=Zó# ÛµkÇ/ÇÅÅ>}ºS§Nï¾ûîñãÇÍw,))ÉÖÖ¶[·n—/_¶ä¬O?5Ͳe˺té"Dš4iräÈ~ô¢££ËÊÊÂÃÃgϞͿ«R©–,Y¢Ñh"##…½µk­n~r6Àý'lÉ~Œºuë¦Õj³³³¿ûî;///!Þ«W¯Zsv­ÏÁKJJ9r¤•••3Œýøãóæýýðc//¯ØØØS§NUWWOOk>~üxTTTiiéÒ¥K'Mšd9[ì½ö“/ïàà°mÛ6“»@* "Ú±c‡‡‡‡T* Þ¾};ÿnïÞ½SRRÒÒÒüýýsssÍk­n~röF«Õb­?.sçÎågÕüÿ‘°¯cÇŽI¥ÒŽ;N™2åĉBÜÓÓóúõëgÏž½råJçÎ…x­ÏÁËÏÏçÓO³fÍLÚ?uêTAAÁСCù—YYYüq‡d2Ù±cÇ„b5ß¼y³ÿþb±ø¥—^JKK³áº~òå5Í¡C‡øá>^­Vºººfffš ÖZÝÌä솕››ëïïoccãää^Ÿ#at·S%…ùΨ|ôæÍ›7oÞ¼¹sçΛ7/22òxy{{¯\¹2++ËÃÃÃøL1†a|}}.\øòË/‹Åb!^ësð\]]ùÖòóó¿qãFll¬ñƒÞyçvíÚ8qbåÊ•ÞÞÞõé¡Á`0~\¯Åºï~*•J­V˧v½^Ï]\\RSSÕjuLLL`` ™`­ÕëZ#€œÝàÆŽ;`À€Â .ØÙÙEDDÔóç°™w…3A0É{,3•ÈÈH~g)c[;;»š˜ýüü6nÜh¼cœþyž^¯7~Þ!Câãã«««.\(”~áÂ…Ž;*•JáŽñ©˜Âša˜„„??¿¼¼<á-ãÿó ‹-rww—Éd‰‰‰|0??¿OŸ>...±±±˜‘?DsçÎů%Ë׫W/­Vk’³¿ùæ›åË—+ŠmÛ¶-^¼˜.X°àçŸnÑ¢…p®3fçζ¶¶÷wõ?þøæ›oZ[[/X° &&ÆbGéÁûacc»jÕ*>)—ËU*UBB‚™`­Õk]#ðÔ°èçz >ÜÍÍÍÛÛÛ×××ÃÃCˆ6¬OŸ>ÞÞÞãÆãOÇ`&..N¥R) †aø~2 óÎ;ïüç?ÿY¿~ýü±fÍ>(¼+,|øá‡ ,HIIQ©Tüïððð6mÚ¼ÿþûüñÊ•+Ÿš4ó¸žë%ŒvâÝ <³_­OÆs½V®\ɲìòåË;vìØ®];áBϼñÆ={öΟ$£S1Í™3ÇÚÚzôèÑ¿üò‹™ŠŒŒ´µµ Öét|$))i„ ÖÖÖsæÌÁæøp~š…ñ¸+‹¾ß¸R©\¾|9•––®X±â­·Þ:yò$ '^ jFˆ¨E‹D¤P(„#@u}I$//ÏÁÁˆš4i‚­äÁa ðà,zž­T*ùsÅííí?úè£ .ðq{{û’’’ú´ÀŸ9YRRâæævOíììÌßWˆ?€œmΰaÃ/^œ——WYY¹hÑ¢>}úðñž={nݺõðáÃmÚ´1ßÂ×_]]]½aÆàà`>"‹ îúÑC† Y»v-νäìzùöÛo¯\¹Ò¾}{gg猌Œµk× ™8**jРAK–,1ßBóæÍ]\\öîÝ;þ|>ؼyó»~ôW_}µcÇ777ww÷š‡É=‹>žmggÇŸìm¢}ûöÂ~ržñáRãå©S§N:Õ¸äÏ?ÿlR¬ÖºNNNiii:nݺu>>>ØPîCqq1àY™g?FãÆS*• …býúõ+W®Ä€æÙ èAÎU^¿~=6À<0Ï‹Tó øšŠŠŠ0P˜gÃãÇ™…ñ±~~~«‰hÕªU&w¯Ï/³ß~ûÍ××·qãÆ}úô9{ö¬ù*Æøàùóçûõëçêêúúë¯ÿõ×_–0,»vírss›3gŽö ³àuæÌ™eË–•••Qiié’%KΜ¹ç[(Ož<ùóÏ?¿zõê AƒÞÿ}ó…‹Œð‘÷Þ{oîܹ7oÞüôÓO'Ožl ÃòÎ;ïÄÅÅ}ñÅØ7@ÎxD†ÁC9¯ŠŠŠ~ø¡oß¾BÄÇÇçСCDôûï¿wëÖMˆççç2ÄÍÍ-$$Dȯ………C‡}î¹ç~üñG¡äÉ“'¬¬¬&OžœÍûöíûÃ?TTTܵKÙÙÙ¾¾¾b±ØÏÏ/33ó±‘R©ÔétãÆcÆÒúÈÙ.a¤ýødeeM™2¥W¯^ç΋âÝ»w?pàýöÛoÝ»wâsæÌ ¹víZPPÐçŸÎçÍ›7|øðóçÏ›<[˜C¿øâ‹ürllìÙ³gýüü¦L™’••e¦c>>>GŽ1 ]»v}ìÅÿ@áÿoi}äl€G—°q$û1êÛ·¯N§ûý÷ß,XбcG!îëëûÛo¿ÑŒsvjjê°aäRéðáÃSRRøàÞ½{‡*—˧OŸ^ó#fΜÉ/wìØqáÂ…‡ÒjµÆÓz“ƒÙDôå—_Ž1ÂÙÙ9$$䫯¾²¨A³ä¾r6ÀÃ4wî\~VÍÿ ûñJMM•H$={öüì³ÏN:%Ä=<˜MDÓ§OOLLÌÏÏOHHøôÓO-jÐ,¹oð,°èk½„Ç*K¥Ò:|ÿý÷ümD†¹×¯ûû¨ݼyó„…ÈÈH ÈãåååõÝwß•——oÙ²åƒ>Ø¿¿ðÅÇÇ'&&ÆÛÛ[, 嫪ª¬­­ËËË…i±‹‹KYY™½½½ÉãnoݺµbÅŠE‹ ‘?üð­·Þš5kÖ]oàæÌ™—_~™a˜=z˜ß‹þèYrßóìÇ¿¨²²2,,l„ ÒV¶%¬ÍÈÈH>sã0¶…P(ãÇ6¯{÷îÛ¶m3Þ1NDýúõKNNÖëõÛ·oíµ×øàÀ·nÝZ]]#”[¶l™EŒ%÷ žOÆ}Ð4Ͳe˺téRŸÂŸ}öYPPО={>þøãZ ܸq#'''%%E¥RiµZ"R©TK–, Û±cGhhhnn.¶Œ†žpc,\ù¥—^0 ...;vì0)ooo¿yóf~ùí·ßæNŸ>}OgÂÃÃÃø€·å ‹eö 0϶ Ã0 ãàà°mÛ¶Õ«W×§JRRÒ„ ¬­­çÌ™SkÈÈH[[Ûàà`NÇGz÷î’’’––æïï„Ý «².€'~ž]Ï ™q±¼¼<ªíDV^Íuñññ*•*00P&“¥¥¥á²Ë†›¦ÀS;Ï®'ãsVÕj5Ÿ¼ëYÝÅÅ%55U­VÇÄÄ—¦ g?4R©411±²²rÁ‚BpÈ!k×®­®®^¸pa=ÛñôôÜ´i“D"Q*•&—¬ g? *•ªE‹íÚµ‚_}õÕŽ;ÜÜÜÜÝÝësa ÅÅÅEFFÊår•J•€Í,EÏ®ë`¶æOü&¢°°0~ÁÉÉ)--M§Ó­[·Ž¿‹qã6…e__ßš’ÁrttÄ À³ ¨àæÙ÷iܸqJ¥R¡P¬_¿~åʕؘól µ~ýz¬Wxúà!ÈÙ€œ €œ ÈÙ€œ €œ ÈÙP?–{O•ZŸ©lr7S†aêù°Näì†"$c3‰ žOÞ¾q†aæÏŸß¡Cã¹x~~~Ÿ>}\\\bccÍ‹‹‹¬¬¬ À?fÛ¤ÍÄÄD™L&•J½¼¼ÒÓÓ±‰röýkҤɑ#GŒ#Ÿ}öYPPÐÕ«WÏœ9c>8sæÌèèè²²²ðððÙ³g×lS¥R-Y²D£ÑDFF†††bäìûbò`줤¤ &X[[Ï™3Ç|pÇŽR©488xûöí5ÛìÝ»wJJJZZš¿¿nn.6@ξ5Ìœ——çààÀO—Íóóó¥R)Ã0b±øöíÛ5ÛŒW«Õ®®®™™™ØD9ûarvvæNçåå™*•J­VËqÇqz½¾fS...©©©jµ:&&&00› g?LC† Y»vmuuõÂ… ̓‚‚rrrôzýêÕ«{ôèQ³)OOÏM›6I$¥RYXXˆM³¦¯¾újÇŽnnnîîî¡îZƒÑÑÑ666±±±«V­ªÙT\\\dd¤\.W©T ØDÀBH,¿‹&a¿–œœÒÒÒt:ݺuë|||Ì“““Í|„¯¯oNN¶ À<»AŒ7N©T*Šõëׯ\¹ÒLóìÇiýúõõ `ž ÈÙÈÙäl@Î@Îäl@Î@Î~Œ6lØÀ0L||¼aÆd9ûñÛ²eËСC·lÙRó-“û g?6iiiK—.MMM­¬¬4yW˜ggddøøøÈåò¦M›®Y³†&&&Êd2©Têå啞žÎ‹‹‹¬¬¬ À?Z»®’ÈÙ÷ ))É××·Y³fÝ»wOJJª«Øøñã#""JKK£¢¢¦OŸÎU*Õ’%K4Mdddhh(œ9sftttYYYxxøìٳ͔@ξ[·neÜàmû˜ºhÝöÔwBúóÁñCû&ÿžùÅò„ Ãú %‹Jʧ.ZKDï„ô?pìÌð)_>qî |òΰï7%¸pCÒß ÂÈÙ÷éôÅ«_lIDÚ¶<}ñšïË¿?£Ó³iÙ +>Ø¡µûþ£§Îä^›ðùÿ %eÕTk‰¨kûVéÇNéYCzÆ)ŸmþiÿJ×v/tlÓòøé\ãZ–ÆÒ÷_½•ïìhßÜÍ©±²Ñ_7ò„¸ƒíÀÞÞ/4w}Îè·Âƺ¼²Ê¤…òJ ¿`gc]¥ÑQ¥FkokÍ­NüdBÈÜÉ£ôzvfÌúÜk·±MæÙ÷ƒã(çÒõ‘zžûë†ÁÀ ñyï&¢=¿ÿùÅò!X©©¶±²ª«©²Ê*¹LJD6V²ÒŠ¿S{Iyå¬ï~RM‹^µ%eîäQØ 9ûþɽÖÛÛóLî5ã`3W§£Ùrr¯½Ò͸dÏ./4_5zí?ûRÇ6b‘ȯkûc§.òÁes&öònϲ†²Ê*;[l`±$–ßÅÓ¯J$b“œýÝúÓßjok½iÏïBpÝö_çL©°±^¼n{ÍvÖlÛ÷É;!SßròüåoÖþ]`Éw}üÆ ¡Á¬ûzõVl€œ}?øÇˆå\º.>^­Vºººfffbkäì†Rë¹å¥R©Õj9Žã8N¯×ךòSSSÕjuLLL`` ¶@Î~<‚‚‚rrrôzýêÕ«{ôèQ³€§§ç¦M›$‰R©,,,ÄÖ–LòÿmÑÑÑcƌٿ¿‡‡G|||Íqqq¡¡¡£G‹Å Ø9û˜\-¼¬ë¢maÙÉÉ)99ÙLk¾¾¾999Øà‰ûT@S IDAT€{— gr6r6 gr6r6 gr6r6 g©ùØ.óòªg#ÈÙ€œýoyyy}ûö•Ë寿þºðÍZƒ‚/¿ürÚ´iD”˜˜(“ɤR©——Wzz:6@În@Ó§O5jTyyyppðôéÓÍyQQQgΜùæ›oˆH¥R-Y²D£ÑDFF†††b#ä쇀ù7!žœœ±¸¸8 ÀÊÊjÀ€jµš&&&Êd2©Têå啞žŽ-³M 6ìСCÅÅÅDTRR’––6jÔ¨ñãÇGDD”––FEEMŸ>](ܤI“#GŽW¯«äÿýßÿ?~|ÆŒŸ|ò‰É'Μ93::º¬¬,<<|öìÙ|P¥R-Y²D£ÑDFF†††b‹älS2™lôèÑñññD´aÆ‘#GZ[[Ÿ>}zäÈ‘r¹|ìØ±|:ç…„„( ãêu•ŒŒŒ´²²zõÕW“’’L>qÇŽR©488xûöí|°wïÞ)))iiiþþþ¹¹¹Øb9»ááá?üð­]»vâĉDtçÎyóæ·mÛÖ¸¤£££IݺJ6iÒ„ÿAPTTdR%??_*•2 #‹oß¾ÍãããÕju`` ««kff&¶@ήEëÖ­ííí7oÞlggǧހ€ŽãÂÂÂvîÜi¾n]%;FD¦qãÆ&U”J¥V«å8Žã8½^Ï]\\RSSÕjuLLL`` ¶@ήݻï¾ûÞ{ïMš4‰yîܹAƒõìÙséÒ¥æ+ÖUrÚ´i&%%eèС&U‚‚‚rrrôzýêÕ«{ôèÁ===7mÚ$‘H”Jeaa!¶@ήÝСC[´h!ä×µk׎;¶uëÖ­[·6_±®’+V¬èÒ¥ËòåË,X`R%:::""ÂÆÆ&66vÕªU|0...22R.—«Tª„„l1ð¸H,½‰ñQä#FŒ1‚_ž2e ¿`|M¶°l¦dNNŽñGUœœœ’““M:àëëkRól@Î@Îäl@Î@Îäläl@Îälä쇭S§NÆOìXºti§Nøe†a¼}¡‘‡ÒÀ³›³³³³¿ýöÛÒÒR"*))Y´hQvv6ÿ–ñ=Ãà1çl"òõõ=p१§wïÞ½æ911Q&“I¥R//¯ôôt>xáÂ…Ž;*•ÊíÛ·ó‘ââ ++«¨Õêº>.##ÃÇÇG.—7mÚtÍš5Âg-Z´ÈÝÝ]&“%&&ši0//¯oß¾r¹üõ×_Äi<‰7ßm€'8gûùù¥¦¦QjjªŸŸ_Í*•jÉ’%&22244”Μ93,,lçÎÓ¦M"ÑÑÑeeeááá³gÏ®ëãÆQZZ5}út!~ãÆœœœ„„•Je¦ÁéÓ§5ª¼¼<88ظz=» ð1q‡Ê‰hÅ®“Ç72Sî@Ú¾Ððp6Ã0ÙÙÙo¼ñFVVV§NÖ­[çííÍ·É0 ¿Ð¿{{ûÉ“'÷èÑÃÚÚš¯èâârîÜ9¥R)4Õ¤I“k×®I$ƒÁàîî~ýúuãF„˲‰Dx·°°oM(Ykƒ7ÎÍ͵³³+))iÓ¦Í;wL7ßm ”{áL«6ís/œiÐOy([ À“¢¡¿ZG­+™Ôé1̳===¯_¿~öìÙ+W®tîܹføøxµZèêê*<9»¸¸ØÑÑѸX~~¾T*eF,ß¾}»®»sçμy󂃃۶mk7Nÿf,**²³³#";;;a߸À8'ÕÚm€‡èQçl†a|}}.\øòË/‹Åâš\\\RSSÕjuLLL`` ´··/))1IºZ­–ã8Žãôz}]Àq¿_Ý|ÇjmP©TVVVQYY™“““Iã,^k·žàœMD~~~7n¬õ`6?ß´i“D"Q*•BRüÿöî;®©ëÿãø aT†wµ¢µÚ¡­Î:p‚(.QYp1·"¢(*à@EQÁ‰{ïÖQm]uà€²g ã÷Gü¥m¿¶¾žy$çÞÜK>Þäsï¹7mÛ¶=þ|ãÆU-·nÝ’Édk×®mӦ͛ÖuûöíÞ½{·mÛ¶ð9f%*q=zôˆ‹‹“Éd[·níÕ«—ªQKKkÇŽ999~~~¥ÿÙ¼Gšÿý*Û·oŸŸŸÿ¦Ì^³fƒƒÃ!CÄbñ–-[T ,èÓ§Ojjê† T-666ÇoÚ´éæÍ›ß´®uëÖ :499ÙÇǧô¿ªÄ.Z´ÈÚÚzøðá:uÚ¸q£ªQ5r­råÊþþþ¥ÿÙ¼Gÿé4|pŒA€r÷ÑúÁÆ €†Ì€Ìd6d6 ³™ ™ Èl@f@fÿs›6m‰DoºB¸H$úïKðAV @YÏ옘˜¾}ûÆÄÄPzÊnfgggŸ8q"$$䨱cªß¥áÕ«W]ºt100X³fª¥qãÆñññ‚ ÄÇÇ7mÚT„‹/~÷Ýw:::µk×W÷.\X¿~}mmí;v¨ïÞ½ûå—_ïܹSÕ’ššÚ³gO]]ÝîÝ»§¥¥½i¥ÙÚ·o_ëÖ­ëÔ©óã?îÛ·OÕ8yòd›ÄÄÄ .¨ZÌÍÍ:$ÂáÇ---A°³³óôôÌÈÈð÷÷÷ððP/ðÙ³g·nÝRý8¦ziNNN{öì™4i’º% 33ÓÙÙyÚ´ioZ)döŸbccUܧOŸØØXu4HWWW¨æææ,œÙ7nÜ4hŽŽÎСCSSSÕ œ9s¦¾¾¾••UAAªåÔ©S¶¶¶mÛ¶UõÔAؽ{wÓ¦Mµ´´¬¬¬Ôïâ+ ŒÓüÏÖ”——·wïÞ-[¶¸ºº ‚P¹rå¼¼<]]Ý—/_VªTI„:uê¨æüé§Ÿììì¤Réµk×Ú´i#BRRÒÊ•+¯^½zíÚµÂË466.²–ÔÔT##£Â-/_¾ÔÒÒRÝ‹ÅêÆ"+€~öküþûï•ÿ¯U«Vªà&&&ªUÍ©­­ýý÷ßÏŸ?¿mÛ¶‚ ôìÙS©Tªvz—¾–*Uª¤§§Éõüü|ÕJe2™ª±øJ ³_‹‰‰qvvV?tttTïÓ§ÏæÍ›¥RéüùóÕSÍÍÍgÏž­Ú1.ÂíÛ·{÷îݶmÛÒ×Ò¶mÛØØØóçÏ7nÜXÕbaaqëÖ-™L¶víZU¯ýM+€ÌòóóÏŸ?oee¥néׯßÙ³góóóýüüvíÚU¯^½Ï?ÿ\=µW¯^‰¤[·nª‡ëÖ­:t¨©©©©©ié+Z°`¿¿ïÞ½ƒ‚‚T-žžžzzzË–- S5–¸RÊ2ÑšsY‚ ¬Šû=ÚΠ”ùN8âà}¾låòë£VlZaß×!bç:'+çñ3ǸÛMò_îè¿tœ÷„e –66mø·†¤…†EtéÜáô™Ÿ ºuí¬§'!³ìø‰“—TW(”‚ 4ýάz]Ó,™¬A£&µ‡ºèjk©ºÞž?‰ŒÜèèèP¹R¥Â±}âÄ©–-Z˜˜˜´hñõÉ“§zôè&ÂÂEK,{›¯ [9g®ŸzÎQá%'§çæJŸ?K¼öûÝø»•J…R)"AS,D"AP Êÿß©£Pfeåd¤ç- ZþÅÍ~øþ»ªU«_àí;w=púôÙ  å=Ú{æì9÷q“þ¸ù›j†3gÏŸ?{bÇÎÝ‹/ñŸï+Âüæ½"Âöl™ï°ÀžjÎÕ«ÇnÛ¬§§WÞ{Øû9sævëÕmÁ¼‘{"íúÚogçá»læ°¾öcÆöñšj3Ôv󦍯¦ µµµß=¶32sG¹:>~òâúÍÛ­h%—WœÑ-d6Ê¥G׫ßÀ¸aËŒì¼×ïR™2¿@¦­gPÅð[ ×ïíä\ÑÕ³;RRR$ºº…3ûÀÁÃ]ºtÁ¬Kç«2ûä‰SÓ|¼uttÆŒvݲ5F5g‰¨ðd2¹T*»sûÑ7-~6Ô^!¼ùC_)Èd2…B©©©¹/î°¡¡A›Ö­‹Ïå>v´¾¾~×®]ƺOØ:l£žž^·®f…GJŽíª««ÛÛ¢WPðrUËéÓgçÌš®©©iÙÛ|YÐrõœÝºuÕÓÓ+÷Ù£)Þyãúy3gyLñ8wpõÖPǾNãgŽ?ÒÓÕÍei@`b‹¸Ý;“’544 Å»z033‹EFéoß±0ï•”øœÌ>$]]ÝßnÜ®ò2¯@özèl: ô«§$'§$b’ïÒY>žSýõòðá¶r™¼víšJ¥²ÈØ‘HTø¤»"ƒW ž<ЋŹ¹¹zú•*ÒfIf£\êѽ[RRÔµKqr™\©T&$&þÔ{˜¡q›”„‡‡£ƒ4h kˆ‘D"±êk)‘H C?}úì×_}¹!2\õÐv¸ý™3çºtéT­Zµ¬¬¬Ê•+§¤¤ªg.±ejJFÇZ·i‘–ñP&ÿó¬*õ˜GU`Ëdò|iANnîý{O5MCC£÷Öýº))©ÕªUÍÌ̪^½š:xTƒ-²³³U³+‘H¤£££T*kשí5}ÚÁ¸ƒ«·­v´r7cì$oW7—Ðà•Ò<©‘‘a‰CªV5NNþóëQzzFµªÆêÿšììl™¬ ?¿@OO¢¡Q¡.¯Df£¼~IwuqLIMÍÍÉU*•ÛbwWÑ×Ö ‚РAƒ1£] 4µ´ÄzzzÆÆÆššnêûmØ aõk×Ò××+ÜϾråªúcQ„îÝÌ._þµ  Àcâ¸#GµëÐ¥Q£OÕSKlD…W “U«ZµùŸ¾JNÈÊÌÉHÏÊHÏNOÏJOËÌHÏJOÏLMÍHINO~•öêUZjJú“'‰/_¦72m¢î%ÿ]µjÖüî‡vgΞ›8Á]Õ2ÅÛ3jsô—_·:xè°Ï¯âO騱CÛöË{© |ÎíÝÁrNÐl«ýü‚æŒéá0¯]»v999oÚ?Q¯^ÓF ÷ÄX¾awÜþÏ>kòÕW_§¼JT/sÝú¨'OŸuîÜ);+“~6P&b[•ÄJ¥RKKëÏoî‚HK[K"ÑÕÓÓ+ñ ìÈÂuttŽ=(‚––VøšPU£ÍkÕÊ•+oÄÇÐÏÖÖÖÖÓ×zòì•L&W(T#Ä• …RP(å ¹ª‡]P “Éd2™üö­Zz_4o.‘ü9:L=¨»ðèî7Ýw°á`?¢ðßPµªqÔ†ˆ"Xá§„® ©¥NOO·³±ïÜ­óÏ)½­zOõž:Âaø/Ÿ³gÏŽ>T©T¾)¶?©_ç‹æöÆÕjhjjÉdɯsssþE‡æÍ>32®ž››”ðŒÌʉD’”šœ’ó[ò‹Ç‰D㠧ɪ¼éêTå÷´¼w&&&ºɯW®&&=—È …B)(• ¥B©P(år¹L&/(ÉdrAPæåJ_½ÊìÒ±k½zu ïÑ)×çbýgjÖ4ù©}ëÝ:?{öìèþý/^¼8qøð‹/êׯ_PP ££Sâ³J¼ê™‹“ú~ZjrÚÆ’ÙÀ‡$‰ztï¹!êæ¥SZZZV}-õõõK9-„Q¼•»Û¨Óüòwú9--­öíÛýøÃ]IáÑËï¾¥}ÌÛ¤††FÍš&R©ô³Ïš¨oe2Y)çd»8Ù5jܬx{üÝ›…“›ÌÊf¯èõ4ižT"‘tü]_4oîç;[&—¿ËÏThŠÅúúúzzúüì?þÚ­«««T*UTݾõ-\ÊeJ+ðLù\CE ’&‘HT^Pêþ}}}¥êâgoA,ÖÔÐÐà'ŸÿÇä¦d6>¢Ø&§ñ¾hhˆµµÙœPö¶LJ™ ÈlÈlP1 ÿŠS'ŽP°íQ=Ù(ë8gl{Td6ʇw¹ Þô¡YâÕðŽÕcÛ£zû™E¾Ñ¿G½[’êQ=ªWN øoc å™ ™ ÈlÈl ¬“Ëå99¹÷îŧ§g”|›‘yÿþƒÌ̬WÉÉ”K™Lþìùó_¯üÞºmÇ}޶ÿÉlמyþ"!##“ÑÂÿ˜T*ì3qÏÞCë#e2¹B¡ & ³¿ÈÈÌòž<õUJÆ· ©éÙcÝ'¾MËÈ™0Ñ+%-ËÃË'¿@yãÆÍ6“ EBBbBbҪаÄÄämÛ¶^½zµZ5ã[·nÉdù3gÍöððŠ¿ÿp×®=)©i999lZE¾¦¦¥s¦¥eßKOùΛ²|iíºŸ-}ôøizz[Wá>ôŒ™~µëÔïácR³ÎR?¿:u?Y2gní:õçúV­f2thŸ‘N^‡£ÆTÿrä’eË>iÐhòô¹é™r¹œêÌ^ûüóÏÃÃà ޺uëÐÐÐÖ­[¯ZµªM›6«V­jÛ¶íÊ•+:vìãäätùò¯ÕkÔ¼ÿÁÇÖÛ~ñ"AC¬µì²e«žßžâãë7oZ³æ-‡ дé—ÖÖýzöê¿kWTPPèõëçÜÇy.Zäÿò‡þôüù këï&, ¸wì ðŠGâüBV´kò”9k%`IDAT»vFÏó[¸jeÐÔ©³}ííÝbcÖ 6fçŽõ“<¦îÞ½ç_ý“ÊW«W¯¾pI°½•Ù²•ëÛµÛí;³¥­cœß¬o‡;°´Xy$rŒÉWÎ!3§ÍZ±zõºQC­fù~ûí·yyyÿÍ_X¾êù"!¡G^g¯œõòš¼yWÔˆö«7­êÖ­Ç©“§ø–óî¸Êe?{åªÕ[¶lY¹r¥¥¥eHHˆµµõòåË­­­—/4ÈzÅŠÖÖÖ7D.^¼xi€Ë¹sç†õû)pÕfõBÃ"Š,ÓÅÉ®HKhX„ªQ}'fûîÁƒú•—Ï—gÏžõïo}øÐn›¡.Ûc£\GM\¿>4dùÚððàè-Û×GÏœ¹`çÎõ¶ÃFÇn dí4nœ«ÛØ Å‹ ¾/‰ºšulØà“RVª®U‰ÊW_¾|é9~ìÊ-{Ƕ»yýú¤õ›âvïv [?Àª×Úí;DºÕhá²iSTÌÉ3‡œ2Å#hýö)ÆüüóÏCmÿ­-í+GõT*•ÆFÆãWzîݵ/4:tÚÄY3–Lö3u¬Ç¨UKV* ±Xü¦-êomd6PûÙÎÎλwï1bDll¬³³óöí±NNN;wìprrÞ±}»³³óæM› ä=Ñ2|ÃùiczÙ8y?zô¨Fõjê…,\¸°Èb‹_µ±Qãfñwoº8٩¥×­ÿé“Gñ奛8ÖÝ}ûöÝë#ÂFºÆÅí°³sݹ#ÚÝ}ÊŽíQã'ÌØ²9ÌÉÉcã†PóÞ6³g{;:Ž9vìX‹¯¿(²u¡®_¿¾yófÝ’Z5k”²^U­JœTî 8qʬ[7O›ãè¿mÛ¶®]»Ž´ï?Û7à@˜³I«QëÖ­ ‹‹6l˜“˨ cGÛ8¸®Xì+•Jµ´´þÖ–öÏ”¯z&%%yŒ÷ŒØîÐßaêïIS¬ž;e´˗/›6jXÊÿîX±±o岟½zõj ‹-[¢{õêµ±W/óMQQ½ÌÍ£T·7~ùÕW3|­Z{rÚX‹N?ÖØÔ´øGgá‚ äååí‰;uëÛ…¿éÇß½©ú¾?mÚôòR¥—/_Žï±<Äÿ§Ž]ƒ–-èØ±klìfË>ƒbc6[ô´=6ʲ¯íò…?uì5Ï×gĈQ‹çwîܹÄE©ê#ÑÑèÙ£kÜÞú•* ‚—'Ý»ÿPØÚȸ}¥Òü"O)>µpKnYêg»­ŠÞëê`Õ«W¯Y³f ´vÚ1¾Æ·®QQÃÂÂvïÞ=dÈ­[·º:;.]·MÕÏÖÑÑ)}KÛ»ÿÐã'OAxüäé¾ý‡UŹÝúM;wíÍÉy=ò<''wÏÞak#÷î;¤Þßqù׫[cv–» ²zõê‹–.²ï?rMl˜»ÍÄÅá~#}üç~ûí·o"ZâX¼>›¢cÒÒÒAHzù*4,"11I„Ô´´MÑ1ªÒ]ýíÚÆM[W¯Yÿàá#2øOûÙ{öì¶´ì³yó¦>}únÚ´©Oß¾›6EõíÛwSTT«ï¾[¹lìâe{g³lÝsÔâŃ ÊÌÌ|ë’¾p¹ISo/ÏÜS™U·nÇšuµZ±bQŸ¾ƒ×…¯03ëµ>bU³žÁA~;õ ZæÛ£gÿ%¾ClçûÍuåž››]ú2kÕ¬¡P(LjÖáÂÅËm[ÿ8uê”NºÜ¸uGCã/û6‹OU°Qãf¥?·ìdÌÂÀ`ë^Ë׬···‹‹kݺõ ïÑÕšŽÞ¼vmø™3gÆŒsæÌGGÇÕakÇÙ ð Xúã?J¥ÒÒ—ÜæÇï/ÿú»¶Žî/¿\îܹc­ÚõAÈÈÌåêØ¦m»ë7o‹Åš‚ œÿåbcÓFÓ¦ù´úîûß~¿¥Þ{Ü ¡©½Ýp_ß¹åeƒTí½OJJòœà±=ܱ¿SЦÀI>‹ÖúùLœ~éÒ% wÜÃ_x ,^ŸúõêæJeZZÚÏŸ¿‹Å¹R¹®®äéÓçŸÔ¯W¿© šZº.ÎŽ666GŽžT?™ ügýìÞ°³³?|ø½½êÖáð¡C»t™7Ãv–ß¶ÅÓ¬[vyâøÑyóæŸ:uªZµj…âåå¡þ§j|òøéwßÿ ÍËibÚ ¼WIGGÇÅÅÙÃcB§NæÃ† µè=0$Ø¿k7ËÕ¡KúZ œÓ¯¿ÝÒ% º˜YÚÚÚØ;8mÛ¶õ‡ï¿{—%«~sðá£ÇŸ62MKy¥§+¾yó–qÕê…ç)ejüÝ›¥?· õ³'Œ]¾iÏX';Õ¹ #†ÛzN[pêÔ©… 6nÜØ£G5kÖ´iÓ&$$ÄÙidк­Ó<ÇïgßÒŒŒ kšTß¹3®Vm“Æ›¾z•(‚™™Yå*†Fz·oß©Z­† OŸ>ÿáÇÖ¹9ÙFz·ïÜ©ZÍDµÀ/¾øB¬¡ñìɃr‘ÖÛb¶8x´ÿ€Á·ïÞX0ÂÊ~í_ûÙI¥þ8xta@à;&·j ,^Ÿzõêܾ}[¢§ÿìù‹V­¾¹wïžDOÿéÓç¦çæd ‚еkW‰D¯J%uð—;ÏFyígïÞµ«cÇN!!Áƒ 2ÄfyHH33±æ!kŽÎó°jÙÙéôé“Ó§Ïtt1uÚ´üü|‰DW½2ææå?y¯§')ïU‰DwîÜññ™ºdòd»6“<¦˜›÷œ1cVÏžÝÝÜÆõèÑÝ×w^PТÀÀ¥‹ÍŸìí£¡ñ7¾ÄçåIçû/T¯K¿R•W/ÞËÔ²ÓÏ?yæŽ-›¦M›xøðáÇOžEFFîÙ³ÇÍÍmÏž=#FŒØµk—ƒƒƒ½£³Û(—¡#ìW-~—ãÙŸ7m²eÛŽqýÝss³ ò¥‚ ~xWSS3//OOÿu¿POO/ñÅ“rqÉ¥RiÙÛ|ÆÌ9óüæûõÈ®Ø]aÛV;pö ôRõ³ƒVø…ÌòðôZàï·%:ª”ÁhůOíZµNŸ>¯­­“œœbkk»dÉ2‘Hœ˜ôyÓÏsr²T¥{ðºtÿÍÏ]“ÙÀëqãQQQ7npqq‰ÙæââãìâòeóFÇOþ2}¬e‡>n§N˜5kÎÎ1=¼Ïœ93ÒÁ¾øGg‘‰D’_P P(òò¤£PcÆŽò÷ŒŽŸ9k^ttÄ¢Eáá+ÃÃ#¦L™´~}äüù³¼¼¦Í›7sêÔY›7mìоMé |ðð‘ú“NGGgæÌ™oú„ý_¦–~¶×x· ¨Ý“&¹Mðžîlgã6Ñk”£ÛD¯ÑNööÎcƺ8Ø;åh7|¤‹û(çÀ5›½&ŽÿùçŸM‡yë–výÆ-“/^ú¦ÅëAÙÙÙ2YA~~žžDu°@GGG.—+Š‚‚ÂåR(ÊÇY^"‘H©TΚ9mžß‚!6¶Ë7µq_æn3qÆïISÖøŽ6!dŲ× ‚ðÖoE¶À"õÑÒÒ422¼úÛµêÕªV56úù— ÆÆF†F¼> \Qίxþq”×~öÎ;ÍÍ-6lˆìÝÛrã†Hss‹‘#|¦ù:Ûöî>Øëô©“>>Óvìˆ>Â!xY`ûöíßå¬Ù ê_¹rE©T^¹ú{‰@ÙÙÙå«P>«VNœ8-|mðĉ>ë#V¹¹yl‰^7qâä+Ošä²ØÛ{úÊ•KXúžÉ;~ª·EOÕlŸÔ¯›pïν{v.ZP$–Jœª.`éÏ-;ýlÿÀ Qƒz.Ü9nÔÈ…+Â퇭Ýì>Ê)h]ôX‡ek£\GŽX¸2ÒÙ~XضƒÎCçø¼ËñìÔÔ´/íF ¿W ]ó'N‚(þþƒO6Ëe‚ Ô«WçÆJ¥pÿÁ£Oê×-~6vÙß E"‘ŽŽŽ ˆ|¦xEo‰úéËNK7,ÙßQu<;`¯ƒÕ¨õ‘k‚—,Õ‰tuuKïûÙK¬O½ºuŽ?Þ¤Ici^^íÚ5Ïœ9Ó¸qã|i^…¹"ýl”×~vddd誕VýúoØ9xðÈõ]º˜ùùN‹Ü³{÷Î…‹víÚáê:f}Ä÷ñ“NŸ>]¤ŸíååUø¡j„Ô÷­Zž:óó¡ ­¾mQ|½õë×õõõutV.ª$—Ë›~ö™ûx·ùóo‰^;j´Ç±^Þ37D†N˜8uôè‘Ó¦Íõó›îá1uÁ‚ÙÞÞ3W‡®j×öGU_§ðG§ºP"‘¨·E϶í:$&<áÇZíÞ½ûáÇFF†}z›×©×°ðÖ§ª èâdWúsËN?{òD÷MqnC{O¿tê8ç.ší½u[àìÉáëg{º…,=¬ŸÏ¼ÀE³'¯Þ¼sªçÄâýìâ[Ú¹Ÿ/´mûcåÊß¶üúرÝ»uÁÀÀ`Ýú¨ZµLúö±ÌÎÊ¡õß<}öÉ“§µk×ìÛÇ2';³G¤»Z|E?嵟²|eddäÖ­ÑÖƒ‡ìØ3x°M̶-cÝÜ·mÛ2dˆíöíÛ´Þ³µ_ÿëÖ†ŽuŸX¤Ÿ]ÊÕ© Å‹gU÷3ÒS ǹ ÿ^`¿wiiéÍš5÷òö˜?qxx³Ë„­[ÂGØÙ°aÕÈ‘îcÆ8Lê;gŽ››§ªŸ¸xQpÐ’”ÔTc#ãR U¸Vr¹\]«"_}Þ4U]À§–µ~¶÷·à¨=“ìûOœ2cÿÎmkÂB­ÛΙ5mÝú¨‘ëllGÄíÙ9nìèÉó–ÌœèºaÛToâýìâÁP¤ªêz¦¥&§¥&ÿug‰ìùÓGoªp9Ú E"‘®®® S¼&ÏžëÛÇbÀ¼ys"×Gˆ5Dzzz¥öÛ¶ÀêS/U—(//·p¹Þt¿!³QþܺukäÈ‘[·D÷µê³µ_ÿªÛ˜˜-ƒ Þ»­ÿA±1[­úŒÙ=h°­ÍàÞ“'çååikk©ßóoêgW‰äÜÙ½îîÁÁ . )ÜÏÞ´)tìXϰ°%nnž!!ãÇO^´ÈwÄp§û÷4ib*•æijê—R¨ŠW«U¯^}ô„)ÑÖù†¬ç:rKôf«~†Ûvï6jŒûþ}{†påæîá2ÌÕÿÉn–}­ÂÃV7^bä©ê{¼ ií¼<éì™Ó,\¹~–¦X"‘”~ ûcÞÉlTœ~öŒ™³#"Ö‡® ¶2,tEµÍpÕýÕ«‚­‡ ݲ"ÈÚføŠ%ήcŠÏ®ðïùì쬎:Nž>sçÌ™2fŒÇâÅóìì\Ïž==v̨ŒŒÌ5jðá(‚Tš7{ª×¸É3gxºO3?zýšÈˆµ –D„¯ž>sîýq6C‡GoÚh?Ìv²oàÌI£‚#·Mñöúå—_L ~ë‹Wõc¨³êضT*õ™â­PÈß:èì#ßKĸq”?Y™Ž#Gö¶èU­FmóžÝ«™Ô1ïÙ½ºIó^Ý«›Ô5ïÕ½F­zæ=Mj×ïmÑóSÓÏ—- ìÑ£‡Tš÷QUÉÀÐP.+˜;w-[¶suùÝwgϞܣ瀹s'»¸Œ÷õjkë4vì¨Aƒ†_øåœ‹³SZZZժƂÀ°A„jÕªéI´]† ´éÕ+%¶utt45ÅïØ ³Qî}öY“jÕŒV¬ÉÊL ÊÌHUݺ ÊÊL ÉÍÉ\º4P‰äã*“RY¯^½Ê•ôCW­(ÈÏ;×oàÀþ:tïׯo‹mGŽ´ïÞ½oHð²ÐU¡šbaôèQùõêÕU*•eü´éÿîÃQCãË/¿¨SÇdÛæˆJú:+W®È—æ,]˜›“°Ð?#=e¾ßÜܜ̨ ë*éëFG†äKW/ÕÖÖR¸E)±-‹ ì†}ã(ÄbqÓÏš‚P¯nA6¨ÿÖÛê šµjÕÁ²·¹ ¿]¹$ÂÀþ–‚ ô·²aЀ>‚ |ýUsAª±ií† ‚P»VMAêÖ©õÖ[€~6 ³ ³À{Äñlü+N8B¨Õ£z ³QÖ1"”êQ=ª2åÿwÑ]ø˜q<2ÙÙ€Ìd6d6 ³™ ™ Èl@f@f2ÙÙ€Ìàã£ù·æŽ¿{“’PÖ3[©TR/ÊzfwèhF'€ˆãÙـ̀Ìe‘&%€I£ÆÍ>Ú×.‰îݹQÊ ¦MšÌÛFéÅ!³àø8ϸ9uâÈ»ÌöqžB,‰ègøNSA¾Í¼ dz(ÈlÈl@fð±a  Âjõc›â—~>GfP†˜6i¾ïÜVÕýÜìÜô´ ArsóZýئœÆ6ûÆ Ì%M‰×ùÈ/Bò‚ðIÃzÏŸ$$¼HÊÍÍËÍÍK|žT~_™ e+°Ï¸y¬kgV$¡M›4ßkfIlÿ<‘J¥ãµÙP¶¤ßºSCW¯H`µq(ýYW®\µ±µûâ«o§N›ùìÙóõ[Eùªçƒ{AP*J»æÚéÓgÍ-¬š6ûÚÜÂêÜùŸßôb#7D-X¸˜Ì‚ Ü»sÃüÈnAÔ]mU`ç%½:—øÆ$¾yó–ëh·á¶69ãäè0Ågú†›>Ζ8èL"Ñi¼ñŠ¡¿_»î=eڔɞ¿]¹àå5ÑÃcò·ïŸm}äÆë×oxyN$³¡êj«ûVZʼk—ÞôëV¯?έGn‰¤AƒOüæÍ¾víº:¬ú ú¼y‹6m;n‹Ù®î>®[Ûþ§.M›}}èðë«i>|ø¨—Eßo¿k}øÈÑ×=þô G—f_´´spÊÈÈ,=fÒÈâ±››WʳBCü<&´k×FGGç§íÇVdžˆõΞ=7ßoîÿrµp2*lW{¯™å^3˼¤WIy9—ΔòKP.\ìÒ¥“úaݺu.ðSÝ÷òöqrtøíÊOÏ þ Ôó$&&:´l±û¸Iª–€EÖƒ¬]á7¡ºe²—ÇïW/¶¸dYÙìMqa Ï“T÷‹'wÊ«ÔK?_ÍÈÈ*Ò~ù×+íÛ·S?ìÔé§_~¹Xx†u‘ûöZ(‹?ìk$³ ¬³?s¤ôŸnLKK¯jl\â¤ûv÷êÕC[[Û²·Ezz†ºÝÍm´D"éÖÕL&“½þ‹—ûôéýí7-=¨j9zìx£FŸjjjvëÚåð‘ce?°³2²jÖ®ÑÝ¢³ê_Þ]¶mÜõë/¿]»róé£çÕjTµ²6Ox–X乩©i††ê‡USRS öùó?÷ìÑ]WW÷ƒ¿LÎÏ€²E½?\õÐüÈî·þÖ²±‘QrJJêÕU•JeFF¦AA’“S¢6EߺõÇí;9Fkh`Pd!Uªü¥cš’úÙç_©îð.æ[ûÑý' …¢v½ZµëÕACãÏN©††H&“ßý#~ÛÆ]¿^ø­ÈÉÙ††™™™†††ê722TO½~ýÆêÐóý~ýõê7ß´ Ÿ (9°ßÑ·­¾9yò´úá•+¿õ`­ºïàè"Jkëa¡+J_H¥Jú™™Ùol``ðÇÍßîݹqïÎÛ·~/ËýäáS…BQ¸]QHzjÆÅs¿^¹x­x` ‚ðÃß?qRýðø‰“ß}×Jýо¯ “&Ž[±24éåK2ð—À¾•–b~d·ê¨ö¢VíÞzz•ƒÝðE‹—;~R*•þqûÎÔé3ìG¨&Ý¿ÿ s§Žß~Ó2òm#É¿ý¦åÁƒ‡®\¹Ú¥kOUKçN?Ý‹¿/—Ë·m‹h=´Ìöó' Š7ŸÊõ*)å·Ë7Æ?¹rñ÷/6ÊÕyqಳçΜ=w~É’ WgGõT---A´µµ§MìåíSPPð_/ûÆ ¬ö7ô[wn¥¥¨Fœ™6iž”—ó¹¡ñ[ŸÛ²e ?ß9KGޝZµªƒýð¡6ƒU“úÏ›8É;5-m´«sé ñòœä2jlzzÆâEþª–ÉÞã'zþüó…FŸ~ºtI@,Ú¥ŸÏµú±M‡.m:wï ¥]B¢½x–xûæ½Ä牿_¹ù¦ë•~Þô³… üæÍ[p/>¾±i£E‹ü›5û¼øl |bÕ·Ïì9ó|çÎúP¯W´æ\– «â~¶3à=ïQ£ÆÍâïÞ|÷ÌÞkf©ìÂIy9o†V¦œ:qÄÁy\é°i“æJ¥òÝëSzo»C—6f=kþyÐ]©P&¼Hºùû/ž%Þº~§Œ\`\UAþÖÿæàˆtW‹¯èg@Y¡êXÿ4OÊË)rY´ó¯Ä~$¥Sõ¶r…Y¯ŽJ¥"ùUªR¡HMIöäERÂË·v9ª™ e(¶ß1È?Úx.=¶µ´4Jåñƒ§5Ä…'ýݲ—Yd6”³ G)±Ý´Yc ±Fùý…ìÒ1nPqbû›w+j`“Ù€ŠÛøÕ‘ÙÙ€ÌàcøqÀsêÄŠ@f™TÖ‰D"Š@f™2ðθ Åy¿ƒ™ ÈlÈl@f22ـ̀Ìd6 ³ ³™ A´æ\– gïK‹OÓó˯ü×dre‘–¶ŸêêßÏ6h‚ Öä A®J*À‡!Ö”JA¡ä A©ü3’_gvz®BÕ±ÖÕiлàÃщäJ¥B.ÈÊÂè×™¯Ô b¹ “+Ù%À'“+e A®Pªw~¿Îì|¹*Ø•ù2A$RŠékð!»Ú‚ r¥\)(‹f¶LYx&Aà€6ŒH$ï>ÿ[)ô‚MK–DIEND®B`‚kildclient-2.11.1/doc/C/images/we_aliases.png0000644000175000017500000007575511405233117015675 00000000000000‰PNG  IHDR‘÷]§| pHYsÚk¥óÎtIMEÕ "wÓf IDATxÚìÝw\Gÿðï^¥íAEì±+¶(ì‚#"šL{R¬1FhbljQcI@4б= ¢16bEED4‘vô«»¿?Öl.Çq"‚~Þ/_¾–¹™Ù½™¹ûÞle¼¿AD ð,ÇqÇÑ©#Û©²e²‡®©ä^R1Ó«©¬Gc±q"†A³<‹»§·±,«7p,K,K,˲ò,ÃÇl"â8†Ö'㾫Š-8ý§öøM­ÎÀ¡3^<îŽbÿ¶Vu"½D +‰Ð&ÏèΩ­¬ô,g0pË8–é1èu!f ÑÚÀRZ–>%CŸ[Âf²¶‚ë³’ÒºÛØY‰Ž¤hNÿ©­ÄwrùàZEaªƒƒƒ^¯/vëÙ¤ëP³Ù²ï^Ë>ñmžÜ£ÛkÓÐýUÊZʼíeë`Íœ»«»®FØx*vVŒ½ÓÄYÒÖMê`ýx‡%ËÑíß6ëYŽã–e%lîdÜãᕸ{@ +;+QJ†þ÷[ÚÊ}o-úM¸w8|Äð±X¼ÿÐá¬{-œê·0É£)RIþŒ5ˆä-û½^áŸPN….ò\ñäž¶]é¯0°ôUBanqåÇ̼ô4͹Í^¯væ8.îÄù†CgˬíŒ^çį±ãr ݇ÖkÙ £¡zŒêhݹ¡ôÔ-mìÕ|±TÆàØ6@…ljhÍñ"?Ú©g ~’Íç8’¢9yÛü„¸u]±g}±ƒ5c#¥bÝÎaoe³©Y–æâÍ]$Dtí¡.³°J&¹¶®ÍrÜúœMLp©S§±«]òáoZ û”þ÷Ïìr—^×4kÙ¢›¾Œõ/á`’2óç¼Òfþœ',4«#ÜR¾þ÷"!Ïì!vŽÖ¢ð_ 2 Y±ˆæµ—‰û¿Cù–\¢íT%ì¢Ø‚'¾#a-OL¬±~½¡éÜPÚ¸ŽX£UËD‘XŒÔƒZH<ë—ëéâÑTýs/~'×°õLñäž¶Ö̽m‡};|U›}†aøIvòCýoišÒå›8Q›º\3g‘½­X­Õ—hôën˹+¨‘%?¢»yæçR DDtåÞÀVÕygõ=}S¥ä§]‰D2æÖÉ]¼‚ˆ(ûÖ9—’ä ¨Ý¨à'®Ýd.8uO®I†ð‘ކ=¹+G9 ¿o¢>÷óåþÕ[YúÎ e×#?á:¿×µC+™˜!"©˜9Ô~òN "úßÞèõÍÝp¥}úüpöôØí„<ý¼û\LNÛm08q½m/ÿ¶Ö=ˆNÝÖîK*a9ŠíHD)ôVfE|åmÐÕ’Käîæê(D. ñƒL-‰°{j„,U‘ˆac-—ÚÛX‰E"–e9"Ëé ­ÖÀrz–#ŽãrTŵD"³ª Åä.Ý×un(õkcµè I~ÝNeïÁVŠóe[‘HDÄ ¬D$’K%,Ëitz–å$±X¬wçÝ3(©ÔW³½CD9E¬«Êë»$²F~3ÿÜ=KÂiD {ïT”K]7¦8Ç©ç{‡r®Ú8ÛˆVM%Óæ,jÙ¤>užh2#çñqèý9Dt#SGdݧOŸ¥ßýß+®ïÑŽ;ÆŽ;pàÀ}+÷6­ãÇÇìió¿ðŠ|Ѻèô”³_µâzbÜI¾Ú9„ÜÈÐf<¼1ú ÛPµÍXyøsœmDju"Lj³àùËÌ-p²·±Œštr©D.•â81Cd³z Ëqeææ3 ¥[ )Îs$¢¹>ž_y /}Þ™“¸ÀA\"+ –ãˆåHD$‹dR±\/É/R‹E"+¹“4×Ú“Ï(MŠ‹E ©õUi¤ ºÿ§ðÔºbƒ„“JåêôÜúƒê4hWΉ)g 'ïÈmã*%¢M_/íûöŠÉe— Êáëÿ+×P¨Ö7kÖÌNŸéá$Ñét3gÎ zõÕWÅy+ê*DyùùW®\Ö¿+­˜ó~÷ñ_‘ïö[g®¢à…DtäÈ‘®¿êئ—P¹Ùm¨-ó줺-å­Ý$'¯j^,‘âËž»‡9ùÍÖÕôz½ÈZ.cF$MÞå8N*=ÌÉW—Håÿމf‹Ëeb"**Ñ>UñzuˆH£3k¯ã¨ ¢”;̘oÈ*dë(DCZYI´z"¢™fö`3%÷ë´¨'‘ˆu~ Ï2üï‘H*KÄ"No-–Êe]~†ÖÆ™9À®¯–›¨h3Ó8b4²:MmÕ2™•ˆÕ–½&;o¿e9"*((pl3ØB)ãúof±žî4õƒI"†â¿Ÿž‘š¡nUßöqÈèäï¿K¬ì”vVD”››«lçKD 4¸ÿ=ÑB~]®m¼%6ÿœg#cJoƒ¾–ÜŽ¦±³„ˆ.ü¥Óhub=Ëbš 5@zV>G\‰F'‹uƒØ bXNÄ0ìãÛrz½Ag0H$òô¬|ëlK·“?žØZË2U…å/ΧȥâbµŽå8…µŒOQkueç9:X3­#¢Œ3“¸U–½mSƒmÞÐ¥¬V¸ùW¦³½mIþuØC"·1~ÉÀrbÃrTÕ±&?í¤îÖK»’t­V«Ñh¸ÌC¹õÚ(Ü;”³†×·gÿó®5¬½•ÈÑÑQ¡°³PDgt$!9Cïé.3f 7³ôYš:vr­V{öìÙîψ¾P¬J;³páB©•í¶ƒ‰ááámFÍ)kmvjË<ÛÉFDDéyG–#ólxþ JþdiŽX– Ža8Ža¸Ç\qÄ1Ĩ JôrÎ$,/K9‹ókÿW,{ÒÚ… °¥yv±Dy9íA—VD¤ÖêþÊP5tuä_z¤*Ôhõb‘H$bn§gç”8è &•ÜWš»HêÙ‹o<ÒUQpW£ëZëÒÜBušòÓPëF=Šrn{ˆoH¥RŽÓßHÚ#m;º¬â#7fý<Ùt·ÿˆ ™ŸÖŸ]ë[˜q3:nö¥gçnfЖ(\›Y97Ö¸·wžÙD­JIdö4:n‹ÇÏ»{"’ãØfCþÛtðBµüÆ fJoCm™g;ÛŠˆèžŠÕ³"˰˜g@  *,aD$‹D"1ÄrC¯â8މD"FDªÂ+'Ó°h\ün†J*3 ÃñÅuzCN^˲å)N ¹*Ưz¸9^¼qßÂÚ‰Hû8f¸²âc[ÿÄ…´Î¯4”IÄ:½A­ÕÝÏÌkàâ“_l`9†H*±,¸˜V¢!'2©$ù¡®¹‹Ä³ôjz•Älî¯m,l¡h1ÀøíÉÚe^ßÒ³±Â`08ä?:õ×yIýÎeU2t]¦IŠÎ@"[—3ñ6è=‘Oäsê äÚå5Ÿ.¯•ú¡#õY}W¨7`ñe~Á@d0‘ô•‘a¯Œ {éÙ6@("üivj>™„ië&%¢©lœÜ ,ÃáInPä–Gr™„e9¿çŸ&®ÝJ'Žò K$Ó°XÅÓs D ãê¤ "ÏWX(N_„õø¼q³û]%NÎ^º{öºO÷V Cz½A«Ó?ÌÎ'"ÈDŒH$Ê+(þõlŠ}ÝÆ¬ØÊ¤’Ä¿tÃÚ[÷l"ûñâJÿÞfóîvf.&=ääÆˆù×Î F’å1:_ß®©[AAáÏ‹§òëKìÜ0d«AÆ2™„b¯«õzÄz1x: Ô„˜]¤áˆdR±¡ì€$—I8ŽË/ÒØs¦a±Ò‹§gç3q±m ʼnˆ?-Ñ”=Ï&"·Ö߯ü¢Óëý{¶‰EGËIH*©µtðÄ• {×êô[g[™Tréž.é®}}©wsyÜuuå¶¾îþåóETÒl¬\$gKo¼•ÓÑìi‰—ÕjµNGjC¢Uë Ùª&Ѹ.ÖD´÷’š$Ö,#Õˆá0π篠XMDÄ‘T"þ3=[,‹D O"É$âbµV£ÕqWP¬68“ˆVéÅY–cbˆq”W¨¶\œˆ4:ããÙeL†dŽõm÷^õÓ©ß.¦õêÐÔó÷Æõœï<̽z+ý×?RÎ$YË­ìÝš‰íÝ b9[ª’#)šöõ¥ïô²M¼«Í,¨Ô Ws ‘ÈÂcÇ·èñÓ9ŵç†$µÚ›Ým8Šc“ÕœˆµqmfI9ŽÁ<j‚"µ–¿[˱ +bˆåïh"1Äq CVr©XÌp©µ:Ö4,>ßâDÄO°ÿ>o¼ÌÉ¾ÈÆ¥©»ÌæÒ3ÇÏÇ•hÕ¬D"N&b¬eR{‡:ÖÎ mê6ÛÔ1¹Z‰÷¿kêNîÒ~-䋇9|²[U Æ÷÷ Ë·Õø®6D´ø—l‘’$¶’r,Y:É º8º·k?nQyrÚ)l ¬éL÷ù'“óÆ ‚)#•ع¹¶öv¬÷@[©/Égõ‘D.±¶—Ù¹ÈëKlœ8‘´¬VÆ*mEêK#F;†Ê¿“¥ÆÐyÁ0"É;½!]­‰hüw9y·­•$µaIÌáGÔ :ùº5õ,¸{Q›÷ÐrN™ƒ'¶2 jÏ·8ñ'Ÿ1®ÑÒ¸'<Ý™c ¬^ÃjKX½†c ŒH,’ÈE2k‘Dnö–¥ÆœlDs|ìºxȈèÀõßÏ.Âzˆe6½šHßéeÛÐILDã¾Ë¹zúW¹Ò]fWW,·}âÀ¨N¬^£/ÊeuO˜:ФV['‘D^£ŠÏö±'"fÏ¥b"Zy¤jŸÍ̱ì‡ý‡µ·±’2Dô =ý§ÆÀÒÍL=†Q­£´¹(D®vâ. eü­÷~¹¦^°ï^Á_eönR…R,W0" žÂ PY¦r"aß8ÇVyìŒø53úYpûŽîòW\¥£:Z£^‡®ïO*>ñëÿ$¶NrÇúk‘ÔŠˆˆ3à„q€Ê¢5ÝS…ªþÀ#Ã0*Í긬N£T*Û×—C-]å,ÇqüÛ –È,4ÜSéÓó wo\2h‹Å2kë:År[‘ÌF$‘#bˆ#Dl€Êó¯{ªhTéÕ³VŽãˆc3þÊ}ø§Ž3èauÄ8–%œ­T‹0ümqþ´bÄ,k m±A§Áþp€*™gë]ˆH"ü½c¢ ¦»-_¡-jÄlÄl@Ì@ÌÄl@Ì@ÌÄl(I9óO8‚Æzax÷„Fxac6Mšü1ÚëÀq\Zê5´À‹³ù¯{4Y­†h P{áx6b6 f fb6QLLŒL&cÆÊÊ*66¶ÚÖË0 :³Ÿ"`¿þúëÑÑÑÇ}÷Ýw£G>vìú ÆÅìààà~ø!00_Þ´iÓ™3gø—rssýüü¬¬¬|||T*•09^¶l™‡‡‡L&‹‰‰±œsÁ‚íÚµ#¢ÄÄÄnݺÉåòúõëoÙ²} ˆÙOM§Óñ›7f̘™3gò˳fÍ /((˜Ovv¶R©4.[VΜœ'''ãÕ ‰D—2^õË,-õZ³mpg€Zdì¶¼w:ÐÓÞ­ ¡”ÿ333S*•òËb±XÈÆlceåö£GÖ­[wñ⍤$ô4¼0ªu߸T*KQLLŒ}•J¥V«å8Žã8½^o¡’'æôóóã8.44tÿþýè`@Ì®ˆèèè×_ÛÂ9äüKÉÉÉz½~óæÍ={ö´PÉs¦¤¤ 6¬W¯^kÖ¬AÀ £Z÷þðÃÁÁÁ:N*•FGG §¤…‡‡7îèÑ£­ZµŠŠŠ²PÉsnݺuüøñÙÙÙ³gÏFbvÅöV«-îìì|øða“Dã³Æ„å'æ â—§L™R:@m„{— fb6b6 fb6T››7Óš¿Ò–ÿ—–v‹Oäÿ4^€Ê%AÀÓ:wþ‚ÑòùfÍšþ+¢ß¸Š&À<jFÌ>wžˆ<=;ѹsL^æÙi·n‡Œ³]‡.­Útô:üøñDtéÒåQ¯·nëÙ¾c— o¾uïþ}"Òëõ_|¹¨S—»ö›¿@§Ó••1à©çÙoýçM“9·‰©ÓfŽ ºtáìî]Q7o¦Íš=—ˆ>údÚå¤+‡ÿ·˦oOž:ýÉ”DñõÚíßÿøÙ¬ésç|öãQ_¯-+'b6@yegçܹsW¡P 2ÈÑÁáÏ?ïdgç˜ÍùsÌ®&M‡/_5óÓω(33“ˆ ‰èƒ?¹ý矗/&þ´3’ˆböþLDCò2˜ˆö8TVNÄìj‘ÉdÆÏøÊùTµ¡ÿžÇ$û<uhßN,ó»ÇÏ_0?ÕÞºmû¨×‚oݾ½hÑô÷ícÿoÎl…B‘œ|}öçaÞ}<ô?"zô(“ˆº¾Ú«ƒg7"JOO/+'bvpJq3~Æá~àµ(fŸ»@D'OnþJÛ„cÇÉÜ!mÞª¯¾&¢¯V†·hÞLH1bØé“ÇÖ­9r¸*/oÎÜùDäììLDçÿ8}óÆÕ›7®¦$_.+'bvµ†mžðŒ/“ªbbbd2™T*õôôûì3“"'Nœ1cF~~þ’%K¦OŸND#FŒ8pàýïÿ:t(º¹]½zˆÚµmMD;´ç£²F£)sîç³ß}ÿÃÔ›iBâ׫úõõ~{ò»ÃFuîìùõê•D4uÊG¯Y½zÍ&õîÝó«Uáeåx™1›NÑú—wLt°ïx‘I“?6ÞƒÍ0 ÿ§°Pžy¹IÎÒ• 4ÈÞÞþƒ>èÙ³§µµµíÏ?ÿlÔ¨Q~~~Ë–-ùã¥k3 ‰„㸓'OÎ;÷×_õóóûøã}}}ÑÓ¼´ÔkÍZ´IK½†¦¨-ÆnË{7 UÊ9hÏ8Û6¥R©üýý]]]ÏŸ?/¤7l؈ Evv¶I‘GÍŸ??00°eË–|J=nܸ‘‘‘qöìÙ~ýú¡¿àP 1»üól111R©Ô$ÑÅÅ%>>^¥R­ZµÊßß_Hç¯ÊËËsss3)âççÇq\hhèþýû¿+‘ÈÇÇ',,¬GVVVèf@Ì~¦€ýúë¯GGG›¤·mÛvçΉD©TO©—.]ªÑh"##MФ¤¤ 6¬W¯^kÖ¬GŒ±yóf???ô1¼žé~ãØÂ^t©T]:oÚ´iÒ¤I!!!b±Ø8¢»»»»¸¸ 0àûï¿7)²uëÖñãÇgggÏž=[HìÓ§^¯GÌÄl¢§¿¨ÚB~á%//¯äääÒ¦N:uêT³E‚‚‚‚‚‚øå)S¦ð çÏŸïСC³fÍÐÇð²Çì~”‘#Gò×j`ž]}*ðû ??½ /<#1³³1³³1»B´Z-z³«Pe=²ÓÓÓ=ˆÙµ€Ù’ fWÉ„{Ù²e2™,&&FHŒŽŽvttìÝ»wFFFé©9¿lü?ÀËã¹ÝoüþýûÉÉɱ±±ÁÁÁÂñ鸸¸ôôôíÛ·öÙge=áƒã¸ ?´ªÇñ„#hxÙx÷ôÂÆì°°0[[ÛÀÀ@N'$Î;×ÚÚ:$$dÞ¼yèþZmÒäÑðòà8.-õÚ ³•JeéĆ ‘B¡ÈÎÎ.ݵn×ü¬iûljõ>¤¸ñ/Õ>¹þÍÖØ7È0ÌÍW«g]5ëYœ™™™®®®yyynnn&/•ŽâPóUïÎg!ìï!ÛYÓ¶§¶o|­nO¼ÙÚò«ùP`Í:o|éÒ¥&22200O‘J¥111ÅÅÅ‹-²‰Å⬬,DDx©Ô¬˜íîîîââ·`Á>%:::88¸aÆ­[·²ùûû»»»£óà¥R­ûÆ…CÆÇ$Œ—§N:uêTã"ÂYå¡¡¡üÂÏ?ÿŒž̳1»|³p¨á²Iãë'¡:[ÞBJù_À<ž³æ¯´5ùWÊ™Xþâf³íˆÞU±UTi»µjÓqøÈÑ—“®XÈ0|”ÉÂsït ¯^¸pqÜëÛuèòùœ°û÷TÏ&ݽû×ޚܮC—®Ýz~>'¬¸¸øÙÇŒqƒ E,wAéü5íCW)öT£·bŸV³õWÖ×KÍ$!€jQm×/>£èè]ú÷­[·nj7ƒÁ°#z×ìÙsì)+gZÚ-“…ëÚµäwßÿp~ØÜ¾}ûdd<úlöÜÁƒ¾ñú¸ª^ï”i3†ú­û&B­Ñ¬]û풥˿˜ÿÏ^­Ð࠷ܥ󿨺òÞç[mùvÂ<žÿTlÃÆÍ}úlÕ¦clÜãË/'] 5¦u[Ïž½úíúi99ùºïÐá¯OøOvvŽI=yyù“Þ~§M»N'…æçð‰¹¹¹oL˜äÙ¹ûÎ]?•“>9}þ K§›Ýªæ¯´ŒŠ~µGŸnÝ{Ž=râ÷“={÷7~/f7¬Äbñ¨À‘7ÿþ®/½1üDA˜Nñÿ›]{óWÚ~³v½Ÿÿˆ²Ú¿¬ß°é“?ôõbmmݸq£E ç'ý=I2ÛαqGZµéزu‡aÃG=›Xá¶½~=%8x´•••£ƒÃ§3§ýr8®ô4Ëx¹ô+½%Æ ^ÖÿÆ5›}5++ûõ ÿiÝÖsâBU*•…OÇ38ØïîÝ¿ø]C|,|ÜÊ3þÍöËGï‡å3~:Ìv¥°œ““2þÍnÝ{oûî{!Ñxá¹|"³¡ÖÈÈxûˈÕ+>úxŸ2óÓÙ¡oOºtáìŒS–, r~ÿCÔÏ1»&¿ýÖ²ð&•„/_9kæôËÇY¹j5Ÿ¸lùªáÃüÏœ:~éRRù·§GWí„osAY[•r#õ诿|9ÿÿ""¾IJºr$ö ñ{1»a Ñh~ŒŒjÛ¦uYÃOnÞ¸*,XX{]—Ý»¢ÊjÿjpölâÀý…?ÝÝÝ—-]d¡?úxÚÿÍ}íÊ…?|ÿÓÏæT¸mû÷ó^Ôb IDAT¾ò§Ý1i·n‹Åâ³§³œ¿ô+½%Æ n–­X¹z@ÿ¾¿;rófZ9¿‘³á%R›=´öá‡ï[[[, //_ÈùчïËåò=^M8vܤò_ã6kÖT"‘ <0îH<Ÿx,áøÐ¡¾r¹üƒ÷ß}ªMýìÓk×}k2u+s«þû¾­­íàÁSnܘðÆxã÷bvÃ*Ðnºô8{dñ¢/-oLyš…ˆ† lccSVûW•*ÏÙÜÝ‹Ëzk¯vëzâÄÉ3g½ûô>úëá ·í‚óY–ŒÜ1Ô„oÀµkOxªoé!gvKžÝo¿ý>,`¨D">ÌÿhÂq ŸŽgüÐõëçÍÇìßÿŽÙåKåï—'ŽÞò ËgùtX–pì·1A£­¬¬þûÁ{f3<—ODùáx6T“²¦Ž&)ÙÙ9?FîHN¾žrã†qº‹K"’J¥*UžI‘œœÜ–­;;Êד“øº>ÝÁi{{»÷ß{gñÒðÅ ¿xâV)•NÂJmmm˳aÏÞnemL9×îà`o¡ý«ÒÉ);'§®‹ ÿ'ÇqùùüV™}k_­ ÿè“io‡¾'•J#ØÖ¶m›Šµ­£ƒ»°°02*zÆÌÙüë¨ÉÕ+¥‡œÙ-)Ë×ÅäååñƒÇÖÖVØ7þì½SzðtµÛÌO?×jµ)7R;wò,ÿX*¿ã·Š…ÆÏÊʲ··:·<ßH˜gX2éíwˆ¸ààÑ¿]kœ~åÊU~?˜³³³I‡ë×.ñ{†S’/ó‰uêÔ),,ä¿#žv|}ç©òN>óÄ­²ü(w³VuMT=kv]ºv>vìŸýÒ.\5:ØÂ[S*•?lßzáÜé9³?}{ò{~w]ºyñçŠ+Љo¾ñç;¥v¨,9³[R¾] *Ë=UR¢&¢¢¢"GGǪky©TÚ±CûõßnìÒ¹“H$*ÿX*¿«áuBU¸uëö€þýºtî´ý‡HãôE‹—i4š'N<ФȀþ}o¦Ý2 »ví Ï'4`ÿCZ­vý·+°óÂ>_²tù·Ê2³VEM$‹sssªhí•ð›câ„å+VÅ=¦Ñh®§Üø|nؤÿ¼iá­ù~èÐ/‰ÄÁÑ!7WUá¶õ2dÓæmYYÙ%%ê ·¼újW>]"‘ÄÆ))Q¯]¿Áò3»%Bƒ—î ³5—ÎïíÝûèуÁpè‡ûõíS¥ß¿¿wÄ×k…ó Ê9°Ëß/ÏëCQšÙÆ4pÀî=1Z­vÝúµñ뱺cvdd$Ã0QQO8ÑÀÓÓ³ÒW-ÔiybU¤ü—Š.[²pê´O òkìáaœþåaÃG¼öcÔŽéSMÎ=ëÓéK–†·mßyÛw?,Z0ŸOœ>õã#¿Æ÷öجYÓ lpݺuCÆŽyâVYfvÞÙé×Ï»WŸÆ U´ö t½IJ§Nž‹|±råW<»Mzë×F?n¬…·¶xá«#Ö´nëùÑÇÓ"V¯¨pÛ~>{æƒ|ý†uëÞërRÒÒ%/àO8êã= y³f–‡œÙ-¼t_˜­¹tþÏ>ñcÔŽö»Ž›ýÙÌ*ýÐõëëmeeÕ§w¯§Øåï—çõ¡(ÍlãO›úñ‘_öèé]¿~½§=|^0›NÑú—wL´´ÿx‘I“?~ö[•5Šã8‘H´{÷nK›UÏI}©ž¤[–´ÔkÍZ´©ê‡Ù £¥æ?‹³Fmgmi·Ú²ñµº=ñf«ô êõúÝ{öî?pð‡í[+eÃnÞ¸Z¥_­c·å½Сâól¦lJ%$$¬Y³&>>^¸‘q~ÙøÿŒŒŒÈåò!C†‡†Y¿~}ݺu]\\öìÙ× A™Lóøt’ÄÄÄnݺÉåòúõëoÙ²ÅlÍ*_¶l™‡‡‡q…ð˜>ó³.ݼÚwìóóÂ/ç׺í¯`Ìæ'¬Ü¿Ñ“Ηx*ùêÅQß7jäQë¶¿âdz9Ž3™"?qÏóîÝ»‡ND#FŒ°¼o\pøðá©T:nܸƒ éaaavvv#GŽLJJúðà E`` pçý«W¯Ž3F.—?Þä\rVnkkk\!Às÷L×góa[øßrfµZ}ðàÁèèèwß}—ˆìììÔjµ•••ÉôÚDNNŽŸßøÔ|"’H$üK&¥=z´nݺ‹/&%YºVY•+˸Û@­œg›„íò̘_}õUaGz×®]ccc3˜½ZN©TòG¾ Œ¯Êµ|àÜÏÏã¸ÐÐÐýû÷[ÈVVå/Ú<ÛÂü¸´Ÿ~úiòäÉŸo¿ýöO?ý4|øp©Tããã³hÑ"áU±Xœ••U§N__ߌ5jçÎC‡-ç&¥¤¤lذ¡yóæ³gÏ.]§R±Ê¡üŽ'Áv¾ÀíV[6¾V·'ÞìËÜ›U³ËC«Õž:ujóæÍBʨQ£æÎ«ÕjùS½ììì–,Y"¼êïïïîî®V«—/_ŸØ§K›Þ[/Þ¸ÛdY½bzð´åDôYèèßÎ]=q>™ˆ„JŒ_ÂNç›ÔäO!Ñ˳å§o½&‹2²U«¶ï¿’úøÉÜv¶Ök>ŸüæìÕfKáCO ûÆ^X×oßkÙ¤¿,—IßÖo]ô/&˼/?÷îŸüÂâwÇø,øhü·;ycx™Tb\‰q"«5DT¢~|Í˧o½¶tón"ZyèÃñþ|b'ûwv´+«b6Ô²éà8o´ƒå&êÓ¥MôŠ˦½éhoË'*l¬æÿ7$&â³/?gkm%äë×{íÜw„²É·îµnêÎ/öêxîZš*¿Èd™·ò»}b±È^a#‘ˆ¿Ú¾?'¯ðBò­Ý;WbœX{•nºó߯çâDDõ\œÖ‡½GD-Õ_õé[{#>Û¾ø“Á==ÍÖsñúm"ºpýÿ§D,:u1…ˆ.$ßzgÞZ>qÕ§“?g¡>t€˜ µ)QäÁãh Ë:µnúƬUGÏ&M1€O™8rÀ–=G‚¦,ýåÄù7†÷ræäN]¶Õhž}¿Õßóì[òAÅdùñˆiÚÐí£E›š¸»2"†ˆN]LñòliR‰X{•nºÄ+7;µnJDž­šž¹|ƒˆ¦L¾çÈ© ©Ë¶íkÔ ³õ,Úð“ð?e©òƒ}{‘ñ~ˆo:üû ¥ð¡Äl¨M§À”ÇŽC¿iuúc‰W»´mƧtïðʽ‡Ùz{òbŠWÇ‚èÉ‹×Õšö»¦ÝM÷¨ï"‘ˆ‰¨©»ëíû|ºñ2/[U0mÙÖŒlÕ´e[3sòˆèöýŒæõL*k¯ÒM—xåfç6͈¨Së&|Ì~ÿËõ¿»¦Ó“6Vå©ö³U?´nÖˆv®˜ÑÿÕöÂO(|è r½t‡¦´Z­L&CÇ?ü¹ÈƒÇù|w”Sfn>•h´v¶6|ŠƒÂöç5ïË˲ÿÜ­¯°Xm\P§7ÜMÏjÞÐíúíû 뢒ǯ/—¥°¸„WÆ•‰µWé¦KJ½3eÂ0©Dܸ~Ýä[÷ˆÈÑÎv¨w—¦î®ê×-gµé™9ó¾‰:°vÎüuÑ_ü7äèÙ$|èोÙiii|ðÁñãÇ­­­_{íµ•+W*Š'–²üœ1OOÏk×®Qùø UñõÁ/`ïÜS„;U~‘­µ\•ÿxÞVP\òæg_é ìË^¿}¯U÷ë·ï•¨m­­ ŠJˆÈx¹,¶ÖVÅ%“JŒk©ÒM§×nüù ȧ׵[ñß óÿræò_~¿‘¥Z÷ï–§Úè3Þšû5]H¾U£î‰Ý ¦Fï?~¼OvvvjjªÝŒ3ÊSÊr$NNN.O6¨ ï/~ïãë£üFé)•ˆûukwòïƒÐ‰I©înuÄ"ÑžžË§O´³oÝkÕÔˆnÝ{(ìÖ6^.Ksz7鍊TbœXK™mºÄ+7Çù{ó;Ɖ¨«óÙ¤Ôä´¿úu-gµWoÞäÕ‘ˆ¼<[–ç·>tðÆìK—.…††Z[[+•ÊeË–íÞýøZÒÔÔÔöíÛ+•ʽ{÷ së ´k׎ŒüÂ0Ltt´££cïÞ½322„—Œÿç–-[æáá!“ÉbbbøÄÌÌ̾}ûº¸¸¬^½O’©D‘cïÜÓÊÊÍ\6ͳuÓï÷?~¤Íæ=GÞ5h÷êYüñãA‹1û~«¦ ˆè·sɽ;·æ—˺H·wçÖÇÏ]3©Ä8±–2Ût‰Wnjuú ןÎýÕö}Óÿ3rãüÒå–³Ú-1G{yÑ´7G,Ú° :¨"5z߸¿¿ÿ¬Y³ºtéâååÕªU«Gñé³fÍ íҥ˄ FŽÉ'Ö«WïôéÓ&5ÄÅÅ¥§§oß¾ý³Ï>Û²e Çqfw‰ß¿?99966688˜ÈØçŸðË/¿|òÉ'%UñÛP~{=³÷×3Æ)E%s¿Ž´ÐªÂr–*âì"Š?syô/¥ƒ]N^ñ²Ù¾P:Øux¥‘p7_‰Ib-e¶érò F}üϳ€OœOn³7þLyí½‡Ù,øöÀÚ9£§,«™£:Äì*·aÆÏ?ÿ|ݺu“'OnÞ¼yddd§Nˆèøñã7nT*•üÓ/—f6–—àÑéøÐAµ©Ñdz•Jeaa!ÙÛÛüñÇ©©©|º½½}^^^yjÈÌÌ$¢¼¼<77·§Zu:uT*¼1J1û ^{íµ+Vddd/[¶¬oß¾|z¯^½vïÞ}êÔ©-ZX®aéÒ¥&22200O‹ÅYYYO\õˆ#¶nݪÑh/^ŒQˆÙO°råÊ;wî´iÓ¦N:‰‰‰[·n"ñ’%K† a¹www—¸¸¸ ï&ò÷÷wwwâª.\¸oß>777ò\PÕjôñl;;»-[¶”NoÓ¦°Ÿœg|*¸ñòÔ©S§NjœóçŸ6Éf¶¬³³sBB‚N§Û¶m[·nÝ0P*àû… àe“UM÷-ÀýÆÍ›0a‚R©T(Û·oÇyã€yvÕz–;mß¾ƒj̳0Ïø[é+àKËÉÉAC¡Ó_NUñ¼A´?æÙÇY„ö)ËÅ‹•JåÅ‹ŸêKùÀ®®®J¥²S§N¿ÿþ;:½üQÍr¨+O ¬ooo“ú+eEøÐ!f@µÚ¶m[HHÈwß}÷T¥Þzë­Í›7ÑÊ•+qÏü§ò\¦ž7nÜÀij¡¦cÆò­à_r………ÇŽ[¾|ù±cÇŠŠŠˆ(;;{äÈ‘5úþûï…liii½zõjÚ´éÁƒT¥Ó鈨ÿþ‰‰‰ètÙT*•Ë—/ïÙ³§ÉL7""¢}ûö®®®0©'<<|ΜÝÍ»t/\¸paàÀnnn­[·þñÇ˪–_£ñÿˆÙP6!f[ðÓO?ùùùY[[ûúúþôÓOD4þüÑ£G߸qãܹsB¶/¾øb„ QQQsçÎåSêׯ¿bÅ "R«ÕètcfˆÜÜÜâââL2§§§Ÿ9sfóæÍo½õ–qúW_}•’’òå—_'–î…÷ßÿÃ?¼sçNXX˜XºZ~n6 fCMØ8¨fÙwß}BDÂîñ¸¸¸‘#GÊåòéÓ§ ÙNž<9f̘îÝ»Ÿ?žOÙ·oß™3gˆ¨qãÆ;wîD§ Ì6 ØÚÚšdž9s¦M@@€ðÄ?"úæ›o~úé§µk×òoÇB/œ:uŠ_WPPÿü Ք·êÃÏ®æÍ›Ç/ `?ÑÑ£Gù…öíÛÇÇÇQvv6ZŒŸ8§R©øÇÐ š6mºsçN¥R¹cÇŽÑ£G3Î3Û€DdÒ€<³O ¼xñbnnî£GLî‚\º233·lÙråÊ•k×®=±Z€Z³…Ÿ±R©´]»vß~û-Q†ažö“_"PéæÏŸ/,„……¡A*ÀÅÅ¥  ÀÞÞÞøñ²vvvùùùBJãÆùSÍûõëDz,:Ýr>•7nذaáÂ…ü“‚-ô˜1c|}}'L˜Ð¨Q£=z`ô³«éûÆùkŠ‹‹CCCß~ûíg©]z3,,ŒÿÇaìŠ:tèîÝ»5ͪU«„ÄîÝ»ïß¿?11±k×®|JÏž=###‰èÀR©n¹ŸÖ¤I“.]º”””dœXºRSS}||ºwï¾qãFËŠÅâ ÿ†Äìš·7@"yóÍ7“““Ëšˆ/gfföíÛ×ÅÅeõêÕB¢ñ²eË<<’+,,ÌÖÖ600P8iÓÛÛ;66¶E‹¾¾¾UוP­ß#ÏûŽö‡ÊUÓcv9göÆÙ222ø³7MÎ 5þùi’ìïï/“É:wñ‚@§£ýáð‚\Ÿm|úF:uøK!322ÊYÜÅÅ%>>^¥R­ZµÊßßó+™T*‰‰)..^´h‘8bĈ­[·j4šÅ‹—³ž¶mÛîܹS"‘(•Jœ½ ˆÙ•/:::88¸aÆ­[·.\¸oß>777…BQžz6mÚ&—˃ƒƒ£££1, ªÑdzË:˜-¤ò'~Qhh(¿àì유Óé¶mÛÆßƒÅ¸ˆq²——Wé ÉàáfOð’ÈÉJÇ<»‚&L˜ T* ÅöíÛÍž7€yvðÜï €y6æÙU©<÷vÀ=MÑé€ö̳¡Fà,Bû”åܹs Ü;w^u±­ÒïVV…U±.|è³ ¦øöÛoß|óMœMYÕ±­z*D¤Äl¨Å†ÁC9-(((8räÈÚµk9RXXÈ·ØúõëëÖ­ëââ²gÏž¸¸¸ ?¤ÎìÃîðäºrŽÆÊj[áÕÔÔÔöíÛ+•ʽ{÷¢…1j÷W$áAÚEFF>ÜÆÆfذaüó°‰()))--mݺuóæÍKLLLIIáo.d¡žàààˆˆµZ6iÒ$4lY*½mgÍšºÿþiÓ¦¡y¡¾6kò³8¡ÒUç³8G‹ñSSvéG©‚±.]ºlÞ¼ÙÓÓóâÅ‹o¿ýöüÁ0LFFFݺuõz½T*ÍÏÏ·³³£'= vРAööö|ðAÏž=­­­«í7ÙŸY:ݸé*«m…W]\\RRRŒŸKTmﺶ´?¾ZËCx'æÙP}æÍ›ÇϪùÿñ}ñDçÎóôô$"OOÏ?þøƒOtqq!"‰DBD|P1˸y£¢¢T*•¿¿¿««ëùóçѰe©ô¶ÍÍÍÅ ¡ÕÜk½Ìž]Yz®†ïýZdþüùÂBXX¤?¥?í†rZ­þñÇýýýÓÓÓÑŒÕÓ¶öööyyyüÓž]Íg_PÖÅ ص Çqaaa|äÆaì*böawxrÝójÛ^½zíÞ½ûÔ©S-Z´@‹³-ü^°`A»víŒgfföíÛ×ÅÅeõêÕ–sssýüü¬¬¬|||øÇl›Ô‰3l«Ô¼yóðK«J™}Øž\÷´3éÊjÛ¥K—.Y²dذaœð2Æl"ªW¯ÞéÓ§S>ÿüó€€€»wï^»vÍrâ¬Y³ÂÃà &Ož777áP·ÙÄððð3fØØØ¬^½zãÆ¥«Â¶P3Õ‚çg›t1{>§³³sBB‚N§Û¶m[·nÝ,'>|ØÂ*ø³@12óì*1aÂ¥R©P(¶oß.<µÐl"æÙÏÓöíÛË™€y6 f f£ j…§;ž½yã7h²Z­_¿þh̳11M€˜ /MÌnÖü•·B?hÖ¬…òVè& ˆÙÏ_“&Íîüy«qÓæ¥_ÂIìðR©Ñ÷.•H¤nõìÙõÚè‰Dbò¸ë·B?àö‹KÝž½ú*Õj͹?NßHI&¢F›èCDªÜœS§~{˜þ€ˆäry¿þCêÕoð0ýAü¯‡µZMY9³ŸBCF=,.*z”‘Ѱa£Û·ÓÌfóî;ðüùÄ»wn7iÚ¼‡W>fèsêäo)ׯz4jâÝwàÎßQ×W½Îžù=/OåѨI—nÝOý~¼¬œ5MÞ7Þ¸IÓ»wnÑ;·7iVV¶Ý?EݾuÓ`0¤Ý¼!—ËùćéÜÝÖ«ßàÞ½»BnäÑ$/OŲì?o5nÔÔBN̳ËK,7lظiÓ½z÷#"N'‹ CéœÖÖÖ­Z·sv®ã¤tÆÇè3Ä'€eÙƒb²³2‰ÈÊÚú?o½Çgž™m6'bvy¹»{dffüïàÏüŸCýG6p÷à§Ý&||‡Ý½ûgÊõkù¯ãÕê’C÷ŠÅâfÍ[úøDþ¸•ˆ4uÔÛX–5.n6'@MSs÷7nÚ,%ùšðgJʵ&eìwpt¼{çvFFz›¶„Ä×F‡4iÚœã8F-·²âïÞýÓÑÑI$½Ò²Í°á¯YÈ €yvù~JˆÄuëºývì¨òçí´.]»‹DâÒ™‹ï7`ˆ\nuéâBâo¿íã= ÿ€!ÇÅÿz˜O<{ædÿþCêÕo§Ê=k!'bv¹°¬aWôÆ)ƒ?AL¸,[X¸}ëæí[7ùå+I—ø…GwïŠ4©V£Vÿò¿}&‰fsÔ¸ -š1³³1*èéÎÇã/k»´Ôkh̳11M€˜ /GÌîСÚ5k„?׬YÓ¡Cô f×8III+W®ÌÏÏ'¢¼¼¼eË–%%%¡Ï1»&òòò:~ü8;v¬GBzbbb·nÝäryýúõ·lÙÂ'¦¦¦¶oß^©TîÝ»—OafÁ‚íÚµ#¢ŒŒŒÈåò!C†dggóbbbd2™T*õôô>¾wïÈw IDATÞBúĉg̘‘ŸŸ¿dÉ’éÓ§ó‰³fÍ Ý¿ÿ´iÓ„œõêÕ;}ú4MŸ>}ìØ±………B‘àààˆˆµZ6iÒ$ @Ì® >}ú˜ÙW¯^3fŒ\.?~|nn.Ÿxüøñ×_½W¯^iiiBÎQ£F) ":|øpHHˆT*7nÜÁƒùW½½½ccc|}}K f?¶mÛÞ»wïúõëwîÜ騱£þèÑ£ùóç¶lÙRHÌÍÍurr2©AHÉÉɱ³³#";;;aßxTT”J¥ò÷÷wuu=þ< fWÃ0^^^‹/îÞ½»X,Òýüü8Žã÷„ ‰öööyyyeU¥T*‹‹‹‰¨  ÀÙÙ™Otqq‰W©T«V­ò÷÷Ç€ÄìŠëÝ»÷Ž;ŒwŒQJJʰaÃzõêe|1X¯^½vïÞ}êÔ©-Z”®Ç××÷Àz½~çÎC‡æñ;wî”H$J¥R˜|Ô@’š¿‰}úôÑjµ&1{ëÖ­ãÇÏÎΞ={¶¸téÒ#Fäææ~ÿý÷¥ëY¾|yppð„ ú÷ïÿÃ?ð‰›6mš4iRHHˆX,ŽŽŽÆ€ÄìŠà8ŽˆzöìÉ/)DÄ/O™2…_hÓ¦MjjjéxuëÖ=zô¨É*¼¼¼’““1 æÃ½K³11³11³11ª[ͽw)Ã0¥9ŽcÆøŽ¤ˆÙÏ™˜M‚46¼œjß¾qaþÍ0ÌúõëëÖ­ëââ²gÏž¸¸¸ Èd²˜˜>Cnn®ŸŸŸ•••J¥J-X° ]»vD#“ɤR©§§ç±cÇ01»ª$%%¥¥¥­[·nÞ¼y‰‰‰)))ÑÑÑÁÁÁü«³fÍ /((˜cÆ ›Õ«Woܸ‘OÜ´iSXX˜\.ŽŽŽÆˆ€çERÓ·O"1>ŠÄ/O™2…_0¾&[X¶399ÙxBggçÇ›l€———I~̳11³11³³1³³+[‡ŒŸØ±fÍš:ðË Ã<{ýB%•RÀ˳“’’V®\™ŸŸODyyyË–-KJJâ_2¾g8<ç˜MD^^^Ç'¢cÇŽõèÑ£ô9&&F&“I¥Òÿoï¾ã£ªò>ŽŸ;}’LzÝR¤(M©Ò;ˆ«€‚Šˆˆ¥Ø]—]¥+ÂcC@±7X]éEzG¥Z€¤N2)Ónyþ¸8fÓDW% Ÿ÷‹õ5sî{g~{2ß9·¶lÙróæÍzãÉ“'›5kùí·ßê-N§³oß¾6›­wïÞ999e­nïÞ½mÚ´±Z­5kÖ|ÿý÷ëš9sfݺu-Ë7ß|SÎÓÒÒºuëfµZ{õê¸gÑA|ùo€JœÙ;vܰaƒbÆ ;v,9ðaÃæÍ›çñx^~ùåÑ£GëÏ>ûìƒ>¸lÙ²‰'ZfÍš•——7vìØ_|±¬Õ5jòäÉ.—kúôé“&M ´§¦¦&&&~ùå—Æ +g“&M>|x~~þ!Cоü ß6 iáŽ|!Ä»Ë~1*¬œù¶lZ?zìøÿq ¶$I‡9räþýû›7o¾xñâV­ZéË”$IУGÐÐÐG}´}ûöv»]aLLÌñãÇ###‹ªQ£FJJŠÉdRUµnݺçÏŸ/ºÀƒEQL&S`jVV–¾´Àœ¥.°ZµjIII‡#777!!!==½ØÂËÛPÒÉ£õš$<ú§®åé-PYüÙ_­ÃçŽÐü*Œ³›6mzþüùcÇŽ%''·hÑ¢ä ŸþyNNNÿþýcccwÎv:EgËÈÈ0›Í’$ÆK—.•µºôôô)S¦ 2äúë¯/Ú^4þËY`vv¶ÃáB8ŽÀ¶ñ€¢™TêÛàôWg¶$I·ÜrË´iÓÚµkg4KγaÆœœœ9sæôïß_o ÍÍÍ-º>ŸOÓ4MÓdY.ku}ûöÕ4Mß®^þ+u‘‘‘………Bˆ¼¼¼¨¨¨b/)šâ¥¾m*qf !:vìøÅ_”º3[ˆõÕW&“)222Š:tXºtéÎ;ô–$&&ʲ¼hÑ¢öíÛ—µ®ãÇ8°C‡EÏ1+U© ìÓ§ÏòåËeYþꫯúõë§7šÍæo¾ù¦°°pêÔ©å¿mþ@¦¿~•:uòù|eeöÂ… G}×]wÆ/¿üRoœ1cÆàÁƒNçǬ·Ìš5ëî»ïÞ¸qc£F>ÿüó²ÖõÁŒ1"++ëùçŸ/ÿ]•ºÀÙ³g6ìÞ{ïíÚµë'Ÿ|¢7êG®9ŽéÓ§—ÿ¶øý¥Ç áªã4¨t_­Wí4ðûÙـ̀Ìd6 ³ ³™ ÈlÈìßï³Ï>“$©¬+„K’ôחબ€ŠžÙK–,¹í¶Û–,YB騸™]PP°iÓ¦7ß|sÆ ú}©…™™™Ý»w [¸p¡Þ’””$„HJJjÔ¨‘bïÞ½mÚ´±Z­5kÖ|ÿý÷ãã™3gÖ­[×b±|óÍ7zãÉ“'›5kùí·ßê-N§³oß¾6›­wïÞ999e­2û+W®¼å–[jÕªuóÍ7¯\¹Ro|öÙgï¾ûî´´´={öè-ýû÷_»v­bݺuƒ BŒ5jòäÉ.—kúôé“&M ,055511Q¿9f`i>øà²eË&Nœh™5kV^^ÞØ±c_|ñŲV ™ý‹¥K—êräÈСC­Vëˆ#œNg`/¿ürppð!Cü~¿Þ²eË–‘#GvèÐA© !¾ûî»F™Íæ!C†ß%W @gúËÖäñxV¬Xñå—_Ž7Náp8<ÍfËÈÈ BÔªUKŸ³K—.£Fòz½‡jß¾½"==ýwÞÙ¿ÿ¡C‡Š.322²ØZœNgDDDÑ–ŒŒ ³Ù¬?6Æb+€qöekÖ¬iÛ¶­ö³Ö­[ëÀccc].—ž£úœ‹¥mÛ¶Ó¦MëСƒÁ`BôíÛWÓ4}£wùk ÍÍÍ-–ë>ŸO_©,ËzcÉ•@f_¶dÉ’±cÇžŽ3F?z|ðàÁŸþ¹×ë6mZ`jÿþý§L™¢oB?~|àÀ:txóÍ7Ë_K‡–.]ºsç΄„½eÀ€‰‰‰²,/Z´Hµ—µRÈláóùvîÜ9dÈ@Ëí·ß¾}ûvŸÏ7uêÔÿüç?uêÔiܸq`j¿~ýìv{¯^½ô§|ðÁˆ#4hРAƒòW4cÆŒéÓ§8pÞ¼yzˬY³&Ož4wîÜ 襮€ŠLZ¸#_ñîòƒ_Œ +g¾-›Ö;^Ó4JV©%N9+çz¡*(,,ܸisrò9»ÍÞ@ߨÈH£ÑHYð»)ŠræÌÙ½?üèq{<^ž"5ºåævv»úüöîýqÕ†uGŽ&ޏ{˜Õj•$‰š0ÎFÕ´qÓæã§/XÂj%]t}ôÑ'yùùŠ¢Pün™™™+V­5ÕŽ‹¹®^õºñ±Á¡¦Í[×';ªª*õùÃ}ÿýÆÓ©ÉÝî¸uíŽ5~ô©×ëe´Í8UVrò¹ÐÈZ± Z§:}ûw/ËÎζÛl µñ»íÛ¿ß™ã|¸ï0Eõ!4¡å¹ò¿ú"ãСC †„„T„7é÷ûÍfs¨ö®]{N$ŸxÏÀ󮔯í®ß¾Îd2ޏ{8£mÆÙ¨‚4MÓ4MQÔ|·×íñÊ~Ù]èþÕqöwËV4hØtÙò•¥Nmаé6¢J:rôÐCøeoNNvN®3//×`Të5¨s&ùTRRÒ¥Ki©©ÿ.]Jóù|}‡0èö*P꣉Ç6ìØz×#wy$d0„†‡$´ª÷íúo?ýü‹üüü²FÛ%k{üy2ÎFUÈìbOUMÓ4MUUƒ¡Ì_¥«W¯íÙ£ûêÕkèG QLRRR­ÚCSÎ'{½>I“Ùh4ÃÃC«×Œø÷–ä¹3²² ’d0 ’AjŸ^}‡Ü6ø/Þ´“”tº Œ°7ìØòä”'S3S%I’$a0a!7´m´tõ¿=Ï}÷Œ f´Mf£r t¦‡ôž=?´ï>H¡ªê¥´´%Kþn6›ƒìA¥’æv»wïÙ³rù·}ûv»=úQEN§ó‰ñ>òüs“s–Úˆ*/¿ @Q§Ó%ûýªª™ÍFUÕ4M4o‘pS+‹Ùd7ŒF£d4…0$%Yöí†úK?+9ü甿¿1÷MMÓ^ù×?‚ƒƒž~æ…ìììys_ëÕ³‡>ÃÜ7f¿øÒ”† Þzsntt”"33ëÉ “~üq_»¶mÞ˜3+<<\Ÿó©'_¾bÕÉ“§ô§•÷¦2ß¿qÿñÃ?÷ø¥¬4½hš&4M“eY2H šÅ¯Ý¾VéûïûMÉK-&™ \M7mÞ{0É£ªš¢Q›1µäËr\ý†5Ggµ˜˜¥_T©{ÆM¯L×0þ™ÇžmÔâúA÷ òÉ>!4UÕ¼n3/dkB›?ÉhußH‹Årå±]²˜d6p5%'Ÿ«S7.2þFWGoqÉšÏ/[‚ÂBÃ[ —ÿ¶³ÜÒþíß”<$mõšuÝ»wBôèÞmõšuzfoÞ´åÅ矱Z­>2î˯–ès–Úˆ*O–¯W>q<ù¦–7ß3â~UÈeΪ Y–UU3™L+—¯ kË-%çzâ±G‚ƒƒ{öìþØO}uÏ'AAA½zöå_ûØ#ãl6ÛÀýæýß[zËÖ­Ûÿù—L&Ó ýçÎ{+0g¯^=ƒ‚‚*{…›4iüê+S ÓÒÒ6ïÝqÇýwx}^MQUU•e5'ÓÕ¡Uû¶mZ›Í昘h¿ßo2™®|×CÉb’ÙÀÕd³Ù9šáñËþ˃ZqÁ¡‘ÙYYÙ—Îfsä™L&¯Ç[ô4¯×»qÓæ+W½ô÷)Bˆàà`¯×kµZ³²³õ¯ÂØØj¿Œ·JkĵÀï÷]¼Õ£[íºñ¯¯à—ˆÖGØâò8[QT¿ßàóú\y®ô¬ÔlgV©K‹ŒŒBè©\r†5ª !‚‚‚œÎ½%77WŸ3888'''0gXXh(ollµˆˆpY–SS/lܽMV¡ UÕ4EÓ+­U«f«Ö79B&“Ñl6;6Åd2)ŠHqEQŠB_²˜d6p5õéÝ+=ýÓC?,WdEÓ´Kii]ÞÙ>ûÒÙu_Ì‹‹‹3 ’ìvûÛÙíö¢¿Ð·nÝÞ¢y³?z_:òÞû·mÛѽ{×èèèüü|‡Ã‘í Ì\j#®š3Ûukç®·´o™ã:++þ_&ü|Ì£ز¬ø¼þB·ûô©óa (uq¿º]7;Û•——ýs6‡é[è;³«I’¬V«Åb Ò.ïdPUEQ5MŸj0í6{HH°Á`(Y½F®?>õºëêêOÏžMnÒ¤q9Å$³«ü#}ÜCc²Nw¡[Ó´¯—~l1…qqq>2."<Ìd6 †   ÈÈH“é—®¾jÍÚáÃï <zç«Ö¬íÞ½kÝ–-_yÇ߆¼;A`j©¨òTEõxüÁÁ¡…™…î‚@TkšPUU’$UÕ·â*²_öx|.WþáC'B‚5b«ÿ¾5Î_°pòħ–-_¡•&„èÜ¹ãÆ›z÷î¹rÕš[»t*ù£Ñèt:#""*ur$ƒ¦iЬ(²â—eMUô³7…’$J=¦O1ñ©ñÿøç+/¿ôB:µSS/̘9ûÙ§'–SÌ*ƒó³Q)F‡ÃQ«fÍzõâããã"ÂÃ,“¾Ûh4„‡…Õ©S§^|\||\Íš5‚ƒƒŠŽ³÷íÛ_ô/¹w¯?þø“ßïŸ4aüúï7tìܽ~ýz©¥6¢ÊóËrtTTÓêef]ÊÏ+tåæ»r rsóssò\¹ù¹¹yN§+;+7+3'33Ç™›’’–‘‘[¿AÃß=°«Q½z›v·mß1á©'ô–çž™üéç_4kÑzÍÚuÏ?÷tÉ—ÜzkçºUj¸óO&?–˜xìÐ1—3ßçñ•s–¦®S§· xÏ}£7my÷ÈûئMërŠÉ8¸ú±­'±¦iEweIB2[Ìv»-((¨Ô_èÖ¯.úÔjµnü~Âl6¿¿p¾Þx÷]Ãô‡£d#®…q¶Åb 6§¤fʲ¢ªúÆ[MU5¡jŠªè#l¿_–eY–•ã‰ğ š6µÛ9:,pPwÑ£»Ëz<úþûFß_Ñ÷ùéÇ‹‹½±¢/™ÿΛU£ÚGJœúä Ù/˲¬øýš¦yݾ_Ý›0xðÀÁƒ–:©d1Él ±ÛíéάìÂYÏÙívC§Éêʺ^Rå=m¸ØØX›ÝþÓ¾ýiéd¿¬ªªª MS5USUMQYVü~Y–!4Û›™™×ýÖžuêÔ.ºE§RŸ‹õ–ºÚÚËóòòü~Ñör®ÌZê_ñµPm2•ž$I}z÷úèãOþ°Ål6¹mPppp9§…ð5Š_õÄãÿýÅ©ªrE·1›Í:u¼¹];»Í^t£î•÷´k¹OÆjÕb""‹]ÐP’¤’‡‹_IŪv1ÉlT‘Ÿêú!i^×n·;è ø­nhÚtê+SdE¹’»K™ŒÆààà  `nKó»cÛh4–Ìl*Cf£ÊþÍ;»Ý®ªªñg”¿[XXXpp°¦_üì×H’0M¥ž’„+GõÈl\s?Õ©þƒÑb¡;¡âõLJ™ ÈlÈlPq þ[6­§ ïQ=Ù¨è8gô=ª2ýy™hIDAT•Õ\†e}iÖOhB~wõè{T¯jÿâ!³ñ§H:y”"üVÍ’TêQ½JZÀ?Ç P9ÙÙ€ÌàZÃ1h¨|EÉÈÈÌÏÏ/kÉ`„0aáaáaaTÌíöd;³?üð“ï7l²ÙlŠ¢x½ÞØj1=öpófÍBB‚˺K1Êçt:çÍû×ÞíÛïñèСC­V •™ ü—“§’>øà#×g±XJ;¿B3™Ì𦅄„4kvCBý¸† ®Í[~ɲœ™™uæìÙÜçÊuV¯ûï¥_Ç׋/((HNNþàýE‹p}ÃF ×7ºþººu‚‚‚è]EžJJ:{ö\9óœMÚz_ß‹Oön3`Ò‚ àøø¸¦MÛívª2¸,9ù\ÍZµ_}õÕý¤R=¹õ³KeY–eÿùó©‹Åív/^ü×ëkÖ¬éµÛ²,ïØ±ëÐáý~¿Ûé̪W¯N|\Ó§<¸W’¤è¨ðA»íÚmOI¹¸}GʹóI!Á‘»}HXX(L—™™¹hñæðšé)§Â,»USU¡(B2hBäº\Û7½ñ|ƒ)üï “B£7îMܲûÀÝó·mÓšÛ‚Ì~|îÜ9Çsyp­iz~«ªêõz.\¸Ð¤IÓúõë÷îÝgû¶­GH||Ü5µÝ2--}ÉÒ¯ôïܦuK›Ýväðñ}ûîÛŸ˜››§Èjh¸c@ÿnõêÕiÑ¢©ÍfNOÏ\½zÛºõ¡wüm½K———Ÿ‘[ðøÄ'~ú~Ùß"|µ,š*+ª¢jBÈã´5+ßú{ƒP%ì_ R¼—D“&-ští¿aÙ×§OŸ¹±e 2»¤ììì©Óg•l6ôŽ6­[Q2U™Á`0 ÑÑѪªê­iª’¦©ªªÉ²?==ã‘GÉÌÌôz½ÙÙÙ©©}Ç¿¬(Ÿ_¸=ŠÁ`-(ð%>{ðàÇ»\ù~¿¿ü¥õêÙãµÙ3ž?Qš›ë=æ¡&7Ü8jôƒ.W^±™KN-ZÀò_[‘:™Ð4Íç÷»ÝîÂÂÂÍ›7;Ïí´i±ÿøBõøŽ#FŒ·Ûí~¿_HBš"û¯d©£Ç<´yËV!Äæ-[3N/ËŠ•«nluó°á#33³ôÙ23³FÞ{ã¦-GÝÿ`NNN 7¾õö»}û®ŒR’¤b'zü¦»’ë%ëÓ­GŸ³g“…nаé¾}û…§ÏœéÖ£^«÷,êÔ¥{£&-Ö®«¬·%³Q‰ÇÙ^×ãñx=éàþ½Ã‡ }}ÎÜbs–œZ´€å¿¶"õ1¡*ª$‰èèh«Õºü?_HÌ›øÖñZ»=ðÀ˜n¸¡I“&ññññññÉ ©ª¦ªW²Øž{fæÌ×=ÏÌ™¯?ÿü3zã¶í;wnßtÛmƒf¿6Go™6cÖ€þýø¡gÏîÓŠ½U-&féןW¢Ø{õóÖ ©œ©WÞKÖ§KçNÛwìBìÚµÛf³íܵ[±uëöN;è/IKK_»zù¼¹¯‚ŸÌþ"ªªFDFÄV«[½ZìåG±ÇOO:ôÖ=¬«¶‹ùߥ0¤v­AAAÅΚmаiÑzãæM[úõëcµZ}d\e¯ODDDÛ¶m>²qÓžwæž–žæôñ””Si—Î;Y§Ïž»”–™ž‘¿~ýÞ¥ÿ^“z!ÅnùM‡ï~¿acýúõL&S¯žÝ×­ßðN­@}LÓüªj0RRR<¸jÍFSh½>·Ýߩӭ>Ÿ/++ëìÙ³'Nœ8|ø°ªªFI³J ž’=­~ýzmÛ¶yïèvíÚÔ¯¯ÏöØ#ãl6ÛÀýô!¸6ô3™Lƒö߸iË/¹Õ«ge9“^Ó´¯—üûow ¿ãλžœ090°.Ûï½·hè°»cøÌY¯ÿ¦awÉútîÜq‡žÙ»÷ŒºoäΗ3»cÇöúKü»Ý^4ø+ög£Ò޳U599¹  _?˜WšÒÑ£‡lõÒ=µ¾Z“ÿ·Ñ´iãö[­–bGØ–:@ÉÊÎÖ¿ cc«UöúH’dµZm6sP°˜M¼?ßj KNNŽŒŒ:{ætzF†Á`ˆˆ‹«Õ°áuBh&£Ñdú _ÙÙÎë7×—<µé™Z¡5£f(( w8bªWß½çÇüü|»Ýîp8Gà’>š¦ ɠȲ¢”²m¼Ôžvß½#{ôê÷Ú¬é–5ª !‚‚‚œÎË›Ásssƒƒƒ…ÁÁÁmãBˆJt½¦i=ºwýá‡Cã‚:÷íærxü^ƒty¬h4›Þ’àÎwçf¦gŸPFÝ7RUÕ+ï%ëss»v/¼ð²Ïç;z4qîœÙoí™——÷ãOûÞ˜sy+E¸*"™J›Ùš[­š_ŽÐO÷Ò7±}àÎUso\´4méžÂ¡ÃG5oÞ,*"Ìf³ †+¹#}ttt~~¾ÃáÈÎvV*Y­f»ÍZ=¾fFzzõµ"#Ì!!¡Í›_wèÐ±ØØ¨¬¬!„Çãu8®hܶvÝú@®‡……íØ¶±¬˜ÿ_¦V¤q¶ðúCë¿\½Eöʲ¢¨ªA’!™ ’Ñh”$¡iB‘eCP¤_Õ ýÊ.ùÃ>¹ñÆ–~ôÉß_z>ð;&::*//?&&:P%·Ûc·Û þÇÓ¯âG»Ý>qÂøyÿ÷öêU+û èjŒÐ~dK’d2r22”,ûÜ7þép8~õŒ¯b=°X}ìv[Æ Ÿ}þe³np8Mš4zoÁû×7L ©2ß{lGe¥¨j^^^nNnžËåÊuåää¼óλÁVñò»™›OYß6¬Q£FááAÁ¿áB’=zt[¶|¥Ïç{wþ‚’SF£ÓYɲÜh4ŒÆZ5«Ùkתn Š­k4FƒÅb¶X,6›%(Èþ«ûõ£vçÍ}MÚ­k—SI§Eùúë¥wQlæR§ Xþk+Th+~M–lJx\–GäøŒ~s¨b’-¡~K˜Û`/Ðl™~s¶Ï`‹Ž ²˜Ô+Ûâš”tzÏž>þpÑîÝ{“NŸÑç/Xèóù–-_8(ºsçŽ7nReåª5·véT;¤$I‹Åá}ü±‡M–•ß®Èt¥‹Ÿ»™"ûÏ?싞ôÄĘèh«ÕZþëb=°ÔútéÜéíwÞëÔ©ƒ¢ý-7/þðãŽ?ïÌ®g£²RUÕãq{<MBh~¿ÅÊUšOªÛ¢O×zñ7 ±Z-ÎìŒR_^ì€[}æ¤ ãÇ?5é¹o>9þ±’/¹õÖÎ:u;zx_åøM£(ÊåÑBB‚M&c||í¼<§Ùl‰ˆs8‚£¢"<ŸÑhðû}AAöü<·ßï7ŶI UììØgŸ™ôä„É»ví©_¯^`Ûc@©S,ÿµ(r„Ð4Õëóf%¿.ÄÛ¬Y‹àP³Å¢ªª»°° À•™¹ïØÙ‹9>Shl­èMU®¤§½:mÆÓOO°ÙlO?=aêÔ‹¾+„¨Q½z›vo¹¥]`ƒùsÏL~âÉ “ž~îæ›Û¾>{F%íƒÁjµ„††ÝϽŸ,ùtÛºM]{õÐÏÈL9q6Ä}ÿ=Ô¯_Ïn·—5È.«–ZŸÎ]:½:m†¾»ý-7Ïyãÿ:ý¼3›Ì®jf+rXXhHHˆ¾Y\‘å9¯ÏVùºëêF£Ñ¨ŸX¢*jÉŸîemëp8Þ_8_|÷]ÊÍ<ÿ7+Q}ü~¿×ç ä·’ÍnµÛ­ÁÁÁAÁV}l]ô[R–å‚‚›Íf±XûË9,9<<|ñû Ê*l©S,uj¤ ¡ UQäì g}b”¢*+–çñxî¼sxLXdAž©NlÄùK™™>_^~®96¬äqã¥0ÐǺtîÔ¥óåâèûï}ÿ}Eg‹ŠŠüôãÅå,°²tHƒÁ`³Ycc« <ô“/?]µlyl½˜´sç”,ÛØ'ª_¿^PPPY»±Ëé¥Ö§~½øÀKn¼±eÑ——õ˜Ìþt²,ûý~‹Å"4MHBÓ4Y–ê+Šj4$ƒ¤iúOyESUµÄ&ß?õêTD~~Aa¡[¡iÂëóèç—Nšæñx23³ÂÂÃ!»ÝXV¡ªd­ÊÝœ£…¦©JTtÌ¥‹Î%'def„……šL¦°ˆÈà‡!#[hªIÒ®ð\¯R·ñTm’$Ùl¶Úµk¹ïÿ{ûí½Ç·^4Ξ9+¶ZŒÝn/ç¸3z ™ªÀív»ÝnU‘‹žê)I’Éd 4(ªªªªª©×æß¼ßï÷y}×ï÷[,6!¤²¿O ……nY–óòòív›Zä<¢kùËQáóz óreYöú}>—Ë•Ÿ—§ Íëq›£"#£c¡áƒ¤(^ÙïË÷)&éŠ2»dU¯‘ضZ­ÑÑÑŸÿö;ïÝ7adõØX›ÍVþqg×x$³QE¤§_:uò¨ÙhÐwf_k Mº|ü¸ÐôA¶¦effäº\×`‰ŒFCtL´Éh»x13==]–eW^¾Ï/‡H’žßú=ÐEBœ={±i“’$ £ÁÀ=©„"4ÔQ76rÿ–Õa±µ-6ëù”dMñ·mÛÖd6GDFFÅÄ:aùù®ü¼<ů¨>ª©šª^Éé ×,}ßvXXØ„§Æ[,f«ÕÊ­AÈlT}uj×råæ¾ôÒ!ô½ú%MÓ¤ËO4ý©š×ë3™-µjÕºÖ¾K-VkãF×÷îÝwÙ²e‹}e2ý²æõzbb"FCa¡ûÌ™”3gÎ_¸¡(JϽ»tîb·ÛÌf¾„"**ê¾C.þdóŽ Šìûç+§‚ìvÉ`0›-Ûvü`±X„$¹ ’Φäy«=(í̱±1õëÕ#¶-¶­f³ù O¿™J¯Aƒú>úpJJŠÇã½’ '9!qq×U®»@þïì6[LLL×[»4mÒ8ù\Ê®Ý{/^¢ï>Bøý²¦iq×Å ¹íoññqqq×…:GHù;¯± ƦMOÿpjê¿ß_~G“$Éd±Û,uëÖ¹ÖzÚo%I}ŒÌƵ4‚´X]ß°Ñõ )E9¬V«Õj ­Q£z‹Í ì?õ•)”å·}?šLñqqñqq”eC%€Ìd6×ögãO±eÓzŠ@õ¨Õ™ŠŽS8¨Õ£z ³Q9pé"ø3°?2ÙÙ€Ìd6d6 ³™ ™ Èl@f@f2ÙÙ€ÌàÚcúMs'ìG:cækd6@!N8ÒýwBˆÀP[lOz掴2“øèÑÄq<~ïÈ»÷îÞöà˜ÑÏ=ÿÒÇŸ|vm°ÔƒÎìv›d(óŠ¡~湟{vò}{ž~z¤IÏ;~¢äl~ôÉáÃGžž<Ìü}¨ìÄœìWýPÖ%Þ}oá“ãïÓ§—Ýn‹»nê«S:¤!·mÜ´eû·~½äßáã{ uêÒ½Q“k×]¾šæÙ³ÉýÜÖªÍ-ëÖyÄŸë=æ¡&7Ü8jôƒ.W^¥ìG'>P2¶ÝnO9¯š?ÁÓ“žêر½ÕjíÒ¹ÓøñÍŸ¿ Ø<‹?üxûöÓ¦þë¹Z8™ Uv¨½¢Ç =yÒ3Ó=…“~ØVΠöìÙÛ½{×ÀÓÚµkÏœ1Uüô3Ï?8fô}{&O~júŒYyÒÒÒ×®^>oîkOŒŸ¨·Ìšýú°¡w¼7ÿí©ÓfZž}zÒÁý{‡úúœ¹?°?[¾àÒ…týqÉäÎÎtþ°k¿Ë•_¬ýÇŸöuêÔ1ð´k×.»wï-:Ë?Z¹jõ¼¹¯Æ«ûÉl¨èîß¶¾ü[7æääFEF–:iõÊïúõëc±X ›ë ´?þø#v»½Wϲ,_þ½?<°ÕM7nü~Þòý†õë×3™L½zv_·~CÅì|W~õšÕzè¦ÿë3°ûןüç§Ýí;z>ùBtµ¨!Ãú_JM+öZ§3'<<,ð4*22Ûé,Ø;wîêÛ§·Íf»ê“ó³ b lןö_ÿݯÞk92""+;»ZLŒþTÓ4—+/,,T‘••ýég_$&;~â¿öц‡…[ˆËå ý¯i¶óúÆÍõÇW}ˆù«|:EUÕšujÔ¬SCa0ü2(5$YVNKúú“ÿü´ç@±“³ÃÃÃòòòÂÃØzøð‘÷æ¿=mú¬Ÿ~ÚÓM-gJì+ÔªõM›7o <Ý·ïÀíw ÓóÚ°aw,˜ÿvù ÎËû¯íÆaaaÇŽ8uâÈ©GŽ'¬Èrö¼ªªEÛÕ"r®½;~Ú·÷PÉÀB´k×vã¦Í§7mnÓ¦uàéôi¯!&Nÿö;óÓ32ÈlÀvbNvÿõßé{µg·îø«§Wuïì׿lظÙëõ;~â…—^}ÿ}ú¤Ó§Ïtëzk«›nüè׎$ouÓk֬ݷo÷ž}õ–n]»œJ:­(Ê×_/½s؈ ØR.©eŸÊ•™ž}àÇ#g“Röí=XêåÏ7öµ×çnß±Óï÷oß±sΜyãÆŽ L5›ÍB‹Åòâ Ï>ýÌó~¿ÿ*~^¶@E ìmOÊM<‘˜“­qÖ aÓtOaãðÈ_}í7¶œúÊ?_ý‡IŠŠŠ}ÿ½#î®Oš9ýÕ Ÿqæä<2nlù yzòć~,7×õÚìéz˳ÏLzrÂä]»öÔ¯Wï9³*`Ñ~ص£õÍí;woß­wg³¥”D»˜švüè©´ i÷-ëz¥]?sÆÔW_q*))¡AýÙ³§7iÒ¸älqq× ¹mð”¾úÊ¿þqµ>¯´pG¾âÝå¿Æß üê'4I:yôÊ3{EAÀ.Ú˜î)üÕÃÐ*”-›Ö;¾ü7Ü aSMÓ®¼>å¶;woߣo£é—]º˜~ôో©i‰‡OT Œë•Bü¦ÿ7‡/Î7 9ãl¨(ôuÉoótOa±Ë¢•š¥.ð)>ÚVµG¿[5MÍÊtjªêÌÎMM¹˜~)ãW»UÌ€ ÛWä×l<—Ûf³IÕ´k¶Œ†¢“~kÙ+,2*Y£œØnÔ$Á`4TÞ;d—ãÆU'¶=YU›ÌTµØ®ÂŸŽÌ€Ìd6׎\5[6­§d6I$IÌ2 d6àŠq9ŠóÇâ4Èl@f@f2ÙÙ€Ìd6d6 ³™ ™ Èl „´pG¾bûioÉi&#w~à¯&+Z±–õ¬"pÿì0»Aa4EŠ*TŠpu BÓ„ª EšöK$_Îì\·ª¬m&ÉÀè€«Ç IЦ©ŠPT­è úrfø4ƒ$ŒŠMâ\u²¢ÉªPT-°ñûrfû=Ø5Ÿ,$I32Öàjµ…¯hŠ&´â™-kEg‚Ú\5’$JŸÿ×΃¾÷ñ{ýIEND®B`‚kildclient-2.11.1/doc/C/images/we_input.png0000644000175000017500000014255711405233117015406 00000000000000‰PNG  IHDRµ®¿±äsRGB®ÎébKGDÿÿÿ ½§“ pHYsÚk¥óÎtIMEØ Ò•âQtEXtCommentCreated with GIMPW IDATxÚìÝwXSWðoHÂÞ‚ÕV«UDW-N¦U+âF±îV*îjmkÝâ@­µî*ò¶Øâx­²Å]78p´j[•-"[Þ?x‰’›¡‚~?ÏãÉÙçžÀ/7çÞˆ<}Ž¢¢"\}ªU""""¢äRðHàêS­¢#¦sVˆˆˆˆ¨Fiã5¿èR𑨡۔¢#¦ã~j>g…ˆˆˆˆj”ä?®"9>¢øL-äçfsVˆˆˆˆ¨FbPKDDDTƒ<Ïx‚‚¬´W Ì oR»ÆÖ«<¨ÍËá*!"""ªÆò³Ÿ¢ + ¶6Í_¹®ø„ëx@ªg\ãê j‘ÊÊ s³ ÒCKª«$G s³ Ö1äª#"""ªdYé°µ±©”ºlmlŸpR=“W¯pP+RÔ^\?¦M:Âêã¹å'ùynÿ²¹i£õ¤@®:"""¢Ê&©³i\_M«W(¨©j°èò³R…åò¦ß>Ä‹Pð< Mú}¥º.""""ª@L'ªÔ8«¤¾šV¯`P«*Š~‘Ÿ[\@ßD–·0çî‡ÿ€Î€D×͆,ƒ™µC…:7¿£Ò4û§U–+ÉSöñ‡ 1ƹ>Û™ °ü©mai¤O.âQF.´DÀ‘™í`¨#Æó¼B¸-;EE¨c¢ƒŸ|?DRfú­¾ðJ¤l+š‡ˆˆˆÞº¨–gjUµÐ¬£ û@×ô=àE_ÃýÈMÈ–“FíѤß\h›Ô©’ã—~ëL­íÕÊc¿à,ÒoÅL­í±~dñ>Žg`X¯E¹r ³àÜ\ µþÆßùÆhú¾9 uÄ}m1êæßÃCq#ؼg¸|ó>žÞýÆÚý«ã""""´ R³iZ_É¢zwMh¡²†‘¯U¸^Ee…Ò^Ö+Ôª:5œ—™ ÈMÿ ¿Šìä? md&¾Á;mÜQ„ʉÂm‡¯Vø|QA.´¤ºØîx;Öìˆý»\ž“ ´Gçù±ˆ›ß^–vy“Àá»sòAíßYpnn†VVuóÇ_hó~@VN tµÑ¶IüŸÛ÷Þ\¹óbæ¢[˺øÔ¥Þ3×ÁÃÔlŽü Ñ7^Þ²âÄWůïî›øz@#å¶T°Þ—ÃQ¿M÷ Õ»kB Œü1þåãñ¶jÕ+ÔªHNZq õ÷éýÅÙÅ´™¸ R#KUò3id§ðùž­-ðEÏ÷e§öl ´ŽŒ»ç8–{>íæ ˜5{ù|üßY€ÖVuQpðZ7(>#»ïØeŒéÛ5{!¿_M=ÀÕ; ÖÑG+s,h% åZèaá@+øn; ÿÈ·0¢iq[wþFæý«Úi>.îS&""¢×°M ËÄ¥Å#ðU§¨¨wä¦ìg# dK?–kSY½BA­ª3µÙÉ@K¢÷†CÇô]Ü>°ÎýŒ÷»M¢ÜG@QDRK@l fb#ç6>pj¹çýðjÿ $â*Vì‰ÁÌáÎè¢ü´xçù±ÿ?s+øE^6Ä:ú€›ÿ<Ç‹EhÞ°6´ ž£ÍûF((|G.`to;´µ~È=ë:xQT„ø»!6ûÞNõ!ðŸ¨kð߃™Ãœ1ÀÙÞuqvû5H,dí‡_Áò h˜é¢ò§ÌÕ/¾#"""Tò…W(u6U¨Þ÷ÛöPQHãz½7_ÇαÅ÷¯UÐ*lS½3µÂû3²Ý‚I#;4pý ") x» ÍšC[çˆM] ’ÔËœ»(L?‰þ‡é›TÊ|§^¹ Zê6‡E¾¶ ö_ÊÂ@õë‘;üÿñæwŸ<‡U¸µ­} .ß~„Ô§Ù¸ùÏ34Ï.-,¡+ÕÂí¿R•“c]}4{·ø^¼þ{b+6ÂÆià Ø~ð²“Cj`.kjב x¡k†çÆõ¡oPP®_jK¤Å2ÑÛÓ ì)­p}"-5êUÕ¦V…êõÞ|;Ç6UÐöì¯pP«bOlæƒxÔi7€Ešôÿ·öM†D”‘®DÒ÷Ї¤g]\Õ‹@öÙ*ÛS[˜ó EEEDÈÎ-€ŽICˆÄÚ×/Ö-ö8áŸlXÕ1À¨^mço<„DG—ï?Eó÷ŒàÝóCÿßz ­‘HŒ¥ö\èÖªKÓ—_8Q˜û……/ƒ×R2¡S§´$:i”k_½qñL-£ÚÊ?S ¨>S«ªMEgjÕ©wǧÖr#ðŨ-·T÷W(¨j07í!ò³Ra\¿…,ŸŽÉ;h:p wÿœ‹@=;ˆÄÒâJõ¬QT˜Uá=ÊöÔÞy’ƒæïêcúPG„'a”sµë45Ô…®9 útýŸlx|X×/Þ2ðû‡ëáòýL î´j\|W‡+·‹/ƒ–n?ÉF«z˜>ÄbÓ1Âé}Yà[E/ƒÚÜüèH´¡%ÕHÁ» uÆÅíDDDT{jEêÜzKU›Û”•Ý1¦‰ìÿ]&ÈöçîøÔ£¶&jÔ«u¡Xú½â=­†õläò‰Šž¡@r| žþõ6ÃVB$Ñ.¾‚ĨBs«hO­ÓÒ+€}g“ðm¿øØÁ«y;ܤÌ|XI·q"b®'cnè}ˆ´$ryþΖýÿEQ.Üúbã÷qõÁs¹|Wï>‚X×"‘ûÎ$¡U= ìÒ»¼,ûCèéâÀ·¨ì1ЂHKKá» µÆÅ –ˆˆˆ1­’ q‡•ʲ£¶ÝVZŸ¨’ƒZUõ–îoÉ–ƒQÛnËžß1¦‰`ƒZ‘ÀžÍô;g!54‡ŽIÝ2KQÀÌÊNµí“`ë½®8¨«D)×ÂaÑÒQ73±dÿLìeƒÂÂøñ—3ørdÁ²ëÂÿÁ]-a¨§ Ý¢l<{ãmä&ä~j²r ` #Á­ûÉÈ|žãÚ†xš'ŸÉÙh`¡‡œ¼Üz ½:Í %– îö3|¹ã FukŒêšáþãt¬ŽÃ™„0x·)´ÄB¬°êŒKÄ=µDDDô ÷©ýóÜ!4l×·|}"-Ázew8ŠiË•U]o逶¤_£·ÝÅvŸFjôW ¨U!-ñL>ø¨|®÷÷7Þw‚ü<]<:û®nÖã·ÿ+‚úg—Ç#ùÊoJÓó³Ò 54ÇÁù‰þ¹ø¾¹"~¾ŠìäûJ뉾•‰C'‘›‘ ¼(€X×¹Ï!Ñ{¹ö÷•Wz=EE/ ÖчHK ˆ¥±%©7bQT‘H«xO­DˆDˆy ÂÑÇ‘ÿ,…ù¹Ð’êÀ Ž$ºFÐÒÖ+?¦ÿÏŸ¢çU‹gj‰ˆˆHÙÇù£·ßÃgU¯¼¢ú^c½ Û{(o³"·ôR€æe&¡ ;ïvð*—GjÔEÙwñây<¬û ©ž žØ…ŒÄŸaÜÐZºïktœôßi$w×Eï$ºFЭÝR# ˆµuhA¬c(»E *Sz Õ7+þ‘Š÷” Ð%:ЫÓR]ãâÓåZââw"-ÔþZÚÅÛD"ˆ´Š÷‹u ¡gñ¤†™iI Ò*~7¢¥k(»Ø«l_U½qÑÛÓ*ßSúA‡+T ªvõ*K½Ê…b:&ïÀ~~,ÄzÆ R¥Ð®ý 3/¡ =ï;Ú£^‡vš4‡HZ[ã 0¨c­V>m}3@ßìåFµë‘èA¢§j¯µ+Lѳü@i)‰ž1$ çFxLŠžW5."""zë£Ú×s¡Xu«W(¨ºªXßT rmˆMÚCÌeFDDDTÕQ-*÷Ó[ÑÿcÀšV¯@PË[FUo:Æ–ˆ¿~-lš¿r]×®CÇØ"‘¨ÆÕ+ÔòB$"""¢ê­d;嵄ë¯\—¶‘…¬¾šV¯pPË ‘ˆˆˆˆj@`+|=ÏÛR¯Ò ¶äTn^f2W UkÚFŠƒÚ’€vç#ÎUkÞ{“å[~MÕx j‰ˆˆˆˆA-ƒZ"""""µDDDDÄ –ˆˆˆˆˆA-ƒZ"""""µDDDDôv“T´`LÔqÎU9'—îœ"""ªº |Æùr©ÊáNb'‚ˆˆˆª6¨- <ˆ*ƒY"""Ò÷ÔƒZ"""""µDDDDD j‰ˆˆˆˆA-ƒÚª mmmˆD"ˆD"èéé!<<¼ZõQ$q1¨UÐ>ÁÁÁ(**BQQ¶lÙ‚þýû#&&†GˆˆˆˆäHªc§¼¼¼ŒþýûËž6l^¼x & !÷0%"""¢—ªå™Úüü|¹€¶ÄðáÃqáÂÙã´´4ôìÙºººpssCzzº,M$aýúõhР´µµªv¹Õ«WÃÖÖpæÌØÙÙAGGï¾û.vìØÁUCDDDÄ ¶âD"tuuegÏž+VàÙ³gðôôÄܹsåòß½{ †———ÚåÌÌÌ=z4æÌ™ƒŒŒ ,\¸~~~\5DDDDÕ-Nlè6¥¨ÇˆéH|’‡¼Ìdìb¤VÁ˜¨ãðç[%_“+‰äê-{AVIZݺuñàÁH$$%%¡mÛ¶xðà¬Ljj*ÌÌÌÊÕ©ª\zz:LLLÊõ+??ÚÚÚ²zÊö“*ÏÄ4nbïË%"""…¼÷fBÛÈ™¯!9>¢zî©-KY€›””©T*{,‹åÊ•´e©*W: MJJÂ?ü€+W®àâÅ‹\ADDDDÕPµÜ~ •JåöÀ– • FÍÌÌ——'»CBAAZõkR®wïÞxþü9¼½½ÆCDDDÄ V=ÁÁÁ>|¸\`[ú6_%zõê…„„`ëÖ­èܹ³ZõkR.!!žžžpttĺuë¸bˆˆˆˆª¡j¹ý ÿþ „——òóóŸ½-{›/ :ÑÑÑhÖ¬öîÝ«Výš”Û¾};† †””|ùå—\1DDDD j5 lóòòóXZZâØ±c ÓÊ^ÀUú±&å<==áéé){ýq"îd¹úNÄ„ƒSWtìì„ߎ—¥?IJ‚×àápréŽ_~yõoÂj¯ôÖ…’ÿ—ä;n>8Ý{ô‚•µ-îýñàî½{°²¶E÷½¸ ‰ˆˆA-QEÜ¿ÿPËÜ\iž?nÆÖm;0mÚ˜6Õ[·íÀÆ7—ËwáâElþñ{¤gd`õšuxöì¶mÛ„¿ÿþ_Íÿ¶Âù§úÍÄÁƒpùâYü²7oݬÙóÊÕwíZŸ¤öÜܾ/÷£n{ÊtêØµj™ÃÅ¥8x ˆDüÿߒ版ˆÔi¨Þ{ï’““•æyüø1ÀÄØÆÆÆ€G—Ëgbb ---…}㜺ù·m߉O<‡àöí;XøÝ×Jë355…DR¼5þÅ‹²çŸ>} 000€©©i¥Í²ö”10дog\¸p÷þø.^‚žž:´oÇIDD j‰*¢[·.€sçWšçÚµÿfÊĺuëþk}\°°6`%š6µÖ¸¼™™i¹þ¿b± •Já`ß ………øvÁ"ÂÞ¾¤R)$UÏ 6**гJÕÚ„ cQï½÷°jõZܹ{ÙÙÙØ¶}'¬¬mÑ÷ãO}ûö>ò_:t0dð ­†ÿ¿WnÂõØ¢qyg'GÀÑß~ÃÆ·TyŒŒÏž=Sš§KÀ‰Å¼q?-Uë ¶K—.¯ØŠD"¹mmm„††–Ëóª*£ªyLML°>jÛ^^ÃÐúÃöø~ÃF´³ûË—.Lù|FyÀÊ•k°jÍZŒ7c?ý¯õqîÜY051ÁĉŸãöí»—Ÿ9c>ü° –/_…&M¬Ô.§êB1e¾ýæ+èééb¤ϕæqqv’{Í1¨%"¢Ê$jè6¥¨ÇˆéH|’‡¼Ìdìb¤VÁ˜¨ãðç[nŸŸH$‚……BBBàââRá`³t½¡¡¡>|8Ñ¿ÿÊ|™v¨ú¸“˜€ÆMlp'1“ñqsï‹;wîâÃÛ $8ˆBDDæ½7ÚFÈ|x ÉñU³§6$$žžž•¶¡ÿþ „—— Q ”ÄÄÛ²;&x ÈI!"¢JU%A­‹‹K•¶ùùù²Ç¥?Æ …¶¶6¤R)Ú´iƒØØX¹|Û¶mƒ±±1œœœÞ Μ9;;;èèèàÝwßÅŽ;diVVV¸wïàöíÛhÞ¼9W‘ìÚÛ£ÇÔ­[Ó§}Oôã¤QõjKÛÉ“'£K—.xþüy•ÂËË ÈÉÉÁ¼yóàãã#—‡ÇcÈ!˜3gŽÂ:F9sæ ## .„ŸŸŸ,ÍÕÕ‡9r½zñ[ˆ4õn^¿‚£GÂ0aüXîg'"¢šÔFEEáûï¿Gdd$ôõõ«t... Cxx8zõê…ÄÄD¹ôùóçCOOC‡ÅáÇÖ‘€O>ùººº1bÒÒÒdinnn8xð ,¨uwwçÊ!"""zÓƒÚ¨¨(xzz¾ÒÅbš BVVúöí‹Úµkã÷ßåï?Z¿~}Å·JIIQXGRR,X€¢Y³fri]»vE\\RRRpþüy89ñªm"""¢7>¨­Š€644TéÚ---ŒŒ ¬Y³}úô)°@FFêÔ©£°ŽÞ½{ãùóçðööFXX˜\š±±1Ú´iƒo¿ý:u‚¶¶6WÑ›ÔVE@;|øp+L·µµÅþýû!‘HP«V­rgc—-[†ÜÜ\ìÙ³ýú)¾@%!!žžžpttĺuëÊ¥÷èÑ7näÖ"""¢·!¨ŒŒ¬”€¶ô—/xyy Þ£vË–-øæ›o ££//¯rÁo½zõ`aacÇŽaáÂ… ëØ¾};† †&MšÀÚºü×’º¹¹!??ŸA-Q5$©ì +# Uç JçéÔ©”ߤßÏÏOînŠêðôô„§§§ìñÔ©Såò¾ÿþûhÙ²%4hÀUCDDDTÍhq TËÍÍņ àááÁÉ """ª†$œÕÌÍÍÑ®];üú믜 """"µÿ>u¶2¨’••Å•Br¬¬m5.sûV<'Žˆˆ¨ŠpûÑ+¼aR÷§¢AòîÀ=X»nCµÖËJJJ~¥ôê:®7é×Û8ÿöú¨ÌuÎãEÄ –¨FÛ¸iié˜òù¤Õï^}ú½R:U=~jðú_DÄ –¨ÆX°`¢¢¢Þª€€ÜWLW$èMÀuNôï{å=µ}&-ä,R¥ ˜: F÷ùòå¸qã&NœXimFÆS|á7gΜCûövX»fŒT¦YYÛbÉâï°pÑRØ4o†õëÖ V-s•ý¸|ù ¾þv!nÞ¼3SSL›ö>P|öé·cÇ1ÅwŠŠŠ`ÝÄ óçÏE;»d“ZYÛ*<¨(½k÷žØµc êÕ«‡?ÿ¼qã'áèªì»Ð˜ÓÒÒàûÅt$$\Ǭ™ÓÇùôi&fÏ™‡˜Ø¨[§V®\†V-[Èêùbê œ=wíÛÙ!`?LMMe}ûöëyX³ö{ÀÂï¾¾žfÍž‹Ô´4¬ X‰®Ý5Î+4ïVÖ¶øzþ\lÞ² Ož$É•ÓdÌ¥ç_¨NΕê×–¢6­s+k[Ì3 Á!ÿÁÿ*¸î¹~ý¦N› ‹ZX»f%ÌÍÍUÎû˜O'ÀÇÇö;!*:{öcÓÆïù†ÞXj‹;ùËšÔ‘j 4ÀáÇ1wî\¥g²4ùCnaQ ß|=Sýf ??àâì„ÄÛwPXXˆŸàé5L–_( ~ܼyyy;x®Ý»©ÕŸÄÛwàÞÓ vva×î ¹´ž½hØP.mÉ¢X÷=šÛ¶ÁßiX°òeàâ'å³¢tGG{(ü㮬ïBcžîç‹K—/£K77´nÝJpœ³gMÇŽ]»aÛ²-Ö¬ƒ¿ÿÒ—mÌš°ƒ‡ÐªM;üzsçTý…6Bó.D“1WÔÛ8Wª^[š¬ó²„Ö}Y:vD×î=´w¦ûùª5ï‹—,Ǭ™Ó ­­Y3§cñâåüEMo4QC·)E=FLGâ“<äe&cç#µ ÆD‡Ï8_ôžø]•µUy«°=Ëý0tæ*ýj,`ê4nbƒ¯ € IDAT;‰ Õ²VÖ¶}³H$zm7¼Wv{­ê$))£FÅ¡ƒ¡5®ïD•½î‰H=Þ{3¡mḋ×ñv^(fl¨Ï•@¯þŽPƒ=‚ª‚NUÞäÀ.//A{ö¢[·.\TôÖàº'ª|Õ>¨=¸a6î?ŠOºw„™‰–mý §.Ý”¥ĸ=p÷á#,ÙüÒ3³di¥Ïö–<.ÙÚPÕgƒéÍV™AæÛ~&ò£vвeKlÚ¸ž ‹¸î‰¨ÂjÄ…bu,L1qÁF,ÛúfùD.ͦQ= ›µ Ñçãáý±êw¼%,Zb^=\½ü;ö¡!~zk­{"zƒƒÚ}‡c‘“—S—nB"–ïòÞñÈË/@ô¹k°kaÅ#JDDDÄ ¶zzö rœ%}é=ví:#$ä'µçµ¬Òs%Ôž¢r•5FMÛïÚ½'þúëoÀ›·`em‹‹/þüó>ºvï©QÝBs©lM¨Û"bPKDjÚ°aîÝ»‡={öÀÒÒRírªöÔ._±}{ãÒ…3ð›:³çÈ_¤yãÆ ÄF‡cmÀJLñ&{~é2¸»»áêåó8p–.óWÚ‡)¾ÓðÕ¼9H¸v“'Mkc…ÿ*Ìž5W/ŸG/w7¬\ Wöþƒ8z$L®ý’›…>v—ª¾ßº}QGñÝ·ó±ví÷¸zíŽ;\n4É;sö\L?—.œÁÔ©S°xÉ2•ã€åþ«áää€S'£qõZ¼Ú󪊲ö©¬1jÚ¾£ƒ=NÄÄÅ„žž.N>ˆŽ‰…“£ƒFu Í¥²5QÑ>ƒÚ*%‰Þèöè͈Ξ=‹7" @ãznߊWøS""2]º8C"‘ÀÝÝ ‡+?vìèé颇kwÈžŠŽAŸÞîH$èÞ­ ""£•ö¡c‡öˆˆˆÂ©Sgàìì„ðcGdiá‘°jÜb±Ý»uExx„\ÙÏ&M„žž^¹öU—ª¾Oùl àêÚ 7oÝ‚÷ÈáÐ××WØuó=†žn®ÐÑÑAÿ~ÈÈxªÖ8££bÐïcH¥RLš8^íyUE“y­¬1jÚ¾£ƒ=bOÄ”'OÁ{äpœþ:ž>ÍÄ…‹Ñ©SêšKek¢¢} "µDô¸rå âããVI;&&&ÈËË«P¹¬¬,@vv6L”¿ÅA‘9öíÄ¥ gðÕ¼Ù;~’,ÍØØ7.ËÎ ß¼~¥ÊÇ¥ªïš|Ê¢nÞOÇNDNN6ôï‡Í?nP»~ $''ËÞ¨;¯•©ªÇ¨Œ5j„]»ƒ`Ó¼LLŒacÓ ›6o…MsèééiTŸÐ\*[•Ý"bP[å’““áêZü±™««+RRRäÎøtéÒû/”VöÿëׯGƒ  ­­ÐÐPµê ·[ƒ pøðaÌ;Wðlê«èÚŧOŸEaa!Žþv=Üú¨UÎÉÉAAAÂ#¢àìì¨4oÏ^8|ø¿H$055EZÚË3£.ÎNH¼}……… ù ž^ÃÔj_,#55µBãÒ¤ï•%ñö¸÷tƒÝGص;HírÝ»wžàÿ °°?nÚ¢ö¼¾£à:s´Ç¦M[ѹsG@çN±s×î }ì/4—Bk¢2û@D j«ÜŒ3àéé‰gÏžÁÇÇ3fÌ¥Í;C‡ÅÇ‘ ÿTBieݽ{ †——W…ê ·X,ÆÌ™3+\^Õ…b³gMÇŽ]»aÛ²-Ö¬ƒ¿ÿRµê3kÂB«6íðsèÌ£¼K-@ÀºïÑܶ ¦øNÃÚ€•/ë™=K—®€m˶ر3‹~«Vû..Nppê¦4]h\šô½²,_º~Óf¡›«;>hØPírÓý|qéòet鿆֭[©=¯¯CEÇ(ÄÑÁéèܹ“, ÌÎÎcJ¡¹Z•Ù"ªyD ݦõ1‰Oò—™ŒCŒÔ*u>ã|«d?ªH$RZï;#ÄÄD#++ |ðžäçç#,, îîî²´?þÛ¶mCNN–,Y"WN(M]•Q½EA­H$*÷þþþØ»w/ŒŒŒ°sçN¬ZµJVfÑ¢E CãÆaoo---µÒÔUuQå«–Û„.À©]»6"##¦ÕªU QQQŠ÷Þšššª•Vº½²m—~,T½>oÔ©Fsss9rÙÙÙX¾|9ÕJ«Œú‰ˆˆˆèõ‘¼IƒÙ°aÆ'OžÀÞÞ;wîT+­2ê'""""µ•bðàÁ¼Ò‰ˆˆˆˆÔ1¨%""""bPKDDDD j‰ˆˆˆˆÔ1¨%""""z%N‘欬m5.sûV<'Žˆˆ¨ŠTú™Ú¨¨(Î*½ŠŠŠÔþQåÙ³gøæÛ…èlï‚æ¶mÐÍÕßo؈ÂÂBYž¤¤dNú¿üFäUÊñx½Úü½ö ¶K—.•Ø:t"‘‡ҨܣGþõ‰,Û¦H$âê"µÍ™;uëÖÅ„áÚ•ßñSÈ^dd<Åê5keyzõéljªAx¼Šñ "ª±A-xzzVJ`ûã?b̘1Ø´i“FåZ¶lù¯OdÙ6Õ9;Go¶ ¨ý:ˆŒŒÆˆáC`ll±X SSSŒýÔûC~–åIKKã¤Ö <^DDo@PòÊíÇqñâE¬_¿.\À_ý¥vÙääÿc¿×Ñ&U_Ë—/Ç7`k«ÞG¯õë׿Í[å¶XZZàìéX/?Â-ýQnZZ¼G}Šæ¶mà=êS¤§§ËÒ¬¬m±}û.ôìåÈÈxŠÑcÆÁ¦Å‡å3OŸf*íËÓ§™˜4Ù-Z}×½qåê5µÛ Ú‹vЮƒŽþv±±qèlï‚f6­ñÛ±ãÊ{ùòô0ÍmÛ ³½ ~úù€\=»÷ÀÉ¥{¹riiié=ví:#$ä'¹1þvì8šÙ´FÓæ­Ð×cÎÿ]ðø\¿~={y`øÈÑHMM•=¯l^˯®Ý{⯿þܸy VÖ¶¸xñàÏ?ï£k÷ž*“PšÐ<”%4v¡6„Ê ¥i²f•AÓãED j+‹‹Ë+¶[¶lÁСC¡««‹aÆaË–-rée?Þ/y\öß’€ÓÕÕ:::puuEJJŠ\¹ 6ÀÒÒ–––øùçŸqôèQ¼ûî»ÐÖÖFhh¨,ï™3g`gg¼ûî»Ø±c‡Ò65iýúõhРA¹ö¨fÚ°aîÝ»‡={öÀÒÒR­2+–-Æ_ÂÉÅ ¾[ŒcÇÃqýÆMYzÉG¸¥?Ê]ºÌîîn¸zù<€¥Ëüåê461Æþ}AÅõû¯ÂìYÓqõòyôrwÃÊÕÊò+áÑ·7.]8¿©S0{Î<µÛ¼uû¢"Žâ»oçcíÚïqõÚ5?vkVbŠï´ å9{.&Œ‹KÎ`êÔ)X¼d™\=÷<ÀÑ#aåÊ-÷_ ''œ:«×ä?Ÿâ; _Í›ƒ„k1yÒ¹1*²;p/~ Á¸OÇ`…ÿê—ÇMɼ–=^Žö8wwzzº8uú :&NŽ*“ªc¨lÊ»PBåÔOUëGÙ4=^DÄ ¶ÒÛÉ“'£K—.xþü¹Fe ±mÛ6Œ3àãロ[åÏb)Sò±éÿg̘OOO<{ö >>>˜1c†\™øøxܽ{?üð¾ùæœ?·nÝBpp0¼¼¼dùF9sæ ## .„ŸŸŸÒ6KSÕþÝ»w‘P®=ªñàÁÀÙ³g±qãFhTG‹¶ˆ8~ëVÁÒÒAAûÐÀ üòK˜Ò2QÑ1èÓۉݻuADd´\z×n066„GDªqcˆÅbtïÖááJ눌F—.ÎH$pwwÃáƒÔnsÊg“```W×n¸yë¼G‡¾¾>z¸vGAAA…ò=†žnÅo û÷ó@FÆS¹z>›4zzzåÊEGÅ ßÇJ¥˜4q¼\™ŽÚ#"" §N³³Â<>S>ŸtìØ‘/ߨ«;¯Žöˆ=WÔž<ï‘ÃqòÔi@LÌ YP+TŸª¶”ÍCYBcjC¨œºó©jý(ƒ¦Ç‹ˆÔVª¨¨(|ÿý÷ˆŒŒ„¾¾¾Fe>Œ† ÂÚÚ`mm† âðáÃêËáÇ1xð`H¥RxxxààÁƒré_ý5ŒŒŒÐ¯_?\½zS¦L¡¡!ú÷ïüü|Y¾„„|òÉ'ÐÕÕň#ÔÞ3§ªý¯¾ú åÚ£šaÛ¶mhÑ¢üüü°dÉÌš5 ÚÚÚš¿µ´Ð¶mLœ0;¶oFðÞÝð_µFiþôô tuuå>Ê###ÙÿSSÓдy+XYÛ¢}GGÁ+óSRR ££S¡6ÍÍÍb±dyQ7ojj*Ö­ÿŸ}þ\Ýz—K711V<ŽÔTY––ri«V.ÃóìlŒ? í;:àÚ5á‹™j×.>ã.•J‘žž¡ñ¼vêÔçÎGNN®\¹†±ŸŽA|üu<}š‰ /¢S§*ëSÕ–²y(KhìBm•Sw>U­ecÐôxÑÛ©JîSOOO„„„ÀÅÅEãò?þø#bccËm1011Aß¾}5®/%%Eö^___îãÿâ?xŰ$I¹` ´¤¤$üðørå .^¼Xií›™™q%Ö`øóÏ?1nÜ8œ>}ûöíÓ¸»ööˆ‡žž®ì9[[<{–¥´Œ‰‰ ²²²`hhˆììl˜˜˜(ÍkllŒSqQ²5.ÄÄÄyyy sUmjr×uó~:v":uê€ýûá ßÏeû„U±°°@rr2j×®ÔÔ´2µ9öíDnn.~ù5 cÇO©¸h¥u¥¥¥£V-säææ¢V­ZÏ«5j„]»ƒ`Ó¼LLŒacÓ ›6o…Msèé马O“c(DhìBm•Sw>5Y³¯r¼ˆèíTew?¨h@{ÿþ}\ºt 999r÷ùÌÎÎÆÅ‹eó–¦ê"-sssdf_ð••ssó ýqíÝ»7ž?ooo„……iôGD¨}ªù4h€Ã‡cîܹJÏr éÖÕÛ¶ïÀŸÞGAAÒÒÒ°kw<<úÈòˆÅb¹‹”œœpðÐ <" ÎÎŽJëwqvBâí;(,,DHÈOðô¦4o×.Î8}ú, qô·ãèáÖ§BmV–ÄÛwàÞÓ vva×î µËuïÞû‚ÿƒÂÂBü¸I~O~Ï^8|ø¿H$055EZZº`]7mF^^Nœ8 W×njÍk¹ãåhM›¶¢s玀Î:bç®Ý²­ªêÓä »PBåÔÏŠ®M1¨­4 hâ Ä|}}˺ººøì³ÏdŒI¥R„††âùóçX´h‘\^±XŒ¤¤¤—¿{öľ}ûŸŸ°°0¸»»W¨o ðôô„££#Ö­['ئÜ/äJjŸª7±XŒ™3gV¨ì´i_àìÙóèÿÉ Ø´øî½?Æ£Gñåì—û¯]\œààô2 š3kÂB«6íðsèÌ£¼í9³§céÒ°mÙ;vbñÂo•æ=k:vìÚ Û–m±&`üý—V¨Íʲ|é"øM›…n®îø aCµËM÷óť˗ѥ›Z·n%—¶dѬûÍmÛ`Šï4¬ X)XW§Žѵ{Oí݇é~¾jÍkÙãåè`ôŒ tîÜIÔfgçÀ±TP+TŸ&ÇPˆÐØ…Ú*§î|Vtýhz¼ˆèí$jè6¥¨ÇˆéH|’‡¼Ìdìb¤VÁ˜¨ãðç[î⨨¨¨ ´………hݺ5N:¥p @FF:wîŒ+W®à×_…—— ±xñbLœ8QÖ—?þGENNàÉ“'ðòò©S§àââ‚ÀÀ@XXﱉDrcz‚¯¾ú )))øòË/áçç§´ÍÒå^¥ý·ÕÄ4nbƒ;‰ Õ²VÖ¶'‘HÄ›ÐU"ï½™Ð6²@æÃkHލü –èm j5¥,¨U§.ÄDDDÂA­„SB¤¹Ê 2°½:-N1¨%""""bPKDDDDÄ –ˆˆˆˆÔ1¨%""""bPKDDDDÄ –ˆˆˆˆÔ1¨%""""bPKDDDDô†µ"‘Hö£¥¥ 8ÉÉɪïÑ£GÿJŸ‰ˆˆˆˆA­œ¢¢"áÅ‹xøð!<<<0yòä ÕÕ²eKi"""¢7˜¤&tÒÈÈC‡ŤI“*T¾¢gx‰”±²¶Õ¸Ìí[ñœ8""¢*RcöÔæää@*•Ê‹D"¬^½¶¶¶²ÀÕÕÕ:::puuEJJŠ,_é…ò@zz: }}}4mÚçÎS«\i¡¡¡ÐÖÖ†T*E›6mË•ö*ù4Au‚ä~­”๪ƒöЦ IJJ®’q—­÷uÏ]eõçuŒ‹ˆˆAm%ÈÌÌÄÆ1pà@¹çÍÌ̘1c<==ñìÙ3øøø`ÆŒ²À£ô¿By`Ö¬Y:t(222°páBøøø¨U®4/// ''óæÍ“«ƒH™-[·#;;»Ú÷³*Î8÷êÓ¯JúZUõ¾îþT·q1¨Pr¡˜X,F“&MpëÖ-¬^½Z.Oÿþýajj 8|ø0 ©T }ú@*•ÂÓÓW¯^U«\i... Cxx8zõê…ÄÄD®4RiÈàAØðæ·rìiii5ªÞ×ÝŸê6.""µJ>¶-,,Ä£G°iÓ&Êå111‘ý?%%FFF}}}¥[Tå}òä tuu5.WZPP²²²Ð·o_Ô®]¿ÿþ;W©4xð ÄÅÄǦgd<Åè1ã`ÓâCŒò‹§O3Ý\ÝqÿþÀýûÐÍÕ]0?Püùöí»Ð³—‡Òþ„< »ööhfÓ¿;.W¶tp5Ò{ ìÚuFHÈOjõ·¬’úÊ~l¯¬ýW©·k÷ž²ùýóÏûpëÙG.È~FëÛcÈБHIIU«M¡9PÕ¡zÇ|:q'O¢¢c0nÂdÁù""bPû†077Gffñ„¬¬,˜››W(¯™™rss_© KKKDGG###kÖ¬AŸ>}¸ÒH%±XŒ3ü°t™¿Âôþ«0{Öt\½|½ÜݰruÀÙɱ'Š·áœˆ; g'GÁü%ŒMŒ±_Òþܸq±ÑáX°S|§)̳Ü5œœpêd4®^‹W«¿e•lg(»­AYû¯R¯ƒ}gDFÅ¢cbáìì$WæÂ…‹8s*}úô‚ÿÊÕjµ)4ªú#Tï—sfbé2äææbÅŠÕøröLÁù""bPû†èÙ³'öíÛ‡üü|„……ÁÝÝ].XHJJR+oŸ>}‰‚‚üüóÏhÖ¬™ZåJ³µµÅþýû!‘HP«V-Á³ÆD¥uêØEEE8}úl¹´ðˆHX5n ±XŒîݺ"<<àâì„'NââNÂÉÉA0‰®Ý`ll¤´/cÇŽžž.z¸vGAAÂ<ÑQ1è÷±¤R)&M¯VÕ¥¬ýW©×ÑÑ‘QÅ}Ž…³³£\úg“'BWW}{#*:F­6…æ@¡z7n»Úb¤÷t¶ïˆ† ðBD$@ò¦ Äßß^^^˜2e \\\(KëÝ»7êׯœœ•yW¬XáÇÃÃÃÖÖÖØ½{·Zm”¶eËŒ3C† X,Fpp0W©mÎìðýb:öËŸEMMMCÓæ­äÞ¬@‡í0kÎ\äååáâÅËXé¿L0‰’­4ʘ–ÚÞ£LJj*ÌÍÍ––jõW]ÊÚ•z;uì€iÓg#==W¯Å£};;¹ôºuë ––®V›Bs Šª±xŽî=zaåÊe|aÕÄ V[ •ÍS»vmDFF*ÌûË/¿¨·V­Z8räˆÂ4¡r¥ûÓ©S'$$$puQ…Ô«W:uľà¹çq*. ‰üËVGG¶66X¼d9¬›6‘í W–¿2YXX 99µk×FjjšZý}U¯R¯¡¡!lš7ÃÚuðᇭånXdZXÔBfæ3¹U¨M¡9xÕ±ìÜ»ÚbçÎ@Ìýr_DD´8DÕϤ‰ã°gü~g'$Þ¾ƒÂÂB„„üO¯a/Ó\œ´W¶ŸVUþÊÒ½{Wì þ ñã¦-j÷·,±XŒÔÔTµÚ|Õzì±go°Ü\•øqóäåå!ìà!¸vï¦V›Bs ª?BõÞ¹sç¿€];·âôé3¸{ï^…拈ˆA-½6úúúøôÓQrÏÍ™=K—®€m˶ر3‹~[*8*МJjBù+Ët?_\º|]º¹¡uëVj÷·\ êâ§njµùªõ::Ú£  @aP[·Nص·Ç‰¸“ð›:E­6…æ@U„ê]¼d9fÍœmmmÌš9‹/¯Ð|½-D ݦõ1‰Oò—™ŒCŒÔ*u>ã|ÕÚ*@¤©;‰ hÜÄw«ç6+k[Ö¾H$âÕêÕDRR2F‹CCËS#"¢šÃ{o&´,ùð’ã#Þœ ňþõw„¥¾zùM"tÿÓšôååå!hÏ^tëÖ… ˜ˆè à–¨Þä3zoòØ>j× -[¶Ä¦ë¹ˆ‰ˆÔÕLW/ÿþVóDDo^(FDDDD j‰ˆˆˆˆÔ1¨%""""µDDDDD j‰ˆˆˆˆÔ–Ó¶m[)L DÛ¶me«úø¥ëSo¶ODDDÄ ¶ \¼xkÖ¬AzzºÜóiiiX¾|9.^¼({Ž_ÓKDDDDÕöË<<<ˆÏ>ûLö\`` >þøc\½z•GŽˆˆTЉ:þÆŽÍÉ¥;0QMj½¼¼0hÐ ¹ vË–- ÂÂ… eωD"ÙÙÚÐÐPxyy¡¨¨¶¶¶X·néééðññÁÿû_Ô¯_h×®€â3ÀC† ATTœ SSSÁþ9s“'OÆÕ«WQ«V-,^¼£F’õiݺuX±bþùç£ÿþ*ÛJNNÆ!C'''ìÛ·µjÕ*7NMÆMDô¶óçûÆ©¨¨wxp‰J©¶ŠY[[C$áܹs€³gÖæ1 IDATÏ¢  -Z´ „““ƒyóæÁÇÇG–6kÖ, :X¸p¡\ÚìÙ³±bÅ <{ö žžž˜;w®Êþ=sæÌ‘Õççç'—~÷î]$$$ 88^^^jµ5cÆ xzzâÙ³gðññÁŒ3Ô~ lÜDDTV÷uûIDЉºM)ê1b:Ÿä!/3;‡©U0&ê8|ÆùVÉ ¬ä,äÒ¥Kq÷î]lÚ´ ãÆC½zõ0þ|¹³”¥ÿߣGH$|ñÅppp€¾¾¾¬Î÷Þ{wîÜ®®n¹öêÖ­‹@"‘ )) m۶ŃÊÕ_öli‰üü|hkkËåKMM…™™Y¹rBm½óÎ;HLL„±±1²²²ðÁàÉ“' ÛVwÜ5ÕÄ4nbÃ3DôJªòoUUüí»}+^e>+k[ž©%à½7ÚFÈ|x ÉñÕû–^ƒ ¾}û””„}ûöÉñT$((YYYèÛ·/j×®ßÿ]–öäÉ…-$%%A*•B$¡víÚøçŸTö-)) ,ÀÀѬY³ré%­&m¥¤¤ÀȨøM…¾¾>RRRÔš'¡q½ ªuPÛ¨Q#4kÖ ãÆC£FдiSÁü–––ˆŽŽFFFÖ¬Yƒ>}úÈ™¹¹¹ Ë™™™!//OöÑNAAʾõîÝÏŸ?‡··7ÂÂÂÔ“P[æææÈÌÌdeeÁÜÜ\aÉÉÉj›ˆˆj¦ÌÌLø|:^öwˆjpP ï=pà€Ê³´`kk‹ýû÷C"‘ V­Zrg:ûôéƒÈÈHà矖;»Ú«W/$$$   [·nEçÎU¶•OOO8::bݺujG¨­ž={bß¾}ÈÏÏGXXÜÝÝeiR©¡¡¡xþü9-Z¤ö¸©òYYÛâÀ_>_mýÛ~;vÍlZcÒdß·ê˜VDRRò[3V¡rêÖYæ+)) "‘¨ÜP|!oŸ>}`hhSSS 4=z-ý,,,Ĥɾˆ‰9I“}QXXÈ_¾D5=¨4hD" ¤2ï–-[ðÍ7ß@GG^^^–¥­X±Ð××Çüùó±{÷nYš¿¿?¦OŸ}}}`óæÍ*ÛÚ¾};† †&MšÀÚÚZíñµåïï½{÷ÂÈÈ;wîĪU«di%œÕ«W¯Ük¡qSÕØ²u;²³³ßȱMñ†µ+±6`%´ª7©}úÕ¸>«³g³ªê¬ó…_­^½7ÆãÇñàÁ|ðÁX¿~ýkéç‚ïãÔé3€S§Ï`Áw‹ù‚#R¡ZÞÒ«ô†þúõëãÅ‹JÓKÿ¿S§NHHP¼q¾V­Z8räˆÂ4KKK;vLe_JÿßÓÓžžž²ÇS§NU˜¯ìc¡¶j×®ÈÈH…iýû÷G^^žìñ„ Ô7U!ƒaÛ0ÍïÍ;›YPP€®¼ÿ¥:ÒÒÒ8 5l¾âããѦM…iذa d¿gÇŽûZúùí7_áÛo¾â¢!Ò€§€HsƒB\ÜI<|øPazÙcK?¶²¶EPÐ^´ëà€vpô·ãˆCg{4³ißþÇÞ‡EUïÓ ‹ `‚–7oÙODwAQp@YDR¯V–¹±˜`pRÈåj–¢€†Ý,—rE4\*·«(â–Š,.@=©÷–3ÀhÈÄ\~xa†}¿ž‡Gçœïù®ç>œùžsNª>,þúõðòñÃÔi3!‘H”ËËÊÊ1Ó?¶}aƬ@”—ËTÊØºu¼|üÔÓgÀÆn ¦ÏP¾½¯¦žê¾N./—!8$ }ûǘ±¸–Ó`žº¶Y—´YY×0~â›°±ˆN®Øà;•|vîÚ ‘«{í¤R)¦M÷‡½Ã$%íWicÍô‹Þ6ý1Îo".^úQã×î+M}ð$Må¨k—›‡7nß~ô´”Û·ïÀÍûÁ}AÓ¾©©êsèðQØuªwÌj—®ýõä><ÚÝKy¼ýòËmxzùª=Þ4ÉËËSÔÞºu ¯¿þºòóK/½„k×®ñ„GÄ –èÙ%ðá‡ó½:¶QÛß*(„8õ8V,_Šõë¿@vN’OÅúø8„†…«¤Ý¹+ßLBP€?bb×)—ÇÄ®EäÂdg]‚·'âÖÅ«lgfn†o÷$Ô[~ôêXx{{";ë&Mš¨lGÍ×Èê¾N^¿qcqõòyÌŸŠÈ¨Å æÙ˜6k›vAä"¼?;W/ŸÇ¼y¡X¹jµJ>·ïÜÁñc‡êl·&vD"gdžMCvŽj[Cñdqòr® $ø}•6ÖV__5ÔÚ–£®].¢‘8}&p&ã,\D#µÚ4Q×Gõ¹qãN§¥hL«®]é¯Úû°³Óœ§ÒÒOÃÅETg,´‘››‹]»v¡S§N077‡¿¿?îß¿àÑKzj®Ò€‘‘‘Ê’OCº8¹Á"bPKÔ¬†;Cuu5λ ó¶¡sƒabb7ܼu Ó§M…±±1Æx¸×yúFèÁ044„£ãP¤ž+—§¤ž‚UÏžpw””T•íÆx¸Á̬þçN‹ÓÒá;ÖB¡în£z*M«z§žJèQ. …ðööÄÑÃßi§NmÖ2íñc‡àåéCCCL²r•|æÏA‡êl—&NÇø7ü ¯¯à9³U¶q6©©bdfž‡‹‹)'i=®ºô«¦rÔµËÕE„3gÎ22ÎB$rÖj_ÐD]Õ'0Ð:iL«Kÿ5Ô_µ÷á‘#”ûZÚi¸¸4î­‰¹¹¹xûí·QTT„_ý"‘H9«ºº/¼ðø×¢žžÁS=¯Ì mð‡ˆê'd5^Tä‡û{¾Ý› Óv;?zŽqÍ/ÌÚW‡žÔµkž€QZZ¦\.‘HÑÛ¦¿òó“¿|kžy\ŸÒÒ2e™FFF¿&¯­¤¤†††ÊS—6k›V"‘ a÷^ܼy¹y×ë¬777«¿‰²Œ.],UÖ­[æ!pv0„B!¶£o_í¾ÞÖ¥_5•£®]Æ9`aÔ"Èår\¹’…¸ØÕZí š¨ë£út27o0.ý×PÕÞ‡‡;CxD$JKK‘“‹¡ö:f‹ŠŠ”ÿ×××ÇÛo¿àà`¹øðáCå3Íåryƒ¯Lon|¡QãñJ-QtïÞÇ;bÏÞ$µiê»9¦æBÚJý¢¯¬¬„………r¹™™näe¡àV. nåâæuíçþ™››ãÁƒ€ŠŠ ˜k¬ÔlWû†E]òÔ¥ÍÚ¦ œƒ‡+0qÂxlÞ¸Aëü---•Ï{–H¤OÔ‘˜°W/ŸÇ’Å‘œÜ"ýª©uí244„­-V®ZëÞ½”ÁWSö…æ¦KÿéÒ_;v„­M¬ÿ| }}ýf©oUU•òfä>}ú¨<«¬¬¬Þ—ëƒZ¢gRðœ ìÞ­ú5¡Pˆ'“QQñ¾ÜÔ¤ü¿Ú´r¹gΜ…‡‡›r¹«‹ù…P(HJÚÉo½«už"‘39†ªª*¤¤Šµþ*wô(œ;w …ÇO$cŒ§o“ólŠü‚Bx{yÂÞ~vìÔþj¹»ûhìÙ» …7mQYçå㇣Gÿ¡PˆN:)ÿ¨¨@ P™s©Kh*GS»\]EØ•¨œOÛÔ}¡¹ijWSú œ°;q¯JÛuÕ§O:tUUU¨¨¨ÀÎ;ñꫯþo¿pÇÆñàÁ<|øß~û-FÕ*ýøe+`em§üùDz<Ù1¨%jYÆÆÆ˜¡²¬æFgÑ(¼þz&å?Üѣݽ¸µ!èèØõŒmÛwaå'˵Î3já‡8tøútÀƒßaQÔ­¶‹\m;v®ß`|ÿ9bc£›œgS¬‰þóÃÂÍï÷оŸ#æ‡ájVF¹ybÀ€þ*ëV}ú1â?ÿ6v•ÏìUÇÕUg‘[£ú@S9šÚåú¿ÀOT+°kʾÐÜ4µ«)ý<šW[UUU'¨Õåéû÷ïÇÚµkѱcGüå/X,V¾200gÏž…¥¥%,--qìØ1„…µÎcû–.ùÇýï0 K—|Ä“-Qôzx†Vy/ù¿Ë!—cûS­6L'cVPXg²5‡Âü<ôìeËùeD¤TTTŒ3qäðA­·iO¿«ôôôTžä “É6/ñëbUæ[YÛ¡ººšçGzîMO”ÁÀÔ²»9(ÎMåbDºÐæŠPK¼±‰èy'—Ë‘°;nn£ž›6›ššâ›-9øDZbPK¤¬D­cˆÃpôë×›¾ú';ƒˆÔQû”õ#;ˆÔµ|cÑ3Ô9r¾¾¾8|ø0ÆŽ«1­žž^›¾ ­×ˆèYÖnªÒvz§AµÃ vãÆð÷÷ǦM› j‰ˆˆêà D j[ÕÝ»wqåÊäçç£W¯^ø÷¿ÿW^y…#FDDZ¹ºóÑWDω6ûò…-[¶àwÞ‘‘Þ}÷]lÙ¢úÖŸââb¸»»ÃÂÂ_ýµry¯^½PXX(,,D¯^½çÏŸ‡½½= ñ—¿üÛ¶mSn£§§‡þóŸxíµ×```€ƒ?±´´'N„±±1z÷î‹/*×I¥RxyyÁÈÈžžž*ï-WW?""""zN‚Z…Bo¾ùþþþ€Y³fá믿†B¡P¦‰ŒŒ„——~ýõW\ºtI¹ÜÛÛ'NœœDuuµò§¢¢W®\Á;w/½ô~ûí7eYÃÈȃFxx8úõë‡:ÆŽ‹?þøÓ§OÇ¡C‡´®Ï‹/¾ˆÊÊJµëär¹²ŽUUUÊuêêGDDDDͯÍ]©Ý²e ÂÂÂ`hh¨²ÜÈÈsçÎÅ–-[°|ùr¼ñÆؼy3-Z„èèh•´>>>˜;w.Ö­[§\–——‡/¿ü={öDTT”ÖõñõõÅ©S§àîîŽ~ø}ônܸ¡,'//vvvؾ};¾þúkœ={4ÖˆÚçýaø"WwîDÄ VW …@fff½ëçÌ™ƒ#F`éÒ¥X¹r%Þ~ûmôìÙ³Þ €r>-lݺï¾û.JJJðÑGi]§˜˜L:~~~°¶¶ÆÎ;•ëbccñÎ;ï -- }úôAbb¢r¦úQû2+(ì¹lwuu5‡EDí†^ÏÐê1ïE ÿw9ä²blŸbªÕ†éâdÌ ãC­©Eæç¡g/[þB¥V÷¼žëx Q[7=QSKÈîæ 87µí>§–ˆˆˆˆH[ j‰ˆˆˆˆA-ƒZ¢v(?¿3f®ß`Œp…­[w<3m³²¶k—õ.**~je#6v1}FJKK•묬í‡aÎpæŒã'’qútF8¹¢íœ8™Ü¨´YY×0~â›°±ˆN®*A¶•µvîÚ ‘«{í¤R)¦M÷‡½Ã$%íרö'“ÑÇvzÛôÇ8¿‰¸xéG庲²rÌô‚mßA˜1+åå2•ò“öÀ€AC1åi()‘h]ï­[wÀËÇOcÚš)µ§N44µóÕuÊ…¾¾><ˆƒ*_•ýüË–-«7=¯Ü1¨%js~ýí7üµ{wKôêXx{{";ë&MšˆèÕ±*ioBœz+–/Åúõ_ ;'É'b}|BÕvAä"¼?;W/ŸÇ¼y¡X¹jµJ>·ïÜÁñc‡êl·&vD"gdžMCvN®Æ¶‡†…cÉâ(äå\AHðûˆŒZ¬\»‘ #u >Þžˆ[¯²íåËWp>3¾¾>ˆ[§u½ÍÌÍðíži nåªü«ÍÔηövÚ¨™vP3 áüùóJ¥Ê¿<‰sl‰ˆÔµ9zzÞ~§‰8-¾c½! áî6 ©§ÒTƒÃ¹Á011‡‡nÞº…éÓ¦ÂØØc<ÜQUUÕ¨´Ç‚—§ 1a¼ÊÊÊUò™<:t¨³]š8ãßðƒ¾¾>‚çÌÖØ.ÇaC‘š*Ffæy¸¸ˆrò˜r]Jê)Xõì @w·ÑHIIU-?dŒŒŒà7n,ÄiéZ×{Œ‡ÌÌLµJ«ËÔÎWW&L€\.‡\.Ç„ ”siÕÝ@FDD-OÈ. ÒÍ+¯¼‚ÿû?èÙóÿ”Ëär9NœL†ïØGWêJKË`bb022Rùê:w~ @™¶>Ú¦•H$Hؽ7oÞDnÞõ:ëÍÍÍêÝ®D"Q–Ñ¥‹¥Æ¶¯[æ!pv0„B!¶£o_»ÿ•/Eo›þÊ´5õ­Ñ­ÛËÊúK¥¥Z×ÛÔÔTë´µ54µómŠŒŒ .\¸ˆ±cÇaaäb|¼b% EƒyYYÛé´¼¥4GyÍ£öv-Ñî–îË¢¢âV-ŸˆˆA-5JlÜ:• ;'èÞ½; н{w"77÷î!nm|»iSÁ­Üg¶-Ý6ßñ<(ˆˆÔµ/×oÜDæ¹ 8pð :vìXošŽ;âÀÁƒ8›y7oÝb§=ã¤R);ˆˆA-Qû²mÛN|øánݺ‘HˆD"Üú_kllŒððlÛ¶³Éež8™Œ>¶ÐÛ¦?ÆùMÄÅK?*ו••c¦lûÂŒY(/—5*Ÿ'§ìܵ"Wwô±€'“•ëJKKñî{3`?Ô Û¶ïTûÕº.õªMÛzè’¿¶yZYÛ!iß 4SÞ™†’I½yÔþüä¿jÿº~^>~˜:m&$’Çùfe]Ãø‰oÂÆn F8¹bÿïTÊØºu¼|üxà1¨%j^g33áææ¦ü€Ó§Oã?þÀéÓ§ \çîŒÌ&—Ž%‹£—s!Áï#2j±r]LìZD.Œ@vÖ%øx{"n]|£òyÒí;wpüØ!¬ChX¸ryÜÚxøóEÆéTªÝ^—zi¢®MÉ_]žpùòœÏL‡¯¯bãÖ5˜WÍÔ††¦8ìÜ•ˆï&!(À1±ó]¹ïÏÄÕËç1o^(V®Z­²™¹¾Ý“ÀˆˆA-Qó*))A—.]”Ÿ¯\¹¢²¾öç®]»¢¸¤¸Ée:ŠÔT123ÏÃÅE„”“Ç”ëRROÁªgO¸»FJJj£òyÒÜà9èСÆx¸£ªªJ¹<õT|ÇzÃÐÐsCæ¨Ý^—zi¢®MÉ_]ž07dŒŒŒà7n,ÄiéͶ߄~ CCC8:Eê)±rùñc‡àåéCCCL²r•íÆx¸ÁÌÌ”‘|¤Q#XXX ¨¨¯¼ò `ðàÁHOü ˜‡ÀÙÁ …HLØŽ¾}}Ý-‘HÑÛ¦¿2­@ P[–¦|ždnnVïòââbeݺtQß6uõªý5½67p©«‡.íÖ6OèÖíeå¸H¥¥Í¶ßtíúè!}}}”––Õj‡ »÷âæÍ›ÈÍ»^g;SS´DD j‰ZÀˆáÑ’’‚iÓ¦¶lÙ‚ÀÀ@üøã2d6oÞ¬L›œœ '§áóë߯/ acÓçq°WX¨lvî܉ ÛQYY‰ï8„ÀÙÁÈÌH˜™™!3C ¡°áCZS>ÚêÜùE”—Ë`nn†’’µéÔÕ«¹žD K»u!‘Haii™ì¾Ú ½17†I¥¥°°èŒÊÊJXXX(—ÎÁðáÃ0qÂxü=ìΟ%"jN? j„™3§!&f þøã@¯^½ ‹!“É ‹Ñ«W/ÀüØØXÌœ1Mc~¡¡!Xþñ§(,ü ……?ýŒUÑ1~?H™ÆËÇGþ B¡:uR¹‚èê"B~A! ’’öcò[ïª-KS>Úrw}û ²²_~µYm:]êÕ-•ÿÆÍ[ —Ëqèðx¸?ž;- qâd2**b×›T¶*7Õç«M›!—ËqæÌYxx<Î7¿ Þ^ž°·‚;9w–ˆˆA-ÑSÒ§·õÿ®¬MÀýû÷ëM#“É0qÂ8; ‡µu/ù9ØÁ”)oa¦lìbæ¬@LœðœG(Ó¬úôcÄþlì"4,ëãã”ë¢"#»~ƒ±mû.¬üd¹Ú²4壭ðùaHIc”›† „^¨ÿT¢K½£¥òïöò˰ê„3g1^¨ryÍMe΢Qxýõª¶«Î"7ùwtÄhw/$$îAÄü0åò5ÑŸb~øB¸yxãõ=x€5‚^ÏÐê1ïE ÿw9ä²blŸ¢ÝÜ­tq2f…¡ººš½HÍ®0?={Ù¢0?¯ÍÖQ¡PàÓ•«qJœ†Å‹—ÀÛÛ/½ôîÝ»‡cÇŽá“+0j” }´P§¹žíMii)Ü=|péâÙg¢=VÖvmæ%DD¤ÞôD L-!»›ƒâÜTΩ%j,@€¥K>‚··'ö~»Ë—-CqI1,-,1t˜bbVÁ~Èàg²íC†cmÜ ê€M›¿½Ã&’5PQc0¨%j"û!p°ò\µyù²%X¼dJJ$2xbÖ¬jR~ d‰ˆˆA-=u¾c}à;Öç™ll"¢ö‰7ŠƒZ"""""µDDDDD j‰ˆˆˆˆA-ƒZ"""""µDDDDD j‰ˆˆˆˆA-ƒZ"""""µDDDDD j‰ˆˆˆèy&dµ}VÖv:oSp+—GDD j‰¨m©®®Ö:­žž^£ƒä¦ÃV,GýÜ IDATÖvjóд®%£KËvû‡Œ6}õdŸv1¨%¢Võ<>>¾ãqñü™çª h‰èyÅ9µDψ?þb±˜Q‹T*e‰ˆÔQ{±fÍܸqvvvÍ–§•µvîÚ ‘«;úØÀ‰“ÉÊuYY×0~â›°±ˆN®Øà;•m¯_¿/?L6‰¤ÞüËÊÊ1Ó?¶}aƬ@”—ËÔÖESyON¥¨ùüä¿5àô°±ˆé3PZZª¶Ìòr‚CÂзÿxŒ‹kÙ9Zåcem‡„„D8 s†Ã0g?‘ŒÓ§30ÂɵN?ZYÛ!iß 4SÞ™†’Ýúª¾6jÛ^MãKDÄ –ˆžº 6àçŸÆîݻѥK‚Öú~j»}çŽ;„õñq W._¹ïÏÄÕËç1o^(V®Z­²ÝÎ]‰øþ`‚ü»®Þòcb×"ra²³.ÁÇÛqëâÕÖµ¡òêSó5|í¯ã£WÇÂÛÛÙY—0iÒDD¯ŽUÿ‡BLüÆÅÕËç1^("£kÏ­‚BˆScÅò¥X¿þ dçä ùäÑ:ý—/_ÁùÌtøúú 6N·¾ª¯µ5TOuãKDÄ –ˆZÜ®]»pçÎÀ… ðÕW_!>>^ç| nåÖûSÛÜà9èСÆx¸£ªªJ¹üø±Cðòô€¡¡!&Œ÷CYY¹Êv¡ÃÐÐŽŽC‘zJ\où)©§`Õ³'ÜÝF#%%Um]*O[â´tøŽõ†P(„»Û(¤žJS›6õTFrP(„··'ŽþNë|BçÃÄÄn¸yë¦O› ccã:ýsCæÀÈÈ~ãÆBœ–Þä¾Ò¥½êÆ—ˆ¨=âbDíÌ7ß|ƒøûûãçŸÆÂ… a``Ð"e™››Õ»\"‘ a÷^ܼy¹y×ë¬ïÚõÑc}}}”––©ÉCŠÞ6ý•ŸÚz4Tž¶JKË`bb022R~_û uM`_RRCCCò©Ñ¹ó‹*mªI[ŸnÝ^V¦‘JK›ÜWºÔSÝøµG¼RKÔΤ¦¦âÚµkÈÍÍEjj*&MšôÔë8V`â„ñؼqCõ5ÁYee%,,,êÍÃÌÌ 7ò²”Wˆo^¿Öèò—+m H7ǃ077W²O^©677‡\.×)Ÿ =RíÉ€d²ûj?¦K_éRO""µDÔª^{í5=z‹-R{5±%åÂÛËööC°cgBõ_mÚ ¹\Ž3gÎÂÃíÞ<\]DÈ/(„B¡@RÒ~L~ëÝF•' qâd2**b×›TÖ •ÕD"g>r UUUHIÃÅe¤Ú2GrÁ¹s P(püD2Æxú6*Ÿ†lܼr¹‡‡»î}õdkkÎz1¨%¢!°`Á‚Fo¯ÍbꬉþóÃÂÍï÷èQgýpGGŒv÷BBâDÌ«7¨ÈDGÇÀ®ß`lÛ¾ +?YÞ¨òjnrrÂ믫®suÁYô8PŒZø!>‚þpààwX¥¾ÿ"F`ÛŽ°ë7ŸÅŽØØèFåÓn/¿ û¡N8“qóç…êÜWO¶Qe»f¬'Q[§×Ã3´zÌ{Èÿ]¹¬Û§˜jµaº8³‚ÂtzË‘¶ óóг—- óóØÿ @u}£Âß>Æ•ãDDÔ8Óe00µ„ìnŠsSy£Q»ù T‡yšÏZà§B""ªÁ –¨xžƒ7®DD¤ Ω%"bÀNDÄ –ˆˆˆˆˆA-ƒZ""""bPKDDDDÔÎñéDDÔ“Ÿ‰vˆ\Ý9˜D j‰ˆèy6+(¬]׿ººš/œ!bPKDD„6÷–K===­êô¼¾\…ˆA-Q;Á«¯DOo#""""µDDD¤™L†Y³!“ÉØD j‰žO§Äi°²¶Ã)qšNÛ«|¶²¶ktžÌëih2›‹¶}ÝœcÔZmÐʼn“Éèc;Á!a-6¾·o߯o¼SSS˜ššâÍ7ßÄo¿ýÖª}©P(†ôô3 ƒB¡h“ãÓÏÖjg[:9. j‰ž‰{¾ÅäÉÞ½I:mçã;^åsÁ­ÜF×áɼž†Ö(³µÛØ”1jBñ>>ëããZl|'MšWWWܽ{wïÞE¯^½0uêÔVm÷Ç+V"óÜy@æ¹óøxÅÊgnß%ŽKkâbDíÀo¿ÝC^Þu¤œ<7oÜ»w/½ô’VÛJ¥Òf«GsæÕ–ËdUUÆx¸·hÛ/\¸ òyéÒ¥xñÅ[µÝË—-ÁòeK¸ïÇ¥…ðJ-Q;ðmÒ>øó…¡¡!ÞðóÅÞo÷«¬//—!8$ }ûǘ±¸–àñWCµ¿"ªù¿›‡7nß¾¸}ûÜ<¼YY×0~â›°±ˆN®Øà;µy•••c¦lûÂŒY(/W?OP]¾OæY_Yµ×K¥RLŸ»˜>#¥¥¥jËT×/ åcem‡„„D8 s†Ã0g?‘ŒÓ§30ÂÉ}làÄÉd•´Iû`À ¡˜òÎ4””Hê­‹º¾Ò4FÚÔsç®Ý¹º×©W}¿äššÏhw/ܽ{ðË/·áéå«óx×n¯®û”•µ¶nÝ/?Ž™L†íÛ·ÃÏϯ]ÿšöc8tø(ì‡:Õ»†Ž¹Ú}©)­.ç]ƯfJo›þç7/ý¨±tm§ºsœ.ç-¸~ý¼|ü0uÚLH$­ÚÚP?h{Ü6&Ÿ¦Ž‹¦´R©Ó¦ûÃÞa’’ö3¨%"Ý( $í;€É“'&Mšˆ¤}ûUæã­‰‰ƒß¸±¸zù<æÏ EdÔb¿Æ®ïëlÑHœ>“8“q.¢‘€‘‹ðþì@\½|óæ…båªÕjóЉ]‹È…ÈκoOÄ­‹WÛuùjR_™Ñ«cáíí‰ì¬K˜4i"¢WǪÝ^]¿h“Ï­‚BˆScÅò¥X¿þ dçä ùäQ¬ChX¸JÚË—¯à|f:|}}·®Þº¨ë+Mc¤M=oß¹ƒãÇÕ[¯æÎÇÙiN‰Óié§áâ"Òy¼k··1û”™¹¾Ý“ õñó·¿ý ¯¾ú*æÍ›‡àààV9†ÓÅÉ þh¢i?€7nàtZJ±k蘫ݗšÒêr~ÑeüBñdqòr® $øý:íz’®íTwŽÓå¼;w%âûƒI ðGLì:­ÚÚPڷɧ©ã¢)íšØu‰œ‘y6 Ù9mošƒZ¢6.-í4º¿ò ^ïÑðzèþÊ+HK;­L“z* £F¹@(ÂÛÛG×`¾®."œ9s‘q"‘3àø±Cðòô€¡¡!&Œ÷CYY¹ÚÇ!<"¥¥¥ÈÎÉÅPûfï†úÉÔÔTç}æ…^ÀÒ¥K±~ýúV9†›úò…†ŽïNææƒÚ}©)­.ç]ÆomÜj„|0³ƒ! ‘˜°}ûÚ5[;ÕŸãt;»víÐ××Gii™Vmm¨ mÛ§•ê¾ >m‰D¢<7vébÉ –ˆ´÷Ÿÿüмë7—sÊå•••íî_ý ݺ½ sssÈår•4 144„­-V®ZëÞ½`ddœƒáÇaâ„ñø{Øç/š™™!3C ¡°áS‰¶ù6tƒƒ¹¹95tym©D"…¥¥d²ûjOôºô•.õ|šùtìØ¶6}°þó 4hôõõ›<ÞÍÕO ©¬¬ltßµ¶ÆßºŽ¦´º”¯Ëøuî܉ ÛQYY‰ï8„ÀÙÁÈÌHÓ¹ÔÕ]Ý9N×}L*-……EgTVVÂÂÂB«¶6×~ÜùhJkii‰ââbtíÚIÛ»ÓˆÚ°o“öaÆô©u~™⽩ïàÛ¤}€Ñ£\pîÜ( ?‘Œ1ž¾*e×¾¹¡6WWv%$*çš@~A!¼½ Ù¸y är9>w·úûZC_i£æªgsåãìì„݉{Uö]Ç»¹ö)Mlmm±ÿ£¹ç÷ïßÇÚµk1kÖ¬V=žÿ±l…ò9+k;ücÙ ­¶Ó´7Ç4”V—ó‹.ãçå㇣Gÿ¡PˆN:©ý–£)í¬ï§ë>öÕ¦ÍËå8sæ,<<ܴʧ¹öãÆæÓ”qÑ”ÖÝ}4öìÝ…B›¶0¨%"í?‘Œw¦¼Uïºwßy Çþu …‘ #°mÇNØõŒÏâ?Gll´ÊIÝY¤.Ðù¿€çñ Mô§˜¾nÞÊy¼êòŠŠŒ@tt ìú Æ¶í»°ò“åjÛ¢)ßš›œE£ðúë ”¹ðC:|ý:àÀÁï°(jÚ25õ‹.ù4¤ÛË/Ã~¨ÎdœÅüyõÏÔÔW𯍹êÙ\ùŒ鄪ªªƒZMãÝ\û”&û÷ïdž `bb‚×^{ r¹Ÿ|òI«ÏK—|„áŽÃ<šÊ±tÉGZm§i?nŽ1h(­.ç]ÆoÕ§#þó/`c7PùìâÆÐxΪç§ë>6Üѣݽ¸óôʧ¹öãÆæÓ”qÑ”6b~®fea”›' èßæ~gêõð ­ó^ò—C.+Æö)ÚÍWJ'cVPª««yP³+ÌÏCÏ^¶Mž‹FÔÒ¬¬ížù—%ÔVTTŒ3qäðÁ6U¯¶ú;IOOOeÿÉd›øu±*ó­¬íP]]Ís‘¦'Ê``j ÙÝç¦rN-ÑóŒ=éy ÎHwr¹ »áæ6ŠÑH¦¦¦øfËFvQ `PKôœbKºâ0ýúõæ¯þÉÎ "µDDüã }ÊÎú‘ND j‰ˆˆžG ½1ŒˆÔ©hk7Zi{%ŸÓˆÔŸÆCÄ –ˆˆ¨}¹ºóqXDÏ9¾|ˆˆˆˆÔ1¨%""""bPKDDDD j‰ˆˆˆˆÔ1¨%""""bPKDDDD j‰ˆˆˆˆÚ5¾QŒ¨‰.^¼„={“páâ%”””ÀÂÂC‡:àí·&ÃÁ~;ˆˆˆè)à•Z¢FR(X¶üD}´c}ýpáÂEÈd÷qáÂEŒ; #ãã+¡P(ÌËÊÚN§åmAíºk]ïÚëZ¢}-ÝgO¶µ=ƒZ"ª#6nŠŠJ“ƒÀÀ@tïÞèÞ½;‘››‹{÷Š·6þ™ï ßñ*Ÿ nåjµ¶étÑyjj+1¨%j·®ß¸‰ÌspààAtìØ±Þ4;văq6ónÞºõL÷‡T*}nÆþyj+ƒZ¢gܶm;ñᇠ`ll¬1±±1ÂÃ#°mÛÎ&—yâd2úØ@o›þç7/ý¨\WVVŽ™þA°í;3f¢¼\¦6+k;$$$Âa˜3†9ãø‰dœ>N®èc;'N&«¤}rÛúò{r¶_Á?¹ÍÎ]»!ru¯S]Û§MžVÖvHÚw Å”w¦¡¤DÒ`»ëkk½ô\¿/?L6Éã|³²®aüÄ7ac7#œ\±ÿÀw*elݺ^>~<ÀˆˆÔ=g33áææ¦UZwwwddd6¹Ìаp,Y…¼œ+ ~‘Q‹•ëbb×"ra²³.ÁÇÛqë4Oy¸UPqêq¬X¾ë×ìœ$Ÿ<Šõñq ש^5_÷7Ç×þ·ïÜÁñc‡êÔC×öi“'\¾|ç3ÓáëëƒØ¸uÍÖÖ»ñýÁ$ø#&öq¾ "áýÙ¸zù<æÍ ÅÊU«U¶337÷{x€1¨%z:JJJÐ¥K­ÒvíÚÅ%ÅM.ÓqØP¤¦Š‘™y.."¤œ<¦\—’z V={B ÀÝm4RRR5Èsƒabb7ܼu Ó§M…±±1Æx¸£ªªªÕúunðtèСN=tmŸ6yÀÜ9022‚߸±§¥7[;B?†¡¡!‡"õ”X¹üø±Cðòô€¡¡!&Œ÷CYY¹Êvc<Ü`ffÊŒˆ¨øH/¢F°°°@QQ^yå•Óþþûï°´°Ô˜ÆÄÄþù'ôõõ•Ë**ªLoX·!ÌCàì`…B$&lGß¾¾—H¤èmÓ_™V h,¯sçUÒ™˜˜´H?Õþš^›+¹ææfõ.×µ}Úä ݺ½¬l¿TZÚlíîÚõÑ<úúú(--«Õ vïÅÍ›7‘›w½Îv¦¦ h‰ˆÔ=E#†GJJ ¦M›Ö`Úääd89 ט¦¿¾(((„MŸÇA`a¡2h}ˆvFbÂvTVVâû!pv023ÒfffÈÌC(ÔîÖÓÓӹ͹Aª¹žD kû´%‘Haii™ì>ºt±l¶vK¥¥°°èŒÊÊJXXX(—ÎÁðáÃ0qÂxü=ìΟ%"jFœ~@Ô3gNCLÌüñÇÓýñLjÅÌšƒßÐÐ,ÿøSþ…BŸ~ƪ迤Lãå㇣Gÿ¡PˆN:©\Ytu!¿  …IIû1ù­w›ç¯^¡'N&£¢â!6|¹Im:@ rCTsk©ömܼr¹‡‡»›VíÖ¦­_mÚ ¹\Ž3gÎÂÃãq¾ù…ðöò„½ýìØÉ¹³DD͉Wj‰¡Ooëÿ]q›€}û÷×ûX/™L†É“&ÁÙi8¬­{iÌÏÁ~¦Ly 3ýƒðÛo÷ðòË/!ôƒ8;P¦YõéLjüh þ>ÿC¼ð X§\yóàü…‹èùÿ‡ÏÖÅ4K;kn®211Føü¿«:]Ep¹!/çJ‹ôwKµ¯ÛË/Ã~¨FŒpDìšUZµ[›¶wtÄhw/ôêe…õŸ=§5ÑŸb~øBHKKUþ`!"¢¦ÓëáZ=æ½äÿ.‡\VŒíS´›Ó•.NƬ 0TWW³©Ùæç¡g/[æçµÙ:* |ºr5N‰Ó°xñx{{㥗^½{÷pìØ1|²bFrÁ¢ê4”ž+k»Qµœé‰2˜ZBv7Ź©¼RKÔXK—|ooOìýv–/[†â’bXZXbè0ÄĬ‚ýÁm.Ó>""jOÔ5‘ƒý8Øiue JDDÏ*Þ(FDÏ%øDD j‰ˆˆˆˆÔ1¨%""""bPKDDDD j‰ˆˆˆˆÔ1¨%""""bPKDDDDϾQŒˆ¨éâäg¢"Ww&1¨%"zžÍ k×õ¯®®Fa~’ˆÔ=磌«ÛT}ôôô´ª“žžˆÔQÛÅ«¯DDðF1""""bPKDDmƒL&ì€ÙÉdì "bPKDm‹•µ¾ûî‡z—·DYOÛ‰“Éèc;Á!aëÓuS';;nnn011AÇŽñæ›oB*•¶j ‚Cž~Á!aP(~õÖO*•búŒØØ Äô(--U©§6S žlÓÎ]»!ru¯ÓMõ¬™êÐÛ¦?ÆùMÄÅK?ªíC]üùçŸèÔ©wT""µD¤‰@ À‡ÎGôêØFm« âÔãX±|)Ö¯ÿÙ99H>yëãã®’vç®D|0 Aþˆ‰]§\»‘ #u >Þžˆ[¯²™¹¾Ý“PoùÑ«cáíí‰ì¬K˜4i¢²5S 3µàö;8~ìP6hªghX8–,ŽB^΄¿È¨ÅÊuM™ÞpðàA´Ê¾‘.Nnð‡ˆˆA-µÃ‡¡ººçÎ]ÐyÛйÁ011‡‡nÞº…éÓ¦ÂØØc<ÜQUU¥šöƒ`ÂÑq(RO‰•ËSROÁªgO¸»FJJªÊvc<Ü`ffZoùâ´tøŽõ†P(„»Û(¤žJkrÌ žƒ:Ôiƒ¦z:ŠÔT123ÏÃÅE„”“Çš\ßÿGŽÁâÅ‹[e¿˜ÚàÑó€sj‰Ú‘¨Èö÷|»7A§í:w~À£+¾`bb¢6m×®]úúú(--S.—H¤èmÓ_ù¹&¯¦¦¦jó,--S–idd¤œ~Ðææfõ.×Tϵq«òÁ<ΆP(DbÂvôíÛøir¹óæÍ×_~ ƒVÙ'øò""µDíN÷îÝ1|¸#öìMR›¦¾GKéòšT©´QYY år333dfˆ!ê~Ú077ǃбcGTTTÀÜܼÅúHS=;wîŒÄ„í¨¬¬Ä÷?Bàì`df4îªñO?ý„%K–`É’%­~“qúQ»<'»wïUýëT(ĉ“ɨ¨xˆ _njRþ_mÚ ¹\Ž3gÎÂÃÃM¹ÜÕE„ü‚B( $%íÇä·ÞÕ:O‘ȇCUURRÅpqÙbý£©ž^>~8zô_ …èÔ©¤ÒÆ]1>qâÞ|óMDGG£OŸ>mb¿8“q7oSþœÉ8ǃ…ˆÔQÛellŒ€€*Ëjn–rÂë¯÷hRþÃ1ÚÝ ‰{QëbQ‘ˆŽŽ]¿Áض}V~²\ë<£~ˆC‡ ÿ@8øE-h±þÑTÏUŸ~ŒøÏ¿€Ý@åóqkèòôƒ3fàÇÄ«¯¾ ===åOk1|(zôx4öVVVxoÚ téÊ+ÈDôüÐëáZ=æ½äÿ.‡\VŒíSLµÚ0]œŒYAa¨®®f/R³+ÌÏCÏ^¶œ/HmB[=ßééé©<µA.—ãtÆL›6 ÕÿUà?ÿþE°WWWóx"¢gÊôD L-!»›ƒâÜTΩ%jï4]alKoᢖg``7þûß*Üûõ.;„ˆž+ j‰Ú9®TÛÿû_üúïÛì"zîpN-µ{¼RKDÔŽñaDD j‰ˆtÒÖn´Òvê §¨ƒZ"">é…ˆˆA-Qû&ruçã°ˆˆÚ8Þ(FDDDD j‰ˆˆˆˆÔ1¨%""""µDDDDD j‰ˆˆˆˆÔ5 ŸSKÔXYÛé¼ ß"EDDÏ^©%j'ª««µþiÈýû÷±lù'áä »póðÆ¾‚B¡hÖ¼1ÁxS¶k®<‹ŠŠÛÔ.ÍUŸÖhƒZ"j1Q‹–¢[·nø×±Cȹö#ö'%¢¬¬ë>[ÏÎàã;þ™¬O[kƒZ"ªãã?†X,Ö*í©Sixoꘙ™B  S§N ˜…o“°#H¥Òg²>m­]DD j‰HÅš5kpãÆ ØÙi÷û_ÿÚ›6­2Ý KK\8wZùÙÊÚIû`À ¡˜òÎ4””H”ëÊÊÊ1Ó?¶}aƬ@”—Ët®sy¹ Á!aèÛ<ƌŵì•õ‡…ýP'ô±€'“µ*»¡ùóBµXeý7p:-ëãã®UÙ å ;v& ¨¨á¯·^57ØÕ¾Ñ\½±K IDATÎÙiN‰Óié§áâ"jr?­‰]‘È™gÓ£þ¦¾úê£)ߢ zu,*++³E.P›ƒZ"j5»víÂ;w.\ÀW_}…øx݂ʾ}íš| ŸÇ¯E—.–HH؃ ßÄ÷ßRI77dŒŒŒà7n,ÄiéÊå)©§`Õ³'ÜÝF#%%Uçv¤žJèQ. …ðööÄÑÃß©¬ ôG‡FãᎪª*­Ên(Ï}ûâÈ‘cX²8J§ºŽé„ÔSâGAmÚi¸¸Œlr?¥‰Ó1þ ?èëë#xÎlê£)ßž=ÿöCcÚtŒprD¯ñ !¢çéEÔÎ|óÍ7 ¿¿?~þùg,\¸ºÿEû ‰DŠÿüçW¼òÊ_´®ëpÇaˆDii)²sr1ÔÁ^e}cú©D"AçÎ/x4õC õÿôiSá>Æqq«yÀƒZ"j›RSSñË/¿ ((çÎÞ={tÎÃ~¨N§¥ C#å2;;[Ü¿ÿ Nðdii™ì¾Jàeff†Ì 1„ÂÆŸBÌÍÍ!—ËuÈ5•ÝPžq±Ñ8|ø(Ö~¶q1ÑZ—Ù±cGØÚôÁúÏ7`РÐ××or?YZZ¢¸¸]»v…D"m¶>€í;vÁ~È`lß¾ ‹>Zȃ†ˆž œ~@Ô½öÚk8zô(-Z¤ñʤ:n£]ñÍÖmøå—Û¨ªª‚T*ÅŽ ðóóUI·qóÈår:|înÊå®."äB¡P )i?&¿õ®Îu=ÊçÎ]€B¡ÀñÉãé«ÕvšÊn(O¡P??_äçàúõjËH$*Ëœ°;q/\D#ë¤oL?¹»Æž½û P(°qÓm~²>šò-,ü —~¼ŒۿƹsçñÓÏ?klƒZ"jU ,hÔ¶ááÇ… —0áoo¶ï x}¿ývE~¨’®ÛË/Ã~¨ÎdœÅüy¡ÊåQ‘ˆŽŽ]¿Áض}V~²\ç:D.ŒÀ¶;a×o0>‹ÿ±±Ú]9ÕT¶6y¾ð X1«×Ä©œ]Ep¹©,9Ò UUUõµé§ˆùa¸š•…Qnž0 ¿æ@þ‰úhÊwåª5X¸ X¸ +W®ÑØ."¢g…^ÏÐê1ïE ÿw9ä²blŸbªÕ†éâdÌ ÓêíEDº*ÌÏCÏ^¶(ÌÏcgàÑc˜t9Öôôôš|—»•µ¥¨¨3fâÈáƒì'"¢6`z¢ ¦–ÝÍAqn*çÔµ›¿@õôØ ­D.—#aw"ÜÜF±3ˆˆÚ(µDí¯¶®!Ãѯ_?lúêŸì ""µDÄ@º}ÊÎú‘ýDDÔÆñF1""""bPKDDDDÄ –ˆˆˆˆˆA-1¨%""""bPKDDDDÔºøH/"¢6*]œüÌ·QäêÎ&"µDDϺYAaÏlÛª««ù*l"bPKDô¼¨®®~æÚÄ`–ˆšçÔƒZ"""""µDDDDD j‰¨%YYÛ±ØoO8-³f·Ù¾ÔT§æ¨¯.yœ8™Œ>¶Ö*ûps”_»¬¢¢â6}l=ò[º mòŸéqZ:ƒZ""¢¦ˆ[#æ³#´ŽõñqX÷L”ïã;žƒÚ,ø0qkãÔ5Ö… ann›>½ÙZ¨ªªÂw…Âg¢|©TÊAmlúô†¹¹.^¼Ä –ˆž}YY×0~â›°±ˆN®Øà;å:+k;ìܵ"Wwô±€'¿H ´´ï¾7öC°mûN•¯ÂžüZ¬ögMåiʳ¬¬3ýƒ`ÛwfÌ Dy¹Lm›ÊËe CßþCà1f,®eç¨ü²>#6v1}FJKKUÖM›î{‡HJÚ¯’§¦ò9M¡®? o/­Òjê[uû‹›‡7nß¾¸}ûÜ<¼uÞOàúõðòñÃÔi3!‘Hšõ©í˯6!6î³z×Õì?5ÿjÚG­¬í°uëxùø© &u݇Ÿ,¿¡öª;¶ÕµG×¾×T~Í4‰Þ6ý1Îo".^úQ«ýHS¿Ôׇšú_›ñÖ%OMç+M}¡í1äí9Çþu‚A-=ûD.Âû³qõòyÌ›Š•«V«¬¿}çŽ;„õñq W.[¿q¾È8Š‚‚Âf)OSž1±k¹0ÙY—àã퉸uê¿R[¿qcqõòyÌŸŠÈ¨ÅÊuÑ«cáíí‰ì¬K˜4i"¢WÇ>Þ.vD"gdžMCvN®ÖåÜÊåŽô„ËW®bÐÀZ¥ÕÔ·êöÑHœ>“8“q.¢‘:ï'°sW"¾?˜„ ÄÄ®kÖc¤ÆŽ (**FDøßëÍ¿fÿ©ùWÓ> fæføvOBýû~#öá'Ëo¨½ y2?]û^Sù¡aáX²8 y9Wü¾Ê±­iì5õË“êÿ†Æ[×<5¯´ Mm8p._¹Ê –ˆž}Ç‚—§ 1a¼ÊÊÊUÖÏ žƒ:`Œ‡;ªªª”ËSO¥Áw¬7 17dN³”§)Ï”ÔS°êÙîn£‘’’ª¶ŒÔSi5ÊB¡ÞÞž8zøñÕ qZ:|ÇzC(ÂÝmRO¥)×¥‰Ó1þ ?èëë#xÎìF—OÀíÛ·ñ׿v×*­¦¾U·¿¸ºˆpæÌY@FÆYˆDΧЂahhGÇ¡H=%nÖcöí?ˆ#GŽaÉâ(­ûNÓ> c<Ü`ffZï¶Í±7ÔÞæ¢®ï5•ï8l(RSÅÈÌ<RNÓª}šúE×þ×4ÞÉSÓùJÛ±ÐÔöW_ý+îܹÓnÎ|£5šD"AÂyó&ró®×YonnVïvÅÅÅ066tébÙ,åiÊS"‘¢·Måg@ ¶Œ’’Ö»®´´ &&&###•¯K$tîüb“Ë'àþýʱlxŸPß·êö—að0jär9®\ÉB\ìêFS×®]úúú(--kÖcNŸÎ€D"Åþó+^yå/Zõ‡¦}LMMÕïûͰ7ÔÞæ¢®ï5•¿6n5B>˜‡ÀÙÁ …HLØŽ¾}ílŸ¦~ѵÿ5wcòÔt¾Òv,4µÝØØ÷ï?h7ç^©%¢F œƒ‡+0qÂxlÞ¸Aëí:w~Q9o«¤¤Dmº'oÑTž¦<ÍÌÌp#/ ·rQp+7¯_S[¦¹¹9är¹Úu<:ÁWTTÀüÿÛ»ó¸¨êýão˜A b¹†•¿Û¢i¦â.š¹ ˆ¨‘y[o‹¦¢†).˜ÚÍ2E ½u³Õ —l3·TDÔ-5qW´nj7KeÕ@œa~˜£ Ã₼žù~Ï÷|Ïç|ÏáÙï9ãéi-óööÖÉ“'­¿$Ê»~H®®®úóÏ?íªk+¶%gggù4n¬‰“¦¨Á}÷ÊÅÅ¥\û)#ã|rqöìYÝrË-•zŒHR|\¬†D Ò´7gؽŒ­1ZšÊÃönoEo+)ö¶Ï5µ0qŽvlߢqcc>(®í³—ÊŒyÚ´u¾²w_ØÚöÜÜ\¹ºº’Ô¸ñ¥:¬Ðn!òõm­¹óí^.(°‹>ùô3={Vÿyç½BeF£QkÖ&)77Ooÿç]»×g«Í?¥:,³Ù¬%K>Õ£?Ubߺtö׿ÍßËl6kõš$u éi-óóë¨å+VÉd2i]rŠüý;]\P-Zü‰Ìf³f½û~¹×óyþòË»êÚŠ­­ñà§ù‰ ­ói˳ŸÞy÷=åççë믿Upp`¥#Ž…°°žJK;¤}ûöÛµŒ­1ZêqY cØÖöÚ:¶/e0J¼ñ®´ØÛZ·îaZ¹ò+FyyyYãÒ¶ÏV\*3þåiÓÖùÊÞ±gkÛùåˆî¾û.’Z7Žú |ŠüHÒ”Ø74,z”ƒCU·N»Û‹¥uÉ)êØM­[·”£ãÅSÑ…(:úuVݺ…Û´µ>[mŽŽ®ØØ©òiÚJ³çÌ×Ä ãKì[̨áš=wž|š¶Ò› 3{±Q#´lù 5kÑFŸ}þ…ÆŒi->,J;RSÕ90DÍ›7+Ô¦­õóôƒ¢|[·*tgº­1h+¶¶ÆKÀ_‰ß%ImYƉ$=ЮºuSâÂE>¬ø/(ï1bý%í訑ÇiòûžkkŒ–¦¼cØÞíµul_þGG¿ÀrÅÞÖú'½ñšf¾¥F>-¬ÏÖµgûlÅ¥2ã_ž6m¯ì{¶¶ý‡­ÛÔÆ·u•9w8Ô ‰´t}f¸ÒþÈW~ÎIÍyÒÝ®7¦$©ßÀ(Y,ÎÀ¨t‡ÓöªÞ½u8m/Á¸Áeff*(¸»¶þðíuÝæµp#ŸgmãÛ¶ÿ¨)SâµxÑ|àzü‰§õòè‘¥&ó×JŸ…9ªáî­œc»urO2Wj\}­Û<  7)//Oï¾÷¡|Û´¾.ÛÄ5­ZêÏ?ÿÔÞ+x£Ûöîݧ¼³g¯Û„¶8$µ®ºñ¯ŽÓØq¯ª•ïÚµk·^}eìuÙ&®ÇU¹¯èn$ñÓ4|ØKUªÏ<Ò ÀU׳GwõìÑýºo׎Ÿ_Gëóc\}¼ÿN•ë3WjPåq¥®sÜ0 $µP¥ñ„ ©€*Í/ ˆ«´`'æÔ€¤ ©Hj@R Ô$µI-Hj’Z€¤ ©I-@R Ô$µ ©Hj’Z œŒ„ÕMý>žèà‚I-Pµ\©$vË–”0ó--˜?› @R TMO=Ó— p•1§¸ŒÙl֤ةòmÓ^­|ÛiRìT™Ífkyý>ªßÀG_ó­:úuQ»ö~Z³6ÉZvi=@R \ïÌzO|8[ÑÑ/)zh”>øp¶Þ™õ^‘z»wïÑôø):yò”Þ˜8YRá) ÌÑ€¤¸â.\q½ðsÁ’O>—$…††¨GPIÒÇK>-²ü?ª–-[H’~ûí8àbN-ª­’®¤þþûï’$OY,IÒñã¿©çååeýAAàâJ-p™Ûn½U’”£ììlIRíÚµ $µ@Õñàƒ=$I+W}¥+VI’ž|â1»—www—$>}š`@R \‘/F¨oŸgÿ¦¦½9CƒöWø€çì^~ü«ãäêê¢Á/L®æÔ¢Ú)í©NNN;&FcÇÄØµüå¯Ãì¡°¿®ö€«ƒ+µ ©Hj’ZÔ$µI-@R ’Z€¤ ©Hj@R Ô$µI-pµœ>}Z¯ŽŸ öÔȧ…ƒCõÖÛïÈl6Ûµ|ý>îÉ'ËT^딤5k“Ô°qsE ‰ºb}¿lÅ£¼±ºR1¿Q]‰øTæØbÿ$µÀ oô˜WT»vm}µj™vïܦO—,TVV¶¦¿9ãªõ¡{Ï^*/¯È¨hÍHˆ×Œ„ø+Ö÷kíÐÁ=7ävU쀤@¬_¿AÏ<ý¤<<Üe0äåå¥ðýôñ’Ï®Z222*T^^&“I]ƒƒd4¯Xß«ªu»ØHjÔwÞ¡wßû ÐtƒZµ¼õýæMÖ×YYÙz®ÿ@5nÒR}û…+;;§Ø¶lÕËÎÎQÄ(5iÖZÁ]{hç®Ý’.~,ZÒÇ£%•/[¾R¾m;¨aãæZ³6©Ì}½¼ÝŒŒ õé;@|Z¨OßÊÌÌ,TwÞüò *´¾Òú^\Ù¥¯/L¸¯Q3=Ö[?lÝf×vdddèÙ>ýåÛ¦½–,ùÔæþ½t}%mÇÕŠ¹­q`Ï>HL\¨6÷wT›û;jõš$mÚôÚw(ÒŸ²ÔMMÝ©^½S#Ÿjß!@Ÿ~ö…]ñ*Ë>°Ÿ²Œ­ú |ôÑGsÕ­{˜$©KP7;vL’ôË/GÒ­§Í~ìÛ·_ݺ‡éégŸSzzº]qï?`°¾ùö;IRʆ8xH‰cI-pMMýÕ¾C;Õ©s7'Mà*1  ::ªU«jÕª…ž‚•$OOJû´øÉòâP…ŠÑhÔÂÄ9jÒħôX¦§«fÍ¿I:?U¤,*²•s[ã ´}pa›/´¡nqì­›žž®Ä‹uàÀíÙ»Ïîx•e”Ÿ²ìwwwëÿhw¿¢‡Ç(33S»vïQÛ6¾6—½õÖZ’$'''effÙ÷>Ï>­ ®Ý?™“%@R \¿|ÛvЦ ëäêêb}Ïǧ±NŸ>c}íáá¡ï¾I)õ†*[õ<==•ŸŸ¯5j\Ñí±·¯ÅõïÌ™3ºù曕››+Ï¸Š¸üÆŸš5kjaâ={VK¿\¦ðAúî› ¥n‡···Nž<©[o½Uéé×þf¢²ÄÜÖ8(m888ØÝ'{ë^þT±m٪ץ³¿6oþ^f³Y«×$©kÈÅö C¡W.WZ¹½}°Åϯ£–¯X%“ɤuÉ)¥~”koߌF£Ö¬MRnnžÞþÏ»…ʺuÓÊ•_Éh4ÊËËK™vmGPP-Zü‰Ìf³f½ûþW*æ¶ÆAy÷AE¤:¬Ðn!òõm­¹óí^®,û ¼cÒž}бc-X¸Xþ~¥ÇêwßS~~¾¾þú[Ú÷ÇÒÖmÛ5wÎÚ¼y‹~úùgNšI-p}ŠŽ~Iß¿Uÿã15nÒR¡=Òñã¿ëå˜Ö:£c†+6vª|š¶Òì9ó5qÂøbÛ²U/fÔpÍž;O>M[éÍ„™Š‹‹½øK?ÀOýKN J)··6—5BË–¯P³môÙç_hÌè‘ö%t¥ôíÂÍ?ý:«nÝ:…Ê&½ñšf¾¥F>-¬Ï̵g;†‹ÒŽÔTu QóæÍ®È¸¸R1·5Ê»*bJì=JÁ¡ª[§ŽÝË•e”wLÚ³:uê “ÉdWRû@»vêÔM‰ iø°(»â>qÒ­5jhÔÈáš8qеŒ§W–CHK×g†+í|åçœÔœ'ÝíZpcJ’ú Œ’Åb!Ѝt‡ÓöªÞ½u8m/ÁPiNœ8©¾Ï…kÅòÏ PÅõY˜£îÞÊ9¶['÷$3§pý°u5³¢ÄÊÏÏWâ‚… ìL I-àºq%ŸåÚºÍjÚ´©Þ}çß © jÚ•º 70nI-@R Ô€¤ ©Hj’ZÔ$µÀµÄ×äePïÞÆ€¿888èÐÁ=$µ@Ut8m/AT{S’®«þ0ýUI-Hj’Z\1S’®»ù¯$µ(³çÂ#IjÕGX¯G´ôËåÅ–-]ºLa½!HÀ äÌ™3Š£¦Í}ÕæþŽ=æ8q’¤PµíÝ»O³gÏUvvN¡÷³²²õî{jïÞ} ¸$ÌxK/E¾ Û·hÓ†$Ý}×]záÅ—HjU_``-ýrY¡÷–~¹LAA]pƒYúå2Ýyç2 rqqÑÓO=¡}ûÔª¾=ºéã?)ôÞǢݻz/##C}úP#ŸêÓw€233­eõøhÞüò RÃÆÍµfm’]Ë­Y›¤†›ë¾FÍô`Xoý°u[¡6—|ò™š·l«'ÿù¬NJ·–¥¦îT¯Þ©‘O µï O?ûÂZ–£ˆ!QjÒ¬µ‚»öÐÎ]»­eYYÙz®ÿ@5nÒR}û…¹B Üèþü3W¹¹¹Ö×fsΞ=KR ¨úêÖ©#98X“¿Ô»d2›Õ Á½…êÅNŽShhˆv¥nÕ#ôVìä¸BåGŽÕêUË4#!^‘QÑv-­qcGkïî5$b°bF-Ôæöí?jËwÕ³gwÅÅO·¾?2fŒ ׎í[4th¤&Nšl-›25^aöÐŽí[4lhd¡6§ÆMS̨áÚ•ºUÝCC?=€j¥sgÍO\¨ÜܪµC‡©yóf$µ€G¡Z›´N=z„[îç×QËW¬’ÉdÒºäùûw²«][Ëu릕+¿’Ñh”——W¡«±’4ë½÷•ŸŸ¯eËW(8(Ðú~Ú¡Ã í"_ßÖš;/±Ð2]:ûkóæïe6›µzM’º†ô´–øû)íÐa™Íf-Yò©}ü)v<ª• ®Ýõég_(??_‡ÖâÅŸ¨Ï³O“ÔnÝC»ÉÁÁAÝC»[>zÔ-[¾BÍZ´ÑgŸ¡1£GÚÕ®­å&½ñšf¾¥F>-­ ñ…–­}ûíòmÛA_ó­† ½ø ISbßаèQ =£Û%bF ×ì¹óäÓ´•ÞL˜©¸¸Ø‹}‰®ØØ©òiÚJ³çÌ×Ä ãÙñ¨Vâã&kÎÜùjÚÜWáƒ"ôøãÈ·u«*¹-uB"-]Ÿ®´?ò•ŸsRsžt·kÁ)Iê70J‹…Jw8m¯êÝÛX‡Óö^WýºûTõøèÐÁ=(£)Iz.<²Ò]ȯÕqÙgaŽj¸{+çØnܓ̕ZT}$µ7°çÂ#«ÅvòH/@•ÀÔ |ªË´9®Ô€¤¸Ö˜~”ÑÆ”$‚I-Pu988HjªU¸>1§$µI-@R ’Z€¤ ©Hj@R Ô$µI-Hj’Z€¤ ©I-@R Ôåd$¨nê7ð)öýC÷*¿ðúJ­ÿJµ½Ä÷FÝ>I-p]!éªdŸ' IDAT[¶ü „™oiÁüÙ@R  jz꙾ü±¸æ˜S ”Âl6kRìTù¶i¯V¾í4)vªÌf³Ýåœ8¡ÇŸxZ~AZºtY©ë«ßÀGõøhÅÊUòmÓ^>þ”NJ/R>0Bÿxä IRNNŽ"_ŠVÓæ¾jÝæ½öúD™L&mÚôê7ðQ¿ƒ ­£ß€AªßÀG7~]â²—¯ïëo¾UG¿.j×ÞOkÖ&YË.­wi}{ãc«}HjJòά÷ôÁ‡³ý’¢‡FéƒgëYïÙ];UÛ¶ÿ¨‡<¯w¤Ú½Þï¿ßªQ#£õã;4yJ\‘òGé­wg½-Iš7]+W~¥qcc4vLŒæÎKÔ¿ßú:uê úõëiÓ¦oôóÿ+Iúé矵iÓ7ªWïuêÔ¡Äe/·{÷MŸ¢“'O鉓%¾*[ÒÚÒâc«}HjR\¸Bxù•ÅË-ùäsIRhhˆzô•$}¼äS»Ë7núÆZùb„Ýý:4R]»K’R6l*Rþ@»ûuË-5%Ik“ÖI’º)ä¯e–~¹\’Ôï¹ge±X4gÎ|IÒœ¹‰²X,êóìÓrpp°¹ì¥žxüQµlÙB’ôÛoÇíÞŽÒâSÑö˜S‹jÌÞ¹Ÿ¿ÿþ»$ÉÓÃC‹E’tüøïv—gggK’ÜÜÜtÓM7ÙÝ¿KÛËÊÊ*Rîæv±­ôô I’oÛÖ÷þ÷¿ß$I…=¨¸ø}öùR 8@Ÿ}ö…¼<=õp¯‡J]öR^^^Öÿؽ¥Å§¢í@R Øá¶[oÕ±_UvvŽ,–óÉVíÚµí.ÿÛß¼têTz¡r{œ:•.'''k—3 Öÿ{xx(##C;¶oÑÍ7ß\¨ž³³³žúçãšùïÿèŨaÊÍÍÕ³ÏüS®®.¥.{5â@e`úPŠì!IZ¹ê+­X±J’ôäÙ]îï×I’´zͽ3ë}»×ûÖÛï(i]²$©s€¿Íºþþç×±ôËåúñǪßÀG†õ¶–?ýÔ?U£F íØ‘*ƒÁ gž~ÊîeKãîî.I:}út¹â@eàJ-PŠÈ#”››«øø7e‘EƒöWø€çì.9"Z?ÿ÷M™2M£G´{½ Ü«×'LR›6¾9b˜Íº¯¾2FNNNš6=A¹¹yz Ýý?~œµü–[jê¡°žZòÉgêÒU·ß~›ÝË–fü«ã4fì+ñ¢æÏý¨Ìñ 28Ô ‰´t}f¸ÒþÈW~ÎIÍyÒÝ®7¦$©ßÀ(ë9 2NÛ«z÷6Öá´½ÕnÛùF.J×gaŽj¸{+çØnÜ“ÌôT}$µ¨ò˜S \g˜v@Ùq¥$µI-@R ’Z Šãé\cS’Âeü‚Hj¨jú Œ"±X,Õò%AR À “ÌݨìÚ>HjÀõ‹«¯¸’¸Q UWjr¨ßÀ§ÌËðõ·pQNNŽ¢†WÂô8¹»»TWjr²X,vÿØ“$_úÓ°qs­Y{õï†>qâd¥$úåIúËÛÇ+¹.\Ý?+kü]oʳ]»víR`` ÜÜÜtóÍ7ë±ÇSFF†$)##C={öÔÍ7ß,///=öØc:~üx•f³YC¢´qã׊%³Ù\%Î?$µŠqèàëÏŒ„xEuÕÛî={]÷qª }û¶¢Ûõ裪ÿþúý÷ßuüøqÝyç8p $iúôéªW¯ž~ÿýw=zTuëÖÕ¿ÿýï*“×^Ÿ¨ï6o‘$}·y‹^{}b¹by­?ã¸ë Ó€+uÒ~í5ùùù)  ÌËv R|ÜdEFEkÿÞÔ«Öç W‚®gU¡`ßVt»öïß_èõ+¯¼¢ÚµkK’’““õöÛoËÍÍM’4xð`…‡‡W©˜ŒuœÆ¿:Ž1‚JÅ•Zà ˜2eŠöïß/Ÿò4Õ58H&“©ÐɼOßjäÓB}úPfff‰ËÖoà£yóÈ/ ¨ÈT†’Ú¹ð1š­ÓRSwªWïÇÔȧ…ÚwЧŸ}a×/¡âÖ×%¨›~ýõç8¨ú |ôã;$I¿ürD]‚º»]ÅõqÙò•òmۡȶfeeë¹þÕ¸IKõí®ììœû¹fm’6n®û5Óƒa½õÃÖmvmwý>JL\¨6÷wT›û;jõš$mÚôÚw¨P²³s1$JMšµVp×Ú¹k·]c¡,ý)KÝÒb`k¼=Û§¿|Û´×’%ŸÚ³—ïÛ²ŒyIÚ·o¿ºuÓÓÏ>§ôôôJ¶Ú))öWö8w¼¼$ITݺu­e·Ýv›vîÜyßW‹‹ååÿ¯ŒcÑÖ(©O¥9—Öoà£>š«nÝÃ*ýœJR À¦·ß~[?ÿü³,X ZµjUZ»±“ã¢]©[õÈ#½;9Îfý#Gjõªeš‘¯È¨èRÛ¹ð1š­ÓFÆŒÑàAáÚ±}‹†ÔÄI“ËÝïN;èëo¾•$}óÍ·ruu±~¹aã&ùuêX¤­’ú¸ÿ~mÚ°®È¶N›¦˜Qõ+u«º‡†(~zB‰ýŒŒŠÖ¸±£µw÷1X1£ÇÚ½ÝVJòj½>þ͘ñ–víÞ­¤µ++ÔŸ)Sãö`íØ¾EÆFêOicÁÞþ”¥ni1(i¼M‰›.?¿ŽúîÛ Úµ»ä±Uܾ-똟7¡–~¾Dô×Ô¸é•>Jk§¸Øs\ÙãóÏ?×€$I™™™Ö«´’äââR(‰¿žmLI*õ§,cär•q,Ú¥)é8¨è¹ÔÃÓC/J¬ôs*I-€BæÏŸ¯£GJ’¾ÿþ{½óÎ;JHH¨ôõ¤lبž=Be4ØYÉë7جÿBÄóruu-rÅ·¬í\jõªeê,ggg=Ü+LYYÙåîw§Ž´éëoΟ€¿ýN}ž}Zß~·ùü/¾_—éÞ_®®.E¶u]òzÕ¯WOƒAA]´n]r‰m´»¿­’“SôÝw[äïï§ukWٽݑ/DÈÍÍMÁÁ:pð ú<û´nºé¦ õ'yýuîì/£Ñ¨ÐЭ\þ…ÝûÐÞþ”¥ni1(i¼mHÙ¨^…ÉÉÉIϺ¢c>òÅ9;;«]»¶J^ŸRéã ´vJŠAEýñÇZ±b…ÆŽ=Ÿ\Y,9:^üõíàà ƒÁP%ΗυG–úS•q,Ú¥±w ”õ\Ú58PîWíœZU1§¨ ?üPC† QÿþýõóÏ?kÔ¨QªQ£F¥¯'33ËzuÆÅÅ¥Ôb===*¥K¥§§+qÁb8p@{öî«P¿xà~÷/åååiçÎÝš?U]º*;;GÛüQ3gL³»_^žž%ô7C÷5jf}mëÿ´øÉòâP…ŠÑhÔÂÄ9jÒÄÇ®í®Yóo…Ú¿ô*ZyûsêÔ)9;;—kÚÛŸ²õÝv Jo§ÒÓ­ë¨UËûŠŽù[o=ÿɈ“““23³®À8°ÝNI1¨ˆüü| :TÿùϬ畿ýíoÊËË“‹‹‹µÎ…© ×»+ýå •q,Ú¥±w ”õ\zé#Ï®Æ9µªâJ-PAÉÉÉÚ¹s§öìÙ£ääd=òÈ#•ÒîšµI2—œ,=uæÌIRnn®¿Nô}ûv’¤ö´Óœ¹ól~LVZ/àï§´C‡e6›µdɧzôñ§J¬Û­{˜V®üJF£Q^^^Ö©¼Û]Ñþtéì¯Í›¿—ÙlÖê5IêÒ³ÒÇBY”7AA]´hñ'2›Íšõîû6ë^¾o˺ï¼ûžòóóõõ×ß*88°ÒÇAYÚ)žÖ¬Ñc=¦ØØØ" kPPfÍš¥3gÎ(//Oü±:wî\¥Î™ÿzõõBÏæþ׫¯_±X–õX´5®õñt%Ω$µŠ=ÙŽ9²ÜË_z‚ŒŠV|Üdu ²–5BË–¯P³môÙç_hÌèò­ËV;~êèXâ²SbßаèQ UÝ:u*¼¾N;(3+KíÛ?`=çææ©“pi},´î˜áŠ*Ÿ¦­4{Î|Mœ0¾Äº“ÞxM 3ßR#ŸŠŒŠ.ôEy¶»¢ý‰5\³çΓOÓVz3a¦ââb+},”Eyc0|X”v¤¦ªs`ˆš7of;Ѹlß–u;h×N]‚º)qá" Uéã ,í”wÌ^зo_mÛ¶MwÝu—¬?’®o¿ýVÞÞÞòööÖªU«U¥Î—¯Œ{Y´»ÿ¯ýv¿^÷ò‹eYE[càZOWâœz#q¨iéúÌp¥ý‘¯üœ“šó¤}_U·1%IýFÙõmI@YNÛ«z÷6¾âó¯*’€–eì;88ðnÕúwêåçÁ’¾&÷Âùõz=ÿãúÑgaŽj¸{+çØnÜ“Ìb@ENи1Øz†(ŒW†»»»>|V¹SŽM\ޤ(N¦ìO§¸¾0§UWjÀUaëÃ’Zn7òÍQöN`šHj¨Âxš@R @•æÄ#¬€ âF1Ô$µI-Hj€*ާ@ xP<®¿€ ‚Ô@åê70Š àª±X,<Ú ©€+—hWÉ,P1Ì©I-@R ÔW×éÓ§õêø jß!@|Z(08To½ýŽÌfs¥¯«~ŸËNœ8iw][eÕQEâáààPáõWF’Z BFyEµk×ÖW«–i÷ÎmútÉBeeekú›3®j?º÷ìewÝC÷°ã$µ.Z¿~ƒžyúIyx¸Ë`0ÈËËKáúéã%Ÿ]Õ~ddd°3 ©ÊçÎ;ïлï}PhºA­ZÞú~ó&ë묬l=× 7i©¾ý•c-«ßÀGóæ/_@6n®5k“ %ªÏöé/ß6íµdɧ%öáÂÇç—Œ¾lùJù¶íP¤ÝKë­Y›¤†›ë¾FÍô`Xoý°u[‰ëÉÎÎQÄ(5iÖZÁ]{hç®Ý…úÚ§ï5òi¡>}(33³ÐúªÍýÕæþŽZ½&I›6}£öŠí›½uSSwªWïÇÔȧ…ÚwЧŸ}Qá¸Vd*ÂÉ“',gggëÔ©Sv•]jâĉzùå—9°€¤¸º¦Nž¨/–.—_@°^{}¢Ö&­Ó¾ý ׉›¦˜Qõ+u«º‡†(~zB¡ò#Gjõªeš‘¯È¨hëûSâ¦Ëϯ£¾ûvƒví.yÊÀ…é—O+Ø¿¿6mXW¤ÝKEFEkÜØÑÚ»ûG ‰¬˜ÑcK\Ï”©ñ {°‡vlߢaC# Õ§ÐÐíJݪGé­ØÉq…–=xè°R’Wëõñ¯hÆŒ·´k÷n%­]Ylßì­;2fŒ ׎í[4th¤&Nš\á¸Vdjƈ#ôè£êôéÓêׯŸFŒaWÙ3gÎÔñãÇ5qâD, ©®®&M|”œ´J3¦©V-o%&.ÒýÓҥˬuÖ%¯Wýzõd0ØEëÖ%jã…ˆçåêꪮÁA2™LÖ÷7¤lT¯‡Âää䤈畹oááýåêêR¤ÝKµ»¿­’“SôÝw[äïï§ukW•Ø^òú êÜÙ_F£Q¡¡!Z¹üâ•Ñ” Õ³G¨ŒF£‚;+yý†ÂÉó rssSpp <¨>Ï>­›nº©Ø¾Ù[wõªeêrþêçý”••}UâZ’•+Wê‰'ž“““´|ùr»Ê$é£>ÒâÅ‹•ÀA•€oÊó× ££Zµj¡V­ZèùÁ•šºS/DÕC=(IJOÏÐ}šYë †BË{zzÛî©ôtÕ¬ù7Iç§4”•—§g©u¦ÅOÖ‡*|P„ŒF£&ÎQ“&ÅêÔ)9;;[–™™%777I’‹‹K¡é’¬ÛqaÛ/Ô-޽uÓÓÓ•¸`±8 ={÷)¿Rq-É©S§äîî.Iºé¦› M1°U&I«W¯Ö‰'täÈÝ}÷ÝTPÑßÍ„(ß¶”››Wè=ŸÆ:}úŒõµ‡‡‡öïMÕ¡ƒ{tèàØ·Ó®¶½½½uòäIkb|%Ô¬YS çhÇö-76Fáƒ"J¬ëéé©üüüËΜ9¿Í¹¹¹ò¼,¡.Ëc«ì­; üyåååª÷ýôÞ¬·ínÿJŵfÍšÊÉ9?_úÌ™3ªY³¦]e’4oÞ<;VcÇŽå ’Zàê ì ?š­_~9"“ɤŒŒ Í—¨°°žÖ:þ~J;tXf³YK–|ªGÊ®¶ƒ‚ºhÑâOd6›5ëÝ÷mÖ5 JOO/sÿ»uÓÊ•_Éh4ÊËËK™%ÖíÒÙ_›7/³Ù¬Õk’Ô5äâ6úùuÔò«d2™´.9Eþþ®xìÓVh·ùú¶ÖÜy‰v/W–¸–)–ݺiÑ¢E:w-[¦ÐÐP»Ê$ÉÉÉIO=õ”öìÙ£;vp`I-puEG¿¤ï¿ßª‡ÿñ˜7i©ÐéøñßõrÌÅFÇ WlìTù4m¥Ùsækâ„ñvµ=|X”v¤¦ªs`ˆš7of³n@€Ÿ:ú–¹ÿ“ÞxM 3ßR#ŸŠŒŠÖŒ„øëÆŒ®Ùsçɧi+½™0Sqq±·qÔ-[¾BÍZ´ÑgŸ¡1£G^ñØO‰}CâG)08TuëÔ±{9[q­ÈÓâââ´páB¹»»kΜ9š6mš]eÖ°££bcc5räH,¨ ‡:!‘–®Ï WÚùÊÏ9©9OºÛµàÆ”$õ%‹ÅBQé§íU½{ëpÚ^‚k†ó8ïׯ> sTÃÝ[9Çvëäždn®&[WùÖ/ʤ¸ŠH\¸2˜S ’ZàZcú”‚w€¤ª4ž|$µP¥ùq•ªæÔ€¤ ©Hj@R Ô$µI-Hj’Z€¤ ©I-@R Ô$µ ©ª,cE8œ¶—( ê&µ‹… ê&µ~A\¥Àu9µ ©Hj’ZTwFB@ÕUïÞÆ¡988èÐÁ=Å–ÕoàC€*YI±&© âiD•ccJR©uxœiåýñPÙHjø#âºúã¡<˜S €*¤$µÀµÆœZª¹³ÿûMG<öæïõ÷!ƒu{ÿçŠÔ)ÈË“ƒ““ v­üá¨æ¯;,³Å"Y,²X$‹ÎßÀÖѧ¶¢zUÏ'bÔPý±`‘~M˜©&ÝBu{t´ÖÍHW`¹Ô¹ÛZ'}åW:<"F.wÞ¡ûæ| ·ÝFà®sEs’éõrsq–Ùâ ST`‘²ÿ4iÒ‡«ªmRËôª)‹É¤ÿN˜¤à#uwóærqsS³®!::1ÖZ'÷ðO:òÚ ‰‰Q“µ÷+ï—#ï*úåÄiœ¿{á‘bžn.úf×QmÜyTëwÕšíÇäæâ¤êüÄ1’Zª)£Q.µoW^F†”“#Kv¶îèÐAùÓtzGª þüSiŸ×ýÿü§\ÜÜtG«VjÕ5D‡†D¼«dóþóÑrt<ÿ\WÉbQE:W å›,:g¶èœÉ¢¼üsr¼Ï%©×½;FÔŽeˤÛn“%?_YYjñ`˜Ž¼>Q?GÔ=-[Éûž{dÉÉ‘åìYÉÙYŽ5jÛVZÚ!õí.Ÿ¦­Ô¾cg}ôÑÜkºmUùÀ,iQÊOZò³òò .þ!¢óWk ,’©@2H¦™ ¤Ì¬œbÛúõ×ÿé…_Ró–mÕ¼e[½5L¿ývÜ®XÍ›¿@3f¾MR ®o5ƒ•ï Ü·O®®*ÈÎÖ­M›ÊÉd–1=S Upü¸d±èÏÓ§µíóÏUïÍø"íüöÛqõé;@üãamßúÌŸ­Ï—~©Ùsæä2ÊË7kÒâJûý¬†=T¸ÐA²H*°œOdóÍRΙ,Kv¶ ||´)>N÷ÄM–ó]wiãý>Ò3ÏüS={t—$Õ©s·Þ˜0^/yE}û™ýí7ƒ‚ôí»ïê–§ž”gÇöŶ±qãך5ëß…ÞkÚÄG_~ñ‰õujêNýkü8pPóòRtôKúGï^’Îüý¯WÆè½÷?ԜЌ„xu >•2;;G1£Çj㦯UûöÛ?YÍš6‘$eeeë¥aõeËjÛÖW3Þœ&÷*¹vþœ®éŸïU¨_+5ºçv¥ývZÍëxê­˜Çdt”ŒÕ0HÎN9åê줛or–ƒƒt*ëO™ÍÖ¹·¬KNQø€~EÖe0´6i]±ImULh%¦Píüù§rý*ãÍ7Ÿîi~¾ ~ûMæýûåÔ¹³vù¥ þ^[ÿ7(¼Ä6~;~\wÞqG‘÷.¹qidÌ ®Û·hèÐHMœ4¹PÝ#Gjõªeš‘¯È¨hëûS¦Æ+ìÁÚ±}‹† TÌè±Ö²©qÓ3j¸v¥nU÷ÐÅOO¨’ûàËÍGôïeôxNú¿Û¼uèçŸx°÷H–ËÒÁcYJû5S‡þ—¥ƒÇ2tðè)íýïq?•£§uà—ß‹}òÁÑ£Çäî^|’¿wïþbÚ¥_.¯r -I-ÕÅ¢Ã/U¦MU«N;&Kf¦ ~ùEŽÞÞÊJOב}ûT7nŠÍf$³Ùl³ÎêUËÔ-$XÎÎÎz¸W˜²²² •¿ñ¼\]]Õ58H&“Éú~òú êÜÙ_F£Q¡¡!Z¹ü kÙºäõª_¯ž ƒ‚»hݺä*· ¦}¾G){3õdXg““þ{"WIŽŽrpt”ä ‹T`9c˜¹À"SEf³Eÿò£ÁQgÏ™äZÃPä ‡bžˆ`6›•——W$¡=yò”|7Ò‚…‹«\™~@5v4þM¹ææªaï¨`Û6)?_rr’e1™t“§§,þ)sf¦ ®·—ØÎßÿþwýúëÿT¯Þ=Ö÷òóóµfm’užmzzº,Ö´gï¾"mxzzÛö©S§äìì\lYzz†îkÔÌúÚP¿ñ윹@²H’Ι-Ê7Èhv”%߬¬3&9È"££E®Nrqr‹“£õÿ–‹ä(¹8;éø©ÝQëæBmßyç:}úL‘)999ºë²¹Ñ?ýô³þõÊ™L&=×o ÞwŸZµjQeâÈ•Zª©S+VêÌê5òýçS*ضM³Y†vítî¾ûä"Kzº j¬£±¶¯Ôvhÿ€Ö¬M*ôÞ¦Mßèýf[_^yy¹êýp/½7ËþÇDyzz*??¿Ø2íß›ªC÷èÐÁ=:°og•Û£iªö÷yjÑ—ëå$“îºå&Î5ëØ©¥Ö\P '££<Ý\µ`͵o|k¡¶ƒƒuøðá"ë<üÓÏ ì\è½Wƽ,I2š>mª^Ÿ0Qœ8AR ®_göÐÑ ±ê0 \ÚµKæß~“±eK\»V+_yE9992Ô¯/ó¶mªÛ±£ÎlûQ§wï)±½>Ï>­>œ£å+V*//O;wíÖë&ià%7)¥:¬Ðn!òõm­¹óíîk—ÎþÚ¼ù{™Íf­^“¤®!=­eþ~J;tXf³YK–|ªGªJîG:Þ­ÁÝïÕ§«6êø‰Sjx‡» Ž l~»ü›Þ¦oÓý oUë{oUóz·ªqZª§·þÌ3içáãš4oƒj,êÖºð¼æðÏiÑâ%Ú·ÿ€òóó•ŸŸ¯}ûhÁ‚EEn »tš‚·÷-zõ_c5tØ;w®JÄéTC¿MŸ¡–Ý»ËùìYKK“S` ~Û³G?ïÛ«{&Œ×ŽÄEòîh}g‚IDAT8P柖~úI-zöÔîW_WãOÛÞ]wÝ©·f¾©‰±S4|ÄhÕªå­çT÷îݬu¦Ä¾¡aÑ£”‘™©ˆÁíîk̨á6|”¢ºuë(.îâ×øŽŽ®¡ÃFjË÷?¨Þ=÷èÍéS«ì>i]ß[oôm­ vèTƒ{Ô¡å½*°H#¦}Rl}éo7;ëöšnêÙöµ½¯V‘:îîîúR¤&¼1I7}#Iòóë¨Ñ£FÈËËËfš7o¦^…iükohÂë¯^÷ñs¨iéúÌp¥ý‘¯üœ“šó¤;G:UD½{ëpÚÞ2/÷GâBe-X¤ŽƒŸ—áÏ?•“™©M³?R£OËùÿjkwXoµê¨š’Ìûö©F¯^Úðö[òö’¼ºܱܘ’¤~£tè`ñW¤ë7ð‘Åb)W¼Ëâϳ&MY²[£‹ôÕ„YKõÉØÀ.Î’JŒµ=ú,ÌQ woåÛ­“{’¹R @utëSOÊ”­o½¥æ~~Ú²|¹îzsš,·ÔTnÞYÝ>z¤vŒ}UA#FÈ’“#™ÍºížzÊܹ«HRkÏ×ÑV$y©nnr6ê•§škÞºCúà³I’Éd’Åb)ô4GGÇbŸlP–ýr#í’Zª³Ù¬sçÎÉóÙ§•o0êû%ŸÈãÅ™êÞ­Ì̬ó•î¹Gÿ?ùúkÝÖ´©~\²D'þ÷?Ý3ü%™ÍæBO a­2™L2›Í2™Lz¨Í­ºÍÝQs’s”ž‘a­çèà(GG9 28:Êh4Ê`0Èh4ÊÑѱÚî’Zª“ɤsçL2™ÎÉd2馇ÃäÔ#T&“I99§e2›TP`‘££ƒj WêðQ²|õ•¼ú÷Õ=*9×P~þ9Õ¨Q5Ÿu=ÿ¡‘Ÿκ_ΙL23©qíÒõÿ”•™¥Ke0d4e4et2ÊÉxþÿfsjÔpª¶û…¤€jÄÑñ¯«|=ØßàhÅX`-3˜ ²È"9Èp÷]rûtÑùäÉè$G£AƒANNFÚJæààPh¿œ¿ë(Gƒ£îªu“Ìfëôƒ£Aކ¿Êþªïè(ã_û§º"© š%µÎÎΪQ£†,‹ d6›­ÿšÍ²È"ƒ££ ÃùD÷¯Ï'^< ôJï—‚‚Y,–¿öÇ_?’Å"GGƒ G뿃ýBR @õuá†#Ç¿ædâúÙ/®¶²_Êø‡!I-pq]  6¦$’Z@’UuÙú²Ô’,€¤€êŠoó"Ö8Å@R Ô$µ ©Hj’Z€¤$µI-@R Ô€¤ ©®ã¥/j¸{«Ï“D×µîÞ%'µÅU®wÖ¤6çØn¢€*É¡i‡G•ssm ¡@UÔ®î-ÿCŸ+!ÆOIEND®B`‚kildclient-2.11.1/doc/C/images/we_trigger_highlight.png0000644000175000017500000004541211405233117017731 00000000000000‰PNG  IHDRŒbjxï pHYsÚk¥óÎtIMEÖ  '~‡- IDATxÚíwXSÉ×Çç¦"®€‚RTp¥ H‘¥XÑEŠŠ…¢ ¾ë*ºö²ö®°¶µ­Å""®Ö‚ˆ"**b¡ êª(Ej¤¼\×I¡å|ž›ÉÌ™–û½s&“LwXÈÐ)ó€\‚ù²¬ù„‚jà°¡!‘ ]¨­xÏ­)—QUT4äÓŽHÕ×A7À7J»’[SnlÔ_¶äÙOžÖ"De*Ë›/D ! z¾Q¸5ŒdNnld”ýä)•©"ov¾)L’Hñ85‰L¢2š¼#àqjÈt%ø”À×Ã$ßÂÒZ7;Â"…I´˜ù×U}[}e_ŠwyîÙ œoLgœ€ |]‘ÂZ- †ÉiÝ=¿¡ºLÀç Çù˜w+7~=·¶ÜÀc9¸Šð•5 a­¼ q òfGZwßÀAQTð8¼ºê—ÿî}›q†ÂPìç»EÕÐ>"îÞ×t÷xuU!†ª&à¿»îÕ•¿ë«K»è 2ðXFSù¡¥YSɘ—U÷¡?ª÷êÊ@|`Ÿ½÷þüƒø»gæ˜vcÑæv÷E¥¼} Hò´ì>ÒD½—:“LŠ+8Wž”E¤¾©kàã,z+sy‚‡/«$Û‰ 1ùA….ŸuÀÝkj'búq‰üö?n©FIDŠq÷Ä×SU‚â”ÿw÷Dö‡BKÝÀkUwÓ‚–çèÒöI}ì©„*©¨U S44{÷× ‡&Ѫ_g7Ô*S»ÈÕÇ è'í)v=BoK«ù|¾v7e?{;Ý(s£ 0yáHÝ1æÝÖÆfß««¢}u*z$+¯u:µ»‡µØM{õàßž¦®-²1}€ßþìÿ]K¶ó¥H!’¸rÔ•½A½¹} !„‘)¦¿£²º d»Ï´ì©TVÅžõçÙ¹o)4úôÑ3ÆZ{X÷:sãY~]W¢bn½€0In>ÈËJ!4o×ù‹é9$ ÍÅBoû¬áÖ}5t©é…ÜúÝBueÿñص aäfmÊ[Îîî!’8;?ýº£iàÕ½³EŒoÄÛñûûID°®MÄõgã"íHéî±KŠHš–ýdz­¼øµï2âz¹üB Î[$hÀ¨êˆ¬‚x•ˆ,yø€È$lŒ¹:BhÇ©› >(jö§0ß«£2³sò‹òó_6¨|*CO.ÓÆ´ÐëZÁæJ•þi¥£ÎqÓ6ÖRdÒȵܛ¹w\~{[q!?vcQÿ8]àc¥Ñ_S¡ªŽw÷CÄÍwxB•4ÓUÛÙH•„¡«O?¾¯¬ŸêØ#æÎûI¯B 4ò¯ÎšCú©*1ȯJë¢Òß_xTÚT¤0„!„L z<(&±IJéïù Âïp«Þ¿}ûnï<#-E„Ðúà¡Áï«_äÚv!ì“IØÙÙ?ª(PæœÈ½Wø…3¨H'Ïpí)9køºîN/ó¡âÒIoÇÿÀÓ£AýBJ„ñ/-Ow}ùWóî¹JK·™=¬Æª~}ãhí׸%±ˆLŽù J£õo%XÀÿtº1hd„PÆÓW U- C‘Lc’”§~HÎ.ã0{È„¡eþ?qêÒ²_wcQsÕ2Re# £RH¡ôõQ~”_Ÿ’ ¸î¦ê¾&4€Ohð’QÚò?Dþ›­ªH rÒصÏzåØÞ?›«744\ºý¼_74ÙV!TWþ_mq>†a[&èyXt{WV•˜ö¬ -­3ª?­Qá›ñ!ä7Üüòšá‡¦›…¸÷¯ä3¯ç³«¨Ý3òÊ?VsBYùï®Ý{}ñ6BÈÉP±î}Â0ËÞÊ* ”7%•Éj? ?*¶ú6›5üÁ_³"¡Öýaˆ$Þ!͇K´CBˆäày£Z/óáâÊCü5³¡êUöVža„ Ʈ̉ú‚=Á–U !Db" !>¿YWV™Aù4åÄ®§(+“¨ D¢ „( ]ad F¡áF".Þ‹L¥0Y‡æ´ìÛ£oWÁƒ—%Œ®Ý÷]ùO¡îÍÑówÈ Öëòú³^]iìâÇÌ pË{ân½ð€ÊR3ÒífÕ÷=U~Fá=Ýžö*ò_ýâ]¥¢jרeî=5”q‡Ë´'ä§ÒëUSVÀ(Œ³·‹Ž,>Ù¾çé›×]{ —ÿÀµ·ïÞù:õÕî¦Ò_K©¿–’¯µÆ¿Y«âòÃo¾¤Çê¢Dú÷ѹôBª‚rIe]·.Š&š”§Ž‹±*BèLJ6F¡‘ÈT …^W“^Re 0’BHÒHJÚðæìùÅPØa 8˜#©<Ò¸{œò× 5eÊ=àè*ÝûzOCõ/Þf\Ñv²ÄÈT„…i(àÕ4ë×ÖúLY‘QJ"cd n“LÂ0EUá˜wŸýGWéÎèª]Æ!!„èT2·¶¼ŽÕõfîGëîäUÿ7æÇ>Ý {(!„¨d¯¾ñ>í3“󪄮¦IWéþñ yµõºé#„Þ–V¼)cõ@¢Ò3^Tâ"…êßC !¤Ýu÷ÐL¢Ú*¨ú K…&ìòÅ=ª¼þ6 Yh8™÷bÚÛåÇîw²‹.Ј˜tånTV×óJüµ‡[ë?½ôŸ£¡Š@€âSžÐ”Ô1ì³›Ý_»‹´Y@ûÏIa’—H.ÑΑiÄ ŸÒ:ò‹aÀ¡ÜfeWÒ·{_ÜC)i0Aµ¡’ì”ÊÿŠ&…ašaˆÂj¶ K9œ>J²ì§u1‡‹Wƒ„a'¦÷-®¨ÿ;å]öµxÌú.…©D¢Ò12ýÓ<¿@ BÇþþÅX³ -«¨üfÖËÇy$oÇ~|OØÀå‘i $*‘iDBLÀG‘I$…N¢1Èt% ù¹)H!ô¬èÚð¿Pç:6µ¡ŽD¥ã/Íz)ù ÖàñsŽ>x__w!‡{.+ss5×5Öf¾ó#}~>h ²«ýÐP+ý;¹eŠtòíìWoJ*Y½t0!é!aRe R|±#âÛ´#ÓôÅÅ8”'ÂB3ßîI.ÁQÜË 8”‡‡™f ®æß¡*©Ñ…ÖCaU€ª¾Å«Ô‡Ï0ößI¦+JÓŽ\>:ÿ°ÄÓRc–×à‚Cé…õˆF!ýúSÍ.´”©¯sqI˜xH¢š„ìû©jv¡=~ñ~Âòºb°‡5BH h<âÄ0ŒD& 'Ì-f#„º«)ý¨×­ˆGRQ¤Öû<ÇŸû®!Ô³»ÊërNCöo·qƒu2_”å± @@.«áZè*!„&˜)žÉQårë{0ÕŒzwG•UÖòØ•|¾âex[Ùp¯ ÌROmž—9BèLÊc S™D¥“(4ÂfΛJi²€6w÷Šîž×µr—~ÂûÓy­ž8' Ï=ðp~øT=Iåùb$%r ‚@Pž{KE×Bø]ŒÑÕ¿éå4±Ã|—q:ëÐÿ™LÇÈTi–WìO)髎ëv‹˜ûSIU½¢@#!„þ:}ëÅ‹"¥^]„W60’°ÍÒª„ž¦ª·‹y—îÚþÎ:!&ŠaŸ¾wûœ‘…þWιñ¬Ô¡_׃ <î¿øhÔKU‰þ¹:UÏ^WôÓV‰Xòó½¢×»«(Pî?{ÅçÔQT4‰Š¿,kˆÏxëaÕ#ÄÃ|j]Ceà* ÃÊ«êN&=ÀHÌ5õ)Îk3Òž½àôk„Hÿ<®²ÔS뮦TÍ®OÎÈ£©ôÂHTŒD!²NÏ-‘&kÍÝ /(¼sNâ$T£—¤Ž±£;h´ãÍ.AéîÕW}ಫ4mÆ ¿KU6Ôðk³ =—RT^§FTäÅ)ëÚ‘ÍÏõÖqÑŒðl/…‘ƒôzuïÂãó2s‹O\ʼpû9CM“D¥JFÞί8”ëe­½ÂÏ¡èCÍÁ¤Ü9£û÷Ö ‘1àËò7©Ë†ÞN/)qµè=°—ò™´%òbÄãñB|„æF¾˜6ˆædª;ÖJåmyíßgoý'ƒ®ª%àó0Êç"mO.~–W4Ú¦·žVW ùÃÇÚ;O^ý¦¬VIS÷äíb5òªŠ•µõ•¯ué3(%¯¶²¶^YöÏ­g®€¥Ô…D¥ —Ïü~2ÿkF³Y€ îBHwИXï‘Ü=,øøËçoªEfÉcW’›®ŸpyUø ÅU__OUéQ5¤¬ƒ@Àg—¾äÖVrkÊù u„‘é te ª’™¦H¦3K³’ù|®bC†ZO…ú1ÿvCõGºª¦âúH ¨þï)·ö#ŸÏ#STf—ºŠ·‰¢¢gAUPÅ*iö¥«j 'TÓ6ô¬ýæ]ñ­Ìç/_ÿ‡¶cîÏ.¦½¶œH‰J{­ÐÃBS`—rªJ¸µˆÇECEƒ¦ò™®@¦)|1[TY\_QÜPSÁ¯g ŒB¡2•é]4É4E±Kmq~]Ù|n‰FWÖ1ÓîÞõD…„MZýä]ƒ‚†.UQ o÷ÒÇÿòy Š= ªÚœÿI“5H öCáYw˜Ãyüä©B7]y³#ÕÄ9YAE”ZRÉ*Vd™òÆ0²‚ºNCM9OYÃȈDÆÂ0™©D¢ÐBÌúPèJû4bd¨ë2Õøø|3™¡¤Ð½ÃÆ(T #! Q”TÉtŸ0± ë¹üQ»üàÐíkŸ[9¥]ª5pùÿÞË#QXÉÄP×!Ñ<‰LÅ›‚LW"Ó˜t•î$ ƒÆªA#}òF12ÂTÂHdFמ$ “D£™ètgÛÓTW…B²òß=È}£¤Õ£2Ðÿ—+tïC¢+`Yú¬ ¥îž,äùÆºÝ F¦*©‹sf4¾øJ‚ÑESø%UI*¼ÅKª„‹b_ZLôºÿl¥]×ÀËÌ¿76õõ‡J–v/ #!„a$ ]¥‡4E§*ª¢/L|tš"³›"Bc2ìûª"àVö«•/“éŠdº™Â ™©¡÷¥öõ€» h­Ã×Ú[ú“;Bî^λïú ªzû¤¡ªŒÇ©A<."‘HT&CM‹ÂT¦±Ô1¹Í3äTW¾¸þ˜êº¦"UQ î$ àÖU×W•Èìa=~ò”ÆR§0”äÍΗ"UüÄÀoàpª>`F¢àÃHŒD¡(°p³ÍáÕ³ëJ_S˜,„‰L£(ª´‡ÀgbWÕW•È––ÆRÇ?«rhGX¤8ÐÍÈ'Ÿsʬ|í¥Žþ7qŽê«JŽú² Qü#Kh,uXÙ €\"ˆˆ R R R€H€H"""ˆ@ÛB&h=wïEŸŠ½s'£¤¤D]]}Ð «ñã¼­,- eFR_·f톅‹–Žé~ûvzUUõíÛé#Gº/\´tÍÚ <Od*}Ccqø»íWà–oQ|"r»V€‘ÐÂþÜñþ}É“'O•”>mÉܳgÏ   ___oï°?w,\0·iª¼œlá[øå÷Á÷W#FRß$ÏsrÒnÝ>G(’’Ò鸸´[·Ÿçä@CˆÔ×!<üØüù Dä©  0þ‚ððc2YŽpâbÐw@?#“ËIÉDøÎ]{¬¬íMÍ­W¯YÏår¥râòæÍ[ü:77OßÐ8ãî=üå›7o\%çóù›·„YXÙh1~Âäüü‚¦¥’œ»8¿ïlB¢³ëpÃ~?¶¨."ÕÜLKsuu•ÁÕÕõfZš –¯\½v<"<÷ùã;ÂBfÏÃOFFëêêܼq%ýV •Jݳw£T–æwïÝǯ£OÅüq@llþ2ãî=b"_¤ñð#\.7åZrFúM77—­aÛo6wq$$$F9˜ó,«Eu©6 ´´´[·n"tëÖ­´´TËk׬ÔÑé…êæJŒ2¢¢c\]~¢Ñht:=0À/îLBS‘ºwï>BˆÃá\¼tù¯]Û¯\½^SSƒº{÷žåÿDJ¤ñØÓgü™L†—§ÇÇo6wq¬X¾T[[»¥u˜8—®]»~øðAKKK\„>tíÚUË={j7 ÌÏ/hjE¼$“Ÿågaiq2òBè⥤Á¶6šš=ìÏ_?Îûî½ûþ~“%/*zÙ½»~­¢¢RVVÞÒÜÛ¶."ÕØ œœœìïï/.Brr²ÝàÁ2XyÓòùüì¬ûtºØM ôß¿«¨¨Œ>ûûœY!/¯±aî6Ì­´´LO¯”Š š.žh6w±cuI†º¸{m@`à”ÐЭµµµ"ß­­­ Ý8¥­²ÓÑéUZZ&YLMLbOÇ•–”à3P¶6Ö¥%¥'OF™››â§+ŠCWW§¸ø=~]YY)Cîm[‘jú¶µñòô¬®®nôVuuµ—§ç`[›¾††m•·g¹ÄÚÚZ6›½oÿ?ÿiMãXZšoÛ¾ËÛÛ‰a˜§§Ç_»÷5»üÝËÓ#üHDMM ›]w:.^UUU†ÜÛ¶."ÕÌ›;[CCÝȨÿ^½zU__ÿêÕ«õ×ÐPŸ7wv[Üüª««Ü,ÙÝɸºI„HY˜s¹\ϱÂêÃår-›©À?2™ì0ÄÅÎÁ)3óÁÑð2äÞ¶u€OÏÚàã/sß×à ƭ~»íd¥çm€•¥H€»ˆˆˆ R R€H€HÈ,æl`Å9ÀHJNÓbÚ‹—’Ú»<"“K“¯Ì@¤¾2Äi1AAA={ö¤Ñhøi1Ož<}ÿ¾$ìÏ"SåådM_vZfΚómåûµ "Õ ÿüsQßÐøŸ.vÌó\žVpZ È£HÅŸMí>2>áÜ÷ýt•áÓbrssœœœœrssQ§<-FßÐøâÅËÃGŽéol:t˜û7ÏÄŸu:²ÑQ1……EÁÓg˜YØô326b4N¸ºø…@ Øÿ÷!;g£f“¦¼(,”­q***—,]nfac3ØñĉHqÏK"_‘v.Zwæ,‘ät\üÂEK›&äB¤ÊËËïg>\½jÅýû>~üØÉÛNø´˜iÓ¦]¿~½¶¶öúõëÓ¦}Ú­žsäè±Ý»¶?̼ãããùëo!gÜß記9󜜆¤¥^ͼ—îãí¹ìUèç‰>ïÉÈè®]Õ’.%Þ¿{kØP·¹²5Îò•«]]œÓo¥œŽ‰Š=}F¤ëÝ(ߦvV¯ZqüøI\¸ssóŽ?¹zÕŠF y©Äó\]~RVf¹8;%ž¿ ü8:kmë`jn½hñ²’ÃñÎéî!l¼®®ÎÎÁ¹¢¢RÜSNÜÓþk=Ê„O‹ÉÌÌ$‰ëNxZ̺µ«ôôúÐh´É“&ÖÕÕ­[»ªW¯žòJˆè;žÉd2™Œÿ)åååM휊9=jäpƒá7eÒ¹„8Ù'#ãî!4MKKsÙ²ÅͶ¼H;L&cËæ --//_¸héÖ-™Lh‡œŠTüÙs^^cB^žñg¿ðøŽ;}òæ+ŠŠŠË–­h6ÜÀ@¿K—.))©DH¹D»Á6**Êâžrâžö_ëQ†Ÿƒ_›™™áÄu{œƒK¶Ã—·oß6Š`aiq÷î}Ôä´„ÐÝ{÷‰‘TkN‹‘;NïÞºø~kijŠŒvï~æö»æü¾`؈Ñ"#0ŒÖ7NYY9…òi±‘Q³-/ÎŽ¾¾Þĉ†3yòD}}=ŽŽ¤뤊Š^VVTâŸu++Ë?½ÄŸi¡eKãÏÌ©Sý½¼'©Ä…#„¦Lò=x(ÜÑÑqbÝÚU {úÌ¡ûq•ÛB<í…%ï«§ÅÀ×IIFœLH#ÿý÷Æw’_ʵdè dIµÓ‚ɺººã'"=~ý€H¤)É"™%ÌÊÚÎÔÄäà½Ð´J¤d“°f}½¬‡÷ hw‘@ΑÏi_bs)ÐÔàÙrU@ŸûD €/t¡ÃòÂ0LBv’§"@G Í@©Y`sä)@¤¾w2îÞ›¿p‰£“«ÑSG'×ù —›‹€ªªªšúËôªª*©Žæ›;wO2_ëä»ö6"¡^ò|ŒB”ÃáôéÓ§n“¿ÍNIIñÛlvX‘jßÙ¹{ßëArêÕÉQ˜5kÖ‹/Ú;—5k7ܺŽºu;}ÍÚ -MßîÉ~î^zúüT+aðs÷¬­=ÏÉiÃ}ï  vqq!v»n?V¯Z¾zÕr™“ÃHJv„ÏÝkJÇŸ»‡¾Í“ïB—“’û™è›˜ ˜Dl”ØÈß~y&þì°áîæ–6³çÌ'NWi§Q½ô £¢cLÍ­½ÇM¶©oh|6!ÑÙux£¶BmÛ¾ËÌÂÆÊÚþÐá#"]0qiÅ•_ÊnWMqMݨjÍbkk;~üxù¿Ñ@¤dGøÜ=‘tð¹{8ßÜÉw¡ÙóvîËËɾu󚛫˜ßç7ÛDGŽ?thÿ­›×ííl‡GH°Óô€¼¬¬Çi©W›na–qä`£¶Š‰#“Ii©WããN%œ;/®<"ÓJ,óÝ$®š> âª&’ÀÀÀoâF‘’ás÷DÒÁçîá|‹'ß±X¬ÚšZ|ø9iâ„‹ÿ$4ÛD+—/ÓÖÒ¢Óé#G¿zõZ‹ìMSPP :"X±|©¶¶vÓzùNÏd2µ´4W,_*®<"ÓJ@šnWM ŸqUûZ¤\K÷sR~îž–––¸íqîñRÜ ½{ëâÍž|wãFjaáˬÇEFí仦œæä»MÖNÿufâù ãÆy‘0’««s³M4`€ÑÿªÉÌ/xÑ";ÚÚZÒ×+''WMíÓ±ŒZÔe²›DVSÂ'A\Õ¾A!âÞ’þ‡„ R²#|îžH:øÜ=‘i¿‰“ï\\~Š;•õ8ûÚµ)7nTVUyŽý¹©‘fë% úN"‘D^*—„ÔŒSÒÈŽ4Ý$.\BS7{¨bÓ&?‹‘jÅS"pÊ¢Åøøøˆœ;ÇÏÝÛ¼i][e‡ §©Ù£õ¦¶lýóJò555„Ðóœqú††*•ÚÊâá'ßuïÞI<ùnÀãŒ}' §ÏžãÙT\ ‹ pŒB555?üÐ]z;-ÅÐР¬¬¼[7u$tô‘ 4*¿”ˆ¬f~`Nê;GÏÝ“y;ùn¤»Ç‰“Q555¡W¯^î!…B¹œ”, ^¼Xµú ¹_·~ÓûêêêÎwp°—l§5äMôÃf×oذ¹eCñå—‘ÕlÃOˆÔ÷¼»'%òvòÝö?·žÿ碵­£¾¡1þ ŽÕÕ·ÿÀéÓgúûMNâ>jÄÈQVÖö)7Rç„ü&ÙNkÈçãÍårÇzMpw)ýÐRrù¥Dd5Ûð“Ð1¬\µ–øMÅÊUk[š¼mN‹éäÀ¹{„ŠŠÊ1^ׯ&}‹…O¹–<5xvï'…/ûàñxA·n§ÛÚX ?€Oœé7»é]ËN‹$çî}ÇX²[¹bÙP-ÁFa IDAT7—ªªêC‡Œ> Ú¤¥Éä=»wÌþ}þŽm¡2L탻’ضåᅳ˜ éîÑÐÐ0÷÷h`±X‡îg±dq×`$’pp°sp°ƒvøŠÀH ¹FR´mrŽˆt"Úd ¸”HÞ«Kú¼@¤ ³Ð‘ëÀÝ e8:¹vä0ª ‰s@¤@¤‘‘‘D   €uR² g`­„Øp Dª]øF×Å€œ ýÏúÀÝ@®‘D €ï×kk“ýX@¤h/$S "¸{ Rm RĤÂßA´I-œœ‡½~ýZ8äÎ }Cãû÷¾yóö'—a2%Â/^J‚O' –.æ”~[âÎÆ`[››i·Çó&BΜ=§§×çLüYssS"ðæÍ´Á¶6Ò´ðÌYs µܽ6ÃÎÎ&-í6ñ’Ãá$%ý»c{Ø¥ËÉõõõŸE*í¶Ý`[h.èh‘âóù›·„YXÙh1~ÂäüüÂy‰ŠŽ15·ö7Ù¹k•µ½©¹õê5ë¹\.aaÛö]f6VÖö‡!\žFÉ%ä"ÒcÒ74>›èì:ܰßýŒL.'}ZÍQQQ¹dér3 ›ÁŽ'ND¶‰ßgkc};=Øèþ߯š››öëkhffråÊ5

8~@\´êêjG'7ËAvw2nÂÃÇùxs¹\Gç±^ÜÝGŠsbÅå‚;Ö·ÿÀéÓgúûMn¶´[6¯/-+·wt5ÚÓCèˈÖ/=·lËáÔ»Ñ(|´ûH§~pKD*è—©c}œœ‡Jh7è `ÁÇ_澯¯¯*9êË’‡UTTŽñðº~U®¢g`ÛB(åZr`Pˆ ·Cʵä©Á³%¯ûñ¬¢±Ô[ðížÈF›ütÃrÝʈº¹TUU:|dÄðaÐ÷à´@¤Úï§dÛ¶lÙ¶`áeeå1£G-\0:€‹Tûáà`çà`@SàÆ€HðÒÞœ#8€ÖÐ_sÃH ¹FR2ÒÞg"%;­Üz©öv€椑‘D D D )€6ÖIÉ‚ž4´ äYr"%#°}0´éXîr ˆ R|¿^[{ï"@«hïÍ9A¤wD €ïO0&‘HÝFŽ>÷÷ƒ!CÆú†Æò¶u\+‹Ôô„g …²sGØP7×ö+óÅKIǹ}ÓÍm&RHhGJ.—ûþý‡ˆc'V¯Ý°qýhÇFíƒs9)yÞüEa¡›ÛO§fΚ¢€»'JÛ(MÍ3û¿ÄÄ Å1ÔÍ5,tsÈìyÐÐÑ"…S__¯¦¦Š_OŸafaÓÏÈd؈ї“>-ûÿ>dçàl4ÀlÒ”€……MíìÛpÛö]øõ¶í»Ì,l¬¬í>B8Pú†ÆQÑ1¦æÖÞã&"„ø|þæ-aV¶ZŒŸ09?¿@¤Ã%œülB¢³ëpÃ~?ö32!ÊVQQ¹dér3 ›ÁŽ'NDJpÜZ£S\.¿WìFeYT‘iñrê7-°„fpâbÐw€°}qÝ'®<âz !´s×+k{SsëÕkÖu:¡aÛðOc£¿Ð°m_A¤x<^QÑËå+VÏ™‰‡„Ì™çä4$-õjæ½toÏe¬ÂÃOFFwíª–t)ñþÝ[ƺ…„ÌmdêpøÑòòòßçÌBÅÄÆ‘ɤ´Ô«ñq§ÎŽ–•õ8-õjØÖM¡ð#\.7åZrFúM77—­R4ABBbÄ‘ƒ9ϲvî#†6ËW®vuqN¿•r:&*öôq^[[!e±EUdZ¼œy9ÙM ,¡Ù¯\½v<"<÷ùcaûâºO\yÄõÔÉÈh]]›7®¤ßJ¡R©{öî‡[·ó0oǸ7 üyŒû¼¹s:N¤iìÛ ‹ÛˆËIÿ’ÉäOåøØ‰¾ã™L&“ÉðŸR^^އŸŠ9=jäpƒá7eÒ¹„8aƒÇOD¾|ùjÉâøË¨èß ã™L¦––æŠåK…cMSPPÐÑé…Š=}&0ÀOQQ‘Édxyz<|ø¨Ù’¯X¾T[[»ÑÐ&#ãî!4MKKsÙ²ÅíÝ…R[dQ[Ze ;vÍJ¼…í‹ë>qå×SQÑ1®.?Ñh4:àw&nÝΆa›6®³µ±&Blm¬7m\×Ê#àdœ8çóùeeågÎíÝ÷7¡÷îgÞ¸‘ZXø2ëñc"IAA¸¯ÿ¢OÅ?:ÎÇ›ÉÉÉ%üÇÆ_l‡¢­­E\½ìÞ]¿VQQ)++o¶ä={j7 ,++§P>µ€±Q»ï¾"e±Eµ¥U–Ðì"í‹ë>qñÅõT~~Á@S+â%ñ : T*uÏîSƒ>|db2pÏîT*õëÌI‘H$uõ®S&O,*zIŒó/þCCCcÒÄñþÞCÄäryât43óAB|ìéÓgJKË/R\Žâ>î@dªF$IœßúI­)z;‰+¶„¢J“VšfÙ’âºO\yÄ€ÏçggÝÇ=мœìçOÁ}ÛÙ`±Xöïvt´?°7‹Åj½ÁVMœ×ÔÔ¨©©á×[¶þul¢ïx++ˆ†"NïÞºÂ/…Ù°~’’RPPàöŸfÍ ˆ1³ç9âòÕÕÕ).~_WVVŠŒSXX$Mk–””à×OŸ=o»œ”L Ö¤)vkª,Œ„f‰¸î‡¸žÒÑéEÓßoróÇÍëKËÊíGöôúVBæ%¾y ™=Ox%§¸bKƒ¸´A¿Lõëãä<´Qüf›½âºOâz*0À¯ººÚÑÉÍrÝŒ»¡¡›àZ |üeîûúúª’£¾,¹*YEEå¯ëW“ä°Õô Œ`ûào¢§€ö&åZr`Pˆ ·Cʵä©Á³%/÷ñ¬¢±Ôeüíž0m¸ªÈrÝʈº¹TUU:|dÄðað!O §€£"Õ¿Û¶eËÖ° —(++=jႹÐCò ô "Õ88Ø98ØA¯È?ÐS@‡ûI"ÀwJ{opŽàpPZC|Í #)äIÉH{Ÿ5ˆ”ì´rë @¤ÚØV: ˜“D D )))@¤ÚX'% zFÐÐJ0 “fÉ!ˆ”ŒÀöÁФÿa¸{È5 R€Hðýzmí½#ˆ­¢½7ç‘Ü=):»H'_¼”$}dqçè7úëgdr9©}ç¥é ‘ýß ²,æœ9kŽô[SvªM,UörRò¼ù‹ÂB7usm§[ÔîðCÝ\ÃB7‡ÌžM'R¸¿€»3¡Â¢àé3Ì,lú™ 1º©wCø`ÿ߇윘Mš𢰰38 CÝ\¹\.~Íçó7o ³°²0Ðbü„Éùù"›÷lB¢³ëpÃ~? {‹"Ó6ê aĵ6B(<<Âaˆ‹AßÂöÅõ£¸ò „¶mßefacemèðáìܵÇÊÚÞÔÜzõšõDÝÎ@hض¦“ú†Æ¡aÛ:T¤pç"/'¿™3ÏÉiHZêÕÌ{é>ÞžËþX%.áÉÈè®]Õ’.%Þ¿{kØP·¹Í ?ÁårS®%g¤ßtssÙ*¦ç#ŽÌy–µsG1 ™¶Q_HÓÚ¡+W¯Ï}þXؾ„~Yž˜Ø82™”–z5>îT¹óÂùêêêܼq%ýV •Jݳw?ܺ‡ysçü<ƽQàÏcÜçÍó5ݽ„øØ‰¾ã™L&“ÉðŸR^^..橘ӣFWPP`0~S&Kˆël]{úL`€Ÿ¢¢"“Éðòôxøð‘Èh+–/ÕÖÖn4 “2­4­½vÍJ^ìKèG‘削Žñ0žÉdjii®X¾”ˆãêòF£Óé~qgàÖí<`¶iã:[k"ÄÖÆzÓÆu­<® vA¸w?óÆÔ—YKˆVPPÀ`0:s½ìÞ]¿VQQ)+-è={jËœVšÖi_B?ŠŒŸ““«¦¦Š_0þ¼qM~~Á@S+â%™L†[·SA¥R÷ìÞ05øáÃG&&÷ìÞA¥R[i³µ"u22:<<"0ÐÏn°mWõC‡¹‹‹ÉåòàLMá9#'zpK"ÉœVšÖ)úQdyÄ€ÏçggݧÓéÐÅ‹u`ÿîù —„nÙÈb±Zo°µ"µeëŸW’/¨©©!„žçäHˆÙ»·nCCCëeõÛârR2…ò©‘uuuŠ‹ßkjö@UVV¶ÈNKÓ¶´µ¥ïGCCƒ²²ònÝÔBÏžޝ£Ó«´´ /'ÐiQSS;|°Í¦#e™“b2ù/JJJBÊʬ””T‡“ýdþüÅRùx{^¹zÃáÔÕÕEF=Ƴ3(Ô¼ù‹vîÃ_zyz„‰¨©©a³ëNÇÅ«ªªJoJ\Zá¾hMkKß8}ÇEEǰÙuÅÅÅ6lÎ7á\bmm-›ÍÞ·ÿ€Ÿÿ4¸c¯ RA¿Lõëãä<!´iãº]»÷4µš;QP¤Od€ÿ”'OžÚ;º˜[Ú^º”ô×®íxø÷´¡Ñ7¯!³ç ¯ä ð#“ÉC\ìœ23 ? ½eqi…ûBšÖ‡ôýˆ3ÎÇ›Ëå:8:õšàî>’²øUWW;:¹Y²»“q74tÜc@+Á‚¿Ì}___UrÔ—Í!%zF°}0AEEå¯ëW“ ):!)×’ƒBd¸R®%O ž-y’d¥.Ëo÷ÀrݹÄ8NIIé¾ýF m|}w~#l Ûò÷ßMÌt÷hhh˜û{´ ÐNÀi1€,88Ø98ØA;ò5’‘à[¢½78w€VÑ_sÃH ¹FR2ÒÞg"%;ðKi‘’k`Ét0'ˆˆ R R R€H´°NJô Œ  •`&Í’C)탠5HÿÃ2p÷k@¤‘àûõÚÚ{G)ZE{oÎ "¸{ R€H¡7nŽŸ0Ùh€™©¹õ¯3Bòòò‰·.^{Ê6qôqkÎ@—V8߯{Ʋ¾¡q£¿~F&—“ÚwNQB³·¨@niÁbÎã'"So¦­]³²OŸÞ ÜÇÙÙK–­šêæê‚š9kŽ¸Å£íº¥„|;žF%¹œ”~cjní=n¢8cßþƒÛ¶ï¯wîÚcemojn½zÍz.—‹VTT.YºÜÌÂÆf°ã‰‘œ"_„Pxx„þ„]-ÉåioT‚N5âóù›·„YXÙh1~Âäüü‘5:›èì:ܰßÂU™¶iõ Áþ¿Ù98 0›4%àEa!ñ–È&*,, ž>Ã̦Ÿ‘ɰ£…›NdyBÛ¶ï2³°±²¶?tøˆpDö&Ð ÛÖtÒCßÐ84l[‰TÐ/K–­ptr]¼ä¨èá{ ÷8òr² ×#+ëqZêÕ°­›Dš:~´¼¼ü÷9³B'#£uuunÞ¸’~+…J¥îÙ»³|åjWçô[)§c¢bOŸ‘à^ ç{åêµãá¹ÏïÜ2{Sry:À-E…‰àr¹)×’3Òoº¹¹lÓs ‰Gæ<Ë®‚È´M«Op22ºkWµ¤K‰÷ïÞ6Ô-$d.ñ–È& ™3ÏÉiHZêÕÌ{é>ÞžËþX%¹<1±qd2)-õj|Ü©„sç…óÙ›@g`ÞÜ9?qoøó÷ysçt˜HMMˆ]»f¥––Vìé3ÃFŒöð÷öí;‘‘ƒƒ¦)((èèô9·õòå«%‹à/£¢c\]~¢Ñht:=0À/îLž‘qwȦ¥¥¹lÙb) ¹vÍJÊzœ››‡òñöL8—X[[Ëf³÷í?àçÿÉ ™©É±ã'kkk‹‹‹×®Û(Π”ù~1z¤P.'% ‚‚/V­^×® 5oþ¢;Âð—^žáG"jjjØìºÓqñªª-ÐwqiÅUßÇÛóÊÕë§®®.2êÔè1ž’í++³RRR9Nvö“ù󛟜è;.*:†Í®+..Þ°a³p¾"{:B¤‚ƒ¦MÛ½gŸ½£Ë&–3gͱ²²œ<É7è—©c}œœ‡J•+‰´pÁÜ›·âÚW]]íèäf9ÈîNÆÝÐÐO_ÀmÙ¼¾´¬ÜÞÑyÔhO&_´(_ü[ª¾ýNŸ>Óßo2Þú%¾y ™=Ox%g`€™Lvâbçà”™ùàhø=!D¦Wýÿ)Ož<µwt1·´½t)é¯]Û%Ûß´qÝ®Ý{šZÍ¿((¨yeçãÍårÇzMpwIÌ;ˆëM,øøËÜ÷õõU%G}YÐR¢g`ÛTTTŽñðº~5 š¢’r-90(D†Û!åZòÔàÙ’çmü#«h,õLœ‹hÀÏ2:!–ƒìV®X6ÔÍ¥ªªúÐá##†ƒ6Ú‰ˆˆ@°-lË–­a .QVV3zÔÂs¡M€¯/R@àà`çà`ít°Ÿ R|§´÷çàîÐ*:àknI ×ÀHJFÚû¬1@¤d§•[O"Õ¾À’1è0`N ))@¤@¤@¤‘h`”,èA#@+Á0Lš%‡ R2Û@kþ‡eàî ×€H"À÷ëµµ÷Ž R´ŠöÞœD p÷@¤èì"%òcqǷȈ4ñ[šð«pãÆÍñ& 035·þuFH^^¾Ìo}Bø>øfsÊÿf˜ÇOD¦ÞL[»feŸ>½¸³³—,[4ÕÍÕÁfžðÝ‹”ü³}Ç_×®\RRRBQ(+K‹­›7Lö ÄE €vw÷šõJÎ&$:»7ì÷c?#“ËIŸ–NTTT.YºÜÌÂÆf°ã‰‘ÂIvîÚcemojn½zÍz.—KØ‰ŠŽ15·ö7Qœß'2# ;¨)I¤ . ‡èêꤦ\‘¾üÛ¶ï2³°±²¶?tøˆÈb‹¬ È ¡aÛô ›þ…†m“ ‘B%$$F9˜ó,k现ÙóðÀå+W»º8§ßJ9{ú ùdd´®®ÎÍWÒo¥P©Ô={÷oee=NK½¶uS‹2g°Ãü¬ _—,[áèäºxÉQÑ1ùù-*Ll™LJK½w*áÜù¦©$´ÈóæÎùyŒ{£ÀŸÇ¸Ï›;G^DjÅò¥ÚÚÚ¡¡n®Äs>#ãî!4MKKsÙ²ÅDä¨èW—Ÿh4N ð‹;“@¼4MAAAG§W‹2’`°£DjjB|ìÚ5+µ´´bOŸ6b´‡ç¸·oßI_~ß ã™L¦––æŠåK›¦úêÉ`¶iã:[k"ÄÖÆzÓÆu­<ŽÒ¢4 áóù$Òg™ëÙS»iª²²r åS.ÆFŸw8ÉÏ/hjE¼$“Éĵ¶¶–ä’ˆÌH‚ÁÃȨ?Bhˆ£Ã¬™¿>xð0ñü…?–¯:tpŸ4åÏÉÉUSSůÉg@2T*uÏîSƒ>|db2pÏîT*µ•6[ RÊʬêêj|b§²²R™Åž”™Çãáw…B¸ì¬ût:½iüfo?‘I0øU055éÝ»·ÃOR–ŸÇãI6(o‘°X¬ûwÏ_¸$tËF–>t„»×¯_ß»÷î ‡Ü¿ÿ _ÿ¾Í–¸¤¤¿~úì9®£Ó«´´¬ ›¦Í ¶[»! £B45‹¡¡AYY9~ýìyŽV¤DMMíðÁýjjjmb­"à?eùŠÕ×Sn°ÙulvÝÍÇI8 ‘IDAT´[ë6lúeZ äTf¦&ÇŽŸ¬­­-..^»n#îãí™p.±¶¶–ÍfïÛÀÏZ+kÒæ[J`€ßo3g_¹z½ªªŠÇã­\µ&8HÚbLôÃf×oذY+_…¸{n®.Üî¶í»rrrBýûõýcéb§!Ž’SmÙ¼~Kè6{Gg‰üûì™™™ˆ[úÏm;ÜØl¶µµUhè¦Ök„Hƒú†Æó_pÐ455µÝ{öååå744ôé­ëï?ÅÇÛSÊäã|¼·mßåàèL£Óý¿ GY¥¬ |ß`ÁÇ_澯¯¯*9êË‚æ=£vÝ>¸¢¢rŒ‡×õ«IÐÔ€œ“r-90(D†Û!åZòÔàÙ’þ‘U4–z FRâVEÂ>ÚËAv+W,êæRUU}èð‘ÇA›@ËÜ=£ve[Ø–-[Ã,\¢¬¬|h¿©© Fc±X>>^‹/X»~Ó7ÚmbGäL9“É P×Sn¤ßÉ8uÜiˆ£‚‚“Épây9)ùfÚ­¦ñ_¾|ü¿Íý=D6…jÑH D /ðÁ¡PO?–­Ïº+îî=ûË´@2™,èñóèÛÃðë¢àé3Ì,lú™ 1úrR2q‡œMHtvnØïÇ~F&D¸@ Øÿ÷!;g£f“¦¼(,$ÌîܵÇÊÚÞÔÜzõšõ\.WnGK›Á¿Í›ÖT§Øì: ©Nœˆœñëtƒ!Èb±Bf͈8v¢Qä‡-X¸$tË&SS“Pd)@îSç]ÇœwS÷¾ä}]íü»©>ÍÙÙOÍÍMOaP(ºº:øuÈœyNNCÒR¯fÞK÷ñö\öÇ*"ZBBbÄ‘ƒ9ϲvî ™=<ݵ«ZÒ¥Äûwo ê2—×ÕÕ¹yãJú­*•ºgï~ùIYÚ >™xàÝ›÷øuS©*+)¿{ûAeeucÝy”eiaÞÔ Ý`Ûû÷‡$'_ ˜üë¯Á½zõìE†9)@~ LM–|ßÖÔÔ(++KˆK\øOÙ´9”x¹bùRmmm„ÐP7Wbdt*ætÔÉ&“‰ò›2ÉoÊ$<<*:&êdFCøùNò™õ›¼ÍIá U]Yýƒ¦Æ0wg<ð˜ãgIF¥QUÕºôê­mb1àäáØ&Lªª]šÚTSS«¬¬$^;~2ýNÆéØÈßç.´07c±dÿ™ ¬“¾=M“JNhös¬¢¢òñc…ºzW qîÝϼq#µ°ðeÖãÇÂá={j7\PPÐÈåÁÉÏ/hjE¼lä`ÊÃH W¨¢‚W|>_³gÍž=B$ÒgW‰D¸\^î³ü˜ãgïßyØh‘”’’bUuu•¦â¥"XTôrçö0‰4ó·ÿ[²lÅ_;·u€"ƒ»È£BIÉ€F™4 ÿ÷ß«„›¶xñ“&Ž?ð÷ž/>ú$~.—'r{#>ŸŸu?/'ÿ{þô‘\ÍIá õªð5ŸÏoTl‚ŠòÊŒ´û™YM !dnf–žžÑÔrú;¦¦‰—,[Œ·››«‹F·n'NFÁœйêéDzQÉ øÌT¨¥}³7­ÇÏcŽ=ÖèÎÌÉÉM<ÿ~½eëŸÑQÇ&úŽ·²²lhhh¶$½{늌¦£Ó«´´¬½ÛA¶‘®Po^½ãóÅnžWò¾ìá½ìÂüW™D.4Ÿ2yâö»jkk…kkkwîÚã7y’H›‹Í?{îÙóœöVd)àë+Tê¬ù¸BÓäïëjûwQk6í˜Ñ£˜ æÿ͘õäÉS÷áCIı3gý>ÞïxeeVJJ*‡ÃÉÎ~2þâf úx{^¹zÃáÔÕÕEF=Æ“O8—X[[Ëf³÷í?àç?M~FRwo§MtJˆ½À©«áíÅ>}UôúÁ½,q?…qt´w°·7~Òõ”l6›Íf§¤¤Ž?ÉÑÁÞÞ~°È$4mëæ K–üÁf³a$|çT<ÍV¨¼œìÀÔd$´fJ†íÛ»ËÜÌì÷¹ Œ46Âýî½û‡íÓÒÒÄ#lÚ¸n×î½M­æÎ_Ô¼²øOyò䩽£‹¹¥í¥KIíÚŽ‡øUWW;:¹Y²»“q74´]ÖaÉ<'u÷vZÊ¿iW.¥ð¸<áp_ðö¿â'ž½.úïQæÉ?Ö[ºd᯿ÿµ{Ÿ•µ½•µý_{öþúk𲥋$$ÑÕÕ ð[¹jm»*2ì'´Òï'…^…oQ}Cãp{W †‚4ÓçrKï'ei3ØÞÉÆu¤“@À/-)ðùåeÿ½zûþ݇§s¾ú¶šIÜO ¾Ý¾>M? y9ÙM•«EOãoQÚZYæ»·Ó,mS©¾@põÒ ™$üVkÆ5í´=ƒ”fA¤€oøŽýÎv‰kýo÷pêgd@"“Z4têø–„9)ø>uYzö$W>;éÇn Rðmß·ÍêÔ÷¤È Rð]¤¾?E‘ùºo;Éé– íiÕÒ%¶‰,Aù¿W¡Ä"À½÷•ù“fD €{‘:7íÄph¥v¾ÝD D )))¾>-A ±Ôý#K 9h,u$¼N  Wü?¢A• k+HIEND®B`‚kildclient-2.11.1/doc/C/images/we_plugins.png0000644000175000017500000012526311405233117015723 00000000000000‰PNG  IHDRÔã½0² pHYsÚk¥óÎtIMEÕ .I™… IDATxÚìÝh×Þ?øî*G‹ûehÀa3Þ"Ó@e¨ÅõVÈËø‚%ˆD.¤j ­|u7Ñ7ä«äTÎ…ÖJ!¶E› n° Qþȃ}ù¦kZ¬@B&l#6fgØtx"í#eý¶ãøWÞ/DGsΜ9s”ùèÌ™3&û=ŒÕ˜{˜ €µºx6Dĉˆˆ•ߘÛE¦Úàa¬gb.¿g»ˆÌd²ÿÑCÄXMØÁ‰8'µHÚ"çÅ­»K‚™D Œˆ(›§¹<åI~ET|G±ÀH|¤Nru‘^-ùE.khü°Al³š‰­ìÛ?¢]DD¬|ÍÏ.G²FçDŒ™‰i©Ïd žh™$èçWŠÿB²Š#¾Œ¹íäÞGD¤I^à¨؈™éÁƒqš&"MÓßFÈ̈ÈdÿÈCČȃIÖh[œ¦FRQú)¥rT(âp×ѳ›­ƒ4N²FFÇÀÆü–bf"¢ÙßrswãTþk‰Æi.Ï-DŒ‘È–.Æ´Â9)¼¼ªÈøÆ¤bf;ˆˆ&£é'øMßÐüKŠ< ðfc$vpeQo °ClØ™wM©¸Æif‘zmL`Ô÷¾}fÖÉ´¹ÿew—}~öÿ$"^¤ÿùkô_Å]ÿf6ÿÌÄ-ÿffDf33ÿ¡XüO¢ÿ"þ_TüO*y‘;þ׎—ÿï"çÅ"ù•Ëb¦ÅIµç¿Q‡™²yú?þ/NÿEx5yñ"ýúÿÿô¿›;þÍœ_,ѰclØ™wM©ŠE¢âråÿãâcæ?ø¿‰·~áË'¡lžS‘ô‹1D¤iÜBÄÍÄÌ$tèƒF8#âE¢"ãÄ9çÆšÜÌc—ª£<Â4þˆ®¶´AY Ìsrí%‘‘¼XÕáÛØ–>_—c FEžÍó¾.&u DdžŸM’> ÔÌ,By-N¤jªÐ!–ûNŠúàýzGù†]^,o@ÑT2¬6‰6*•]ˆhö)‹«;BÉãuz‹¼7y£5õ*ßÛmÌÂ÷ª“ÄG˜Àhô)‹œˆG™~‚×S‰lb˜4N)¾†·,a;R¿r×^Æòœ:–£LØÖ¶òùÚj“ÈL–Ò¯øs"F4vÜi^Z‰«š>˜‚YÌDDÊKÍÞ%rÎÉ̘™ˆñª±N¼È™™)/5«U`E¾¾©,»LDT(jSYÑÌóõ¹¸I&úGC?.Ÿà#õ“䨯‹$+ÉIÌèZ–[à’µ¼ÎÚ Ü²„í5Ê/’­ƒQQ£"Æ}ìo~æ­–º9Ïÿ®´LUx]2Ö·¾g©JEEND…"çœHaL˜(å“d^ãFHRî0YP‰ˆsêÙom´ÃsOÖAÚ‚j}Oà+S‘™óFEbÄ-K¡PàDÖ÷,ó²Â‹Ô2•ÕbÒ7a±X”WÎye*ýÔžSˆŠ«jʈhèFýY/<™ÿ}Ɖ¿,e[äD4}RÐSéoˆhúDu>óyêëböNÊ<áŽÝzôGÌLöÝ<—çöNFDò×3tîeCÌÖAyâY>ó¼¼9=ÿð]`Ê"…îhå²´›Jئù²u0‹¹PàŒ:ð…Ø êžyÉLT$^žµ‹7?ó6ü}Ë[§²ì2^¨H‹¥6ÕrVKÁ†$0¡ƒý¡Üi³¸4+W±üFÑ8/r*æž("*x‘+Úr¹T¼HTäúžë1„Õb)ÿRo•ÊjY‚‰ïYªRéÁ‡²ÈË¥mÿEû¸òåÚÏ2ÆH`üˆ­XÓx_¥"yN!"’:‰ŠÔÓɈ(ý'¢žNFE’:‰ˆæ¢"9lìܳuÙ:7À6V¹¡È q^]àf%lï¥-í ÷씞zg^®Ÿ‹DEÞúÌÛHÓTŠª.Å#ò¨— ué4Tîù`Ë]4ÒOTF_HAy©Š»­+;yTESõžm‘ó×åi6*S‰V±Þ®Öªw¿8“{f¤2b«µ™þT¨üóð·y0"J?¦ØCìgîD+/jð"þV»ÿ¹`$©”ËÙ;‰9lDD‰,y> »8‘] "Êæ‰ÉïXÚÐ,ö1÷ò;ØìóåÑËÀØòÖõ7-Kؒʪ+о±;¡ç£âJE¦÷y¬øÜêÌKDê«ÂÊ>.î¶¶HUdê«‚~©¥yl@fb+š¢ë‹#23 Q¡¢"E-ׄµP¨èí/¼*°]dYzßfe½IªrÀd&µ¸¿à ÄËDñGšZäñ,sŒ*W«}_^Rä²f“rícŒQn®ålöNêÛKd¦¼F*׌ ÏjÎÇg™û€`ï\‘a<«©EN‹«.aKÖFD…END|_v„ªó5-ïõ7…öμ|õ©–·U¹¤&UˆŠåwN¤'0‘7[ʨ`.G7Ìlœ§¸(jaéÚ…™ dD7ñ—žêÙKÕb&¢ª‘,í¦2*¤P$MãzùõT'‘(š_Ëqr~S/Y‘HŸK¾Ñ¥–Fï—;?¸$0ŸƒQö§"é£=ü"šËóêŠd3/ŒbeZMþÅöJØŠ>-›öJ£]BßW€ÔóQy¾&bKg‡¶Î× R•94IU5Rµ{·uî‰R½­¥sVåÉΘðS‘¸™•OûER˰Tþ²VÔBe§ # ‘¾fùÌZ7ÕRB.Z­-Suï®?¾u^VŒT*çc}{hîÅZŽSÝK¹²Û(ØÇ"÷(pˆÕ®YùÞbf…š‘ÙßÉ}€ôIìgd΋4#sÏûÌn#"Ê*år ä°ÑX?‹< ÿ!FD¹üÊ Õ\O26/asÌL#"eA÷Ø0? ÀΰÚshóóõÊG[çk=6БÞýbí¶x9òàDy ‚íðŠë:d&Fd1¯…ˆÈÊ眙ˣCTÎXãTŠªêiÕWEÓš§jXl9•¬‘$ë‹Í®ånÛ¹/m•ö|•'¢Ø#mbXp`î¬nÀ±T-$tÐýÏ…ÌSZу2÷bùn¡™Ä‹4óbŧzñYmbdņb³Z£(§rIË6ç>À˜™rÏe^djÑ‚à`'õ|´­{æ­Ö5¤""㯨ªžIm*"FæóK-\+oHŸ¯ÌÌT^X |X™Éb¬nfd&kGy¹Ê ÌÌ3'¢7OõLQ«R13qÎ+SQ‘kœIs`©_ÞøQ¶Åe~+\dìˆ(öP;wD0>ª\-|O‹ #‹™¯ø”(—/ð¢ÀÌ”[ ¾¨‘¦òš`ôOUý|Ÿy\MQ°_:I^ ñÚÌSµ¶Mü¬&~V÷uSe«ÎÇ ÃÞ¯ªów}[g‹éÇjº^&µÅ«ZÒ¨„-õ[%åžË¹çŠm¯Ä0ÅÀN±µÏ×|i¨ÇŠõòÁ‹äú¨·÷x´Ý¶ïa´Ôÿ¿a©d[;ÈÖÁâÇEÿÊ›¡šçKà#ˆffs‚ XßÈÌ8.»ì[ü|]—©T*Qü—:goMQäÇYõ¥Ü|ÖÝ’tÀ!ˆâ§²¹ö1[åxè¶2§ V³ì¢sG¬zäŸÊÈ Üj“„Ý¢~ v†-~¾®ø€-©Ÿ—ÆNêÏ­3—{W¸ªZÍ¥a13fµ²¥®üLÅÌÔkcB#¢Ô/Zì¡:ÿˆÈº‹\,cGI`D”º“Éå5[—dÝ-0fEä°“léóµ>×êÒõχ¶zÁ‡™È¼Í†ØmLê,YÖxæ)§"å”wñJŒØÁ+Isî-?Ü.÷\Î<Ìò" ¢u·˜…áy¶°a•'}¯|ü+OT1d»ý2fD’‰å^ÐÃŽÜ“üÜSÅÚÁ„NÑòžÀ˜}°¡VΊéù¨ân…„Ú5¶Wh•{JTÐsÁúQ±<›ç»Få\Sys9_àDŒY,6;1¦1 73*2Lï›®ÜóÑó•¶S",NT "ñ‚öNX}²Ú]ŒÌzo:„`óÍÿMX>²O¹Èp»¼- ûýu Á ø>Á‚@ð>Þ¾vŸ36v&„ÊÚ“Éü õ[=ø ¢ñËQÔl\ðAD¶. U¶­¡Ï6Æ|‚@ð€à|´’šJ™v™t‹%ó ³a›6™L8ÞïVð‘šJù}þä­d©T*•JñïãCšýY€w‡y#7æ=æMÞJzF<úŸ¾ã>*RàÓÀ|nGà±±—]ŠdDåøã„o.;§¿×4mÈ=dÚe:ü§Ãš¦é M&S웘¸G4í2¥¦RÍ×ÿÇx½‡ˆ²?g{½¦]&QãßÅq˜ÞÕà£Ƙþ&t&½-J¾£¾ðÙ°±‚,Ëò9y+é=æm¾¦ 3³3Dä?០^"—"!L °•˜J¥eŸr‘)MÖ;¿}ÃNM¦òæhåðO}¡(ŠÊï ™I[Ðì튢諩ª*BeòFk^X[±É"™v•SUný•!Ûº$Ìs Oá¢c£ óQ©6 Éçó¦]unHÑ#gÐk‘‡¶ E¿Žæ~Ëe³Yl€-ec/»˜É·¡KM¥ŒøGèJ¯K†&Ù´\Ó5èâœN¦ïLã¼»ÁGòVÒïóñ‡qç­þ§{Ð{œ£"ÅoÄ}Î&ù´\3÷[Îïó;û±«1c€-eC/»xF<‰É„÷˜—ŠåWÞy»óú¼™û{òv²I>-×Lüðõª jø|Ç`KÙЧ°é0à6‹1àÏv€ …à|‚°9Ä=ÝÆK²÷ø?þD]zÂŽ¾ðM²}ò©š6v&lwôŠR·£Ï¹p±Àù&ÖÒFîûæù6Ê€àÖ“òû3E~ü4¹— Ù·4ùа7ó0“¼•|–›=ˆ}ÿä³Ñ +ÀÌì¬ç¨m 93ªÞ¤ù? Žÿ#–yY—hæ sˆ]ÉÏ剫=û%" ||ØÈúðó£Q´„žx[Ale7~å{UÓŠœ Ǿ‹G¿.?. øù¨ßç•só÷ÿ9{*O-Õm8ûs6t:”}4·¢ÎìH£õ|ÀV$î饞Øwq÷°;z)Ú~Bý{Ð>j¾¦ÿ/~ç¡>"ʿȑ¦iDä?é—ŸËÏžÌgîV?5¹Þ[°Z®~WeÈbü©w¥¸Ýîa7%§’MŠ×ˆ{ÀED™»i"JßKáH;7Dä)@ÿ“ˆÒw§íûì‘KGOQ>Ÿ_ªÛ"ò »ÇVÖm£i´>ÀÎ >L•v™*Ÿpk2™ÖŽß&R~¦üþLÎÍǯNX:Xû µˆ,¬e…U*/èD/EXË=–CgÂ=ŽÞätÕúR—DDÊB~µûRU~ãO½¨={»÷÷Tžãë¯g_ë`³?gåçröç,cÌÕ××fÁô-Z:« T ~-~Ø=”{.G/¯ûôøÌÒÁôõ«ê¼vG­°£z>JKªžp«?bv "7âê„Nˆ ‹\]ÐV•“wÄ3Ÿ»~mÂ3âæ‹tD.GŽÞUe˜ø.îèóúüÎÃŽׯMT­`„Ì´£Ïéöx»÷÷Dþ1îøÐ1q%Ú¤0ÍE.E|Ç}‘ËÑ¡cÞ¾?öÅ¿›h¾~ôR„1æ?Y}oeÀѤ•³·éKB§Ç‚Ÿ"—£áK‘àçÁÑ/‚å‚]ˆ‚àý‹þqnEφ8"—¢Ž•="v¤Ñúo•I²O¹ÈšÝz0v&4~9jë’ªú?Œh£ò}“þ’ªuŒ%Ëov™&¾ž~LM¥BgBÏž<Ó? œ L\ˆßˆge¯½2I½'r!âv'n&B§CªªÑè£Ò~iì˱Ø7±Ü“ÜÄ×8ØD”!Ûº¤ü y‹”GÜÓÍ:˜œ›ßñ5ï8,?•ïÛÓ5ãdÞ û½á˜R©¤÷X´y´ÉÕïJßIgîe܃n=ò0~ê1Æ'Ó5ÿwÏçæ=G=ú§ÚÒ¥k×—ÞS¾›vºqÈ·ÉÞ¿/p>3;KDÎCν¿Îçs9å…BDþ¿`2€7pªÇë8\4y+É9úóÕjÍþœ5–ÛºlDÄ:X¾æ^mA Ÿ{=ÞÊË+î#î™ÙmA›™YUO;¼mW¢ñ›“Ýöÿ_}õEW9òcÛé¶÷v‰]âØßÆüÇ}hë0½úš#ÔTªvûB§p?sŸŠÿ1ît©/U}y>Ÿ·Ùlš¦þ ®A—kÀ8.H={ô…¬ƒ9>t„χ}NÆŽôÖ14èz—ú¢Öx Àεi“Œ¥¦R~Ÿ?y+Yý3qwêvŠˆ¬‚U«¸ý/r)BEJü˜ðŽTß “û-ç÷ùýΪ†þ4û.†k.ïtðaÜ‘ë=æML&<#žª7áóaÓ.“÷˜·24‘$Ébµ¤ï¥k'ÓLüðõJ’$í_1Ö=è¦"éS:ÀñFw»ldȲ†‹;ù|Þ5àšî¤XEl±»]àݱ>w»liEš¸:QÛ³›Ë¼SwÌòžÅÙçœþ'æT@ð±zk¸æR(pt¶ ?  Á ø@ð>|‚@ð±åô:z'oNV-œüq²×ÑÛ$•Édj'óîýÝòÓåYÆSS)“É”šJKä§r÷þîö3\Õš>¶¢ì/Ùè•hå³m5M‹\ŽdÉ6IÕæŒd¾£¾ôÝ´ñgúnÚþ¾=s/³ŽÜIé³³¯aŠ3hd«Ïpêý³7q3ü<¨ÿ™ø1áñ\üíâ:äìñ†Î†‚-眹—™øzbôôhe89AyCcgB¨€í"1™Ü€‡nõàÃwÜç=ê5‚صXòfòâÿ(ÙŸ³OÙß²¶N[äB$ði€*k2™&¾žˆ\Žäóùä­dÕCæ:ä'2çœ1&?—‰È=ì¦Ó”‘·uÙø"Ÿÿu¾ï}-3Ô4ï1ï\v.z%jd®/Ì≮\É[IAº¥î™‡3¶.[ö—l¯£wfv¦ï£¾ÜãÜÐàÐ3ùÙÎnÊã—£ø>À¶ >¤}eÉ:>pÌþk–Šdßn|ê?á\ˆ¸‡Ý‰›‰Ðé|T’eY~"§ï¦½Ç¼¥×ÕWO܃î̽Œ{ؾ›vº‰È3왾;ø4¾—vqÕ–§6ÃЙ{Ð}ÿ§û£§–{M‚§ƒ¾ã¾û?ÝŸ¼=:ºþýu÷ [Ï9s/ÃË<Èô}Ô—¹—Ñ·û.PùÖ,XüZ,tzlKEØÖ†à£Ì{Ì¿Ÿ¸:¿÷ûü•Íçæõ7O>þ¤6mø|˜1æñP±NΞÏäíI÷°;s/8Ð;?b߯ŸÒwÒÞao;Nߎ^Ž’™ÂgñocúÂôÝtüjœÌäñO¯Óu÷ ;þc\k‚ fîeÎýý\únÚèÔA›Þ¼œm¹â¡H€C;Ú6¸ÕÖwÜ—¸™Ð´Ä̈́︯ò#mA Ÿ{=^ý¶”Z‚ 4ÉÙ5àš™¡"ÍÌÎèý®~×Ìì ç<ó ~ŸDm†ù…¼Ð)‘­ËVY0ÖÁˆˆ1¦-hú¶22œó¹Gsá³á™G3š¦é×eÐ 73£HÛ²H€C>Þ"i¯$퓟¤}’~f9ztqÎ'Ów¦×ô‹‡×çí9ØÃÓ—¸ú]~Ÿ_Ú/±ö~IØ:mù|žˆôË1J§À9ñE®‡&¬ƒÙØcßÄz½‚ 89£—£Ž ¿W6/¢HÛ²H€C>Þ.¿ÏŸšJU]s!¢Üo9¿ÏïìwÆ®ÆÖ–³wÄ›ºªìäJM¥<ÞösˆßˆS‘"—–oqº7T¤Ôå̇ÜC‘K‘rË€küãCî!4A@ð±%ƒ£~"ªºæBD‰Þ£^I’¤ýÒÚrvºc•Á‡{ÐMfòŽxÛÌ!z9:ópF”DgŸÓX»›¼9i²˜?&b_ÇŒœ5MÓ¯³¸Ž¸8çïÎhSƒ¸§»öµ†LÚ\Ø~rã£dÅDs«Êöm°;z©X3°HŽCÎäôÚê½Ê6}7-î鞾ۺꂶEêóÝú~ImuoE8ÜÐŽ-}µÐ˜ÝËÖe«œéËxï9êñ-wQŒ}9VõiÝ$Uc…B¡r‰ U÷Å4Ïu°étù¢ ÂýÌýªm9>p©ú>ê{׿.+,u×ÞZ\(®=·µåS»¦±$v5î:â._†[kñÖ«ÆD›¿™ª »S·S–‹{톂=“Ÿ½ÉîT¦ÿðõÄH¸Ž´ˆ¡®¹ìܦ×ç»öýJßKž ñ¯É}dä4oE•‡û Ûl<ËFªÅø_äë™[Ë…m&_Zâ÷ùc_[K¶ë]cc_/^÷]q0v-6öEpsJµ´ÑüïJîq.þ]ÌÙïÊ˲mØ$‘¦i+J[ÄM¡ñýr¸èJtô‹ÑgKwnŒêà ۬Gbƒ†!âÁr°Ax±<2NSûêÞßÿ>áìwuÛ{Òw3úÂl674ìí¶÷ôö9'o¦ŒL²¿æò÷ç´ªœ5ûOºí=þMãúÂü‚æ?èqôNÞNU•¡ªxž£žÌÃùw¥*Ûº%éÞßÿ!Ñ{ÈÙ{È™¾—É<˜éísV–¿naZ¾Œ"9\Œ±ô½ŒñQú^†Šät×͹{Oìûøá#C¼Hé»™n{O÷þžÃÃC³²Æ •¢'7ê°î!¨­%^¤øÍIï°—ˆyG¼ñ›“•±ê}÷þ¢ååD”º“î=´¢–ÆØ¼Úi-µß/×€‹ŠÍ¾u‰¦ñO>í9Ø{øÈP6›«=ÆÑìÞß3y;Õãè5¾‰U‡{Íí ¯ÍmN>`gý2+r"ê±÷T½ŒärúNjâJtôô¨¾0t&ü,0÷h.t*¹1ÖLÜL$§’ÁÑŠ…ú›ÈåHøth>;7ävE¯”?^Ž:ûœsgÊÂz#aEñ¨ÈçÇ.þûŪl•$÷8—¹›Ÿ_ÏþšÍÜMW–¿naZ¿*Šü"¿7>Š_‹¿4Ì™Èúž5y3AE>zzôÜßÏÍÿ:7öYpìÌXu-]Š qÍ?šóz†¢—"MAZâ<9•ôõP‘{FÜÉ©äŠÕV¾ŸÿuŽˆæ[®±\.ó`e-5(Œ±/xµÙZªÛv«ïEÝF¹ñ »çfg‚§‚¡³¡:‡£bssæff܃ný›X{¸×ØÞðÚÜæ„àv^ÏÇ\v®êe|4úÙ(™™³ùçZr*ép‘{ØÍ¹±fðÓ õrfÌTýæËÜˈ’Ä‹Ô÷G—Ñgy˜q»9‘> ne¤¯O“P™‰ÝÑKD3³s•Ù6,ÉçAbÌ5à’ŸÊ~Ÿ¿ªüu ÓòUY$g¿K[Ôô ÙlNÓ4×w£œ‰ÈÕï"Æx‘822™‡3ùäß– IDAT½}ÎôtU-Í<œq¹‡8‘³ß•y8ÓäÔ)ý #í•DQäEEIê’* PùªîBß_|D+6Ѩ0ƾàÕfk©íYlþ½¨ÛH22Î~'r ¸’·“µ‡£rsODlèOCµßÄ7ioxíøžŒù€-¤vÖUU'oNÊOåù'+®[[w[õö[ùÐcã’s¯£·zá‚fµZ‰HÜ-¶S’±/ÇBgB‰­Kbµ.—Ÿ±v ³ZÁÏ‚ññè•hüF<ðY yÎFF/GCgB£§F™™Å¿Ûíöª‚é¥eŒUÖa;Ï$o%³?g+·Îkº`SŸõªþ¯gyˆÊ»¼ÌŒˆ""áó•Eäa¬àìs¹FÜö½öñ¯Æ—S™ým,t&”ý%+í•¢—£úÂÐ©ÐØßÆ’ÃÉÑS£t3U¹!Ë®•›^zÃ:Xà/ðùpó’Ô–¹eaZª.‘kо—qW<ì°aÎKo""/\ “™jWГ_üêb߇}‘¯"-wÇ(RæÁlâf¢jGü>¿ÿ„?x*¤wã3ÆÆþ:fäàpvÍ=šk^K- íµ–åï—™¢—£Ft^·ÁÔm$c_Ž…Ï†GO‡¤.iüÒxó¶!Ú$ç€ËÙçŒ\Š49Ü«mo°ã™ô©®²O¹È”&ë _ŽÚº$TÙ¶–!Ûº¤ü yö¨·"R´­Y'é»éÀ ß–*ŠÛâÐô:z+§ƒ@ìÞê9Bá¢cCÏlœ-ûìM½`[ªx(l—Cƒ&k³ÕÇ|äçÿé°ÅbEqüãÍW6™L8¢°j[°³E@ð±Yò/ò®Wàd@UÕ™‡3‰±ob8f[>¥ÀZbæ­\¸ÈåÈè©Qý©ZÒ>)þ]<ði ø× ÛvÄ9GñP$À¡ØêÁGúnúþÝågÃ:>tƒ›´Í{Ì›y˜q ¸’·’‚ T&¬û©ÉdŠ^‰Æ¯Åçsó©©”÷˜—ˆììñoã}ìCSx«äù™Ù™-Z¸"ßrÅC‘‡6ƒÿ¨Á)/ioýûk‚§ƒ¾ã¾û?ÝŸ¼=:ºþýõv>AÿŠzy'¾ž~LM¥ü'ýÏžêëû¨o‹—EÚŽEXGv/äVpÊÌy—¾›Ög:òŒx’w’m~ê?ê×{A\ý®ôtæ^Æ=èFä°‘¶tð!í•äçËQç|òÇIý½¶ é`Œi57¸7úÔxŽ@òV’s>ôç!«Õšý9‹v€àƒˆÈuÄ•šZžß:}7ý:ª¿:¾È‰ˆ/r¡S¨JØüS}…û™û…W…‰«®AÚÁÆ)r*j­^:€àc“Œ‹^‰NÞœäœgÎOÃgÂúGîAwâf‚Š”º“rº«6ÿ”ˆº÷w§n§ˆÈ*Xk‹ o¦)df g&0323¾¨QU€àc3H{¥ä­dôrÔòžÅ=⟠{–âÆ®Ä&oNš,¦Ä‰Ø×Õ“4ÿ”ˆ7áóaÓ.“÷˜7y+‰v°aTM#¢ü 95•LßIW½ä§9"Ò4µùã¹ß¶ÚÙêbßÄ.þ‹úûºßuïï–Ÿ._"LM¥L&Se¿üTîÞßMkš /÷[î°ë°Åb±X,ÞcÞÚpYÓ´!÷Åb±¼gñóæóùÕ®°¶ZªÕNe®ãqi¤×Ñ;ys²já䓵ϔoy¸›¬¿³®¹JW5=cKëÒ`¶ÂygïÅöÚß­>àÔ5àšËΕ^—”ß•àçË3|è×MJ¯KÓéiã>[ý95-?%¢¾?öÍçæK¥RéuÉ3â!ظž•ˆ”Šß÷‰÷˜?÷x^[TµE5÷xÞ{Ìßcï%"uQS5uë”9öMLÓ´sÿý5žøÎwÔ—¾›6’¤ï¦íïÛ3÷2ËáÈ”ÞÒ*Ûa›†F†'êKU}©J]Rà³êgØF¯Dí쪪ªŠ*í•&¾žXí kSª±EYö—lôJ´2JÓ4-r9’ý%»ªÃÝr÷7eïZnwݧg´´ãÿ®Í²u¾VïVð;Œ¢ä‰–oñŸ¿èp¹\áóË?4µ—êÖ™1©êTdL|ÇÓ'¾‹'"¯Ç›º³ÜÏ‘¹—‰^Цï­G¼ö®­ Ïž<óð±Æ:XäB$}']µBæ^&ðq€1Æ:Xð‹àì¿fW»ÂÎãý³7q3aü™ø1ÑÎÏŒö#­¬Q+]ûoçUö ï³?g{½¦]&QãßÅOÇÿ1Þcïi”•¾Ð´ËtøO‡Ùò÷ů-'‰]‹ùùW{¸ë¯v/êÊÚBvKÝz{Èþ’5™Lz˜{œë–ºI¿T·ËdÚeê9Ø3ûÕÑáÅ¿>®­ÉºµÒêºÕ´!÷PU5Öî²¾9c£uS5/¼žJ?ޱobͳª_™ Ö4ö¥ù‘ª:jñqË{g¿Óªê6ÎÊü릪ÛëVEÝòš7ŒvšYË/HûmÁìL…År—†´WR_*•©/[—DD|±@´ù=±ob‰ÉDÕà&ß¹Ýúu–ôÝ´>ÌÙ3왾;MDé{iב:7Uɲ,?‘“·’ú|»íHN%Ÿjÿg7n#¯óy«֦јЙ{Э¾T³Z\æðŸð‡Ï† ¯ ‘K‘Й±Ü˜°nVú,‚¥B)p2:ª›³´OÒÿ«%¢ÙÍR‘ìïÛW{¸¯CY[H÷ [o™{ÆXæAF¯·}æÃÒëRäBÄÒ_U6EQ"—"íö/6n¥Uu½-J¾£>#²©Ýe½Ûßèü¯›ªIáT¾ã>EQ²¿f+ÖfU·2­iìKûGŠˆfΪ/U¿ÏßrM#ÿº©ê¶ÃºUѨüÆMFófÖæ¤ý¶·qÿÃêWjçž”ߟ5yùŽ{”ߟ•`›Óbóc½¾¯ª–½t®T*Ìggîÿ”,¨ 3“ñ*¨J©T(• ׯFç³s›XKD4ñõĹ¿Ÿ |˜¸:Qùc¬P(ÔMuÿ§ûO¥RÉ3â™þçt©TºŸ¹ï9ê)•J“ä­¤‘¹ñFUÕª…-Ÿ¢¸‡Ý¥×56S“?ÛYamµÔè#›Í¦¾TK¥’ò»R¹¿ÍÒ¾^Q3…W…&Y ‚¾B¡P:…Fe‹\Š?êõ¹iTæ&‡»QñÚ9”µ…œþç´Þ\G\cs ¸J¥’{Э·×€Ë=è¾ÿÓýÊFD׿¿Þ÷Q_›5ß²•VÕ­Þ–Ô—ªÍfkg—¥ª[øª&¡o·ò8Öͪne6ZÓØ—–Å®¬åw¥T*^*³ª­ÞÊü릪ÛëVEóªnÞ0š7³6¿ í·½·}Ž˜{²T¥>|ldðqîïA=ø¸~-Zyè/å÷ùR©½|nn³ƒý¤Uz]êûcßÌìŒñ‘ý€½Ü­Š×¬Ç¾¦¬ƒÙØcßÄz½‚ 89£—£ŽzÛh4óar29;;Öþ¦›µÒ•%¬ìEks—ë¦j9m£ úàƒªãX›Uû]±Ë‹]›J/ƒ¦iµß¦&W$kSÕm‡u«¢yù›7Œ5|×Þ¤íaÌìLÚ¢Jœ‹KßÞùÜë`Lä'óåè„óç[aÌGù»m³Å¾yŽzôx¨ÉÄwDäñ¦n¯˜×nhx(5•ò ¿ÑíÜ™{ïQoìëX£ Á5àš¸:Á9çœ'n&\®Õ®°¾¼#Þø8iÅ03¥¦Rœóð…åËý–óûüÎ~gìj¬ý¬ZÎ"¸ÿÚwËâ5Q·Cî¡È¥ˆ>È5àÿÇø{Hÿ¨á̇fòðå~͵sŸ°®y+­,aîqŽŠ¿wö9›óòY¹nª–Ó66:޵Y5ªÌæk®êHE.E¨H‰Þo“ÆÙ2UÝC\·*Z–¿IÃXÃwíMÚÆ|Àμìâ;ê.¨JáÕŠW© ê/ýϱ¿æÍlîe—ª%ׯ]×Çsè#98ÈL¶.[ÕB¡À«ìñVU•ÌT·Ï¼ýË.µ¿ÏªR)ŠÒ÷Ç>½×Ô=쮽0Üh…7¬¥FÿŸ^܃n[—-1™0&SI2“ ׯ]_^x+)í“Aˆ^‰Ö­™ºYé½Äd&÷`ý}YÞñß"z&?ky¦îán^¼–W”j ©ßu¢_ÙÑG2WgΔƒK3%SÕ#„îÿtßuÄÕþEºF­´êR…눋Ìdù2MÝ]öŒxŒîýº©ê¾’úRíûcŸÍVsk²jX™M×lÙ*óŒ^‰²ævCë6Ϊ’Ô¦ª{ˆëVEÝòWjÒ0š7³ö¿ m¶½ »ìbÒw#û”‹LiJŸ _Žê7#Àö•!Ûº¤ {hrmË å­&S9;>pàxì´¾ÏMÚ/©ê¦Í"h2™Ö0m×ÚRáQKá¢c£åÉž6Døl$÷87ÿë\“Gê8m¶Ú©,`û²Z­É[Ig¿3r9ò¶¯úÁ¶°¥ƒ¾ÈCgCÉÛÉüB^Ú+>œû{ù.ü|>_wäÝrøÖj…vB]ã=ë`®~×ÄÕ‰&wÏC;Aèû¨¯ï£>TÀ»#v5æÿØŸÏç]®Ä Tlé§þýÒI~"—^—æÍ©ªjLÏÒòYëò0‚Š¡Š³Ï¹<: Úæ;îS~WJ¯K÷ºÿ†? ßüõ KÛ5øHßIÿ,ß $á3áØwå‘Ì-§h\߇‚0ö·±ÜÓZ ÀN>¤½RåíCB§ ¾T©æY-FPwÞþ–#¨ÄùøWã‘ó‘F[¤•€F¶ô˜ÄÍ„wÄÿ.î=êu ¸ìûíúÓJ¥RåØcÿ äBÄ=ìNÜL„N‡ô{äZNÖg³~LM¥ü'ýÏž<«]§êN׿¿Þh‹åð¨âAP©ÉðR@ÏÇâøÀñL~–šJ‰¢û6Öã虼9Y»Ú|nÞsÔà œ´’sõ»ÒwÒú“uêF´r²‰«/]l¾EÿQ?nÓØÆÁ‡®ï£¾s?wÿ§ûs³scgêÌ1¬-háóa¯ÇÛ½¿»ýl“·’œó¡?Y­ÖìÏ-¦d,øiPTz“-¾áÚ>6™u·•óåi¶8êvl´ÿü…ÊQ¨-FPvQ³uÚV»E¨ã ­^ŒÄ øØÞaïøWãòS™Š¤-hãߌN”GWT>k åÃêÎÛßòa+"M‹\Šøû›mÚÀU2327ˆ.̌̌W†œ€àc#E.E23½‡zM»L’]R~Wôyû‰È3챊åGà$~Hxz%I’ö/ÏV¹BòVÒ{Ì+Š¢ãàòŒÝ‰‰ðù°i—É{Ì›¼•¬[Ói¿Ä¹qëMÝ-B;TýÉ–/äÔT2}']õ’ŸæˆHÓT¾¨nµ’[­í>rI]x+…çœ7š½FÕT½…‹{ÄÀÇFh’ÃÚ*¤Ö›ÔÛ:g¿3y»úK¼tö;ÛÉ6þ]ßðaß™ÿ_üŒ1ÖÁ‚Ÿgͬ6‡§üTñ%©Û)÷°{#­lüÊxðó wÄKf’öJ_Oè<Ýôf¼¾Ûzób ðnõ|0³eâj¹[[’z$©<3›,Ïë=TÜÌBòEî÷ùEQì=Ô«?‡Z—œJJ’dÝmMßIëKæ͹\ÖÝVi¿”ø1AKݤëÞY>.?óºù¹,-=7ØÚiÍ=έ6‡uþi®©îa·$•ë¤\°Š:1Þ×V þiìÛ˜þ«´nVê‚êv[w[½¯Úà!É^7þC|9ªø>îõxWyÔ-^í^X­ÖøwqûA{eÛ¨-d¯£Wy¡è3V«uîÑÉOå^G/¥ï¤­»­ÖÝVg¿³vº è•häB¤¶&£Þ?/ïl¯£wæáÌz5ãæ·êØé—~¼¯Ñ Uûåj´­^G¯~ƒ¡ü¼\Eµ•o¤jÙ$jW¨ÝnmÍÔÝ…Ê}¬*RâÇ„¸Gtº :us¨[ÚºÉ+«½6í*,}m¤½’úRYñíz©Øº$"â‹…Íýn…χýÇýÊïʹ³çF¿5–ç~Íår¹Ä÷ ÿÇå¡ÇŸ|ñIètHUÔÈ…Hèlˆ–úŸ×½C¾ùƒ@5M3nófŒÕ}¶ÀÛx”h£1áóá¡? ÉOäl¶ÅM쵨aæÁL£¬BgCþc~UQ}'|ÆóžªHû$"ÒOosæx‘7½âßÅ·U}ŠW'þ“åì£leÛ¨-¤kÀ•yуÆXæa†ˆÒ÷Òú¡ñì^Žª/Õð™pe«ÓË–ÏçÛï¸R^(Mù†Í¸åÁ5ŽÝÅ #—"ª¢zFV™y4#?‘½Ç¼ÆÍ ushTÚÚä†F%Ù¾ÊÓ€fŸr‘)MÖ;¿µua|åö–!Ûº¤ü yö¨·ÖQ>-Å¿Žý=œû%«¼Tœ‡œÖÝbeðÁˆâ߯z:õÙl7…ÝnÏýš«šþ×jµ>“ŸY…ò¯¥êÿ+‹dÝ]^XçÓõ;Ù×ÍÙºÛª?y îŸíä°Ž…!"i¿47;gí´*y¥ÇÞS[--+Pù]ÑéºYIû¥\6Ç:˜>„V~"×-[ôJ4ÿ"½ ž J]RèL¨n™­VkôrTQeAéuôNêìR½ã[ù¦¶mÔ2}7¸™Hüðz¼Ž3fÒwÒÞcÞÀÉ€{Ðív[,–àçAgŸÓ^fµZ'®NÄ¿gîeÚ?ˆ¢(ʲld²¾Í¸ùÁ­:vrN&3© ª³ß™Ëåš|¹jÛFúnzâê„^EÁσµÑseª–M¢î UÛ­{kw¡r«Ê3ÿë¼Ø%òEnw”7Q7‡F…©MÞ¼$o§ßW}«ç…‹Ž}Œ¶øôê°ó¨¯Ê?ÊåçòÛ»ò *Êò¼­KÒU¢Âf†h ùºß ý?¦ª¾ÐØÕXîq.÷ëf>tP*.}›‹´éÓìjšfí´‘h[´‡hüÏ^7+m¡ÜÓÓ¨›GçõxýÎsgÏ¥n§*¯;Ôé Èå¢W¢T$÷°Ûñ¾ÃèQoÿøÖ¶ÚBºú]ÁSAÎù\vîú÷×cc|‘ÏÌÎ$¾OQâFÂÒï=æef6ž6.4dîe4MS^(b—Øfý‹]¢òBÑû~ô&‘œJzz×¥·<¸ËÇnA³î¶¶ùåªÓW×ïÒoÝš{4çšlÑoײI´ÓfêÄÚ] ÆóIêLju0c4Iݦ6yË’l_¸ìʸZ9úEÈèð0®¿HR9Åéõf²|.oƒwÄË9÷÷WŽmÜ„®š}v%¯'û>ûæe[§M¿h]÷fÈÊKò-+°nVB§ 7$ιÐÙ0Ò’öJö}öÑS£Ò>iùL\Où~3%~LŒž5¶õ&Ç·¶¬ƒÙ÷ÙãßÅíïÛ­‚Õñ#z%êxß¡Ÿ‡¬Öô´ª¨Ñ+Qï±å¸<~-~î̹Ú~øf§íWòŸËw§ï¥›ÏH´ªÝl~p«j@}Y}'Tû_.ÖÁ8.^ºØ{¨·e¼Ò²I´ÙfÚÙ…fÁ´^3šjÌHY¿¦6ùšK‚à`eü¾¨碭üÕšÏͱÆA~2_ŽN8/p^ØÔBº¸33T¤ôtó›ñrsž«ß¿¶<¶‘ÌÔhä[âìwÆ¿sΩH©©TÝÙ,6ÒÐàPü‡8iüÊxeµ¤ï¤9çã—Ç[T`«¬\®äT’Š4}wÚ}¤Ù=,^7}7]÷^úú¿};­W&ü'üú ²eñZD5…tqE¯Dõ+®~WìÛ˜1š¡×Ñ«s´v¬œöÐLÞ£Þ\.×Î}ºàÁØ7±äTRïe;3<\¯f\ÿà6øåç¨H‰› c7ë¹lË5àŠÿoxˆ+RµlõWhõU­» M\¼|‘Š”ºòŽx›äШ´µÉ×\+9çœuXTUQUE´‰œsâÜf ¯TUUôøcs ¹‰}³ŠÖð…ðõ«×›¬9quâ“Ï>±´WN7çt¯ê1Ckf ð |˜™÷ˆâ1}/:ªZáí î€ÓÈ…ÈìÌÚvÇ¡Šiý¾Oø?öÛí+êªn®8õ²Š^Š&n%¬¢uòÇIc꿺¶ŠÖØ×±Ø7±&_®FÛrqQ‘k+SµluWhùU­» Íj^’Ä=bæAÆFZ7‡F¥­M¾æ’l}púnÙô§‘ !¾Ø¢_C]ÔF¿³¿ùÞiê‚zxð°~OòÖ÷†£¹ßÞ@õUÁ€SØ™‚§ÎÉOr¹Ç9­qo§½S:¬¨+€wZ‘b×bžajbGÚÐàÃd2­Ëäù|Þf³áàmGVÁj=äì=äDU@âÑñ¡#u3…ª@ð±UØÚMc;€¢(Û«ÀoxÑdgÜÃÒ¾m9à´Éý€à£“Éû&&îM»L©©”±0~#nyÏâìwá…ÉdªLUõ/l;›vÙE–e}¾aï1oéuy ÈìÃYõ¥¿ ]ÿ¾þ-Ž¥Ri½ÆŽÀ†Ùô97 ¥üâ]ýÙ´à#|>ÌóŒx*g»‹\ˆ0Æ'ÒÜÓ °3mÚ˜º?…m]6"b,¿Ç±@ðñÖåóy"Ò4­öNZ 2@ð±þ"—"T¤Ä‰åɀ͔šJqÎWÖOj*e2™RS©–kê¹]w•ÙšL&4€|ľNb߯Z®i?h¨Ì3›l°5>X®I‡AóÓ¹ü\žÿu~úŸÓ’$˜ÛòM IDATÉÏei¯ÔdemA{ûü–²€v¬±çC0J+µÓ‘¿÷Ÿð3Æü'üñkñºÑŒþ¾ò_=b8ì:lÚe:ü§Ãš¦kƾYw[­»­é;é̽Œ(Ц]Ë×t²?g{½¦]&QãßÅk³mÿ71qÏŠ<`‚=ΨŠZ_Â(RüF<øYˆ‚Ÿã7âTlßèO}Ç}¥B)p2:2VËýšSd%~5:šýyV~"'o%½Ç¼ú§þþðÙpáU!r):ªÍÖÐ(Y–«ò€7Q޲O¹È”&ë _ŽÚºª¯’è1G[‘Qj*û&v?s_ÿÓÙï yFÁ ø@ð>|‚@ð€à|l¾ÈGOŠ¢hÚeêÞß}ñß/¶ŸÖd25ù4ŸÏ·¹&¼CÁ‡ÿc¿´G’ŸÈ¥×¥¹Gsªª†Ï†ÛL«?³¦ûA{›kÀ;|¤ï¤ƒ ²FD‚ „Ï„cß­Ïófµ ÇÁG5i¯¹1þ:õ¥ZŽ4ÍëñZ,–îýÝÙŸ³úB“É4þñ{U\L1™LñqË{g¿S9ô*W0Þľ‰‰{DÓ.Sj*elè°ë°Õj}À|$n&&œEqôÔhj*•û-g|:òŸð^¢—¢þþåEffgªò™}8«¾Tý>èLˆ–®³Ô½Ú"˲üDNÞJzy ùŽûEÉþšEsxs&ýœ}ÊE¦4YoìLhürÔÖ%m|gÿ5›yÑ_‰¾ã>"EQ–eÆØŠ1™ ¯ úe“©¼k&“Iù]±uÙø"—öKŠ¢T~Zµ¦ªª‚ T.EQ~"³–‘÷ˆÛ}€Hþ…lë’ò/ä Ûâ&¶ØRç…‹Ž}Œ¶Å­¶}õûû¹û?ÝŸ›;3V® …|Uä¡Ó#*¶.›þQ~!ß|[zä±âH,äõ<õLà méàúÛÊ97þt|àÐ4m9J(¶ÊåóD¤išÍ¶êB}£•wçÀÎ >¼ÃÞñ¯Æå§2I[ÐÆ¿œè¹Ýé{i*Rj*Õ½¿»y>‘K*RâÇ„w¤<’ƒÌíÞðâñÆoÄ©H•C_`g‘K‘ÌÃLï¡^Ó.“d—”ߕ蕨þQìJlüã&‹)|6œ¼™lž$I«%}/½TNîöXEk;eˆ^Š&SIqèìs¢¹¼9óV.œÍf»ÿÓýº BíG•£A+ß}96öåXåšÉT²vͺɅNaæá i ZíˆX-<Û¥«Õš¹—áœG.G\.T‚·+v5æÿØoyÏ’ý%»C…¼!óŽßÃ7œ™ÃwܧÏ,ë=€àv®Õ]v™¼A•mk®>Ls› =€à| ø€ígKÏóá?vØxϳà|²vúG‰[÷W›Ûj“À»|‘.8ÏÎfâ×¢¡Ó‘7Ì 6Ѷ¹ìbaÌÙïÎý’Å1@ð±A E^»°òÒŒñ¾°¨EÎ>š¾›2V¾™¾› ~áõ;<÷hV_8÷hÖì°ÿØá±ÓŸÌ?Ρe¼ëÁGóÌÝ”³¯­çÊNÞŒ;ûÝ×’ùçrÝ´¼½’û[dü«°¾dü«pàӱĭûÞ£¾ØÕZÀ[²ÕÇ|ݬCprúNÛI5÷hÆw"h13ÏÑ@æAºvÏÑ€…±ÞC}Æûû޹G›Mt8œm†8°ƒµÕ4ÍÂY;…º+X:XÕ’àépìJä⿇ˆXäBTÚgGãxƒö5ã=ë ‹ÜÒÁTMk3¹µCŸR‘2Ó‘Káø÷I4€·a'L26÷h¶ÀyêvÂXâ<äÌÞ.g¿ËÙ¹:¶¢?  ÁìX«»ìâ;ŠkÛ[þ…ŒJ€Í…ž@ð>|Àö³uçù0™Lµ K¥RÕ:UKÁÇQE“‘À¶ƒË.€à£)“É4þñ{U\šÑ4í°ë°Õj}k¹pÈ=dÚe:ü§Ãš¦Õ晚J™v™L»L={fÿcM`}mËg»‚03;S¹$t&ä;î›NOžm¹0z9:}`:~#>ž¸:Q•§÷˜wâë‰àçÁÔTÊÒÿìÉ3´’7‡ÉÍ`¹A6‘}ÊE¦4YoìLhürÔÖ%mBWŽù0™L…WÖÁ*?EQ~"³–‘÷ˆÍ*¿+d&mA³´+ŠR•ça×aÆØØ—cÎ~'clç¶.i#CMi3°.*\tìcÛµçCVÔÔB^_hë²µX˜Ï›v™šä™¼•ôóýyˆˆfÎ8>t !nÍF ÛÔp*‚>€#ŸÏ·XØ)”^— u²êîgî^&®N¸ñ,õxG¼ñq*RäR¤ùB÷ ;÷8GEŠßˆ;ûœµYuïïNÝN‘U°#R`½˜wÆnüÿìÝhÙÞ?ðO¾¤p]˜@: °S,˜r…›°ÂÓ°þሚ₠&¸àÍÝ {ÛgáÚÜÂ×Íã~£ôI]pÜÍ »¤‚’®4Â#Æ?¼4Vš—fÁŰ sÀ|ÿ˜tšæWSµiÒ¾_”v:9óëœ3'Ÿ™93¹ñœôD¦#3Wg¢ßD›ŒŒ^z}Þôôã #q'Q;«øÍxàó€÷´—¬”¸@yGÊÓ\뉥ž¸¢à2 @×K?w#¶›üÉv›—>ªŸ$Vù¯9,ô ‹‰H]QAh>òÁÿ>h²ˆáO†—s˨ÖïÑð°›ë¼yfe™Ì¢ò47|.„Û-Š©¯/{þþUË¿#ȲÝ!óSÄwÆ|Øn…ùÖ[×-5Å8óÑ*»Ýž¸pq‡§ÃòQ¹ÉHh?®sÒ›Ö58Uì¿¥‰'Έ!÷ºØA‡ºªQ«¿[Džu=Fô‘›ˆl ;oǵ®[nŠ|l*z=êÿ³¿P(ÈGåøñ&#aš#+ãVbuÍÒc/½)VÖøµ’‘•X¯ˆ¬ëþ¢·máwŸ9ÖõÖnd>:¯uÝrSŒàcS¾3>ß_+#a‡ö"k¹1²Xlå£"|ßPéûì$„Ó»ã8¸õß}ýȰîg3þ½%;±u­L¼”´úM1‚èzUûFÅ•JU^‰d ‘@wFZyçÅ™Îl]­¬òS3}9þ°2ÒqÙvÚJߎ|ëÞC²òQT«¿QÖÝ\ÖDD2¢«Z×zñGÛB&”tä¾Á{ì’ï£Ýg¢-ç«"‡ŽˆakéWŠÈ³]Qî¸O­ƒ[×F‘Ç›"鼪/*‚èrÖõcÄ’V´ØìÆÀ†Ã&ÔÄ݈ëÚ–~À6¶®Vªút=½Þî M>´¡–1¾ªòÕò·K1ÿÌ.¨êúÀzm¬·â(ù¹¢®à­:]OØ'•; ¶ö[­x$tïw¡°¹Ð©­ëÆÄæ$fúê¦x;uÁ‹å’óI‹Å’œOVŽ´X,Uйôê{Ç‹ùgІû»ÐÓc×èÙâoèúYÐÁ­ëV›âí S;^ôÛhà\ úmtìäXí§Uo~Ž=bÌÖJ5Ìü„|ìà ½6"jñwïTÚPŽÚºn9ñv²_ÞÙß¹ÈòMÒMNg¦#ýû¤6çªò\q»E‘$i1³(}$™'<v¼…ÂK¥ŸTxÙ¾7Çâ­¶{YúQF>2Üú0잢Ç[m·_7¾Õ6ÏEçFæ#v#æ?ëgŒùÏúc7bá+áêèi- É>Î>dÍö÷õ‡/…Ÿˆ(9Ÿôžö‘ã #ömlø“a"RUÕïó§î§ä£râvÂxámÝ”ÐöJ–>Bží£[†ÝSôÈhª³û|è»ÿë8ÿu¢ßFÓÓ–5™e¢ßF%VWÔÐÅwÌ;08`ŽLÜNpÎG?µÛíÙÇYcd¡P°ôX,‹ýC{aí)`ÊseùÉréMɤiÚò“eåyý‰òˆÌ9œ ,Ü]0G }ƒôíµ6{}V‘Í‘•³m’öPð» žVöˆeŒM|9»«›>÷kÎï󻸣××ÏŽ $ï$‰È.ØÍk1žOѡÄ=ìn’Þ»N½ÛE§ä|ré祪ѓÿ99ä _ ×Nÿ1î=å-®CCë#oÆŸ¼§½d¥Äír÷ŽèÕ¨×çM?L;:wMRÀ{×éÏù€÷«ýÏù0˜Ïùø?È h'€à| ø>Á ø@ð>ÚÇåtÍÝš«9÷ÓœËéBÉ øxÿ²¿d#W#•ï˜UU5<Îþ’EÉ øØÞO½ñ[qóßøOñ±“c(6ÛÅwÆ»3ÿÞˆúOûͳ³.§ËÒcE1ö]9™ªªÞ1¯ÍfÈ>.Ÿ#±X,3_Ï 9†ˆH]QÉÇ,=–c:fžVIÎ'-=KeèÐPæ_Ô €=|H$"2®³dþ!p˜ŸúÏúCBÚk-|%œ #ƒSAÿY¿öZ‹\‰øÏ®G*‚ ,f‰hüü¸ïŒ¯¤•çÁó婼§½³×fKoJáKaÿ9?jÀ6±”J%"ÊþÎE–o’nr*83éß'µuå,–R©tù¿/ç_äg¯ÏþåÏ‘$é«ÿúÊ¿!©N–žòHQEaŒUÍJ{­±^FDöíy%Ïzç\Ü/_‰è˜|Œ16ù÷I÷wÕ´»Iá¥Ò¿O*¼TPõ Íò\t`Ô·ÚúÎøâ·âꊿ÷ñU~¤®¨¡‹!ï˜w`p`ýûu¥P7z0"c*c˜1¦®”/»$n'8磟ŽÚívób ¼w]|HIÒ)ð×€t@2®Â˜ä™s8X¸»`Žôf3ú¾Ê‰ˆ¯r¡O0G>H?Ð^k³×gå5`ïDä÷ù“óI¿¯º+FîלßçwqG¯GÍ‘žOê~ŠtJÎ'+ψT&ˆßŠ“NÉ»IψÇ908¼“$"»`¯¼¹ödðqÊODU×\ˆ(þcÜ{Ê+I’4¸~F$z5:óõŒÅf ]%n%jç½»5g±Yâ?Å£×ÊQKüf ­¬Èh3M'"ÞüޤîÜ“˜ û.4\> ³ö^ιNDĬdc¬ü¯^Ù}t¾qgbÜJŒ1Ûî}H.4\> »j<©«¼²ÞÙ#ÎÉÚ­ßÕ\gœsÎ9éYm¤sNÄ8'A@ü€† ‚ØyyUåœ3+q8‘`e¤Y»øKšg½L%⫚¦i6›ˆ¸N…UêïǾ€† W#èp mR|•7ª¸¦i¤k»a“¬Œ¬Œ1Ƙt®½.£µ×Å¢ªî¶kÃh¸Ðp!ø€®S¾>ªk¤síMùº£ÍJ»£“&׉ëd´MåSšÄQèh¸ÐpÕP· Mµ|U%»]{Cœóª ‹ïq7ÖÚ|¾AçÌJÜ8«sí ³Y‰s^|]ÁÖ‹bØC Wþe!úC,_È;:ücÞb±˜û=—Ëå–ž,«ªêt¸þà%Çà×´Ågcîa·¸¯6\> ]û0׌ŠÎuÚ•—$¸NLçD6Î5Ò”8À^k¸â·ÊsE>"/>JG^*Däv‡¦¾úìD¤ªÅô£ÌÂÝDb>•{š“$‰‹Ù\nòËqÖ»c-ÆN5\|X,–Ú‘¥RÉb)?º‹Æ9éšq‹3j¼F¬î„òTYüw†kšÆË燎á#‹ÄÊÊ÷­éœtÎufÓ5s®s®sក=Ôp©«ªç¸ì8è ÜŸ¼£^Ì;u{ížãyx8qq‚Ô¼ã ÇåtÅçÊSÅát«sƒ3¨Š6ytí7 ˜y£¹ÎÉʪN9V ñù¤4( }vAç¤SþUqáaŠ vg›wÑMUÜ1¿¶]ŒsôöØs 9;³™Eþóâð>Á}ÔÃ&ø°ÇHf³‡NŒ=ÍzW‡À£wb…•ë<¿Zt콆 —] }û°ö¦Ü{kí=ŒÕ«€K?/ÕüøÈ˜¹‡¨«<>—_Ê.9¬·³N'T>nˆëd\Æ­.{­á""·Ó•}˜¦^Á}ÂË]Ìg9gÅ~QUUA$I²sÎ&è•2ÔK^Ï'äãò4´®î»Ûżc±X¢ßFíÚíÚSwSéûiQ-=–ä|²ü¥ª£žQKåØŸŽ©ªjN5óõÌcˆˆ’óIKÅÒc:4”ùW»Ù6ïÃkw©UÜ®V>™¹ñ'÷$ë?å%«ªª®ªêªJVî””ç¹ÜÓlá¥RõCœ×Îd@¨ùv?Mfµá‡kÛµ¾¥°g.ÒyþE^[Q'Ïxùï¹b&­ds‘© ïiÿø—“þ?¼§üñéö{–rÓÌÙK~Áø¾×š78Í[³·hë:¡áêî3¹'¹¼’OÝK/ý>¿òTIÝOyO{KoJDœ F¦# b7c¡ ¡Ùë³ÆT‚ ,f‰È{Ú;{mvü‹ñä|ÒÎÿìé3ìiÛGÓjÎééÜxVOÕSŠs¿/ö)/òÆi@f%²2»`ûí‰ù„ªòb1OĨ‡lDD$;9V?´G 5ÊG?:ß|K`·7\D¤¼Ìû¿'Q,Þ‹%þRMé‚÷¤W>. ‚ P>ª@Ÿ€½×pQ.—óŸõsÎU§œžOý’õžñ޳ÛíŒ1Qí½öôõˆ²ª9O¸ä3v?]X)´ózG‡4\Ý|}‚¹µ] …‚¥§Î-3fÊÄí„÷´wôÓQ"Z|´èü؉=m{k|Íf­€T•¯òüËüR6§<Í•÷ V^èDÄÕU^Tµ™«QÇ!‡û°SìP6RÕâä߃™_²ÃÏüOØHœ{’ ] ç~Ï ‚ür|ì¤×L™ý-šš¬;«·>F€]ÙpÑRv‰YI%"‡‹¯p–ÉÉÇe{/c½ån"ŽCÒ’Ó¥H§S¦UNŒ‘•‹E΋Œ5k»ÊáÂ*ÿÇdæß™á‡£_Ϭë霈†¹Â—¾ OÏ8:¢_G64†×píæ§BŸPÌ›l¢Ð'ìn’6<=3:â‰}KÝOE¦gÂWÂD¼šürÜ}TNÝM…§ÃFð¹u‘cßÅBW­CTnÎ|ìņ‹H]U×¾ZûH$+z³ÙÌÄÌʈ1²’Ƶ¢ZTUµ6Ô:äªß‚]„Î¥A)9Ÿˆ\‹„.„j¢ŸÜâ£t"¹¹:¾îä†k7?^Ý3âÉý–#b7cîá:ßIƒÉ;I"² v³G*l­ª7“¾þ螪c7ÈTqŸ$J‚´ŸUýˆÆH¢Hö™ýC"*æÕ¼º¢n˜IÍœ-ÊžQNä>"§-#ó ÷Q™ˆ<'<|µ¼>éGiÏ ' |¨;«µÇóõmi´¥°.®“$IªZdDÌÊÄûEÁ®<ÏóŠD]åÒ~Iâ:q®*Š’™'+3n¨1Û®¥ìRåÙ¥ï§EIâ: "§î§«Ú:*·WlôO£é‡‹Z­i¸vó™èÕ¨×çM?L;:wµ â7ãÏÞÓ^²Râv»Ùöª‰î×^šP'ÜVÕ¢|D–‡ÅU…×½ä¡'"kœ¸VT~Ï“NŒ •Á{m o„˜ÆxUUb±˜¼“Tž+˹åõOWT›ÍÆ9·`ßò1Ž3{±árt¤e<Çe»À˜JIˆ_Ÿ¡/']‡\d%MÓÒ÷R"WGœ\-ª«\]Q…>}°öŽûÆm—Ùj¹œ®Údæ€Ýn眓•ÔUuËg2tôùبê©b濞¬×®Ý 4ì}vÑ.¨+MÓ¨¶'Tù= œsÒt^(óÕùg¯°an5svv¥ï¥F?õd¦ÝÃ.#ò\™œ—ú¥èwQs*ùˆ;5Ÿôæ‹ÝŒ5ÚW[Ú:Ø ‰ý¢ªª‰‹^=Ïz™}Ðø, pM$²Ú}‚ƒTúm1ÿ(­¾Pb\Ìý¦Œðˆ‚hã¾jg®kDäv)O—¥Ai!•JÞMž­J» ~1žº—”Ê›¶Z;Ûp!ø€v©½­ü ‘­§1þŸ9²Š¹æ¶žM¶vÃEÆ;S(ýó’£— ŒVòìcÙy:èÜ'¯Sá·"Å{ µ¨¦ 5Z0³k¤C.Ð&Ú"+#+³Y5fm¸Qà3p*ÔêSw¬ä>ìv9]UMÉÇšì¢ï3š+«:û{¤á"ã&—>QÜ/*÷dvÉ[à’&÷Ó6f+ªÅü ¥ð2Ÿ.0e•œtÊÇåìã¬ô‘$ô ÍÛ®ík¾v°áBðí¢s[µrC³tÐ<ÜÂþÓËƪêò¶†MØzpÙ`/6\DÄ&îóù¼ã ÃùGgöq6}'IVbVRUž/äA÷‰Ž>»ý{öq–tr:Ðvµ¿áBðm§™·± IDATb¾¨…Wô¯{ÝT舵Úñš¿v¨"¯¯¿•M án€=Ùpg>œt::ÈJŒ˜ëKy®ä_åù*ç:gV&‚(ŠœsEQÈJ‡ÃqÀñ¾Vµõ¨¥.Ю}X/×ufm¡Š[ë¶ 4^€G¸Û`Ï6\FS°Öz ‚àøƒÃ¡;*VĬŒ¬äøƒÃس ‚h_×4ÎãœÕÁ»“ÑcÜØC‡4\ë_°F_4Fw0µã ‚h×>ÌçÜngœ±ò‹"׺ˆVßñÕu¬6²rcCŠE•a¯@Ã…†«©ÿƒºí! :”犱33ÆŒ§„uýy«1³cÌþ#"å¹bÿPDT€† W³Uèäü±X,UÏV¯ó3á=9¾–®Dì0[ÓÞ/¤å1[Oýgw:½üôUƘýâ:i¯‹±㞣2YΠáBÃÕ•Áì&îÃÞOp*øÌï8è°Ûmí:¨ö†èM÷=˜ký¤«Î9×–²Ùè˜Ãáp9]vÆÈÊPèh¸Ðp!ø€6ñ·q—Óû)½>[TÕ]sW³ë¤¤±ËéA°Ûm>Ðp¡áÚeÁ‡º¢zO{ÓÒòQ9q;a¼Á¯îHÓåÿ¾¬½ÖÂWÂD”œOzO{‰ÈqÐû66üÉ0v°6F »UU-‹Fï­]scª•ÈÊìŒ v»]Ø áBÃÕ­Á‡Åb©;~üü¸ïŒïÁÿ>˜»3<üþ‡ï4D¿‰æóùÙkå÷zxO{g¯ÍŽ1žœOúÏùŸ=}†½«uÝ.¬—õW¾4n·I•Ù:ãö}@ÃÕ± W¹3föw.²|“t“SÁ™éHÿ>©Í‘G£§öíy%Ïzç\Ü/_´X,ßÿð}ìFl1³hÎç˜|Œ16ù÷I÷7c{èôxá¥Ò¿O*¼TÐ’@›å¹è<À¨{oµUWTÖˈˆ1¦®¨MFQê^ª°R(¼,˜c·œóÑOGív{öq mº5øú¾Ê‰ˆ¯r¡Oh2’ˆs‰ðÅðä…ÉÊɤh¯µÙë³òˆŒz€àcžOüVœtJÞMzFÉ108¼“$"»`WUõÁÇ&¢W£s·æ,6Kü§xôZ´ÉHSd:œ*¿¨=~3º²ôX¼§½‰Û Ô€¶éèNùµO&5Ç×Mª>­;ÒœD>.ËÇËWX†?^Î-£øÚïv€àÁ ø@ð>Á‚@ð°ë‚ÔÝ”ýC;ç¼úDQœ»5×|r‹Å²ÕO›O»<øðœðHû¤øOñªñ±ŸbvÁî;ãk>yíKaÁÇ&——§/Wœ™ž ] ¡Ø|¼ž¡WHÝM™cŒaß_öqÖåtYz,¢(ƾ‹ŸZ,–™¯g†CTq ¥nJ"Êþ’r “©+jÕrUUõŒZz,ÇþtLUËŸ&ç“–‹¥Ç2th(ó¯ ê À. >ˆ(t1ž›ÿ†§ÃÆiÿYèBH{­…¯„ƒSA3 ‹™ÅÊ94J½]Ê.Mþc²r¤!8ŒLGJZÉwʺP>Ëâ=í½6[zS _ ûÏùQoÞšÅè‘ý‹,ß$ÝäTpf:Ò¿Ojóú ŠßŒ;?vfgýgý˹å ëdé)o‚ÅbÑ^k¬—ÃÕÝ>6¦Ìçóýýý¤“]´_+'E1ÿ"OVRWTÇ!G>Ÿ'¢cò1ÆØäß'ÝGÜŒ±î-ïÂK¥ŸTx© ê@›å¹è<À¨óoµ _ ‡¯„‰(|%lööPWÔÐÅwÌ;08P™Øˆ<*5JÙßßODd%óÂÊú×s¡`é±X,û‡öB¡`ŒLÜNpÎG?µÛíÙÇYT €·ÖéÁÇØ©±ÜÓ\æ_™\.gÞä"ÈœóÀ¹ÀÂÝ…æ“7Jitõàœ÷÷õWM"ô ¥7%“9òAúöZ›½>+Ȩ7»6ø ¢ðÅðØ©±Ê›\r¿æü>¿ûˆ;z=Ú|ÚF)C—B¤Sú~Ú{Ò[5‰gÄ“û-G:ÅnÆÜÃncäÀà@òN’ˆì‚½öd ´ÎÚù«8vj,~+^ùløqï)oq¥¸ém·RzF<¢$9†’ÕçN¢W£^Ÿ7ý0í8èHÜI”çs3ø<à=í%+%n'PoÞZ§w8…÷ N`§tM‡SØe|‚@ð€à| ø€àÁ øx{.§kîÖ\ÕȹŸæ\N—1l±XÞË‚Ìù¼¯@WÙ_²‘«‘ʷªªžgÉÿš¯°ï‡÷SoüVÜü7þS|ìäŠÁÇvññÅnÄÌ£7¢þÓ~ó_ó*Ir>ié±Xz,C‡†2ÿÊ#UUõŽym6ÛÀà@öqÖ9êµôXŽýéXå9•*ÙÇY—Óe鱈¢û.f..úMTÜ/Zz,Éùd“ª+ê1ùXÕÈÊk:Í×v,øHDd\gÉü;C:9þà¨Mæ=í½6[zS _ ûÏ•£“àTÐÖ¯½Ö"W"þ³ë##Ó‘’Vòò….„-×ÖºÒ^ká+áàTЯ(ŠòTIÜNxO{›Ìpüü¸ïŒ¯¤•çÁóÁ&XwÍ`ýˆÝèf‘ý‹,ß$ÝäTpf:Ò¿Oz§…Y,¥Réò_οÈÏ^ŸýËŸÿ"IÒWÿõ•1ÞL@DÇäcŒ±É¿Oº¸cÆä¢(*ŠbþkŽÌ¿È“•ÔÕqÈ‘Ïç+çc¬ÓÉÒ³þi±X¡2eÝÚ?´ç•<ëeœsq¿X|U¬šyó5ï…—Jÿ>©ðRAÕ€6ËsÑy€ÑŽÜjë;ã‹ßŠ«+jüVÜwÆW7Mâv‚s>úé¨Ýn7¯°V µ_ç…BÁÒc±X,öí…B¡ÑBÕ5t1äó TŽ7"Mg¨®¨¬—cL]Q›l]Ý5ÓÒG’t@ ü5 Œ«0µ„>áAúöZ›½>+Èë‚^'eéMÉÔh¡òˆÌ9œ ,Ü]h¾zug(ô |•_åBŸPÙ4_sØÉàƒˆü>r>é÷5ì108¼“$"»`7;xzF<©û)Ò)9Ÿ4O`xF<¹ßr¤SìfÌ=ìn4Ãܯ9¿Ïï>âŽ^6_·º3ôŒxâ·â¤SònÒ3â)'µRr>É9] 5_ó]FÜ?`þHŽ!ÿŸÿR\ÛRcä»ÌöÝWl;6vg×A[å“B§KÜ?à8ä üù/ÊS\8[ >Nù‰¨Ñ5"ŠßŒ‡.†,=ïioâv½ùzÆb³„.„·ÖGNœŸ°Ø,3Wgb7c gøcÜ{Ê+I’4¸I·•º3Œ^ÎÝš³Ø,ñŸâÑkåðÅè¦*Š¢ó³ùšïJùÏòʳñÏéûéàTûÒö Nç~š‹\ ç•g‘épê~Úÿçr྘Ɍònino1 ÀûÕÖ§°ãÞK‡SãÈ>ÿâ™qP>àbŒ)O—«>j¿íXúVç¹ë qΗ²‹b_ÿ»/ngËö²ìp »µþ—œy¢r¸¨ªc§ü§köz´QcxñQÆyØípºh)›õœðŠÒ€484vÊ»…K:…/]vrIŽ¡ð¥Ëæhå¹2vÊ/ ‰Ò€|ôØâ£òsYŠ+ªç¤×yØX{ú‹A[å¿MHƒC’c(t!dö@j”¾•u¨»¥UŒnFÞ“~s +Ãs Ñæ‹ðöωѪIšçÿÂÝ”ãËsÂ[\QQÇà=Bðï@çÑQ"òßB×ÚÐ¥pæß™ð…ò<ß<åRv)zmF]QC—ÂDøÛxö—ì񣁿±Ì¿³/'Z\bäz4ú],4 _E¿‹EÖ.œ1á÷y•Üòƒ.ä~WÆÏO®­a(û8<Ìþ¼´aͯ„SwSáK¡È¥pì§¹ðÕ™æé[Y‡º[ZcBFláõùÇNù—~.ßEež½0mŽÁwf,~3^5IséÌbèB(ûK6t%ŒÊ>`ç‰ûDi(ú]Ìs¹i}ÂôÃ4yF<¡©`ó”þÏüîÃÃDTxY "£¯ÿœ_y®<{ºœ¾·Ðâ'úôxNx̉(uoÁqÀ¾ryâü™wV§.ÑØ ÏäÆ5LÝKknÌ'1Ÿhž¾•u¨»¥U¼'< É„ñ8¾Ì¿3£cÞøOsµÉmŽA>"ÛknÔÚ$Lœ މ(}? >`çå_<Ë¿x¦ä–c×gm½[xœšqg²­—mú]h„Ê :‘+aÖËr¿)Á©ÐÓ•¸›jq‰Æ×°­W° Bå·rìFì˜g4÷\‰LožŒ(ÇÖËìc¬ùÐ!×ÀàPå|¥oeêni-×agúÞBüÇïD¹6[›¦Ñæ¶TFæZÙzs|@—Щ¸ñ«ËèÁ ­ò­ö$ðž[Î.}cv줇¯òàf'NLýýýDTTUcMŒ‰(ü?3DôýõY‡ÃQo Õê5"z–[6¯¼ò¬yúVÖaKä£òÂ|¼Q4ÐhsÞ¢Œ ÅU[åæ ø€N'íë'¢¥l¶êÙ*F‘Ô½ÔV{È#£ƒCbŸ>Ú<}+ëÐÒ†÷$î¦H§Ô½òE+ã#ãÁ»å¡ÁæT©œ¤Qf®FÊWšŽâqy€àºÁW—ÂBŸ0q>(oüê ]9?v†§#n§kK3Œ“{}~÷ÑcÎßߘ­›¬òhƘàùÉñÏáéHèJxü‹ñ‰¿—O\ ‚àýÌ¿ü[nÃ)„ !çá+çÆSá+aß_x:2zÚ;üÉpì»Ùæé+5Z‡–6üfÌ3"‡.„Di t%ì;달Åm‘+aƘÿ\ ÉæT©œ¤QŽ¡àÅÐðÇÎÐE<ÇÞ'<çcoé´ˉûX/SrË(šŽ‚gÀvÀs>`ÇHŽ¡Ø˜Æùb&CDîÃnä Àž‚àÚmöj$vknÀ1äÿ,0üÃèH¸àÛjÎ|D¿Î¢ßF‘û{P»Ï|(Ï•å'Ë ÿ\$Iy®H¡+ÀÞÒî3±1ÿY?cÌÖ»3Ç«+ê1ù˜Ýn7ßb? (Ï#^ ¢ìã¬Ëé²ôXDQŒ}WNf±X¢ßDÅý¢¥Ç’\{­—ªªÞ1¯ÍfÈ>Κ#G=£–˱?3ŸÑT»\ØEÁ‡N±›±ñ¿ŽÑø_Çc7cæ{AƒSAψ§øª˜]{i–ç„ÇxÀQê^Êx¤’ÿ¬?t!¤½ÖÂW•O·TEyª$n'¼§½æÜügýÚk-r%â_{šSp*™Ž”´’ï”ÏxSWÝåÀ¶jës>’óÉè7ÑéÆ¿î#îàù ÑíTÅÜ“œÐ'^Äýb©TJÝKž‹%’ ï˜7ðyÀSÙEQ'KOyÍ-K±X4ž{möEQQÆ6¼ÌBÅü‹`ï0ŸóÑÖ>Ño£é‡i‹Å²>Æ5‚ÂJÁxDÿ¾ò;/䣲ÿ3?é´˜YŒÏʼnH]Q#×"¹_sÙ솳BÍÛ¼ +…ªÈƒˆ …‚¥ÇR›²j¹°­ÚwÙÅèjZzS2iš¶üdÙèØÑß×o¼çÓ|Û'cÌåtMœŸ:4dDòˆÌ9œ ,ÜÝä]ê‚ ˜tÖGö •K7FÖ.vIð» žVžjaŒM|9at;õžô]@œòŒx¢ßDÍ .¹_s~Ÿß}Ä]÷%X•<#žÔý锜OU‘¹ßrF¿÷pù©šu— Ý|蔜OŽQý2­Éÿœœ»3G:E¦#‹EI4ÃZ{u§|ÄŒ{Oy%I’7éz½ùzÆb³„.„·æÈ‰ó›eæêŒyoKÝåÀöÁ‹åöt8€‚ËÀÎ@ð>Á‚è>Vdl«ÉŠ·ð@‡‹Ï%ÚpG$‚Øv3Ód ø€v+®ò6/1v#1žû-—¾—Jgg®ÎxF<é{©ÅÌâÄù‰å셧áóAiPJÎ'"Wá ¡-]é¼Ñ&ÎO|õ¿òŸö¦ï§'§&Ó÷RFʱžÙ«‘ÔÃtðBpa>aÌÆþ=q+^žÿÚR–~^Z|”N$"Óáð¥ðò“¥¡C®å'KUë¾=.Ǿ¦î§"WÂá+aãC奒º›¬ÜRx§Š§Sb>ÿ1N:;éñ˜ür¼þµÎk +—Ë¥¦UT¼·¡2@kmÂcÈ·üd©ÑλùÎï2»î̇9àpºèÖÜbfÉuØe~”Xû.÷œð„.†Ìôã_ŒcòQ9x>è÷ùÉÊÜGÊç-ˆ(}?ºâ: "G®EƒSëí‘ñ,ÊåÖ]¥ºspþÑ™~˜EÑ5ìNÝM•S>L‡¦BœH>*ËGes†ò™3Ñ ÏDlôO£Ño¢u×Á^|´ºâDî#røJÄL0ñ׉ª-…-7¢ ý0-}$‰¢ÈuEIÚ'¥î§å£r£r©éûÌG´¡8\ee€VІˆ*»×4)‹&;;t°3&ÿ>œ ÆŠ›cŠÅâÜ­9åweù醮v»}½ÍbÕQ¹ªª.§ë]Ö¤î"Ó‘àTpâË fe±b‡ƒˆÔµîÃê=¨QEã#uUm¾tc£cªª6Ÿ'¼µÄíDöq¶² cfð±){¯·ãÞ}g°÷l<ƒ*~hwv&nÇÍ1›pvzNxÆû^Ÿ¿þå’šaAÒ÷Rë¹2ÑsªÞ|ÒÓdm6û¶Ø·QÒ)•ZÿÛxú~ÊHIœ×Ùiê­añUÞn·óך M¶E¾ZdÌÆù&)aëÍ[¹äóùÜï¹¥ÌbE)“|“¡1¢‘ÃÅb±Q…yË‚ƒÍŠf“LÛ˜ ÙÎÝNaÇþ˜»³þÌå¹2z\vÿÑ¿“h}&îa·¢(D”úç‚ÿ\ •IÒÓ¡‹áÈÚEúºsðœ3öÍâ^üyјƒçäXó¥ÄnÆH§Ä½”ç¸\yv§výRi"J?ʸ¸Q+¶Cr>á?ãß5ZÉÊŸ4®ôY)ý0͹»«œª¶°Pp;ë-vvÀ™@]cU¬—> „.†Œ1áKáÐÅËù•üøçãuÓמüÇdp*˜ý%+}$E¦#• l=&qv›µ>21O¹×CøRøò¥ËÁ©‘¸¼¬¿O†.„&Î¥}ÒÌ•™æk(öK{ؾ6FÊGåcžÑ¥Ÿ—j×ÿòÿ\þx8ü?áÍ·ZfV€ôÃLüV¼*ý>¿ÿ¬üË q‰16ùŸ“fn×-¬-lV4›dÚÆMvvè:–R©DDÙß¹ÈòMÒMNg¦#ýû$dYW+¼Tú÷I…—JÛ–hÔ"ʯ¨mÞØÔ½TଯýË%"—Óµ„[TvÚV@Ñt)±OØÖïˆ<Î|@û´ÿ=–Æwêý™xog‡T9Š:ú|Àî…³²¨€¢{Ć%@Uü‰,€öàœï©å¯x€¢°Ã”—…ÅÌb»—ªóY.tT l‘ÿÔ‚Ø=†ÿcxø?†wjÑÈÿ=^÷ (hQÛî…DŸh+€à| ø€]Åb±´˜²P(¼õRr¿åŽýé˜ÍfEqæë™mZº9·Ög»é²Ú“?ï²Üά-USÕz_3Çõt9]s·æªFÎý4W÷%òµ³~½üÿ.ow…|ëMne¹ÊïÊÀà@{VÒ\Ö;–ZëÛ|ëÞ×äo1óvÖ Ð݇oùú² •çÅbqñÑbüÇxô›è¶.ÝxwR›·ô­óç=Ρc•jtÈŠeÉF®FTuýu'ªª†§ÃÙ_²›Ný&ªªêWÿõÕvWÈwÉöMÓ$ï&ÇN´é>Ï÷¾¬M7°ù·{ò64V>`÷Sßö}TáéðÄ—¾3>Ƙt@Š}‹ýkÛÒÛ¶¥ï¾†*Þøµ¼Ÿzã·âæ¿ñŸâc'7ÿ‚l=òèp‰dÂ;æÝ}Ëz/Klÿ #ø€Ý=¨ªwÌk³Ù²×ìænÍÙívK%9Ÿ,>κœ.KEÅØw1Z;7øvgS÷R¾S>ó_çÇÎÊwϾãÒÕõ˜|Ìn·Çn®4•§4g¾žr ›?êµôXŽýé˜y¤[›'–5 (¿+ÔàÔqÕTÆZU-«vµ+Ô.·6gênBå6V­RìfÌöÍ}Äm†5õ3¡ÞÚÖ¼².ÕÎçíâ­&ÅW9\[+ªË·Þ¬6-"òñÅn¬O½õŸöo5ò¨»zu+dô›¨¸_ÜP¬5+9 ^Œ3‹%óï å~Ë HD”œOZz,–ËС¡Ì¿2U˺üß—CBµ9Ù¨MÈý–3ŸüQ§Ê5¨Ño£öíöí©»©ôý´(Š›VÔÊe5¯?•›ðN»q벿d‡CÇäcf}ÞÒä­doýJØ ám±Œ|@× NýgýÚk-r%â?»Þ¼.?YÎçó‰Û ïérŒï?ë]i¯µð•pp*Hkçßî aþe^úHjôé;.=8ôŒxНŠÙŸëŸ'Áx¤cp*™Ž”´’ï”Ïl>jó¤Ñ²<#žäݤKyF6->Sm­¨-ßÚYmZD$Œo&"Êü;C:9þàhyÄçâUç<­^-EQ”§Je±Ö®¤gijpoˆÒ÷ÓŒ±ôô1lT<ïiïìµÙÒ›RøRØÎ_µnù|>|%Üúç¸Ç|ìem•k”¹'¹¼’]/33U[T·zT.«Iý©Ú„wÉØª­‹^.e—&ÿ1Yw>›NÞJöÖ­„Þa\õ\zªå_ÁX®¦iBŸP›¸n‚ªåÖæLÝM¨ÜƪõɿȗJ%íµV¹½µsh´2µ“7_“FšÔœæÅ×J­¨,ßÚYmZFÊð•ðøã¥R)p.¾n´ÎD4{mö«ÿûUàóÀìõÙú›T¯ÒVÔkíJ.üsaìÔX©T’Ë“ÿ˜\¯xÿ\(•JòQÙ3âyð¿*«.}ÿÃ÷Ãÿ1ÜbÎ|g|ñ¹ø–Ö­œòUÑÜX³šWÊe5ªÉµ›ð.[µuù|Þ˜Oí×ÊäM²·rÃk+aóFÆØî§å°‹ÌþÎE–o£LNg¦#ýû$µwµÂK¥ŸÔ¶è6ª9–‹±W’šGÛæ°º¢F®Er¿æ²Ù¬ò\1FV¦Ü’!ÇPb>á8X>šäœ'ï$}g}ïeé•e¦©¨=½YNÐržðUnÿО‘—¥|>ÏkeªFk^7Á¦s¨¿ r¦rk›¹éê¯LÅäMÖ¤ÉiF šß–jE볪]7åyúNg IDAT¹ârº”§Š¸_\~²,%ÿb|öú,éä>êžùŸóœ|óÕk¾>µ#ù*%1ÿ"/Š¢¢(â~1ÿ"/î‹ù"ëeêŠê=í5Î÷,>Zt~ì4&;5–Íf.öïëß4版t²‹vå©"–êäÛTÔšeÕ­‡µ›ðöÛdëêÕçM'o’½ëu+aÓFÆØîïˆ<.»ÀÎô–RÊ#2ç’¤Rà¯é€d\…idöú,‘•’w’ã_Œ›Ëz—]¦v%Y/stD¿‰ºœ.A܇ݑéˆóNÖËŒôÒ´×ÚìõYyD6瓘K„/†'/L¶¸Üô£´ëËør}ëšÜbE­ZV£úS» o±µ[gT'Îy_ÿ[LÞJöÖ¯„-72m€àv€gÄ“ºŸ"’óÉ&wÛQîלßçwqG¯WÜk}ËÛ1&ÏOF®FænÍqγ³ã_އ¦BïkéÞ“ÞØÍé´éunψ'÷[ŽtŠÝŒ¹‡ÝÍò¤Á²Fÿ4ý.ZÛá£v*ψ'~+N:%ï&릯Ÿ`³®» M„¯„I§øOqïIoóL¨»¶µ“¿õš4R¿ø¬”œOrÎC—B›ÔŠÍfµiA˜ü>r>é÷µzI¾¿¿?úmtìÔ˜ñ½²éê5/ÖÚ•õŒ†¯„åã2ÉG噯gF=£ÆGƒÉ;I"² ö ½5­ä;ëË=ɵrŸ0¥î¦<'E®FX/óœð˜WåfBÍÊÔ¼ùš4éóѨ ¬[|‰d‚¬$Â÷7¾o^+*·½î¬6-3¥q‘Þ,\jÐç£jÌ÷7¾|Øtõˆ6+Öš•4î[Ì,–J%ã ËR¶\?-–/bZ)‘LTÍíÁÿ>Ë­ôùHÏž>k¾36ª›Oµ±zT-«yM®Ü„·ÎØÚ­[H-ôïë—˵õ¹•É›doóúܼá%ôù€íÓ!}>à]˱PÊ˹å®XÛ·î£ó^&€ÎùŽ@Ÿ€®¥ÓìõÙV?Й¬È€îbûÀæv/üsY> 4Më®~Ç‹&¸æ°ûಠø>Á‚@ð>|‚€àÁ ø>Á‚@ð€à|‚€àÁ ø>Á‚@ð€à|‚€àÁ ø@ð>Á‚@ð€à| ø€àÁ ø@ð>Á‚@ð€à| ø€àÁ ø@ð>|‚@ð€à| ø€àY>Á‚@ð€à|‚€àÁ ø@ð>Á‚@ð€à| ø€àÁ ø@ð>Á‚@ð€à| ø€àÁ ø@ðÏŠ,€6(¼T €àÚ!>—@&‚hœó€*èó>`÷ÂeØ^ÊÓ\뉥ž¸¢à2 @çJ?w#:„ü‰¼Ms–> ë »¹Î›§aV–É,*OsÃçBȱ.TL}}Ùó÷¯ZþA–u£ÌOß?ò¡C^ä[o]·Ô·aå|À¶ã:'½i]Ó‰SÅ.ñ[šˆqâŒr¯;t¨«µúû·EäY—aD¹‰ÈưWvkëºå¦Átw«eeÜJ¬¢®Yzì¥7ÅÊ¿±V2²ë‘u]Uʶ-üî³#ǺLo9æ`>º¶uÝrSŒàº!²–Û,‹ÅVŽ0*Â÷ •¾ÏN‚@8íÑuGÆ­ÿîëG†u›ñGèEàØÅ­keâõø£¤ÕoŠ|@׫Ú7*ˆ¨TÒ¨òJ$cˆ<:,òÐÊ{%Î|tuëje•ŸšéËñ‡•‘ŽË.°ëÔVúpä[W}•˜Zýbíž’%"Ò»±u­´-dB™AGî±G÷}CíÖr/7“VþV ÝyìHüàÚ¤TÒ¶¶‡p„ˆ>:ƒ¾‡ V7 —“_»¨um0„ô°+[1^zS´ô´Ð[1ZQ‰ãLo÷Ø'l-ýJyÖ…¥Œк¿umy¼)’Ϋú¢"ø€.g]?|,iE‹Ín l8ºBMìr\×¶ôÚݺZ©êÓõôz»ƒ4ùІZÆøªÊWË_9Åü3»8 ªë;ëµ±ÞŠCç犺¢"Ûºˆ°O*wIlí·Z( ÓºîKN؇\èòÖucbs3}uS¼ðb9Ø~zõ½ãÅü³ hÃý]èéÑz¶øºl/FtëºÕ¦x{£Y€¶T4Æl­TÃÌOxëG÷þxXèµQ‹¿s¹edZ÷A©uyëºåÄÛÉR*•ˆ(û;Y¾IºÉ©àÌt¤Ÿ„‚îj…—Jÿ>©ð²}oŽÅ[m÷ˆô£Œ|d¸õaèÖ‚Æ[m;F7¾Õ6ÏEçF8óÛm‹•8,}„<ëJ£[†n-hd¼èó>Á‚@ð€à|‚€àÁ ø@ð>Á‚@ð€à| ø€àÁ ø@ð>Á‚@ð€àº‹Ym¦éDÄIßS;³YQ( àÚ¿osÎu""f%cåõòÈ]Eç÷3ƭij1†‚@A  P(жJOê*¯¬w6ƈs²vFóó^qqÎ9ç¤kdµ‘Î9ãœaç[[ ‚Øé‚@ðm’WUÎ9³׉ VF:‘•íÊeÄY/S‰øª¦išÍf#"®SaE•úûwv·CA  P(ˆ/t8…6)¾Êµ\Ó4Òµ]¾µVFVÆcÌF:×^ÑÚëbQUwö¢2 ‚@AìxA ø€6)_=Õ5Ò¹ö¦|éÑf%›u÷o8×ÉhÔÊ'<‰£ P(Ä^.\vvUôU•ìví qΫ®-nÇN®íxO13+qãä­Îµ7Ìf%ÎyñuQ[/ ‚@AìÝ‚À™h×Î5£®—Ãí=µízùpŠsmÇoäCAì©‚XÌd:ðÞQì(Ð&ç¤këu]'Ò¹¦¿Óq€ÆùÂÝÔìµhìF¬¸¢vÖ›Öt^¾gO×4ιιÎwYAt´=\‹?g÷fˆiœ£ °GtTAಠ´íð‚›‡̬â:'+{ëíœÔ+.e—ŠÅâÎBUorÅfrŒ‹Êp’ùýD§×½½W™L&§ääÃ6»Í1,¥¥â?Æwü›~·D±XT^(òI·kÄe?ȨŸS?ϽÈ*Ïì8ó;¾‡¯ÝækDl=î~§þÕœ¿á|•s®qóU•¸6;ºKÝOOümböú¬ç¸\7ÁÀàг§Ë­ŒÜd÷^?Ô(oòz&ì¶‚¨Î+s˜1ævG¦Ã;uRjD.—K?J_/®æÉJv»]:,%ïÏqÿi?ëe-Vû­Öù½[œ3;“98çE*j '“ÕøFç­ì&d¥Ùk [¤]¹G ø€6Ñ´šPçÆÕÇ·>àãzE¤¡çFD¿ÉTñãc'Çâ?Æå£rKûgÓ‘u1ëÚn𠻢 j-ç–ÍÃÊØ±ÐÅpäj¤ý» bñçÅL&3yiRYQ̽Ã.ŽÃ޹{Iu•> 4Š?j—û¾ªÄî.ˆŠd|Ã"Λ}Íš»Iú~:x>HÓy›ãÎ)жà nôo2ª~9nÐ9'¶¥™¤¦¥|2séç%÷ñQc8_È'ævÁNVb½Ìëñ }uµó/ò¹ßsÑï¢òQ9ÿ"/î·ëØ¢¢óZyo×y§\áÞ¬ ªò¹aCƘçSØ'6OøsÀ}Ľc§=º¹ ¶*ý0{š¿0ž_ÉWÎEÓ9YÉqHJgRd¥Àgíîÿ±× Â8j|\ŽLG&ÎO,?YÞ#>ÐÆÖ§î·þ“¾Ÿ^z¢p«ÀIà$ –ÅýM'ipÈ{vB<0ÄúD&ˆùýSÕ|íænÍyOx‘÷„wîΜ9^]ÉÎú]‡]É;qs­êŽlõg;#·» Ò÷SKOÖ+2¡ÙO~…ÏýSWòµÛ^óïZ§ªÏC‡†ç\U‘CŽ¡ø\Ü=ìv»Ó÷Ó‹Òî#î¡CCéû©Ê‚0¦2'—óŠB:Ï+Š|\n4çn/ˆ­îá+á¥_–‚ &ç’deëß'«¤d•¥GËÅ-öm,þclý·Q©UŒr %ïÄ]‡]þ³þ:ŽöˆV¶®Î9•7Ú&“Tü+u›»Iý ÿB!çžd‡CÙl–t®<Í•È1ÿ1&•+÷š/ÐÆÃ‹òAØú¹Í­Öxå…"I’Ã)÷;ÜÆOQg\çŒ1qÐiß_þ± âÒ“¥â+µzþ:%î&ÆNù‰hì”'1Ÿ0?‰\ºÈK—žäšÜêFå&wPßþ¦¡¼ÈK’$6³´îM—²¹|¾Ðd»ÔWÅø1ó Wøj$t>¸œ]õÈ‘këbr¿åÒ÷R¡‹¡™k3Ù'¹ô½ÔìÕÈÄù`yªé™ÑÏòÏKÞ±ÑÈô ÉGÜéÌ"¥3‹ò¹Éœ»º ¶Äñ)|)ì?éþÃpîqÎfµ‘N¤×5®su¥è>ìþu"|%ìr:i‹9°”Í->J{F<‘«3ïx̽k "9Ÿðžñ{Ïø'¦‚ë§ú*ľ‹ f¶xͱN…vg-Ñbf‘1¶˜Y$¢ÅG‹òÚ9Eåe>u7Y¹×txAಠ´‰VÕ¡iýŠ[8·É¬,û$'ä9_{ƒ¸_b‚½ðªX,(­‰Ê¬LåÜÎ9Uœ^N?LKI¢(rDQ’öI©ûiã{1ý(øÏ' |HÞIMOÝ‘-ŸtååÍl’ Zµù\¿[U‰¨¸ª‰5¶‡¹Ì6Æsܺ*géý´1<ü‰¹ N…ŒTã_ŒcòQ9x>è÷ùÉÊÜGdZ{èÓâ£ÅÐ…'r‘ÃW"\'÷°œœOzǼ™eÆNŽq½áœ»º ¶Äníˆ\çùùÿßÞ…¶qf{? c8Ì€ ¸ T¦JlàZ4VÉ…ÈäBlºŠRݶζÖÍC"ò`Ô>§ ¹õ½Ð­¶ ô!Ø Và†(¹ÈR¤+²ch@†f †ùÀ¹#ei$K²b+öÿ‡hå‰4ÖwŽÆß™o¾™YøÇ‚å6yˆÈ"òøÕC*ID·²ûë.‰_ˆñ迎ÎüçL‡Ò¾KÄð‡‘üÓ¢ÿ¨2|:¢R…-ÜÚƒ% œ ˆ5a¬–WJâ“sñ§‘5ú‡†ÃÙÙèØx~¡;Ë/äãŸÇsOò㟌;o¹øÅÅš­¦ÇâvKÝÈ俨fËÂ#áòO³¥…Yç”ZcÕˆœicEÏþtCÔœo43GOG™˜ì-}æN¦øs1 Uoáá0™«¦,ËBõêîx.ìnz3á“aý§LñI¾ùqkfŽŒDdI¶Ö­š3œ=³Üã\úûôäŸ'+3ÿ‰LÓ¬Ž¿R'ÎõËÝwU?BޮĚ(,®N]B4Zó[ˆŽÿ®[T}‘¼õ¯¾°kO­df±&Ü>Á²,æÍË?¨ª*„ ‰Ì5³›{Éou"úhâÂÄÌ3ÙÙ虨óWb3œ’(¯”Åo<=•r¿ÿ]j–ÔáƒSS)cÍ(>+¦¦R™»ã7£ø¬˜z?UY‰T»Õôx"P|À.ñØœ?‹’ÜúJüïøcçc†0Ȧìý¬Ú¯:÷_еøq¥_!‰dIffEQª¿àårY_ÖóOò› mŠž–Ëe¿ß¯ (†a¨ªj†ûÏ…-oÌVKAèÉDøßñÇÏÇÍUÓXÛ¦áj¿ª (ιëEF"†a$¯%oü¥2V¯(Jö~¶Ý?<Š¢8·ÿ¶,Ë9eW–eí¨6}sZ;¬É’ÜlÍos":ÿ»nWæÙXëÅÄvo ¼Ðu];¦9?êËzཀû¯Î†`½²:?ezß%B–d꧉óéÛéì½lôLD=äwûrý¹. %þy¼ÉR-÷$ç~{½¿ð‡µ¹;s£ù8HßNŽZYso&s>`·¶pÛû9ÙV[Ufÿk>¿6èW•ª9û)Ì~Ÿª ú}>Å? Èò–•ÏÞ›}E=Ämßx>þoQ!Dîá¼ócx8¤¿X"ÛšÿûlüB¼þõžÏÃ'B¹Y²­…ǹðphcUá¹»sááp³5¿í‰èð!„%J/J¥R©ô¬d¬šB™ÜéÞïŠO]OéúÙ–®/Íܼÿ,æÆ0ýcš,+û`.2éðSíÇDÈ}ÄL±³ãlRîaÎxe""¡?×å5eìlL;ì—û¨a@6žççR×’©©T“/|èD(};:ržÏݽ>Úf êáD`äöllÓÙ'“ûÈÝ9ko|s·Tý‚ˆ$vNз¨r¨{sÇâq.ý}ºæwEόſŒÇ?ÇÏO$§’™{³œp?›çÂV¸’ûöxlsG‰Zš|à–ꅉˉÉË“Á߇™9~a"5•*>+jƒÚÕkW7÷Ë×½ß[IÄ'’Sɯÿr#øA0y-é,t.\<¬¼ÆkÍû$í÷¦¥”R—R•c+ÎôI!ÄÉÊå,½G>Þ Œ›¸”0WMe@‰Ÿ>º/öø#ÑÑêø·e?'BbV”ÈH4û`.{ÎÌ¿²\eŠ}Ó5’¸ÉJÂ'?r»âÔµÔð¿ 7ÿ§ÿšƒÖ:ƒÁô_)p"¸íÔ³‰@ñ»6¶iµÞuµZƒ0›«†¹V4Wt–˜›v–™[5ô³³œûyúzeFº{j†çÂŽûcêµë9v/5åUÿèóùÜà+ŠRµ±ê×{>Wå»o¿«y—6¨U¿ØsÍ3¾_æocͨ™Õ!³Ü|‰œŠ4ºÈÕØÇccuü‘öw"˜ÙïóŸ¥o§õç9óWºzåªÀßüb*5›I5Ï/|àhÀ}Kà½À¶[M'Åìk½2,!KKÝéêÂ#áÙ»³¥Y–8z:*³ÜäýQä£ÎþìKäœ\Ð|è­ND‹¡~sAF"ê{/Ï˘6é=³ö&R¶/áL2sæ$®Ä”eÛ˸íZÀ{3(>`·ØBî£îÞöÞ7à‹}¦°„%³¬(J“»½íùÈçìAæ®'¢×BDD,qgmŸ%©6&.LD­\@¶w6“=IŠØ%Îlj–HTÍ!ßùám¥_,[a‰{êë¼Ù4‰IªÜR¡wæöw=½\j ½PM„DìòEëßêDàlØ­-Ü®|ݹÛ%KÌ̽\H³D]¿s[&¢÷!HÑ#‰@ñ»÷-·,ÁÌî )n¾_9Mc‰˜™™{d‰@"$bÏÃ.°[[8³BUY8—MܸiõþÞÈI’IN Ãì…]+$‰@"ˆ=OF>`—hÇú²îlêÌ,¶^~q_nÛ̲³o¡b"Ò—uõÿžüHD {žŒ|À.?;ššJißL«‡Xîck½r½E‹XîëÆ%¥{Šm‘°Í›„MÖ+#}+‰ìù¡e$‰@"ˆ=OŠØ%áÃÑÓÑÄåDü³Xཀª*ÖÆ ­u¢uk?5vs´ÖBX…bqæût C*3IŒD Hqñ»×¯_Qñáçr“×M^Nܸ>íÔЉ¾ÕV^ê¾Am奾W ¿°¾)- Óì…‰îoKÄýŠvX‹ ‡CÁ¢(~¿_ÝzÇ;$‰@"ˆ’ˆ²ð2Š{Á&Ã4MÃ0œ¹]`;w.#¨2+ªÚ g‘$‰@"ö$nñÃ.°_wUQ¸Ÿ}Îý®ç|z¹§®„†D H±G‰@ñ{³‘˱ŒP €D Nµ€âÅ ø@ñ(>ÅŠ@ñ€âP| ø€âÅ ø@ñ(>P|Š@ñ€âP| ø€âÅ ø@ñ(>P|Š@ñ€âP| ø(>Å ø@ño;©­W¯¼Ô2Øâ#sgÁ€Ý+>0æ]9€âP| ø€·„ì„þB/<+‹…Âb©¼RÞ—môûü¡ã`0z?¨Óv¸¶ß½~ýšˆŠ¿?—ñhKæ§;Ó7¿;PMN\º;÷Io, ð(»tlòJò UD4}ó»É+ɬ‡]`–MD‚ì}Ú<‰ˆXn¿?Lÿ˜Î=Î9χŽ ù”}¤•U³°X˜»7·´¸DD¹Ç¹ôéøùxgkÃah\v!l""–Hf®ühW¾Ål±µþ`–ˆ™eæW°T*Å>¯t½ñOc±Ïâ$J™;™ô팳 ó·ôP ÐúúÜÃ.ù€F}™k¢jx€df‚¤–»è^%lB!ȶH’É‚ˆ… Ei±þ(þ£è –Žÿ!&„8 Q/=/‹'m›e 6.ðÞO5M!K$lDŠÄdI¼šÆ$¸ŸM"±fY–%Ë2 ›VVMÍçk¥o,,.1ËD==hQŠŒDJ‹%’¨°¸;×Éš1Ἷ•ÎÆ²,²­}Õ6‰Ibff–ÉÖ+ÃYl½2 Ólev‹þ¢ä¬D;¬´(i‡5!ë/J­Åx«LY°-²…µ^™ K$Kû­™Â&§n¨e ÑÊ»œnù FÉ&–˜˜:žÔ‚Ã.Р¿Y3IU­uBÔÌ_ènÏjíÉÄL[°DÂ9>b ke‰„Æ+CQ¹›w³´¹":PQršÌRUP|@wŠa9]ްißžg»±[϶ ’…°Èné\YYæ]ˆRàøPýÂBqiÏ£ÄLÌ,÷u8µÅ4ØÕ‚lË9k”ˆ¾Ç"îú>ýÞ¸r*©-ÈÂfÙ¶,!„-„-dÚ®[•ä7%ÿ»Gæf+ÿ+a˜ !BÁ¡Ý«?D‰ˆ©Ý  ø€.íé áîÓ³{É[Äž‡ŽhGˆèŸú?ë—×/Ü{U±Øh WšÜ÷ˆC»Qj¢0i‡ýù'÷ƒíö½cD‰%’wpØN aña­W&n{Õ¬#Ú‘üŸ&ø0â” ÕËçOEköJ«%ìʼVHì<ÚŠRôårë%ÑîE‰˜HîøŒbŒ|@£âcãÄQÛ¢ÃÂ&np2ˆñ¼ä—¹zwùȱ¡Gçâbµ\³½¥s}¡'¿I-üß‚¢(âñÏão®EGŽ ýóÅÒfŸº¹_iàf“Ûùh/Jm/ôæD´²ˆ‹m: IDATRN}óuîqžˆ"#áä•«>Ÿ¿¾ÉŽ;·2eÓœ¼4Ñjåá% Nà °,áÑçI\Û'ÑRii(04*úÇ‘#džœÊ#_.{¾…ˆÊåòøg±ä•äÌÏ”ËåÄ¥Ç>‹½Ùýx·t¨«‡<šÜ¨øØ8³¥­(m+<Ê/êWÍàGõšÅšH]¿¿0‘º>M6åòÓßÎ$¯$¹Ÿë_œ¹“1MsâˉV>[“(ÉråLãβ€Ã.ÐhäC8Ó hã‚ÛVp?ÜÊ£d_?+.•¼'H¦LÇ?GOGYbí]-5•š»7·M«ÌÝ|R™PÙúŽªÃ.D©Qå1qy"<òHDc3ßÏÄÎÅKÌÌ‘‘Hê›ÔìÜlý+ÝÊ£ Q’äJP|@× <–ØÂó±´X}˜%¢ùSÑùSQ±Z.["ñóÂÒb¡Ñ[ç"§Âî€6{7ãæ±m”œ;;w·éæ|€7«föåæ­M½ÛCÁÐæôR¢Ñ‡ÙB±°M7,±i öZáì½Êƒè™hòZÒ]ÏÅ/.’Äᓲ+;å¹Ç¹äå¤ ŠŒD"#‘ʇ¹ä•¤°iøÃÈôÍ™ÄådíØFeTÀjÖ䦟¼ò–5£­(Õ‹Œ„32º®“MþA¿Ð_Ó?3‘°I/és·g ÅÜã|MT½'6  ô­Œ¹jŽ2wfÇÿ0ÞÞ— Q”$®yAñÝT7Ópó€Bý¾ûp¸ºòhq Áïóë/tMÛü°iþæG££DdÆÜÝ9}Ywæ‹l®JÚ|î<1WMaמ"kšf(ªÿ$Û|$»í §mE©^ôt$ó SÖõÚS|«~4×DiqIÿE/<-fäjš  jÆo†|hsÂzeiƒšû2ý=q9A6MüiBÓ´!¯«¦¶ûÅàÊ ç0çºÊ£Ÿ¶½oÜêV%Ã}˜uf~Lÿ~8<nþ+‚'‚ù'y÷ÇüB~îneÂiâ«„e[ÑÓÑßÞh¾EQê/Ρ(JþI>¿Pyxõ mië"cΣõ(5¬<~-7ù­æªQxZp+¯“ˆ¾¼åt\}Y>9ìþ˜¸œpжÔTêëë_¿íÔ ¢´³SmQ|@ƒâÃö~^é6áápþO“N呸y!ÿä•-PÕú×öñ˜û»ªo¥‚Q”éëµç³(Š2ýmíB÷-:ò6®pÊÜV”¶¯?l=6«™¿™ú˲Q®TÍ×  (©©”ç?ÕW~Ñ3Ñ(E[ù`M¢ÄË}rÇs>P|@ã¾Gb’X–,–šõ¦õ=\£Š¤†óšm×öF±´y¡õŠAÙ¸~hëQÚ¶þ`‰QîA®z.Ŷ•‡g »Æš()ÌJ?»QEñ]b ¹ÌNßÝJç·ËuFsr_;‡]ªÎvÙI”jêÀû–¶/8ö0†•(1;—úèl%˜p Þœó8X"’ä-}Ͼ°Ù‰I’Á†v.¯.;.Fivn¾•ƒ,=¥¾Ê’ÎV‹‘hP|Ø•^‡%±¿[ʵ{+8¥æ¶m]ŠROUM¢¤²¬öË8ìÝïl,K0³\³7ÜÙ̆^ãìÖ;}*3·Õ(îWr”˜êg7(> KųBUYðƽ[7®ë°o¾$“$œ†ÙúU³TUu&ˆÌ(q?+ý¬ªjgëÜð¦ 8—Ît.¤íÜclìÍ;*³Ì1³zˆ‰H_ÖÕwü-î•+•Ë‹³ö®vࢤ*2Ër+8Õºküìhj*¥}3­b¹­õÊÍÙ-b¹:žlØl‹œ[Ã3«‡HØd½2Ò·2Ñ‘IÜÊø‡ÜÏ$œ(§®¬(EN†fîWeÌù€î ŸŽžŽ&.'âŸÅïTU±¨êâëÖÛÛ´Í"¶Â*‹3ß§@(R¹Õ«†;'š†OGV”Â'ª¢(VDô»×¯_Qñáç2¶4¨‘_XHßΔ †i¶që“·KÄýŠvX‹ ‡CÁ¢(~¿_U”v÷Í¥V”…?x”Q|@ l2LÓ4 ÙP¹ï:WçÚ*³¢ªô©ˆR»Å»Àö½Žª(ÜÏ>[ì¿Ýzwçž$–%î¼cD”Ú)c¶ï.d‰‰XF(¥é¶€âP| ø(>Å ø@ñ(>P|Š€âP|¼!’ó?ABjƒhŸ]ó³ âÍúBéçJµa“°Ø‰„]_‚leÓ”%&‰˜™%Äõ/h‡`‰‘%„Gñ! ìŒ|¸@7Ø•ÿ Û£ø°œ±a[D2Šèf b[¢¦ø [8µ‰Øº`§¤-3?þ-°®+>YIEND®B`‚kildclient-2.11.1/doc/C/images/we_advanced.png0000644000175000017500000012343711407660236016020 00000000000000‰PNG  IHDRÇžIw¶sRGB®ÎébKGDÿÿÿ ½§“ pHYsÚk¥óÎtIMEÚ 4.ùÀ¸tEXtCommentCreated with GIMPW IDATxÚìÝyXTåÛðï03ì( ¥`iæZ¦V‚,C²Z*– J.•¡¢(нåR".Õ¯qÍ °LÌ¥Ü0“dH#5Ap«”e˜8ïÈ8³œ™9÷çºæRæœç~–93sóðœsxùסè›ÄÛÌ?âJB!„Ò’=ÛÖ ÛömçÃ0Ã@P·qÇé{ /À W»¡²FS>`*hÝÆkÔÊxt„6ækÕJÇ›Gã¡y\Zë80Lí?­ýƒ„Q= »Ý髨QÇÛ ªh´!‘’ÀÂD†gmg3& ƒåÛÖó¼‚üëØqúÓͱlÚ¶C÷ö€½%“ÖüMÉküùq¼Fì›Aõ§™•×)޾eõ)§!Yã5RµåX&’<.Êé´\NÏ™×ĉ5£ï«>‰±B]F/W¯_ú–cUVŸä˜Ã2Ëiy}õ-ghYqž²ò\Çѹ¾FJŽ™&JÈ›#Y pï!ƒ¿Kû%ŸQTŽe[Öñ`ÂçÃÒÚ.!Ÿf0Á0-w©^ß4ò ¹‘ÆXç~R¿š²ZÛ o9Ž?yzŒ‡Êr,ǰAY}ÊéðzRxŠ_:#õ“Sž‰6›c1ôý§OrK‰qã%-”ƒ£²ŒŽñ&ùjj&íФººZéó†ÇãÏçs2ÆœÅ~JÆG`8Øð`gÉ £ÚUÿ•×î/{i óÒ‹Ï£oG!ÚZ¨ž.¾ÿ>jjj  Õ6F,ÃÜܼå$‘5“Ûuaö˜×í Ùcng‚õ-gääeõ-§G²Ê3 l³üŘƒ„¸Q’â§%1æxÖ¸Y$ƒM”ܶ”äZïñgÑ^™L†òòr”ŠÅJ¥ÉdxôèÊÊÊPSS@ýþì_[,C*“AV]ÍYìÆbHø&<MTñ,Щ˂ŕ¨f„  ‘H°#.cÇêœðÖèš(k*ãããüü|ùÏOÚWPPïŸlr>ÃbŒ*CÛA ²æ$BKr¦o9C]•I—I²¾‰.£"Éå"¡eÔ=T%°ú<ÔÄç"ÑV¿Qêzã­Sy}j5¯1Ãæ=¨o9JŒÙÿ¢mH’ù”œ„Ƕ.™L†[·n¡[÷îɤ¨¬¬DUU$‰üQUU…ÊÊ ÈdÕèÖ½;nݺ™L¦µÚºØÝYÆî®CìÆR¿ee÷Uö¡¬L̪fŠÉ±&¥¥¥€.;C*•â»ï¿‡«›bbcñÆo ùäI 2D¯NÝ+*Vz°-ÆH$BVV&àæ­›øã?píÚ5À…óçáááÁú€mÔß‘³N®dCc´æY×/ZÉ®¾_´M‘$CS’¬g¢«o’«.¡5úl°1ßßšf™õM°5$Ãz%Ôº$µM•ò ­†r†¼ç(16â÷V#¼¿Ù¬5f%%%°´²SSƒÊŠJH%RµÊŠJ€a`ff†’’’³£õgKJJ`em­2ö¥‹—TÆ677W»i>âöaÑÂEøäãåý‘TI°bÅ ÌžªS´&Çÿþû/àz~>yzbÞ¼yàñxظaöïÛ‡Î;ëݱ’âb¥GÂÂB¼ýÎÛèß¿¾ùúk¥2ÏØ×Î`×Í«›uvuuCff ;+ÖÖÖ8“‘øýüïpqqÅ›70vì¼òJŽÅ­›7åå{õꉸØXxz½{õlðæ)(,Ä𷇣_¿¾øº^Ÿª¹9$·-%Anì/ÝÆJtu,«o¢«µý^¼ˆ%Ÿ.Á£G°rå ü–œŒ•«VéÔm_…7 Û¶mC^^„B!N$Ç»ï>>…ÑóË*j·-_‰wÞyW¯ý sK  Œ|ùɬ³r|'g'œ={ƒÌÌs˜†ôÓ§0ÈÊÊ‚³³3"—EÀÇ×ù…ðôòBDä2¥znÞº…“Éɸ{¯H©n€Áòå‘xçwjÛha®íkT§qQŒÅpSÃ×Óp;£O<Æ0 †!}Q÷Ï6Ž!åÕ}¹5,ÇèXF¹¬¶$C]Yè]Vël2£ý5aX'ËÚ_u‰­ê„U¿”R¯w¢žK(ôo¥†–ªK´Yס%ž¶×•M»Ô&‰º•…Ê#UײŒö²*J2ê>K4”ÑúY¦6Áb8-¯1NƒšTFcyvG»úŒþ1ôè‹®FÃ÷}ýGMM5**ÁÄÄI¤R âbc1cæ ”•݇T*ÁÇ6Ö¯‡T*AUU%x|>**¡¦¦Zm?UÅ–J%س÷GD­‰Âæ­Ûðý÷;#ߦ*vS>TõÁÒÂÄ_ý…±cÇ -- †­m[–}¨—«û®ÈË̓™™°fÍH¥RÄÅíêªy-)—.âVQdÕ5ø§´”õ¤IýeuÛ²2³0yÒ7nÜ@^n.&Oš„+WþÂÝ»÷PUU…;"33 AÓ‚ððÁ|ô!²23•êYòé§ðµu1Ê㔕™‰É“§ âÑ#O×w¢GÅãña¬ù{‹›:ä_Ò¬¾+YµY¿v3JmÑ-£±YOÍnº$Ú*ãk§ñ—uï1uqÔìĦ,£a'öeÁ¾¬ÂéSFëç ‹²\”×øÙʲ¬ÚÏw¥ò,ß^ªbèP^í˜@¿öèÕn-uÈdÕJeÉdòÙÛÈËÑÆÆ¡sBQTT„ðᨪ’à›Õ«åûTWWC"‘B&«V®³†QŽ-«VŠ}àçX¿n=öìÝ ???üôóA|÷Ý÷øaçʱ¥2yì¦|¨êƒX,FUe:;ãöíÛè׿?À0(-)aÕÖË*þ¼xoxx`ÉâÅxoâDøùúbÝúõøîðAÌúv-ÌB¸öê¼;·0}Cr ®³þl¯KlëŠ***À0Œü„@}¦ÛÝÜÜqäð¼ð⋨©a0ÀÉ ±±±pssCÍãétMõðÔÔÔÈ×¶ÔWù¸l¥žmlÒeúžÎ"^sXVa襣tŠÑزÕRFûŒ/8-«±¼ž‰ªÆP×¹QMI­žådfØH'çãd=ƒÖ*3úÌ$³?Žt.¯Ë±oHY#®76diWË+šÃÝ츺ÓÃQ{¸^VQw¹1™T©¤öQ~ÿ>vþ° ¶ml1îÝqIeØÿÓOxøð|IUx<žÒåÊܤˆÇF)6?îÙ‹çŸ{ù_C;[[8xBSrl Y\ÎMU$UUX±©©©H:qyyyøøÿ>BUe¥N}КŸ?ýû÷—ÿ¼zõjtèúâ³20è•þèÛ¥+„|¼û¾Š ž>œtØÕÕ;¾Û©T‚ظXµûYXXàÖ­[ãÄ툃·—7†·—7âãwÁÅÅàææ¦T›»{½÷£¹;â ‘Jc´äÕà¤UÇÄŒá(ÃA{ ¹„”Îå Ip›:I6ÂI}\%Ê\%ˆ&Ì`‘Àâi>ùŽƒÙfm‰·ÞñÙ¼¦z&ÃFKˆ Mn›qRÌy =O|Õ·¼ÊÓÀÄ´Gç¾³¨ÃÄÄfff(--¬º©eåå(ÈÏÇw;wÂ]$ž½ûpëæMÜ¿©Õ55().™™™ü†ªrU±ßŸ4 Ïuê„[·nB"•âŸî mOŸ¡6vSRÕ‡mÛ·#+; ‚½ý38xð þÎÏÇÚµkuêƒÆÞàÞ½{Jɱ££#CC`Âç#õè1H$ù6ᆵ⵮ÝYw¬wï^J:ËW¬DÒñãpvvjÔ@ÁÁÓ1|¸¿RYENÎθÿ>ÜE"€ÈÃpè X¹ês¤¥¦âµ×^ÙŒ ¬Z¹’Åg?#oãñãÇáìäd¼ïNC“ÍÆšµå:±çb¹…&É9›¬Sy®’e]—A°Hú8™f{=c®—\X.³Íœ´IŸøZƇ‹„Úè3̆þU¦$Å\Î3”çº=ÆLæù|>lllpþ÷ °07{2{\v_ÍCÜŽ¸YX€ûâRù6333dýþ;lllÀçóÕNòÉcgŸ—ÇþûÚUÜ(,Ç’J$¸}ëò®\y;;[»©©êƒ»›Ž$üIe% ®ÿÒâ>|^>>:õ7æ‹$æ]¯—áÝÍ´ÁÆøÝ»Š?.\@§NäÏÏÙ²ÿ{—÷„[ßþˆÙ¾]ç[GÛÙÛ7x®niŸÏ‡M›6011Aee%,,,äÛììíåÿ·´²‚¹¹9x<^ƒeuqlÛµCiI jjj`bb‚víÛCüø,E>ŸkÈd2<(/—Ÿ½¨Xb›Uµ±ª²æJWÜ0Âßjÿ1摦âO ¼¦n7·º6ä6×úܺ™ëú–×÷Ò,ʲj»!·y6 ׯQ«bèŸå ŒÏ4v,}®(ahYC®*ÁÕkdHRÛDW•€1“âÆLŒuT^^ŽÜÜ\ÈdRtèÐ>P»¯µµ5nÞ¾ s3sôìÙ666¬bWWËXÇ635C¯^½´Æn,õûðÌ3ö¨xT»wÿ“ïÓÞζ¶íp÷¿µöá·ëìN¾ ¦JSRRðÌ3Ï(%Æ`aV›H»º»ãøþŸ1nüx|·cÚ´iúCª’Ù:ÕÕÕ?¾¾2_ŒÍ=¡æêfF¨—iª˜†$ÔF,«5†!k¹ŠÓ’b.ÛÔ¿TµËG;vìˆK—/£²ª Ý^èŠûå÷•îZ, Ѷ­-òò®BZ].»À‚uìË—/£²²ݺ¾¨9¶L†./³‹ÝXê÷A`bÒ %ÅE¨–Éð÷ß×Y÷Aí²Ššš$''ÃÕÅ¥Á6çîµË&L™Œ÷ß{iii7nªªªPýø¶Ö3ÑÒÈwÑi¬e†¬ýÕÓ ¥†¶‰‹åúþ¹VMtŽÑ'黄‚Ñ'Ž×NÖii†!'ðåInM}ª6‹~årp:Œ·^u°x YÇÔ1Ž.ïÀðeK¬cèp ëÛµŸ‹\ÜJq8XÌU›ôJè ¨G  cÇŽx©woBùå<(›6mѶ];ØØ´EYùC:|fææèÝ»7:vì@À:vï—^‚@]ì²8xøLÍÌÐû¥—XÇn,ÆêƒÚ­ÿý÷ÊÊÊðÁ4ØöŽ‹2r/ãØïYøbå ´iÛ[¶lÁ7ßÇa˜¯^íÚ­U&Èvö¦¡³±z̸ê4Sj̶s<“¬WŒFšM†¶X†ÄÐaVYe –³ÂZg„µÍ¨è8Ó¬s|–õq>»Úü>ĸ™…㸾æ´Ì‚U .f¸›`–˜«ÕÖ>SÌuÛ@GGGXYY¡}ûö(++Ã9¢²¢æèäè///<Û¡Ú¶i£Sò*àèàð$vy9þø#••°07‡c§NðÖ3vc&È\÷Aãšc±X [[[•«¤RÉ<ƒ«wná9ûgPUU¯þ¯¡[GG´f~y“ÆX‹¬&ià5—ös¼.Y¯\¬Mæ2–!ë1†AcÅÑ{×ˆï™æÐ6ZâÏU’ׄI(W‰¬Q“Ø’=)~Jcåæ3¨®®FUU=z$?wÊÂÂfffàóùzç êb[ZZ»ñ~Ç7¼*Ö7|1mmÛª}+š p÷h s*:¿8š$×Ýœ„gä/zS¢†Ï$óf’õIVxÊD<]ÛÅSý¡Éƒk“y*ËkzGðtl ûX<õ_¬âð´‘ð´¿ÓyšÚ¡eP ;³ZÓ¬GæËp2óšà‹˜›Ä–i¬Š ×•ÐÙÜe›ÝNà$ÃQöô‹¥ÃÉ‚Œ~ƒÆèXý^ŒáǦæá0ò/”F®‡Ç>KXZZ¨É7Nb?yÞðØ…›>Ôn4áç8%ÉÆÊZ©žÁoFe¤×|O9£eGͲ⨈¡9/«[ŽèKÃR Íy.Ô®dçñ´6žÇ6Åà±È¬UÆd±Îž§S¶Í¢ngóšûg·|Æ«›Ë¥ÍeùÃá¯3MО渌BužýtÏ«Ë/äŸVœWËkÊßñ›¶÷€ý n”YäÆ^‡Ìu]õÚ¯s\5ëˆYÇQ³~W§8\ÄP÷næ©NÙxºÄÐÐ.µñí‰.«uÅÚ>¡X¬yÖ;6ÛDº$ºÆ~Ï=ñæz)W 5WI?×k»›CBÌE’oŒ¤¸²ºÆNŠ•cbL ’㇮sG!„BHKbee­ô³ !„B!”B!„BÉ1!„B!”B!„BÉ1!„B!”B!„šÆ;äB!„Ò²)çÀ4sL!„BÈctûhB!„ÒjÕåÀLýäXW'=A£IŒÎÇ×B!F`Há©AÁ4‚Ĉ¿É1(,ȧ „BÈÓ‘×%0„p’bB!„4:!B!„JŽ !„B¡ä˜B!„JŽ !„BÑäñ y èy„B!¤õyJî—‡Ž°··ƒ££#’““›UûìííèX"„Biašerœ€3¦cÛ¶í(**Ɔ 0eÊdœ>N¯!„B1rrÌÔÞ:¯¹\²8(h¾ýv3üýý£Fš5ÑÈÎΖï#‹8ŽŽŽ;v îß¿/ßfoo‡µk£Ñ¿?88tDBBërß|ó <>ÿ|•Òþ÷îÝCFÆlÛ¶AAÓX—sttDbâq@hèl„…ÍC~~-ZŒO?]BG!„BH öT\­ÂÞÞNþ¨sìØ/èÙ³'„B!†Ž£G*• _KKKøûûC*•².çïï+++ÀéÓxûí·aff†ÀÀ@ˆÅb:b!„BZ0ÁÓÐÈ¢¢by’\§¸¸;vÿÌçó•ÊØÚÚªŒ¥­\›6mö-BLL,._¾„œœ?éh!„Biášå̱P(TZ' Ôž¤' •’ßþùEEÅ(**ÆÿÝe[—rãÆÇÃĉ±k×.:Z!„B(9n|Û¶mÇŒÓå ²âÕ+êøùù!//2™ ;wîÄСCXÅÖ¥\nn. gçØºu+-„B!-\³\Váïïo¿ÝŒ  iJ¥ …ضm»ÒIz‘‘‘ÆéÓ§Ñ£GlÙÂ.yեܺuë1}z0JKK6ŽB!„Ž7æ‹$æ]Ï—0¨kíÚÛŠŠ VOþzSƒ‚Á0tg=½‚|ty¡+ òi0!„b4€”‚jüøÛ_OÇÕ*!„Bi ”B!„BÉ1!„B!ÊÀ ùÜ:šB!„ÆR?ÐÖd€“Sƒç²³²äÏ×ÿ?!„BZJŽI«T?ñ¥D˜B!­9&@팲ªYe™L†¯¾ú ž^^ðöñÁW_}™LFF!„´P4sLˆ[¶nÁîÄ’%K  ±téRØØØ`ÆŒ48„BH D3ǤUª›)V5[¬èÈ‘Ú[˜{{yÁÇÇpô—c4€„BH ¥0sL—« ­Û5ÆEEE_??ùsÿýû !„Òb0ê’cBH}íÚµCQQRN‚•• !„ÒÂq¾¬"==F•´C† üòË/ÈÉÉÁ''|<†Bi¡8Ÿ91â|¸ü«ÉQv6|}}àèè€>}^F||<ÀÕÕ……€ëׯÃÍÍ•Ž"B!„Ê(ɱH$2J‚,•JUn š†U«Váöí;Ghh¨Òöß~KÆåË! `4–/T#4t6ÂÂæ!?¿‹-ƧŸ. : ‰‰Ç'NœÀàÁƒé¨!„B¡äX÷yÚ´i1âTTTµ"‘ÉÉÉHMMÅàÁƒ‘™©ü§óðð077G@À$%%©ŒqútÞ~ûm˜™™!00b±øqr<Ç'~ýõ|}ýè¨!„B¡äX7éé騾};< £vbóæÍ(-c„ñèÕ«'þøã¥í:uX[[£´´TeŒââ"|õÕW˜2e2\]Ÿ,prrÂÕ«WqïÞ=\¸pnnntÔB!„Pr¬[bÌÅIyŠ  Un³³³ÇáÇ‘Ÿ_€•+WaüøqõßÚ“÷ÊÊÊðì³ÏªŒ1nÜ8ðxíÛ·o0;¼vm4$’*ìᨒ S#77ƒ†³ó@lݺUiÛСCñÃ;áçGK*!„BZF)6Êò¸HŒ¯F¡ê:ÇŠÖ¬‰ÆÜ¹sü!ø|~ƒ$ÚÁÁ=zôÀ Aƒ°qã&•1Ö­[éÓƒQZZа°yJÛ\]Ý •Ji½1!„BH Çyrlè @v×0VÜÇÙÙ§Og¨Ý7$$!!!cŒ1#FŒÿ0!„–ª¹$Åò¯ÛÇÿšÐKC!„B%Ç„B!„PrL!Í‘D"¡A „JŽ y: prjðPܦêÿ\¹sçúõë @ùàMA±-šèÓNÅ2lË«kºòlë`S¿>íÕÄËËSík®êaŒ×@›‹ÿ„‹Ë@8::ÀÛÛçÎã,vSÛ„ÈOÈ£a#;+K§ç¹’™™ ggçf1Õ¶WšÑµ=\\ÁÆXqóòòÔöËXíÖÕúõ0iÒ$L›„¨¨Õغu+H„§˜rL3Ç„p@ÝlqYYf‡†ÂÕͳfÏFyy¹Ö2ªdeeÂÉéI¢ôÓOûѳg88tDBB‚üùââbŒ†££F£¤¤D¾ÍÞÞ11ÛÑ«WOôêÕGŽÁÉ“'ѧÏË âˆÅbŽ…££#ÆŽƒû÷ï«l‹¦ý­Y³Ÿ}öií/ÙÙðõõ££úôyñññ*ËÔŸ•]»6ýû÷kÐÖúc£­~u³“ÅÅÅ5j$ºv};wîTÚvýúuxxˆÐ½{7;vLk{5‹º¾Ô•¯û—M¿Ø´OŸcE“ ÎãÝwÇÁÌÌ '¾‡K—.6ØÇÙÙ ……€?ÿ̽½233ùùùpz|ìÛÛÛá›o¾‡‡ˆ>D!Í%Ç„Ѻuë1wî\¤¥¦`äȑشéÉíËu™m®?‹xñâ%üñG¶mÛŽ  iòç#"–bº¨v IDATĈ(,¼áÇ#"b©Rœ+Wr‘ý;¾úêküï_âÂ… 8w.³AœÈÈHDD,Caa!Þ{ï}|þù*•mÑ´_ ÖãÒ¥‹X¶,:aaóŸ_€E‹ãÓO—°ƒ{÷î!#ãLƒ¶j›9®_¿:Ë—G" ` ®\ÉÅ… ”¶EF.ÃLÂ?ìÂ’%ÚÛ«m\Tõ¥nf¸î_]fÄ5µOßcEþùmÛ¶tèð,nÜhxx???œ:u ’’ ¤¦¦~ýõWøúúÈ÷uttDbâqú° „PrLÈÓHÕzcMN¥œB×®]!àãíß~ûMç:%’*äææ¢_¿~òçBCCaaaH¥RùóIII5j4„B!Æ4H:þïÿþÖÖÖ6l._¾Œàà`XYY5ˆsìØ/èÙ³'„B!†Ž£Gªl‹ºýêlÞ¼»wïÆ† Àãñ§Ogàí·ß†™™!‹YCxøXZZ*µUÕØh«_¤¤$Œ9fff˜?¾Ò¶ŒŒ Œ;...ÈbñK¶qQÕm¯¹¦5ÇšÚ§ï±¢NEE‚ÚyB¡©Ê“}}ýäÇzjj*f̘ÔÔyrìãó$9ö÷÷‡••}¸Bš Akì´D"©©)½úDgº®-‹Åpqq‘ÿÌçóu®ó?rлwo¥c¶]»v*÷---… ÀÚÚ¥¥Ê*·³«M¨ê’kkk•qŠ‹‹Ñ±c‡í®ßuûÕùý÷ßqÿþ}ÃÑÑñq™"ÄÄÄâòåKÈÉù“õ8ØÚÚ²mõ«S\\,OÒ:tèÐàuTU¿¦XšÆE[,UýÒ´æXSûô=VÔ177‡L&ƒ@ €T*………Eƒ}<<<0o^$’*üùçŸØ²e+^}µ?ÊÊÊ™yÛ·o—ïÛ¦Mú`!„4+ÍræØØg,+žNˆ1µ±±ÁÙ3g•…ì¬,œ;{VçºüyÝÖ¶***ååå #m³§ŠÉÛ?ÿü‹¢¢bã¿ÿîªl‹ºýêlÞ¼sç†aÕª•òçÆ‡‰'b×®]¯¶±QU¿:Ï<ó ÊÊÊäÉ­"ù6CÆÏ¯¹>ícs¬¨Ó©S'ùø©ü¥ÃÜÜ/¿ü2bbbñÚk¯¡M›6èÛ·/Ö®Æ+¯¼KKKúp „4ó䘩½u^k¹[­âá„“H$B~þuȪ«qàÀAL™:U纜˜åëëƒÄÄDH¥RüüóOðõõÕ«Ý~~~ÈËË…L&ÃÎ;1tè•mQ·Ÿ¢É“'#''G~âVnn. gçØºu«AãËflêׯÎСðgÏH$UˆŽ^£´mà@>|™™™ò“Éô?mø|>Š‹‹uzÍõiŸ!ÇŠ““~øá& !ÄXêr`F)9nÆ4¥noo‡àÅ»bøðá(**RÚV?Žª 1¦yóµ"‘»wÇcÉâ''K±]·¬K¹±±1èÒ¥ Ž=ŠåËWèÕîÈÈH|öÙgxþùç°eËfDE­QÙuûÕOø"#—#""@íIŠÓ§cà@gtëÖÍ ñ­ßUïëúõ«³dÉœ8‘„~ýú¡wïÞJÛ–.]Šèè5˜8q‚ʓَŸ6ƒFß¾}U¾æšÖëÚ>CŽ•I“&#>~ºu{û÷ïÇìÙ³TŽ¿ŸŸŠ‹‹’ãA¨¨¨PZoL!ÍoÌILà Þu®ýs«TÊîM'=©AÁ`Œ0Ýloo'__goo‡™3gbáÂEHNNFPÐ4üóÏ¿òmï½÷¾øâKÄÇïÂ… ½¶A U1›Ë5C‰j…ùèòBWä·º¾ó½E!„Ðw½2¡°öüŽô› öœºòtœ§éÌîðð077G@À|õÕWt¤£Ð4Ëkì€Ò˜4ýU&!­BrÜ|g©4ÙÝ©S'ug[—Ò+JŒ‚`ÒZPLi}ZØòêΚ.++óÏ>«qB!„B4yê“ãµk£!‘Taÿþý6l˜üy¡Pˆ„„TTT *jµR™º3 !„BQôÔßÄÁÁ=zôÀ Aƒ°qã“[óÖÝ*ÕÊʪÁíTëοsç¤Ùj'#B!”« ¸æ­þú·ú?‡„„ $$¤A ùU-`òä)òÿïÜù½ò¤Y£+UB!”BøøúѬ1!„Ò”É1ƒ§óîxtV5!„B1DýØ„†„B!„JŽ !„B¡ä˜B!„-É1ƒæ|—ÀÉ©Ië?a«¶èÓÎääd¸º¹!jÍÖåõi×ín.¯‘¡õªÿ¦>æij”BZ¼ðùó½6Z> *•J±vÝZ,§ÁÑ"?ŸÝe³³²tŽýÉÂ…ø|Õ*„Í«WybB(9&„´R]ºt««+âwÇvÿ¸nnnèܹ3JÅb„„„ÀÕÍ !!!‹ÅòrõgÐÔͨݸyïÂÛǧRRäÏ_¼xï½ÿ\ÝÜðÖ!8|ø°R¬¸qæïWW$''kíGYYf‡†ÂÕͳfÏFyy¹ÖºFމ[·nnݺ…ÑZcÕï¯b¿áëç× ÍŠû$''ÃÅÕ...7~Î_8¯2¶L&Â>ÇS*ϦmP*cÆÌäé‰j»¼¼\Œ Äô3 —ªÜ‡‹×+66Qk¢4¶EßzØöWS|6ãÏö˜«O]»µõwïÞ½ðó󃟟NžLFFFÞ2¤A¶m!„’cBa!øÃ`ìßÿ®^»†ýûöãàÑÑÑð쇴ÔTøøø zm´Î±×­[‹Q£F#juV¯^->bÙ2L™<)§N!dfVG)'M%%%Ø¿o¾øüs|²p!‹zÖcîܹHKMÁÈ‘#±iÓ&­u½ñÆ8sæ àìÙ3ðä©5VºÙDÅYż¼«H8rDc›?Y¸-X€Ó§O#(h–E,c›M?­_¿CÞŠII¸ü×_ÇnÏž½øaçNLúà¬]·Nå>†¾^ßïüyWó67Lc[ô­‡mµÅ×6þú¼šÚ­­=_¿ŽC‡á“… ±eËf\¾ü~þùçqti !”BˆÖÖÖ˜4éL›6 “&O‚µµ5€ÚµÇo½ù† ‚””4cŸÿý<† ŠW_íƒÈŸß·w/|}}`jj ÿa(++S*4-ðöö†L&ÓZÏ©”SèÚµ+|¼½ñÛo¿i­KäáŒÇÉñ™³g1ÈsÖXš|ðÁû077רf§qæ 2³²à!á€Â˜°Á¶miiéxóÍÁ055Å´iS5Æü08¦¦¦pvvBJJªÊ} y½vÅÇãÈá#ˆ\§±-úÖö¿ÚâãµÐÔnmí™ KKKxyyáêµk?~,UÄÑ÷˜%DWtûhBH«1rÄH¬\¹ #Þ!®¬¬ VVVKKK”•Ý×9nYy9Ú´iÓày±¸{öîõkWqåJ^ƒíªÊh"‹áââ"ÿ™Ïçk­kÀë¯#""R©×®^Cÿ~ý´ÆÒ¤mÛ¶Z÷Y¹r|ô1 °uËV¼ôRoNú©´_i),,,övvcÖm„(W“,òz]ºt ååå()£Ã³ÏjéŸ~õ°í¯¶ø\s¬Û­¥=¶¶¶µ¯ÍãØ–––·…CÈgަùÜBÚÞÞ®E×Gi¢<¥ÀƦ *++>D[5_ð¥ k‘ë³²²Âƒ}‡þ¯¾*ﻦX†²µm‡m[· åÔ)„‡‡cnØ\Îú©¨½|ÜÅ^¸rå @"‘ ]ûö*÷1äõZ¹b&Ož‚7jÝWßzØö—Ë㎋ãD[{´Í´sÙBT©ŸÓ² EEÅ4„´R"w7¤¤¦B&“áøñD¸»»Ë· $''£²²111jcôï׿þz9991r¤üùëùùðy _¿~ØýãÃÛ*!?ÿ:dÕÕ8pà ¦Lʪ.lÙ²žƒ±Š¥ˆÏçküÅ@•±8ž”>¶mÛâþýûœõS‘§§'Ž…T*A\\œÆ˜Qk¢!‘HpæÌxyy©ÜÇÐ×+ `4r¯\ÁÕ«šgkõ­‡m¹<îØ¾Æè¯1ÚB«‰”§­ÁÅÅÅ GGŒFII‰|[II FŒx={öÀæÍ›•f„5m«ÿÿµk£Ñ¿?88tDBB«„§Ó¼yó°oß>x¼1ɿ¼ùóåÛêN:l^èÒYmŒ9sB‹yóç㣠äÏ/]º‹—,ƨQ£Ð¥sgÚ†¨¨5‰Dؽ;K/aU—‡H333¸ºº²ŠU¿ìСÃtjç§K–`Ë–-pssÃ' â‹Ï?笟ŠfÏš…ôôt 滽¨1æÂO>Áø °wß>Ìž5Kå>†¾^|>aóæaMôZê¯n¢o=lûËåqÇöµÐ„«öpÑBØàù"‰;¨7ÜŸ«TWW³*xòט Æk1ìííÔÎæ††Î†³³3ÆŸ€;¿Çùóç±vmí™ÇáááèÚõ}ˆE‹á»ïvÈãhÚ¦XŸ½½fΜ‰… !99AAÓðÏ?ÿjA¸UX./tEaA> !ä©ôåÿ¾ÄÇÿ÷1 !Í\ÝúõŒÛ&ØsêÊÓ7sœ””„Q£FC(" ` Ë·?žˆ÷Þ«=“zÂì¶mõ…‡/€¥¥%üýý•nªK B!­›¥¥ !O¡§.9.--… €ÚK3•–>YVqïÞ=ù™Ô:tP*§i[}ugÎÖ§K B!­[èìÙ4„Prl|¶¶íPQQ(//G»víäÛÚ·o/?ñãÞ½{Jå4mc‹‹„B!„’cÎøúú 11R©?ÿü|}}åÛ††]»~@UUÖÔ»}§¦mlqƒB¸ ¸ä«%ÖG¯GË #Bɱìíí< 2r9bccÐ¥K=zË—¯—Y¼x1ŽKÄË/¿„çž{N~amÛØâ"!¤ùR¼º€ºÿ«Û¿±Ÿ0¡Éê3´ßlÆöi£ïëÁ¶ÿ7n\ÝÜ0nüxdffq^W¯£º±`{ µ”c‚<½šåò4]ÂÞÞR¹­}ûö8tè¤R)vïÞ×^{Õ6Åúê×­ø³¦„§_vVÖSÓÖüüü&«ïi§–ðz\º|Ë"#±t)^ýudffbÑâEظazôèÑìÞ;êÆ‚íÑñEšZ‹º HHÈLtïÞ ]ºtÆ?îFTÔVÛ¸ˆOi¾FŽ‰Û·ors¯`€“rrr7oݒ߸CŸ«¼¼\Œ Äô3 —ÊŸ/++ÃìÐP¸º¹cÖìÙ(//WYþâÅ‹xïý÷àêæ†·† ÁáÇåÛê·§îçúÿ–ŠÅ «›BBB”îž6ÀÉ {÷î…ŸŸüüüpòd2222ðÖ!pquErr²Ö¶¨«nܼ‰ÀwáíãƒS))¬ú¥Êè€ùktãæMŒÓ`±XŒàéÓáëç‡]ññJíÐ4Þœœ·#ÃüýôY[¹mÛ·#ðÝ@ÆGSÌR±3fÎÀ OO8pÕ1‹ÐÐP¸ººÂÔÔ"‘Á~ˆX…hê£.c¬oÛ5#êžOLL„¯Ÿ_ƒö*œ WW¸¸¸`Üø 8á<} ‘ÆKŽ›Óí£õµqã&\»ö7îÜùGŽ$ k×®¬¶qŸÒ|‰D"œ=wp.3æææò?KŸ>}îînzÇÞ³g/~ع“>øk×­“?¿nÝzÌ;i©)9r$6mÚ¤²|IJe˜2y*RNBÈ̬ŽÒ~>CÝÌZÝ¿ÑÑÑð쇴ÔTøøø zm´Òþ_¿ŽC‡á“… ±eËf\¾ü~þùgùMN´µ¥~}ŠÖ­[‹Q£F#juV¯^­w¿¼<½’šHOO‡‡‡¨Á>6n‚‡‡G=¿^;4wII öïÛ× ÏÚÊuxöYÄÅíÐi|4Å\¿~†¼5'’’pù¯¿XcçÏ_€»›ò1êéé‰ììlV}ÔeŒ m»ºcEÕóyyW‘päˆÚöÀ' ⣠púôiMòˆeôF8G·&„´:îîî8{æ, 33 &ŒGfÖ9yrìæ¦rüap0LMMáìì„””Tùó§RN¡k×®ðñöÆo¿ý¦²ü¾½{áëëSSSøûCYY™ÎmHKKÃ[o¾@€!C† %%Miûôà`XZZÂËË W¯]Ãøñã`iaoooÈd2ƒÚrþ÷ó6t(^}µ?8 w,OOO¤¥¦*üÂ"RÑÏTŒ1fffú0Hi›¶ñš }ÖVÎÛÛ–:õISÌ´´t¼ùæ`˜ššbÚ4v·?./+C›6m”žkog§ôM}ÔeŒ¹n»&|P{ßuí§qæ 2³²à!á€Â1Fˆ±(¬9fh4!-’““V¬\ ©T‚ÜÜ\¬Z¹þÇãÁƒÈÉÉÑùöÆŠìíjO„(WH–Äb1\\\ä?×Ý©>±¸{öîõkWqåJž^m(++“Ÿ lii‰²²ûJÛë®Ý.xÜKKKÎÚRV^Þ qÓ'Vß¾¯ ¿ %%%øëòe¼®âœŽ’âbùuîëÆíx«j#›rÖÖÖ:÷ISLqi),'Ûõû N›¶mQ^^®t þ²û÷å×Ý×ÖG]Ƙë¶kR¿ýª¬\¹ >úaaaغe+^z©7}¨Ž1Jÿ h@!-™™ºw{÷¡ÏË/ÃÚÚ½zõBÜŽ8ôìÙSþ…¯+W® OŸ>H$h×¾ý“DÅÆÇŽƒ@ ùcvΜ¹xcÐ ŒxgfLwÀØÀ@•û•Ö›%TdcÓ•••077ÇÇѶ^’ÄãñXõ…m[YYYáÁƒò¤UßX&&&pws÷›· _¿~ … “)[[”?NÆKJJ”C–ãÝ ñÔ¡Û>iŠÙÞÎN>^b ¯©Ò/w -=ÃýýåÏ¥¤¤bÀë¯ëÔW6cÌuÛ ekÛÛ¶nD"AÂÑ£˜6ÇéC-« „´ îî‰‘/¡8p âãw´Þ¢ÖDC"‘àÌ™3ðòò’?/‰Ÿ²êj8pS¦ªþ3ôõü|xˆ<Я_?ìþqÒ6@€äädTVV"&&FiŸÏ—'Ì"w7¤¤¦B&“áøñD¸»»ëÕMmQ¬OQÿ~ýñë¯'‘““#?±Q[,u<½šbΞ5 ééé:Ì/v{Q)†º«¥ôèÑ˵z5<<<…å‘ËÑ«—îË ´±¾mgs¬¨{^“O—,Á–-[àææ†O.4h !lñÆ|‘ÄŒÔnª555¬ žüõ¦ƒah­2á^aA>º¼Ð…ù4„´YYYøfuâwý q?™L†ÃGŽàرcØüí·4pFcBZ“Ú¹â3wL°çT.­9&„Ò<Ì›7Ë–EªÝþÙgŸ!5- x¥O,ˆ AãxŒ !tB!„f"55UãöÈHJêŒ=Æ„ZsL!„Bˆñ’ãôôô&ëŒD"iÑõBHk%•Ji!›suûè#Þá$AÞ¿ìííðÓOûY—ñòòlÔÁS¬ÏÞÞŽŽ&Bš±ääd¸º¹!j͵W¨OÓ~ê¶)>¯Xgc`Û¯¦¤oÇO˜ÐâŽI.ŽCBˆáä90£”3 ÃM:ÅàùСC6l:ĺL^^^£¦b}EEÅttÒŒ}²p!>_µ asç";+Ëhõ(ÆV¬“&?¿õ^¹Æ˜Ç+! r`£¬9މ‰5(A~ôèÒÓÓñå—ÿCjj****äÛêÏÐÖý\ÿßââbŒ†££F+ÝMÉÞÞ11ÛÑ«WOôêÕGŽÁÉ“'ѧÏËpp舄„„'JÙÙðõõ££úôyñññëeS÷ÚµÑèß¿_ƒº!Æ1ÀÉ 2™ >ú<Oi&®¬¬ ³CCáêæŽY³g£¼¼\eŒR±3fÎÀ OO8pPc]ªê¬3: ·oßܸycÆÈ㇄„ÀÕÍ !!!Jw «?sÈf&166Qk¢äûÇíˆÃ0¸¸º"99Y©_ªê9r¤¼¹¹W0ÀÉ 999€›·n)ÝðC×ýáëç× -/^Ä{ï¿W77¼5d>Ü`Ls,Õµ¥®Ì¶íÛøn gÇÛ6kz-Åb1‚§O‡¯ŸvÅÇÓŒ3!z2Jr,‰ J“’’àää 899!))Ik™º™Ûº#"–bĈ(,¼áÇ#"b©ÒþW®ä";ûw|õÕ×øßÿ¾Ä… pî\&¶mÛŽ  iòýBCg#,lòó °hÑb|úé•õ)ÒV÷½{÷‘q¦A]„㨛yS5·nÝzÌ;i©)9r$6mÚ¤2Æúõë0ä­¡8‘”„Ëý¥w^ž^HIMP{ކ‡GíÍ¢££á7Øi©©ðññAôÚh½ûûýÎï‘w5asÃäÏ•””`ÿ¾}ò‹ÔQW¯H$ÂÙsçç23annŽÌÌÚ¾œ>}ºÁuÙ?/ï*ŽiЖˆeË0eòT¤œ:…™!XÕdc©®-u:<û,ââvpv éÒfu¯å†›àá!ÂÑ„ä_§kÄÒ¬’ãºÊiÓ¦aĈw”f~Ù8rä0†:t¨Òoìº$Ø£F†P(D@À$&WÚþÿ÷°¶¶Æ°aÃpùòeÃÊÊ þþþJ'~œ>·ß~fff du?ymu‡‡/€¥¥eƒº!ïTÊ)tíÚ>ÞÞøí·ßTî—––Ž7ß SSSL›6Uïú<==‘öørZµI£èqü4¼õæ[2dRRÒôŠ¿+>GAä²¥ë iA°°°€··7d2™B¿T×ëîgÎ23³0aÂxdf“·Û­ÞuÙÿƒÞ‡¹¹yƒ¶ìÛ»¾¾>055…¿ÿ0”••5ÙXjk‹···ü}\Cº´Yýk™Š‘#FÂÌÌ AÑ››=í:Çéé騾};< …[|jSUU…ãÇãçŸFxx8ÀÚÚUUU033c§´´666òò¥¥%JÛíìj—Aù>ª!&&—/_BNΟœÔmkkKG!Í„X,†‹‹‹üg>Ÿ¯z¿ÒRùg™½þ'àöíû ò PRR‚¿._Æë¯½ öOóVVVKKK”•Ý×+þ¥K—P^^Ž’R1:<û¬üù6mÚ¨Ü_]½NNNX±r%¤R rss±jåJøŽ ''§Ám|uÙ¿mÛ¶j^‹RìÙ»×®]Å•+yM:–ÚÚ¢øÁÅ1¤K›Õ½–%ÅÅòïCŽQBZ;£Ì§§§cêÔ)ˆ‰‰…H$Ò©ìÉ“'ñú믣¨¨XþxõÕW•ÖU=I\ÕŸgkÛN>c]^^ŽvíÚ)mWœQÑdܸqàñx˜8q"víÚŪŒ¶º !ÍGœ=sÙYYÈÎʹ³gUî×ÞÎ<'Cz蚘ÀÝÍ ßnÞ‚~ýúA(llÚ ²²ððáC´U“•j©{劘ôyùeX[[£W¯^ˆÛ‡ž={6˜ôÐuUæÌ™ ‡ïŒÀš¨ÕM:–º´…‹cˆm›5ikk+_ï¬x® !¤$Çú&Æ@íU*>ø`’Òsï¿ÿ>ª=yA("!!ˆª÷Åçóå ³¯¯!•JñóÏ?Á××W¯¾äææbðàÁpvˆ­[·ª­OWuBŒO$!?ÿ:dÕÕ8pà ¦LU½dÂÓÓ GB*• ..Π:=½®<½pèÐ!H$ÄÆÆÒ››æ”ë›K$dffÂßß_éùáÃßÆÙ³ç ‘Hä'±õíû ºwï®´ßàÁƒÑ·o_@därÄÆÆ K—.8zô(–/_¡W_Ö­[éÓƒ1p 3ºu릶>E\ÕM1¾yóµ"‘»wÇcÉâ%*÷›=kÒÓÓ1t˜?^ìö¢Au¾öêkÉdò5²µí˜‡}ûöÁãAHþíæÍŸ/ßVwâÕÐaÃðB—ÎZãóù|„Í›‡5ÑkYô_}½"‘¥bñ“d×Ù•••pwsS›$ê²}K—.Åâ%‹1jÔ(té¬ÜO‘C‡k´±ÔÔcCšÚÌÖ¬™8•’Š7ßz :Ê×Dt­dBtÁóE3vP/¸:V–w9ùë L n°zzº^‰1!Š òÑå…®(, 3®IË“••…oVG!~×44–œ“Éd8|äŽ;†Íß~KBˆ¶døñRÛ³wøØ“’ûø„<ŽîŽW7s@!D½yóæaÙ²HKN}öÙgHMKCEE^éÓK#"hPa¡.®K…®VÁÐèBH#H}|ù1BcÉ¥ÈHú%=Óc¥ŸLh@!„B¡ä˜B!„JŽ !„B¡ä˜B!„JŽ !„B¡ä˜B!„JŽ !„B¡ä˜B!„JŽ !„Bá 9f0 †iywÉ“H$ô*B!„•êçÀÍræØÞÞNþppèoooäääèËËËÓ¨í$„B!-G³]VQTTŒ¢¢bܸq“&}€¹sçê'//^eB!„òt'Çu„B!Þ}wrs¯ÈŸ³··Ã7ß| ¸¸£áè耀€Ñ())‘ï§ø¯ºýàúõëðð¡{÷n8vì˜üyMe%$$ÀÁ¡#:vìOOOœ9“AG!„B%ÇܪªªB\\^yå¥ç‘˜x±#FŒ@aá >KÔÎ>+þ«n?ˆŒ\†>˜„~Ø…%K–ÈŸ×TFQPÐ4¬Zµ ·oßAxx8BCCéè"„B¡ä˜ukŽ»víŠC‡":z­ÒvXYY’’’0jÔh…BŒ‘'ÍõiÚ/##cÇŽ…‹‹ ²²²X•Q$‰œœŒÔÔT <™™YttB!„HLL„T*ÅÏ?ÿ___ù6>Ÿââb­û è‚Ç#33NNN¬b+‰ÜqàÀðù|´oߥ¥¥ttB!„4sOr`F99~šEF.Gll ºté‚£GbùòòmƒFß¾}µî·téRDG¯Áĉðùç«XÅV´fM4þ÷¿/áè耠 iضm;m„B!OÞ˜/’˜1oôÂÀ޵w’31a—/Ÿüõ¦·È»ê‘¦WX./tEaA> !„BŒ¦¦¦ùŸ{SòZÆÌ1!º¸páL6nîîðöñÁ’O?•/ƒàä„ ËjšBvv6> žÎI,±XŒˆeËà7x0º¸À×ÏóÃÃQPPÐ¨í „BžÒšäååbÆÌ™psuů'N -- -ÂÝ»w±eóæfÑÆàéÜ%¤Ÿ-]Šôôtlݲ}ûöEZZ:|ô®ÿý78Ðhí „B(9&¤Ú¾=R©AÁÒÒo¾ù&Þ|óÍû¥§§có–-(ºw‹/†H$Â7°båJ\¼xÕÕÕèú ›7®..òÙfW~ÿ=[i»ºØªÚA!„´ªäøi¾”!lÕ]ËÚÜÜ\ã~aasñÊ+}wîÜìü~';aݺuˆˆˆÜ»wO©œ³³Ú=¾™Œ¦ýþrðæ›ƒÑ§Odgeá»;T¶åÈ‘€·—|||—?¦¶^EË—/Ç /¼¸z5OÇüùóåí`›BiÉä90S/9&¤5¨»ÛaEe¥Æý,-,Àçó²êêÚdwç˜4y2òóó±hÑ"ùJ©œ¥¥üÿšö¯»ö¶………Ö6|ýüðÆoþû÷µõ*êüüóØððpØÛÛN¥¤`á¢Å¬cB!­ ­9&­JÿþýqêÔ)äçç£ÏË/ëTvóæo_|þ9Àã©Ü§.¡Ö¶¿îÞ½‹òòr¥[¡«Ò®];!åÔ)XYYi­·>¡Pˆ ãÇ#`ôhÄÇÇcÝúõ¸|ùëØ„BHkB3ǤU ‚P(D\\,***pìØ1 prBà»ZËZ>NsórñÓþŸ Úè¡€_OžÄŸþ‰NN˜4y2ÀÚÚððáCÀ!C¿üò rrr0Àɉõ%ÖÆ‡NN8~<&&&èÕ«àõ×_×»~;!„JŽ ia^~é%lX¿ÿýû¼¼½±båJôîÝ ?ùDkÙðùóѶm[„‡/@‹›“hÚæÌé3¦ö$ºàéÓáìì„U+W~ò ÌÍÍ1?<0{VÆŽ‹›6!xú ¸ººâóU+Yõ÷믿†——¾øòyx`ɧŸÁØ0¬X©5vývB!­üyΪhþó¬"ºC1&ºC!„BCõãs‹²þ3ÅÞTºC!„B!rOÈcš&„B!­M½øÉuŽ!¿¼[“óô„ØØ¥çbccàé9Hþ³½½ÑêWŒmÌz!„BHçÆõòàf¹¬âÒ¥Kذa£ü,ù‡"::—.]’ïSTTL¯&!„BáT³]sìä䄌ŒÓ€ŒŒÓprrRÚ®8£›‡Žèر<==qæL†|Ûõë×áá!B÷îÝpìØ“;‰ÅbŽ…££#ÆŽƒû÷ïkmSvv6|}}àèè€>}^F||¼R{Ö®FÿþýààÐ ¬ê*þöî<.ªêÿø öÕ½>mÚ¢–¥c,ƒ²ˆŠZ‰K”d®ˆŠ ¨h˜[K@\ 7úfiB…k* ²cb¢"˜¸U¿>*Œ¦(¿?€if¹ƒ˜,¯çãá¸çÞsÞçÜsá=Ç;wnÞĨQ#ñŸÿ<‰Q£F¢¤¤Dmõé3µ°äØÑÑii逴´t888jÜ××w2V¬XßÿsçÎŬY³eK—†cܸñøæ›o±páB¥íKŽË—/cìØ±rå 1Íš5AA³Q\| ¼‹-T)¿~ý:²³s°yóøúNÔVXØ >—/_Á[o½…°°%‚ÆG[Ÿ‰ˆˆˆ¨…%ÇŽHKK¤§§ÃÁÁ^㾉)))HOOÇÀqüx®¢,;;ï¾û.ìíí‘›ûÏöƒB·nÝ`dd„·Þz ÐSVV6Þ~ûm˜˜˜ÀÛÛR©T¥|îÜ`˜››cذa¨¨¨ÔVbb"FŒ ###Œ5‡4>ÚúLDDDD-,9îÖ­þüóO\¼xW¯^Á+¯ôÔ¸ï—_~‰ÒR)||Æ {÷nøõ×_eR©¶¶¶õ޹yó&žx¢3:thÎ;᯿þÒÓÍ›7°zõjLœ8õÊÕµ£«­ÒÒRXYY¨þD²ÒÒA㣭ÏDDDDÔ0Õr«B“{”›Þ|³/"##`gg‡6m4çñíÛwÀÞ½{qïÞ=ìÚµ cƼ³gϬ¬¬ “É`ccS/‘ÍÏ?###Á1½ÿþû<Ø|ðBBž…Dâ$è8mmÙÚ¶Å;w`ff†²²2´mÛVc‚-´ÏDMÉs]ºrˆˆHgÞw©øâãi¼N,Rlo‚åèèˆeË–cÞ¼yZ÷“Hœ0oÞ|¼õÖ[h×®JKKeo¾i½{÷¢{÷î˜>}ºâÖ žG÷î=°sçN|óÍvüôÓA­íœ?Ÿ}ö9ºté‚O>ùDp?´µ5`€;:„aÆáÇÀ€ÇaÿþýpwwGDÄÁ}&jjøI‡DD¤É‘ä¤ÇÚ~ÝXÔ”ËÁÁrù=­÷@ddàç7†††Ø¼y‹¢lÉ’%;öܺu ëׯWl_ºt)üüü••…—^z 11›tƽS§ú¡´´AA³÷C[[K—~‚É“'ÁßßÎÎlÜø…¢¬ö}*o&ÔÕg""""jƒÑ««F;wƒ]§» ø6ƒ#ÉI˜äë‡*~²=—/ã¹.]¹âØð<‘œòqÝVQû…×MŸ^ØtßGDDDDM7¡}Ü·C<*LމˆˆˆHo'OarLDDDDÔ’ý“WU5¹Ç¹‘pÊ<ÓšÚ&""z(ur`®é!//Sü¦ÂI"Á²eËñ矪”Û‰Å-¶1>>Í®mMãU»ÝN,ÖøOS¹&/^ÄØÇÂÞÁãÆÇ•+W8¡‰ˆ¨Pó  "­ÎŸ/ÀÜà`„†„ÂÑÑ×oÜ@øÒp¸¹¹ã=oïÇ_qqq‹kû„ÒG¾Û‰Å*?«ÛG›%K– (0}úôAî‰X†m[·rbµrþœc÷ÏÎpT©ÑmmÞäbŠý 3ügÀÝÝ ðì3Ï`ÑÂEˆÙ¤úŒìC‡á¿«W£¼¼«V®„›[õþùùùXõé*\¸ðlll0sÆ ¼ýöÛŠÄoúôé8|øv}·Kë¾W®^Epð\\¿~aaapéß_e%õDn.d2>^°¹¹'`g÷V­\©ø˜òºm)KIIAHh(PU…®Ï¿€>š‡>¯÷uÖm[Sû¸áõ>}`hh»7ÞÀ¹süDI"¢Æ½nbcc5–O˜0³fÎl}ámDåž8~ýœU¶=õÔS SM ‹°ß>¬Z¹²:Ѭމ&!-5þÓý±&"Bå¸Î:!6ö+ûFG¯Åˆ#±&kÖTrbm2Zû5:z‘‘ž///lܸQc[ÊBBC1/8YYYðõŒð°p¥vÕ×Y·í¦˜Àk¯¾†_Oƒpút^íÙ““šˆ¨‘Ìœ1C† Q[6dÈÌœ1£Ùô…É1‘@2™ 6¶¶:÷7îC˜ššÂÍÍ •••Šíñqq0ÀÆÆÆ6l(d2™Êqnnn073Ó¹ïÉ_Nbè!xýõÞØ 6†Ô´TtíÚ"‘înn8zô¨Æ¶”‰í쓃㹹p–H T¿®:!÷ÀìÙA˜1s&ú¾ù&¦M÷Çì9s8©‰ˆ‰–,^Œ¾}U÷í+Æ’Å‹a``Ðlú"âé$¦mÛ¶(-)AÇŽÛªªªª“fÅ6åï•I¥¥Ø ŠPPPX¯ÜÒÒRо²²2X[[kU*•ÂÞþŸ]744ÔØ–²åË—!xÞG ‚H$¦˜Mxùå‚êl###Ü¿_¥®Êû÷R' ~¥Z9Q®-ÿôÓO±aý:ôîý:Žçæ"bÍlÞ¼™›ˆ¨‘á³ÕŸaÆÌ™ÈÏÏÇ«¯¾ŠÏV¦×ïô¦€r#¨OŸ7‘™©²-/ï4Æ/èø€€@`ø;ñ¦ÁûZXX ¼¼\ëñÖVV8–“ƒ¹¹8‘›‹Ÿ£­m[lÞƒ´ÔTÌ;A]§6Ý^z Ôyâǵ«WÑ£G‡ª·6FåĹè¼þzõ=Çb;;äŸáû%ˆˆ›¥¥%¢"#àä䄨È‹1MŠ"®ª“‘Vc?ðÁúõ둞‘¹\Ž¢¢",_± cÇŽtüÅâb8KœÑ«W/ì¬óF8}öíÝ«7’“ //ý¼Û Q*•$ Š‹/¢òþ}$$ìÆÄI“Åø®·7'&¢¡!lmlpëÖ-E™¶:•ÛÖÇŒ™3ñé§ŸâÊÕ«¨¼×®]ÃÚèhÌjôó×ó•WpöìYTÞ¿¼¼_ñâ‹/pR=¶¶m½v-lmÛ6Ëø·U4µ5ã/Û`Á°§±lß5)¸¥q¿#Á=›ì3šrlÔ€äªgO,Z´ë×­Gpq0Ú¶k‡>ðÁèÑ£¿dÉ,X¸²[·0qâ¤ï0 sæÌAYy¹Ê›% 29ÙY˜=;¼'~ù]»tÁòå+ŸháB,ýä,X°mÚ´Áª•+eÚêTn[Ÿ§UØ¿ù&JnÞÄ´©SqýÆ tìÐAAèÓçF?¡¡cIØbá¥n/!]eÚb#"""¢¦¯I=çXdh€žÿ1ÇêC¨lO/’a’s'ˆ °9ýXôÖÓøÐ¡#¶düOe¿œâ2Ü«|€ÜKÿ|zاÇ‚aOÁÚL„or® Ž%&í/,ñ,¬L ±ê§ßÛ¿Hý †=ÞϘãJÉ=,ÛwMQ¦-6¢ÖìHrˆˆš$Ï9îÓþ6ÀÔÔTð»GùœcjÝøœã–£K×ç9DD¤ÓãzÎñÝ»w§nš#>£‰>瘈øËŽˆˆèqhÃ! """"ªV³r\ÕdåFDDDDô¯©“s嘈ˆˆˆˆÉ1‘ª&õ(7""""¢SU¯ý´Š#Á=9ªÔèø7"""zx[“c"""""UÕ·UTr#"""¢Ö‡r#""""RÉ1“c"""""U|Î1µZus`®19&""""brLDDDD¤Ö?ÍçQkÃç©Ç䘈ˆˆˆ¨†ˆC@­ÍÉS'sç `dd±XŒæÏGçε;±p"7W¯²‡­¿v{]ºâPþþĉøâËlŠù’†ˆˆZ_r\>ç˜Z‡¢¢"LŸ>}ûŠ‘xø0²²³Š7nàÿ¾úê_‹ãa’âGÕ†òþ~S§r²Q«P¥.9&j-¶lÙ‚Š 9¦øúÂÒ҃Ġ嵫§öö(¿}_ÅÆâÊ•+X¶|9òóóqÿþ}tíÒA³gÃÁÞ^±xx8>ÿüstéÒk>ÿmÛ¶UÔ™™™‰/cbpãúu,X°‰De•¶¢¢QQQ8ðÓOøûï;èÝ»-\ˆ§Ÿ~ZkÛ qãÆ |òþüãOøúNV)S·âl'ãDn.*ïßGtt4öîÝ‹`øðá˜5 †††jÇ,??ÿ]½………044D¯^¯aÑÂEøÏþÃIHDDMï9¦V%·fuô¥—^ҺߨQ£ øxÁÇ=j$ÒÒÒðUl,Š.\@xx¸Êþ§OŸF`@ òòò¥R–š–Ž¹sæâ¯ÿýŸ}öY½¶¾øâKìØ¹³°eó&äææâã ·­ˆÈHœ:õ+üü¦¢èµû(¯ ×~‹íÛ·cæ Ìð÷ÇöíÛ±-6V㘅„†âÌ™3ˆ‹ÃÚ¨(üüóqEŸˆˆˆš2>ÊZ•²²2€‰‰ ÕÕR夰o_1¬¬¬Û¿ÞŽüü|DGGãXNàúõë*õúOŸ|²ìdddª”ÂÄØðÇÔ‹éÀOƒ „¹¹¹JBÚÖ¤îJð‰Ü\äÔÔ1p \]ûc×®8AuíÙ³0`€ªªª°êÓO‘ßɓՎÙíÛ·Áóæã½÷¼‘žžs33N@""jz9põW®S«Ò¶];Àßÿ]/!VfnnþO‚ºýŒŸ0ÅÅÅøøãk®#Õ“ÖÖÖ°´´¬IÀeªu™™ÁÐÐPyÿ~½¶nÞ¼ 0S“< i[“¹¹*ÿ@&“)úgmm#xÜþ÷¿ÿ)úimm]¤×lS7fóæÃÂÂEE…X¶l† †C‡qQ“Çä˜ZqÍjjaáyÀƒÔîW›ÌÀ—_~Xµr%^Ôp;Fii)ÊËË666zÅÔ¾}ûš¤º¬^™¶õQY™"Q¢cÇŽõŽëüÄÇlè¡H<|Ÿö† ™L†+Wr“c¢¦d℉066ÆæÍ[PVV†­Û¶é<ÆÜÂp¾ð<~øþµûlÞ¼©©©€~ýœõŠiˆç@ò‘#8}ú4ìÄbŒŸ0ApÛúH$жbc5?£v¼ööOÏÁ€¤¤D$&&FŽ¡ñøqãÆÁI"­âí”Þ¤HDDÔä“c>ÎZƒ^x7lÄßwî`à Aø¿ÿû?¼ñ†–,^¢ñ˜¹sæÀÆÆsçãÒ¥bµû<õÔÓøïêÕèÓç Ìš WLÓ§OÅèÑÕofó›:}ûбbùrÁmkb'«ü€À€ôêÕ k×®Å3Ï<¥ñØÐ˜ššbÎܹ¿)~ð3ëÖoÀ†1aüŒûpœÆã?ýôSH$Ìœ9 ï½?½{÷§Ÿ®â$"¢&§nl0zUbÕHÉKèe[ý_¥µ+FºINÂ$_?Á÷?éãò¥b<×¥+.ë™þÛãÃ<ˆˆˆèñ©½-òô-+|Ÿq·UÕâ£ÜˆWŒ‰ˆˆš¹Ú¸æ WމˆˆˆˆÀ䘈ˆˆˆˆÉ1‘:Š{ŽyÇ1µ6us`®19&""""RUs[EåFDDDD­O˜+ÇDDDDDLމˆˆˆˆ˜©%âéf'ë} ?Zúñ©¨¨€‘‘¢™Œ)ϯ#¢¦D±r\>ë˜H›7n þ'ÄÁƒa'ãСC𤧤¤ÀÁÑ‘‘Mfì”cjÈ }ññy¨6ýBéqœ¡q ÝïQŽ©rÝ5ÞMñ…usë‹¶óBÔ’TÕɃ¹rLô˜$%'ÃÕÕIÉIŽÏÅÝ»we)))°wp€½½=Þビ§Nª­cÛ¶XDDF¨l³‹QYY‰àyó```€R©þþþppt„¿¿?¤R©Ê¾›·l÷{Þõê¾rõ*¼ß󆛻;RÓÒÛuÕûU,†{¤¤¤¨©îJšr vb1âââàáá9’‚ììl öôT©òóó1öñpptÄ`OOìÝ»WQ‡º¯ _ÂÂóx×ÛS§MƒTZªØ.“É0sÖ,88:aÆÌ™(++{èó¢©ÎºJ¥RL›> ý]\°[¥LhÚâ×4¦ÚÆM*•ÂoêT ððÀ·;v¨]9UWwÝ9!¤>meÚú_·=¡×Ÿ2MsQS_u£-m}iHìBϹ¦ß D-B˜oÈ#jÑÑkQTT„=º Ú?#3¯½ö:uê„×^{ JIuHh(æ#++ ¾¾“^ïø¯·¢B©]™ªýÈHO‡»»;¢ÖF©ìß¹S'ÄÆ~¥¶?#FŒDÄš¬Y³F±]W}%%%ø>>«V®DHh¨Ú˜êªÃo/bÏž= ELÌ—8{ö~üñG•: ,<'LBZj*ü§ûcMD„Îö¿:»vÅá›íÛ1~Ü8¬ŽV·u DFz¼¼¼°qãÆ‡>/šê¬kݺhx‚¤ÄDœ=w®ÎùV‡ÐøëÒ4në7l„³³öïGñEõ«êêÖ4/µÕ§­LWÿ•ÛrýÕ¥i.6ôm1hëKCbzÎ5ýN j¹+ÇDÔ`[·nÁåËWƒöí;:æÈ‘#puépuéää#Š2±²srp<7Î TŽývÇìÛ»KÃÃ``` = ÏÈÀàAƒ!‰àé鉴´ •r777˜›™Õ;îä/'1tȼþzoìVj_W}¾“}aff777TVV ‹º1Lõ󃹹9\]]QtáÆŒyæjꌋÀî066ưaC!“Ét¿(i¤ø§øùÁØØ}ûŠ‘––®Øžš–Š®]»B$ÁÝÍ G}èó"¼ÎL 4ÆÆÆ˜BPPD"6ÅlÂË/÷PæÌ”••¡¤TŠÎ:imK&“ÁÂÂBцLvK¥ÜÒÒRýqee°¶¶Ö»>uÇèR7[[Ûê_N††ŠvÔ‘JK±+..¡  PP[‡öí«c¡L)©‘J¥°··WülXÓ‡‡9/Bë”––¬&Á«Oï:îW—¦q+¹yVVVjcÒgN©O[™®~)·§ëúk¬¹¨ím1hëKÃb8g5üN brLDøæ›o0þ|Œ;—/_F@@ŒŸž¯öÄ¿Pl›:m²sràÒ¿?lmÛbó¦Èårì?pA8¬ôD‹åË–a×®8lذáaaZÛ²²²ÆÝ»wajjŠÛ·oÃFà7 ”——+’‡­OºVÃk¢_ÿþþÎpL›ú$ÞõöÖyLcÅ_PP€ž={B.—£m»vÿ$‰VV8xð D"Q£Å!´ÎvíÛ+Ιò=ÌúÔ!t?¡llmQV“T•””<Òú´•éÓ/]×_cÍEmÇh‹A[_»Ð±Ñô;¨%âmDzJHØ´´t ==ï¼óŽ^Ç'%%c䈑*ÛFxy!9) ð®·7'&¢¡!lmlpëÖ­zuŒ5ç PT¤}•Jâ䈴ôtTVVâðáCprrcï^½‘œ|yyyîåõÐõ= ‹‹á,qF¯^½°ó»]*e†††(­“ 6fü‘QËåÈÉÉQyú„D"AqñETÞ¿„„ݘ8iÒCŸ¡uº¸¸`ÿ¨¨#66¶AuhÛOÓ˜jãââŠ={ö@.—cÛ¶m÷Z·¶ú´• í¿ÐëOŸ¹Øc´Å ­/ ‰]è9×ô;¨E'Ç|Î1‘pÏ<ó vîüsæÌ±±‰^ÇæÎƒ›››Ê6wwwœú5X´p!bbbàèè¨xü—ºd"hölDF­ÕÚÖìÙ³ç~ý‘r4³çÌc@À,ÄÆnÃì9s0/8ø¡ë{–,Y‚ `ĈxîÙgUÊœ% 2´ÑÆ£®ÐŒññA\|ƈˆˆˆZ§º90Wމˆˆˆˆjüó†<>u‚ˆˆˆˆZ›Ú¸æ WމˆˆˆˆÀ䘈ˆˆˆˆÉ1“c"""""-oÈãÛñˆˆˆˆ¨µá£Üˆˆˆˆˆ4à£Üˆˆˆˆ¨õª“s嘈ˆˆˆ¨†ˆC@¤›X¬÷1'rs›U+**`ddÄ“MDD­Wމºqã¦àº\»v 3gÍ‚ÄÙî`Ù²åøû·JÆ6éããÓì^Œ¤¤¤ÀÁÑ‘‘dÌ4Õù¨ÎOcÔûoÍ""&ÇDÔh,\GGINÆ?ü KsDFFýëq(¯n7»q ÅÊ+ØìVêÿsJDDLމ›Õ«W#33Sо………1rLLL`ccƒ€Y8’œ¤²Ï¡C‡0ÀÃöHIIQl/•JáïïGGøûûC*•¼¼¼ðûï×çÏÀN,F^^àêµkîåU/ŽÚUƺ_e2fΚG'̘9eee*ÇÄÅÅÁÃÃ8r$ÙÙÙìéY/Ö””Ø;8ÀÞÞïñÁÉS'ÕŽG©TŠiÓ§¡¿‹ v«”iŠÅN,Fee%‚ç̓ʊ©XŒØ¯b1tذz1ië›¶8êŸÃóx×ÛS§MƒTZ 9j”â\¹z£FV;æ‡áâê _ß)(--U[Ý`埥R)ü¦NÅ|»cG½¾ ¡ç†ˆ¨Õ&ÇU೎‰*:z-ŠŠŠÐ£GwAû;99!** {öìÅ¥K—`hhˆ¤¤¤:ÉWöïÛ‡U+W"$4T±=** =‘žwwwD­­^q–H$8öóÏ€Ÿ‡©©)ޝ^EÌÊÊ‚““£ÆxjWk¿FG¯C`` 2ÒÓàåå…7ªìÿÛŋسgBBCó%Ξ=‡ü±^¬!¡¡˜Œ¬¬,øúNFxX¸Úö×­‹†çà!HJLÄÙsçꌭúXêÆ\WII ¾¯“¶¾i‹£®]»âðÍöí?nÖFG\]\‘–žÈÌÌ„³³Dí±ÇŽåàð¡CðôŒèuÑzÏ·õ6ÂÙY‚û÷£ø¢öMã ôܵtUuòà6ŠÍUU|œQlݺ—/_ALL Ú·ï è˜E âÁƒ*ìŠûÞg‘£Fáüù•}Æû¦¦¦pssCee¥b{FF ‘HOOO¤¥e(îc9ÇÇçÂÇg Žçþ¬HŽ÷)5-]»v…H$‚»›Ž=ªR>ÕÏæææpuuEÑ… 3æ}˜›™Õ‹Ulg‡ìœÏÍ…³D‚„„µíeddbР066ÆäÉ“ôŠEßɾ0S“¶ú´ÅQ×??£o_1ÒÒÒ...ÈHOWzA"Ñ›‰‰ <==‘‘‘©÷œËÈH‡×p/˜˜˜ÀwŠoƒÆAè¹!"jùÙ±jÌÛ*ˆô· ¿ÿþ;à—_~All,V¬X¡W¶¶¶Xðq(¶½ÉIIxû­·±dI˜Ê>666j•Éd°°°˜››C&»UìˆÅÈ;}rœ?ãÇǹs(//G^^úŠû ŽO*•ÂÞÞvb1Þ´·Ç›7ëÅ"CCEê,_¾ ·nÉqî\úöJKaffèо½^±hbmm­wß´ÅQWm¹Hd„2™ ðÚk¯¢øÒ%”””àÜÙ³x£OµÇvîÜY1n·nÝÒ{–ܼ +++Aqj¡ç†ˆ¨µá£ÜˆôôÍ7ß`þüù;v,._¾Œ€€ëU‡›»;öïßs33XYYaìXÄlŠt¬••5îÞ½ SSSܾ}65ɉ‰ ^|ñEÄÅÅ£ç+¯ÀÒÒÝ»wGìW±èÖ­›"é”XZYáàÁƒ‰ÔÿŠ000ø" -6oŠ\.ÇþˆÃ‡ÕÛ¯]ûö(//‡•••âj¡±èK[}Ú⨫  ={ö„\.GÛvíªWÚ´“£#¾ø2½zõÒøh<©TŠvíÚ¡¼¼íu$·@õ½Ð*/œlmQVVkkk”””4h„ž"¢Ö†+ÇDzJHØ´´t ==ï¼óŽÞux ðÀ×_’’ܽ{±_ýììì+qrDZz:*++qøð!899)Êœœœ°uëVÅ-o¾ù&vìØ©õ~ãZ†††Š$L"‘ ¸ø"*ïßGBÂnLœ4©Acõ®·7'&¢¡!lml4®’º¸¸`ÿ¨¨#66Vµ¿‹ú´ÅQWDdär9rrràêêúO®.ؽ;‰“Æcc¿ŠEE…‚›Ò±*+"RRRp÷î]lݺµÎx¹bÏž=Ë娶mÛ#=7DDLމH§gžy;w~‡9sæÀØØDïãgÏ™ëÿûF¿û.Ü ÀÙ3g¶d‰°cgÏF||<œûõGÊÑTÌž3G%ñ+•JÿIŽûöÅÝ»wá$à~cg‰C† ­i#‘H$عs.XØ qZ´p!bbbàèèˆÐP¬Z¹Rí~3gÌ@ff&† †ç_x¾N'!õi‹£®ÐŒññA\|¨¬¬Ôx¿1têØîîs,þþþj÷©}Ý¡CÑå¹gUÊføOGjZ: Œ'ž|æzü¯€¾ç†ˆ¨µ1½*±j„Ó xÙ¼ú¾»vþ‹Ž$'a’¯ªø&>z._*Æs]ºâò¥¦ñì];±XЇ{ÔêС=Ÿ7ÛJåææâó5Øñí7çRcÍÊÊJìÝ·Ä—_|ÁÁ'"j€’š÷žœû»=~Ìú÷=ŽD[&ÕÍÛìÙ³¾ô‘¶±xñb¤gdàÎ;xµgO, ãÀ5’êä¸ \&Ò¡C‡öR“ß–-½æQnòü/]º”MDÔHêæÀ\9&bBKDDD5ø†<"""""&ÇDDDDDLމˆˆˆˆ˜19&""""@ñ´ >ʈˆˆˆZ›ràê¯\9&""""ªÁ䘈ˆˆˆˆÉ1“c"""""&ÇDDDDDLމˆˆˆˆ˜19&""""brLDDDDÄ䘈ˆˆˆˆÉ1“c"""""&ÇDDDDDLމˆˆˆˆ˜19&""""brLDDDDôoq¨5±‹Õn?‘› 8uêW¬ŽÂ¹s055…D"ÁÜ9sжm[•cÛ´i333¼Ñç „…-†­m[µíÔÖ{ýúuŒŸ0ò{÷°-6Ï<ýô#ïë•+W0bäHÅÏñqqèÚµk½øêÆJDDÔšqå˜Z•¹¹*I òÏ……ç1mútØXÛ"9) ¡!!øé§ŸðQHH½:²230öƒž‘ŽeËWhmóï¿ÿF@`JKKñùçkþ•ÄNž<¥òó©_4&DDDLމ[¶lEE…¾S|annŽAƒáDn.b¾ü²Þ¾FFÆðññdggk¬³òþ}Ì›?……ç±téRôîÝ«z{e%V¯^ WW¸¹»cõêÕ¨¬¬ÔYf'ÃN,ƾýûáæîމ“&¡´´TmÛ¿æU'ǽzU·ù«†ä¸¶N;±³TÊfÀN,FZzšÆ˜ˆˆˆ˜µ@'~ùð|Í­ºTUU 5î³bÅräää:vè¨Ø³);¿ûAAA˜;w.v~÷6oÞ¬³¬ÖéÓ§ˆ¼¼}ZgLDDDLމZ™L055Õ¹¯\.ÇöíÛýû÷׸߾}ûaÿ曀¸ø8•íàæê wwwÀŸê,«å?}:ÜÝÝ™õÚ•JKqåÊXYYÁÍÍ666¸rõªÆUfðññAUUvìÜرs'ªªª0æý÷°ÿ119&jA¬¬¬wîÞÕºŸX '‰»ââ0hÐ`|4¾Æ}·mÛ†5kÖÀÊÊ ÉÉÉJ«“Ó7nxx _¿~€¿þߟ:ËjY[[ÃÒÒPV&«×î©SÕ·P¼úê«hÓ¦ ^}õUšo­€aC‡ÂÖ¶-öí݇¿þú ûöíƒ † {KPLDDD-ŸVAT£wïÞHMMEqq1z¾òŠÆýôyóZm=o¿õ¾Ý± »1a´mÛ7nÜ@Zj*,,,TŽÑVV«´´"Qõåkcc£19ÎÎÎVyÊÆ©S¿ÂÕÕUmÆÆÆð~w4b6mÂG!!¸sçÞó~¦¦¦‚b"""j ¸rLTÃ××FFFˆÝ†;wîààÁƒ°‹áýž÷C×=jÔ(À÷?ü€ÀÓÓðÓO?!//vb1¦øM­eµ6oÞŒÔÔT@¿~Îõ“ã_«ï/^óùç8‘›‹Ë—~ÍûUkœÞÞÞ022ÆéÓ§!24Tô]HLDDD-Wމj¼òòËX¿n¢¢¢àêæ###ôèÑÁsç.Ž7µzUUU€˜=NM}eY9>u‰×ùó˜ŒÐP8::àú_77w¼çí]¯žÊÊJìÞ€¥Ÿ,÷ßl×ÙþŽ;QPP€°%Kþµ>'%'ÃÕÕIÉI*Éqs:oú(..æ…HD­^ím&/vÀ{މš$;±±_Åbè°a°wp@JJŠ¢,??c? GG öôÄÞ½{UŽ-,ùËI 2¯¿Þ»TÇoÇìÛ»KÃÃ+îBãÛÙ!;'Çssá,‘ ¡NÝDD-ŸVAÔDèºwÕÚÚZív©´»ââqáB ë•wh_ýf@‘ÈeuçêÂÞÞ^ñ³¡Ò ­PmÛ¶EiI :vì¨òÊ[&“ÁÆÆFp?•=w‘‘ˆˆŒÄ¯¿æ¡wï^‚bÖÕŸÎ;ÌÍÍqëÖ­zíÊård¤§ãðáÃX¾b¥b_¹\cccõIÿo ,, r\(º€Þ½zé=¶šâÒvŽeeeçÆ™3gPVV†’R):wê¤W<Ë—/Cð¼‘H„M1›ðòË=x¡Q‹W÷i\9&jfa``€áï GdDýÿV/((P$|mÛµSŸx[YáXNNäæâDn.~>vLï8úôy£Þ­yy§1~üø÷mIͪòÌþزu nܸ!(f]ý‘J¥€òòr´o_ÿI"ÙÙÙèùjOÅñ'rsñÊ+¯(V†Õ122BÏž=±u[,z¿þ:Ú´i£÷ØjŠKÛ9¶°°@yy¹úwÙ2L˜06lÐû\ÛÚ¶ÅæM1HKMÅܹsÈ‹ˆZ SSSÅ÷Lމš™‹ÅÅp–8£W¯^ØùÝ®zå‘QËåÈÉÉ«««Ú:$ Š‹/¢òþ}$$ìÆÄI“ôŽcì>X¿~=Ò3Ò!—ËQTT„å+–aìØ± î[í3wŒŒŒ%aa¨¨¨Ð³®þÄ~‹Š 9<75c’””Œ‘#Fªláå…ä¤$­ñ:;;#&&.ýû7hl5Å¥í÷îÕÉÉG——‡á^^õê5j$Π¨¨Pg<†††(­IÐßõöÆáÄD´14„­Úv"¢Ö€·U=&êž#,ä„%K–`ÁÂݺ…‰ë'^¡!!ããƒ'Ÿ|«V®T[ÇìÙAøøã8ñË/èÚ¥ –/_¡wü={öÄ¢E‹°~Ýz£m»vøàŒ=ºQÆçÙgžÁ[Æá¿ÿ] >Ö³®þtêØîîÐ÷Í7ñÉÒ¥*eÈ;‡Å‹©lwwwdž_(’sµÉ±D8884hl5Å¥íÌœ9sPV^®ö͆††š=‘Qk±~Ý:­ñ8K$2d(r²³°háB,ýä,X°mÚ´Ñ8wˆˆZ:ƒÑ««F8¾€îf×”îÔæHr&ùú©¼»¨±\¾TŒçºtÅåKMã9¬vb±ÞÂOÈk:/BZʇvQã»q½:>·~̺ȕc"j‰¢6L"‰ˆèßÂä˜H ] M ÷(“ߦšX3á'"brLÄ䈈ˆš4>­‚ˆˆˆˆˆÉ1“c"""""&ÇDDDDDLމˆˆˆˆ˜19&""""brLDDDDÄ䘈ˆˆˆˆÉ1“c"j€ŠŠ ö‘ZÔØ*Çô(ãkHÝ-m.òÚ"&ÇD8|ø0BBBˆÌÌL•²ŒŒ 6›¾ŒññiñçKSSRRàà興ÈÈFoÓN,nvãÔ˜•ÇVÛñÿæx(Ç$4¾ëÚzÌ£/åyÿ°×@m>úè#NLäj‘D"íîÝ»‡õ6`ËæÍ¸}û6æÍŸ‡7ß|FFF¨¨¨ÀÚèµølõgͦ?ÅÅÅ-þœiêcHh(V­\ WWWNl'rsÙüiHÝq¾•¿oìrí4…ëMyÞ;8:>Ô5P+«å) IDATÛŸyóæÁ××.ýûÃÄÄ„µ(\9&Òaß¾½prrD‡ðÜsÏÁÁÁ;vîìün'ñì³Ï¢T*…¿¿?áïï©Tª¨£îª¦U";±qqqððð€‡‡ŽIAvv6{zÂÞÁ)))‚êLII½ƒìííñþœÚ‰Å¨¬¬Dð¼y000ЫòX(ÓÔw8tèxxÔëC~~>Æ~8ŽŽì鉽{÷ ê»T*…ßÔ©àáowìPé“¶qÑtþÕs!qÔÝ_ù8M}2ëÒ¶Ÿ¦þ*ÇT7>¡ýÓ6Κú®mþh:FÛþ‘ &ÇD­Í‘”£pw øÙoоÿþ]¸€ïã¿Çß)€¨¨(x ô@Fz:ÜÝݵ6ªAíývñ"öìÙƒÐPÄÄ|‰³gÏáÇĪ•+*x¥h^p0²²²àë;áaá*+išVÔ:wê„ØØ¯ÑÑ눌ô4xyyaãÆŠý¢£×bĈ‘ˆX5kÖ(¶ëƒ’’|¯¶/šÊôCSën׫òX(ÓÔw(,,Âþ}ûêõ!,<'LBZj*ü§ûcMD„ ¾¯ß°ÎÎØ¿Å‹ëÄ¡y\4]´Mc«©ÏBæ£>ûiê¯rLºæwCƹ¡óGÝ1ºæ|½ýk"(0Hçy2´ÏÃ^[înî8’r”$ˆÉ1QkSPp/½ô¢âgKKKŒ?“'OÆø ãaii  úÞãÁƒC$ÁÓÓii joªŸÌÍÍáêꊢ 0fÌû073ƒ››*++Õ!¶³CvNŽçæÂY"ABB‚ ãÜÜÜ`nfHMKE×®]!‰àîæ†£Gÿù#xò—“:d^½7v+Õ­k |'ûÂLC_4•5$!tŪ<Ê´µ9n܇055­×‡ø¸8 àccc 62™LPß32Òá5Ü &&&ðâ«rŒ¶qièù×v~4ÑÔç†ÌGmûië¯P ç†Îut̓owìÀ¾½û°4< zõ»!ãó°×ÖKÝ^¹sü#A-ï9&Ò¡¬L+++•m^ý°|ù g¸b›L&ƒ……ÀÜÜ2Ù­µgkk[}q*êÒ×òåË<ï#A$aSÌ&¼ürÇÕ&ú@õ5ÛÛÛ+~6¬‰dee°¶¶®w¼®1PwŒ®²†Ä!„®X•ÇBå8-mÚØØhèC)vÅÅãÂ…" î{ÉÍ›Š¹×¡}{ÁãÒÐóß±ÔÔç†ÌGmûië¯P ç†ÎŸ†Ìƒ3gΠ¬¬ %¥RtîÔI¯~7d|öÚ²¶²By™Œ$ˆÉ1Qkcii‰²²2EÒ mÚ´Qù VVÖ¸{÷.LMMqûömØhøÃRªæÞDeµ+Fú¨[§­m[lÞ¹\Žý 0(‡Ò/‘°²ÂÁƒ!Õÿ5aaaòòòz/„ŽÁ£ŽCˆ†ÆÚ6ѯ g8¦M}ïz{ K‰k×®!ÿt>’$«ìoii‰òòrܾ}@""¢f†÷iñÔSOã¿«W£OŸ70kV`ÎìÙh×®–„-Á Uö ©©)æÌËÁ#""j†¸rL­Š¶'J¨{ÂÄøàƒ|T¶¹¸¸ÀÅÅEíqžžžðôôä@5S\9&""""ªÁ•c"5øœb""¢Ö‰+ÇDDDDDLމˆˆˆˆ˜19&""""brLDDDDÄ䘈ˆˆˆˆÉ1“c"""""&ÇDDDDDLމˆˆˆˆ?>šH;±XïcøÔDGEEŒŒŒØO"j® tãÆMÁÿ„$ÛÊÿì’’òÐ ¹>I}cÔß^°4÷~þÛ/êFJJ ùXçìŸVqn”ûÙšç9QcãÊ1Ñc¢¼²œ’’‚…‹aÙ'ŸÀÍÍ­^9QsŠU+WÂÕÕõ‘_3Ú7«ë¿¡”ûÉßD‡+ÇDM€››–}ò BBCÛ”W‚RRR`ïà{{{¼?Æ'OT”åççcì‡cáàèˆÁžžØ»w¯JÝ……çñ®·7¦N›©´Tmû2™ 3gÍ‚ƒ£fÌœ‰²²2µûÕ]RþÙN,ÆáÄD¸¸ºÂ×w JKÕ·¥-^;±±_Åbè°aõVÓK¥RL›> ý]\°[ãXjÛ¯T*…¿¿?áïï©T ðòòÂï¿_œ?_;±yyy€«×®a¸——Îøôéãæ-[àýž·ÚŸ6FM¶m‹EDd„Öó=rÔ(EW®^ŨѣuÎ?å~UVV"xÞ<h쇺>×uèÐ! ðð¨7ÆB®‰Ú}j¿ CSßëöQÓù×tν¼¼píZu½×®]ÃÈQ£êõE*•ÂoêT ððÀ·;v¨”iª·n?•ÑÕg!s˜ˆÉ15‰¹²²RmYHh(æ#++ ¾¾“®( ÇÄ “–š ÿéþX¡rì®]qøfûvŒ7k££ÕÖ½ÈHOƒ——6nÜØ >;–ƒÃ‡ÁÓs0¢×©oKW¼%%%ø>>«V®Ty±°n]4<ARb"Ξ;§1mûEEEÁc 2ÒÓáîµQ‰D‚c?ÿ øùøq˜ššâøñꕸ¬¬,899êŒOŸ>vîÔ ±±_©ý¹1b¬ëëí_£°¨AAZÏ·«‹+ÒÒ3™™™pv–蜵jW.k¿jꇦ1P}AW„ýûöicM154M}¯KÓù×tÎûõ뇜œÅõáÒߥ^ë7l„³³öïGñÅbAs©n?…Ìs}æ0“c"jÒÄvvÈÎÉÁñÜ\8K$HHHP”ÅÇÅaÀwcذ¡Éd*ÇNñ󃱱1úö#--]mý©i©èÚµ+D"ÜÝÜpôèÑÅé;Ù&&&ðôôDFF¦Ú}tÅë;Ùfffõ^,dddbР066ÆäÉ“4Æ m¿ŒŒ 4"‘žžžHK«N†œœœp,çàøñ\øøŒÁñÜŸ‰§£££Îøô飛›ÌÍÌÔþÜ1*ûvÇìÛ»KÃÃ``` õ|»¸¸ #=])á–蜚σú~heãÆ}SSS­c,4&¡qh껺9®îük:çggd×$Ç9ÇŽ¡¿K51¦Ãk¸LLLà;ÅW¯¹Ô> ™ÃD­ï9&j–/_†ày!(("‘›b6áå—{¤ÒR슋Dž EøÿíÝ}œ•u÷ñïyDÅÌÀ§EEJaPQ[5K«»5·^©«mi> v/† ˜¦ÛX­ÖêÒö ¥÷¦®»¹š™¢«"db*¨¦Þ7à Â0sö‘DÔ÷ûõâ5Ì9×¹æº~¿Ãk>çâ:×™5ëÙ5Û¯oßÎì冴®ãksss>øà®ïK¥ÒFmgÿþý“$[mµU–,Y²ŽŸõÆÛ»õÖ[¯ýq‹§Çk1µrŸÞìr---éÙ³g×6¶´tnã°aÃrùW¤££=³gÏÎׯ¸"Ç}ô£YºtifΜ™«®¼r½Û÷fö±W¯^ëü~Sl㪞zê©´¶¶fÑâæôßa‡7œïýöÛ7sçÍË¢E‹òÌÓOgè®÷ù·.ëÚuÁªúôéó–þMlÌv¬kß7øù¹Ž9?hèÐL˜0!íyþ¹ç³ÿ!k|x×å²V?~|Æ]<.'žxbvÛu×5{ÑØ±ùÌÉ'ç–[oÍ—Ï:k­ë3æ¼Lž|ušššróÍ7åâq¯u¹•oà9æØc3`·5ÖÛ÷ÏGŒÎ#>’3Ïð€S©TV;çöž³›ÂmÓȦ¦s̱oz;Ö¶ï›bÎG65¥±±1‡rÈZ{Ö™_ÊýLÍÑùHv|ߎ«‹½¾õ®ÜÏwrìá½®ð©«î©Ÿ8|÷ìÝcA’¤ßöÛoÐ}ï¯rÚé_H½^7Šlr/Ì››Ý Ì óþ<®Wzаaôá+õë×w‹»îèAƹÖê{ÀôéÓó­I“sÓObßßa•J%ÿzç¹ë®»òOßÿ¾'#¼C.èlàÙmýò‹ÿœã yðnDäúˆLÞ-cÆŒÉĉ—Ù÷wÐ¥—^š©>˜åË—gßÁƒ3~ÂODx‰cØ@ýúõÝ$ëy¯†¯ o˜:uª}‡]vÙežx ŽAø~¼!Ä1ˆcÇ Ž@€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ Žq âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆc@€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ Ž@€8q âÄ1 Ž@€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ Ž@€8q âÄ1ˆcÇ Ž@€8q âǰªò[]Á óæEÄq½^7‚ˆã#Fé¨1ï)Î9q âÄ1¼‘²!v0Ð lB…B!óæÎYë}2@›ØºÆZÍU¨6_ßû«õ.ãr¸›îEȦ&޼yO¾ÙÎ9q âÖÊ9ÇÀ&³âOʼ ³äᇳó9gg§3ÎXc™Z[[ )”Jì]vç£sóÏwÏJµ^OêõÔëI=o=»ç¡'_Ì3_Ì}¿{1wÿö¥ôìÞ-õjsâxË årº¿ï}i[¼8imM½¥%;75eÅìÙi}üñT—-ˬÓþ&>ùätïÙ3;š¡Ggÿö‹ïòðÓ/gìõ¦Xì¼6p¡PHêõÔêIG-i¯ÔÓQ­§£RO[{GŠoÃ5„Å1°ÅØíâqyâÎ;“þýSooOaÉ’püñ™7abþpîytàé7hPê­­©¯X‘46¦Ø­›{›ÕëÉOîÝ;;míÕ×_Фóèq­žTjIµ–Tj…TkIó’Ö-v¼Ä1°Iô=úè¬(²ð™gRèÑ#µ––ì°ß~i¨TR^´({ÚË/'õz–-]š¿øEöüîw׺®™3gæŒ/ümF45åò˯Èüùóßµý:hذÍvN–·WsùO˳ó—åüϹú…¤ž¤Vï âöjÒúj[êí­< ßZ×÷ðÃ礓NÊ!Çç¤Ï|&=6}½cuóÏ~–oû;›Í˜yC°É ˜81¿;ï¼ùw—´¶¦öÒK9ô´Ó’r9õ?ü!õ––ÔÎÔo}+{^=9ÝwÛuuÌž=+\xa.{Q†?$ .ÌÄË&fÔ¨#òWŸþ´AÞ@//Z–‰?ž–}öÜ5Gü46t^ä„ñw®¶Ü˜Éw$IJ¥BŽúОû¹#²pÉÒ5Ö÷ÔÓOgâe—eÂøñ:th{ì±|uÜWsí5×dÏ=÷\ë6ÜtóÍ™5kV&Œ/Ž€-ÏÖÃJ·A3úôì¸ë®IssÒÑÑÅóç§|ä‘yøúë³ýç>—m=t­ë˜2å‡9ë̳rÄ£’$»î²K.¹ø’\wýõ]Ëüþ÷¿ÏUUžþéÓ§O¾|ÖY9þøã“t½<ûì/çç?¿%¯¼òJ®ºòʌչ®?¾øb.¼ð‚,X°0&LÈᇖ$iiiÉWÇËôé3rÐACsÕ•W¦wïÞ›í<<1ga¾yËã9æ°¡ùà óÜü¥Ù@Ÿ\3öÓ)“r©n¥¤±¡”Ær1=Òk«Æ É+K–¥Z­u›üú¼Ü˜³Ï>;‡rH’¤©©)_8ãŒÜ8eJ¾~ÅklÃOoº)Ó–o~ë›ç7o&œVl2Õe˲üÅ—RîÕ«óº¹íí©ÍŸŸê¬Yi5*¿¿ãŽÔßÿþì|æ—Ö¹Žé3fäÐCG®vÛûßÿþLœ0¡ëû 'æÔSNË÷ߟ3¿tf&Mž¼Úò‹-Êÿ½õÖ\uå•{ÑE]·÷»ßɉ'~"“'MΤI“V¹ýsî¹çæÁ©ä„NÈ÷¾÷½ÍvnûÏ9ùö/žÌ_whvêß/Ïÿiijµzžþã’Ì~iIž}iIžû¯æ<ÿ§%yö¥ÅyöÅWòô¼—óò+­Y°xif¿ðÿR¯wž“¼ªÇÿ]F ¾Úm‡~xf̘±fÿô§ùÕ¯îÉßÿýU)of׳ÇÀ¦Q¯ç¹/™ÝöÝ7ÛÚK/¥ÞÜœÚ /¤Ø¯_–,Z”gÍÊîWO~ÃÕ´´´¤Ï6Û¼á2·ÞrKF>"ݺuËqÇ›–––Õî?ýoNO=2jÔ¨T*•×ï·çØcŽÉìŸÛo»­ëöû¸?L¹\ΣFå7¿ùÍf9ß¼åñüúÉ…ùÌÇþ"iȼËSOR(S(“RO!µzçðªµz*µzªÕzêéür©˜•ôè¶zÔ¶¶´dë­·^í¶íúöMssóa©½újªÍÍ)õè±Îõl»í¶Y¼hQ¶ß~ûUº»ÞÍ}ú$Iš›çç·ÜšçŸ.³f=»Æ:þgÄu…wkëZïknnÎÁÜõ}i3ýô¾Žj-©'µ$ÕzÚ«µ”«ÅÔÛ«Yòj%…ÔS.ÖÓ£¡î …to(vý½^«'Ť{cC^~¥5;ï°ú8mݧOZ[[³Í*/\Z–,éš“•ž~æ™\}õäL¾úê<ñÄÌì¿ÿÍj 9Þ²…ÿú¯iýå/3ìä“S›1#õj5¥CIÇÞ{§á#I}Ñ¢”/Î:*óÖr~ꪺYÎÃE'”‘ûl—›ïøMRÉ®}·ÊÒåÕ¼ôJ[–¼ZI[{-•jVùSO¥Úyä¸Z«¥¡\LŸž=òÓ»ŸHÓ¾ï[mÝÃ:hyyà©9hèÐÕné¥I’/Ÿuf~pòpáBq l9^}晼pÙ×ÒtúéÉ“O¦:~ʘgï¹'ÿ~é¥immMi=R1#GŽÌÒǦ§õÉ'×¹¾Ïþõɹæšk2õÁ©iooÏsÏ=—+¾~y>ûÙÏv-3gî„Gµ'>IDATÜŒl™!C†äæŸý|ƒ·uÿ!ûçÞ{™3gæã'œÐu{SSSæÎ“JµšÛn»=§žvÚf;Ÿ>lœuüàüË/ÈË ^ÉvîR±Ñûï˜Ã÷럦}úçàìƒöÜ!ûï¾Cö°}öØ¥_–µU2ó/çª?Ær!Ç~hÀjë=í´Ssí5×äÑiÓÒÑÑ‘G§MË÷¾ÿ½œrÊçW[®¡¡áµ¯Ýrá…fü„ éèèØlÆÏiÀ[òÒ·&å€cŽIãŠéxî¹4ŒùO=•y³fe+¿ž'~ôãzƩΛ̙“>úÑ"ÿyZ^Ùk`šÜ3µzò•I·®uùB!Ù¶w÷¼o»žùØ!sðw\c™=÷Ü+&L̤IßÊܹs3pР|í²¯eï½?°ÎíØu—]òÑãŽË7¾ñ7î«›ÅØ>uÕ=õ‡ïž½{,H’ô[åü`˰ۀyaÞÜzìË?úQÿèÇùÅ/¦´lYZ››3uÊ”ìwûmiÜi§ø`úï·_¿å–,˜??{Ž›JµºÚup…ï¦Q«ÕR©TR©TR­VsâÁ;eÇ­K¹áž–,Z´¨k¹b±Øõ§T*¥T*¥\.§\.§X,n‘ó"Ž€ ãJ%_+•ôúÄ'Òxüñé¨TÒÚÚšJµšz­–B±˜îg~)3ÇœŸÚ]we»/œ‘'”Bcc:ÚÛ“nÝ6»ŠøsÁÒÑÞÞ5/•׿hŸzäœc¤¹yIjõZŠ…bÊåRJ¥r:ƒ¸ÜІj5Õj5ݺuÛl/i'Ž€wܪG‹…BJ¥RjµZç}…BJµZ:?j­Òn»¥×m¿H©\NCCCŠ¥RŠ¥R„ñ¦ž—Baµy)¾ö ¥R1»îÐ+µZµë´Šb±”R©óþU—/—Ë[d‹cà-Åqcccºuë–z½žZ­–êkGWþ½^¯§ôZ—^û¯ûÂ*ÆÛ;/µZ-õz=Õj5•j5µ×ægå¼”J¥®S*Š¥’yÇÀ[U(^; ÙyÄ‘?ŸyYyô·\.§ÑlØ‹ CâVãÿ>Þ¿¾÷WAb7úÀ Ä1 Ö@æÍcŒ5ñ†<ǰŽ8® ¶Ü(®×_ã†BÕˆ°Å*«¯ÇqÙÉlÉqüÚ×bç7N«`ËÕP¨½ÇEq À¬¸j7êF€-V)«¼!oe)ÀÇ«9.‹c¶`åâjç;­€-ÓòåËW¿ÎñÊR€--ŒŸzúéTÛ—¿Ç펰åéÑ£Gö<8õBCgo»U1 [W¶8Ë—/O÷îݳ µ=ÛmULùú¶Z¡Ï‹íõ}Ë)$Y¸`Qà=Ä=zôè:¥bßÁƒ3íÕ\ßÿC…Îë—’‡æ®ð¶<ÞóaüÔÓOgÅŠéÑ£Gï³Où¯Bz5S/$…|ãž$ɸ¾ õ¶J=ÃviÈûz—Ó«±`ôxÏikkK¥Ð˜ù-Õ<úâŠôîVÌ×z -$IyåBW¼²¢P(òÅ?Ôë ^]nÔxë<Çøºþ²Êg~ü7Ã.øƒ©ÖIEND®B`‚kildclient-2.11.1/doc/C/images/pref_proxy.png0000644000175000017500000006203311405233117015737 00000000000000‰PNG  IHDRNÀT çÀsRGB®ÎébKGDÿÿÿ ½§“ pHYsÚk¥óÎtIMEØ   ˆT‰àtEXtCommentCreated with GIMPW IDATxÚìw|ÅûÇ?»wé  ôD  ½#5ôÞk¨¡Y¾J”@ATª€4é*Ò!ÀO¤#` H€ô»ýý‘»½Ý½Ù½M£>ï×+¯ÜÝìÎÎÎNùÌ3ÏÌrõÆ.‡”Eýj &“ AAo2ž‡Ñ`椿­–„×ÜÜÝQ¨P! Ê-‚ ‚ ÞhLééøûŸ„äädðHãDá´$¼–àç燼¾¾HJLDZZÌf3d–'.Cpq."8ŽsüÇq€Þã3ý×Ç9ºQæqÖo‚â;¿Ãš^é9Š´YÃa¹Oé±Ö0å9âs²æ óÖ$çJÒÏe7O´NÕÇ(KÍâ`»ŽõXé3Q'+Œ|V+Óªe݇2nµë[Ó(m;²óœíÊ©ÚgA°]KÏq:ޱ¶yÛ'åÕa\Œú!KŸÙl÷¬”åã8Ùqªy"¹GÍ{`?+ñéz¶’û5 àyNNN(Z´(âââ'ðHãŒàæî޼¾¾xøàRSS³%tt *ñ9j¬•©«ówøüUĘF§#(:-N+œ% ”a¬ #½®²Rž#CbQY³"ž8…Qš>žÕy;OªDÙ©Xdå59eãm63W­k*¨äµZœÒNŽÙ±K;Cµ: Á‚¢³±Ëi}c\WY_9‰8×:NâŽã`6›eÿÕê°´ž€YÒ™¨ )f˳eŠ#i¾‚˜Zm…2Ítò`+Y>XŽÕ:N)Š5Ac¹¶õ™²ok:!0KãS‹£3vØ!ªÜƒ^aÂ)Ú8•Ÿ*"“U¯u‰!F›lf•U="(“¢Im ËÊÏ̶×2‘ͨ‚¤ü±š¬ú#(âUëÔuNç C—&U´Û9Ñß« §¬uXñIµPbRüüü”˜ˆ”ä4pgΜ*T¨€ääd$ÄÇëê4õŠ“iuÒóPôZ8•{cBIǪö¥VµŠk'¤bÈ‘•JPéÀÕ¬Tê•mñ”UQ” Ë“E‰!8–pPétôZÙ2cUR´¬£ L«˜Ú}kŽ÷k× 2:~–ˆR–E¦0Õgj!­»£Á µZckguRJjí–U,© JÙyÒûÑñlZ˜,Öf½Öè ³mÒ0jBM)šÔŽQ½ïœ¶4©”«¬Š&©ÐÖc=Ò3› (ÃeQµ=RäWâ³g¸÷÷߈EBBœá_° àéᡯÿRðÖ¸ïÇÆ"áɸHâöPÄÖ¡œ²6ÉÒ~ÿ>àââ1í‚Îrà“'\\\pþüyãããa0žžž}!” Ó˜~ë© ÿ¿"C3Û(Û݃ttï`T,ë|V'e!UeËFÎŒQŠõþ´¦&¤¶¬!Sšv#KAi)ÒkºÏäq̸§ ,!e×PkXZTQdZÓ_œbPuä-mpÏ_iªw$ ÄüQÄÉìx­÷kµ²XË›Z£Éõ2óY1Ò—ZqX#~VYU¦Cp`eg'Ð,ym–¤S´Ž±ž›ŠpÑœÊSˆG™uÉÁT–CeÞŠŸ-iV›–cZ†ÔÊ»ršLÇT Ý MÑ®sÊg«°ø²ŽÑMZVùœMÙ™žSŠ&ŽÑ a¬z 0¦¯3+²ÒÒÓqëæMšL&ܼqãâ'O¼S¦Œ,îS§NÁß·ÑhÌ|Ÿ­ñ?»¤§§ãæÍ›ˆ‹‹CÞ&jsý²‘(C\ªZ²)žT§»é°vú?Œ†[)ÈìüpqH@qÚJÒ±°,P²2¢1u(0Ò!yZ£sÎúœ39U¡´¢±„ÒZ (ËŸtãhšÂ?‡#AåÐWC‘Ï2¿&I^hNK*§D¬BÉÑ @rmAËŠ*#²Á”Š…ÂNÄ0|GÄû1›eåÞ¬"^™0µ…ЍÀWJ+ ÃÒªŒOYG%MŸ& Îìø4eV4)ãWókâ8ÕA8ØÎã&“ ÿÅÆ"üÈŸ??Ì&3âãÛÅåìâ‚AAðôôÄ;w£ÑÈö…²¤Çl6ãþýû(‰¸ïÝ»‡€€ÆlOÑeE;Hóùþýû(à_ Si/^¼¸˜vVš¤Â‰W»8ë¿ÉdBll,ÒÒÒlb¾ÿ~4jÜÄÇ}¤:ÕÆìT•Œçy”)S_}õ`ù²åšNe²ÿ–‚(80>xð¤yß8 Œübšeªò¡)G&œÂÜ­U‘³Y>E£5Z·æ/Ë •už$=jÇg6~é¨[9U!°FÊ2Á8–c¤UfU‘N}(§ª¬Ó8–©Aj~¶\Ï,Ï‚$}œä¾dÏÎzž2>Åô™5f©±>[Ö3”Ù¨–ñ ÌŠòj¶t¢²ÎMRŽXyl=^:¨’–AÁl¶å«¤Pû“¦¹Ér ëOíxµ¸Yù$M«5ýÊvA™O¬|±Ë;e>)ž]¹f¥OR~”å[ä¿™u¬UÐIžƒÙ²Bú'ºH뢤­Ë¢TÌIî—S¤Á¬i+E%õR­Þ Yl ´Ú°Ú/F|ZÇsýSfã— é`HQ¶YŽàÊgg-3Ïž=ƒ§‡|óú"%9©©)Ì)ö”äd$%%"_þ|ðóóÅ£GØ÷ ²OŸ=ƒ§§g¦âÎë›qÉû^ÅàJ¯Ë]{£H£ÖàêéÓ§ðòò‚o^_\½r_Lž„[·nËŽ½yó&&MúW®\ÎÈ—|~xüø±¦’bÔëÏIII___ÑŠŸ€iÓ¦aåÊ•ðòòÂ’%KЬiS¦ôxÔ+~ëí·ÿþûÝ´^TÔi|3çìÚ¹ ññqîÜyÀÿ=‹ùóÀùèh¤¦¦¡dÉ 0M›5/#´~މ¹(^ãÌ™3qœ?/£ysq„RpæÌY|ýõlì´¤#:úàì™3øAGppI 0Íš7¯mcX¶|.^¼ƒÁ€Ê•+ã³  {õêU,X0QQQˆG@@Þ{ÿ}´jÕZ¬\gΜÁ÷߇sçΉ×4h0š7o.>³¿ïÝÃÌY3qêäIÄÇÇ#Ož<¨Y³ÂÂz J•ªà8)éSÍHLž¥š‘j˜* )ÕŒg©Ö03S$¦ x–* 5ÍŒÄôŒãž¥f„IGµ,ƒÎb,$¿YÃ9ÙwÉO²©9ëïœ,ÞŒÛåy[#ÅsÒÎÆvm™î‚-]¬8­æ^¨¦É.Þ§åÞXþoRo›Å†cÄi¹'Ëù¹šnAdz®#~VÌÖxޤi‘|¶MŸÛîŒtC‘nY9àå‚ä¾ÔîÝfEãyNvïiáì­ËÒßج¥Ò‰KYº!¯šnHÓÍÈOeY±–#Hë$nAŒâÀÓz¿6k‰dª[€øŒH¬…ÀYÇd’2 ÈÊ'>Ö®µÝæÅÊgÍ71Ý–p¥›»]~+ÒÊIë-¤ÏB`—_FÙ„å¾T˯²-°ä¥õ¾ÄØ9€ÌQ(HÊ/2ÊY~‹VuKNg¤Uj…±”AE™wd!ËP˜àáá‰ôô4‡S܂ٌԔxy{#îaÒÓÓ3¬+ŒøM&Á OFÜ'OžÄܹs0løpT¯V]···7âû©ø[TT„Š+aëÖHxy{#"bFŒ¯R¦¡]Û¶â” U0]¸#»æ©S§0hÐ@T¬X ‘‘Ûàåå…b)h×®¬`¯[»Ý{„aìØOÁ[¦R¢¢¢0pàT²Æáí3¦cøˆá˜f‰CÊâ%‹1mú +Z«V¯Æ¬™31fô'X»n= ˆ¾p}z÷B¾üù1ïÛy(‚¿îÜÁÂùóѪUk1Ýú‡£R¥Êؾýx{{cúôi6l(¦MŸöíÚ‚€aÆ"::ó¾ûõë×Cüãxœ­-VéC(Q¢„]:cb2„FÇNí®}çÎû½€ ²5Ž;ØÇq÷®]:Þ¶¤Cç­8,éæUpp)1]n–‡nuFã8üñ JÕªª£ù ¢íÚµe_Ór\éÒ¥qáÂôìWWW¾…jÕ«aÀ€(X° ÓYQ6_¥ÜXK@1–Ö[^Í Tm•™ò³²a—ø`ØmÍÀZI¥H»£]ƒ•"FkC<å*™£µ²QæyÍ¥øZ 5s•kª\™FȬíÊŸÚÖZ…jí“ a­å¯Ç©ìL®vœš%ˆá¬ qÄH‚#a%Ù*@vŒŠ —uôŒ-E-q&5J;Å Dêë'$HòÄ.}’,j{TÉDä‹T2ãðS‚‰•÷‚ÊŠEiÛ"0¬›‚ÄgL´ºK®!µÄ Êå%SÊ‚ÆêNV9jÙª .DŸÃãÇñõÌèÛ–ý¸Ìx+ -Z¶”øš`0U7 U–ÿþý³gÍãê× –-],^ë“1ãá_Ð_Œ›ç º¬ì¹±38ë~ .‚!ÆâÛ9ß@0›Ás<†.Š&i¾dLÙ:°:NÒÄ\»z...-zÓ-Xüј~j’‹ð’rb[übñ3—–[Û‰£³eZRÿ%K<Çgø•ñÒvQ"^xÞæ“$¶Òýæ´}…µ:e)G¼ÌuÍV¤¾SëCÆÉÖtsІ‹ã`¿šXê?ÄÉ'±ôø8I}…8É\%/Æ#(ž™tF“×!k½’´Qí€$ݼ¥Ös6q*úÓÛ"ž³¥+ãTKžHÄ<ÏË-¾‚ʾrÒ¶¿€Œùô3Ìÿn.â±réà!  x1¼ÿÑ0äÏŸ_â%ÀèÄ«üxÞ–8~ì¨]\Òk:qmÚw´ÅmäuíçÈKf¥WqõÑk€ØÿþÅæõëàãå™QÍ6®_‹ ø#²|qrÒ%‰ô 'k‚bbbP»vm|:v,`ÇÎøaþ|)[‡þºŽ[¶C¹’8zù"&¯[…ÎïÖ…ž¼YZb¨G±²-Vå…³gÏ ~ýºÌ{ÊѺZZÓ‚b•›5Ž3gN£AƒP¦ïkOæÇ¡b… 8qò$¢NB:ud£Y«ˆ(_¾IÀêKÑ'||ýüÄ´»sX8ÀçΡgX˜˜À™h×3 ëÿï:×®‡²Å BÊgd¾¢`éi„4È5*·õ˜!Aÿý13"… ÂÛo—Àýû÷… 7`ÕÊUÌJ&2d(ú÷GDD ,ˆ%‚pÿþ}œ:u 7nÀªU«µ·Wdq*THŒã¤5Ž•«˜ûú˜ÁÞülØðèÓ§7¦L™‚éÓ§£lÙ²¸wï-Zˆ¯¦Nƒ :tÂÃû!bÆ V\sÆõX½j58ŽÃ€þáëÙ •+W‚—§<-Vµ²eå¾–©B3cªBs'r5_›,øDé9O`T^íuPßìQÍßGÐ(šÂÜÁÒZçèÝq¯6Qú‚©íÍœÖrðòR» ³øº”¬ ç잯êâá?¥œrR¸±„Ô|ƒXÓÒÉa‡£òjAç¹j¾R,1¢ºß#ÜìàXÝ": b‰ÕF™ßÕö´Qy±tš•5]§v-ÿ%ånúÊ=â¬åÐ:@MLLg4À×/Âz‡ãøá¨]¯¡L4À“'O`4àâì¬:}f0IÜy}ýиyK»üöõ“ÿþäÉ <œ,{Déy£ˆ¸Ý‚†hÊÌ[IŒF£,í1ÑÀÉ`@Ñ"EоKòäÍ‹~cˆŸñìéS\Œ>‡: âÉ“'0xqgõN·n߯ýû÷Q¾|yñf *„Îÿ{ǯ^Æ‘Ý{ÑíÝzpvvÔ)‡OžÈÔ¹Ús:Q¾S @ÅJ•°jÕj,\¸ ÀÓ§Oáëë‹jU«aø°aª/P•VºJ•*aÕê5X´`¾<ŽjÕ1̇£Ñz%K:-ZˆþýûÛÅ¡Ö ØMÍYŽ+W®Ö¯[ù àã?BBBðþˆ£¨Š–t/\0áááâ5«W¯Ç‹yöþû`õšÕ˜8a2¶#hݺ FŽéÐú'õ]Z»ôˆ(]/f9c:8Ó𥲛>u´‡‹J…eíþ ‰O†Àèe t7hëÒYÅÖûɤ{O±„YÅ X™§ÒÈ•V»wmi¼fFÕaÕÁ~9eõÉŠÀRsðÕZ=%åKòPéÏ#'v›@2¬‘J¿ 櫊gåT«Ì(÷Tb‰$E™óG²ë<ëåÄjNó²Ï )ÖñÜsKÊú t€ãù :ü©”û…Ÿ%ízÚ‡«ê¬¬[¿ÇÇé¨(.\Xü}ä²E¸ñß?¸¸15BÊaÑÂ…pqqa¿üV«âèP”™}I°£)?5Ç8i:3ó²`Íc”j:…¬ùlGK¤•>MÒaÊ‘¯ÝwE‡œfÊðm²îÓ”’ž±§“uo§Ä“¸gSRš€§)f¤¦ HJ³íý¤ÛÇ VQ>N ™•Ó>N‚ŇIfs°Sv|œD_ ÅÔŠtO*^¶ÿL6öq’lr•ñ]§Ûâû H|CD—lú8)}…Ô|œ LS6}œ¬~/`”NVo-þ1Ö=Äx-þ0'ó¹Éð=‚ÄŸI°øÀHöKýf8É>GÒm©+¼ÔÊre^áØgM“Ÿ”ÂWH€ ÷ä{bIïK¹’½¯›å<É^Fò²ÆÙíU$÷Ñã˜>gøfA'/Þ›å¾yis’ý¯ä¾W21k~ˆí½m_&ë>NN‚幋I—ù!÷ïÇ¢XÑ¢šÖ’””ܼq Ÿ¯¯ll5 jBBî?¸¯?îB…ág™öÒêõLËeZ@Ú^òˆOHÀÇt§Ý¿Paøúúj¾z.S«ê¬9rùóç—‰&psɰ0Õ¨U û6oEïÞ½ñãÒ¥ð–8UÛ½GŽ! 8Æ€–ÉN¦Þuˆ1=‚G6:QÙÿ%ËŠa€-Ö;ø´ §ñòX]~"’F×ÙÈÁÙh„Ÿ§Ío Ÿ&ÙNÒ°Lú8½ìþM‚£é«œH³´¼)W,fB¼ç”5Ç‘ØV›Jt>Ÿ\ówr`½dÕŬæë5:,Ÿ%©Õ:§N¡|•ò•ŽÊ+دƒÑå ¥q¼Ã:›C+àG×ÓðécMã³^Cµ)nUß%NÛŠª¬3²<æÕݺzöïtÓ!š¬÷æããSz:.^¼„|~¾ð/XPæ¿”ššŠ{÷î!ö¿X—.|ùòÙ‰ÖtÀÛÇ陌Û*šôLË©õ{ʾ_ÓÚ¤,ó–EWy||`2™p1æ"òåóÓL{ÉR¥Ï"øô¢K8™Ífüþûï¨Q£†]X•·K"æ¯ÛèÞ· ¸ºcÍš5èÕ«Ö¯»³^ IDAT['ggÑ¡X9¥¢ÜzÞÑ{je®rJC8Ò%|ËÑ (‡c¹«uD¯Ù±°ÞZï` ËîQ*ïÙRš’Å×Gp\FR±di9#ÛuXÓ?Gõ³ò}tÐé'Åê,3s¾Feæt4fš:ÌÒ‚J¹T¶[Ðr¢dù[±ò[MȦYt ZStŽöOÊÜcÕ—Zš4ïEcO‡y¨ØÎÂѳƒç¬w*CpäÒàÈíA+­Y»™x®Ì¶UÇ‚em75èà|Y]“¼IË:¯GX©mE"æ³ÒÞQ™—nC¢þþþpssÃÍ7sq?³€t“ )))0ðŸ1…¬åߥº¸µï ´ì˜Í0(??ÜÝÜpóæMÄÄüA€,í%‚J rÕªðôôDJrr¦Ú!£½´'6ö?ÄÇÇ£WÏ0»cZU­†“W.aïgñåäIðñöÆ’%KðíÚUhÚåÞÊ0kÍ“[·¯ç z¬5Ì~¦Y°«zö–(ûcm¦uÇñ‰ŸÅ‚Fa4Řڈ]lÓò‚ ’VÒ8ûpùù‚xˆx-KÞ ’<‘W,3¤QKÏ3KVƒªŸ••Ôþe¤J'VµÏbz )•Ý¢9èsX·¾öÄî: QÎfÁ, 8ù,bY”úBIÊü=–L†]Y–[Ó¬q v©²5Úö ³ÝË¥ùs`c³ør(¯©ÌX³F£”™Õ—ŽãRVyš­—bK¦·l+˵óGyŒ (ž‰¤Œ°Ócf—5Yçh+3öÓø¶ßÅ)'iYäÓˆ‚J±»®øÝœ ¡¤_V1÷Åä{Zq˜í ³í”í ˜m XmÙ:(dõRv'Ö`ž6[›GõC½Íl…Þv_ŠrššT©V *VD’E¸ººÂÅÅ<Ï#=- II‰²²n­Gœ M“­¯ii©ðññF•jUQ¡b$%§(âæ––†¤ÄDÙ½ d–%í>VPÉ7©˜²N)k”I鱂ٖöªUP±B$¥(ÒÎqHMKERbbæo6§XM§øøxøøø°ç ÓÒ°ól®ÿó7ŠøåCJJ2ê•«€·ý iN{¨¶zÙ˜÷T”?ËJuŽv7UÎïsªÎ…š»63Ã8»ŽˆÓ™V°´r;ùrÌÆAi²Ï[Øu¬¶Ê™°H1ò‚N«’Z™ËÌÏ™‹ÃÞJ¥fÂÖ·B*²YMdå‡auѲ8A€æyz§ùôZ•2+œ2—£´©ÝŸ¬£Ôkq‚|¯$A‡µŽõn2M Ô¦qUëQNœœŒCš7Òæ_¿EÉñµUU@ÚžiLÇ+Ÿ¯ Ïk]ÖDv×rTÏf9îWxž‡³³ œœa0ðÌRÓR‘’’b[ù'›¶”ç»–°Á`€“³3œa°lp™š–Š”ädÛK¸Uœ½õ,êÒêß¡ñÚ$‡šÏàââlÉ#ÁŒÔ”T¤¤$3}½Ôprr¶÷qrðÒhx{û¨†;оú»º,µ‚ q³ŠNR[ªÃÁÞ¢©TøÛ®K;cÖªdV˜|Õ”ÄD.¨/ÏgvøjÖ'éè^ê-+Qk¬<´ßAZ"6å½ ’<6KÎãl¶³då–êgùþ#Ö<͘ÞUO›¬Bêæy»Ñ"£A´›ŠUmÓU–Ögj !¨ÿÌœÌØlMò¶Q›ÊT‰¼“•ˆE•)GÓIj²R°™(eÏÔÑ‹rivV§ÛôZ2¡SUÓ¡¹RJÊ&(FHöÇ*óSnPPZÔk*]^_e7´­fv¼,NŸiê£,LÅÙYäm«Ì{ŨÖvŠ6Hü,2k•ZÛ&(|>ÛŽ•0‹ey›gýë€Ô,·¸°ÚD»z.˳ꠑ%0M&3’’’l±8©ú} r—ë}«õyÖ¸Ó“œ”¬² ²7K»O–Ž]å8±/RWÚeÏd2!11 HLBvØSuv¦ ¹™Ÿ&Ž€YaÊ}J¤†9³Y¾7ŽVüVÿ •F Œtˆs©Ò Æó›b1ö¸QµB™ÍâyJ']ké… ÏÁ,XVb(Â2Ì霸k­ùÛ¶!ÈÍ·’E ¶8xNCœ ˆqØ Ö•1Ökq¼l%ˆøIÁ, ³Ux˜Í;¬Jâ·Ž~¬—2›33LÛò7Çg¬|±½=\9YMÜ‚t×jfëÖ­iN²žN±¢Æl}ϸô8Áúl̶Š$9Õ¶ã±¥"*â°•W‚ô’RóŽå<^ìŽUÄX–ÀÙ‡Yu¹ƒ¨´|B- òÎVk™7'Câ»&›žQ¼ÆÆî…Œt0ãW¼F‚S;N6õÕøeu^i„|Õ”ï3dœggÕf'µTó¬8ßíöª“Z ÛŠHÆ}+±,-–öGŒÃš—œm•¥u H¹»¶t_¶‚ œìGqkI˜À8κJMP‰CzmAvQé3µ„rœe§`+‡‚m*ÝîÚŠé.žÌ€e‡~¹ÀâyfežH¬t²öIœfÏØ¢ÁºR\5*HW*[“¼¥?gLqo³÷I“ °9N:È’X}x^œ²µZ¦lm¦us[²»¤ æyIšÁ Ö­(lùÅYÃ8^Àð Ks £,óïÛÅY¾óVß]I{Æ+f‚”‹ÆÌ¬½›¶Š~°Òmb ØjEå<¦~‘´vq8N áÂi4ÌÊ n³»ÆöLk”¸\–s“¿˜€†¡ è ä 'OEaùO«pùòŸpvvBåÊ•ðÞ  ÈÕëJ· x[Ô©×H3\Ozþ~ ê×{¡ÏO+ï”÷Èó<|}ó¢^Ý:øðƒ÷àêêB@‚tsI³ÙŒ””¬ùy&9Ó¾šLDÄ«#œvïù7Äž½ûH8å ›·Dâô™³=j8Š+Šôtþ¼rÓgÌBϰî¨[·ösIÇ‹Úg)»×ýlÂ/ýQÒô™ÍRSS°5r;æÌ‡±cFQ%Pçy¸¹¹¡S§¨ß  '‚ ²×¦<Ï‹ÅÇÇ#æÂEŒ1¢cŸ@O ‡øñÇåølܼõV ŒF#\]]P¡|9|6~,¾žó-eÐk'8¸ºº¢e‹æØàwÊ8prr¿‡`íº ¨X¹:w ³R3fDÌF•jµP¶|tëÞ ×¯ßŒ3›·DÊâÜ´y+:t슖­ÛÛ]/99µë6D|<µsAÂ)‹ìûíêÔyžžž¨]»~ûí€,¼N½FØþËN´i× ÍZ´ÁÔiHHx¢;–.û ­ÚtDóm1gîw0™LbØÝ»÷0zìx4oÑ 6C¯Þá8tèˆ,þmÛ~A³mðÞë>gÏÞ}èÚ½ê5hŒ ›ÉÂ`õšuèØ©;B5ÇÇCGàλºÓ¬Žç™hÑ¢E°eÓ:Ý×st?Ož<Á´³Ð¼e;´i× [¶n³{†™É›ÅK–¡y‹¶hÕ¦#Ö®ÛàpÚ-«|5uvíÞ+ûmç®=øjê ñšuê5’]ßQ>)ËŠ£ûuT–²‚Ñh€“Ѩ™.³YÀó¡E«öhÔ¤%>øßPܺý—îçÕzqð÷CèÕ;¡š¡g¯pœ<…Ý»÷¢{Xfþ:t 6CzдyŒ97nÞÌö³7›ÍˆÅ¼ïæ£s§²°èè 8väfÏœX¶|ÒÓÓqèà>D<Š&Maæìo_LšˆU«ÖˆBêêÕkXµj Ö¬^ñóɨU³"·nÀŽí[дiDÌ’ÇùÏ+غy=&|6V÷9¿îû s¿™…C÷aò¤ ˜8iйíøúæÅêU˰{g$ê׫‹ ŸOÖf½ôèÖÓgÌBç®a˜6c¶mßÛýewœžëiÝÏÌYsP·Î»Ø¹KÍÇŽ»5Ó¥׎»2Ò´e=~\<ûB:'9b6oÞ* †›7oaó–HŒ1Lœ;rè7ñ³ž|R–G÷«§,éùd8 .ÄÌ$%'[DŠ:´o‹•?ý˜¥òpíJŒø}{vmÇÿ>|ƒÁÎ"+åöí¿àï_@üîíí¸¸G6ATaaÝѼe[ôꆠ €¦MãÊÕk¸üç@TÔi@ÅŠ¨—!ˆ×Œçæ¾gϯhÙ¢™øã8´jÙ{÷îCÿð¾âï!eÞ?çÏŸñññ²x´ÂoÝþ Mšµ–¯l(£/ÄàäÉ(ܽ{—/_±Kg¡‚í~stNáB…UïûöíÛpqQ_ñ¤'Íz . ¨Y³:ÂûõÆÅ‹—ðë¾ý˜9ëÌŒ˜ªûzZ÷£djÈzM5´âºqã&òæÍ+~/å .-ô8v }û¶èÕ§?>x°æjC=ùÄ*+Z÷«§,e÷Yéº{÷òåó¿{yyÉDŽžç•zQ¼x1ñ³U ô÷WM÷øOGcôØñøí·hݪ8žCÝ:¹»¨AO]cM›Í‚]<Ý»uÁÒ¥Ë1c*~Z¹=ÈÚD$œ²ÃÞ_ý{cá"ù²h‘"2áÄ󙸲3‘i„ ‚~Û''ömmÛ¾k×m@÷n]P£zUøùù¡k÷^š ©žsxžËT£›™4g‡2eÞA±bEѾc·L]Oë~A€ÙlÏóº:žìäMn¡ìô²ú\X÷®u¿zÊÒóf³9SÏ!kõÂޠͪÓVÞ}·&–ý¸—.]Ʊã'pòT“ЬiãçV6ðß±¢U,A±€åÚµëX½úgìÙµ ƒÞû*”/'Zºwï‚F[`ð 8~ü¦OB= A¼ÞÂI€ì-v9È…˜‹pqvaŽ˜{÷€˜˜‹ )¸~ý:J—.%6Z^^^²ãµÂ‹)‚G¡@þüÌt|ÿìûy%òäÉ ÃÏÅY9GJ±¢Å––®Ú;J³^Ú¶ï‚oçÎF ÅWÊ““3òæÍ“c×óòôD\Ü#Ñ‚qãÆ,§ùí·ßÂãøxøZ¬×®ßÈÕÂ~ëÖmlÙ‰Õ+—bôØÏPæÒªV§œz.9Y–²J±¢EñàÁCq êÉ“'Ù~¹u/%K¡dÉ ´mÛW®\Eÿï?WáÔ©c{,[¾Æ~ž7`ó–HÑ—””ŒÑcÆ!bÆTøúú"búWødô§X½ê'¸¹¹¢@þü ­† GófMáééI= A¼òØ¿å÷¹ø8íÙó+:wî ÚPí–8‰Ï÷i2zöì!Z˜J”x½z…áóI¶Å½{öÀµk×É)œ Þ ‹SîžžŽÓgÎâ£ÿ½Ï oÞ¬ ú…Dë׫‹^}úÃh4¢ah}Œ7Zv¼Vx×.±hñèÜ% IÉɨT©&JV<û fΚƒ©Óg¢XÑ"èÓ§&;hð³rŽ”.;bÉË1ûë¹xöì*T(‡/§|®;ÍzéÖ yòø`ùŠU¸uë6ÒÒÒP¼x1tíÜ­ZµÈ±ë7?,XŒºÃÀóèß¿/ÎÎRÙhÓº%/Y†Ž»ÃÙÙ½{…áòåËYŠKkƒ#‡~Ãì¯ç C‡v¢…)0 8:vlÙ_ÏÁøqcÖ£ú|f³¿ýº3ÇžKN–¥¬ÒµKgÌ_°;÷T©\ ß|‘­ç÷2éóÏ0û›oñÝ÷ ’’£ÑˆÉ“&d:é®á™=ŽçyŒ3й¡hÄ ûûëØ¡:vh'~/T¸ .$ZÐ ‚xýàöïß/„††"ö¿‘–––1:Oz’¥ÈÞ*‰“Çg91Ž^×ñ"^çñ2qâøQŒ3ñµÍƒ'Ož |À{ظ~Íwï¯ÊsxY¨]·!®_½øR¥)%%sæ~'''Œ>Dõ¸C÷¡ÿࡺA/W· w gggä/à<ß}œBJ«Ö°÷×ßššŠ¸G°rÕÏmPŸ2†žÃ+IÕêïâ|t4>ü`0eA¼Æ) ˆÅĉã0ÁbLOOO4iÜ:z¯,ÑçÎP& §ç‹£iš¦y½¨Q½jT¯FAÏ ╦ê‚ ‚ t"Zœ!ã ‚ ‚°é"©>"‹AA„NÄíþû×¶AJrÖ¶#(Q’ö.!"÷yÙ¶" ö’ ^b¡ÃqYÞþÃÅÕ¶AÿŒírÜ9üuhЂ HüÁ‚¦ê‚ ‚x-9tp '‚ ‚ ˆ '‚ ‚ NAA$œ‚ ‚ H8AAp"‚ ‚x PìãDï\!‚ ‚ë"›>"‹AA„NH8AAp"‚ ‚ áDAA‰ ‚ ‚„AA '‚ ‚ ˆ7ãË’ àÙw'''øùù¢_ßÞ8 œžAA/œ—Öâ”––†ÿýÓgÌ‚…KèIAAÂIɵ+1¸úçœ=}C>þ°jõzRAA¼<ÂI /Žãàíí…A1ìÂ…”z§Ç“'Oàæî8rä>:×oÜDzz:®_¿>†#GŽÊ– Aï^a¸ÿ¶l݆5?¯ÅÇqxoð@”)ójÕª8zì„åÿqÀ»µjRÉ!‚ âåNAÁ!(Yª,*W­‰yßÍôîfw\î]}î &1ðÂE]»tÆÙÓ'Ð¥sG‚€ïX ž3bø,èÅK–bñ’¥ *?úP³f ™`²þ· *‚ ‚ ˆ—Ö9ÜÙÙoâ³ñcѯoo»ððð>pssEÑ"EÑÑcÇŒ‚··ÆŽù$ã÷ 1â9îîî˜ðÙ8ܺu<Ä—S&ÁÉÉI&Ž? “É„ãÇOfü^“„AA_¶]»£ë¸Â… É /×€2&$9N~Þ½{÷ÄÏ11QµJe@üùQâí·pýÆMlÞ¼?FppIäËçG¥„ ‚ ˆ ½ñª&ÜÅÅEöýÒ¥3"f!!á f̘(_¾œx̃ñí¼P½z5—ÄÜo¿C\\œ^ÓâÏôíw? kAA¯‰pRbÝ$sÝú¨\µ&6lÜ žçñÑÿ>™9ëk<}ú}z…¡x_$$<ÁÌÙsÄp«PúçŸc8AA¯©pjܸ!æÎ™…RÁÁprrBPP Ìÿþ[Q ;Í["Q @4iÒíÚ¶Fþüù°qãfœ·øGÕ¬YœenÏ`0 zõªTB‚ ‚‘ø8 –¿ƒ^ß&­ãZµlV-[0Ã*”/‡«^¿ ?ú»ì˜<>>(_¾Î;êÕªÂËË‹JAA¼±Šÿô’_OŸ>Ebb" E Úø’ ‚ 9FÊÕjÔ»»ztïŠÎ:P†AAÂIK1P&A¡ MÕAAp"‚ ‚ áDAA‰ ‚ ‚„AA '‚ ‚ ˆ7ÚŽà ¤DÉ2” ÄK Çqºß$@A‰x.\¿z‘2xé8tpeA/54UGA¡›ÅI2„ ‚ °é"©>"‹A™æÐÁ}4­FÄ '‚ ²Dø !” Ap"‚ ‚ H8AAp"‚ ‚xÎÂIü½z‡ÈþJ½SïÖ Å¤/¾DRRòK‘ÆÝ{~}%òqíº ªaAñæ`¯‹^+‹Óµ+1âߥ˜?ðÛ¯;Q¬XQLþrêK‘¾>öJä㆛ñèÑ#ª/A¡àµªãynnnèÔ©vîÜMO: ò"f~MAAoŠp²âd4ÂÉÉIünŠªX¹:w ˜Íf̈˜*Õj¡lù*èÖ½®_¿=f6o‰”ŹióVtèØ-[··»^rr2j×mˆøøÙïÖi.ëT¢£sƒ‚C°~ÃFÔ¨U+×À˜±ãñ8>^vü·ó¾GµuP©JMLž2&“ÉîzY¡nÝÚx–˜ˆ3gÿOõ­?Ê ‚ H8½N„÷ëƒÁ€ºõ¡vÝ8{öÿðӲŀÏ'MFÏž=Dÿ™%ÞF¯^aø|ÒdñüÞ={àÚµë ìví» ´Q3]ç6kÖÍ[¶EýÐ&øçŸ1}ª,ÍOŸ>E½MPµzmœŠ:Y³¦‹á9¹Ë·¯¯/ºtî¨;ÏÔкŸù\‚ B/Üþýû…ÐÐPüûÏßHMM¤¥&f)²%ËàúÕ‹o\&Þ½wa=ûâÐÁ}9vnPpH¶·x™žSnÞOn<B›C÷!|Ð/G‡îCÿÁCŸ{Y!âõm«²Ó¦89»œ]P°P!8pFÊÖì‘’’‚Õ«×¢}»¶…ƒ”kWbtŸKäÞs!‚ ˆÌ@Â)›T­þ.Ê—/‡/Ð<Ž¥võžKäÞs!‚ NÏ‘èsgråÜ×mªâyßOvž AA¨AÎáAA:-N‚ñGáˆðAC(‚xí±ê"%œ‚ ôò&®ž%‚P'A¡©‚ ‚ ÞdŲ8½±ÐÞFA‘yH8½pG™@A$œ=ЮÌA‘5h;‚ ‚ NAA$œ‚ ‚ H8AAp"‚ ‚ áDAA‰ ‚ ‚ áDAA‰ ‚ ‚„AA '‚ ‚ ˆWzWñÜ9tpeñܩנ1eÕc‚ê1 'âÕ¤ÿà¡” ÄsC\¿z‘2‚ê1Aõ˜„ñjW‚ÈmH0Q=&¨ç$äãDA¡£tÔ@#‚ ‚ ›6²|#‹AA„NH8AA¼‰Âéðá£èֽʔ­„Š•kàƒ‡àÚµë¯åƒ ÉV8Ao^»áˆÝ{~¥AxmVÕ­Zý3Ž;/§LÂ[o"--bbðéø‰<¨?š4nDO› j74øèãa¸v%† A¼ ÂiÎÜïðû½ðððȸ1£ÕªVÁÌSѳw8 '‚ ¨Ý "Û¼6Su<ÏcçÎÝv¿àèáý²ß¾÷=ªÕ¨ƒJUjbò”©0™LbXPpÖ®Û€Š•k IÓV¨S¯!ž={&;?11µë6ÄãøøLÅ×¹k3í·nÝÆà÷>D¥*5QºL4kÑ{µíÊŸ€OÇM@åª5Q£V]¬^³Vv¾£pµ4h¥{ï¯ûPºL‡ B¥êè×®\¹ª;œ¦ j7r·Ý Áú Q£V]T¬\cÆŽã³ÙŒ³Q¥Z-”-_ݺ÷Âõë7T¯a­³AÁ!²ÏA¼¦Âi@ÿ~øtüDÔm‚OÇMÀºõqýÆM»ãÖü¼8zx?NûF£?Ì_$;&:úŽ9€%‹ç£Q£†øyízYøÚuÐ0´>òøød*¾Ù3§3Ó>dØHÔ¯_ÇÄéSGѾ]|6á 1|Âç_ q£†8qì¶lZ7ËÎwÎJƒ£t:ßÎkWbpüèA4iÜC‡ÒNæ~‚ÚÜm7`åÊ5ذn ŽÞOOOL˜hk7–-_ôôt:¸Q'¢I“F˜9ûÕkXëìµ+1²ÏA¼¦Âé½Á¹e&1… ƦÍ[ЬyktìÔ ÿüó¯¬ñjÜ(ÎÎÎpqqÁ€þ}±yËVY\ƒ €»»;Š#¼oo,ÿi%RSSéééX¶|úõí¥øXlÛº=úÃÕÕžžžпâââÄð¨¨Ó¨_¿.œQ¸p!Œ?Vv¾£pV¥ÛËË I‰Iwwwô ëŽ];"u‡µ¹ÛnÀøqcQ¼x1xxx x_œ>}F Û¸i Âûõ‡‡ÜÜ\Ñ©c{œ;w>Ó× BÎkõÊ•2€úõêâã>À¹sç±ý—˜0ñ ,Y<pýú ”¯XMvžÁ`}/Z´ˆø900!!e°yK$ºwë‚mÛw (¨J”x;Kñ©qöì8tø0nÝú Ñ.ÈÂââÁh´=ª2e2ÎJƒ£tϘþ¿÷!~Ù± ]ºtÏñhܸ¡îp‚ v#÷ÛŠË‹Ÿ ôG\Ü#ñûíÛÁß¿€øÝÛÛ[®÷A¼ÆÂII… åˆÚuCÅßÌf3.Åü'''Õó” Ø€ð¾;nºtîˆÅK–âÓ1Ÿd+>%ëÖoÄ?.Ç€ýP·nÈŸ¡šÉŽ1™Lbk^n];£JåJHNN–…{yyááÇâ÷?ÿ¼’©pzÒýÎ;¥Ñ½[Lûj2-ø#?›©p‚ v#÷Ú ¸,©ëñññðññ¿à¿ÿbÅï ôÀ ‚„“ð~}ð¿‡aÿßñäɘL&ܺuŸOšŒAû‹ÇuéÜ[#·!11IIIX°p1úô +þyßÍGß>½Àq\¶ã“âíí…C‡Ž %%111bähYx¥Š°bå$&&"66_M‘©pŽÒݪu¬^³V\tïï¿eÓŽÂ ‚ÚÜm7àË/§!66IIÉØ°q *Uª †uêØË–¯À³gÏ””ŒÍ["‘7o^ÍøÜÜÜpóÖ-Ü¿ÿ€ A¼îÂið 8 ßÿ°uê5B¹ UñÑÇÃP­ZUôêÙCÖ=}úõ4AÕêµq*ê4fÍšî0þV-›£x±¢èо]Ø•ø¤LŸö%æ}?å+VÈQc0PÒ`@ÄŒ¯ððáCÔ©×-[w@Ë–Í3®Ö k¥{Î73±cçnÔ¨UAÁ!â*:½á´Œ™ v#wÛ hÖ¬ š·l‹ú¡MðÏ?ÿ búTÙ5 êÖo„ÚuàìÙÿÃOËkÆ7h`´kßEt zLöpû÷ïBCCñ÷½»â Szr–"+Q² ®_½H¹Jhrèà>ô<ÔöÖi‚ÈE®_½øZ¶MAÁ!/t»ªÇÄ«P­å4«uÅ`t¸¸¸ Pá"8pàhnå%hü´ }T‚ âå„Ó †„AA¼:ð”A4è"Bdq"‚xÅ )~‚x„“€œü‚ ^zHÄsª‹$úˆ,NÄ ƒV`Õc‚xÕ…“`ù#ˆç#â©´Õc‚xÉ˸â¿L8Äó¢^ƒÆ4J%ªÇñJB«ê‚ ‚ H8AAp"‚ ‚x!ñÜ9tpeñܩנ1eÕc‚ê1 'âÕ¤ÿà¡” ÄsCrd¦zLP=&áD¼ú•€ rLT ªÇ9 ù8AAp"‚ ‚ áDAA‰ ‚ âe†œÃsˆ àÕ7–k…ñrÖg)ƒ~~~hڤƌ77×7²-#‚,NAL®]‰ÿ.Åüß~݉bÅŠbò—S)s‚„A¡ÚPò<ÜÜÜЩSìܹ›2„ H8Ï‹½¿îCé2‚ •ª£_ÿA¸råªì˜oç}j5ê R•š˜7•«ÖDZu±zÍZÙýR=&N/œ!CGâÛ¹³qíJ Ž=ˆ&aèðQbøšŸ×!00Gïljc¿Ãh4â‡ù‹dqDG_À±#0{ætñ·mÛw`åO?âÊåh|;w6† i»æ°‘¨_¿Ž=ˆÓ§Ž¢}»6øl²8—/_¾›‹sÿw ;wÄÿ‚Èm¿`Ù‹˜q:J'ùH¯f³±±±˜÷Ý|tîÔAwÝrTߵ«V©ŒÓgΊǮ]·ï”.…7‹¿E>ƒjU«–-_ôôt:¸Q'¢I“F˜9ûͶcÂç_ q£†8qì¶lZ/‹›ê1A8N Xþˆ\ÃËË I‰Iwwwô ëŽ];"%ã4n ggg¸¸¸`@ÿ¾Ø¼e«,ŽÁƒÀÝÝÅÅß&N‡¢E‹š6iŒôôt›¨Úº=úÃÕÕžžžпâââdq~9eJ”xÎÎÎèÕ3 ÉÉÉørÊ$+ÆŽSO: âU&(8Dü+W¡*z÷//O|2j¸îºå¨¾k…W­Rg,Â)55;wîÁ÷ßÍÅo¿À³gϧOŸAU‹pÚ¸i Âûõ‡‡ÜÜ\Ñ©c{œ;w^³íˆŠ:úõëÂÙÙ… ÂøñcéÁ„Á^Ѫº‚ã8Õ‘*ÏÛôéŒé_að{◻ХKGðÆŠáׯß@ùŠÕdq Ù÷¢E‹Ø]Ç*pÔ8{ö:|·ný…è ìÂßz+Pül]1T¤paÕøô¤“ ^eôZ[´ê–£ú®^¥j¬ùy=`×Y³:Š/†ÚµßÅ/;v¡[×Î8}æ,úöé¸}û/øûãööþÿöî=<Ëú°ÿøçIBH X<¬]¥**ÈAç,ȱ" Õ­­¢hëºN/«?·µ[/×ÖÖN]]§s:©ÖSEk) Õv­Î‚ý?AZàÇ„$ðüþ@h$AÑòz]W®@îäæáKî‡w¾÷÷¾ŸîYµjõNŸ;V­Z²²mÿ ô9òHÿðÐ á´›tïÞ-555éÚµë_·n]ºwëÖüûáÃNÊô©÷eþ3¿Ëì9s3wîã©­­ÍرcšCëÙóvXGñf-ÊöqöfwÿøÞÜrËm™×ÿë 9ùäQ©®^•C=ämßöëßî8ojjjþxY™~@8½O?üãyêŸÎГ†¼å§ÑÃøø;âˆÃsćçì³&fÁ‚…;nbóéA˜êêU9à€ýwÛcûöÕ×dÖ̇³Ï>û$I/~þ]ïó½xœÐÞ´åØÚÙñ¾³í%%%é×·oî½ïþ¬\±2Ç·e†÷ÏÿüÏò•øZ¦L¹+ýû÷kþ§W¯ƒòúëËóáÿIóm­éÖ­[ª««³ß~[fªž{n‘Th…Åá»É¤s?—üÚ?å±¹¿H]]}êêêóÄ/•o\õíœÞ¤æÏ}ú¸Ü9宿5 Ë^ye‡©ò‰gŽÏO¦Nˆ RWW—›~psÎ9wò»zlÝ»wËܹ§¡¡! ,Ì—/»â]ÿ}ß‹Ç íMkÇVkÇ{kÛìŸë¿{C&N¿íI»¤$gN—ûþMÍ Ã“dÂø3rëmw¤¶¶6uuõ¹ÿ©éÑ£ÇNÿ±ýúæŽNɆ ²|ùò\õ­ïøG…¶†Sq»7vݨ‘#ò•¿»"×÷† tB :!×^{}¾ò÷Wdø°“š?ï»×_“‡f<’ãO’Ãz÷i¾ªf«ó&“ššš :*;1¿yò©\{íÕïê±]ýíoæ†ïߘcú Ê—/ÿÛ\pÁùïúïÛÚãt3AkÇVkÇ{kÛèŸÆÆÆŒwÆû0~\6mÚÔ¼0|ë1YZZšÁ'ȉƒ‡æé§›Ûo½y§ÿŸ¿sUª««ó‰!ÃsÚéãrÚi§ì°ÝqLG×RfÍšU6lX–.}9¶|âæïè8ôcGfÉâ…Fšš;gfÎÿü%)º‚“÷Á’Å =79Žé ÇñÖïÓwzkBIy’¤sçÎùÈŸ~4³g϶ÆiwhëOeî‰ìîçÏ-ðþN»'-Àó t ‡'áðGa4®rÇ1'h—0ƒã„´Á¡#ý” Žch—¬qN àbÛ§bqËÛºh»<2ãÐF @8'á œ„@DZÃkÕ¹‹ÀŽ]´}™qh#á œ„€pø ©««Nm‰¦ùóç§¾¾^8ìLeeeúöí›ŠŠ á°«„@ œªh£–NÕm{É•bqË۵Ѷ>2ãЂ-§êžqª 5[NÕãª:€¶ÆÓö„@ 'á œ„€pNGóK®lCñ‚q:¸â›Þ'fœÚL8'á œ„€pè8šïã”bqË[âFN[»¨¸íNNfœÚH8'á œ„€pN'á œ„@;Òü"¿Å7Þ¯ñ PlácfœÚH8'á œ>Èš¯ªÛrYÝëÇ]Vtt[»¨¸íú:3Nm$œ„€pN @8'„€pN @8'áÀΕmýEñ7¶uÑö}dÆ  Êv誢9'€-iTÜñ}Ì8´™pN @8'á œN @8'á œ„ @8'á œ„ @8'á œ„€p@8'á œ„€pN'á œ„€pN'á œ„€pN á œ„€pN á œ„€pN @8 œ„€pN @8'„€pN @8'„€pN @8'á€pN @8'á€pN @8'á œN @8'á œ:¬²Ý½Ã¹sfU@8µ¦P(Q@8µÅó‹Q`e€pN @8'á€pN @8´#;}­º¹sf! Ã8dñÂwN[w@+á4dèÈV@Gb€pNÂ àƒ¬Ì@ûpXï>a7{~Ñá{ªb±hvƒB¡ð޾N8@;ãVAïλ¹Á·5N ö|[×=yß¶÷ïVaÖ¬YÅaÆåÅþ†úú$Ii©ó§ðAŒ¤b±Ø|ªî°Þ}vyqsG¿ç-ÈÜ93sþç/I²óÅáMM[ÖAUTTäÀ^göìÙfœ ½Mïÿx 'h§ÚzúéÅ——æò¿¿2çáâüü±_´úù÷O{0Ÿ»à¯ó߸:Õ«Vw¸ñN°jË Ê /¾”o^}]úõ=*Æ*S§?œ‡ýùÛ~þíSîΓO?“s?sV;ôÐ|õÊ«²jõê3^ öPm™A¹á¦ÿʰ¡ƒSUU‘õë×f¸1ydæ¬ãéö)wç¹Å¿ÏØÑ'geõаÏôí{Tî˜rO‡/á{¨¶Ì ¬^½:ݺvÍÚµk³råʼòʲL;&Îzl‡xº}ÊÝY´hIÆŽ>%/¾øBÖ­[› éZU•×—/oqß›7oÎîúqÎÿéyÔ±9¦ß L:ïÂÌ›7·Ëû5^­qLh§ÚrUÝ_ž5!Óf<’ѧ|2Ë—¿šµkצ¤¤ñŸû¦>”’å+VfñóȧƜš—_~1µj³ÿ~¤PZšÙ=‘/颷ì·X,æÒ/_‘5kÖäʯ}5GyDêëòð#?Íä /ÊMÿ~C ØîÆK8Àª-0rØÔ××çÁ‡š1§œË—gýúõyµðJ&œqZîŸ:#]ºTfìèS²tÙË©­­MÏž=SVVžûx05ùÜÕçð·ìwúƒ3òúë¯çÎÿ¾-¥¥¥I’òòòœõé3SR(äW]i?¹·ÝWkœª€vª­§ÀN?õ“9yäðLŸñhzî·_ªªº¦¦f}^{íÕœ1æ´Œ>yD^^úRjkk³÷Þ=RÖ©sî›úP.š|n <¶Å}þøž{sÁäóš£i{ãÆÍõÿrM‹_·yóæ|矯ˀA'ä¨c䬳?›%K~ß¼ýÑŸÍÌáGöÍa½û¤ï±ÇeÒùfÑ¢Å;ìã{7|?ƒŽÿDŽðgùú7¾•¦¦¦Ý:^ ö@»2ƒrú)£rê¨á™>ã§ÙgŸ}RYY™ššš¼öÚ²,]º4555éÚµkÊÊÊsÿÔ‡rÑyç¼m4%É‚Ϧÿ~-n+++Ë¡‡Üâ¶[o»#™;gfžüõ5jD®¹îúæí_rY¾÷¯×åùE ò«'ædÔȹäÒË›·OùÑÝéÕ«WžøÅ¬üÏ/KYYYþýÆÿØíã%œ`³«3(§<2§‘éÿ,=z쓊Ω©©IMmMºté’òNy`úŒ|aÒçvMIR[[›îÝ»ïòc¾÷¾rÞ¤sRUU•ÊÊŠLFæÏ¦y{·nÝR·¡.IÒ¥K—|æ/ÏÎÃMmÞ~×Ý÷däˆa)//OçÎ3ùüssÿ?yOÆ«Å(ômíÓ;™AY¾²:•Ù¼ysêÞ8ÍUHCCC*»tMçòò¬\µªÕýìµ×^Y³fmzöüÐ.ýù/¾øRöß¿æßwïÞ=«¶»Éæw®¾*ŸÿÂóàCgâÄñ))”däÈáÍÛ—,ù}Žé7h‡}¶tºpw—p€=Ä®^%vë”ÿûìs|âqY¶li6nÜ”½öÚ;MM›²~ýú456eäÐÁ™6ã‘$É©Ÿñ¶û:úè>ùí¼y5²åÏ™5û± vR›×ök”†;)Ó§Þ—ùÏü.³çÌÍܹ§¶¶6cÇŽI²eÔ³ æ¥S§NïùxµÄ©:h§v%n¹ýÎ<³`aŽØ/¯,[šÚÚ ©ªªJiiiªªº¥¼¼^ ö0m]³óŸ·Ý™ ÿ_{L^}uÙ–hêR•B¡4þü±Ìœ57U]º¥sçÎY»vMV¯Z•Á'Ÿû¦MÛx:}ô©©ªªÊE_ü›,\ølššš²bÅÊü÷?Ê—.¾4—_vi‹_7aü¹õ¶;R[[›ººúÜÿÀÔôèÑ£yûèÓÇåÎ)w¥¶¶6I²ì•WRV¶íÙÄ3Çç'S§eÆ ©««ËM?¸9çœ;y·Ž—p€=P[fPîy`Z~·ðÙÝçãÍ3M]ºtIJJ2çñ_æ¢ &eÌèS2û±ÇSQQ™òò-ñ´nÝÚœ0h@îy`Z~õë§Þ²ßB¡¿ÿ½ èß?—^vEúÝ?§œ6&¿yò©ÜróùÈG>Üâã9oÒ9)--Íà“FäÄÁCóôÓ¿Íí·Þܼý»×_“‡f<’ãO’Ãz÷i¾Ênû¯¯©©É¡£2ðÖJÄ]RIDAT¸ó›'ŸÊµ×^½ÛÆ«5…Y³f‡ –_øCêë“$¥¥EßðsXï>)‹Y²xaóï[‹ÏNþb{têRWW—nݺ¥¢¢K~óô¼\pÎgÒ¿ß1I’ŸÍš“i3~šãô͆ µ©©©MûdÍÚuY³n}®ûÖ×÷ˆñ{~Ñ‚Ì33çþ’Vcª©©$©¨¨È½ÎìÙ³-€öª-3(½úhVT¯Ê¾ûìb±˜b±_þúó¹³ÏÌÁ}4+V¬L1Åô;ú¨ÔÔÔäÑYsÒ¯OŸt.ïœb±˜ÕkÖåc‡šb±˜B¡Ð »ó1~Æ«5 ک¶Ì8]üWæ+W~3Ò¹¼‡ô:0«×¬Mã¦MiÚ¼9…B!G÷92õ ™õØ9ðOȲW—'…B>{Ö„l íîñj5NÐNµ%öíù¡|ëÊHÏž=SWWŸ/^8)ÇstJËÊRVV–Ò²²tzã×ÊÊ2ô'æÓã>•õëërð!矾ú·[ÖDuñj'h§Ú2ƒR(²oÏåòKþ:MMMijÚœÆÆMéÒX™ÆÆ¦4555Ÿ†+)-IYii†’“G OiiiJKKSRRÒ|šnO/á{¨¶F@¡PhŽ -*Œ×;äT´S[i{¿kïß ·#€vJÛߎ€wÆí ƒýÇχp€vdOX¤ÝžYãÐFfœ h¯7žÜ“˜qN à}QWW'œÚMÏ<óLê߸Ïe’”lܸÑȼIeeeŽéÛ7[^¢fãÆÂ  %uuu©¬Øöº~›6mJYçòò¬\±"MMMͶÞb ÃÅReeóiº¾}û¦S§NY¹bE:——§ä–?TæÏŸŸÆM›ŒС£i뚦íOÓmܸ1óæÍKïÞ+”$I¡¤•ÕÕF è°Þ¼¦©²¢"Åb1+VV§´¬4ÉWÕý`Q§BCÃÆ¼´tiÖ×Ô¤±±Ñè/žÞˆ¦ÆÆÆÔÔÔæ¥¥K³©qS9øàB²ÝK®Üø\i!)Í_ìÿr±zÕ*#th{ï½w °ÃÂïÿ€Õ$ƒ®ãð®IEND®B`‚kildclient-2.11.1/doc/C/images/we_hooks.png0000644000175000017500000007616511405233117015373 00000000000000‰PNG  IHDR‘÷]§| pHYsÚk¥óÎtIMEÕ ) »ãú" IDATxÚìÝy\õÿð÷ìÎîr ˆ(R©$ŠšG” â"˜b᪘ ™–ŠWú#¿y ˜~õë75ÏÌD<ÂÔ,ÐÍÔ$OTD¤C%v¹\vwv~LÍw[`E}=>|̾÷óùÌìg†}ïgN¦×"#ñ<Ï0Œ0Áóüßo¦úv»Üxà²öO Gð¸I™ž­å=ž–‘‘'"^Â0è€Qvýž32Fž8#ÇqÄÏóFŽ˜ÞAoò<Çó¼Xôèw›b Nþ®;zM§çx¬ŒÇ§“4Ø×ÊÕNbàHÂ% úà•þ±GÂñFŽ38ÆÈð<ÿœ-fkÎH9· Yù†’;ÆÂr#g¼ÏùYÉèmì­$‡²ªNþ®«ÇOráÛÏìʳ Ceó€gžZc±¢ë—‹Ž­Õ(¼ü^™†Õß ¬eÌD[GkæôuÝÁ+Z¤m€{boÅ8X1ϸ°¾ÍeŽÖí°4òTúën†3’‘gŒ Ë0 Ã󼘰ëqvo+{+IV¾á§_uõûÙ¼ûŽ¿™?üå©Tºï@òí›ÞÎ-¼ÍÊTU¨ÙßS8‰¢]ßq÷ý³꨼Šßvº2*À¶»—üدºŠ*i î4wxͺQÂøM's”0t– é.ÙÏÏÏÈó\Ú·„:õ¸ÛVÎ|ÐÏŽ3Ò¿ÓÊK*ë?gjòrªNoð¡Ïói5tŽÜÚÞä}þÏÔUö|q¹çPv~ØŽ‘ÏYwk%;ñ«.åR©T&gplྈljhÕÑŠ×[|/áx–ax¢¿¾XeUÿ­æqûfÒ.-¤ŽÖŒŒ*õô[±ñ×"cömKcñ¶n,]¾¥/,oA®­{›âæ½O¥§¹¹º>ínŸ™ü_Ÿa3éï$‘ûóNOEù•ª6í¼ý µÌ?n¸£YdÆ7šêf|£'Ú¸²ƒÚ)ÖüT!–™ó’½“µ$þ‡²Âr£TBó‡:È¥Œžãÿï@)g$7;Iô{õ㢔²»~"q.w 6Z?\­êÖJö´«´J§•KX‰TŠ?<h z³]ZÔééÜŸÜ¡lÃ#¯þG ·éçʨ[GkæÝ@Ûakûní˜%¢Ãû×Qæ-Ã9UÕë?ãLšñm\$¶R­Îp§ÊÀqFO[ÞÓŽžr¤Ìº®©y,ÕÊYBDÿ4pƆ:ï¬E—!Y²Js®H$yUÕ¯Çw>åFDE¿žv»“y¶€:ŽTÝuîfcÁ©_—˜ˆáÄ}]²l¤3 þ> õÉ~áÝ_oºµ’_Ùößííç;ûÈ¥ ɤ̩•a¢¶z9ÛÑw{×¼ùùź|¨øN5.Cõ`#TPÆÝ.7z8HIn¯7èX»Ç QxÚAGdÍ0Œ\&5pFžãŒF#Ïó<FŽ3r ¢§ÎÈ4†êåUüW¿T¾ÕÓV*¡É½mCö<Ï …8#¸¬­~Ð×ÓÞð|³*g{k©T*•Jr†3òF#o$Þhä›[ÜõwtŠ[lõòrf‰(û¶Aß×v=ÕRfb4[y‹ˆŒçv³öîö-|(+éJQé3/ÿËÀ³T‡¹¿·óéÐZ&‰ð·QÚH’3µbðÓP§OMN­¿qñØû»ÔÂôµB®[+êÝ»÷ÖS'G÷ï(–éØû\fúh¿ADtìØ1OßžÁ¾Ö=ž–3 øM·7㎑§•¯:QVÁŠe>M-³¼ ú&r‰ÜõÎÕNâf'ý³PGì€FᶺBÂ0Œ„±VÈl¬¤‰Ñhä‰8#oà8Ž3ò#O<Ï«+«´,+·j ÕÿÔpçsõÝZÉ‚:X-ú–Xa]Ûl¥´TÎÚJ$"žãŒ¬D¢±F#_¥7<ËJ¥Rƒ‹Ts“SRµ¯f+†ˆŠ+Œß×w±ò§‚fü¾{ËWIãÍ nÍš3•ÅÎo³6Žuœµi±á­Z»°Óæ.j÷L ê6ÁlD.üÄòÐäÅDtµPOdÝ»wï%_ü߳hûöí£G0`ÀÞe{Z» 9{ÚüÿöV±hub^Ö©ÿüûÓ+é/²=„fç¾3æj¾.ÿVîÊW±° ÛõG8wÁÅFò»N/‘óŒ9½Â’2g‰‘Ñ’^!c2–cˆçIÂð '5ªŒ ÏSaIYy)c§lÞHª ljèýî/þi¨~Þ™³´ÌQz‡•Úqœ‘çÉÈ“„H*•ÈeR…-­ÐJ%+…³¬Äš+.e”fÕ¥†ˆ´†Ï42Ç–Ž/¾Q~bu%Çò2™B›WÒb kËŽu˜š^›µ½¤ƒ»ŒˆÖÿgIŸ‰ŸFÕ^+2¡XhÿF W®5´iÓÆÞPèåÌêõú3f„……½ð RͧÍì$šÒÒ‹/ë÷<}:wò‹áÿ"¢à^6ÍXNª…DtèСç'üû¹=ÅÆk\†¦2ÎÎøS? ¢}söø¥*Fo²2|YÀ#w«¸´m«f:Î`0H¬r†a$‰É0ŒÑŒ<ÏËXÉ­âRí™âŸ9±Æê ¹”ˆ*îè‡«#Ué9qî®NvD”õGAÕo•r·Ë®v’—|¬Xˆèja {°™;¹®Þ,+ÕsÂÞÈ¿ $™LÊJ%UzƒµT¦³úÒ|##©á»á¡ÜDEW˜ÃS%wmm«•Ë­$F]Ýçk¶óv­‘'¢²²2§ƒ,Ô2mÿÚmcOšúN„„¡Ô£Gsóò³óµ>-lß;ŒˆŽÿôke¯´·"¢’’eÇ!DÔ²eË+©_-æåÞ!µùß q6r¦ú2šÈíhžva‰èì }•N/5f@#w»”'þN•^&•ê9NÊI#/a£pïOâ NÏq,«È»]ª7º˜åÄêÕí Hl­å…êòºW" ™´R«7ò¼µ\ˆhuúÚª Ç­VÇñD”_Và ®L}ÛÁ¶5ÇÛ¶r«­®Ý(tq°½Sz¥JêÅ*lLß⌼TÂyjè\Sšs\ÿë¡*·îöwòt:]UU_x Ä£ƒgç:¶0nKÑÿ>u•ÑÁJâäädggo¡ŠÞäHBf¾¡‹§|Ô¨QDôíþýîíü/ä3>-èµ×ÆѱcÇ\Ûú©+®vggg{Gg"ºqãFEIÞ_Åq$·3m°ÆeÐ7‘KÌåR""µÖhàŒzÎÈKqç;xôŠ4FΨ7pDd0ð©QÂ0F†áyÞÈó¯ç8½3rÆ"MgTþyþ²Yu{'…é»nNvç³sëX=ïv™‡«=ÙXýo7¤åêëOT|ÖʉˆX§Zö»ªKËY)Ãù‹9yÛxT/‘ó§‘çíläw•Vì?r¶°o¼ª÷W©ÿ¬øy]¥Ô¥eŸ·µÅ75i‹¥F-i~üdèb¹K]1ž»©l«xõÕW?[Ã9Ï•:ÞFÎ888˜V¹|KODÂ-DöïßßÜo™úQ]‰eÙ¿r¶wï£9U#Ÿ³ ëâÎÑÚµkm”-ÿ÷û†—ÐÝ–¡©Œ³+t¼°«@ÏË»Ë@#PRViäyÎÈKŒFÎÈqF Ç0’¿Ÿ·Á9Îh䌼‘çKÊ* VæiÑ´ºqÍ<çÝòçKÔ¥:gänk*\mÅwo¨ JÊ,̈´z""VÇjº ª¬B§Ós,+åŒÆ_s‹Z·üGþ»Y Ö”ßaˆŠ5•·5[-ûÏFîèykÃJ™;ú†J6F}•îÔjbÇÞòr;EsÝ “è—Ϭ2™Œ©L_ÇFs—KâLg¿º±hKz¥özllìÚ}g†wíoVx݉ŠH?é7ß|³üR™ìï[¸\-4Té9…LzõêÕk×® ~sðµÛ†ÛeU®ö NwêÔ©§D'ž­Tçü¼páB™•íæoÓããã;Œœ[ÛºÆeh*ãlg åi8Ž'ÎÈ“ãlxôÊÊî0ÂÉÒ<Äq<Ãð<Ãð]pEÄCÄ£.»cPðfiÑ´zmêX]˜û?rÙÝæ.€-³+Yå…œ?»ûx‘V§¿‘¯nåî$¼U .¯Ò¤‰DÂü–WT\vÇÑÀ™5’«æÚº±Ò«úZü¥ÄfÖúœæcì\[ ÃPë§zTÿæ%½*“ÉxÞp5ãk™ï«µU±îö7Qæ»ý‡^øQ²áÔgCÊó¯%œsþ«hÓ’‡¯j¿ÜºûÜ–ŸéÖsÚž¿GÀ¶¡àÀ”6œîŽ{+—§ ?q{YòŒg´ê< +wðêZ¥ç÷´[þñõcÛxÞØæ¥w[zGlVXxñåír®ú24•q¶‹­„ˆnª£DodŒg@# .¿ÃHˆ•J$ 1däy†þºˆçybH"‘°DŒ„Ôåw¬œÍÓ¢iõëùj+e†!ªë \±¦Âh4Ö¥:1ä®´3}׫¹Ó¹«¹æNDº¿r6Ç×–ÛÇÎæt{¶•œ•ê œV§Ï-Ô´ts,.­äŒ C§Ón•‘„a$F"‘hÊ*8•åÐìi£Ôʬ‘ôúa¬ž‘õKe½o5×»1ç2nñŠ®c9bþ±³‚ao{½ZjHíØºyYY÷û¹¥-XûæØd‚OËå,¥\Ñ zޤ’0x: 4†œ]QÅÉeR®ö„¤³<Ï—VT9ðæi±Þ«ç•2<ñâ±m Õ‰H8ÍVÕ>Î&"›æí×&}¯7‚|%R ÏÇy–d¬D«£o]ü|ÏO:½µu!©•Y#çoê3þÔwj! l«8xE[¿½¯Ï½p¦‚î´­(ŒÕÞÊùpQçœô Z­V¯'-—nÕ>›lC“Jhlwk"Ús^K¬µ‘‘8bxŒ³àÑ+«Ôñ$c¥¿çI%R‰„°R‰œ•VjuU:=Ïóe•ZŽãÍ2Z½W7y†!† Ošr­åêDT¥7=ž]Ë`HîÔÂæé^Ëwøñ\NÏέ»<ëù´‡Ë·J.ýš÷Ã/Yi?gX+¬š·‘:4ç¤ cµFeUuj!{«§múu]aY½¸ÚWI,ì1vòþ•þz:§´éܤI{ýE›–NÒ”Lí/ÇRlÜÛpÏ3g@cP¡Õ w‹0òFÆ(aÈ(ÜÑD"aˆç†¬2©”áyªÐêôFó´øh«‘0Àþû¼ñZû·Öžr›óW>zæàÖÈ‘DÂË%Œµ\æàèjíÒʦY[©«ÙÕJ‚ï.k»zÊúz+sü`·ºL‹ïïÇÖVáÏÛÑâï‹$6Jbm9’ñF²t’%ÀÃâäÙ±ÓØEu)iogËÍGº¶:™7ÎYH¦ŒŒµoîÞ>ÐÉãO]Y¡áN©ÑP%a¬µƒÜÞMáÔ‚µqæ%²ÚZX–Z®´•tn![ùªSÌÒ?nk±é'û2úàqÎÙÂ×=º¬IC¶hºp<9³³9›())I.—3 cee•’’òÐæË0 V6 gßCÂ7n\bb"Ïó_|ñÅ«¯¾zäȬ€F—³U*ÕÖ­[CCC…éõë×ÿüóÏÂ[%%%AAAVVVƒV«Õâà8..ÎËËK.—'%%Y.¹`Á‚Ž;QzzºŸŸŸB¡hÑ¢ÅÆ±Ž9ûžéõz!a F5cÆ azÖ¬YñññeeeQQQsçÎËäææfff&&&ªT*Ë%=<}:Ö1<˜õÇˉhÍþ Û'8Z(w4íPDÔ”¼§ Ã0b âf!âááqãÆ –eF£——×Í›7…2EEEJ¥Ò´nm%‹‹‹MgÇq˲B-ÓY?Ér²/·ñî€;«4!£7k&…t¦{½Z=S©ð²°°P&“ ÓR©T,&$lSµ•vAAÁêÕ«Ï;—‘‘5 ‡ºo\&“‰‡¥‰())I̾J¥R§Óñ<Ïó¼Á`°ÐÈ]Kñ<¹oß>¬`@‰ãÆÒ¶x¹ðVHHHff¦Á`ذaC@@€…FîZ2++kذa={ö\µjV0<6ê¾ñÐÐЭ[·ªT*½^/“ÉÅSÒâããÇŽ{øðaŸ„„ ܵä¦M›ÂÃÃ‹ŠŠæÌ™ƒ ÈÙ÷Ÿ¶u:]õ¸‹‹Krr²YÐô¬1qú®%Äé?ü°z€¦÷.@Îäläl@Îälx8Ú>ëÛöYßÚ^ÞG €œ €œ P Çq‹cãŸ÷ èö|űñÇÕݼy³O¿A={÷¿yóæùóF¾¢jïÛ¥ÓsÝÇ¿þæÍÜ\t)€]õbÍÚu6nžÿñ<†aþ/æ_öïLžTcP(ýúð×&TUé¾úÂÓÓ3üµ7rsÿL=ô}~~þ˜ð×?ø0z׎mèUŒ³áA ǤMKïÜ•DDÁÁAC‡!¢;w׌÷z^Þ­èé¶iÓšˆÊËˉè÷>øí÷ß/œKGÂxÄ9›1!—ËMŸñ%>”óžZÃú{T®]½$ü#ùùùDäèàà`oOD·nå×h4'Gǯ¿Þ#¼ü¿¹sììì23¯Ìù(&°ÏÀo|‡N¨·œ})“ÿ›é3¾÷oúÜ›5#"Miiii)yxxÔ¬þì?£GJÿåôÉ“§ˆhøða'YýÙÊ#^Vk4sçÍG—Ôç8ûAFºâ3¾ÌšJJJ’Ëå2™¬K—.GŽßMLLtrrêÕ«—0t3•žžîçç§P(Z´h±qãF"òññÉÎÎ&¢ììlooo¬æ‡`ĈaDôÝwÉß}ŸBDcFª-(èÕ3`ôè0‰D²rÕgD4òUÇÎÝì&¿ED..Jt)@}ælžç0mëõz³ J¥Z¹r¥V«‰‰‰ˆˆãÌËË{íµ×fÏžmVe„ ÑÑÑ¥¥¥±±±Ó§O'¢áÇïß¿Ÿˆ¾ûC‡b5?ï¾óväĈO—­Xúéò·¢ÞŒœøFmA‘gË–}{Ÿ:•þóÏéÿY¹¼oŸÀ‰Q“B†ìÖ­ËV,C—˜•×/'¢5û/lŸàh¡ÜÑ´CQSL÷`3 #¼'ê2.7+Y½‘:88¼óÎ;ÖÖÖb±ßÿý©§ž*--m×®]^^^­qDz,ÏóÇŸ7oÞ?ü4eÊ”!C†`M r²/·ñî“}]ÐTŒÞ¬™Ò™êå´m›IHHP«ÕÁÁÁîîîgΜã­Zµ"";;»¢¢"³*óçÏ m×®éÑ£ÇÕ«WóóóO:Õ·o_¬ox ÔCήû8ÛLRR’L&3 º¹¹¥¦¦ªÕêåË—‹ñÂÂB"Òh4Í›77«Äó|ddä¾}ûþúTÉàÁƒcbbzôèaee…Õ ÈÙ”°Ç—˜˜h÷õõݱc˲J¥ÒtH½dÉ’ªªªmÛ¶…††šUÉÊÊ6lXÏž=W­Z%‡¾aÆ   ¬cx<<Ð}Ðî#a‹{Ñe2Ybbbõ¼~ýúˆˆˆ1cÆH¥RÓŒîéééææÖ¿ÿ/¿üҬʦM›ÂÃÃ‹ŠŠæÌ™#{÷îm0³9›èÞ/ª¶P^|Ëßß?33³z©S§N:µÆ*aaaaaaÂô‡~(Lœ9s¦sçÎmÚ´Á:€'=g7ò» Œ1B¸Vãì‡ç>~7Þxlà!ÈÙ€œ €œ ÈÙ€œ €œ ÈÙ÷E§ÓaÍrvª¯GvvéÒk³›€oH€œÝ 8///¹\ž””$œœzõꕟŸ_}h.L›þðäxd÷ÏÍÍÍÌÌLIIQ©TâñéƒæååmÙ²eöìÙµ=áƒçùû~h7<öÚxw@'ëköï yyäƒTÿñÇŸ‚CB}:<züÄÉ»–?{öÜØq:vîþÑܘÜÜ?rï=à‡€Ç‹.€R¿÷ÖÈÉùõ¾ë^ȸ8söܸ؅~~ÝOþ|júôY7~îÓîÙÚÊ_¾œ9iò{ócæõéÓ;?¿`öœyƒ xmÜØ‡Öuòaãl€z0`PÐõë7ˆèúõ/ !"¦4bâ[:vYZZ&ŽÑ?_·¡wŸ>žK9xHˆ˜ýOÖ®]7cú‡½z(Š>½§LywíÚuµÍ‹ˆÖ|¾þƒ)ï ò’µµõÓO?µháüŒŒ‹Â[·oÿF{ß.ÞˆT«Õ©1Xãçýý÷?††ŒèîçðÐò1Ú.“úÚwÈÙÐxõëÛçÇc?ѱŸŽЈâ—.›5cú…sé£U£–-_!–ÌÏ/Hù~ÿÊŸ¾?eš8d7ýÿžœ>s¶wï^ÿ[Œ~}~þ9½¶yÑ©SéÂâ <==ã–üu©áâ%ñ!ÁC3Îÿ2hЀűñ©1Xãç_ºL5êÕÏ×~¶hq܃|̇¼¿÷(@ΆÇGõ1Yß¾BÎþéïœýCêá6mZ³,ûÒ ¥Šuß{o²µµõKƒ †_’’µ““£øÒE©,.)±0/µZãRÓ}úˆèÇ2”eÙ—‡N;jy«kü¼§ÒO>¬{·®‡Hnœ«²zzFÂx$p<Þý‹/øÍ˜ù‘N§ËºšÝ­k"*..i×¾³ð®T*K:9:Öã’899–••999‰)ÜÙÙɼ”ÎÎEÅÅÍÜÜ„—<Ï—––9::‘F£±µµ%"[[[qßxm \=Xãç---utphükSÜŽ„ €q6<þd2Ùs;­Y»®{·®‰„ˆ¯\>íê¥kW/ee^h ù¾øâ ‡ÓŽˆ/§ñó{ÞBùîÏw;räGñåÙ³çG¾ª¦ïÜÑQEE…ø# îjü¼vv¶eeåMåG6r6<)úõ \ùŸÏÄ£Åýûõ¹–ó+Çq;wîS…[¨(•JKLvhß“·'E}ºlÅOÇOèõúŸŽŸX¾|夨‰ÊGL¿ôÓ婇TUU]ɺúѼ˜ˆ7^Þ ìuøpÇq¾KîÛ§÷½.IŸ·{·®ÉÉ)gÏž0(èÁ?ìCÞwS#Ý7®Óéäryão,0;¯XøºïÛ'ÐÊʪw¯žBpÖÌéL>yòT›Ö­ÿ½<ÞBk}ûöìÝÿòųmŸõ½×ÌÑÞ§]Ü’E .¹–“ãÎ`¼ IDATݶÍÒ¥±:´·P¾k×.‹ükÙ²¿=9ÇÅÅ%âñácG oÍžýþS§Ï˜Ý£Ç Ë–.¹×>©ñóΈžöÖÛïj4¥Ÿ.5û°ØŠÀ³þx9­ÙaûKG¦Šˆšòà·=Ù¶m[xxø¶mÛÆŒc¡X‡._®ç§ ‹m2 óÄÞ¿%'ûrïñ¦ïO÷pM;ôFäû÷Ñ·ÆâõnôfͤÎ`œ½k×®#FìÚµËrÎÎÌ̬÷Y‹mâ†kMØ­ ðÀîóx6S; µ***ÒÒÒV­Z•ššZYY)6eÚ¬Ùÿùùùýû÷W(/½ô’øm†aÖ¬YÓ¬Y377·¯¿þúàÁƒ-[¶”ËåIIIBôôt???…BÑ¢E‹7ÖØ²…Æãââ¼¼¼L„{%œfeú}ðhr¶0Tåÿé®CØøûû·lÙ²G¸kãD4}úôÑ£G———‡††NŸ>],“‘‘‘““³zõê?þ8===++Kxj§ðî„ ¢££KKKccc…Z5.^mçææfffš6ðÈ=ÐñlÓÃu9HkÖ¬ÈÈÈ}ûöM›6M,ìááqòäI³<˜——÷Úk¯Íž=[[Waçææfff O"}ôQHHÈõë×/_Æ#° QhÔÏâ,..þè£NŸ>}öìÙ¶mÛnÛ¶­k×®Däææ–••¥T*ÿ÷1¦¸¸ØÙÙY˜–“a˜ßÿý©§ž*--m×®]^^žÙ»âDQQ‘КôôôÌÈÈpvv¾yóf«V­›éx'@“#>‹“mÌK©T*W¯^MD¥¥¥kÖ¬yýõ×/\¸@D%%%Bz6U=BD­Zµ"";;»¢¢"Ë32‹äçç;99 Ãwl.Ð4ê}ãJ¥R8WÜÁÁaÊ”)ÙÙÙBÜÁÁA£ÑÔ¥…ÂÂB"Òh4Í›7¿§Y»ººªÕj!yc+äì»xå•W>ýôÓüüüÊÊʸ¸¸>}úñž={îÞ½ûĉÞÞÞ–[X²dIUUÕ¶mÛBCC…ˆT*½}ûö]g=|øðM›6UUU-^¼[ gßŲeËþøã:¸ºº¦§§oÚ´IÌı±±Ã† [¹r¥å<==ÝÜÜ<¸`Á!ìééy×Y/\¸pï޽͛7÷òò²³³Ã†\£>žmoo¿qãÆêñ:ˆûɦ爙NO:uêÔ©¦%¿ùæ³b5ÖuqqIKKÓëõ›7oöóóÆg7RãÇW*•vvv[¶lùüóÏÑ!€qvz ´¶lÙ‚0Îäläl@Îäläl@ÎäläìúÅüM.—wëÖ-==]ŒßGSXÙ€œÝ€xžçy¾²²222râĉÒV64iMãÞ¥,˾þúëS¦L©>z“±8]XXøê«¯^¾|yîܹ|ðßefÉ’%«V­ºuëVbb¢ðŒÎ¤¤$•JÅ󼯯ïŠ+ć~Âý9švOšÀ¾‘³‰ˆ´ZígŸ}Öµk׺þè£BBB¾ÿþû>ø Æ¹¹¹™™™)))*•J§Ó‘J¥Z¹reddäÞ½{#""rrr°ñ= ˆ¨)èxrð<Ÿ“}ùIÏÙÂqh…BÑ­[· 6Ô¥Ê222¬­­çÍ›Wã#¹bbblmmCCCõzý_?ŽSRR¼½½‡ "Œ¼¡^¶àÆ¿¦»j‰Õ÷×¥×®^z8ójì9»ŽÛ–i±üü|'''"òð𨱰R©4‹$$$¨Tªàà`¹\ž––Ö­[7l…õâ!üê|â>üF¾œM:«é ïÒ‡ã1¹Ö«¨¨HœvuuU«ÕBò®cu77·ÔÔTµZ½|ùòàà`l…Ð5íœ-“É’’’*++-Z$‡¾iÓ¦ªªªÅ‹×±__ß;v°,«T*MÓ?rvýHLLT©T­Zµjß¾½\¸páÞ½{›7oîååeggW—vÖ¯_£P(T*Ubb"6 h„õñìÚf‹ñÐÐPáÄo"ŠŒŒ&\\\ÒÒÒôzýæÍ›ýüü̪˜¶)NûûûgffbkŒ³ªñãÇ+•J;;»-[¶ÔxÞ84âåð$æì-[¶WUUýøãmÛ¶Å:n Ú>ëköï>Z¨c°îÕk,¶=qçýͪۻïÛ¶ÏúîÛÀB™—G¢«ÃߦO‡ç^ñê…Œ‹÷½:°]ÇC»~ñ%&îì߯O³fͰÊÜ÷ß§ 8àû… ­­LNίMk y\ÿ69ŽÛž¸sΜyû÷%=ÞãgÜÿoüÏ×mèÝg€O‡çRþu™ã…Œ‹¡#Gµ÷íгïÎ]_‹…33¯ úò¸ño›µ£Ñ”FL|«CÇ®""KKË„`IIÉkã#ºt{qÇÎ]u_¤™3¦Ïÿ×Âêñ—ªí³¾Û_èÑÛïÅ^É)‡Žýt< W?ÓÏRã‚=!îܹóó©SÇ|tâäÏwîh…àï¿ÿ14dDw?ÿƒ‡~Gf¦ÿÑíÛEãÆ¿ÑÞ·Ë„7"…ë6kÛT I¥Ò‘¡#®ýýªÆÑ³8]\\<&üu¿{mþâK1h:•…œ §üü‚”ï÷¯\ñéûS¦ ‘3çDNŒ8öTtô‡±KâÅ’_nMø&igÔÄ7ãâ?5k$~é²Y3¦_8—>Z5jÙòB0néò—‡ÿ|âèùóu_ž=^pptü>ù Y¼¶¥Êºš}ø‡ï?™ÿ+Wþ7#ãâ¡”oM?K ö„HK;ÚµKww÷.]ž;r䍨!ªQ¯~¾ö³E‹ãÄ‘™Ùølñ’øà¡ç4hÀâØx › Ô£ªªª¯¶%øvh_—Ÿ.[Ñ¿_Ÿºv-§Ž×€œ MlH]ãñì÷Þ›lmmýÒ ƒAˆ|`ïСCärùËÃB4šR±äûïMV(=z¼öwýz¸M›Ö,˾4hÀÁC©BðHÚÑ¡C‡(Šw&Oº§E=3ú³Õk͆ŵ.Õ»“mmm uõêø×ÂmllL?K ö„ø>ùà€ýˆhà€þâo S駇Ö½[×Ã?$×VñÇ2”eÙ—‡N;jaSzüÛìÚ½Grʡŋ>©Ó²#?Ž {ÕÊÊêÝwÞ®±VVÁñlxHj;Öåäèh)**þjÛöÌÌ+YW¯šÆÝÜ\‰H&“©Õ³*ÅÅ%íÚw¦¥Ré_íÛØØ‘»û½œvp°Ÿüö[‹—Ä/^ø¯».•Ré,ÎÔÖÖ¶. ö„ Ú§ùöÀwóþo¾Ð3UUU …¢´´ÔÑÁÁr]F#ô¤­­­¸o¼ÆMôoӌ酲·oßvp°ÿ*ëòw gÃã)bâ[D¼Jõ꺵Ÿ™Æ/^¼$$³*ŽŽŽW.Ÿ¿võÒµ«—²2/AWW×òòr!qÞë2 œÆqÜï’ûö鿈G‹eÙ”ƒ‡îÜÑ~¶æ·»8 ÿt:Ýê5ëÐEÈÙðªûõÙq± §N›Ù`ÐÓ^^¦ñOþóòðW¾JØ>}ªùùgÍœ»$Þ·S·Í_l]´`¾œ>uÊ¡R{hÓ¦õ},p³fÍÆŒu×¥²¬Æ{œ={î¥AÅ—ƒ_xúô½^?#zÚšÏ×G¾õÎÿÍ›#¼Õ·o`ÏÞýMëΞýUÂöNÏ=ŸœrpÎìøÛy´„óÈzöoÛ¦œ6uÊ¡÷lÑÂC8³þx9­ÙaûK‡ަŠˆšò0ŸºZã.G³Àƒ`ïUNöå6Þú1|âÖÒøŸÅÙ$–³I@g>«É`0ìþzϾýßnݲé ïÒkW/5èWëèÍšI!©1Ÿƒ&&c ‰ àá›>cöáÃi••wžëÜiIìBtÈCÓôö3 ³`Á‚Ž;šŽÅ ûôéãææ¶bÅ ËÁ’’’   ++«Áƒ‹§T˜¶™””$—Ëe2Y—.]Ž9‚MÀÌҸŧÓOd^:·=á˧žòB‡ g[âááqòäIÓÈG}rýúõË—/[Κ5+>>¾¬¬,**jîܹÕÛT©T+W®Ôjµ111ØD9ûþ9ÒìÁؘ8q¢µµõ¼yó,÷îÝëãã#“ÉBCC÷ìÙS½ÍÀÀÀ”””´´´!C†äää`äìûçììlÉÏÏ®ãôðð°,,,”Éd ÃH¥Ò[·nUo3!!A­V»»»Ÿ9s›4É}Ð\]]Õjµ³³s~~¾å R©ÌÍÍ•Édµ5åææ–ššªÕj¿úê«àà༼|Ó¦Mï¼óÎâÅ‹-CBB233;tèðÅ_lذáøñãfMùúúÆÄÄŒ9R©Tâ?Âò °œXé€ÕOhÎ^¸pá+¯¼òÉ'ŸÌ™3G<Ô]c0>>~ìØ±‡öññIHH¨ÞÔúõë#""ÆŒ#•J±‰Ü7\‰Oˆ‡v[‚&³Í¾úM_ŠÓ...iiiz½~óæÍ~~~–ƒÉÉÉfáï™‰M›ÇäÞ¥ãÇW*•vvv[¶lùüóÏ-š¨Çdßø–-[ê@ΨU]ÎyÁñoälh,§dœÈú¸þV{$Ïõ©ã\ÄbxÚ4x'à%6 g4Í¡aõéŸs×çÍ€÷×¥Õ÷ÇÔXEôÉ'ŸL›6ˆÒÓÓýüü E‹-6nÜXÛJg&..ÎËËK.—'%%a5r6@ÓSã“cîú¼¨÷.­> ®­ ÅÆÆ^¾|yéÒ¥D4a„èèèÒÒÒØØØéÓ§[X°ÜÜÜÌÌÌÄÄD•J…ÕnP±þx9­ÙaûG åÄ'¥£Ëš´œìË ú`öÚ¶–»/l<M—Dœ8p ƒƒÃ;ï¼`mm-&’7n°,k4½¼¼nÞ¼)T)..®~Kü'v§Emdzë«Kk«²téÒ/¾øâ—_~‘Ëå¦å9ŽcYÖì0¶éDQQ‘R©$䆯ôÕ:z³fRHgŒ³jeú}]ã“cîú¼Édlj/ ƒ˜Aë«Kk«rúôéââb1RPP0þüÐÐÐvíÚY^f!a4NÈÙ53½Û¼ðäµZ½|ùòàà`ñË]§Óñ<Ïó¼Á`@U×¹sçß~ûM|™Ýµk×úíÒÚªlÛ¶mæÌ™âÞò   žç###÷íÛ‡õÈÙ eÛ¶m ØÞÜôl¬?hˆ¡aRRReeå¢E‹Ä ¯¯ïŽ;X–5}rŒð¼ƒÁ°aÆ€€t]u .|÷Ýw³³³ CNNÎŒ3âââê·K-Tyûí·Ïœ9sîÜ9"ÊÊÊ6lXÏž=W­Z…õÈÙ e×®]#FŒØµkWõ·p¨ ‚pòQ«V­Ú·o/ׯ_£P(T*•øä˜øøøèèh›+V¬[·]WÝàÁƒÇ7`À…BÑ·oßqãÆ>H—Vÿ¥n¡ ˲ñññ3fÌ ¢M›6…‡‡·mÛ¶mÛ¶X/Ðt5êsÐ***Zµj•‘‘ѱcÇÜÜ\ªé´‘ôôôÉ“'_¸pÁÅÅeÁ‚Â9¨III*•Šçy__ß+VôéÓ‡ˆJJJ„‡zõéÓ'11ÑÉÉ©¶’+œƒÐä¾Z›Æ9hð÷÷oÙ²e=8P[±¯â¨û•$5–„úÿyhúà®uÎÞ½{÷Ë/¿LDÇß½{wmÅ.]º4jÔ(…B^RR"SRRÒÒÒ† ’““#÷îÝëãã#“ÉBCC÷ìÙc¡$Ô/¾ÐKM5gkµÚo¿ývÒ¤I üýöÛß~û­V«­±dWqÔýJ’K g×Urrò /¼ žþù”””KÖxGݯ$©±$rv]íÚµ+**J|9qâÄϧZ®â¨û•$5–hlé³8u:݉'6lØ FFŽ9oÞH+0ÎhC䤤§Ÿ~:((¨°°Pž={vÀ€Í›7oß¾ýW_}%÷ïßïîîÞ¬Y³ÀÀÀŸ~úÉBX–3fÌÕ«Wë¥?͵¸ººFEE­Y³†ˆ¾úê«®]»¶iÓæƒXe€œ Ð4>|øÊ•+*•ê_ÿú—™}ú$$$¸¸¸QRR’J¥âyÞ××wÅŠ}úôy¼×wNöå6Þr²/7è\„­Åô[U©TZÞx†i$÷A3ËwU|;¯A¿ZGoÖL éLÿxv¯^½„[¥¦¦öêÕKŒO˜0!::º´´466vúôéBpÖ¬Y‘‘‘ûöí›6mšXÒÃÃãäÉ“ÂñÑ£G———‡††ŠUT*ÕÊ•+µZmLLŒø¡á~Y€þ¸«Æ~­WïÞ½×®]+äìñãÇ‹ñK—. áá᯿þú_û£G×­[§T*MG9R¸x#99ù³Ï>“ÉdcÇŽ‰‰Þ LIIñöö2dHhh(6ˆ†úÚtF®d@£ÕØÇÙ¾¾¾7oÞ¼råÊüñÜsωñ‚‚‚ùó燆†¶k×N –””8;;›µ FŠ‹‹ííí‰ÈÞÞ^81˜ˆÔjupp°»»û™3g°Arö}bÆßßñâÅ/¾ø¢T*ãAAA<Ï {ÂÅ pªZmM)•ÊÊÊJ"*++f‘››[jjªZ­^¾|ypp06@ξ½zõÚ¾}»éÁl"ÊÊÊ6lXÏž=M/ëÙ³çîÝ»Oœ8áíí]½!C†ìß¿ß`0ìØ±cèСâ8~ÇŽ,Ë*•Jqð Ð5{—öîÝ[§Ó™åìM›6…‡‡Í™3G .Y²døðá%%%_~ùeõv–.]ªR©Æ߯_¿­[· Áõë×GDDŒ3F*•&&&bƒ¨GÕS<–Šoç!g“puP@@€x™8&Løá‡ÂD‡²³³«· hÖ¬ÙáÇÍfáï™‰ ?Ü»9³³9³³9³³àak¼÷.e¦zçy†aLïH €œýˆ‰‰Ù,I#aÀ“©éíÇß Ã¬Y³¦Y³fnnn_ýõÁƒ[¶l)—Ë“’’„%%%AAAVVVƒV«Õb­ tìØ‘ˆ’’’är¹L&ëҥˑ#G°5rvCÉÈÈÈÉÉY½zõÇœžžž•••˜˜¨R©„wgÍš_VV5wî\±–‡‡ÇÉ“'‰H¥R­\¹R«ÕÆÄÄDDD`käì†coo?bĈŒŒŒ÷Þ{ÏÎÎ.44T¯× ïîÝ»×ÇÇG&“…††îÙ³G¬5räH;;;" LIIIKK2dHNN¶@În(nnnDIJ,ÙÛÛ›½[XX(“Ɇ‘J¥·nÝãÎÎÎÂDBB‚Z­vww?sæ ¶@În(5ž[.R*•:Žçyžç C)?55U­V/_¾<88[ g?!!!™™™ƒaÆ Õ øúúîØ±ƒeY¥RYTT„­3ö1þlñññcÇŽ=|ø°OBBBõëׯˆˆ3fŒT*MLLÄÖÈÙÄì‚lñemm‹Ó...ÉÉÉZó÷÷ÏÌÌÄFMî] €œ ÈÙÈÙ€œ ÷ëÞΙ¼]Ö¤­øp$:ãl@Î@ÎF gÀ“‘³÷6÷®‘ûh9JS}®—“ƒíŒˆÐ­[edÿ·1©¬âNmAÑè¡½í¬­Öï>èߥÝÌ7_aºþgáÚ)³ÿÀvg7”7G<úËåW?\râ|Ö›¯ ´„ ðjîºáëƒD4óÍWÖîH}ñ¶G?x-`œ]j;Ý­C›Ï¶gàŒGÒ/†‡ô±$¢Ð=úøuü vƒðÎK×þèÖ¾õŸŧ/åœ8—…³ëÙ×Änoc}G«#¢J­ÎÁÖÚBˆÚzyØÛX;;Økˆ(nCÒ̉#?~g´ÁÀÍZ¾%çÆ-lÐø5Õ}ãe•wrÙXÉKÿ>n]cˆâ7&íJ9þÚ°¾ÂKMyåœoUM‹_·+åãwFc#äìtúRÎ ¼¥I¯n~¹xÍBPpàèé¶^Í[{ºÑgó&õv{T IDATîÞãŒe•wìmm°rvÚøõ¡¡½»ïú÷Ì€®>ëw´pFãÆ¯½:€ˆV~µ?<¸ÏžÿÌžùæ+K6ìÆFMB£>ž]ý1bbD]V1ûß_š½[cP¬òË¥œ_.åÑ•_oNú×j¬{À8³³9³ž ÷vÞ8žkÙÔåd_F'`œ ÈÙÈÙèälxÜsvff¦§§'Çqb„çùgžyæôéÓ–+2 s¯ïZ®€œmIûöíÛ´isðàÿžó‘ššêææÖ½{wËyžÇJäì‡jÒ¤I›6m_nܸñí·ßNOO÷óóS(-Z´Ø¸q£8P^°`AÇŽMÍ5–$¢sçÎùúúöïß¿  ÀlŽ%%%AAAVVVƒV«ÕB0))I.—Ëd².]º9r[ g›{å•WŽ?^RRBD&--môèÑ&LˆŽŽ.-->}ºXØÃÃãäÉ“¦Õk+ùßÿþ÷ôéÓ3f̘9s¦ÙgÍš_VV5wî_W¢«Tª•+WjµÚ˜˜˜ˆˆl1€œmN.—3&!!ˆ¶mÛ6jÔ(kkëK—.5J¡P„‡‡ é\0räH;;;Ó굕Œ‰‰±²²êׯßÌæ¸wï^™LºgÏ!˜’’’––6dÈœœl1€œ]ƒ¨¨¨/¾ø‚ˆ6mÚ4iÒ$"*((˜?~hhh»víLK:;;›Õ­­¤‡‡‡ðƒ ¸¸Ø¬Jaa¡L&cF*•ÞºuK&$$¨Õêàà`ww÷3gÎ`‹äì´mÛÖÁÁaçÎöööBê ây>22rß¾}–ëÖVò—_~!"­VÛ¬Y3³*J¥R§Óñ<Ïó¼Á`‚nnn©©©jµzùòåÁÁÁØb9»fo½õÖäÉ“ß~ûmáeVVÖ°aÃzöì¹jÕ*Ëk+9mÚ4­V›’’2bij*!!!™™™ƒaÆ BÐ××wÇŽ,Ë*•Ê¢¢"l1€œ]³#F´jÕJ̯›6m oÛ¶mÛ¶m-W¬­äš5kºvíºzõêE‹™U‰ŽŽ¶±±Y±bźuë„àúõëcbb …J¥JLLÄ ÛØ—eM"‡…………… Ó~ø¡0azM¶8m¡dff¦é,Ä*...ÉÉÉf àïïoVãl@Î@Îäl@Î@Îäläl@ÎäläìúÖ¹sgÓ'v¬ZµªsçÎÂ4Ã0Þ¾ØH½´ðäæìŒŒŒeË–•––‘F£‰‹‹ËÈÈÞ2½g8<âœMDþþþG%¢#GŽôèÑ£ú9))I.—Ëd².]º9rDfggwêÔI©TîÙ³Gˆ”””YYY qâ„··· ÉÌÌ4 6l¨m^YYYÆ ëÙ³§é5f5ª±Á!C†ìß¿ß`0ìØ±cèСBP&“%%%UVV.Z´ÈòbÔ#öáϲwïÞ:®¶œ½~ýúˆˆˆ1cÆH¥ÒÄÄD!¸dÉ’áÇ—””|ùå—B$>>~ìØ±‡öññIHH¨m^›6m /**š3gŽå¥ª±Á¥K—ªTªñãÇ÷ë×oëÖ­BP8sÍÞÞ>66ÖòbÔ£‡z²sÐàþ g gr6r6 gr6r6 gr6röýÛ¶mÃ0µÝ!œa˜‡ßd¦=gïÚµkĈ»víB×4Þœ]QQ‘––¶jÕªÔÔTá¹ÔDtûöí8::®_¿^ˆx{{çääQNNŽ¥§§ûùù)Š-ZlܸQÇÅÅyyyÉåò¤¤$!˜Ý©S'¥R¹gÏ!RRRdee5xð`µZ]ÛL³ÿçÀþþÿßÞ}‡5uþ}?!¬€Êpà®V´V;´µÃQ'NÅ-¢²àb‰¸Qp Šˆ¢¨¸qïÙÖjµuÕ{*{$ñüŸ”¢í¯ðýº¼r%÷99¯7ùä>ç>'mëÕ«÷í·ßîß¿_Ýèëëkkk›’’ráÂu‹¥¥åáÇA8r䈵µµ ööö^^^YYYAAAžžžš >}úôæÍ›ê/ÇÔlÍÙÙyïÞ½S§NÕ´ggg»¸¸øûû¿éE ³·}ûvu÷ë×oûöíš 2dˆ¾¾¾&P---:T4³¯_¿>dÈ==½#F¤§§k68kÖ,CCC›ÂÂBuËéÓ§íììÚ·o¯© ‚°gÏžæÍ›ëèèØØØhß%_€rNû_{%©Tºoß¾-[¶¸¹¹ ‚PµjU©Tª¯¯ÿâÅ‹*Uª‚P¯^=õš:u²··—ÉdW¯^m×® ©©©+W®¼råÊÕ«W‹nÓÔÔ´Ø«¤§§›˜˜myñâ…ŽŽŽú¾X,Ö4{Qg¿vèС¯¿þZõÿÚ´i£Þnff–••¥ÎQõšººº_ýõ‚ Ú·o¯¥¥%BïÞ½U*•z§wÙ¯R­ZµÌÌÌb¹^PP ~Q¹\®n,ù¢Ù¯%$$¸¸¸h:99©g÷ë×oóæÍ2™lÁ‚𥖖–sæÌQïáÖ­[}ûömß¾}DDDÙ¯Ò¾}ûíÛ·ÿý÷M›6U·XYYݼyS.—¯]»V=jÓ‹@f ßÿ½¦eÀ€çÎ+(( ܽ{wƒ >þøcÍÒ>}úH$’=z¨®[·nĈææææææe¿ÐÂ… ƒ‚‚úöí¦n öòò200X¶lYTT”º±Ô <­9Ÿ#ªÄ_ãíÊXïôÉ£Ž.U*%«Ð’îÜhÒ´EÒÿè«Ð[ðÖú7“éfõ™ÀµK¨(ÈlÈl@f@f2ÙÙ€Ìd6d6 ³™ ™ Èl@f@f22ـ̀Ìd6 ³ ³™ ÈlÈl@f22ÙÙ€Ìd6d6 ³™ ™ Èl@f@f2Ùـ̀Ìd6 ³ ³™ ÈlÈl@f22ـ̀Ìd6d6 ³™ ™ Èl@f@f2ÙÙ€Ìd6d6 ³ ³™ ÈlÈl@f22ـ̀Ìd6 ³ ³™ ™ Èl@f@f2ÙÙ€Ìd6d6 ³™ ™ ÈlÈl@f22ـ̀Ìd6 ³ ³™ ÈlÈl@f@f2ÙÙ€Ìd6d6 ³™ ™ Èl@f@f2Ùـ̀Ìd6 ³ ³™ ÈlÈl@f22ـ̀Ìd6d6 ³™ ™ Èl@f@f2ÙÙ€Ìd6d6 ³ ³™ þÚ”ÿ¤;7(Ù(ïT*E2å]ÇÎ ²àoÇñlÈl@f@f2ÙÙ€Ìd6d6 ³™ ™ Èl@f@f22ـ̀Ìd6 ³ ³™ ÈlÈl@f22ÙÙ ¼Ò¦øÛ5iÚ‚"ü5"‘èîíëÔ¾÷Ÿô=•JEÊù/™DÒáÏ:}ò(E ïý·}ê•ó?^öP1Ùـ̀Ìd6oœœZPPÀ)geà\/Tyyy'Nžzøð‘D_biÕ»º©©X,¦,øË Åýû~ºxIš/•ʤêiÞ¼yÛo¿‘Hô©Ï?áÅ‹Wsƒ'¸Žû°qC===‘HDMg£r:qòÔ­{Ïtê%=ϊݘ“£P(( þ²—/_î;°Ï°švýF5?ø°vÃÆf†Õ´O9zó·J¥’úüížzxßÙsç=&NýíÆ/êΞûþûs'wîÚ³xIhЂA, ¶²ìµek‚ à…AóÕkÖªYsû¶Í=°GŽv˜;w^>=Î_»7Ö¾¿Cøæ°‰öžËfìï0~â8?ïé¶#ì6oŠkjÞXWW÷Ýc;+;¬›Ó£ÇϯݸÕö›6 Eå™ÝBf£BzøðQƒ†L·ÎÊ•¾þ+•« åºFÕŒ¿ÔÒzý·ý*_tåÜδ´4‰¾~ÑÌ>xèH·n]A°èÖõà¡#êÌ>uò´¿ŸžžÞøqn[¶&¨×,µ•ž\®Éä·o=ü¢Õ·#G8(…7¿é«¹\®Tª´µµ÷'166j×¶mɵ<&Œ344ìÞ½ÛÉ[Gn400èÑÝ¢èLÉ ãÜôõõûZõ _®n9sæÜÜÙ3´µµ­ûZ. [®Y³Gî>{´Å›âb¯_»>ÖlÏiž‡­ÞéÔßyÒ¬ñ“Æx¹¹». II~ž¸gWjjŠ–––R©|÷Cb±ÈÄ(óЭÛV–}RSž‘ÙÀI__ÿ—ë·ª½Ê_O­U¯‘a5Ó´W¯Ò’hVËÏÍÖÖÖ–IeE§¤Éd²'OíÛ`ÆÌ9‚ Êd2==½Wiiê·B3³Z¿·JkÄû °°àù³W]ë7l\UVû{D«GØÂëq¶B¡,,Ô*deg¥¾zš–þªÔ­™šš‚ NCCÃ’+Ô©S[ƒôô uKff¦zMCCÃŒŒ ÍšFFÕ*AyÍÌjtêôÝýû¦zLÙã`ã·ÔcôÔ€¥³ý¼¦ÿüó¥Q£ìrEݺµU*U±¹)"‘¨èIwÅ&¯=~˜$‹óóó «T¦nIf£BêÕ³GjjÜÕ‹‰ ¹B¥R%§¤tê;ÒØ´]Zòƒ#ña5‹µD‚H"‘Øô·–H$E?¡Ÿ9sîóÏ>Ý­~h7ÊáìÙóݺu©Q£FNNNÕªUÓÒÒ5+—Úˆ÷€*=-«sÇ.mÛµÊÈz Wü~V•fΣ:°årE¬0/?ÿÞÝ'Z‚¶±±I©›{ë~Ý´´ô5ªggçÔ¬YC<êɹ¹¹êƒÙ•‰H$ÒÓÓS©TuëÕõžá(ñÐêm«l\&Μ0ÕÕÇÍÝ52|¥L*311.uŠ@õꦯ^ýþñ(33«FuSÍMnn®\^XPPh` ÑÒªT—W"³QQ?¤»¹:¥¥§ççå«TªmÛwšV3ÔÕ ‚ШQ£ñãÜLŒ´utÄZZ¦¦¦ÚÚ¿wõ‡6XópÈàAîÖ­‹…E×½‰û ´Y¥YZj#*=¥B)•VËÍ{™—Ÿ«‰j•JP*•êAžR©”ËòB¹TZ••síêí*Uë˜Õþk¯µÆkê佉ûÔ³ÒAèØ±Ã‰'{öì¾ÿÀ¡Î¾+ù±XœžžnbbR¡“;+3Ës¢çºÑöýì—nä05`Ùl?¯égÏžµm÷¦;_·ùbçÎß|ý…D?''÷Ç ;th'“½>RvòäÉÍÍ“îÝÿ°q£Êt0[àülTPb±¸jÕªõêÖýðÃÆ7216ÒÕÕVÆ‹µŒŒ4hðaãF7ª[·Ž¡¡AÑqöåËW4o‹‚ ôìaqéÒÏ………žS&=v¼CÇnMš|¨YZj#*½B¹¼Fõê-?ùðå«äœì¼¬Ìœ¬ÌÜÌ̜̌ì¬ÌœÌÌìôô¬´W™¯^f¼|™‘ž–ùøqÊ‹™MÌ›iFÉVÚµ¿ú¦ÃÙsç§LöP·LóñŠÛÿéçm>â7Í»äS:wîØþ»®½ÔFFF‹æõíh=7lŽMÇas'ñ žß¡C‡¼¼¼7íŸhРžy“Æ{®‰Þ°'ñÀG5ûì³ÏÓ^¦h¶¹n}Üã'O»ví’›“Í8(±­Nb•J¥££óû'wA¤£«#‘è”úüèÁ¢õôôN;$‚ŽŽNôšHu£íð¡ê;U«V-Ùˆ÷aœ­««k`¨óøéK¹\¡Tªgˆ«”J• T)” õ»°P.—ËårÅ­›÷u´ >iÙR"ù}v˜fRwÑÙÝoºïè0ÚÑatÑŸ¡zuÓ¸ 1Å~°¢O‰\Q J™™ioëеG×i^ÓúÚôî3}´ã¨iÞ~çÎ=j„J¥zSlаÞ'-LkÔÒÖÖ‘Ë _½LÉÏÏûÿ][¶øÈÄ´f~~njòS2(_$Ijú«´¼_^=$‘H´Þpš¬Ú›®NUqO›ÁßÎÌÌL_"ùùò•”ÔgòB¹R©Tª•J©Rª”J•B¡Ë……r¹\!*i¾ìåËìn»7hP¿è }.Ö¿¦vm³NßµíÕ£ëÓ§O8ðüùó“GŽ<þ¼aÆ………zzz¥>«Ô«ž¹:Ûkîg¤¿ÊxÃ|@2ø/‰D¢^={Änˆ»qñ´ŽŽŽMkCCÃ2N ámoåá>v¦ RñN_¢££óÝw¾ý找¤èìåwïiïsŸÔÒÒª]ÛL&“}ôQ³ÂÂBÍ­\./ãœlWgû&M[”lOºs£hr“Ù@ù½ž’&“Ê$I±IgÀŸõIË–sä Å»|M…¶Xlhhh``È7ÀþåÝúúú*•J]@õí[ÿ„˸Li%¾‚)ïk¨ ÔSÒ$‰ú šCÝÀ_cdddhh¨R_üìí‘#ˆÅÚZZZ|åóÿ˜ÜÌÆ{Ûä4þ.ZZb]]ºÊ_Ϥـ̀ÌåsÐð8}ò(E}êÌFyÇ9 ïQ=Ù¨Þå2xÓ›f©WwÂ;V¾Gõ*÷'2ÿˆJ|¢Žf·$Õ£zT¯‚ðŸÆ4*22ÙÙ@y§P(òòòïÞMÊÌÌ*ý6+ûÞ½ûÙÙ9/_½¢\‚ È劧Ϟý|ù×¶í;ï?xì»N»÷4xø³çÉYYÙÌþËd2™¯ß”½ûǬ•ËJ¥’š€Ìþ +;ÇÇwúË´¬ñî“Ó3s'xL)z›‘•7yŠwZFާ·_A¡êúõïm&)•Êää”ä”ÔU‘Q))¯¶mÛzåÊ•5LoÞ¼)—Ìš=ÇÓÓ;éރݻ÷¦¥gäååѵŠ}4LÏÈ8tøè£ÇOßt¾ÀÏoAÁ£„jÕLwîÚýòUZ~~>¥™ üîÂ…Ÿ&¸{èèèœ?ÞÐÐðܹsê[ƒsçÎéêê9r$###!!áúõºú†/þü€”JåÙ³ç_¥e. nß¡ãöí}|§‡- þè£gÍò³¶îñ§ÓóD,_Z·þaaK>z’™™Eï*:†ž9+°n½†“<ýÌj×[X¯þ¡sçÕ­×0d^@õf#Fôãì}$n|ÍOÇ„.[öA£&¾3æefe+ ª2xíã?ŽŽŽ4hPtttÛ¶m###Û¶m»jÕªvíÚ­Zµª}ûö+W®èܹsBB‚³³ó¥K?׬UûÞ½ûïÛhûùód-±ÎÛ—-[•üìÖ4¿€Àùþ-Z¶>lPóæŸ: wŸ»wÇ……E^»vÞc¢×âÅA/^r(áwÏž=:tðOw’—…ß=~((|Åó£‰+žÙ» |yTh`â¾³G6N¨õ‰KÈŒi!K–ì>ñ£ã(»cÇŽs¬¡TR©ÔÓ{Ú¹ï/»MI}AqÈlTf7oÞtssÛ·oŸÝñãÇŽ;fooôèQõí˜1NñññúúúÍ›7711n;";'733ó|ÝŠ5~255ݵ{ÇŒ™ ÷ïÛ2rô„#‡wûN›»{WüüÀE«V†MŸ>;$$ÀÁÁ}{º‘#ÇïÚ¹~ªçô={öþ£?RÅ*`Íš5…†;ØX,[¹þ»ö{fµ¶sJ œýå(—ÑÖVK"cÆŽ7ûÌ%b–ÿœ°«W¯;ÂfvPÈ—_~)•JÿŸ°bÕóyrr¯^}Î]>çíí»ywÜèÑ«7­êÑ£×éS§ù”óî¸*ä8{åªÕ[¶lY¹r¥µµuDDÄСC—/_>tèÐåË#† ºbÅŠ¡C‡nÜ»dÉ’¥Á®çÏŸ9 SȪ͚-DFÅÛ¦«³}±–Ȩu£æNÂŽ=Æ ¨(ï/OŸ>8pè‘Ã{lG¸îØç6vÊúõ‘Ë×FG‡ÇoÙ±>&|Ö¬…»v­·9nû¶è!C'NtsŸ0¹d4÷E"Qw‹Î}PÆ‹jjUªŠUÀ/^xMš°r˾Iãìo\»6uý¦Ä={Ü£Ö²é³vÇ®£±îµZ¹V|õSðIDATnÚ—pêì‘C‡¦Mó [¿cÚäñ?üðÃÛaª§ýe¨ž*•ÊÔÄtÒJ¯}»÷GÆGúO™=3Ô×güô žcW…®T*•b±øM=êOõ@2(ãl—={öŒ=zûöí...;vlwvvÞµs§³³ËÎ;\\\6oÚ4hðŸ)ÖѾ÷ßÇÖÙçáǵjÖÐldÑ¢EÅ6[òªMš¶HºsÃÕÙ^}'##³~Ã?Lª(ÃÄ ;vìYå8Æ-1q§½½Û®ñÓv4yæ–ÍQÎΞ7DZöµ3ÇÇÉiüñãÇ[}þI±íh uíڵ͛7ë÷’Ô©]«Œ×UתÔE®€S¦ÍÞ¹u³ÿÜ ˆ mÛ¶uïÞ}ŒÃÀ9Á£\ÌÚŒ]·n]tttbbâÈ‘#]ÇNž0ÎÖÑmÅ’™L¦££ó§zÚ_S±ê™ššê9É+fG´ã@Çé¡>S§-\=oÚdÿK—.™7i\Æÿl¬ÜØ7Ž 9Î^½zµ••Õ–-ñ}úô‰‹Ûا妸¸>––qêÛ?ýì³™~CV­=å?ÁªUÇ“'Ž757/ùÖYôŸ R©toâÁ蘸›¿Ý*úI?éÎ õç}ÿ¥J/^¼˜4ÉsyDP§ÎÝÖ-ìܹûöí›­û Ùž°ÙªïÛã¬ûÛ-XÔ©sŸù~£G Y² k×®¥nJ]‰žVï^Ý÷4¬RU©T¶ïÀᨵ±‰ûÉdÅžRriÑ–ýÜò4Îv_¿ÏÍÑ...®OŸ>³gÏ<Ôù@̤Z_ºÅÅmŒŠŠÚ³gÏðá÷nÝêæâ´tÝ6õ8[OO¯ìž¶ïÀáGŸ‚ðèñ“ýލ‹s7éÞºõ›víÞ——÷zæy^^þÞ}£ÖÆîÛX³¿=2*æÒÏW¶&ìªp²fÍš‹—.v8fÍö(Û)K¢=Çø†ÌûòË/ß:E´ÔX²>›â222AH}ñ22*&%%U„ôŒŒMñ êÒ]ùåêÆM[W¯YÿÁC2øWÇÙ{÷î±¶î·yó¦~ýúoÚ´©_ÿþ›6ÅõïßS\\›¯¾Z¹lÂ’eûfO´nÛ{ì’%ÁC† ÉÎÎ~ë–¸p©Y3so¯|©¼ØØQ½K³ä˜©Üª_¿ÞÉÇ,ºÛ¬X±¸_ÿaë¢WXXôY³ª›Eïð°ÀÎ]z‡- èÕ{`hHÀp[§óÜÆzäçç–½Í:µk)•J³ÚõA¸ðÓ¥öm¿>}Z—.ݮ߼­¥õ‡}›%—j ؤi‹²Ÿ[~2fQH¸ëÐ>Ë׬wppHLLlÛ¶íLŸq5ZŽˆß¼vmôÙ³gÇöìY''§ÕQk'Ú ^úí·ßÊd²²·ÜîÛ¯/ýü«®žþ?^êÚµsº AÈÊÎëæÔ®}‡k7n‰ÅÚ‚ |ÿãOMÍ›øûûµùêë_~½©Ù{ܨ±¹ƒý¨€€y¥Cª÷Þ§¦¦zMöŠÙí4Ð9lSÈTG¿Åký¦Ì¸xñ¢––Ö;îá/ÚKÖ§aƒúù2¹ŽŽî³gÏÅbq¾L¡¯/yòäÙ 4ld.‚¶Ž¾«‹“­­íÑc§ÔÁOfÿÚ8»ï¡CííŽ9ìà ¾uú°‰yFÚK}ñ7M«×,ºNK“îÜ(û¹åhœ=yÂòM{'8Û«ÏM=ÊÎËáéÓ§- Þ¸qc¯^½Ö¬YÓ®]»ˆˆç1aë¶ú{M*9Î.ÙÓLLŒk›Õܵ+±N]³¦M›¿|™"‚……EÕjÆ&F·nÝ®^£– Ož<ûæÛ¶ùy¹&F·nß®^ÃL½ÁO>ùD¬¥õôñý ‘ÖÛv}ö¼M›/îÞ½+10|òä™yÓ¦ùy¹‚ tïÞ]"1¨VEOüdzQQÇÙ{vïîܹKDDø°aÃ#"‡·]ÑÍÂÂs‚eÄšcó=mZwu>sæÔŒ³œGO÷÷/((Hô5)õ(c¾TjblúøQ’¤¢WI$ݾ}ÛÏoFdd¨¯¯ŸýhÛ©žÓ,-{Ïœ9»wïžîî{õê0?,lqHÈÒÅ‹øúøiiý‰ñR©lAÐ"ÍkV©öòEòß²´üŒ³'ùÎÚ¹e“¿ÿ܈ˆ#GŽ>zÖìùññ1‹‡DG¯ŒŽŽ™6mêúõ± ÌöööŸ?Öôé³7oÚØñ»veoðþƒ‡šw:==½Y³f½éöYZ~ÆÙÞ“ÜÃâöLê>Ùg†‹½­ûï±NöîS¼Ç9;8¸ŒŸàêèà2n¬“ý¨1®c]BÖlöž2é‡~01ü­=íÚõ›ffµ~úéâ­^OúËÍÍ•Ë $êƒzzz …B©Têéé-—RY1Îò‰D*•jö,ÿù ‡ÛÚ-ß>ÁÖcMB”‡í”™¡>S§¯ ?rrÄŠe7®á­Ÿ‹õÀbõÑÑÑ611¾òËÕš5jW75ùáÇ ¦¦&FÆ&ï¿> \YÁ¯xþqTÔqö®]»,-­6lˆíÛ×zã†XKK«1cýü\ìúöæ}æô)??ÿ;Fv _òÝwß½ËY³5¼|ù²J¥º|å×R߀rss+V¡<=ýV­ ™2Å?zmø”)~ëcV¹»{n‰_7eŠïŠK¦Nõ‹ˆXâã3cåÊÐÁƒ—½gòþƒ‡ÇOœîkÕ[½Ú ë'''ß½}}ßÞ]‹‹¥R—j XösËÏ8;($lìÞKcwM;fÑŠh‡‘ak7{Œu[?ÁÕqÙÚ8·1£­Œuqµí§Ëˆ¹AÁïr<;==ãùóûÑ£’’î*^×üäÉ“‚ JºwÿÃÆ ¹  Ô»~ýºJ%Ü»ÿðƒ†õKž]þ;¤H$ÒÓÓ‘ß4ïø-q>í²tCè˜NêãÙÁkmÆ®]ºTK$Ò××/{ì[¬–ZŸõë8q¢Y³¦2©´nÝÚgÏžmÚ´iLZi®„È8uœ¹j¥Í€6Ä6TÏúºMëÓg8ü<¹Í—­J¾nÆõœGVˆ*)Šæ}ä1É}Á‚%[â׎çyðàvoŸYb#'O™>nÜÿy3<=§/\8ÇÇgÖêÈUÚ«ë}ëÔJ$õµêݾCÇ”ä'‚ |ûM›={ö¢ïôK§Ot9xèÐâ9>ñ[·…ÌñŽY?ÇË=byĸ‘üæ‡,žã»zó®é^SJ޳Kö´ó?\hßþÛªU¾lýùñã'{öè*‚‘‘Ѻõquê˜õïg›“-BÛo¾:uæÜãÇOêÖ­Ý¿Ÿu^nvEì"‘H__O*•yM™²$|éðÁvqa¶Sf„x«{Þœyzzºo ì7õÀRëÓ aýïüéÓÏZåååÔ¯W÷â¥+Ÿ~úY^^n¥y÷­9Ÿ#ªÄ_ãíÊXïôÉ£Ž.¹ZME—tçF§Ïþ]þé—8tøh³Z¼|ù¢{÷ Û¶48!a뀃V,6ÜöÈ‘ƒC† ß±#aР!;¶oëÕÛÒvØ o߆ êW«VµèYêL---³:õõô$i¯RkÖª£nÔüFµë6H~öøú½4eKõärùÞÄ}¦ÕÍb—Îð[²*xÑ,'çI ëZ·î¸ukô AöÁNNîkÖDØplõy˪U«ŠD¢¢»a‹J¥R¥$?Q'Š b±¸Víz‰aaAAJò“‚YÑZ•º´vÝUîݽYêÒòS=A23³†;ŒÝ·~æÒhÛ^í=¸7xèpÏ©Ǹ^»ze¸íÈØ˜µÃlGzúL³>tù¦½A>ãz÷íµ¼AýºUªT)»§Õ©×03#-/7ÇÀ°Š‘‘éì9s-ZôêeЉiÍüüÜÔä§êq¡X¬mV§ž¾¾ºQ=”,ú÷õwuÈ¿½zŨT*©T*“‡,>lTôžÈa#C—-]ª§§khhXÆ^ñ2{`)õÑÑÕkøA“GïèëKÔŸ¥Òüb¥û{ߦÔ¼{ûú?ôæ0,&ÓÍê3ÆÙ¨¨ãìˆå+ccc·n:løÎ ÆÙ&lÛ2ÁÝcÛ¶-ÇÛíØ±mðà¡;¶8xÝÚÈ SŠ³Ë¸:•R©|þô‘ú~VfzÑ8០ì¿]FFf‹-½}<,Xæâ:yë–èÑöã7lX5fŒÇøñŽÓ§Ìëçîî¥g‡,Yš–žnjbZF¡ŠÖJ¡PhjUì£Ï›–j XêÒò6Îö™ì·wªÃÀ)ÓfصmMTäÐavsgû¯[·1v­ÝèĽ»&Nç;?tÖ·È Û¦ûx–g— †bUÕÔ3#ýUFú«?î,‘?{òðM®@R$éëë ‚0ÍÛwμ€~VƒæÏŸ»>F¬%200(#°ßÖK©OaLS"©4¿h¹Þt¿!³Qñܼys̘1[·Ä÷·°=a뀃շ [† ¶cû¶‡lOØj3pp¶ø!Ãìl‡ öñõ•J¥ºº:š¿ù7³+ ‰DrþÜ>Ïðð…‹EgoÚ9a‚WTT¨»»WDDð¤I¾‹Œå|ïÞýfÍÌe2©¶¶a…ª|µ*UÍš5ÇMž¿a]@Äú‰nc¶Äo¶0h”Ý0Iž1ÑQcÇ{Ø¿wÔhDZîž®#ƒVmòu·îoµ²Ø¼ñR#§XUÿÆ š–óØ–JesfÍX¸hIìúu:Úb‰DRö1ì÷¹’Ù¨<ã왳æÄĬ\>tøÈÈaCmG©ï¯^>tø¨×-+†ڎZêâ6¾äñìJÿ7Ÿ››Ó¹Kg__ßI“=ÃÜœ'ÆÄ,·é¶qÃ*Ç1ãÇ;úùÍ›;wÚøñžK–Ì··w;wîÌ„ñc³²²kժś£ 2™tÎt³fzyLŸ» ~ýšØ˜µ ƒCc¢WϘ5ïàDÛ£â7mtiç2kêØðØmÓ|¼üñGó&ÃÞºñ’U}ê¬>¶-“Éü¦ù(•Š·N:{Ï{`©˜7ŽŠ'';Ëi̘¾V}jÔªkÙ»g ³z–½{Ö4«gÙ§gM³ú–}zÖªÓÀʲ·Y݆}­zhþñ²¥!½zõ’ɤïU•ŒŒòÂyóæ-^غu7·1_}ÕyÎß^½Í›çëê:) `ºó„ c‡ uáÇó®.ÎÕ«› ÓVAjÔ¨a Ñu9Ø~ŒËÈ!6ý¬­Ì›}p‹2b[,Ø ûÆQñˆÅâæ5¡Aýz‚ 4nÔð­·ï!õ4ëÔ©-‚u_KA~¹|Q„Á­Ahc%ÂAýAøü³–‚ T75¡k•ŒíÆ ‚P·NmAê׫óÖ[€q6 ³ ³À߈ãÙøGœ>y”"P=ªGõ@f£¼cF(Õ£zTd6*†ð>ãx6d6 ³ ³™ ÈlÈl@f22ـ̀Ìd6 ³ ³™ ÀûGûO­tç% ¼g¶J¥¢^”÷ÌîØÙ‚A6ÿ!Žg@f22”GÚ”þ!Mš¶xow‘Ht÷öõ2V0oÖò}îe‡Ì€ÿÀûyÆÍé“Gßeµ÷ób‘HÄ8ÀgšJòiæM8ž @Å@f@f2€÷ sЕV›oÛ•l¼øÃy2€rļYËýç·ªïççægfd ‚Ÿ/móm» Ûì€r—4¥^oä=¿É_`lj$Â<{œœü<5?_šŸ/My–Zq#2ÊW`Ÿu÷\×Á¢XB›7k¹ÏšØþ Þ,“É*ÇïBf@ù’yóv-}ƒb}ÌÖ±ìg]¾|ÅÖÎþ“Ͼœî?ëéÓgÿè§ŠŠUÏûw ‚ R–u͵3gÎYZÙ4oñ¹¥•ÍùïxÓ/»!ná¢%d6@áîíë–G÷‚ j«[šúò|Ê“øÆ›nãÜGÙÙþôãYg'Çi~36lÜô~°ÔIg‰¾HëW ýõê5ŸiþÓ|½~¹|ÁÛ{Ч§ïo·n—\m}ìÆk×®{{M!³ jkûfFÚü«ßôÅ«V¯™4ѽW¯‰¤Q£çϹzõš&l ù¸e«ví;oKØ¡>®ŽZû]§nÍ[|~øÈë«i>xð°Uÿ/¿j{äè±×#þÌ,G'ן´¶wtÎÊÊ®=~ꘒ±Ÿ/-ãY‘‘QÞž“;th§§§×©ãw'NˆŒŒ*¶NÌú çÎ_8ï¹Z8™ •v¨½ÏÂzŸ…µ4õeª4ÏóâÙ2¾ êÂ…Ÿºuë¢yX¿~ýE Õ÷½}üœ¹|ÁËkrÐÂ`Í:))©‡&†-[â1qªº%xqÈÐ!ƒVG®\°HÓâëíù땟† º¬üö¦Ä¨äg©êû%“;íeúÅ®deåk¿ôóåï¾ë yØ¥K§ü©è ëbb÷8¶,D,ÿ·¿#™ åÃÙ£eucFFfuSÓRÜ¿§OŸ^ºººÖ}­23³4íîîã$Iîr¹üuðÿt©_¿¾_~ÑúıCê–cÇO4iò¡¶¶vîÝŽ=^þ;'+§vÝZ=­ºªÿõêÛmÛÆÝ?ÿøËÕË7ž<|V£Vu›¡–ÉOSŠ=7==ÃØØH󰺩iZzzÑÀþþûz÷ꩯ¯ÿŸÿšœŸ å‹f¸ú¡åÑ=oý®eS“WiiµjÖT?T©TYYÙFFÕAxõ*-nSüÍ›¿Ýºý‡c´ÆFFÅ6’••eT­Ú¦ié}ü™úþ>Ä|k`?¼÷X©TÖmP§nƒ:‚ hiý>(ÕÒÉåŠ;¿%mÛ¸ûç ¿;9ÛØØ(;;ÛØØXá&&Æš¥×®]_¹bAPðÏ?_ùâ‹VŒ³¥ö;ú²Í§NÑ<¼|ù—ƒ†ªï;:¹ ‚jèÐAQ‘+ÊÞH•*†ÙÙØolddôÛ_îÞ¾~÷öõ[7-ÏýøÁ¥RY´]YDfzÖOç¾üÓÕ’-Â7ß|}âä)ÍÃ'O}õUÍà‚ L2qÅÊÈÔ/ÈlÀûfFšåÑ=ê£Ú‹ÛtxëéUŽö£/ =~â”L&ûíÖíé3f9:ŒV/ºwï~×.¿ü¢uìÛf’ùEëC‡_¾|¥[÷Þê–®]:ÝMº§P(¶mÛ>xèˆrØÏ'+ß|*×ËÔ´_.]ôøòO¿–zù³±n.KB–;ÿ}aaá¹ó߇††¹¹8i–êèè‚ ««ë?Ý×Ûǯ°°ð?ü}Ù7å%°Ïº{fÞ¼}3#M=ã̼YËTiÞÇÆ¦o}nëÖ­憄,;.©zõꎣFØS/Z4ÊTŸôŒŒqn.eoÄÛkªëØ ™™YK©[|}<'MñúᇠM>üpihp9,ÚÅηù¶]Çníºö쨣[J¢=šrëÆÝ”g)¿^¾ñ¦ë•~Üü£E çÏ_x7)©©y“Å‹ƒZ´ø¸äj}`Ó¿ßœ¹óæÍþ¯~_Ñšó9‚ ¬Jü5ÞÞˆ¿ø5iÚ"éÎwÏì}ÖšÀ.Ú˜*Í{ë4´råôÉ£Ž.ËþÍ›µT©Tï^Ÿ²GÛ»µ³èÝI¬ýûAw•R•ü<õƯ¿=šróÚírrqueAøSÿ›Ãb2ݬ>cœ å…z`]òÝU*å«—é*¥2=-óéãç©É/ÞØ¨zd6”£Ø~Ç oã¹ìØÖÑÑVªT'Ñk]ôgË^n‘ÙPÁ‚eÄvóMµÄZ÷²ËƼq@å‰íßnÜ©¬Mf*[lWâߎÌ€Ìd6ïæþ3§O¥d6IåH$¢d6I ³ïŒË¡Pœ¿sÐ ³™ ™ Èl@f@f2ÙÙ€Ìd6d6 ³€ ˆÖœÏáÜ=YÉeÚb¾ù€›\¡*ÖÒþC=AóýÙF-AÄZ‚B)(”‚REÅøoˆµ•JPª…RP©~ä×™™¯T¬õµEZŒ®øïh‰D •J©JUÑAôëÌÎ-Pi‰±B+Tìà?'W¨äJA¡Tiv~¿Îì…:ØUrA$R‰kð_µA *…JPÏl¹ªèJ‚Àmþ3"‘PrøüÒ)}¨¢&á—IEND®B`‚kildclient-2.11.1/doc/C/images/we_general.png0000644000175000017500000014257611405233117015665 00000000000000‰PNG  IHDRìÙì—tâsRGB®ÎébKGDÿÿÿ ½§“ pHYsÚk¥óÎtIMEØ  üuägtEXtCommentCreated with GIMPW IDATxÚìy|Eúÿ?=™$$!@¸²‚$È©áPP‰‚¬ w¬ ‚"§ _ýybÔUAð@%Æ“D’r¨€&€D%€DÜ™þý‘L§º¦º§'™@€ÏÛ×HfººººººúÓO=õ”Öm| DÞž|µ^VVB!„BÈÉ%ÄåÂÅ£Ò@×u€Û»qé”kôˆÈHœsÎ9 amB!„r’)+-Ŷ´gôÂÂBôºùÿ4]סuŸ‚¥S®Ñ5j„˜† QŸ’’x<ÐÒ^4­üég]סiZàÿÐ4 °I‡Š4UÉþþ àœ}ðîoµ]QO ËÛÄóô–]ªÛʤšùxò6)½q½¼õãsjÒ>Ò±µªÖ“jUÔ‹X£„¿õŠk'· Hí4—Ë·ýHiäs0Õ“ØFü\c]Ú_õ·©ŒŠôbèºÍåò© ïßšø»ÐöUugwLŸ2rí,Ž+Ÿéž´è+LíÑ{ÚµS?¿{óó–m”§â_]Ê[Y¯R:XÕµxÏË÷Ÿåq…>ÎêšëOåߊóQÓQíO²²üõãsŸ)®…®:¦Çã{o¨Ê¥è”ugÑÿV ?Ï Ý"½U;õ©'‡ý¹7­®H/¶;]¾¯Tϧuã¯/ äyêçÙ,Þ“NŸýv:¡ªyÊ}€O=éÕjMg%!!!p¹\ EDd$>ŒÃ‡£×Íÿ§¹ "21 â¼<”””°Æü<\ü5V+Ñhžˆö@nÚ@Ëg÷@W¾øy(‹õ¤ÉÊj‹Œ¸Ÿx~âïšJÔ+D€,â,…”w /4Z€â^«B:+¡*?ÀµŠ¿J,Ê×¥:/ bžáeÁ#ñoˆ¿Ûw½¬¬²ýImRqšø±°6â]>¾®ëpY¤óKVÞzòHíÐ#×›N±¯.ÞŠ—U•(ñæ£lÇ’8Õ¥ëæ©¶*Q/Þ‹ÇG0ªú6ï±<ª¼"ò%Yº¢Èòn¹÷ ë¦ãz,ÎɱPE³ªüUͶ/òým•§Øþ턦¢ŸsšN™Þ8“Ó[¾PªîUq/Þ³>í[õŒú4QÜ[=‹ŒcÈmÐîeÞ¡Hƒ(^vª¥ ëU)_@Ú‰˜4x~A5j„‚üüòkýí·ßê]ºtAaa!Ž=ÊÚªA+{ÀBÝ¡`¯’ß&Ï`³¿Ð+î¬F#ä´bç¬YY×͉R!~­êCÃU±²k~:»`‰gG¢Ý&Ï`WÎÓʯ¬##4þ,îr9a!UÂ,U²x·kËòh†# ®Ô~m…ŽŸ—n»|ü€ÈV_ç*‹t»z„ð"`eM—Å¡­öcQ·¦––w±n'šO•XÖq±–ûK/–ÓÊ(dÕ'Û é6 U/nصeÓ>N LA²4Ón9zW….QQQÕ’RùùùØ—›‹¼ßÇÑãÇQ',¬<ïøøjç]Ó«ìõ4@xx8¾ûî;¸=Š”––RhÉÚîô R“,»šìžQÅá('å–oR¿e¬\šÍ¤|®ªŽÎ²ã¬§¶v…UÞÊ:#[å Ab!bTâF÷'Ú¥»ôb§)v¨²¥ZN#‹d•‹‹eEž>(oÙ<h.—ežþ†xîz…eV%àL#6¢uËâ¡n+6ÂÝ8¾dEµz‰1ßâ¥VeeÕõ§ºg=ÒƒÒãñøwËR\+»û×΅̧­ ÷ŠG:_U[‘ïiñÜåsË>E€<š&·qYT[µç amüm# ýYÕM#7ˆ…GaA”­µ¶¢Yx‘P윩b]ìå롺¯u…¸÷éÇ-¬åVÏWE[VŽÜJ/ûVû˜Žø¼ä:µ²ËÏ)'Ïê@ôŠX·Ó(PZZн?ÿŒ?FLL U·. °ß>lúæ4nÒíÛ·GHHH@z¥´´{÷îÅáÇÓ :tðÉ»I“&h×¾=Ünw­Ò…Á.{iI "##ñçŸÂí­¼2‡‚ýرcp»ÝˆŒŒ´LsôèQÔ¯_? “ìܹ“íöï¾ûÞÑþÞtòw«ß¬¸úš«±ï·ß°rÅJ´m×ÎøýÁ‡Ä{ii¸æškñÄO8+ë' 6 øì³Ïfkt"À;uêøþûl…tÇŽŒtŽE¾è"à óð×q˜¬à®1Jëž÷naÙ š…¢IhZü®ö4=d>(¥ô§J´C%†uçc…«EuÁ…Cök÷ mø±zÁîZ b\þ,½ºÍP¾•K€ø·è¡y¯³Â/ÜdåE‰ÅP¯J ‰®-ª‡¢ÒR'‰7h!¶sOpøW¹¸˜†üíF–T/&Ò}¥ÛŒ,@x 2î#yÞ‰¢]jÂ=g'”4A«„º©<¢eVra‘E¢(ÔU/y&á/½üëŠQ(H/A–#Šv©«îs —Cå=Y‹Äºòej×-Ë‘%yÄÕ+Œ˜^ì+¬ L²+ŒòÙ¢ê7œ<3ý¼hËâ’1 ƒ^U {Vy–––â×_Etýúå‚4* Ð 4— çw òó±gÏìܹíÚµCxx¸£2”””à×_E½zõÐ!€¼k5Qvq.©ÛÛXd_G+.»ür$ö뇔”Ÿmyyy˜:u*~ùõW¤¯__¥v"¦O½zõ»¿ý†Mß~kì[·l)ÿwÛVS£Þ´é[c¿ÐÐÐÊ·v aæÄšˆ¸·Ø~}תðæo'JåßÊ‚nzÐUt¢V“ü”¿K¢\§²W¥—'4éBG¬íVékB´«†q•®Šº¦°æÉÖlØLÂôwl•±n%h%Áé“§øP¶°¸+ź¢}èò6ÉêîO¼Ãj›ð¢AŠBÎJë ‹µÊÊ É:í×Àÿº·óÓ5µAáù K… ½üb¦Ku +(YCm­™¢µZêV“;턺Òl1j¥)Ú¸ÏKžtl· Ù5ÐÂz¯«^j-F’àGXkn\§›XG€b]No5%´Y¹xêvǬ‚˚ݳÚï3Ýâ~¦+Œ®ë8tèšÆ6E“&Mà)óàèÑ?} aááhݦ êÖ­‹}ûö!..n·ÛV·x<ÊËCìßbÊ;>>þ”G7¬©²‹‚ÝHÊÊÊðûï¿£Daÿtýzô0é˜8aÂ)Üß}÷}µÄÿŽz¾ýv“ñÛŸþ‰œœ@î¾}8”—g4¼Í›Ë{ßK/U? jU‡àóð³±ôB é+Ž&Áh1 ÉlÙÂÎ")¥×áÀïU1ùMFz)­ez!®ÈW—˜øBUQÙºî­çŠºÐ+&íé^W¯uIe&!¤EÞú…®.”øæBZYë‚p1Yý¥s“/~ u&e’^2<’õ×Û«î)Ýëö"ÿí­cÅÇ›—náûëM£úX¥·Ê[—ÊÑmElŠsó~Äv(¶-Hu¨:®ªíÊ×Ë纈íMjëºP&U2½ÔJùíRz9Óú´w©ÜšheÚ‹GjWÞö KmKìçT÷±ªÎtEwÒ‡¨D·åµ°餇"½©Ï¶xqEoiX_v+êYN+[ÕÅg“ÊMåF¨Ë£H~žÏª—S!]ËêZÒM#ë\aä‚¿þú ÑÑÑhÓE……(..òî£ë(*,DAA>7iŒFáÏ?ÿô[¾'N ^ݺç}äÈ‘S®9ŲggeááGfcïÞSšŸþ³g?„¬¬«Tö€œ 64¹È<þøãxsÉDGGcႸꪫj´b>üðC¼}ô™™™˜ÿÊ|ìܱº®ã‚„Üqû¸ä’KŒFë-Ë7ßl³)ÏbõWãèÑ?±mÛwÊ·ã>úó¼ç‡1cÿå#ì=º†ÂJÊ€ÂÒ2””U|÷%%¥@a©Ž’2…¥@q™ŽâREe:ŠK¢RÅe:Š*¶‰ßË<æï*«°EУ·°Ú¦ü]Ú\¹Ýk©òvvšºL²-IÓœ•]ƒVùݘ8ivÿ)O£Á+ßü—]svnRzUÝù–½ò!à2öº©"ć–¯åEÈS(„KzPŠe-Ã.MšË Œ&”W7åë[bzÝ[­òhvõ¡*›&¼hØ]o»²«S9š¦lkŠ|ý»ò7ÍÏ}âƒR›2U æ[vIÌØµÕò—8ß|íï/±Î¥Q—¦®g覑#¿}ƒfèš&»­ØÔ‰×Zî2‡Í3ÍËÛ‘!œ½ÇrUN86„›èRbvýGy¼ç*Žb¸\Òè—.Õ1Z¤ùÔQy9\>çæÓö„úð¸¥ø[·j¿º²}{ÿ0ê²Eê…ù&b¾.éúAè£ä<Ê‹©ûô-Þs4õºnº.bõ ïh©<+|4_gH÷•ÕsÌåÒÝÉÍUñ¯TùšPvÍÔF¼‘*£8yÛŽKüî©Ð žŠzÔ+z(½²ìΕóx<С£nT]”––ø×=¡^½zø#ï”–•ÁmaM.7xP7ºžOÞ_}õžþ9Ü3y2z^Ô3à¼O†u],ûòe˰rÅ ü/ã˜?>âãã±÷çŸ1îöñ8üǨŽ)S§\ö€»÷ )®E ””–bYj*ž~æüþûï¸ôÒKñÌÓO£E‹5Z1ééé¸ÿþûÐó¢‹ðúoî1Ý‘Å=ö˜˜†hÛ¶²²~Â/¿ü‚¸¸8lÝRî3pàßñÑGbë¶­è?`rrr——‡V­Z¡Y³f†X¿óÎ;Э[w|¼ê¿p¹\˜1}î¸ãvÌ›÷2.¹äÓñ–¥¦âæ7cæ½3á¢gˆB<=#÷Ý7 ={öÄëo¼MÓ0cú4aºá!7xhÅ¿®ÊNSÓÊ;/o”–>¢è©JH&½ã²V5t5êãÞRk"Ϫüòm¢Û(cC[¤³´9L§Ú'ôÕ©c­6]£ZˆÏ¿j¤Ð&æ´]˜VÕ¿áýÜ{¢@—ûLË}¬B*ÜaL>ÌbÕËi”‘q¤ §FYTtT×ÇaLuUêr¨Óªô׊xéòvÍfäSÕE·˜ˆ*¿E˜ÜMD+»â·Š<¥Û¸ÂÈs°,Û¨*ªÃç›­K‹\Ýì<é}Q¬üW“¾«ÿÕ¥ë/ }§Vû²²2¸]!p»C ë:öíËÅ{kn‚sÏmn”ñ·_Åû¼!C† Y³æu»Šâ¢"¸-æ?–••!$Ämäíå—_rðè#³QXX„GgÏÆ¼—çãÜ ©ëº£¼k¹ìI#nÆW_}‰?þø3¦OÃÔiÓðôSOÁSZŠ6­[#iDR•Ê`?xð`¹Yï^ôïßÙÙÙˆmÚÏ?ÿ<†ÝxcPbjZM>õŠìE‹^Lž27L™: 7ß<"èáâÞ½‘•õ¾Ý´©\°o-ì£FÂG}ˆmß·x­ë}ûüåù/Ããñ`Ê”)hRQÎÉS¦â–›Gàåù¾‚ýâK.AË–--}Ó5MâW–ç3¹2ϩӦcDÒM>€×ç´´´Ôô¯m¤ ¡ FÈG§qÚ-ð€OØGËŽVštªŠT£[„ëÔ¡"UñÚ펡 .´$‰ ¿¡ACŒÊɲC‘,ÂÒ©& ªBñIRŸ‰±R}Z¾Ø­3`1j ^7SÝK/¼–CÒ6qœmEŸpàßÈvÕq,ϧ ÂË©X®òy(Ê­^uqn™8¿@Žc¯ºg¿þÃ>}Ô>ÏÊyF 7Hóh€õËŒoºåy›tvý ŸVBÝnÝ +?uË£€r5;ßqÕ1좖™®›1HÑW«üÀ}NšÖ<æI©¢”‰û8ùÒ¤cÛ(O~æÓ¹AýÉšÿ"ýÓuغy3~ôQ4kÖû~û ³zþù'êFEáŸÉ£¡ë:ÜîP¿“æCBÌ}÷¾ß~Ã#³BðpDÖ‰€G÷àáÙÇòîç/ï“aäËÞ¼y3¤<÷zà9rÏ<õtŽÖçµÄìGþsšS¥²äÃþË/¿/^Œììl„ºÝXµj†´ø^ßsùãåÇ´k×ÖøMü;˜ôêÕ @¹zIi)~øá{4mÚ 8÷Üرs'JJŠ ?÷>}úõ°sÇ@ûö•VÛW”sÇöí>ÇjÕª•_qì=wožº®£]Û6>7²ÓI)ªU¼¡Q…ð‘>?…SWX¾­¸î'2„¼¿èlˆHi‚žO$ÉÑ#û0ÊF£³†o” ó¯¯ÕY÷÷;ö‰×,¬]•åMáWéýo%q!únªüyeÿqYXŠ>½ò¹Y•ÛÊ¿Vž¼(O5MfüÂa7±Lð;öˆmGò³¶œ4®ð[–ýÝ5øúSËþ¶VÖh•ϵѮ¥®¨¿€÷³ñ‘÷‰¶$ùq‹ç)—]®'«GÕüqî„UÓÄeÑß^hÊ…’,Ú¢nwßYÝKb]ÊV]Éð·a ©q*Ÿƒ|/™¼R0ÚˆuKŸs?BÝg­ ƒ‡xbÿ+[âåþ×#¿˜ ý¯r®“"œ¯fc$'ËQì^$uéÙ&?£œ>/­&‚ÂÆÒídªÏ €ÍÉÂ0èo¥eñû5×BËø8èžR<ûô“øþûm˜óÌ“€îÁyññ¸úšk*ïcO™ÿº Äö›òzhöæcì#HewèótvÑßÓÆR¯òS ¼ìš£ë]•:©ô5–bKûWž·ùÀä—Q ‹²àjö_–^<åB÷¢®¬—fn#>e7ŽG>ì.—I 9¬wÍa[²¿ž>þɺ$Î4«ûÄ7_ë<ÍsL~ÜÒ½©ì×E=ŸÂ®Nt÷ïØ¥èKtxð‰îcš¿!£×-Ñk„pYÔI¥Âì+­I}ŽOè~ââüUQÌçÐ,ìâX^L½¢Üb¿ãµÒ ÷©ÍÊ 'L6mŠ{gýæ½ø<Ž;Š7½ tÄǵÀíïA“&M*5GGh¨Ëñ¨ç™Ÿûä%ëë/?Ç ÁCå}2»ü’ûûÁxwY*êG×-Ÿ§àѱbÙRÜÑ4Mš6u\/UìÛ·oGŸ>}0kæLÀÇ«Vaî¼yhÞ1~Ù»®¹âÏCæ;ðè²·0ì’Kƒ.ØÏ?ÿ|lÛ¶ YYÙèС<þxVVv\„ˆˆtîÜß~» kW¯6„:téÜ«V}Œ5Ÿ¬Åo¿ýŠË/ï‡ÐÐ0cß °uËdee#!!š¦áÇŸ² :(-ŒþÞÂ/8ÿ|lݶ ÙٻСChš†Ÿ*ò4?€H· QaÖ>ìšàÇî À¯]ìdk£ûIÿ:u>ëV¾ÃN—¯-XÅ=Wm·ú[qÝM§fãr½©,ªÕ=żv›©ÎêÁÕm#ÁyÿÞ’ÃøU§­V'/žNîÓÂXŽ«š3â·¬˦ZPÊΘH± ©*¿)®½ÜöUqëåÕl\XtÅ|¥k§]SŒ¬Ùù¨+dŠþWv‰rlEWÔ±K檘ç಴x[ù°——͘{\±]#l±Š³M\yïKNYYyô)¯¦hÒ´)&NšŒ/¿ˆ’âb„……ã_·ODÃFŒÝKKKQæñ ÂÏBAbÞ—÷KDÝÈHtïÙ 1  Çš‚Íß|…‘üœæ]Óˆe?üGÞzcB\@ܹçbÐax?mþ:~ o½±ÿ}6jpÙ:í۶aä-·ߟ~ê)Ü0ò,Ûò5†õ½ãZ.ïйüÂ:ŒíÉÉ£1yò=Hyvž|êi@ʳsíÓGŽÆž={ЪU+GûôêÕ ß~» +V®(êÊ{§ áþîÊ•€¾—ö5íwûøÛqçwàÙgçàÉ'Ÿ‚Ëå ϥÀåraü¸ñêÎÑÆýDÓ4$ƒ{î™dä©išéÜU>ìž²2h(ŸáÔeÆ6 `û€Äç]姬Y=¬:W1²ƒ“Xá·nçoéoË!CÅê¶é½b›I¡þD,êÐêaìã›håŸl3â£Ázá «4l„²×ÿ\³ðëõ·Ä¶¿ö ‹6.mZ]''çdÙî-†µ²âTãEµºû[Ý#þú•ð·zI’ïÛI¡*ÁõäQ»˜Ò°[óBð-VÍi±:'«>I·ë׎Æ:ñE¯ªH7‰HÕä[‹¾K·èVé•s ì¶ó³_Áí@¨+ó±ÔUè&ì º•¿º*æºGpQÔ„vc¬¡ XѰÕ×¥— @ÓŸŸºuëé6jŒ[n/6¦£ÏeW˜Ä:?~!!®ò5j,óŽiØýÿ~Oº†Ì¿;É»¦‘˾ýû­ Á¹Í›cðð[Ð &ÉcÇ!mù;8ñ×_Øñý6ôíwEÀew<†°7'‡2,ÌpÎ9ç`Ø„Ûá Ágÿ]ƒââbcÛå:£KËÖŸxçΔ/W^y%}ô1äî?€«ôÇèÑÉtÃ`GyO˜8õë×ÇàÁ7ø]YÕËŽËßâNœ8P· Výö矰°0#Ôå¥}Ì‚ý’K.ÁܹóPZV†«¯þ;¼ …ÅŘûÒ\\rÉ%¾7²¸Ð’ŃõŠ+®Àc>†ÜÜý¸êªHNþ'®·:wEŒu'ñZý.Ä ÄY‡Í2ÎN&ÓÉù3ûå±[¡ÔÛYéV‚Bzøˆ¾–º««Ý>–~ ñÙ½V!EÌxÇ>ï61Ø}®³¸Ÿðpò£Ù¡ß¹9|ýw=ò*“b;ðÆ£–bâ{dŸ^Õ6¿—–—Ž-ûÙ«b´‹åPŇVù™Ë¾ã¢¸OltÉ\SÕ¹à7.Ti«»¿²,Âùšb·Ëç)Õ®z)c±+æÈóQļTó.äxñâ¿¢ð÷5ùz å0•æùi Ÿù!ò\ØûÃû‹“®ºø¢ŠûÀ.ºêxò±ü&tyäÁX·ÛÇ.°€.Y«ÉªºÅÄh¾s„t±ÕUÏMŸE½÷,žÓªcø{¹ï²ØÇçEËîe[¥ê(,4'òóM ú@‹¸xÜ42Í[Ä™~/))Á‰¿þBxxûÉõš†ð°0eÞV8Í»¦‘ËÞåÂèÙû M‰1å^& bbèM#ѳ÷%èÒ­G•Ê®­_¿^OLLDÞ¡C())±L˜ºl&OžŒMß|c„.€©‹_Ážƒû±cÅûèÝ¡æÏŸ:uê€To&yZ½™—–é(öÀ[½°TG‰(µða/.ÕQèχ½DG™ŽÚãÃ^‘™&Y¼œÇ‰vàÃ.XÓ+óÔ­Êlv)µò×ÂïÔ×¢zÊ}ØuÝpÚÕÞòE'[ ?ÜŠÿ~ÅšÜ:¬Û’Xu.iõáàùß þÚ²»P»8ìâ9›}ðå˜âRd}ݪ­v=U>ì¦è?‚oµ×/ØœOå º4Ù¥&‹§ËÞ7 <—Kšs yE†fò½5úL—,vÌþæb,s1vºÓ\œ\-ù=W¼sf4Ó=jy?Z/4 ¿pÀOß ´ó<û¹šâ¢šVm…î[6Íeò×ö=&*· @µ‚.ø°k4ɇÝëÓnl×ajÆ6M~fêÊú0µ)¡ÍxëOé޲蒿ªO°º?½î(b[×P/€Ñ]Â(£ØÖÄúÃ0Bpq)Úˆy[ôa·_B¶ªûXy].=v ü‘‡çžkk.**ÂÏ{ö öœfhذ!Ê‹nž¬¼kšš*{hh(7i‚ôôtç.1Ÿ}öš4ibë^î·Ýëâ‹ñÉ»ïáÖ[oÅ«‹¡^t4Å·_è®^j^x×,ĹÕP„¸€(ÇÝe4&MòQ؇½¢\µÊ‡] 7ØùK~‘'5Ž·j(Wa-×OuÛUÕ“ †èûëw(ßb„àdÇÚGí]9Â$·}9ŒT/•AhÛNî9s"ÄpzAl;>a¥¿UqýíÜj4©œr>ª¡~»¸êÊëêÄb³Õ¨œÓ¾Ño:?A LõíЕË'*f¹äΧ[Ýv£™òhÔaj}Ú‘ÔWꊾÓ.Ò™ì£îÔµS·¨o'!í¢ºTZ´]Öi¤Qsøükkð—€²qyõFîiP¿>ÊÊʰcû4nܱûÜ‚vqq1öíÛ‡ßþ޶íÿä® IDATÛ£q…¿¶?j2ïšæd”Ý‘`÷x<øßÿþg„9éÞª-¶ÿ’ƒÿüšÖ‰ÄÛo¿Q£Faù²ep‡†"Äå±B³êtM7¦…»Œ]¼õy‡Ú×Ý®t¼MÓ”¢:vÙçÝö! ùE{Ëaõ SÅ2WM`TÕÜÉÃF¼ÙÖuøÂ[ˆR§ûÛµOÍæ%Õn?Y\Ø-È£Z$Ê'/›°f–ûØ]c;‘nã¦.·dŽÝʪÙçø;®]™m—͵µŠ¯íïþTK³YLÈIÛ±3¤X-`¤Š½îo?[ñW•—-Åþ*ÿý€oÑÏ«úc;¿rËýUÛì›­ÄxUÄyµžIÒËeLøw®+üÔ—UoxPin…ÊÅÅû·G1C¼ö÷ç¶‚ —¸Ø¦MŸþÛ· ]JËÊPTT—Ë…ÖmZ£[¨[·.Š õU5™÷I0ìÔtÙÝæf¬Þñ÷ßâèÑ£5òŸ4×ö¸_eíÄÚ­›ñØ#³Q¿^=,\¸Ï¿ó&þžx:ÇŸGe^eA_~]LoÀÊáëÊk'‡¡2_Wó¿>oÖVi4Í6åo:ÌËÜ›Ä»îø±ágWL¢i¦%©­=ÂÙyD+…êxæs©¬ÂÊzð˜:^ JtS}éu:.Æ/¯×Ê4Šø®|¨ZLÃÇËl‰ï*–6kµ@Ð58ñ†ë‹aÖcsÕ…zªô“öÌZn)•´¯Ï5Ó¥òɾ«bˆ¸Šÿ|…›â7Ç÷¥Kxh*…§Ñcj#0Žo;| YnªôÒoarld‡nûÝz4¡üZˆ1­}D˜nvSð]í±Ò·Â£{L×ÍÜ\=>íÎçÚk•!ù|ð»6Pa¹4–©·ÛWe °èïtÇŠÝz£®R^—qÑ(oßãÓ§Ê"*Aíñq ñZYÍsÄI’•÷½×ýB P¦xë&KºùžÔ4ßgŒ.>b<¡Íê¶õ¥+û(Ýò…Âù…‘¬è±}:^Šõ%nÓ½ý–®z«óQ?»¥mÒK‹É=ÌÁš®ë(..BýúõнGwtíÒEEÐuuêÔAxx8\š†â’bäç$Jk2ïš×ì5[vÁ‡ýw[ö£G¢~ýúÊmE%%XµùìÞŸ‹æ£¨¨—uê‚V±çPu¹1È–qQUüYÈU+éiVè@-•Û*…g0¬îæß$Â"èº8¶Öñ,‹;M1ïÀפ™D´æÀúnÛ¬†é䥟Íiàײ®´¶ }(B(úÖ›YÄŠÇ7¶)Ò‰Ö*ÙBåñˆVoóqı2¼–´©Ç7Œ—(FÄ!M]ª«e«-ëNQÇZ RCXø'€–«þIYÇrýaË<*KµJô ùZ¸<عk¨›¦lûvî6ppÌêZ‡½#gÕhýUzHÊ‚[‡¯Ë‹øRêñø LǼ"*¤ÐªýË-ö•uëíïL}ÄExÌëÙš¯KûúÖ±Ç8^ùþš²ÊÄãx[Â=Ħ][­®¾¬"¬è†QÆ›F¬{Ó`¦~ËA£`‘ìYn×´|£ÑT_—”••!?¿È/ºæ©É¼kš`•]¼Dn¿‰ÝDÉßV¹¸ƒì“«XxÀn'iŒc°2Å9+÷-M.QÖ“Ÿº4? 4S4ÑX¥ \Bt¡ö Á­ùäkÒâR¾½²Ãg§WzUT¸rx'ÁTj+ó0cÅŠ^¢k€©üÞÖôŠè ºwT³¬ï,z«ò‹̱$kši$Q˜Z_±@*êÁ;ùÖã)?¶&Xóuˆ=¥&§R€j.MoæªÊåQŒŒ&ºThðˆ£ˆ„éåA}¹]𘢣â胰ò¢OÐ*‡\gºËäf¤ë 54Ó>BU˜"·Ø¥±‹D ‰÷Š"ŽÊH3ÞûÊ8ާb¥@ù¾Å»ELfŸÉGŠ•þt˜'ïAá§ EyY{Õ¤b»}|Ò(êɧRÉ"^íQ }Uù…|½/.ùBZï@Î×pGr¹Ô áÀIÈ'n¶Ølb{+_fäIêâå‚QD÷T>3tó{¯fãLãýŸÀƒŠE¥„šPº±I«tI«ì¢á1ä­f!<ÆJ¢å¿éÞù0݈èTÍÄeˆTÍå2^`\.Mpt .•F ½½¦Ñ”ûhZå ¼·¼0®+”ý»èø!®=¬A÷Y¯Ú{ÎѦÃXÂänçª8/Áè Ç[Þ;:„gÄûN—^e«¨£CvcžqRYLF³]«²ÿ£êèRô3ÅsùÌšO³X Îœ•ЧJJ—F«UûøÍ×Bªò•Ÿr¾šÅb}VùÂ*ƒCmlY—Ž»E`}Gàª9l+¿Jƒ5Ëiy¾5¹OŽçóà²XlIùP–8r}™Üc¬êVq+wùf°ÉND‚"½#k¢ªÞíò¶YeSsx|]¡šÅÄNe„ EGé‚V1}uÝo;³"®Îpju‡b5÷ˆÓ|téå„B!„Sƒ.ýK ;!„B!µ vB!„B(Ø !„B!ì„B!„œa“Nu½üS›ˆoÙ W\9.Wå{EYYÖ®ù¹û~«Õ;ö¶ xuÁKla„B!Ä1ºïœÓàÄa¯)±Þ/qÖº9{÷¿·nÓý\ƒµk>Âý¹¼ª„B!䌦ֺÄ\qå@d¤bë°{W2?ÿúôíÇ«G!„BÎxj­…ÝårùˆuQ´ËÛºuï‰ :ÁåraWöøêËÏáñx”»§ü/}ºõ艺u£¡ëºåÞßþŸoÌ@Ï^—àÈŸGðáû+P¯~ôêÝû[3¸Ýn;v›¾ùҲ̄B!„œQ‚Ý]×QRRb|?ÿ‚Ž8zôO,}û5@‹z£K×îØ²ù#Më6mñßßÇñãÇ ßøÅ¯Îs¼ã&MñÎÛ¯!""pÅ•Wá§w`ý§kàr¹Ð }/íGÁN!„B‚Êi%fìmLŸJÁž€_r~FYYÊÊÊðý÷[ѶÝù¦}¿È܈ãÇröî1Mdu²ÿwÛ6£¤¤Ç޼÷î2ìÜñÊJKQR\Œ¾ßŠ:u"Ø¢!„BHP9­,ìbÔQ°7hÐÿHgJëugñâë*œìÿ×_Ç}ö‹ýšŸúõë£q“¦lM„B!äììVh°øÕ—áñ”Y¦ÑmbV:Ù_ðíÏO@§Îâûï¶`ßo¿ ?ÿnq+[!„B *µÖ%Æãñ ¾e+å¶ø–­LúØÑ£ˆˆ¨º;JUöïÕ«>úà]üôã<¸n·›­‰B!„œ=‚}ý§kÐ/q€hã³{ÉÊÚ‰6mÛ#44nw(ºt펫¯¹Áñ±ª²QqÎm‡4jÜý°5B!„ SkÍÂ9{÷ #ýŸ•N=OHƾ߆î=z#iÄ?à ÅþÜ}ø_Æ'ŽU•ý7nX>}ûáÒË®À±cG±uË&ŠvB!„t´õë×뉉‰øýàA#TbaÁ1G;oÈX‡1ã&aá+/²&IÐé×/­Û&`wöV!„BÎ êDÔ„……¡IÓ¦HOO?½Â:B!„r¶!¸ÄèB!„BÈ©A—þ-ìäìÅãñ`É[ï`Ð 7¢C§nèÚ­Æük<¶lÙzÆk›vЦ]^tB!ä4„‚œµL›>³~ ;wþˆ¢¢"üõ×_ذá3Œ¸åø<ó‹Óö¼¾úêÜ2*™˜B¡`'äôåãUÿÅ~ŒFbá‚yØñìùï‡8¿};”••á‰'ž>mÏmä­ÉøúëoL¿íÊÚŽ]YÛyá !„ vBN–¯xð÷ÏB¿Ë/CXXZ·n…§Ÿ~={^„ÿ»–)ýêÕk1ðï×áü„.xõ ¬Y»Î´Ýëròé§éøû5×ã‚]1ôÆ$üøSV@iàý>€«®ÅºâšëãÓOÓ}Ê¿lù ô¹ô têÒ³î{Àˆð$º½ˆn0*—˜`œ!„Bj!¬ã!¬ãqG;3¬#©Ij2¬ãE½úâÈ‘#ØôõçhРmÚÏ>ËÄè±ã ë•“?4MÃâW_Aß¾—˜„²Ëå2­ÂÛ¹SG¼»2ÕqšµŸ¬Ã&™Ž‚%o.ÆE=ºþûß5¸kÒSš{&Ý…‰nWú©ïÊÚnüîµ²ëœ!„\êDDð†uŒEzzzpN{ÛÖ. :5ýرòµ¢££ý¦ûò+Ðu7 †™÷NÃãO<…å+ÞÅKs_6Ä­—o‚OÖ­ÇÔi÷*­Ñvi,\ x.åi\5 ?6lø ·ßy^]ôš!Ø,\d¤iÑ¢n6+V¦aâ„Û•âüdœ!„BjºÄ³’¨¨H“p·ãûï̼wêÕ‹ÆÌ{§—ÿþƒ¯ ž:y"##qõ߯”fçÎ÷LžŽ„Žâö;ïlÛö‘槬lÀÀ« KçNØ•µë×tþÁ>'B!„œÁ®ë•BÎt.¸à|@æ_š~ßùãO¸eT2¾úªrÒ¦Ëe~¯Õ+â¢jšo¾5P>Œe…]ÑõDäðá#ŽÓ:ºñƒ|N„B *MN ;9+vãÀ¿ÿý$2¿øÅÅÅØ±c'fÜ{¾þú<þde”˜ Îoxò©gpìØq<ùä3€Î;ùä«©oiÚµk xþ¹g°sûV#ºËO;+-ìí+Ò¬Y»[·nC›vг÷¥>yýùçŸ8zT=‚ìs"„BHÍAÁNÎJßp=^Õ¿:„üs,:^ˆëÃÎ?Âívãþûî5Òþkìh@ê²èÖ£7–¯x.— 'ÜôrýOÀ¤{¦á‚]H-·»ÓH3vl2`ÊÔvÓ-`¸«0&ÑöèÙ÷κ_yœ“yN„B¡`'$`4Mà Ï?‹ûfÍ@›6­Šèèh\vY_,}û c‚'ôïžî´oס¡¡hÓ¦5æ½ô.îÝ+èåº~еxâñÇкu+¸Ýn4hÐÇ߈çŸ{ÆHsí5WãáÙ I“ƈŒŒÄÁ7àÞSíÓ¦ÞƒF",, ýõ—ò8'óœ!„RMÝâ ëxð@eXÇ¢ÂÀÂ:êt|'5Àîì5Ö‘B!¤6^§2¬cÓØò°Ž5baÏÈȨþ›„¦)?aaaHKKóI´7úëB!„ZDöÄÄÄ ˆv]×}>©©©5j”I´ÓÂO!„B(ØdøðáAí2C† Á’%K””Ä«G!„B(Ø«ÊòåËkT´{ýí³KZZ iêÕ«‡â‡~0¥]¸p!bccQ¿~}Œ=‡V';;ƒ Bƒ †„„¤¥¥aûöíèÔÉ7ü]AAÎ=÷\9r„-‹B!„ÔnÁÞ¯_¿íV$%%!55º®#77ƒƈ#Li^|ñEdffâ·ß~C½zõpûí·[æuÍ5×`ÿþýÈËËèQ£0~üxtèÐ5š5æÕ%ßzë-ôïß111lY„B!¤v v¯hŸ0a‘ŸŸRN¨~ýú8qâ nݺ¸ãŽ;LvHIIAëÖ­)S¦`ãÆÊ¼6oÞŒ;W¯¦NŠC‡&L˜€9sæ˜Òÿç?ÿ±ÿ„B!„A°ëŸà‘‘—^z éé鈌Œ<)'´xñbÜzë­¸îºë––†÷ßß'MïÞ½¿›7o޼¼<Ëü233ñàƒâæ›oFÇŽ߇ ‚íÛ·ã»ïÊW Ü°aƒOÞ„B!„†î£ÉkÌž‘‘áÇcùòåèׯßI;Åë®»[¶lÁõ×_?þ&LÀ’%KLiBBBŒ¿íÂ8.X°cÆŒA‹-0qâD“ ŒÛíÆ¸qãðì³Ï uB!„Ô îšÊ¸&ÅzZZBCC-·wíÚ]»vŸqã°yóftïÞ£F2¶÷ÝwèÑ£àðáÖ>çÓ¦Mî]»Ð¤IÀöíÛMÛLJ¶mÛbÆŒøôÓOñꫯ²EB!„ R£QbjJ¬5 ©©©Êí;wƼyópüxùj­999>âþž{îAnn.òóó±hÑ"\|ñÅʼ4h€Õ«W£°°›7oÆÈ‘#MÛÏ9ç\{íµ>|8† †zõê±EB!„Ú/ØÓÓÓƒ"ÖU+&%%aÉ’%2dˆrŸwÞy©©©ˆ5ÒËâ~èСèСZ¶l‰_ý¯½öš2¯E‹á‘GAtt4F…éÓ§û¤™0avìØAwB!„R#hëׯ×qðÀ””Š ÿr´ó†Œu3nÒiµÒ¨¦iA-ïÞ½{qùå—#''‡­)ÈìÎÞÖm°;{+ƒB!gáuêÂÂÂÐ4öoHOO¯Ù°Žg:………˜;w.n½õVV!„B©ܬ‚ªÓ¨Q#ôìÙ«V­be¢`CÆ:V!„Ó‚Ëúõ§`¯-ÓÆ»@!Äš1ã&±!„Ôz}X›]pia'„œV/Ê„BH09æÊчB!„ZŒaa×ÐF!„BȩëÇE]N ;!„B!µ vB!„B(Ø !Ц],M]n¹ítFµ‚±¦iÂâW_AÖßã…ççàîISôo¿“Š–-[âóëñeæÿàv»1wÞ+Æö]YÛƒrn………¸ë®»ðÊ+¯TÉß|þüùˆÅÎ;qäÈ :7Ýt“)͇~ˆõë×Ããñ 55III&1_RR‚œœäååaðàÁ˜5k!„Ú,ØuáC© ÄÆÆbàUðúK”Û?xoFÞ2uêÔAݺu1vL2>lJóØ£³Ñºu+„……aÔÈ[PXXˆÇ-Î\5 ?JKKôKS—£ÿ•‰ Cxx8ÆŽù'ÞM{/èç6{ölŒ1íÛ·÷ÙædÒé‚ pÓM7¡nݺˆˆˆÀ]wÝ…­[·úˆú6mÚ† ‚’’cÛâÅ‹1yòdDGG#22ÉÉÉøê«¯Øè!„œb|5¹»¶UÓ´“6ÁlåÊ•¸ñÆÙ>H­$ùŸ·âæ‘ÿÀu×^¦M›úlß¼y+6l܈½{Á÷?üà³ý¼óZGDÔ4oÖÌòx»wïAç®™~ ê9mݺŸ|ò ¾üòKuWåàÞß¹s'"""lÓ´jÕÊrÛ®]»ÐL¨‡˜˜:tˆ ŽBH­ÃÍ*† Æè¤Ö‚Ó§âßÿï)<ÿÜ3¦m©ËVàÕW_ÃØ±É¸ôÒ¾hÚ¤ ¯èWlÛ¹ x<ìܾ¡¡¡5r>eee?~<^~ùåjC°«»@ËF!„Ô6èÃNÈi@îÝQŸ}žiúýñ'žÆÒwÞ@ÒMÃнۅ(,,¬ö±âããðLJkì\RRRзo_\tÑEÕʧ]»v(..®òþmÛ¶Enn®ñýL ¡I!„‚ý¤¡i–,Y‚Ö­[#$$Ä'Úƒ¦iX¸p!bccQ¿~}Œ=ÚäÇ«²&zÿåB+¤63cú¤<÷ÓoõêEcÆÏPTT„íÛw`ÊÔÕ>ÎðaCñÞû ??xyþüãŸcƒr{öìÁk¯½†G}´Úy;|ð PPP€ùóç£k×®Ž÷ONNFJJ Ž?Žüü|¼þúëhܸ1!„ öªòöÛocݺu(++ó‰ö/¾ø"233ñÛo¿¡^½z¸ýöÛåëu…á¢,¤¶Ó°aC 6ÔôÛ?†ÿ¼4»^„)ÓîÅ¿þ5¦ÚÇüüõ×_¸¬ßôèÙ_³ Ï<ó„±½:aïºë.lß¾QQQ¶JL:4i¶mÛ†øøxÄÄÄ`ÅŠX±b…ã²Lž<n·qqqhÞ¼9233±víZ64B!µmýúõzbb"Ø’Šáå⢎vÞ±cÆMª¡+N:Õ4 ÙÙÙF´Õöõë×#11““ƒÞ½{cÿþý>i­ö§X¯}ìÎÞÖm°;{+ã4¥&ûB!äLÔaáQåÿ†…!öoç ==ýô™tjíz÷îmüݼysäåå±’Ó§ì`ÅC'„BHíæ´ì.—½÷Ž Ÿ/º“脜*(Ä !„bÒÁgʉ|÷ÝwÆß‡FLLŒeÚ={öðÊB!„ ö“É=÷܃ÜÜ\äççcÑ¢E¸øâ‹m¡¡¡HKKƒ®ëÈÊÊ„ LûFEE!++ `‹ „B!ì5ÁСCÑ¡C´lÙ¿þú+^{í5c›7ªŒÛíÆ Aƒ0qâDÓ¾Ó§OG÷îÝýúÉB!„r²©µ>ìbT U„ ù·)S¦`Ê”)ʼ† â³ÀЏÿC=„‡zˆ­‚‘~!„`v`ä5BHM¾|B!ÄßsÓü¯Y°BH¹¬_Z× !„jrFø°Ó‚G!„B(Ø !„B!ì„B!„ vB!„BN „I§zŇB!„rjðÕã´°B!„R‹¡`'„B!¤Ã8ì„cCÆ:V!„Ó‚Ëúõ§`'„œŒ7‰•@!¤V£ëz­^è‚rR:BB!¤6r:¬ÈMvB!„B(Ø !„B!g”`×4í¬>>!„B!µZ°ŸjèsK!„B(Ø !U¦M»UÚ(«×|ÔrŸÌÑ+ñX5}Ü•+W²QB¡`ñx<˜1c6lˆÈÈHôíÛ;wî4¥yàРA4iÒsæÌñy`Ûm—ÿ^²d Z·n„……!--- crº2ñ®{X 6l+B»HJJ JJJ““ƒ¼¼< <³fÍ2¶/Z´°oß>lÚ´ K—.5íïo»ÌÛo¿uëÖ¡¬¬ ©©©HJJªr^„B!„œñ‚}ñâŘbcc±sçN9rC‡ÅM7ÝdlOJJÂ5×\ƒýû÷#//£FÂøñã-÷á‡býúõðx<>#eþÊ’””„ÔÔT躎ÜÜ\ <#FŒP9I]×uNX'„tΨ•NËÊÊŒ¿KKKmÓúÛîófãr-/B‚…k÷Š•ixuÁËˆŠŠÜ8t0^]ôš±=::ù€ÈÈHŒ¼eFÞ2âä¼L,^ŒU«V!::œœŒ9sæÛ,X€7"""p×]wá®»î2¶oÞ¼Ùø;""S§NÅý÷ßoy¼ùóç£M›6|GÊü•¥~ýú8qâ nݺ¸ãŽ;pÇw°B9y‚]×Ë?§ mÛ¶Enn.âââGŽ1mïØ±#òòò øî»ïÚÁÌ‹@°²v‹B>'çÄÆVŽÕ«W‡WÞ/O>ñoŒ'>úø¿>|(\š ýû_qrÊïg¤lçΆX·"33«W¯Fvv66mÚd›Ön¤Ì_Y/^ŒAƒaéÒ¥;v,\.n¸á6BB!AÅ«ÇEY~ÚºÄ$''#%%ÇG~~>^ýu4nÜØØ~ûí·cþüù8qâöíÛ‡)S¦˜ö÷·=‚™!'q4êŠÄËñáû+q啉HÏØ€‡~ ï¿ÿa­(›¿Ñ« `̘1hÑ¢&Nœˆ5kÖØ¦ ©rY®»î:lÙ²×_=>þøcL˜0K–,ac"„Rã‚]>µï.ù“'O†ÛíF\\š7oŽÌÌL¬]»ÖØ÷_ÿúJJJ‡ž={bĈ s¼=‚™!Á¦eËx<ø»ñýرc>i.¸à|ŒHŽÇÿý^yùEL>ó¤”Í;RæE)k׮Ћ‹-÷Ÿ6m6n܈Ûn» }úôAAAA•ºvíŠqãÆaáÂ…øàƒpë­·²B 2¾š¼ÖZؽ“·T Ü§üé§ŸÆ‘#GpäȬ\¹^x¡)G}üñöíÛ‡‘#GâœsÎq¼]œ8¦šD&ÿæïX„œ*n:‹_{'Nœ@AA!ÞM{111Æök¯‚·Þ^jøgïËÍ…Û]9½%""?ïÝ‹C‡ò‚^6#ecÇŽÅ|€‚‚`þüùèÚµ«±½AƒX½z5 ±yófŒ9²ÆÊÒ¹sgÌ›7Çäää 44ÔØ…¬¬,8p€ŽBHP9cW:mܸ1Þzë-âàÁƒxüñÇ1|øpÇÛƒy,BN%£“ÿ\zù•èsi?lÞ¼¯/^`l.åi|¼j5z]|Ú´ë`DñrÛ¿Æà†ÁÑxå@Á ëèo¤lÒ¤Iضmâããƒ+V`ÅŠÆöE‹á‘GAtt4F…éÓ§×XYÞy礦¦"66š¦Qc¼LŸ>Ý»w·õ“'„Bª‚¶~ýz=11ûs÷CÏ¥%Ά•7d¬Ã˜q“je³5kÖàÞ{ïÅŽ;РAÜrË-xòÉ'îh{0EªÆîìhÝ6»³w°2NSjsA!„ÔF½á-¶ŽsÎi†ôôô3+¬£ÈÀ1pàÀ*oæ± 6N­ÜÁŒ™N!„S$âY„œ~PˆB!g.V!„B!ì„B!„ vB!„BÎ,èÃN©qé‡B¡`'„ÔRÒ‘B¡`'„ÔR.ëןÖuB!¤šÐ‡B!„ vB!„B;!„B!ì„B!„ÓZ°gdd-¯eË–AÓ4,[¶,à}W®\yÊ+X.ƒ¦ilu„B!äÔ öÄÄÄ ‰ö7ß|7ß|3–,Yð¾Ã† ;å,—!î!„BÈ)ì0|øðj‹ö¼¼<|ñŘ;w.233ñÇðŠB!„³ #»®ëAµþ._¾ÇÇòåËѯ_¿*å±téR\ýõhР „¥K—b„ ÆvMÓ|ÊìýÍëzâýW×ux<Ìœ9 .Daa!ºuë† à‚ .0Ò®X±<ðvïÞV­Zá¹çžÃÁƒñØca÷îÝ Ajj*† ÈÎÎÆ”)S°qãFäçç£M›6ø÷¿ÿ!C†(Ë –ÙIyÞ|óM<ôÐCØ»w¯Ï± ©ílÈXÇJ „rZpY¿þµ¢†¶4n-œÔ¯_¿j‹ö%K–àé§Ÿ$''cæÌ™&ÁîïdeAŸ’’‚’’äää $$sçÎŬY³ðÞ{ïiž{î9¬\¹­ZµÂ /¼€!C†àÒK/ÅêիѪU+¤¥¥!)) ÅÅÅ€¤¤$ÜvÛmX¶lJJJðâ‹/büøñ2dˆ² "NÊóöÛocݺu8ï¼ó|ŽMÈéÀ˜q“X „Bj5º®×ê…þ´õë×뉉‰ÈÝ÷›!ËJ í¼!cÆŒ›diå€Ù³gãá‡Ɖ'é¸`»víµ×^‹Ÿ~úɨÈöíÛcÕªUhÓ¦ÏqTÇ–·wìØ«V­B\\€r—›N:aÿþýFúíÛ·#!!ŸŸ¨¨(üüóÏhÙ²¥ò2EEE¨S§ŽeÄïNÊ“mœ¯¿cŸiìÎÞÖm¸RæiŒUA!„Po¨ qׄ‡‡ãœfÍ‘žž^³a322ðÒK/!=== ±”O6MNN6 ÕÑ£GWiò©øЬY3ã{LL :dJÓ¾}{ãoo™ãããmóÍÌÌă>ˆ›o¾;v jyZµjÅ;‰B!ä,¦Æ{FFFµÜaÞzë-Üwß}Ð4ÍøÜwß}xë­·,÷)-- ø8eeeæ·šŸ4v¡,X€1cÆ E‹˜8q"Ö¬YS­z“Ëãr1T>!„B{ P±þÅ_ ""˜+~ÂÃÃñå—_*÷Û³gm¾mÛ¶Enn®ñýÈ‘#Õ>ÏiÓ¦aãÆ¸í¶ÛЧO8Þ·&ÊC!„B(ØQè0o¾ù&î¾ûn嶉'âÍ7ß„††"-- º®#++ËgBjTT²²²pàÀåWSRRpüøqäççãõ×_GãÆ«už 4ÀêÕ«QXXˆÍ›7cäÈ‘¶e©‰òB!„ v¿¤§§WY¬—””àÓO?ŨQ£”Ûo½õV¬]»%%%HMMERRÜn7 „‰'šÒNŸ>Ý»w7üÀ'Ož ·Û¸¸84oÞ™™™X»vmµÎuÑ¢Exä‘GQ£Faúôé¶e©‰ò³“6í:˜>í/èŒKú&böá  °Zy¯^óIPË*º¹y?*W4B!„T<;k"J !Á€Qb컲¶ß=ŠŠŠðö;©Øµ{ÿ÷#AË;œô}ôV­Z…¹sçòBB9ëõÆIC95¸\.DDDàÆ‡`ÕªÕµ¶œº®ãÁÄ<À‹F!„X=×Y„œ¹„ºÝ 5¾{<<ùÔt¿èbtìÜI#Fa÷îÊÉÚmÚuÀÒÔåèÚ­†Ýt Ú´ë`ü.þ,>þøc$$$àœsÎáÅ"„B,p³ 9óðx<ÈËËâÅo`ØCŒß¿öJKK±!c\®¼õö;xzN ^žû#Í÷ßÿ€ÌÏÒqèPâãã|\bªê£bÑ¢E7n/!„BÁNÈ™hùǹç6Çõƒ®Åíão3~_±2 ¯.xQQQ€‡Æ«‹^3å3î¶±ˆŒŒD||\–÷رcøâ‹/ššÊ‹G!„P°ræãÄò“ó bc›ßëÕ«‡Ã‡ÍñÿÏ=·ùI)ozz:zõêerÙ!„Bˆ/ôa'ä,ÇÉj¿5Á† зo_^B!„‚â¥eËx<ø»ñýرc§¬,›7oF×®]yQ!„ vBˆ—‡Æâ×ÞÀ‰'PPPˆwÓÞGLLŒí>øyï^:”Ô²dgg£mÛ¶¼(„B;!ÄËèä $$—^~%ú\Ú›7oÁë‹ØîsÛ¿Æà†ÁÑxå@Á ëøûï¿£I“&¼(„Bˆ8é”3§¡].fÞ; 3ïæ8Ÿ»ïºwßugÀÇò‡weeB!„8ì:›åà !µ§ï`ÆO'„BH áÕã‚.§…Ó qB!äÌÆìzŇB!„rjÐ¥N:%„B!¤VSk»¦i¦ÛíFóæÍ1qâDäççW+ï•+Wžôs!„B!¤*Ôjv]p¶÷x<(((ÀË/¿Œ»ï¾ .¬r¾Ã† 3åM©Yvgï`%B!g¢`q¹\ˆŠŠÂèѣѲeËj vBÈ©yñ&„BÈ,ؽ„††",,Ìø®iæÏŸéÓ§#!!_|ñ<fΜ‰… ¢°°ݺu pÁî)Þu]·Mïå©§žÂþó:t_|1æÏŸvíÚ€£ý½¤¥¥!)) %%%ˆŽŽÆÅ_Œ9sæ cÇŽläŒã²~ýi]'„BªÉi3éÔãñ 77<òFmÚ¶iÓ&ìÛ·o¾ù& %%%%%ÈÉÉA^^ŒY³fÝû¯÷o»ô0þ|ÄÆÆbçÎ8r䆊›nºÉØîo‘¤¤$¤¦¦B×uäææbðàÁ1b["!„BQ¢­_¿^OLLľß~CqqQ¹8.+r´ó†Œu3nR yË5ëÔ©ƒóÎ;·Ür fΜ ·Ûm¤ËÎÎF›6mŒ´;vĪU«ÈËËC§N°ÿ~c±ÌþÒ÷èÑ7nDDD„²¬¯I“&HIIÁ¨Q£Øúü°;{Z·M …–B!g ®p@xx8š5?ééé§Ï¤S;Z¶liú¾k×.4kÖÌøƒC‡Yîï/ýÎ;-Åz Ç[¼x1 „¥K—bìØ±p¹\¸á†Ø: !„Bˆ’3b¥S¯µÝ޲²²€òÓ—––\&«ã]wÝuزe ¾þúk|üñÇX½z5Ž?N‹;!„BQrF.œÔ¶m[äææß9R­ôíÚµCqqqЎ׵kWŒ7 .Ä|€[o½•-‘B!„œ=‚=99)))8~ü8òóóñú믣qãÆÆö¨¨(deeáÀŽÒ;|ð PPP€ùóç£k×®Ž'Ò¹sgÌ›7Çäää 44”-‘B!„œ=‚}òäÉp»Ýˆ‹‹CóæÍ‘™™‰µk×Û§OŸŽîÝ»£U«VŽÒOš4 Û¶mC||߸_fþn·sç½b™ßØ1ɘuÿƒ¸õóÅÁÐ}˜?o7nŒŸ÷‡Â¥g¸ ôÀýûÿ”¹‘28†ˆª‘HTìòüü|¨©½º±lé"ø}úŽýîînP©ÁÉ©»Pžœ|¦æÖrm¨««—ºmc€½-ÆýW®\Åá#Ç0{Î<ü´yC™ë1a'¢wŽ®®ÒÓÓQ«V-¹åÏž=ƒ®ŽŽð¼»ƒ=üW®^Cä©(DEAFF\]û þÍøËÐÔÔ,w_ÌÌLa``€.¶•RˆˆèuCDÕN›6­û[\‘åqq—Ѧmk¹emÛ¶Áw,Y4?nü“¿š.”5oÞ ©©iJo·s{$'ß.²\,£^½ºe®GDDÄ„ˆÞI^£F`öœy8 ©4 RibΞÂEKàãí%Ôû¤Ïì DFFàï{÷ ¡ñê‹îƒÜpàà!dffB*•bã¦Í9Ê·Äíz{Ä—ã& "ò4ž?޼¼<¤¤ÜÅ7sçcÌhŸ2×#""R†Ê‰éС&L˜€Q£F)Û±cÖ¬YƒßÿÀ‹ñ¬Ê|;be(¼­7¹]"zÅÙɹ9¹X½f½0Mck£V˜9c*º;Ø õÖ¬^oæ-Ä’¥+•• ¬[»J.±þvõZØus†T*…5V®\ZâvýÆø¢nݺøþ‡HJJFNN>ja€Q£FÀ}[™ë%ÛiRB<4½È9#""døë¯?ñ_v6@–ÿŸR+G ‡ßø*IZE"ÌÍÍ-7N5==666¸qãÆ[I–™°¿9ɉ7в•1’o0Õ\IIii˜°Ñ{™œ«‰5jÔ@“¦úˆŒŒTí:;;ãèÑ£ððð–>|=zôÀL∪‹w!ùVöMßhQeSé1ì®®®Ø·oŸÜ²}ûö¡_¿~òïD Mñ ±X ‘H]]]¸¸¸àúõërõ—/_}}}H$888 !!A®|îܹhРôôôàïïÜÜ\…}MLLDß¾}¡§§±X ccc„††Êõq÷îÝhÙ²%ÔÕÕ!‹åÊm7??S§NEݺu¡­­®]»âæÍ›ÅÆ ¼q!¢ÒqeDDDïUÂÞ¹sgÄÆÆ KOOÇ… `kk[â: ‚L&ý{÷п 2D(ß´i5j„›7oâÉ“'pssÃàÁƒ…ò7ÂÈÈýõþùçhjjbñâÅ ûêááÞ½{ãþýûxüø1<==ñé§ŸÊÕ @xx8òòò$÷ŸEÛ]½z5rrrp÷î]<~üýû÷ÇŒ3”Ž¥¢¸‘jRé1ì2™ ¾¾¾pqqÁàÁƒˆ#GŽ`÷îÝ%Ž%oРV¯^ OOÏbÛµ²²Btt4´´´Š-·°°@TT”0nþï¿ÿ†’““‹l«´1ìÙÙÙH$ruahhXd•Ùn»vípìØ14kÖ ðøñc´oß÷ïß/±/e‰‹*âv"""zï’óê6†úõë‡={ö`ðàÁÆÐ¡CK­¿mÛ6ôíÛðõõ…šš\]]…ò›7o–˜¬”ëúârÓÀ•æìÙ³ Cbb"bcc‹”ôÑGåÞnRR7n,<¯S§=z¤tÅ…ˆˆˆˆTÓ«!12Ù«‡ qvvFdd$?~ŒˆˆôìÙ³Ôú}úôÁï¿ÿŽ~ýúáèÑ£øòË/±{÷n¡\Ñxôüü|dggC&“ œœ…ýܼy3||| ¯¯±cÇâøñãEƒ­¦V©ÛÍËË+±ìõýT""""RBNþj‘Êßa×ÖÖÆÇŒ3f S§NEîBÇÜÜæææðóóC\\,--…¡ FFFøï¿ÿ ‹‹]×ÐÐ>DÓ¦MËÔÏ)S¦ )) 4ÄÇ—íÃgŠ¶ÛªU+Ü»wOóäÉ“RÛ»}ûv™âBDDDDª©Z|Ó©««+¶nݪÔSSSlذÏŸ?ܽ{šššB¹¯¯/:©T ©TŠM›6ÁÜÜ\(÷ññÁ®]»žžŽŒŒ ,Y²NNN ·«§§‡°°0dee!..Ç/Ó>*Ú®——V¯^çÏŸ#33;vì@ýúõ…rMMM„††B&“!!!_~ùe™âBDDDDLØË­OŸ>‰DE¦s,ÎÞ½{„FA$ ³£?~<®\¹‚æÍ›£N: AHHˆP>qâD<{ö ¨_¿>¢¢¢°k×.…Ûݺu+æÏŸxzz⫯¾*Ó>*Úîĉ¡¡¡fÍš¡I“&8{ö,Nœ8!”Ì:£¡¡¾}ûbìØ±eŠ ©¦W³ÄüùÇ«Ybd9J­\•³Äq–"""zï’sÑ‹5jHÐDÿÅ,1j ‘êbÂNDDDDÄ„ˆˆˆˆˆÊCnZGŽD'""""z{dÅäå¼ÃNDDDD¤Â˜°1a'"""""&ìDDDDDL؉ˆˆˆˆˆ ;1a'""""bÂNDDDDDL؉ˆˆˆˆ˜°Ñ[HØe²W ‘H„àà`¥ê‹D¢j{0ªs߉ˆˆˆ¨ù¸¬˜„]EíÚµ C‡ÅîÝ»y‰ˆˆˆè½£¡Ê{üø1Î;‡¤¤$"55õêÕãQ#"""¢÷†Jßa D¿~ý §§‡¾}û"00P®üÉ“'ðõõE:uШQ#lذ––}}}<þ\®~zz:š6mŠ´´4$&&¢oß¾ÐÓÓƒX,†±±1BCC…º"‘»wïFË–-¡®®±X,WË—/‡¾¾>$  W>wî\4hÐzzzð÷÷Gnn®Â¾U›„}÷îÝðööxyyóÙgŸÁÕÕÿüó.]º„­[·êÖ­‹~ýúaÓ¦MrõüñGôéÓuëÖ…‡‡z÷îû÷ïãñãÇðôôħŸ~*W? áááÈËËCPP<<<„²M›6¡Q£F¸yó&ž>>Ð××ÇØ±cqüøñ¢ÁQ+9<…Ç£'??ÙÙÙÉdÂ#''Gé¾Ó›•““ƒþy€¥ËVb㦟"""bÂ^šsçÎAKKK.Ù-xÔ¨QçÏŸèééáÁƒÂz×®]“kÇÞÞzzzøöÛo‘ŸŸ¡lÊ”)ˆŽŽÆ˜1cÐ¥KH¥Ò2õÑÈÈÿý÷_‰å†††xøða‰åŠúNoFRB<o]G\ìyøû°{OCDDDLØK³k×.øûû[6vìXìÚµ ЩS'|÷ÝwHOOǽ{÷0qâÄ"õ'NœˆùóçÃßß_ôôô†¬¬,ÄÅÅaøðáe꣯¯/:©T ©TŠM›6ÁÜÜ\(÷ññÁ®]»žžŽŒŒ ,Y²NNNB¹2}§7C$AWWcFû?N}õÆËȆF&Ø·ïgt°ì„¡ÃF eaa'àÒ³Ú›Á¥W_?.”]¿ÖmMѹ‹=þûï?H¥Y°él‹ÖmMqãÆMtsèC#üõ×_€?ÿü †F&èÖÝ…„ˆˆˆT;aÏÉÉÁ¯¿þ OOÏbËGŒ'N ''Û·oǃ ¯¯SSS¹YZ <}ôFŽ)·|ëÖ­˜?>tttàé鉯¾úªLý?~<®\¹‚æÍ›£N: AHHˆÜ…gÏžÁÀÀõë×GTT”ðF€R}§7C&“áÙ³çøqó‹¡0Mš4.Rgæ×ßàùóçÐÒ~ñ¹…3gÎbÜøIH¾}¹¹#ºTˆ IDAT¹HN¾±ã&àÌ™³€víL0Âs=zŒÐ‡°7©©iøÔo4ŒÛ¢sg@ÌÙó/ž|ܹÉf‰ù³Ð,1"˜%†¨*g‰yýC§…}=k:¼F«7l¨fLŸŠÔ´T4mÒÃ<½pñâ% v„éÓ¦`ÉÒ娲ÖV–ذ™™‰=û@"‘ ==zzz8|ðghjjâà¡#˜þ¬,_LßÙ°A´ü¨’oßÁþýðï¿ÿÂȨêׯǃBDDDòyC@¤X5äž·mÓ°lùJ<{öË–­˜š¶ê<~œŠuë@ÇŽÖ02j…µë¾CZZšPÞéåxõußý€w׉ˆˆˆ ;Q¥)ør¥ àXXu¾ýPSSÃØ/?ê¬Xù-ÒÓÓ1Òs|¼GáÙ³çX±jP^ ß¿ÿ~à”ˆˆˆ˜°U'§îX»f%ZASS††-±áûuB~åê5ì=ˆ† ÂÙÙ®ýú Aƒú Ù«/Ç¿wêÔQ˜jT]];Z1°DDDTǰÓ{IÙ±ë¥Õû¤w/|Ò»W±ef¦í‘xëºð\]]çbNËÕÑ«]¦¦íqåÊUt´¶‚ŽŽ Á;ìDoIzz:233½zñ “ˆˆˆ¨x¯î°Ëd/ b`ˆªšµMWhkkaèÁ4pBDDD¯òñBßsÄ!1DoÉÍøË )Ä!1DDDDDL؉ˆˆˆˆˆ ;v"""""bÂNDDDDDL؉ˆˆˆˆT§u$¢*Õ²•1ƒ@*K$)ýÍÇDDL؉蕜xƒA •u*œA ¢jCbˆˆˆˆˆ˜°v""zçD çð"b²B"""Uâ=ÆŸA ¢÷Bqù8ï°©0&ìDDDDDL؉ˆˆˆˆˆ ;Ñbhd"÷hÝÖwuÀÜy !•f©DÃŽŸ¬q ÚWb1a'*·¤„xáq3þ2~=y úúM1áb•èߨqªE÷…ìÇ“'Oø‚"""R˜°ËÈd/DT¶IM ZZZ8pŽ c@Ê`‚ÿX,_ñ-ADD„Bùx¡œœw؉*‘¦†455…çC>Ì-l0hð0@~~>–-_KëÎhgj !žHN¾ ˜:m&ö‡”kóçý0Àm0z÷é_d{YYYèbÛOŸ>“[^0œ¤`ÈŽ¢u L¼/6manaƒiÓgáß§Oåê¯[ÿ=¬mº¢ƒe'Ì_°yyyE¶W¶¶]‘™‰ßâ~/±Ni1+Ž¢ýy[Ç…*ÏÊU«‹ M+î±rÕj‹ˆª=&ìD• ??>Äúï6`ÐÀre×®]ÇÙ3‘Xµb)`ÛöÈÍÍEÔ©p\ºggG¬x™TÌ›;»w‰bbbvï@ÀžÐÓÓCttŒ\Û‡A—;¡vm]¹åI ñÂϤ„x¥Öݵ+û‚ZµjaöœyBÝ€½A000@LtΟ= ü°áÇ"Û+¯Y3¦bÙò•ro +-f%)mÞÖq¡Ê3yÒ¸ p-µŽÛWLž4Á""&ìDï«ÂwñÚ›YaÄ(_èèÔÂWS&ÊÕóã mmm4oÞ òs(¼½F¢fÍšÐÒ’` [\¹r ¥%Áòe‹1uÚL89:@,£Fðõ…ý¡*-–5‚KgìØ¹»ØòÒbV⛀RöGUŽ •ŸH$Â’Å àèèPl¹££–,^‘HÄ`v¢÷UáÆ_‹Ãñ_ãË/>ƒººº\½¦M›È=¿{÷4jÔPx®««‹´´Wº44l‰aÆ gï~ðôCÖ€=œ˜„ÿÝJ\º 077SØWeÖ577~ÿàƒFr}JN¾ Sská JÛî¸wï~¥ÆÓkÔ„?‡)S³â”¶?ªr\¨bÔÕÕ±æÛ•°±±–[ncc5ß®,r.1a'¢“ EŠ ’Ÿ/+ÒÎwl}y7wÇ®=ªä]\eÖ-­Ÿùùù¸YîMÊ­›W+=NS¿šŒE‹—+U¿¤á3ÊÆ]Ž Uœ––XÖFF€ÖFFØøÃzhiI"bÂNDåc`мº‹üì™ü“’’±gÏ^ÿåö!))Y(2Ä¿„@RR2Î;×~}”Þ®¢u îÀÓ§OQ»vmáyóæÍššVå±±²´€––gbΖ)fÅ)mTé¸PÅéèè`ÇöŸ`g×;¶ÿ…ˆ˜°Qù tëmÛw"##Riö‡D:uRi¦N›‰åË£nݺX¾t¦N›)|Sà àà`±þÑÓ¥jÕªUâv´´´p'%=VjÝ… —àáÇJ³°/$:¼Òá>È Bff&¤R)6nÚŒ‘£|«$>S¿š„ÕkÖ+³’”¶?oó¸PÕ¨_¿¶þ´ õë×c0ˆˆ ;UŒ·×H¨««ÃÖÞ]l»!.îwìØ¶ðÍÜù>|¨0>ºeËàé9 ßÌ/¬?bøP$%%+üPã˜Ñ>píïG¥ÖuqqFÏÞý`ïàŒû÷ïcùÒÅr}NOO‡]7gXuì‚‹—b±råR¡¼2¿•´nݺpä¦tÌJRÚþ¼ÍãBDDTV¢ˆˆ™ƒƒþHIAvö‹»EjjùJ­u*>~ã!ã—-QHN¼–­Œ‘œxƒÁ(䯿ÿưá£u*¼ÒÖ542©ðÔŒ%yǰ*÷§*Ž )þ[ã=Æ¿Ò_GÃÞôk…ˆ¨4ùù/î§K$è77@dd$4¢ê#;;{ö¢¿k?… kaI ñJ¯KUw\ˆˆˆÊƒ ;Q5bÕñc˜š¶Ç–ÍK­WÜCe×¥ª;.DDDL؉Þq×®üV%ë¾kCÞôþTä¸)Â1a'""*ï1þ ½×8$†ˆˆTgŠ""&ì/É^>ˆˆˆˆˆèí½öS.a'"ª*œ›œˆˆ¨ü4äòy~U2‘HÄ )« /”—ó;U)~‹$QÅp–"""""&ìDDDDDÄ„ˆˆˆˆˆ ;1a'"""""&ìDDDDDL؉ˆˆˆˆˆ ;v"""""bÂNDDDDDL؉ˆˆˆˆTšC@DﲨSá ½qvÝœžÇÄó˜ ;‘²|üÆ3ôÆÈd2$'Þ` xÏc&ìDDe½øU5&ê<‰çqUàv"""""Æ„ˆˆˆˆˆ ;1a'""""bÂND!ž0n׿6øü $%%¿“ûjhdR¡r"zÿ®Š„?É‘’8K Q9ìÞ³gÏžÇÂsÑ¢…rrrq=>3fÍß8;92HDÄëF)ÆŽ›€¤„x¾0ˆ˜°U5k¿ÃéȨY³æ‹ICÖV–X±l1†ðfÂND¼nQ¥á¢òœ8jj8v,¬Èrƒæˆ‰Ž[¶ný÷°¶éŠ–0Ábäåå e†F& Ús 8÷ø]íº###CnýÌÌLt±íŽŸ>-S{ƒ+¶ï))wá÷éè`Ù mŒÍàÒ«/Nœ|õ-‚OŸ>ÃŒ™³aaÕ 6m±' Pn}Eå%õ¡´~Ÿ8Ž6Æf042Y‡Žðòƒ„„D¥Ë9$‡xݨÚ놡‘ ‚÷…À¦³-Ì-l0mú,¡mÈÏÏDzå«`iÝíL-á1ÄÉÉ·KÜFÁ9khd"÷;1a'ª4¾>^˜1kìœ1cæl‡ ùö"õöÁÀÀ1Ñ8ö4444ðÆåê\»vgÏDâ§ÍàèØ{ƒåʃö¡»ƒ=ôj×.S{«V,-¶ïþ&ÃÞÞçbN!öb ú»öÅ׳ç 峿™'Çî86 ¡?#$d¿ÜúŠÊ‹ëƒ¢~ûŸŒukW!)!çbNÁÙÉã'NQºœÿV'^7ªöº»v`_Pb¢#P«V-Ìžó꺱mûNäææ"êT8.]ˆ³³#V¬Z]â6 ÎÙ¤„x¹ß‰ˆ ;Q¥ùÔÏC÷aþ¼9hܸ1~Þ —ž}à6Ð÷ïÿ#÷GÓÉÑb±5jÔ€¯Ï(ì= ×–ß_hkk£yófð5ÛwìÂÿýÈÍÍŶí;á5jD¹Ú+Ρ!>l$ jÕª_/¤¥¥ å—.ÅÂÞÞb±ˆY³¦Ë­¯¨¼¸>(ê·ŽŽ¤™R€¶¶6†‚_ŽTºœˆ×ª½nÀ¬™ÓѬ™>jÖ¬ ïQˆýM( ù9Þ^#Q³fMhiI0Э?®\¹ZæmQñ8†¨œLLŒöv¶7ös\¹r‡Ãì9óðÓæ €ääÛ05·–[O]]]îyÓ¦M„ß šÃÄÄûCbˆ‡;> CÖhÙò£rµW’¸¸ËˆŠŽFJʸvýº\YZÚhh¼º4˜—©¼¸>(ê÷²¥‹à÷é8rô¸»»AM¤'§îJ—ñºQõ× ssSá÷>h„´´'Âó»wÿ@£F …纺ºråÊnƒˆ˜°U)33S ‹­ƒ°,??7ã/CSS³Äõ^ÿÃéë= ÓgΆû 7lþi+fLûªBí½.(8[¶l‡¯¯lm»¢aƒppt‘«“——'´£¡Q´=Eå¯÷AQ¿»;ØãðÁŸqåê5DžŠBTÔdddÀÕµ¯RåD¼nTíuCÙ:¯_'*²>½Â!1Dåй‹½Üª ˆÅbÔ«WWxÞ¼y3¤¦¦•©íŽ­¡««‹­Ûv ??¶¶]*ÔÞë–,]À½;á1x,-: ++K®\GG©©©Âó[·ÊT^eúݶm ñpÇ’EóñãÆï0ù«ée*'âu£ê®ð¿BçúÓ§OQ»vmá¹AsÆŒöê¹rÇ™™ ©TŠ›6cä(_¥Ú_ÿÝŒé ‘HTáö ÓÕÕATÔdgg#>þ&Mž*WÞÁÜ ;w 33>Ä¢ÅËÊT^Eýþ¤Ïì fºøûÞ=¹a7ŠÊ‰xݨÚë,\¸>„Tš…}!¡èÐÁL(èÖÛ¶ïDFF¤Ò,ì=ˆ:uê”Úž––àÑ£Ç|q1a'ª|~c|1Ú×ßÿ°]íÑÞÌ cÇM€µµ<‡•ûšžž»nΰêØ/ÅbåÊ¥ Ûÿ¤wO4ÓoŠý]‹üA.O{…-]²ë¿ßSskLš2 £ % °|Ù"¤¦¦¢«]wôî3½{÷,SyI‰Diý^³zŽ ƒMg;™³Â([Îéàˆ×ª½n€‹‹3zöî{gܿ˗.–Û†ºº:líÑŶââ~ÇŽm›KmoÌh¸öw†äñ<&*™(""Bæàà€»)wýò_ãêê2¥VŽ:¿ñÉdŒ$UºäÄhÙÊɉ7 *7^§ˆ×­Š342y«Ó.ò<¦÷é<ÎË{ñ2‰D‚f-ɽOÝÁâ<ÈDDDª‡ ;Ñ{„ 9QõÃ1ìDDDÄ7ûD*Œw؉ˆˆ¨DJGÄ„ˆˆˆTr"&ìDDog"âyLÄ„ˆHEq*8"žÇDL؉ˆT”]7'Þ•#âyLT­q–"""""&ìDDDDDÄ„ˆˆˆˆèÃ1ìDôN‹:Î Ðg×͉AàyL<™°)ËÇo<ƒ@oŒL&ã$yÏc&ìDDå¹øU5&ê<‰çqUàv"""""Æ„ˆˆˆˆˆ ;1a'""""zÇðC§DÕ¡‘ ’âË\FDªy>¦®®Žzõꡇ³#¦M--É{y-#¢Wx‡ˆˆè-KJˆ7ã/ãדǠ¯ßó.fpˆˆ ;‘JýaVSƒ––€cÇÂ"bÂNô.;q2mŒÍ`hd³áå3 ‰ruÖ­ÿÖ6]ÑÁ²æ/XŒ¼¼<¡ÌÐÈAû`naƒAƒ‡ Ë< Gµi6Æf8qòÕ·¦¤Ü…ß§_ ƒe'´16ƒK¯¾rå†F&;~.½ú¢­‰9\zöAtt B„SÞŶ©L?‰Þ5šÐÔÔTúÜRt¾—Vnkïˆ{÷î u“oß¡‘ .Åþ&,»wï¾ðÍùùùX¶|,­;£©%<†x"9ùv©×ާOŸaÆÌÙ°°ê›Î¶Ø(·¿<‰˜°½—üÇOƺµ«”s1§àìäˆñ§å{ƒ```€˜èœ?{øaÃrm\»vgÏDbÕŠ¥Â²C‡b׎-Høß5¬[» þã'¿Úæ„ɰ··Ã¹˜Sˆ½ƒþ®}ñõìyrmnß¾?|·W~¿ˆAƒÜðù—þ8xè¶mù±Ø6õ“c`é]’ŸŸ‡býw0hà¥Ï-Eç{iåV–ˆý-N¨Œ¶mZ#$d¿°ìRìo°¶²lÛ¾¹¹¹ˆ:ŽKbàì숫V—zí˜ýÍ<89vÇù³Qý9X®mžÇDL؉Þ[:::fJÚÚÚ>l~9z°Ðå}prt€X,F5àë3 ûCȵá7ÆÚÚÚhÞ¼™°lÎì™hÚ´) ‡³rss_%óB0|ØH$ÔªU ¾>^HKK“ksႹhÙò#ˆÅbx†¬¬,,\0úúÅ·©L?‰ª3C#áÑÞÌ #FùBG§¾š2QésKÑù^Z¹•¥~{™°ÿ÷ß8vì8¾ÿn-~ý5€ØØß`õ2aù9Þ^#Q³fMhiI0Э?®\¹ZêµãÒ¥XØÛÛB,£qã1kÖtx"%q–¢jH$»Æ‘£¿Àcð Äþ‡Q#=wïþF mëêê"-íI©×Ž´´'ÐÐx•v˜óÀ1a'zwéêê ==µjÕ’[þìÙ3èêèÏ»;ØãðÁŸqåê5DžŠBTÔdddÀÕµ¯àߌ¿,7NöuÅ%Æ…ß¼.(8[¶l‡¯¯lm»¢aƒpptQØfIoB”í'Ñ»Nѹ¥è|/­Ü¨•!þyðž>}†À }˜8~,À}V¯]g¤¦¦¡eËJì_áÏ•”tžçåå Ë54ø¦›ˆ ;Ñ;¬M›Öˆý-Ýìíä–ÇÅ]F›¶­å–µmÛmÛ¶ÁwÄÇ߀ëwáxóæÍšš†>hTi}[²t"ÂAݺu‰‰In³*úITÝ(sn•v¾—V®¦¦s33„ü¼=FÇŽ/þ£õñÇ0óë9„……¹ðÆÚÀ 9p ÝúcÛöÈÈÈ€Tš…ý¡Q§NRûßÁÜ ;w 33>Ä¢ÅËxP‰˜°½»œ1súT¬^³–ÖaiÝ+W®ÆÌSÑÝÁ^¨·fõ =›Îv042f‰(àí5ééé°ëæ «Ž]pñR,V®\Z¡¾-]²ë¿ßSskLš2 £GûTxõ“ÓÁÑû@ѹ¥è|WTneiÜÜ\¸ è/×î@·ÈÉÉ>pZpNª««ÃÖÞ]l»!.îwìØ¶¹Ôþ/_¶©©©èj×½û @ïÞ=åÊy•L!sppÀÝ”;ÈÎʨ«Ë”Z9êT8|üÆC&“1’Té’o e+c$'Þ`0¨Üx"^·xU§ó8/ïÅÐ3‰D‚f-É1ìDÕ²w¡8§1Uöu…×¢·ƒ ;Q5Ã?–DÄë Ñû…c؉ˆˆˆˆ˜°v""""¢w ǰÑ{³vñ<&bÂND¤¢8Ïc"&ìDD*Ê®›ïÊñ<&ªÖ8†ˆˆˆˆˆ ;1a'""""bÂNDDDDDL؉ˆˆˆˆˆ ;v"""""bÂNDDDDÄ„ˆˆˆˆˆªŒT*eÂNDDDD¤ªÉúÕ«W‘••Å„ˆˆˆˆHÕhiiÁÔÌ ‰„ ;‘J’Éäž2a'""""RCDDDD¤Â8$†ˆˆˆˆHÕqH ‘jâ"""""Æ!1DDDDDªž´JÖ™°©8&ìDDDDDL؉TÏŸþC#™ UëvxøèÑ[íOA_ªK»DDDÄ„¨JEDž~—Éd(s.\Â0O/“ˆˆˆ˜°U¶ÈÈÓ'§î€“á¿–¹á#¼pñâ%•ÞϤ„x$%Äó€1a'ª>233qáâ%hhh`!‹qþüE¤§§ uŠJRxYá²×놅€KÏ>hcl—^}qüDx¹ú©L;»vÀÚ¦+º;õÄåËWŠô¥¤ç¿þ‰ž½û¡­‰9Üzà·øÂ ""bÂN¤¢ÏœENN:ÙtÄ4ÂÇ;!''§NGU¸í3gÎbÜøIH¾}¹¹¹HN¾±ã&àÌ™³•ÞΡÃG1oþ"q±çá>È 2™ ßÿ°±L}T¦mÛv† õÀµ+±èÚåc¥Û8p®^¾„U+—ï°1a'R 2™L¸“>wÞB™`æ¬o§£¢‘““SìzùùùJµíÚuÀôiS ««ƒéÓ¾z±üú«¿`XJi3¸(ÓNBb`ÌhhiiÁÏÏWé8Lž8ÚÚÚèÕ³à¿ÿþ㋃ˆˆˆ ;ÑÛwõÚu<~œZlYzz:λ ·¬ òä_åN*5ùÓJ@$*ãÉ©D;o" ~jI´”n¿^½º±XÌv"ÕQ0fÁüo„¡,I ñ˜7÷Åî‚Ùb$/¿8<<R©k×}Wb›ÿþû/ž>}hÛ¦5`Ùò•xöì9–-[ 05m/Ô/¼Ý’fpQ¦–µlÙºR©6þ¨tDe}ADDDL؉ބˆ—Ó9êë7•[n`Ðð믑Éd01n 7~Ú›Y!(8¤H[zzz«Ž]0mÆ,Àh_o@Pp,¬:a_È~¨©©aì—Ÿ—©ŸÊ´3dÈ`@ÀÞ ´7³ÂŸb’ˆˆˆ˜°)tãÆÍ {Ó×öæ/ö‡áÊ•«X¸`.LÛ·ƒ¦¦&Z`õªåEÚš2yêÕ« ±X,L éäÔk׬Dk##hjjÂа%6|¿;Ù”©ŸÊ´ã9|(&MôGíÚºhÕÊëÖ¬¨««ó@½#D2ÜM¹ƒì¬¬—ìeJ­u*>~ã!“ÉIªtɉ7в•1’o0ÅÉdhcl†¼¼<ì Ø s3S?q&~…† àlÌ)‰ˆˆ¨šÉË{1dU"‘ ™A DFFBƒa!ª¦ï¶E"tîlƒ3gÎbè°‘reÓUQõÇ!1DÕØÊåKñIï^ÐÓÓƒºº:êׯ‡!î˜6u2ƒCDDôŽàv¢j¬~ýzX»f%ADDôãv"""""&ìDDDDDÄ„ˆˆˆˆˆ ;1a'"""""&ìDDDDDªŒÓ:hÙʘA ""/¾œ0)!ž ;‘ªIN¼Á ½ç¢N…«\Ÿ8$†ˆˆˆˆH…1a'""""bÂNDDDDTy¢N…«äð&ìDDDDD/yñgÂNDDDDDL؉ˆˆˆˆˆ ;v¢÷F~~>ö£¿Û`·ëSskxyÁåËWªÕ~„?)÷ÜÐȤJ·!ž0n׿6øü $%%—Ú§ÒTu ¶´ï­m_ÙcWÞ}«Ì8vSûr <ÀžÝÛ¡®®‹Åð<j",ZŠCB¨×¬YûNGž@Íš5_\€44`me‰Ëcøo8;9ªlß'øÅòßbÉâý‹ÔÏÊÊBÛîxúôY‘²ÒbQ‘!¶¶]‘™‰ßâ~/±Ž¢x½.%å.ü>ý,;¡±\zõ-rì_÷úq*|ìʺýòôõšõè`Ù Ö6]±eëv¹>¾þ{Y^DD•aåªÕÂu±´ÇÊU«™°½ëâão¼Ø2 ´ü¨…ð|ÛöÈÍÍEÔ©p\ºggG¬xíBqèðQìÚ± ÿ»†ukWÁüd¥ËöÁÀÀ1Ñ8ö4444ðÆ…ò½Á¨_¿>N„A\ì9¸ôp†¿ÿ$¯†0$%Ä;œ¡2ú^˜¯fÌš{g̘9AÁ!H¾}G®Îë}ÒÓÓCttÌkÛ<‚.wBíÚºrËÅ¢¢C6f͘ŠeËWyCT–xæ?a2ìííp.æb/Æ ¿k_|={žR})îØ•uûeíÿ¾ý€³g"q`0Ž9Vj{eymU†É“&Àm€k©uܸbò¤ Õj¿˜°•CFFtuu•ªòs(¼½F¢fÍšÐÒ’` [\¹rU®ÎœÙ3Ñ´iS@g'äææ*]´NދōQ£|}Faè¡<(8½{¹@[[‰#G ÇáCûßXß ûÔÏC÷aþ¼9hܸ1~Þ —ž}à6Ð÷ïÿSì:#†Å–­Ûå–íܹÆz©«(Õ¨Q#¸ôpÆŽ»Ë/¹„ö@†‰D‚ZµjÁ×Ç iiiåî_Y·_Öõƒöaøð!ÐÒÒB“&1û뙥¶W–×Qe‰DX²xŠ-wttÀ’Å ‰ªÕ~q ;Q9Ô®]ÿþûõë×SX÷îÝ?ШQCá¹®®.ÒÒä?¼¨¯ß´Ô6J+ON¾ Ssk¹e…‡ê$''C"‘”k?+£ï¯311ØÛÙbÜØÏqåÊU>r ³çÌÃO›7©ß£‡,ZŠÿÝJ@›ÖFÂzÍÍÍÊ‹Êà5j†‰>ŸôBÆ Ë¯×ÅÅ]FTt4RRþÀµë×+Ô·òl¿,ë'$$¢^ݺ…ŽeÛr¿n‰ˆªŠºº:Ö|»£ý>Ã… —„å66ÖXóíÊJÿ»ð&ð;Q9´oo‚ß/_.±<"òt©ë¿>¤BM­ôS±´òüü|ÜŒ¿, HJˆÇ­›¯îŠæææUê¾—µïŠ˜™™bÜØ/pþÂÅ/¼C<ܱõå]ö»ö`h1wו‰Eeý!˜úÕd,Z¼¼\ñ*,(8Óg|?ü#F Ãö­›ËÝ–¢u^¿Yžã]ÖíWôµADT^ZZlüa=ZZaãë¡¥%©–ûë)Q9 èïŠí;v!??¿HYbb>"<70hŽ ÏŸ={V©}iÞ¼RSKFÑ¢…rrrÊÕve÷½sûb?)‹Q¯^Ý×2Ä¿„@RR2Î;×~}Ê‹Êbei-- ÎÄœ­P¼–,]À½;á1x,-: ++«Ôúüùg¹Wá71%åWÔ#£Vxòä_áùÿn%ðb@D*KGG;¶ÿ;»®Ø±ý'èèèTÛ}aÂNT}>é…š5kâ³/ÆáÆ›ÈËËãG±{Ï^ŒõŸˆ)“' uºõǶí;‘‘‘©4 ûC¢N:•Ö÷An8pð233!•J±qÓfŒå+Wþ믑ÈÊÊBVVö£o?·Bw!´p'%=.Òve÷ÝÛk$¾7‘§ñüùsäåå!%å.¾™;cFû”ا† ÀÁÁcý'¢§KÔªU«\±¨LS¿š„ÕkÖW(^ºº:ˆŠ:ƒììlÄÇßÀ¤ÉSåÊ544pâd8d2`îÜ…¯ÝA’SE—¢õ‡ Œ½ÁJ¥xðà/^Æ‹©´úõëaëO›”ÂÊ„è#‰°áûu°´°ÀÄÉSaÒÞ={÷ÅÅK±Ø²yš4i,—¤ª««ÃÖÞ]l»!.îwìØ¶¹Òúâí5ééé°ëæ «Ž]pñR,V®\*”{›ÿ»»nΰ°êŒ°°øný¡|Ìh¸öw‡ƒ£K±mWfßýÆøb´¯7¾ÿa#ºÚ9¢½™ÆŽ›kk+xZjŸF Ф¤äb?lªl,*ó›8ëÖ­ ÷AnŠ×Ò% ±þû 05·Æ¤)Ó0ºÐ›ÂÌ*­ÛšÂÏïKŒð&Wþzœ*z¼­?Ø}rssak爇 OŸÞÐÔÔ䈨ªóŽˆˆ™ƒƒî¦ÜAöËǪ«Ë”Z9êT8|üÆC&“1’Té’o e+c$'Þ`0ýý7† …¨SU3—7_ke÷ôé3ôë?§#O2DôÆE ‡÷ÿJ¿vä·oëÛ›óò^Ì`#‘HÐÌ "##9K ½ÊÞÝ.î™={ÑßµùYuì‚Ù_Ï@Og<žŽ-[·£WO†ˆ¨Š1a'¢7¢"w*¬:~ SÓöزy#ù­^µËW¬Â´é³ ««‹~}?ÁÔ¯&10DDL؉è}wíÊo ‚ °µí[Û. ÑÆ1a'""""ª<Þcüß›}å""""ªvÞ§™½x‡ˆˆˆˆH…ñ;ÑKU5Ç;v"¢ ‰D 1a'"RUoë툈ˆáv"""""&ìDDDDDÄ„ˆˆˆˆˆ ;1a'"""""&ìDDDDDL؉ˆˆˆˆˆ ;v"äççco`0ú» †q»05·†—÷\¾|E®ž¡‘‰Êõ=ìøÉ7¾ÍŠÄáõþ*jKc^ûHDDL؉ª-™L†‰“¦",ìæÎ™…Ëqp&*½z¹ÀwÌg¸t)V¥û?vÜ„7¾ÍŠ|“hYûËo-%"¢w‰C@Tv‡Ã°g÷v¨««Äb1<‚šH„‹–âЊˆˆˆ*Œw؉Ê!x_Fûz Éza¸bõ·+ä–mÛ¶¶öŽhÕºÚ›áÄÉp¡,%å.ü>ý,;¡±\zõ•+742A`Ð>˜[Ø`ÐàaJ­?nÞ‚®vÝaÜ®†ð”¡½‚Ÿ…‡e¬[ÿ=¬mº¢ƒe'Ì_°yyy¥öáÄÉp´16ƒ¡‘ Ì:t„—Ï$$$–³ÂÛ242ÁÁƒ‡áàè£6í‹Ä¤¸õ^ïoi1-\¯<ý ;~.½ú¢­‰9\zöAtt B„SÞÅö·¸á-…—=}ú 3fΆ…U'Øt¶Åž€Àë1a'ªññ7aaa^l™††Z~ÔBnÙ¯‘‘ؽso]Ǻµ«à?~²Pæ?a2ìííp.æb/Æ ¿k_|={žÜú×®]ÇÙ3‘Xµb©Rëì Fýúõq"ìâbÏÁ¥‡3üý'x5\$)!^ø=`o ógOCCC?lø±ô>ŒŸŒukW!)!çbNÁÙÉã'NQ:†‡Å®[ð¿kEbRXqýUÓÂÊÓÏíÛwâ‡ïÖâÊï1h>ÿÒÁ¶-?*ìoqf3NŽÝqþlBFHÈþb÷‘ˆˆˆ ;Q%ÉÈÈ€®®®ÒõΟ‹æÍ›z8;!77÷Uâz Ç D"A­Zµàëã…´´4¹õýÆøB[[[hCÑ:AÁ!èÝËÚÚÚH$9b8Ú_bÿƒöÁÉÑb±5jÔ€¯Ï(ì=Pjttt Í”´µµ1|Øürô Ò1™3{&š6mZlL*ÓÂÊÓÏ… æ¢eË ‹á9|²²²°pÁ\èë—¯¿—.ÅÂÞÞb±ˆY³¦ó$"""¥q ;Q9Ô®]ÿþûõë×Sª~A¢W’¸¸ËˆŠŽFJʸvýz‘ò¦M›”iäädH$¥÷'9ù6LÍ­å–½>Üçõ>,[º~Ÿ~#G»»ÔDjprê®ô6Ť²Ö/O?[´0~×ÒzÇ&—»¯iiO ¡ñêrkblÌ“ˆˆˆ˜°U¥öíMðûåËpvr,¶<"ò4º;Ø—˜ü‚-[¶Ã×× ¶¶]ѰA88º”š<+Z'77¯Lû“ŸŸ›ñ—¡©©Yb×ûÐÝÁ‡þŒ+W¯!òT¢¢Î ##®®}•Ú¦šZÅþÁWZL+ÚÏâÚ‰DJ÷­ðøÿÂË ÚÕÐPçIDDDL؉ªÒ€þ®Ø¾c»;I<“pøð¹„½4K–®@Dø/¨[·®°~E×iÑÂ999¥&à…5oÞ ©©iøàƒFeŠCÛ¶mжm ñpG|ü ¸pW:a“Þt?ÿøóO¹ç:::HMMEÆ ·n%ð$"""¥q ;Q9ôù¤jÖ¬‰Ï¾‡7n"//=Æî={1Ö"¦Lž¨t[ºº:ˆŠ:ƒììlÄÇßÀ¤ÉS+¼Žû 7üúk$²²²••…½ÁèÛÏM(×ÒÒ”|Ògö"##ð÷½{rÃ>*Óëý-‹7ÑO œ8™L†;))˜;w¡\ys3ìÜ€ÌÌL<|ø‹/ãIDDDL؉ª’H$†ï×ÁÒÂ'O…I{ ôìÝ/ÅbËæ hÒDùñÎK—,Äúï7ÀÔÜ“¦LÃèÑ>^ÇkÔÜüß-Øus†…Ug„…Àwë×åcFûÀµ¿»0ŒÆÛk$ÒÓÓa×ÍV»àâ¥X¬\¹´Ô>¬Y½G…Á¦³ L„ÙXªÂëý-‹7ÑÏ‚YcZ·5…Ÿß—á9L®|ù²EHMMEW»îèÝgz÷î)WÎi‰ˆ¨Ô¼#""Bæàà€»)w•PW—)µrÔ©pøø‡L&c$©Ò%'Þ@ËVÆHN¼Á`Ñ{!/ïÅg¦$ š´@dd$ǰ½MŠî¬r~n"""bÂNô1!'"""E8†ˆˆˆˆˆ ;1a'""""bÂNDDDDDL؉ˆˆˆˆˆ ;v"""""*ÎÃNTFQ§Â""¢wœ]7'&ìDÕ™ßxˆˆè%“Éœxƒ ;Ñ»p2“b"‘ˆ±""¢jó7K¿…œ ;Q¨Ò»oUTxøcEDDÕåo–ªá‡N‰ˆˆˆˆTv"""""&ìDDDDDÄ„ˆˆˆˆˆ ;1a'"""""&ìD•)??{ƒÑßm0ŒÛu€©¹5¼¼Çàòå+rõ LT®ïaÇO¾±m™È=Z·5ÅÇ]0wÞBH¥YïôkD=1a'z/Èd2Lœ4aa'0wÎ,\Ž»€3QèÕ˾c>Ã¥K±*Ýÿ±ã&¼Ñí%%Ä ›ñ—ñëÉcÐ×oŠù óÅDDDÄ„¨ò>r <ÀÖ-›`nn±X ]]x „éS§`Á¢¥ RI"55hiiaàÀ8v,Œ!""bÂNTù‚÷…`´¯7ÔÕÕ‹” àŠÕß®[¶mÛNØÚ;¢Uëvhcl†'_}ÃZJÊ]ø}ú:XvBc3¸ôê+Wnhd‚À }0·°Á ÁÔZ~ܼ]íºÃ¸] á…;))B{? ÙX·þ{XÛtEËN˜¿`1òòòJíCEijh@SSSé8œ8Ž6Æf042Y‡Žðòƒ„„D¥ÊmíqïÞ}¡nòí;042Á¥Øß„e÷î݇]7'/†;-[¾ –ÖÑÎÔC<‘œ|»Ôx<}ú 3fΆ…U'Øt¶Åž€@ž(DDÄ„èm‰¿ óbË444Ðò£rË~ŒÄîÛxë:Ö­]ÿñ“…2ÿ “aoo‡s1§{1ý]ûâëÙóäÖ¿ví:Ξ‰ÄªK•Zgo`0êׯaG{.=œáï? À‹á)? ~ØÄDGàüÙÓÐÐÐÀ~,µ啟Ÿ‡býw0hà¥ãà?~2Ö­]…¤„xœ‹9g'GŒŸ8E©r+K Äþ'Ô FÛ6­²_Xv)ö7X[Y¾xƒµ}'rssu*—.ÄÀÙÙ+V­.5³¿™'Çî86 ¡?˵MDDÄ„è ËÈÈ€®®®ÒõΟ‹æÍ›z8;!77W(;t Ç D"A­Zµàëã…´´4¹õýÆøB[[[hCÑ:AÁ!èÝËÚÚÚH$9b8*9 Ú'GˆÅbÔ¨Q¾>£°?ô@©}(‹Â:mof…£|¡£SëÿíÝwœõ½ÿñ÷Ì){Îvz_–*E:Øh" EÔŸFÅcLÔ(Ư¹v£±_“x½Ñh Å (–¨tÞ—²Àözڔ߻Yi»°À.¼žÇq×3sfg?_æì{¾ç;ßÑn¿µÚuHIIQ¨<$IJLLÔå—]ª>˜^­åýûõÕ‚ÊÀFõá‡ÿÖ‹/<«Ï?Ÿ£²²2IÒüù Ô¿2°O{ç=]=ñJ%%%) hü¸1Z²déë1oÞ| :X~¿_-[¶Ð½÷ÞŨ1/%jGZZš ‹Ô¸q£j­ß¦Më._¸p±æ~õ•6mÊÒ²ÜkyëÖ­jôšõë×+Tû÷Y¿~ƒzöP幟÷Ù×>T×îžüƒ9Ðïôøcëú_ߨY|¤ ÆÉ4LqVµ–÷ëßO“ß|K’ôÑÇŸè´ÓNQFF x†f}ð‘.¹ø"Í_°PW]ùKIÒæÍYjÖ¬i|Û©©©ÊÏ/8`=òó äõþô6Û½[78Vzôè®E‹käˆáû\>{Η:kØÐý†ß=M}kš^yåU]{íD ögÍþì#5lØ0þúÃ}M»v™ŠÅb à{jÛ6CyyùjÞ¼Ù1«iuêеkuíÚE—^2AË—¯Ð…c'Äû–›¦©Þ½ziÚ;ï*7'W§œRñiÂgœ¦{î»_“'OQß¾½e†$)3³­vîÜ¥–-[H’Š‹‹ºÿ)))ÊËËSÓ¦=ó«W¯á@ÔcØZrÞ¹ç())I7Üx“V¬X)Û¶•““«7þõ¦~wó­º}Ò­ÕÞVjjŠæÎýZ‘HDË—¯Ðm“î8ì×L¸hœ>ÿ|ŽÂá°Âá°Þœò–ο`\|y0ÔÆM›”““_ÿýé3T^^®P(¤¿þíe]yÕµGµ¦ûÎ=o¬þ5yJ|Ìù¶íÛ« A9Øòþýûêégž×„ ?ÕÁ4M]4~¬^xñ¯ñ N%iü¸1úÇ«ÿTYY™B¡°Þ}oº4hpÀýïÓ»—þùúd•——k×®]zø‘Ç9PvàX1 C/½øœúõí«['Ý¡î=úê£Ï×óæë•—_R«V-«½­Ç}HÏ¿ø’zö Ûn¿S×]wÍa¿fâUWhåªÕræHõíº>þø½ðü3ñ忺î]8fB|ÈÉÕ¯Tii©†œ9RýO¨æÍדOݹäö;=óôŸõÁ‡ëÔÓ‡¨cçîñYaª»¼¿¾²,KãÆŽ©²ÝñãÆ*‹Å/8Ý]Ç£ÁC‡kàà3µpá"½ö—¸ÿO<þ°òòò4hÈY}ÞXý @Í3ÆìÙ³ÝaÆi󦊄+n îñ¸ÕzñÜ/>Ó5×ß"×u©$jÝúµ+Ô¡S7­_»¢NíמÿîëÚ¾Õ5Ô Pßþf­[³ü˜æÛ®Š”‘ÙNsæÌ¡‡¨Ëì ° °àN§Àá˜ûÅgZ@`ê¢Ý·¬µ€ÀÔAÜ0 €ãO]¼ÑcØ€:ŒÀØØ;;;@`@`ììì ° ° °vv€À€À€ÀØØ;;;@`@`ììì ° ° °vv€À€À€ÀØØ;;;@`@`ììì ° ° °vv€À€À€ÀØØ;;;@`@`ììì ° ° °vv€À€À€ÀØØ;;;@`@`ììì ° ° °vv€À€À€ÀØØ;;;@`@`ììì ° ° °vv€À€À€ÀØØ;;;@`P«¼”84ë×® €ÀÔE®ëR@`ê¢!gŽ w5Œaìì³Ä5Õ¡S7ŠP‹ Ãк5Ëi#Ú´mDwmD`Ž!¦u¬s¿øŒ6¢@ÑF´ÑqÝFµ!1 °8Z¸è¨£ŠË¢*(‰Ty.-)Aé)~Šs”E"Qemݪ»vɲ¬®ëº®R““Õ¹cG¥¦¦P¼Z亮‘ˆŠŠŠµzÍ:ýç‡Ú™“#C’aJm3Ú¨OêÐ>S©)ÉJLL”iÒ/Tû“[åÿ …Àà@f}»Y/Ø©´”D¹’JËBÔµ®9¯«Lƒ7Ñ£©¨¸H’¡ λP))©Uÿ´¹{ü‰s]E"­Z½JYÛ¶*C­ä+ÈUxÓfÚe*Ð*C†ÇCAA4ÓÆM›µfÝz}ñÕ·òz=:¥?Þ9 ƒÚ¹s§–¯\©wg~ ÇqÕ·×É:¹[WuïÚE@¬gò#ÛUÎUÛ´„Æ#Ìqmí([§ÜÐV¹®£=ËmÈPzB3µHî,ŸÉqD`°O§öí¤6-e9®veï’Ρ(Ç@,f)˜¨¤ädE¢a9Ž#×uåÊ•»ûûÊG$UË–­dY–6ÎÿN©ÿþXææ­*lÝZÍ~s£;t¤ 5 ëѨ-Y¦ÿÌ›/¿ß«Æ())¨¼Ü\­v¥¤¤D…#5HKUŸ^'kùŠUÚ¶}»²wîR~a¡ž:@‰‰‰²žÈ mÕWÙo(7š¥³tÚ§õ¥(GPØ.Óœÿ'3hË•­ˆ–mÛ²mG¡H©ëd¹?ìRñ†9¦"ËÕ’ï—(?V‹;n«Q(¯®=·ñ»›~Ü…˶TZZ*×q””˜¨Ä`¢€Úwð«[·n*…äõx‰F‡F ‡TZZ*†b±XNŠ>ùô3MºýN=õäãG$dmt¸Ê­b}»cªÜ¥êÒîdí ¯UAt«›IGŸo}E#3®gXÆ}ƒseš¦Òš)ÏÜ!†\ÃUM.™:ÇÓ‰‚ËçºØm§âá8²G5íc/((ÐÂEKô§î×Â…‹UXXHQçï™aÈ0L«¸òQTT¬¢¢+wÛj•­ûP=Ú¦)3¸C*ߦe«°_ºÒï¾IMÏKå•i()7/O®ë*9%UÉÉ)JNJVã&MÔªeK5hØPiiéJII•×ëS4S(–a˜2Íš]´xöÈzêÉÇuó-“(þQ²Jõmö¹©¥êÕñtEU*וL׫¼Ðfy‚ŽBÞ<}ºùïÊm£`GîN2 ¼Éòzü2LÉ4Lé0/úåx"°õ^qYT“?]»ÏÇ’õ¹r7ÚÇÕŠzs?ëç‡÷Úþ¬>ÒˆáÔšš¢ág©Y|TeyQQ±î¾çêÛÿ4zú`ýkò”-?ñþœ2 Såeå*ÛãQ^V®üYZóÕkjä)TFr‰<±|mÏ)Ôú¿b}ÇËÛã4y‡ôsÖ»?ŠÞóëÁ†ÛÔ')É)JMMQy(¬»v©¤´D–mUDr帎Âá°ŠŠ µ=;[«V­ÒÚµkeY–¢±¨š5mrH!ãçSx>÷ü‹pê õéwšþûÁGdÛö~_¿¿u÷×F5Ùöñ¤±ºí°ûãèuk–WC.Z·n©ÌŒ mÜ´U‘HÅð–’ÒíÊÙ¥mÛ·iÃÆ Z½f•Ö¬]£mÛ¶*ÈŸ MYÛd[¶ztïvØû0ùÍ©ÊÌÌÔ7_ÍÖwß~)¯×«ÿyéï5^w_mT“mOÂV‰¾ÛñŽŒäN?é\ÙfT¶¢ñ©R=òU̼d•igéý‰Êެ՗Yo¨4ZpØ?ÿõ×'ëí©“õÍW³•œœ¬?Þÿ§û’±û=Nò{2L³"´ÿxõŸ²,Ks¿øLó¾ÿF#GןŸzZ’Ô¿__Í_°0¾î”©o©k—“ª¼ïÍ›¿@ú÷‹ÿÿŒ™èõ×^ÑšUËôܳO—½ùvàKM ªU›æ ¤5øé‘Ú@Ôtå—Û*XŠÅlå•Ùò¥¤)’ª„ÝäT¥5Lßç<Ó›7g©¸¨8þ¦6`@jóæ¬ŸÞôæÍ×Сƒå÷ûÕ²e Ý{ï]U¶q°å'b`7MS‹-Ö µhá"-˜÷¾|ã5 Øj—R&o4G[¶çhцu:ï!µèr¦LÏþovµ»§u_Ú¡Brb¢RSS‹EõݼšùÁÇZ·n£JJÊ亪Ó ÊôxUŽhËÖZ¾b­ŠŠŠdš¦5lpØû0eêÛ1|˜ü~¿tí5WéÝ÷Þ?ìueýãAÔë‡ÓîÒéÎUŠ¿±R̦J4H2亮Lù丮&´V»ô¾J6W‹ÔŽZ_º@_o›¢°UrXûpï=w)#£’’’tÍÕWiþ=¸Ç+ÛiIΧzaÑ5zfÁzfÁzyÙͲ+žÚ ÃÇôÅ{ÛMÃÐÛkŒ¯ÿ좉ú~ÇtYNä÷cÚ;ïéê‰W*))IÁ`@ãÇÑ’%Kã}Ae`F£úðÃëÅžÕçŸÏQYY™$iþüê¿G`¿ÿ÷¨uëÖ’öýéØñ€‹NcÌu¥hÌQ8jË©œ Æ©¼ØÔÝ=$ÆqdÛ®וc»²]WNå0Ã5äìãzÔ÷§ÏÐøñcª„Í‹ÆÕô3uóM¿•$åçÈëýém {·ª=‘[~¢†öÞ½{Ëu]Ù¶¥…3SÛf‰ê”š/…visvžVçšê1á5i?@Ïßf«Ó~¢·Ãî^¾–-š«g“UPP ÅK—)ª °H‘HD’+Ã0åóyäX–R“JMI«ü˜ÿð{ ׯߠž½TyγŸ›`ÕdÝCY¿þ‡FK+ó¾Ò÷Û§K†«µÛ–É–­æÚhxŸ %W•ï}¶\Gòy‚Ê)ئâ’b™†G–Ó’œ«A …ú5-¯éßëßÊÏ9޳×]o{ï1sPóæÍ”Ÿ_pÜKçNé´­t¥ÜÔ2 ê©r »­˜ ÃP‚' fÉíYJõ¶Ð°6W*-¡éaO™™mµsç®*'T{†ïÞ½ziÚ;ï*7'W§œRñéÓgœ¦œœMžbãë ìö’žâ×5çuÕÄÑ]4qt]½Ç£oçÆŠUÞz÷°˜žéêóºêês»ìõhœöÓmèÞŸ>³ÊÇ…{ºâ——é½Ê‹Oûô>YåååÚµk—~äñ*ëlù‰ªC‡jš¤åë²5k^Ž–nsežt…z^ø€ºŸvž:tè @p÷E[‡ÿ6[“vƒÚ¸i“rrr›zÇb1Å¢ÑÊ?Еcl½^A%''+99Eé Ò•”œ¤Ä¤$ùýþÊ“%S1ËV8©Qhß=oôsÏþtWÚ ÓûÓg¨¼¼\¡PHýÛ˺òªk÷ùúƒ­ûó6ªÉ¶û3U t]Wa«¼òûŠGuL¼ê ýñþ?é˹_) + ë›oÿ£~T×\=±Êº=ô¨víÚ¥P(¬·§½§>}zPµNö7ÐÀ—*”oiɆ¯åS¢¼FEh·Ýˆ¼¿'fȉš 8©Ñæ5 ´:¤°þóãiü¸1úÇ«ÿTYY™B¡°Þ}oº4øéZ“þýûêégž×„ ãªù‹ÆÕ /þµÊ§' †ÄÇú¬y?½†aÈ¶Ýø˜Š'Uï¯Ö·ß~§»ïúÃ>—sλ`œ,ËÒ?¬'þü r–LÓ£[nþm•©³¶üD5þ|emX©‚œ-Êè9JêØE' ½@Ä”øÇù¦\¹röêü¹M¿¸{|{MÚáW×]£ ÇLã8úqiýo+ÇqTTT¬‚Ââ½>ö6*ÿò?«¶)Cå¡2åää¨E‹æûr²¯úïëÎŒWO¼RyúY 9s¤B¡N=u€ž|ò±}îóÁÖýyÕdÛ'Ddw]Eí,;Zq‡ç|@2rÄpY1KO?ó¼Ö¬Y+I:©s'Ýs÷:kØÐ*ëŽ5R¿}¼^ŸFŸ3JO<öÈ WídÑìb}¹ã5­2«]›2̲SÃ@KYÅ r#–Îj}µš%µ?èöjr<=ñç¿hðÐá’¤ÓO;U¯ýãåŸ{¿¾²,KãÆŽ©²­ñãÆêù^ªrÁé‰Â˜={¶;lØ0mÞ´Q‘pÅ´pOõŽŽ¹_|¦k®¿å>nfýÚêЩ›Ö¯]Q§öëhíÓäO×jÑV[¾¤Å,[v¸\Ý›9ºzt×ý†üúf÷{HmOAXÛm´eÛ6™Ÿ† >S’dY–\Ç‘íXò˜^¦¹ÇxØ=î|êº2dè‡yß+T^¬ÌŒ¶´Q ÛȶmmÚœ¥w§Ï’×çS¯ž'+!Á¯h4¦–-Z(kK– AhÛ¶mòz=ÊÞ‘­` ¨ iÍÚuºtüXuéÒY‰‰‰Çå{e}9ޤ(²KïmH£\¬íe«´!ve)TQ#_{klÆ=ÊLëY+?¯cçîGuêÓºÞF¹¡,ÍÍ~C Z&*ØÐ£ì’µ2ŠSU°³XC[\£vi½ÚùÀqT{l»¢Ö@@™í4gÎzغÌr\™»‡Äضª{ǹêÜ4‡[£WëV\ìšß†‹éÓ¾¦k4TùÁ¾L¹ñ&Ûý1ÿîq—Õ½±í$%ø}jÞ¬‰Ö¬Û¨¼üuìÐNOT2$é‘aH¦§¢]ü~ŸÒÒÒå÷û•µm»Zµl¥`0°Wï|Mn,E†ä¸–Ç‘!Sï_S%$Xò+Q–W+ï{´ç¾5fhP‹ËôÕöÉòE" øšjWNž7¿BíÓz×Zí©ÿ¡#°u˜c;òy É5qÜjvÞk—ÇãQ$Q(R0”aUÂ÷îïw_ eHáPX¡PH^ÓSå5´Qõ˜¦©ôôtõéÕK±˜¥ÕkÖ*Ž(£MkE£–6l(Ã0+n°‰ª¤´LQËÑΜl5jÐP§ è«fÍšî5†ú×±0bøås‚š·æsÙ®¥pÌa%ËkÙ*çɧ€‚ÞdÞ÷Ž ¦ÁL lv±¾ÜñºvÙ[5°É/Õ!½?sìfÛöòçÊu\E¢Q¹-›S”c 99I%Ù;ôÙçŸÊ¬á¬/ŽãÈ4\µlÞü„›Õ 6†¡ÄÄDµo×Véi©Z·q£6gmÕ²—˱mYŽ#Û²åØ¶lÛ–éõ¨AjªNêØ^]Oê¤fM›)))ñ„¯¾zS4¸é•ÚÚXñ©–iÈðI®Ï•4Ô ÐB -kíç0÷­yRG k1Q‘luN?í¸C`pØFÚFýNª:×m£ÔÀq3~½>ƤÄDµjÙRáp¨â†VÕ}­$i*Ä{æQs¦i* ªE‹5nÜHÝ»vUAAB¡°,Ë’eÛ2MC>ŸO JKMQjJŠ€<u¯mlx”™ÚK)'Ë•»WP4 N¸Ž–¦‰íÔ$1“°N`PRj” uáÒëUJJ²RR’)Æ1ñ˜2öqÒV×Nv~Ž!1 ÞrÊËÚºMÞääŠy¼£Q9ÙÙ²W­’oØ0ý8c†œV-Ôò׿Úï6–/_©¾}{ïs™×ëU‡öíâÿóï'ièÐ!úÏ7_hþßhÌ…çë¾?þ©ÊkfÌü@¯¿öŠÖ¬Z¦çž}J7ß2)¾ìÍ)o©qãÆúäãYZ8ÿ?uöHÝ|ómñå“ßœªÌÌL}óÕl}÷í—òz½úŸ—þ~ÄëX›¡sÆwYzaæj]rî`µlÖXë¶WÌ ³"«H«·iÍÖ"­ÝV¨uÛ‹´fkÖlÉÓŠM;´#¯D9¥Z½yç>gˆYºt™úíqòôsÏ8]‹í}ÍÁgŸÍÖÄk®×o~s}­‡õÝ';v€}q]­¿éVeöè¡&™™r¶n•[X(góf™«(?_Y+WªÝ“Op3eeeJMM­^}š.¿ìR%''ëÚk&*??¿Ê:÷ÿñµnÝZ’töȲ,+¾lê[Ó4úœQJLLT ЕW\®™3Þ/Ÿ2õm>L~¿_ ºöš«ôî{ïñRÖVèüË{ËõÅŠBý¿ †)&Ÿ6å„äJ2LS†iJ2äÊãV\dj;®,Ç•m»rUqã$¯ÇT$f)è¯ú©BAA¡6l°ßŸÝ°aCWyîõ7&ëý3õδ7õô3Ï«¤¤¤NŸììCb@½´å©g …ÔeÜx9 HѨäóI¦)ײ”˜–&·¼\va¡<ÁæûÝNZZš ‹Ô¸q£jýÜ… kîW_iÓ¦,-ûñǽ–·iÓz¿¯]¿~½À–oPÏÞª<ç9 wh­­Ð³É•I1ÛUÔväµM¹Q[Ee– ¹òš®‚>CŸ¡€ÏŒï:®dJŸv䕨u“ä*ÛNNNRIi©ÒÓÒöù³ ‹ö:ñÚ¼9KÏ=ó”LÓÔï~{ƒî¾÷~½ðÜÓµ~²s¤C;=ì ÞÉûàC•ýûõ¿ìr9 ȵmyN;M±“N’oÔ(¹ùùò¨ëÈ‘ÚòØ{Ø{ôè®E‹ïwùì9_Æ¿ŸúÖ4Ýu÷}jÑ¢…®¸â2½ú/ï®ÌýÇ+˲¸/ŽãhåòÅZ·fyü±zåÒ#^ÏÚêa¿ó¢:ã¤4M™1G>YÊh”¨Ò­­ya•Y GY¶öx¸²ìŠvÛqäóšJK jò'‹uF·¦U¶Ý·O}ÿý¼ýþìÿ|÷½zõìQå¹ûî½+Þ#G WÓ&Mô¯ÉSêäÉ7ÊV­Ö–‡ÓÀë~%-[&;;[Þ>}´æÓOõáý÷«¤¤DžŽe/X vƒ©lÁ"•þ¸ÿP5vÌ…zõµ×å8Î^ËÖ®]§™3gÅÿÿÑÇþ¬)oþS—\|‘úõí£p8\£}o×.S±Xl¿ËÛ¶ÍP^^þQ¯im†Î‹µÕ £;éæjGNžº´N‘Ç44¼Ws íÑL»5Ó©]šª_§¦êÕ¡©ºe6QÇ6U¶´tý=úú—ò{\ý¢_ÕO*®øåezæÙçU^^¾÷¿‰²2=ÿüÿèòË/=à¾ÝuçízúL­Z½¦ÎìØÀq#ûéçÔgôh%D"²×®•oÐ e/_®+W¨ýCÒâ3äéÝ[n8,mØ Þ秬ÜïöÎ;÷%%%é†oÒŠ+eÛ¶rrrõÆ¿ÞÔïn¾U·Oº5¾njjŠæÎýZ‘HDË—¯Ðm“î¨Ñ¾O¸hœ>ÿ|ŽÂá°Âá°Þœò–ο`\•åïOŸ¡òòr…B!ýõo/ëÊ«®=â5­íÐÙ¯cc=<±Ÿ¾ùa±,_¯ÓNj$Ç•þð—iºõÉ·õ»ÇßÖ ¾¥ëšª‰ÿ=UWþiª&=7Kÿü`¾Fõnª;'ôÔÏot:dÈ 4P_r¹¾œû•B¡B¡¾ør®&\r¹Î8ã4 ;sè÷Ëï÷ëÏ?¢»ï¾O¡P¨ÎììcØ@½’:dÖLž¢¦½{Ë7j”J µpÖLu6U -[h×ëÿRΚ5jؽ»¬¥KÕbÌ­ùú+ÎþBég¹×ö ÃÐK/>§ÿ}åUÝ:émÞœ¥¤¤D x†^yù%µjÕ2¾îc>¤?Þÿ'Ýy÷}ÊÌl«ókMºýÎjïûÄ«®Ð3Ͼ ûxP¥â0‘IDAT¥¥пŸ^xþ™øò«'^©¿<ý¬†œ9R¡PH§ž:@O>ùد鑭%ê©ëOÑoÿ¨™³ 5vxIÒ´û†ò6ï¹û}ðáGzáÅ¿jåÊU’¤îݺê·7þZçŽ>§ZÛÈÌl«‰¯Ô=ð žxü‘Z9Ù9ҡݘ={¶;lØ0mÞ´Q‘Êu<—wpÄuèÔMë×®¨ñë¶¿ô7•LŸ¥^C†èûY³Ôæé'•Ø«‡\W*[´H»î{@#þðÙóæÉÛ§V}ú© ÛgªÍïo:!ê:÷‹ÏtÍõ·ì7HvìÜ]®ëÆk$C§ãºzýóuš¿¾HÙ9Ešr×P¹®+Ã0dTv£›¦ÿ¾¾×üpO€l»¢@@™í4gÎzØ@ýaÛ¶b±˜Ò®ü¥¢¯~x{šRoºQV»¶*,,ªX©}{9­Z*ëë¯Õ¬G-zûmålß®ö·ÿ^¶mW™u¥&CAŽÆÐ‡c¥¶7ÇqdY–lÛ–eYºp@S5K1õÚìåÄ×3 S¦iÈôxä1My½^y<y½Þ*ïÖtÈÎÑl+ît Pɲ,Åb–,+&˲”8öùÎ=G–e©¤¤T–mÉq\™¦!ÿ¯¥%·ß)÷ã•~íDµ¹x‚”àW4“ßÿÓT‰Çs?V¡Ó¶mE£±x;Å,KVÌR·~ýöì–**,’ã:2 S¯G^W^¯W^ŸW>oÅ÷¶íÈï÷Õ‹vb ;@%Ӭ쭼 ÇôÈõ:ñeÛ#W® ò´ÍPÒ;S*‚ ×'Óë‘Çã‘Ïç=*óš×7µ: èÒN½è¦L©Œ&‰²;>$Æczdz*—•뛦¼•íu¢ìØ@½ì òûýr]WŽãȶíøWÛväÊ•Ç4åñx*B|å׊ÉäxG#tîÙNŽãÈuÝÊö©|8Žäº2M<3þÕãñÔËv¢‡àgv_¬hVŽyFÝ †aÄ{ÉçvâN§8*¡“¯‡öõhô°3­#8fuZGXM§uDíÕ\bZGÔbÈDÝG`„ÆP}¿Q€ÐØÀ‰Qw³Ävv€À€À€ÀØØ;;;P§„B!;PWÃúÒ¥K‡ ìÑh”Êu@0TÏ^½$IÑh”ÀÔ¡PHÁʰ.I±XLÞ¿_¹99²m;¾À¶ ª­ ƇÃôêÕK>ŸO¹99Jðûeþ»¼¥±dÉY±ÕŽrXß=f}Ïá0ÑhT‹/ÖÕO¼k˜†aÈ0 åæåQ1à(úù˜õ` ×u•“›'×#I2c¶£Š‘HTY[·ª¤´T–eQ=àh„öʰnY–JKË”µu«bVLW<ü–!IÞòòr¥¥$ꃢF†ãX\¼ÙÍËϧrÀQ–žž®[ÿöy• Jÿ?òKaÞ]ÛSeIEND®B`‚kildclient-2.11.1/doc/C/images/Makefile.in0000644000175000017500000002755011570177666015131 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # $Id: Makefile.am 1014 2009-02-01 12:46:52Z ekalin $ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc/C/images DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = 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__installdirs = "$(DESTDIR)$(manualimgdir)" DATA = $(manualimg_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ KILDCLIENT_PERL_CFLAGS = @KILDCLIENT_PERL_CFLAGS@ KILDCLIENT_PERL_LIBS = @KILDCLIENT_PERL_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ OBJEXT = @OBJEXT@ 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@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RES_COMPILE = @RES_COMPILE@ RES_INCDIR = @RES_INCDIR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ pkgdocdir = $(datadir)/doc/kildclient manualdir = $(pkgdocdir)/html manualimgdir = $(manualdir)/images manualimg_DATA = *.png EXTRA_DIST = $(manualimg_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/C/images/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/C/images/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-manualimgDATA: $(manualimg_DATA) @$(NORMAL_INSTALL) test -z "$(manualimgdir)" || $(MKDIR_P) "$(DESTDIR)$(manualimgdir)" @list='$(manualimg_DATA)'; test -n "$(manualimgdir)" || list=; \ 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)$(manualimgdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(manualimgdir)" || exit $$?; \ done uninstall-manualimgDATA: @$(NORMAL_UNINSTALL) @list='$(manualimg_DATA)'; test -n "$(manualimgdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(manualimgdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(manualimgdir)" && rm -f $$files 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)$(manualimgdir)"; 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: 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 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-manualimgDATA 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 pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-manualimgDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic 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-manualimgDATA install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-manualimgDATA # 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: kildclient-2.11.1/doc/C/images/firstscreen.png0000644000175000017500000015441411405233117016076 00000000000000‰PNG  IHDRúS(Í@ pHYsÚk¥óÎtIMEÔ $DåÇ* IDATxÚìÝohW¾7ð¯. 3à€¨BQh 2[X‹Í‹(äB²‰b‘BëÝÂÖÙÂÖÞÀ“êÉ‹>J.äÚ]èF-´«”À;/‚U¸¡Ê‹,ò…k¡% $TFƒb˜øy1ÒH²þX¶×? lÍœ93s43¿9gÎ̸¿]F'Uàá|DDD´uF¹é›hïFµåàá}x""¢í@Q|ê_¶w7é॔U‡•ŽBØç?†*Ò*&)¹ñl„p[嫺ÅÛ8Ç”Uɲ%"Ú ÅÛ^so ø v _ÙL/«µ£±»…€¨:é-¬`@V’çÈüŠd@ÐèK€æ|^@¸„·iû""¢u‘P;– wsà€»qŒu¯Å·NT«‘¹…ã ª¼d"†W«´dµ–ø«¶/¸-m¦nqYQÌÿTD`¯5Î-›ïeUÂX’V­KÔ‡­cæ+ä²*·T>u%(/1Äo£ Ë@Àgµ¦XµúFË ÑfØj1i£ùÔ/‰Êª„ân‘7˜þjcgƒp-//Û½îË‹†uݺèuCBõЦ³†ÆõU«É ö_Õ:ƒÐ k¤ð)ö”-•`]/–ä BAŸµ‘K)­ËC öD´I¶ZLÚh>ÍUÀWË»´hàòõ\ã}Ù0`ðÔ& À€t[gŠWÔÚ $ê×a$¤uÀ®1 镵fÃ[*(.J˜ÜÞ¦´.™ø¼µU é`c>m†­“6šܵkòUÀ„Ï}ŠbŸLØ^ñ*PV†nT xµÚ7«iÁj&°NØûEKç*ݨ@€æóm­|öú `sƒ•ù“ï&sדö°ò¢‰+iÀôÅ1ø†”¶t¦ë'ocI"3›Cþ‡RÂïÓ?ÆÈ[®Óõ3¯õ(KHßÎaêâØºó(-Jø¼p[릸ûIѦp\lóùjE[Ÿ8²½!%*†„§~»™ÕÍú ½Zkóª°®«®dÖš „ۚί@m%6!Ï.—5½ivÍGÔóYÜ­‚õ| C"q5 Y51õ×óP² Ì|•lI·rº~ò–˜¼’‚®Wìq¥g:’Ÿg0ñ~¡¦`ß<]·yoÔäÕô†ó•UØ3¤)$;èѦxU1IS==çû𙾦|Ì_ZŸg§îöôȧÖ|/%Ì* *ŠÐÅ ô²c‡4 cÑ ,R‡¨«ÞÂc kºóŠæ|à–^T ÇÓ4!k+ñ°¤[` ù¨—Æãñ@iÚ÷ýwʧ²û–„ «u`L|šFeÉDò¯cÐö;ÿØŸ¬`;óE¢mººì½d¾Ëâ'Âmif¾ËA×+ðû5L¼…ºÛƒ©/gP(–póN¡ ¿cÞæ{PÄìt£mHÃØé0‚‡Ó×§™x/†›µtþ½ÆÏFáß§Úã öÇDçuë“!ŸWÀ¬šR^z"zõzÅ$¸TkÏSzÆ’•ù¬FʵåãÙå‚ù‹ T­ØÖ=ŸöyË% Å+¬@oÖjf&jç3Un«3žuqßÄÂcô®+°ðXª&dÕšÎî<€Ö|$<µ@$Pïñß²U¬)uwû ˆ¶ÛÓeyj…:À'¶R"ñYº^ÁÄqhšŠÎ§M¿çæ‹Hÿ3koþ¿žf¾PŒ@Ýc­oülòF±Sá®y¯ü¾P(!õõŒ=\×­VÄGc¬øm§›Ò•J:R·f‘¼Ð¹©~½¥Y‘ëôRJ/ï‰èÕë“ê±¢ «ÿÐZbÒjúÌG¯T ©Ö±Þ³«5ß®±­)Ž¸Ô®Ñ{”Æ™Eý,UëÚi}˜€ ýEÚžöÀª¿¨@7*¨7|KFUÀ¨]_X™¦j=JÂH>Ã4ä‹?·äÓ(ìÁm0ÉÏ2Пé€ùE ü]~àÎß³÷ò€ðÈ0âÑ2³YäæZÒè‹Vþþ=š=LSU$>Œ÷Ì{å÷Ù»V«Áø{1„°P,aúË æîæðÇZ& ðcòý8ŠE¤¾žAé¹TÌ߈ÿÙªÕgþžØXyÖ/MTMˆˆ^µ•±Ua×ä[TµÄ$¨¼lïæ-¥„¶Gí?Ÿª@å¥i7Õ×­ká<ÞNϺ`®úªµ[ìsÅ›ôŠÙrB¯˜0W4ƒ›/M·„Rk‚0_®¯û ói)ø5Ý—žë˜x?†ô·9ä, r<Øñdhåüêßõ²Ä#ÇG·DøhÐôݦYM·éJÏ­y¥¾žAªi|ñi©mšø™0à–—_Ö¿<ÝØ×ä¥ìß™ˆèUêÛì ßðÍÓ­“äòiYž•ûäSiE6Õò}+zÝ·iªÑ[÷8׃»´ƒ½^1Ñh¸õ@¸­Å¨OWŸÙÊ|~~Q§v _{ç…õåÓTÌ0«Vç¸z±+ú ·Õl<ãçbððãä‰dnf1s'±wN¶ÿ@ÕÞßemXs·zEQa¼¨àá³ üû¬“ˆò‹ 2ßæ9BÀ¯õ7¯_:¯ƒ|)Û¦QTuÕe67Ø2âq7~WÅ-ÚÒBDÔM·Ø4‡ÖÛzçûy!ýäÓ©cßþ=ªÕ®ËòtÓèW$®Ø3÷´]‡µ‚|kN¢¶€•¦fˆÕòiä%­kkÈgÿžÞ–ôÖ|ªVAj  ƒÙ`ü@9|¹=ó(üXDéY~mŲuiN÷û4”žé˜¹“CüôIäîæÛÒ  ÷"Ù;9ŒfnçP*•0{[âãzþ*óÒöiПé xð°kõiz “/­'/Ï: Î øë­ò²eHáíuD´)6Kºä³á^{l«ÇÚzà> µ-O‹Çn+Ћ¦éU´eXÁ·Q[ÙýJÂêLUkª0–$*R@‘bÕ|ôJÅίòÒ„n}ç³j¡ŠÖ|ŒZç/ÿÀÂSÙµ†»&MyDއ‘¾9ƒìw9ŒŸ‹uM×ü=<BúÙ …" …bÇ4‘#A,üTD©TBâJª%Iäh¨kÞmùŒ‘~¦#}3  Ñé/pÀ¿úò6 »äK‰ÉORü?±ù‡¬_°ô¼ YõÀ¨z¬ž÷DD¯ØFcI¯˜TïD·Ñ|´ÄÇæz+óÑ›¢Ë5zÈ2êÙ{„°_1Z‘Z»p ë!3îæ§ç¡öD@õ6ÆW¤ Õ-¡ŠZEùü¬W:æ#ܵ{ Wäc]§·î-ô ›îK_¯æçëú iŠK(>-Áÿš¯cºæï7|ˆÊ0²µš|øè0²Ù|ë48ÿÇ(æîæQ|T‚4%4MCøhƒ¾®y·ÏËx5ŒÜýôÀðA?"§Â«æÑ<,v*Œ™Û9HÓzJÓZŸ1( ¿f\–Ÿ— ©Ö Xýw&"z•6K“V˧~\=ŸŠivϧvé×´ï*“¨ß§ßù}ýõ­M·¡Õ€*`ÖÀcgf=Dµ…–+n_ÛJùÔ§ ½® ´X±Îçà&/×òk>þÇhÓ¼ÚÓušnøÍ†ßl<ô&ô›`[!b§ÂÀ©Öù5§ég^7¼h[Ÿ^Ó¬xÝÄ_Ç:.C?†¨P„@éy ú þxø°"Ú$NŒmïhU;kh*PüxÃg§Ö\ˆ¡[7ŸzPnàä›fæu¾‡~öy0R«Í,BQ5(^µå=DD¯’c[«ÖgǸ–——— åîéå2Š…<*µ{¹û¡iCös|·\>në½èJí9ë3ÿÖa¼äÆÿª…ªägïæPY´}~¨C=m*Gƶ‚µÁ®ååååÒóZ¤w xDíþæ¦æûŠQéò˜Ü΄W@UZki[- õÀ…çW`,q(7à×<T ÔÊ?w/cIÂï×  i^¥×žDDç¸ØVµšýM û1èþ½V¤oôµŽx;å#¢ö"Ÿ:CJ”jï©×—Ø9l}e*  ëU‹ÚPãõ³¥ç%ëÎ7 i|C<^Á—ÙmPý]ôfíѽ@#Я¨GI˜õGéU厨eU$€%ª[@«G~ð5« ‚Üv¢ô¼„Òó2ÊÏt(Šu EQ¬;-ª€äôDDëWm~š^ûñÔ åZü•ÇßIJUëV1Q5દý#Z)%*K€4­¦(ÀxÔ}A@x`zØOŽbGH"¢W¢þæ7”Y£²ë³ ‹cEéizv„ý¤¥ú7""zUFöZ­ÓnxM”X*DDD /©¨?0ç?XDDDÎe_…fÏg"""çažˆˆÈÁ艈ˆÌÝá?"""rÖ艈ˆlÍ~xäJO[oÅËÞÉBݳÙ;ٖᥧ% ¿ulÍ ¥îÙ¿®qkÉ¿ùã?pcïGÅ0Ö•_ö»,Tm?âïýaÇm@Ý~~§AüžDDÔÝš}ôDÙ»¹–a¹{yú‘»Ÿož½›CäDxK®xåÅÏö§XX@øD“%Ö•Wü½óÈ|} ™/ÿÁ-Šˆˆ¶”¦Ûë<}M;Aâÿ%1ñ§óö°Üý¦®Lcòb¢%ŸÜÝ>þk¢ï¼›õšf=ùõÊC(Œ‰cò£õ-+ª@ôTlÇnDÝʬ߲ÄïIDD­¹F £T*CJ€Õh´®ôÊ3öÞpíêÌ:&ð‡¦é6£jmŸ–ßp•õl6ÿ`ú㇈¿ÃÄ'Iî¡DDäZ^^^.<‘øú»—Çìí\ûl±Ñ1Œ‹#r"Œüý*Z¯’ýÅ!kº Pƒ„†q(䯿 ß^? h(?/±§ñ®”–ÛëfnßDþ~ñsqL~8EQQ^Աʾ! †QAþÁ<Ò_¥:Bìô(·…NeÅO´#÷y|g²ýÃb… H~’„:¤@ÒZ6'P|B##àò•$¬ÙwØÙë$)JÕz´±¬n‘ßÑ hŠ€R»#´PÊ@y (½°E–Ó©h»ÿÞ ûw(/I”øÂÁí³¿+ª+Ž øÎbúùûyDOÇàñ g(«€Ç+=Ãüý<ýм®d†”„µ¿¿þc’!àW¬ÿËK@úß@‰ÏíÙT†´>Å@®D@äuÀç(-òqÚÛ”@© ²e¿áU!—¸c9E£Fÿ¤ˆÑÑ8P*Ҁ͑+\Y2àq d¾Íp @k—U+ÈKÀ~ˆ’´·”_÷¡JŠü^ëÿì`¶˜¬½ÿªL™­V•±7Ÿð+ªٻwzélmÍûµQŠ‹€_„Ûzöüs~…Rs‚Æ®X hµ ó'`î1k[ÉÃ@ò8.à€æ•З€_ûäp«ľ1˜|$ ä—€aŸuYl䦿šEü[=·»Æíuµ/«²§Ú´~M뼓Õkó² ,<7j'xÖ8³VN€pךð«õr´RJÈ% á¨CÚÓÕ "ÍkM_(sEiOÏÏÖùT$0ußúÍ|öë…yBÖËVÚÇàP•XxnØýq¢§ÃHÜ*ð‡ÚæìPçfUBJÂí¬Jˆ*œS«o:‘U¦V­ž…r-x6ýÞ†aÕ֜ç­÷Ú‘° ¨ HHH)[¦“n Q+ß çãmt¼K?pèI¨Cè‹@î)~Íj*-¡Öǃ:Ù2û˜½Û  *Q(KŒìð)ü‘ÀÞ…»Ñ”-«fÓ™º„Ë£"óõ?0z6Ö2±Ë£bÙüõ;lôZŽ–qµ _ÿ_ìðùصyp xš®ÇI£Å«ÙCd­ÌdµÞœ.탃lªèFp›P}VþÍ' XùÌ?G­9xcT!0z®õ/@æ' ÿlûÖ>>øa qWn(Í Ìþ(~Íê˜g–%à_šÕÅVÙÇTŸp¯•¦~ &Ά0q=éwÙ„¿]¹›ÿ³›ìÝV@M×צ>FôôIû r;jò²©‰z§ÓkÍx„€§V.ú ½šU¨7 ‰N×]Mi•©p è/ ¨ªQ; ôÊdzËeMoš]óQk³Ë?Ýø-~ $[Æê| 0ñ;ÿÈ•¶g°O­oãK3%ú#Âç@Õ°Nª¹›uÞ÷Vìšêé™þá3½¯}¬žùËrËôênOÇ|PËǬ€.üŠ€¦((êì¿5Õè›60»fß8è½?†Ä•$’—-ÈêÖ80öZŽ–qM¹–uÞÁʆU>+C¸±híÜR‡¨«æ³ðX‡ðZÓ©»ûêls>pKÈÚ-œªÇeOëñx ¿4­ëˆU´äSoú-ê°Hë ø¼Vãé{•*8"Ü ÄßrMüB¯ Œ½e¥/@º ‘Ú?÷®Õ¬9}O"^KWZ¦ç¥}‹Y?i |@ þf÷y@$`¥QÜVóøô¼Dëó€¹sÖ/xòzë í½Ò¬¶žëñpÑ ô· S «VOmVî«ç$úÚÇìýj— æ/V ­ÇãéšOË<šŽ ~E@ñ È%> a;³;ã‰Zç™zP”²v=[Z5­øÙ(r÷ò(=)AJÓ^ÿ_/럈£j8ùû(ô²nkþ:´ó(øø¨@Ð'ZÊ&šÒù‡€‰‘µ¥ í˜ø]û¼CMi^ÿm­¯‚¿Ä÷¸sdåºwIÓ×z®ãc,5'vÈë¦mßXMŸû˜^iÔÀ=»<-A¾ë¾Zm=T–¶o¹R+;Ð{†ª•ÏšöUpBû˜@ÎÐõ*µY¿ç¼HM) €ë@î~#o Ûà w/ä' ˜U‰ð‘“{ò›„G†1{'‹èér÷ó;·þ¾?†Üÿä0úN ¦”«æ>¶‚RÓò@ön¹g`V%ο?†›7f­qm·¤Pcg¯ïÒBÀê˜À\q 0è³å:¢^1ÛoõyiBìj¼RÁìpÀéG=Ÿ:á*ý Ýh:¤vÏË?dýž7`J‰éyÈA¡æÃ¤%yÏ@EJÌ=ø¸V’kI¨µœ~|¼1¾FšúòÌ=•@U"ôE—2ëãv¶æ4kYϵPkA¬ ^$뾯dŸ Öo‘³·×þ÷1èØ’Ó+k‰úa¶qÃmwk~Mmâ⦮L· 7 Ãî¨'„€at¾¦:B~~RJþ]ÀØ£(üT„\’Èÿ»€ÐH¨¯üºm‹”!«Æèó9óé~Wm yµæ;Z‚Õt^?¤Hèëpaý­Oé±›ØíZ:çóó‹ ôJzÅlúTðó‹ŠuE>õÖEMÁ†›î˵ÍèPS^šW uÚ‡áÍòõï>wÓÁoE}±Öä/»4ƒ®–¦Ëé¶"Ðuyº6ÍWט¦Ÿõ\ǧþp#ã¥aoOü´ºícöoÒüè{бcßþ=j×}µy›ocu5÷;÷ù4„Ž„póÖLëAIQ¬‡1x¤”P”Î÷_ !àÝô7ß@ñª õeƒ;¸÷›_Ûò )0+P†T»ƒ ­¦v©¦v ”¨íäûàái«ÛÕƒ}ó–$jkºÆýî+ó±6Ý=,é-ùT¤õ,î‘}ÀÂó­iî‰ÄèoÆG$¾3 LUôGÄn”Xõ¬aÉ{@ü-«lŠåö^ë®­®%Mq ‰ï dŸ c‡Ãzšðk@ÉÈœU`H üE¹%Ç-`¢÷uñæ4kYÏ~ ·uíôÅ ´}>.zícËvíûX}_­þáZÛ>Öà­ ÏÖO'Y× fãŒ!v&Þ2,|4„Ùïæ0z&†ÜÝÂGC]§ !ýEc`ÕòS_¤1þ§±uå×’÷ñ02ÿœÅøcH}žæ/ÜÑ8‰’hàëµ+ˆÃ¾íne“·*¬“±úÓ¸Œ%‰ŠÖ—:ä³êâˆÖ|J†õ îðAÔüÆn±»6/>hõ²ŸûcëÉãôýÆÁÒó®V9(9ØXêÔ¼1ð@Ÿž70uJAò„‚dÓøÜSàü·å¶4uÙG²é·/ðýŸäžço—Ûæ×)ÍZÖ³_‘ƒÖ-”ŧ%Ȫ@¥êa ï¢Ó¾Ñ«ËÊ}cµ}Ìê”'íÿëyw˰úéð¹β®@/„ÀØ{c˜¼Ð¸Õ.qqãšDâÒeŒüv©¿%»N>ÂôßRv3}hÄú>ZW~Í&1öç dŽÌ qáÂmÕ2W惪„!­{z#fÿ½þ–cÉDôºD⨂ðëÖúÔ}¹G|sLLÞÆ(ðÕn‰»g ÿ¤Ã¼«æêÃz¤ÉþM¡ß( IDATdý±æeH ÷H"yW·dö'ª°–G¸­ ?Õ4>q×@ò„E·ì8¿NiÖ´ž}QÆF¬“‘âã2¯ª€½-P«î«íc-—†ÜÓì’¬ëó¨_]ªÿ^>þHи¾Çƒp~~¼Ð6,z:‚èéˆý]QTdnõWƒ´ä ÚæÑ+¿•i›¿ ¯@æzª1îT¤ërlç‡ÿ ”ÝùGZÉtbÅ£2ë±A0k«!°þ*[Q{N{³ñ òÑ Å'0yTAîI¥åö­µ2–LLÞY½ƒ`öQÙGÝÞ¡ÿ*­:¬Ÿ4ý©‚ìO½ƒkæ‡ 2?tN“{TAèQï黥Ym=×b∠¿"P|ZBñ©ßk~p7ënëìc²éº<3í4MÞÚZ 뤻¶.ÍëW_gêpªáßcøìÔš§ ìvÀ`ò)ª×zKú¬†øu+‰[JôMÆ~kÕæóóE(Šb=ŒÅ-^ùÓø¶«­´‘sñ!°„Š»éZuSÏÛH4ŠÐÈJ ¨¼(õŸºÇ£ªµ×h*ŸÜëA1!Ì»&¿Õ± ó÷ûµyvWí Ÿ¾Ci P}*P%Á#M[m³ð÷rš–¦{á+î´ô8´S†p 6Ý×wöjÓ­‹¢ö†ƒÚ–¡jh"³êï;?[@¨Ѩr*Ÿ‡e ᳞7÷'?fÿm u¿‚‡/ø;núv³ ô`â¸í…H³wr(/ðïõCÝ#jÏe`ÓKÏrÜ*ûXý6ۖ˼Fïv W½J­·e·Û\uÅú¸këL+ÊIBº½p…[@ìѰ®’jy¯À`ò‘Uëå6àˆ¾© ú¦‚’!‘{b¬Š:Ë«¢yð+¡×Dã=OKÈÝ/XOôiÖ‹Rêï’`³pO[eãmuÎÕ~^xìçÇ;ªù¦é)SÍëJh= ª=‹^nñß¾ð\¢øðû4¯Õ#ì7l¡Ùlŧ%—±ðD‡êP|<»A~«¼ôŠÖpXù?m{@ï­ß -ì¾)Ôû²¶NÂí±.QHÉg9×èõ:À¶ÛÑ%ŠO˜· u7ZžÊFƒW‘FE”¥²õ\!<ðø€0„ÇzðRU0Xm¦{U±ï¹B4ÞMïvm^ØßUUð²VŸº¿Ýk]õ R{q‘ÉWjnJ™×:qŠ]ªÁ»kìÉ;Áøo›îRâ±r{iºÙôþ½þXPv6ÉœЄ“º¯³ïÅæ3Wü¥íN—­ï á±rûˆÆ0y©ñ<;Ð+>? £ Uå‹`vŠååeõÅår±6I>7·îiÁá¶a¼[’ˆˆh‹ 5žrØMý½µN¯ó÷ó]“ÑRï''ݵ×w ørÉèùºk€žˆˆhkêä].–—M«_ä’Õ/¦×íâÿÁ’$""Úú\.OËß~1Ðmq+ƒ»k—Ú÷´ ôDDD[X·¼ËÓ_°g '""Ú¢V«¹«ÚþUó`g<""¢-jù— àkõËf†QY5Ö艈ˆŒžˆˆÈÁ艈ˆŒ×艈ˆ¶¢jíi=$§ÃxáõðÉxDDDÛp Èúëž«°Ÿgß ¯Òy\k2"""ÚJæçóË‹žˆˆh+yž\ÿ´ÁÙ¶A ôDDD[ÌȹÉ5¥Ÿ¿1Õu=mˆõf%E´¾F± †)MÑz<Í> €¦ciUe`,–köºc § ÂáRZA¿FVkßÝ€¬²œˆˆÖLX’€0x`ûæcjÇWÞGOëW•Ò„aTPzZÂü|¹û9ÌÏça,êÚü*=B›™R"qé2‚o… ù÷#t$„kŸ¥úž^Û·ëUY4¶ýO3ˆrļ6s9ˆœ­^£—kž’žÖ·ÉI SJȪDñQùù<ôE²6Ü\’ÐËeT– ˜Uë{?Î4 ß^ò÷rÐK?cîNÆ’Dòêô¦­[èh˜?0mak ölº§u1u(ŠŠ‡Å"ŠŠð¿æGè­(Šõ¦%Y•0+Ðuá\ªÀ#´ÖëøäîæpíÓ)x„•NUŒ¿?†Ðñ0&6gÝŒí_£'"'’}5Õ¯Ä=­‹®—7PzZ‚æó!42mß~xv«ðìV¡ª|¯ù!ÜÖS›ôeTäêg¡Ú^ ©Mõê‚baÁþn.ˆ¿‡æßèÙx×Ö‚^éÌ%‰±÷þÿC9†…‹ÖükMͽšœ „Oœ„æß@p™[7»¦û. Í¿š?ÂÇObáAaÕ|B#!èÏË€Òó2BGB«®OÅ0=Gàð02·f».OsÞ,BÛ· k™JK„Zò«Ï«Òtò£íÛô—i„ŽkË¿×r°Ÿè×Á@O뢗ux„€\’І4(CZÇt²jnÀ0*}4ßÿã³kÈÜžAð­—˜»›ÃÃb±%Mâ“)|ü“ÐÿŒØïOâò•Î÷œöJ—ø$‰è™(JŇøøÂÎxÞZ¯g?·üíäüG“˜øpúã‡H\L ñI÷{^ÿðÁyL}’„^úãüGã«æ>Fî^¿—C¸v)¡×ú$¯$>F±°€…º.ÏÈÑ0r÷­¼s÷óB ßz0Gî_Móº”Dì÷'¡?þñÑxÛ:*ªŠïï̵åßk9z•)½: ô´næ’„½›â¯ )M˜K²¯[í 0ŸGúË|CÒ_§q,r3·³všìÝ,ùý€ˆœˆ`în®c^½Òåîfqòxp'OE¿÷}ßë¿÷=NžˆnøéhϘ‘ߎ {7‡üýy„†í Ú+ŸpK0nß^듽›C<ÜÀdí¤¥“ðÑ0r÷òvÞcïŽ!Wô÷æíyåîå=µæu<ŒÜŠ2ŽœˆÀãʼ¿å ¢ÍÃkô´.EAY×qè`ŠªvM§YédU¿ôŸÿp0ˆá`ç?ÇB¡€±Æ;‹4ÿêÍÀ½Ò• cÕþÝT é¯Ó(>*¡Ø£ö é/Rûã8bïÄ!Üs³38t8Ð3Ÿ‘‘Æ?šª@þÁ®}vmÕõ1 êÐ|¾®Ë aòÂ$L)Qøwé/RIÃ\’È?ÈãŸ_³ó«rmý:ùµ,mÖèi]üûü(=/Á§i^T%Ì_Ì–O]é¹áϪùÃ\q-øp°%Ð(нô3ôgO'½Ò)^e]Z ~6)%âg¢øÇ×éžiUEÁì·èÆÔ•$bïÄWÍÇ#H|’@à`Àî˜Øk}|C>û¶À^·z¼×üHFð TEAð ¦?O!øFÀàŠ¢Ø}L)¡(J_eÓïrÑæa §uñû4 j½xAJÙ±ùÚXÔ‘»›Céiª¢X'«ˆ#õe¥§% Ú¨õÆOGí4áãa<|\ª@æÛYDNÅ:æÕ+]øx­y¼ju˜ iêXæFK糕ŠOJˆžŠbd$„ôLÏõ 9†¹ï¬ËÂÛZ3î•ÏÉ£a¤¯ßÄɦ[ýz­ÏÉãadnf€*0½ÊsÂGÃH}‘F¸ÖÉ/t$„ôWi„„[ÒÌÞ™ªVs|øx·®e9ˆhs0ÐÓú@`Ã@î^ùy”ž!— ”Ÿ—0ÿ¯f¾ÅÂ(^šO[õz>$.&ŸÏÛ½ÑCGÃ(•ËH~’°Ó$/Y×´û‘þ2…Ô§ŸñÜ+]òRé/ÓÐìÇå«Ó¸öYc\äx‡‚Ã]—ñÚ§SøÃç1<¡×ü=×çÚ§S¸|uš?þðÁy»i|µ|ê×ÊÃM¾×ú||1ùò !øV°ç2…†a†Ý›?|$)eÛ¼ffç ØÙo3H^JôµYôZöº'úu¸–——— O$‚¯ Fªª±Tvˆååe@ቄ&ôuå¡?/cáÇ”a,U¬æp7 ܯMÓàÝÀ>?<}6ÿѯO—‚¯['ç‡Þ™FñÆä/‘Í“ÿfÄz©Í£<0¤Cõþ.²ñnúÅ À([·Ë‹S³ÿ`“—R´¦cg<ÚÍçCÈ‚æÓ —u«iºjBÔ!ü{ýði*<‚Ažˆè×À@OÞ‚TE ²<ˆˆ¶^£'""r0z"""c '""r0z"""c '""r0z"""c '""r0z"""c '""r0z"""c '""r0z"""ãKmhM&.ðU•DÛUææ ÊÏK,ˆ†žÖlúê ˆh›` §uñíõ³ˆ¶Öäw.^£'""r0z"""c '""r0z"""c §‘Kç?<MÓàÚåÂþûqù¿.·¤q¹\ŸïZóÌÞÉBÝ£BJÙ9AÐ4 7oÝìkž¯bˆˆ…ž&þ^þ}~”—°üË2, R© q1a§Y^^þÕ—3r*ÿ^?272ǧo¤¡**FÏŽö•ßVX'"¢nèi`²w²ÿó8„WEAâB©¯R[nY“Ÿ$qùêåŽã¦¯N#q)Á”ˆžÆÿšÉ+É–aʂʋŠý}e“wê‹Ô=*Ô=*²w²ÈÝÍÙMÿ³·g[Ò¦¯§áÙíAèHÆ¢Ñq ÃÀÉÈI¸v¹pì?Á0:§‹œŠ@ñ*ÈÞɶ ¯=;ŠÂ ‡áÚ傦iH•î˜WÛ:ý=m_û:‹Ž…u\6—Ë…é¿MãPà7$"(z˜Ì­ nÞ¸ MÓpþÃó˜½=‹âOÅžÓ,B/éHžÆäÅIÌÿ0Òãfþ9ƒØÛ±–´ó÷çQyQA|4ŽÉ.â¼0‰©«SX6—1zf´å²ÁJ‰K $¯¶ž˜$¯&íÚ|ü\‰‹ ˜/M$¯$»Îs¥R©ÔqÆ?ÇèÙQ,›Ë{w “µæ§( òóynHD4P®åååå‰àë†Q†ªj,•¢~m¹ðDBz_ÓL\˜ÄôÕ©žOÆ›ÿßyäîåìO曌}½ÛårÙóu¹\¨¼¨@R€*àÚå‚ùÒ´›þW¦ÕŸéðíõA.Iøø¡ëz[:MÓ ?Ó·UƒØé:9tø2×3þ&ˆÂÄÏÅñ°ø°=amùš—§Ûÿ•JŠ¢´S÷¨ÐK:„W@J mŸf·v¸\­ëN4håç%øöúû~Bž.5_·¶ÇCïL£xƒï¹Ø,ùoF0rnx”†T`ÈW#*€ª­c‡Q.еãVàÔ,Æ?Ç䥂­éX£§ùí>þ?ãûÿù ó ˜¸0Ñ5­2dÄúØ{:ß^Ÿ¦¼X\.õË—ËuŠr¹ÜsY“—’öå†ä•d˵ycÑ@âR±h ûìï{ýëA~%cѰ×OÑvùAžˆ^z˜N·¬ß v½N¾Võ m|>_Ç4Ê‚å_–±¼Üøô=EñqóÿšG±Xléi>†”cïŽaîÎ܆—_R —¬ò‘K²q’CDô 1ÐÓÀÄNÅ0ýßÓ(=)U«;ý÷iŒHþÉ+I  dnd;ë˜&r"‚â£"PÒ×Ó„VÏ÷RÑ3ѶžöÅŸŠˆÆ:Bêóß99AæV¨³wf9áFCD¯= LòJ¹û9 ¿eõT÷üПé˜út0¯µõûýð¨dïf1u¥sž©OS8ÿÑy¸<.L:ôõôªùFÏD µÝ7Ÿù&ƒØ™ü~?ü6þ¶¾Ô§)ܼu. ™¤>Ûz·‘óð5µ40>ŸßÿÏ÷=Ó47¥¯lV_íûÄ_&0ñ—‰žy*CʪËÐÉÌìLÛ°è™(¢g¢-ó_m=z­ƒ2¤àûÜ÷«– Ñ ±FODDä` ôDDDÆ@OÛ›¶‰ˆÖ‡žˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁèi öØo½Ì¦ÉìíY¸\.ÌÞžm^zRZÓk_ë\.׺ÆÍÞž…k— ±hlÝëçr¹º~Ökå+t7’Q7 ô4£gF‘ý.Û2,û]7ÈÝ͵ Ÿ½3‹èéè¦-[ìífþ9ƒ™ά;•¯½í÷5¸½ÚæAD4h ô4±h ³wZkî¹»9L]™Bönû @ì÷±Í[¸*¬‹-ö 'cÑà†CD¯= Dð7A”— ¥”žZÍø‘SÖ;×ËÏ­fj¹$ñðLJùÝ+Ø ƒk— Çþó £ü\.¦ÿ6CCmó«O§ªjÏWÑÖ›Ãë×;¿^ ÃÀÉÈÉŽyÖ/¸v¹pèð!Ìÿk¾ãruú?õ÷´}\»Z/FcÝSO±ÉŸˆzb §‰œˆØÍôÙﲈœ°‚|ôTsßÍYÃïf>¶§ÿh£gG±l.cìÝ1L~4Ù’§¢(ÈÏçÛæ5ya‘T^TPxPèºLÍMí™_/“&1uu Ëæ2FÏŒ"q1a‹½õϮaù—e$?I"þn¼ãruR*•Pz\ÂÌ?g{;Ö2¿Ñ³£Ðu… Üðˆ¨'z˜èé¨Ý|Ÿ»›³}äTÄn¾ÏÞÉ"vª´²ße?ÜÖô3wZ¯£ÇÏÄ¡(JÛ¼æ¾›ÃØ»c€-u5ë_/swæ8Ü@ìt 3·y†„‘½“µËãçÇ?÷oâRBë²Cµu~ñ³q!¼”ä†GD=1ÐÓÀ„†­ÚpÈÏçíš{øˆ5\J‰Ü½Æ `5¥ ¯!Ú®[×Ç­T^,C²²o¯¯ïe\ïüz)—ËVó¼ËuÚÒ›~æŸ3RâäïOBUU~è¿Þí„£¼X¶—s-ëND;= ŽƒˆÆpèð!!ìáá#aÄGãðð·SeH\²®ëË%iïÕø†|v@]y›Z/ëßjy.ÿ²Ü±'¾2¤àûÜ÷0_š¸öù5„O„7>?E±û¬e݉hgb §ŠŽaöÛÙ–Z;œSW§¿Ÿ‡æ×ZëjÖ;¿Õò<ÿÑy¸<.L:Ýr@æz‰K ë=µûù뢧¢P5uÍó›º2…™ÙhûÖ¶îD´3m±;‹i»BÀ4ͶáŠb5o· ¯5mw²²Gzówá˜ËÎÙßGÏŽv]¦NMéý̯Ÿüì<ÿ§sž#¿ÁÃâÃŽãffgºæÛkÝ•!ùûÖÆ¢±æÎƒD´³°FO´Í¨ªŠÜݤ”H^M"|4ÌB!¢®艶™Ôç)Äߋóۃ¿ H}žb¡QWlº'ÚfFÏŽö¼TADÔŒ5z"""c '""r0z"""c '""r0z"""c '""r0z"""c §q¹\[f~rIâü‡ç¡i\»\Ø`?.ÿ×eþHD´ã0Г#ÅߋÿÏÒã–YÆÂƒT*$.&X8D´£0Г#eïd1þçq¯`½T'q!ÔW|\,í, ô´)ŒEÇÂÇàÚå±ÿ<Öò^vÃ0‹Æàñx°ÿÀ~~(Øã ?0†k— š¦!ýUº¯ùù_󷽫]RPyQ±¿»\.¤¾HAÝ£BÝ£"{'‹ÜÝœÝÜ?{{¶¯åXy ¡ù»aXë­ª*ROmúå ""zÚãcôì(–ÍeŒ½;†É&íq“&?‡ùÒÄÔ•)ÄÏÅíqñsq$.&`¾4‘¼’Ää…ɾ旹•ÁÍ7¡iÎx³·gQü©Ø–®øczIGúó4&/Nbþ‡y”—0óÏÄÞŽmx9&/Lbôì(t]GáÇ7"Ú˜êÚ'q-///žH_0Œ2TUcAîõwœžHhBïkš‰ “˜¾:ß^ûÆäru}§»ºG…^Ò!¼RJhû4»v­iJ¥„«nà®]yôš_ÝüÿÎ#w/g2ßdì¸\.T^T  )vÞæKÓnîïšÿ*ËÑü]Ó4”— ¼åçehû´¾ß{O4Håç%øöúQ~^ê+½.5_·ö…CïL£xcÒÉų¥ä¿ÁȹIàQR!_mŒdíï¢uü4Êe@±ø85‹ñÆ1y)…àAk:¾½Ž6…±hØTc±Ñt_^,w òÆ¢©Ï¦Pü©ˆBaí5â‘ߎ`ä·#øøÿ|ŒÂDNGZÞü¦ )hÞêË8¨å(/–í<}{}܈hÓ±éž6…2¤@.IÖ­ov€…ÕQ®[sTøDRJŒ½;†¹;s}ÏOÝ£BJÙ2,øf°¥oÀZô»Í'0õu«Ï³\;ó&"ÚL ô´)"'"ÈÜÊU`öÎ,"'"-ã²w³Ö¸Û³Ø`¿=®øSñÑ8BGBH}ÞùØ©¦ÿ{¥'% jàé¿OcìÜØº–¿çr¸­å–R"ñIëí{±Ó1¤¯§*Ú:mz(—ËÕö€Ô§)ܼu. ™¤>kËÔ§)Lÿm. ‰‹ ÌÜš±Çe¾É v&¿ßÿßË‘¼’Dî~ÃoY=åý?ôg:¦>Z×zõZŽzÇ=MÓ<l7ue 3³3Ðöi„¸Ѧã5z˜^Ì”!ßç¾ï>î:‹ž‰"z&jŸøËD_óóù|]óì6}¯ï½–#z:Šå_iÇþ8Ö²nùûyV«‚¢(ÜPˆhS±FOô ©ªŠÜݤ”H^M"|4ÌB!¢MÅ@Oô ¥>O!þ^žÝþ]XS?"¢A`Ó=Ñ+4zv´åv>"¢ÍÆ=‘ƒ1Ð9=‘ƒ1Ð9=‘ƒ1Ð9=‘ƒ1ÐÓ†eïd;¾-ÎVµÞË~óÖÍ®yÔŸ‰¿ò""ÚzÚ°È©ü{ýÈÜÈtŸ¾‘†ª¨}?8¦×3쉈hmèi ’Ÿ$qùêåŽã¦¯N#q)ÁB""ú0ÐÓ@DNE xdïd[†×¿žEᇆƒÖkc5MCú«tǼV6ã§þž‚¶Oƒk— ³·gíqÆ¢cácpíráØƒa-ÓMÿm‡‡øãÑŽÆ@O“¸”@òj²eXòjÒ®ÍÇÏÅ‘¸˜€ùÒDòJ“&ûÊ·T*¡ô¸d¿÷½nü£qŒžŲ¹Œ±wÇ0ùQk~Š¢ ?ŸçCD;= Lôt†a ðCPø¡cѰ¯Í?,>DôLBŒk©÷’¸”€ÑÓQ Úžý.‹øÙ8à¶æ=sg¦eºø™8ßÿND;= TòRÉ+V­>y%ÙrmÞX4¸”@,Ãþûûγ[°6 ¯!`,¶ž8ÔÇíd ô4PÑ3Q1ÿ¯y‹Å–žöáaH)1öîæîÌmx^ʹdÝÒ'—$”!ÖÞ‰ˆVb §K^J"z&ÚÖÓ¾øSñÑ8BGBH}žÚð|"'"ÈÜÊU`öÎ,"'",|"¢èià¢g¢„Úî›Ï|“AìL ~¿þþ Ï'õi 7oÝ„ËãBæF©ÏR۵Ȉˆ^7‹€^…™Ù™¶aÑ3QDÏDíï™°ÿo~HN·ÿW~W†|Ÿû¾ãüùÐ"" kôDDDÆ@ODDä` ôDDDÆ@ODDä` ôDDDÆ@ODDä` ôDDDÆ@ODDä` ôDDDÆ@ODDä` ô40.—«åãÙíÁÉÈI”ž–Öm = Ôòò²ýÑŸé„;cÁýJèé•Q@ñI‘…ADô+a §WF.ILÿ÷4’—’ö°Â ‡áÚ傦iH•¶Ç‹Ž…AUU¤¯§Y€DDÀ@Oµò}âRÊbŸ‹#q1ó¥‰ä•$&/LÚã&/L"r"‚Ê‹  ,L"¢` §j¾Fo¾4qíók¸|å²=þañ!¢g¢B`ìÜ ðÇÍ}7‡±wÇ7¸˜`a €›E@¯Šð Œÿqç?dó ùP.—áóY‰ˆvªÈ_>^ó4ó7:÷mb §WÆ0 $¯$?·‡*"ýUþ×ümÍó±Ó1¤¯§ññ_?FòJ’HD;Vöo—×\£/KœjÏ‹žªù!7Ê‚ø™8¦>²‡e¾É v&†Êb‰K­~êêboÇ }®aúê4RO±@‰hGZO^ež^µåååUÓDÏD=µ¿OüeÂþ_xæ²sö÷ѳ£,T"Ú‘ÖS£ç5z""¢m‚×艈ˆŒ×艈ˆŒ×艈ˆŒ×艈ˆŒ×èéWwóÛ h øYÛ¯Ñ9¯Ñ9¯Ñ9¯Ñ9h#¥ IDAT¯ÑÓ–ûX×q™~ß×ôý¤#"r:^£§-‹šˆhTàQRûÚ»díïb`Ô^é],>ìšÓ°0‰ˆˆœ‹ž6•¹$1u5øè1L|GéI±e|þ~cïDüícXx0o¯,H~2‰øè1$?™„¹d°0‰ˆúÀ¦{¨n×éëMú7o¥>r“%‘õϧ1ýé?ìt¥ç%\ûrÅBÓÿ°§Ë|Bh$ŒÄÅ)äçsHßHáüŸ>v~m= Ôj×èä1öî8àB#a„FÂ-㣧âð¸†ßi^ø÷ÆÞŸÜ@ð­Ò×SÀŸXÞDD«aÓ=m*Ã0·è:ÞãíÀALô9ÑNÇ@OÓÏÃr<^‰KS}Mßü]U$>¹ÆB&"Z#6Ý9=‘ƒ1Ð9=‘ƒ1Ð9{ÝÓºŒž ³ˆ¶‘òó a‡bžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆŒžˆˆÈÁ艈ˆÌÍ" õ(?/±ˆˆ¶zZ“ÌÍÑ6Â@Okš<ÑöÂkôDDDÆ@ODDä` ôDDDÆ@ODDä` ôDDDÆ@ODDä` ôDDDÆ@ODDä` ôDDDÆ@ODDä` ôDDDÆ@ODDä` ôDDDÆ·×ц™U@u§îAžAíIUÀÜÁÛ’Ç.Sn—[j»¤í¿9­‡)%dí *Ü€GˆÆ°jcœ£Te‡½H@º!vb(¢‡!Üq2z¨Œ ¾1én@â"Ž#ÄÛ·#DŒÁã|àoWEp]·ëXjk*€Ñ},£ílcIórtó’8<×=1™Ý8‰xFõì:‡\@ÆAí• QŸbp{º±Íë±|Ú`ò»ít,ßÂÆ’æåÈæ%qx µ1²-ÏC¼mSí<¦ã¡šáV r{w¿ræºð˼«º5~ÒÎT‰V §}K$âå<&¥D´s·4àXjAïè‡óŽÚƒ> BÉÕB>©íèCå€ó2–B\¿ŽÛŸÞ†Ë”š;–1ü²Å7/bjj nipuÿa›—Äá=1Rjaz1ðÛ¼ßÀõ?Õ!Û– º[ÛÚF];YÅìéÙ==lŸÈX$K$WK²7Uq¶£—úç)žW¹±”ÀÈúÎK½Ðl6›Xûbb+D¹ìcå“ÇȶDóÛ&êï_Ãõ?]Cå…IT*T^¨ ‚çÌö¨ó’8< '†"N=¥µóÀ̃%Ö~ÍÅió›&ü²+ï^ë#¼…X»»†ÆW¨ÿ¥Ž…_-쯇¬Ã2»Î2ap“X‡q©wPÿn[U:ßúIÕî2ÑñôI¬¼É÷0–=祔¸ýʼnD´"x.@øhÞ_ÇúÆ\|ÂÃÜËg°öÅ*šß„X½ÓD³Ù€W*ãܹ³pKûXXŽz^‡ôÄPØ»ÐlçóÖ¡Ê” ÀK¼¯WçþQÓSÓ¸öþ5üöÝ«xû·÷ÏÍìèÙý³\,ü Dm‰ µÏë‡3‰8y ž¤$FÔ–à{”«½æek+Ä­¿ÞÀìË5TOL1†Æ— ¬ml`ã¿7EHÏã˜}¹† 0}| Œá–Àʧk`Ÿx˜{enÝç%qx gÆÓ8Ñíq,{ÍË@å… j33à܃7á#Tž¯`ꇓ¨<Àó8ø„‡0lÀ8ƒ?Áá—9ššni^‡ÚÑCal¡€V=g»t¥~Þƒ°*<€â$FE[!`öô,Vï¬âÆG70÷Ê,XÁAïÙç'qåwW0÷Óَ׿¾¿9ú{/>0­ûÏËÀc)»·;Bü£Ïö|/|ðuÏsÒ÷ìߣ-oâñ©°SóÅ0»Ð^óRnK4¾jÀ+û`Ž2ÏUÀ¸‡êLáÃRFêšR‚Op.\—¡)šˆ„€ÇÝ®‹°gŸŸÌ¿à×þp ³§kõyÐy*¶„î×÷3/‰Ã zb(â¸ÇCX«ínž^ë݆Nrâ:.îýý~ûï¿EÇmå!Í9GùHÕ™jÇeë©£vºÖáä7jái’×ôØu÷—>t{Ûþ£Rß÷è{=·zª†Æ—룛KÉàãò(ó2|bíî**•*ü#JàûeHbøå²²Ý ÈpT†½ðA› !áòÞói³‘ êÕÏVqñÍ‹Àï® 6 °džÖ^šÅÚ½µïm^‡ôÄP(U Ì9ÿG²DBbw;¼9¯ðçç_?s¯ÎA0 ±ñnÿçM4›Í®‚~þÜ<®¿wo½ùÖã½oKµžS³§öõ!v¡¹‡°v@˽?¢ÅÊ0ít;GñXBɲ¸oÖ9.8/@¶¥Ö­Aˆ|‡ǹÒ$ê^€V["z"lµÐ Cˆv ™ ¾è¨®áÊï®à›°ùåè4JBˆïu^‡²ÑCÑk’+ÀÒíÐÎVÚ 8=1±~ pKür€àh€Ês¼qOå+—mÎýTívÂÍŽ= )~¹€Éã“XøÅ¤Î-_;]3ç4¾ÜÀde@"ѼßP;².÷°ëý?êX>;½ó¯Îczj·>¾•{ïÙàÙ®ÿŒ.÷;²±ÀJ•ãSX»×@¸%Eb+DÔj!Üj!l5Ñll qÍf6Ñ C´Z!–@¼-1sb¦ÏœÎ¿V;U5ó¼ßütžNV”y`²2Ùûضé¼$$艡°w¹ÝÝ€yèîé;¦òÓNQ¼¤Rwö‹o¾…ßþûÕ®ï-ýþ ß¼ˆÍuœ™­áÊ®j3UÜ»«Ô¡k÷ÖÀ3êѵ»k¨ìÔæìûήl=ì­kHKP<ò”pîö“³ôîj'«X¿·†õµ¬O–0JmÉ_ßß]ߊB>‘>–…ÏÅw1=5/7°zg ×ÿXGøP ÑÜDóÁ&°‰–Ñü¦‰°"|(°úÙn~¼‚æƒ&\×CujzèïK¯ù7èq›ÚT²i™LŠÇ.ýþÊHç%qx AO EÜÍ~šä“•tü˜ã¤îÒN“žgÚP¯»àyž24uiPÿWôƒxíÞzîu™(»© 0ó/5¬|¶ ™Ó3U¬þýd¢Î›uk÷ÖÔ9w×0=Sí¼^"ó÷»Û¸ìFŸÝ{×qâPvän?fŒî¬âÌÜYH ¿<Ÿ»~¯ßGÙ¿½ŒË0ó’9YE@Îêªcù£[X¼tWÿßX|ç:.^ºŠ¥w¯ãÖÇ7áº@å…ÀØ¿%z÷}·×{Í¿aëvìêÕÑÎKâÐ@6zb8z<„ûÕN7ÞåÖ¿ùßÒsí?b3SSoi•&µ{Ûç_?ÅK‹¨PϽ.„ÀtaG&¥ÄÔ§°ty Q;ÂÆ?6°ty Ë/#z¨ÿ~qio»¡!„S§Ó¢DÇÆ±pdÕëv雨à%Ãï?ãužÓë÷G¤cÕk\q^ÊD z1øG}„aß÷áq^ò0õb€l¢\ö ¶"5ûbÀWÅwú̓^ïí6ÿ†=®ç±#\4‡ôÄPô|襻 Çí~!5©õNö~‰õáû>¦NLáæ­›¹×9çXùd¥cÆ»®‹àX€[7n¡ò\ÊsÔ?ª«¿]·÷=îe\úˬ˜MlgÆKUØ#Êd¶›àäáÞç!Š¢ŽszýþÈÔÍ©Cgü¡Š}?3‡¡\ömK”ˆ"¡Gã«M•^ç¾w] ^rÑÇ®+«wWss­×üëø <®ë±IÜsn’êþé†T÷ÄPȤÿßæ¡cÿ˜÷P°ÏJ++\¾êVlŸ“²Ó¥]ëï…ŸÍãÖßnå^¯ÎL£yHbÜþÏ›Xøå‚yoúÄ4êÕ1}bÚü}ëã¨ê¿{ÞÇ ã0»ìBGfßå˜Ú©šrÂK$꺞?§ð{ô0™}Þþ¼—¡ç¥¹†„[â`0yÌG”áõñÁJ8÷µŠ?û‰wbµ½ï5¬¿Wï¬béE,]^hþ :O ŠÂÞǾ~a´ó’84ÐŽžŽ^ñº:Û;–ýž“Û÷Á“ ù\ÈPlÚèÚ•»–Ã0÷Ê®þ¯«æõ…_žÇÒå%lücÁ‘o¿ó¶yoêÄêªcjj ñ055…úŸ€Ê‰©Ž{°ïKÕ:l\ú!tVéÓÅHÄúÿGeúDµëëkw?œÿå/-âæß–q!µÑ[»êô÷Ú¿Ìàdzg°vçó‚ÜqOâ!Ú w C«îÝ1@öÉp˜Ô9U³ã‚9z<†TÝ÷š—*Oõi4@ NìÛù7êyIHÐC‘ªA™È‚‡}Wû<€r¹ qG`ñÒâà2ñêܦÔâ÷ž»¿4©“—=‘óÏÆ²§½õ°â°|1¤dx3Hq^2Æ0ù|Ù®aõÎ êïßÈò2È|ÂS‹ )ÑügûM„­H$ª35TgªÊ>ï°Ž¢Jû…‘ÏKâð|µhˆa0»-‡9ƒ=D‚cÎýìÄ–0»¥½ÀKþßÍZ–ªH1Ü.Ô~8:–‡­jÎË(æ%Ê>ª3‚ç„Blü÷ê,g׌£hp$@íT Á±@ÅÚ—<í¬ÇÌSóQç%qˆ¾V4Ä00GaŒAÊÎN×]½£„=ŽüûOwÚéÃT…` ßV¼£¼–%wqvÏC8§<ÒXöš—Ìap]•ü†OpU›þt oá­C0rg^‡ôÄP¨©„ç1Hý»]¢x ÔÎŽ è]£;•xeˆoc.d[Àó8¤ÃzÚSÿx²l,·åP÷Kórtó’8LOM¡vª†¥Ë‹˜?7à¹JGöµ§!¼NÊ›ê.#LßûXÒ¼ݼ$$艡¹ðÆyLOM£þÑ2®¿w ‘O•w/sV⎘{iÓSÓàœƒ{Þà Y4 ¿XÀÔ‹ÓXþx×߯C¶£§n>±’‡à¨ÚÉ*¦?–4/G7/‰Ã z⑨ÎÌ zb‘Q„HZõ埦o‘£ÊŸrσÇùP߬éS˜žš¢±ÁXÒ¼ÝX‡c*Ä#Ï"«¢ åÝ ÖRÒp&×yÄ8kKËý8–Ć>zbd3I©™›%%Ah(¼Ž ‚ 1$è ‚ âC‚ž ‚ 1$è ‚ âC‚ž ‚ 1$è ‚ âC‚ž ‚  "¹! z‚ ‚؇HÈïìMÚ“ '‚ ˆ}ÚPø sÕÏPf<‚ ‚Ø—H a€@¡¢%&8€·9znü5$è ‚ b?òBm÷cŽùêÿ/ÖzB‚ž ‚ öAàÞK{?ïùJ××IÐAÄ>¢¹3æ< ›¨'AOAûŒ™™*d"Áœ>öº 1e¤¿ww­çaAAì#d"ÀRÞí¸¶ô•æ$è‰=±ü×4q€™õ ÂA¡‹ÿÁ\|÷]¬vñ Û1€õ µ#AO쉷þŸ·iâÓú¶Iƒp@ùÁ\óÿw;ÑÀç‘ 'ö=$‚ ¾R!oþóð]<˜°§ÌxA±) yóºë t> z‚ ‚اü`¬¿0÷ügwmƒT÷A±Oùn'ÖuWÿ]AˆÝÕ÷´£'‚ ˆC z‚ ‚8Ä '‚ ˆC Ùè ‚ b?’èH•$§Ëû¬äRf<‚ ‚8h0‡A¦…æ˜|ö9€•x÷÷ò‡A±Ÿ¸womdm‘ž ‚ 1´£'‚ ˆ}•©%‚ ˆC •©%‚ ˆÃŽ%ä{eƤL-Ùè ‚ âC‚ž ‚ 1¤º' ¥VrÁ9ËÛ@)c$‚ ˆ' zâ‘`Ì+1H)•Ð×(oQ5ÃdBãD1 ýÊÔ¦õè£ðë¾mêžžDBÊBDh~ÓĽ{kX½»Š{÷Ö ¶Âl7¿KÖ¦"a«……_]@P™DP™Ä¯. lµåF[bOÇûGŸíúûãêÏã¸AƒóÝNÿ2´» y€=1$±”ˆ¥„L$_5°vo áV©_Ûa«…¨-'êïÚm ,½{oýßçÑür›_¬cþ•9,ýî â¶8tãX=UúÜðÁ×ûª?A<ºæ¹‡òºRÝC!¶Bpîa³Ñ@ã«‚cª'fÀ¹R%ÉDBlE·B0æB¶#¸Ìï šrõ½:~6ÉJà–€Úéj§j¨TÇÂ/×8ŠýµxÙoý!BñÝwq.Äî»H¼ÙÚÑC†-Àšß4á—˨ÎÌ€—}€1€1°GùXæ¨ÊJáÃ"¹û®~åÓÏo8ÀÍÿ\1úGŸEýý:ª§~ܵ¸-±ð¯¯!x~Õ“?Æú— ó^$æ^‡<‹¹WçYÂÍ?ú,êÔ1u¢ ?x·?]轸-0ÿó¬M[ƒÑ«/©Z¼Ÿz<íkåø4–ÿz+÷^QoÇãèÏÔLÍošÔç^=YíÚ‚ éξ׿$艡[!\Æ Ûþ„>áw=N&1àBD¨ï›ß4áqÞõ½Æ?¹¿¹çáóOnw=vñòæ^™C³±‰·ó.üúBöÞ;K8û“3ïùsóX¼¼”ïÃÖî®âÏï]Ãko\è½ÅËWðö¿-!¼ÿ5Îþä ~ûîÒ®}IUïýTðKï.¡vª†ÆÆ:Ö¿\ï;vöx<ŽþÔNÕ°ú_«€Õ;«¨:“͇Ç`F ˆ§ž´L­åçd„¼£"XÉUÉrúèçIÐC·%믊ç%RƈÛr P»~yeÁ©oö¥Y¸¥îǯ~¶‚3§k€œyykw>ÏÞ»³Š¹—ç˜=]Ãêg«¹sß~ó<\Æpæ¥ÙÕX¯÷V>[Ád¨6_šÅm«Í~}Ù•ÏV1?wp€‹¿¾Ð÷X{<Gj§j¸}'ô÷P;5C_‚xL0‡eÂ; eç$X‰ƒ•Xßg1Ù艡p9G+ 1ùBÜëþáM¨ãd"ÝÛõøˆÛ²C€GB 8–Wé÷òТ§?€œë2Öa—vK¼÷}÷xOl øÁ³{îËn!àM¨kúårÿÏÄÇÑŸÚLÞ¸€H¬o¬cù/×è‹@‰Q–©íôQÒ» Ðl60s¢ªfQ"{ æ·!˜ÃÀ\w×vg_šEã~ÓSSù6î71{zvàþñïYèsn±”àœ?òxpÎÑØXï~½>}ÙòDÑ–ö{ Å{ýqK •+¸ú»+˜žšzñBLH6\HuO EPöD­:¥”]íïb+Äêg«h~ӀǕzi7Þzã<ê-c³Ñ0ö©ÍFõê8ÿÆà÷µÓ5¬Þ]àö§+¨žÌœöj§j¸õÉ- QªñÚéG)«®aó¾êóòÇ·0ûòÙú9gÀ"gN×°|cH€«¸þÄûS;UCý¯7P£0<‚80Õýù7ÎÓ§5b–oÜþdÆP©LcíÞ*VﬡòBˆ à—}“@góËššðŸñá—ý]íù€Ú5.^ºˆÅKKXÕöàÚ©–ÞYìé¤×¥wqáõó˜ÿ×× píWrï-¼~/-¢vr×ö @û]oáõó¸÷÷{¨< þÞŸêËìé&§¦6»;³½}i¯½±€úÉe,^Z>x²ý©¬âê¿_íXùGŸ%‡¼C=ƒû³|ã&„ØŸ‰½~ðÝwß}·ñO‰©çؾíd:Éæ_§Ù4Bf_žlüSÂgéåÂo[XÿrÍû ˆvdTÂÌqÁJ¾ï#x.@åhw*râÉm œyåìž ‰ƒI(}L=§ç“?¿Š+¯4(=¨ž¬‚óò¾‘¡çß8‹ï\ÇÔ Ê¯gð}å=]põ$×Á®¡6©p"ö~¹Œj© ¿ì#l…ʱ-‰Á˜ o¢ŒàH€²ïÁe$ä< Pÿ°¾'_ âð@ÏÞÞô𣖛CÈL`ÀCe;F¤m°ÌQžÊ*ý©êüÀEKºÜ¨p˜#´ ×qÀpsxSS¦h<1AeS?œÂòu ‚Ø…‘ÈÍÉÌ]½”1BÛÛWŸá2¦âø†A}oe¢ªœI)$WÝ0)[ðËeö±OiÞߤA ˆ•Ü•ÌÜUÐG[” • p‡i[ìÞÂk$X‰A@­vâ8†«C®d¢ª–ÇŠî'‚ ,£’›£’™»†×…#ÓhÇjU1,iÊ>Æ”!‘ˆ·³ê;Q!ƒ'ê'‚ ˆýÆÈäæˆd殂^¦¥A“X• ݱ¸Žú™@Û+Ô H)!„PùÑ ‚ âò¸äæ°2sWA/´3AKÕÑ.ÎiÇퟞ$JaÔ‰TmëkIÓŽž ‚8° #7{2™¹« u!’t%‘­($âXøÕ¬ol 7‰r2H½c#ÞQíAÄAd7¹9´ŒRf¦ºObs{erá ˜?UÁòŸ®cí‹ s{¹‰ôæ‘ÄúZ€r] ‚ ˆƒG?¹™þnËËÇ-3RÝÇ;0+ˆb c ¯ÌbåoË{î¨Ýf¼“©;‚ â ²›ÜÜ+*3wWÝÇ–‘¿`ð¿òû+¨ÿï€1@„XùäVfèñÓq£V›¹kAĤŸÜÌväƒýŒBf—zÅPt&ÐÇ«¸õñ-Ìœ˜ÆÊ'+6‰EŸ¶Ìµ‚ ′›ÜÜMNŽZf:u¸`_º|(ƒÄù7\‰ IDATPÿpk¨L¸hll@Xxcþ„¥ËK˜:^1§×?\Æü¹ùlUc·K‚ž ‚8àì&7S&O÷mgóËuÕžåÌ—kSŽHuo7”s°T ?ŸÊ“€,½»„Õ»·±xé-,üzu{ãË6¾l`þÜ|®³v›$è ‚ ˆƒÎ rsà¶ ~™9px]ŽÔF ;-`áWçJŽ…ÃìOÏ \ö±yo Á°òé*•JËÖómìv-‚ ‚8@ *7×7Ö{¶±¾±žò 3÷´£Ï½žÚtÂýõ/ÖáN0ø/NV?]Áâ/g1{z«Ÿ­ –1ê©£R™ÂúÆæž®EA…A妔k÷Ö:Ž[»·–cÛê¼N‘]}Ñ sˆs?×ÿr³/ŸAÔŠpóƒe\¿¼€PHHøŽq¼ö«×à?áâýd¾­×"‚ ˆÇ€r3ýY»û¹9víîçÝÃð2s0g¼.Ä;€;–ý-Z¯šØüb ‹¿œEØ 1}<ÀÅß-#(û¨ýË–ÿ÷-øÏp̽2¿§kAÄAaP¹ic ûAÏ¡×}Ü÷â)oýæ-,¾³ˆ›Y„çyXk4qëNSÇ+¸õ·°q,wÎ^®EOŠ·~s‘8,߸‰Ö·Mˆï™Aåæã¼ŽÍ®‚>Þ)•ç:1˜Ó½£•*Xº¼„Åw¯ãÌé*ÊGËh6C¬Ý[Lbœ{uÓǧÁ'¸9G%êÏÚåÄ(™už8PTOVižƒÊͽ2¬ÌHuïŽÒ¤ãö=¶òBKï^íoáöUÀµ÷þ¼K\0G©%HuOìgf_ž£A  B´hž{‘›{f™¹{UÜÔØï00'ߨ;Ö}•2÷Êæ^éþPÌã0•<À*¿GAš!äf/F!3ÿÇ Å;Èêᦰ:1,i›©ZCRyZ‚ âð8äæ°2s×=+1ȶ€çqÿ‡Dæ:¾×N»cp¤RA¸ Q$ÀM‚ â`3j¹ù¨2s×ýäó4¿Q^›Œ10ÆL¶ž¡œ Œ)c Þ¸êió›&<ϧrHñ>»§×÷B´%h€ ‚Ø7ŒTnŽ@fî*èç^9‹ú_ꈶ•s7®: :í¸»ÿhdÀaðÆÕëq,Qÿp3?šÒ:ÚÚƒS=U£A bß02¹©yT™¹«ê¾:SÅÙ¹9\üÍE,ü|•*ð<ŽØj8Þ°³{<_NU‘HHc}c×߯cêxÓSUxã\’óÄ‚vôAìF%7G%3A:}þÿº€©N£þA×ß»†HˆGvœcÀJÁ±s?ÃôÔ48çàœƒõG¨ž¬RÈÈá¼¼¯ú …×ÏãÞßïaæG3¨ÿñ:<®ò.Üþt¯½qPy®‚+ï.aúÄ”QýûGŸEøàëŽß ‚ ôìÝ£–›ÃÈÌgЋTOVQ©"„ˆ¶#`T^òà{àœÃã^×^-߸I3瀳›=~ñ%œýÉÜúh7?]Áâå%\ÿýÀko\À•ËK˜ÿÙ9ÜþtÞ<µ»k|Ý!ØIÈÄèÙoƒƒÀc“›ÈÌÂá{lœ{pK \–‘§yt\µ*éÑ#ZMü/n7l ÿÕ;«¸òîà³§kX¼´hÞ›ùÑ V>[Ep,@íT g^𥠾Gè<$Enî.3 ]Ø{§™ãj·~1*„pKÊØä2–³½×ÿx ¿<³?Ÿsnߺ‰Éã4‚ ö?OXn:ûn@ˆ§Î9â¶„[bˆ¥çY]sÜúxH€›»…³?ŸGcc bþ ±_¨ªáÖ'·€XùlµÓYØ\õäqûÓ*EÎÓÞQŽ|AD'fG?î,ÆSÆ~sp\zg ¯ŸÇÅK‹¨œÁµ?\7ï]ûý\øÍE¼ö« €üù½kæ½ÙÓ5LNM#l’×=A<.οqžá€Bª{â{¡—àµ_÷&´z¾ Ó'¦°vçó®ïÕßÿó@×"‚xX¾q_eΓ9AõwWh„‚ ˆH>\ÈFOA‡„ò‘ ã5ôAq( pã£zÇë]}¯ fõnàÊï¯vÓ/ãYñ½æý&æ^‡<‹©©iÔ߯÷<þ W6Eß ‚ bz y`Îxõn ŠB\|ó-Ã9<…­fÿçY,]^­êh~báõ À°ð‹…ÎãGàTU=UCãKŠ·&qQ‚ ö)¶¯u©æ9 / ùa¹þ^ç±€³/«ô¥Á±×~wÞ¼ØUЪlF<*Tg ˆýÊnB@Ð÷ò½b•Ó d4r¹Ê•Ë|ù£|(Ôäñ V?»ÝõÚö5â¶ÀkoœÇê]UÙlùOu“.Õ?ú,–.¿kïÕÑÚjáÏï]Ù—f»V6ëv¥{õ¿ÞÀÚÏû^g}c/-¢ñUœs,þæ"æ_=·ë}OÍTqë¯ËŽh~ÓÄüÏæ±vwfè¡õm“ ˆ}G7!¿gg¼ú7póÖÍ=íä—Þ]BíT u¬Tæa+DÐ¥ƒ°xù Þþ·%„÷¿ÆÙŸœÁoß]ʽß|ÐÂÚÝUüù½k¦œi*Üw3pÏÃçŸÜÞõ:Þ¼ˆ·~}áýM,^ZÄâå¥î»vª†ÕÿZ ;µSgh†ACÓKÈìŒ(!> Q©T°üÑ/¾òÙ*æçÎpñ×:Þ“á*÷¬|¶‚É P•Í^šÅíÏVsï¿ýæy¸Œ©ªf{,8ûÒ¬Ùµ÷»ÎÚÏUûÃüOç Ûr û®ªáöTÐßCíÔ ÍR‚ b(ö"ä>ªûæýM,½»$ÀÜ«gQy¡‚éS»v@oB#ñËù2¨þ­!‚ç­]}"qó“œýé\ÿv·ü ·'»[âCZ*äw»N$ê©£ñU³ÃÁ¯ß}×fª¸ðÆDB`}c˹F3• ‚Ø3» ùnvúž;ú¥Teíõ?ÖqñÅBÕÊes\ñøÚÉš)L’rûή¿_ßµ]Î9Âæ×d?ƒ~×™uRJÌ¿2‡?ÿ¥>ð}»%†Ê‹\ýÝLOM£ÙJAì‰a„<0`Âo‚ãÊå%,¼¾°«ZüÌé–o¨r¢W­¢$°ð«\ÿS7?YA,%Ö76°xio P,¡vº†Íû –?¾…Ù—,³ÇÊfý®Óøgs/Ïaf¦ŠúGËßwúÔÿz£çAA½TÈ?Rf¼éS8;wo<Ê‹¼}i÷þ¿5L¬bª êŽ”Qÿ:®¿wÏV&±ð«ó¸øë 8£Ãíú±ôŽr~óŸVµñûÁò.§•Í¥ßu®ýþ ^{ã¦gª˜< |ßP;YäJ¯AÄnìEÈw³Óÿà»ï¾ûnãŸWÞ™§¢‘hKàÌ+g{V`{R“6þ)á³>$‚ ¡ô1õœ23Nþü*VߣAy #äÏýl_µ0õ‚ò£2µß Pÿ°ŽÙÓ³4·~s‘8,߸Iy 0Ãù¡3ãFP™ÄÔ§°üAã€2ÿê< q ¨ž¬Ò `F%äôß Íû›4‡€Ù—IuI¨6ÃÁe”B°=åó&‚ zQ2«)1ç~¶0ôkEÊ€hËC04Ä^à%Šç'b0HF,‚#Y9'ý—:‘‹„¤Ï“ ‚  $@ ˜|7éf΀H(Éî2 ÆYî‰ÇFZQ0…•j§j¸òî<¾÷4ÆÑV–z˜ ˆÇÉ…} K8 RIýDB?:©·ð2Q'¸ô¡>%³ãɨîí´Âq[båÓ\¼´ˆú{{¯P=Uë¨;@Ä葤êÝßèݼÔ;{„ŒÁ̇ ˆT•OjÊû`#ì–ÎþtwÉ¸Ø ±‡ôÆA Oªù%ö)zs.%€$îò–´·ùR«âû!–2§AŠ„ÀÂëçqïï÷0ó£Ôÿxݨõý£ÏbéßÞFý¯7ÐügÓ¼–j ìß ‚¢Ó ìwÒçh·ýÌ+4@Ä!nKÔ?¬cΪw°øÎÎþä n}´Œ›Ÿ®`ñòR®æ÷<|þÉm¸%Ö!ØIÈÄãaæE ¯;¨8Õs‹4 O)k7–žÈum‡<>Á1{zK—³¾¬ÞYÅ•w—G%Z,¨õg_š…K¡ñ½B²âàâe?3Þëm? svzcÁ7¯Hó*³^³œ’Âß@§ZÁºfîõâñúw¶×:îº,×óþÇÛ×-^O&ùVXÑ“ÁéÞžìsus §Oú~‚ƒŸWìÿ“b·]·Âr—±;< y‚øþ™>> 8 ÌÑÏS)!S[°ãª§!cú™&!ÛQ#¯í®ÃÀÆ]°Wm¥^âéó)t×<ûY‰33sÔqRJHý¼KŸ¥2ѯíÄÀÀŒéóMûè{êu݇1—10ææÂÏ‹rÂ@GÚ¾”ˆ„€”±>ÖUýÖýdŽz¾¥í2æI¬ú®Ç"NÒ±AÖG9ÎÇmQ¸«/3mÈp„YÇ¥õŸ“ý_|¬¦ÜÄîˆÁW¿fÙuâ\Â…|«®ž,¹Ûš….òNºËuÓטn¿'–Ðe¹ûÕ}q˜uo2'8e¡+Ý`ÌZrØ“­ ùq̾L]…x‰ôjfáæä'ú~…sޏ-á–b)Á9…ÏÄ“f½± ×q;ž7êy­£ç10îÃ+q ð$¨Æk?}¾ÚÏkíØÑé¶¡„§DŒ8ÌÎw]¦žçŽ ÑõG¬Ÿv,‘RBH ÞŽ'‘‘^‰?ã«sÀ§ýÒç¨E²E„êú1À\K>ikKŠT³’ Æ8H0îR=¿Sy·3ᬪHDê5{̬…K£¤µ``I©VJ ÌÀŒuȵðp¤Ì"C*csô@çè!X:ŽKLkj  cô}-K KÄÆSPQbõ© íc—þõŒ(NÀ\ºŸ]îbKh»]â:εÇݱƻÛq :<)sï9èОȤð?¬ãöqødíT ·>¹…ùWÎaå³UÔN÷Îá G9ïy´ ˆÇŠÇ=õ‹µcú€Aˆ²í" E~w©a9MƒëÓ»mTž›4ÏètØ …X=c-a¦zéHÈ8Öíi €ÃÀ\@îH$\½Ñ ÃfgžjÆ\%‘ ×4ñŒ¹þVKµÉôN|Œe÷Ÿî‘@iÀœXmÌ€•<0Æ Ú€›E5'1")~#E¼q`M²‘Ã1Za 6fËÍ2–ˆÓ]½¾Ÿtç1¨ãÇ'/,ašhš CUa ì\‡,â$¿sEDæ&b§S”¦Â±ã\½ûí¦òŽÕ_½îê2Uív;ß’È´iµÝ¾^ñ™ö “ÙÝÅ´ËtA’MvÕ«¸SPégâèF’ý˜LIéýÛÛg,½³ˆ…×Ïãâ¥EÔNÎàÚ®÷QÕý BØ›à¸õñò@ç×ßÿóžÛ'bïD[¢ûóC?ïXªºf îx¦ZO16t)mGm-#Ú¤ò½acêi.ã8Û1¸€xiÁêš/sPXÂr¾;éb•”Є“åÜI¬dW!±ŒL$¼ç<ÎÁ\¹£6h²- ÓEB;BK/l¹Œc°1ë~M»Ú¯²*¦2Vr×µmö®«ÌíÒ‰ N…{E¹þºŒ)sBêÃàè1Ô$+©Å‚µ»ïž¢°Ò¶t‹±OÛ½v¦‰•ˆ-)LG·Û+óRA`ÉD€î q§ËutÿXWÕ¼ÓýïÞÛwÀ,&R Eϯ‡ì®Z‡e¢Hò‹ŸœSˆõzjCÊ yf9ˆBÝ‚¬ß²Ø>e>$bϹÍBº#–Æ.žóUr´ð2;ïL>¸Zø¦BØe ÜË„²l3‘²s¥‹½ËÝŽ=”ú¹i9àµãL ªäYfÈ™Œã–^˜8ÊH0¶%Ì¢E¦&½ðpõsÓv’Ô36ãg;Ô¥x¾ ×ìÔÓ„RÃÇqŒ”@W*yK‹mi˜6{˜$9‰c±”ˆÚ¡r„Œ"ˆ¶€lÇjGo*ñLÈû|öÉ){~ ã ‰ì5GÉN‘'wòÿ›ëÙ×ÐíÚXNmv™ˆÌažúyÍA¶óf¶G|—߳׬ûd,ó Oúõ÷a›@˜ýaév¬O†¤x¿Ý¢Ô%÷ ?Ér¾ æwò\'bpÂ0Ô‚Ži¯<ë•§¹+yÆv.¶”†ÃÀK.X‰u-–ƘÈPç±’^”8¼œVØ/û)9¸2RŽiZ]-¶å8—jªS5½íÐæ—8Ø3næ¿ÇÆQ.Øják£<ß]pÎÕÂd\íœÝW¯k‚hKD[!„T‹!è¶Ã‡\9@£fwôî<R}²ËÜâ¦ÎÉúË(—ì®Ùnæ#RæZ½âêø ,ÏÂÔ™ByæZ;ÕN¡oTÚs07æòÚûrvûn…€ù dz7]'ªË2¯óÔžÏz…:Ù=1Ë^ÏRïGv‰0è2nÅ…‡þ¿›³™« µ#â` „€,1xF8Aï²µ\hKåÇ$ÓÚ$V^ëm€3ÛÎëE W{ŸKÈ8¿³O7H"‰ ‘ Ëczg€;L©ÙK®ñz‡eã—2FÜJøjÕw$„²‡›P?\k –’rGgvÕ‰DŠÜ&J©Î¹ÒbhçÜìðËzƒg«ë‘d&±­SÑYvwígÛ$kÏ}!3ísü 0îº&ÌÑÕýpÒeN¸hA[Ü=&v¨2{‰eC–‰Rî›6—¦Ý¸K|y^ø1§`ûÞQ^•¹#‚ï@ªZ² éõ¥µP(ä ° 9ž2uÜήßé+§ =F‹¡ÂÆÈÇ–€ÜŽuX‰Û™s`§°hÓ *GêÊEè•ÀŒÉ$³É}bGÄþ"j…€Ã œP fµS÷J\ `¨¬Š—€ŒM¼= Qb9UwªVw­jÜ–ˆD3Æœæng.Њ³u‰NˆðaHiœùÔ.`ŒÃ+1-x|-È–6+ð’~_J„"‚ØÊîî|ÜEpÔW2*†]©ÃפQµÇB¨û÷ÀyêµXB™©ƒ«} d}à|˜ øc.<ÞÅ„Û%±‹LmÑm©4Æà1½pÐÎÇb;V±çRã–8ÊÏx*Vßq!ý~jïÖÏF6îç:¥Öš€¶r¨‹Rg:)Á lµŒïA¤íçfCè04›ÚÁP- kƒ%½å>—1²Ðï…å7iˆ§¿ìg²ÁΊ—HÄ ¢Pÿm9’™p´Ô³\íœÐ3 d” [ÅÅ `+ˆç:jgì=£vÜ ÊLÐl·”“œ>?ø+••v©3] ÑŽŒ'z¶¸ˆ cKýí*G96î!x&Ûu§D©ç};‚Œ•vºõ0BÜ •#4òQQù¼2.Z[aögêHnÉÂÏûX;y8 ‘;´ïÌCL%ò1QoÌRÝw£àµ®M§åƒµGî&œ;²ÌïÖ»“ÌdAJ?Ds–­iC&Ì‹) sŽq]“¼:žõK˜ãä5 ™VÀ6;@”]Ëé3†¶ÀN¡ß…1K×o¬›PïBçèEYÎqROÚnûx+íò§õm“ RÁ­3ÃÙn®ÎîfÇtË6ÌîYhOsWÞRB—evj™@ÙþK (q¨®zÏ„}·…zÆû| `ÏxÆÌ'QKäL¹¤pÌUɵô¦6´n´|Ó‘©ßšeJMå/yp'×alRB´c„[Jã—sR·dañŽ›«B¢Hªè…„Y>T*‰;K$*Ç+:ƒŒŸƒŒµÆ ‘‰“Rmp ¹œô¢j•6Xmo[ÈÕ0fB —­Ø¾Za!q—Ð{¶Pt¶“*¡Yá|–_Õ¤ » -º™íl('èã iï¸Óݶ•Š1ûðì}4z¤¥µÚ*î Çtì…Œ3À.»Ð—tAÂv:É›+âÜ=Aì±e¶y{#¢cÒÝÇ3)«y[ C#¼’µ1Jmãcê$1ä¶4Â[ÆL©âµOÛŒWR¶ ÚjGD¢†àÏxÊü2‡ïk/ý86æhî)•¿ µ³¢–"!L’š(’z¯¶µi¨Ë%ŠÓ9ý% e„2× {RÓç–f!†_.gC¦óà‹(R ô‡—<ø,õè7Ip\íƒÀG¥÷•Û™6DQ1Ò>Äm'— /±Ôé@.ù¾99½EkEeH…£Þy»‰ìhG:’uL…èR&À˜¶ý;öçÜß¹„ nw CÓ/» 7%0Öyš c¹ûíÀìV~}Ös—^ì_Ñ¡8¾sK®Ïn‡ÿÝ×þ©¶4Aƒ“ÆÃç#”Cˆ6À„@ôe7™ù_EmiœÓ˜Ÿz•³qÏ’±Éôæ•´gü„NsmüÄ|­å•¹vì¬Ç9Ø‘²ªÃ"mÇl©wÂ:ËÉæ°r€Ê ™¶Á†¦Im¬Ýy ©úX9O"!(¹e‰mÆÒоLG ÷**¿N5,D„pK@nGˆÀKívbÕ~; у£¢!¤Ì4 iÞ}^rá0;Öœ±Ž›ÊaÛêÓ¼`gN/¶Ñ1Y muÄxå‚å}Ó;ÕPHSH›XD¶óžîf}¨ÿ±óû#l@GL½¤Åw\ôLãb»¿pec]îÍzMîÈ3„Ù×[þ25s@÷'~ЋRÛ±WxÉ+l22«´Š¶D;¤Š@âŒq–(U|Ñìj«ÖÃZ‰ƒ—Ü,ñŒŒÑ‚s×Ú Æ:DÛJI ˜ z|܃ÇYf——ZµÇʽ-Mø_š“^&/1xÏppîgíÖlêùRg‘Md.w‹r~SÅݘìT¼™šL«ôI+Õ»Vá‹(¤kvéb;F´Õ‚”±Þ‹-:ÌØ«f+²¡ÄáØeUœzj­Ð®L¥® ê¡£z[7ûwR(l+QÆyAGÊÜÔëÐaJèwKœãhiì!ºÿÝ ÀØÕ뤵ˆp\(›{AÝm¼Þ³þHª˜A‚L°;…ëõX,°±=|«º”5D:1w r2§_]\!Ÿ¨sQd‡<Aì…Všʼž¦Ze` zw©¯yžVá;€BïJS³R¥Çzg cÿOóΰêŠ(šß«®’ððœïW,uZÙDBp™—i ‚C&ž©ã’©Æí]x†hÞovdjåVQ»Z+ÓŽoÁ‘r.+^*È]ýkÏ{æ*_¶c•’C$Zˆ¶ û õ¬7›píãP\Æ-Ǭ¨§ÙD9 ‡×& 'í˜tDiŠØ©l ¶2ù@«]œ|màôƒÊvÜ ïálggß3yó3U?Ó\G~|;¾Ђ×íЀvæË ÿ.1™`5;g»bP–¼@%lY þX—ê}Ev²f˜ƒ¼·C¡÷NÖ®,^'Qá9'ÄdçA‚ ˆDBu,<'†ø„§Òà2Uj–1†( Uu¶(µ{«Ý²)+ 8ÜÔY 2Û%±)ÄÂÀÀËü‰²I¥+õ.Zž{‰Úõ†#´Z¡Ò´uд£ÕþZSµ…9OíÜ}¸<Û¨i¼ÚÉ{ÙEêßÚ)§ 7Q>±6IxiØô™¹Û1¸çÂÕ%lÓxÔ–I6¶p<‡!N¸ ÿ²¼ŒAɳ1½XËüÿrwÙ IDATë¬(4jç o£7êúT%ãäãà#^'á"K›æ6Áü‰ÌŲ4'|¯øòÔ˱Ë[¹d6ݳülçºnó˜×U¢Îì[J¦Ý;ÈJÿ¹®•žW/vÆúÕ»ž™ýl{–k]·Û8¡gn;§¹¿\¾Ù÷|‚ ˆ^T^Ð^ßZ¥®Oún ÐápQ[ |Ђ‘ÊØÉ\%ˆ¡åƒ£ÃטgBÈT YVÊÔâi¦9èßÓbbF(j¹å•üãÓuQ•¿-”}“‚ºHLø0äD;g–?Ó‰€<«4¯¶±»L¥èMíõiR$¢H%ýÙRˤŒMN~Vrm1¸Ž³sTRÿÏØì±£·2‹÷7jx­QˆÚB;fÙ|Ö¨Kö¦}vxÑÝ‚ÁÍ·vÔŽ°[õ¢bIW•»X¯ÞÌŬ·¦&½ºŠùPz”§íí´fÿwìà‹ë6îõm¯[Q5‘]3ØHSâšLöxêæu,8âü'n–ÃÞÁà;í>%kY2–Ùä³ñ%ï{‚ †C¶UÕÀ÷!wRû±òìVõÖuŠÙDçl×9è!°Áx0¥ªm DI˜+½jʬj•º”Ò¨³›EakžA"ÁÇ=³¹´Ê#ÆÀÆ#0Gíª¥·ÂL éãC!LR Oý¾›?ß÷•í\H@Ä9“. "\h@ÏSšYB“ùê<–E/˜ÈK îqLpãošD;B‰¬Tm ‰ )#¸œÃë’u0/Z’¬`Á)¤¹M\ã±m<äÓ‰°£Ëô9®åê¯MÒJ£ÛUvÿ,*_ωryÓ6;ŽêâmnîKŸ%#sYÿBÎúÔsS JÙ5 °ÌUh2)‹×,ô…±¼sG.OÁ å:vâÝTúngž«¦s÷v‚ ú#Ú8bˆÔe(‰Uõ7¨Zí‘ÐÏ4ƒ¥Iq 7WÚéÎL7SÕΟQ»êÔ‹&×+ S ˕8 ƒ³_C¯<}ÚÁ)¼nEÈ$Ωó;ŠA HPöµ Z‚sðqÍ!šß6Ñø²™ÁÑå “•Ìa·Tél?Ñaame“íH©žSÏy‡!x>È´R å}ßT‰«˜ãrpµ P‚š™biJm®6—‘"Bó[•¨Çc̘àdÕãÄvdjÝ£åÕ“3Æ,íj_e߇òåb®±åG[ªD,Ò´ðcY,~š*ž{|æTôB'R±ñR"W®©fÃ^ p\ËQ—z#DÛ@Z)u!á°ñ,qKfc.VËÉ »~­3…lV¿7ŸŸ=õÌdãnßݤ+€Vodp°°ÞǸà®ú?ýà²aÔçÚ^é–Ù¡'VÝx€jp]+Ñ%Yÿ:mðJÙÅÌÇXè{ÑÆb½z·SË@1Ío›$x‰#Öjúµ{«ð´ÀäŒ!z"|ЄË¸Ç! DíHíÀaÕq‡Ö0¦ñʰ¾±nUv³lñPÏNãõ®OÉÂפ¶ÅK0]UTÚÏdGŦÇ“W_Ê¢¥ØS;ð RÉ%¹)‰P—æÑŠÕ‚'Öyí¥]þ[k'¤”YY­HóÑ»z×ïOpõ:Ñæm¡ããõFÕÚ3GeôKsé0Õï„ŒÑøªaLÐåSyà¤{ÔIzÐ7_°&'ì «­4 M«»e1£Ý˜«Õ;jÅÔq-ô¨DgÚ×7jnz UõÒù$“Bõºâ‚&=<ð¶=¾&|Av8ÂÙ}IG-Uµ ÇpJ+¬$»†U­¯[®ûBºÛì8;'LøAÄ0pK,uÕ4À[—ÞÂÙ—g¸ù·\ÿÃu„ß6 ®ä‘cù79 Ìñ´°ŠuÞy%Ȧ_¬¨ÊpFËÜf öÿ%½+wµ`ÝQÕõb]äà¨t·¾çi›·Ò(«4ÑV„ðAÓþf³q¸ã™c¸ÜÉœíd;ÊGš­Ïe.<‡Á?äÕþÆd¬lü"ŠÔ9cê‰-£Ív¥©Û„ÊÙr'ØÌQãËHõ9Mi®£Ô¢Á+yàÏèÒ½úór¤ò×Mf;ñÔA¢P½Ã¾,‘ í¢ N´pÙÎ>äld¾ K¯ÙgÇ2«h€a/x˱o,Km:!«ûŸª_LJC;þÞö攀ØÑîX¶£. u–šƺø.XÂYèjOE߆ŽD?E¿€ôµB‘3ÆÖ±Ù¸ô_|PQ‚ ö‚”ÂzÍ5›U‰¸™0C{`ã@(B@!šÀWùÏΑ–àIkëJë"®Ã ©kÍK+3\1&;}Ÿu–uM'JNC “Îì†z×™PÖj±ÇÒ6hŸf÷9ç´¡ï?Ž þVÚ[«i7“ÓÖ®ßÄ©wô_ŸgG-XÑ ©6ÄNPkA¹Ìõ­J˜¨²ŒöuÜ>Ή”צy¿‰õl`ccë_6Ô—’è‰_ö1}¼‚©©iL¿8…àù€åÓhl‚1SÇ+Ê“ØøÇ:Êžy®Š¶ç ¼¤lÅ¢­ºÊ®.叿q_{ŠKÈ- !˜Éçž:¡!Í"'¤ª¹ž†ãeÏìÍÿ^C³Ù„_öU™[£61}¢ ¿ì#‘޳W‹€P{µ»6¿\‡Ç\egOTÞ|8ç÷€-]g["Òuî݃›h7dVøœ1XI%·‰ÛB%÷á‚£>¦_ `õΪ1Ù¤@s["x¾‚´ÚcÊÚW@´#­ÒЊZzsCÂEëahÂÂ¥Œ²|/Ò…c.œ,¶=Uw¨UL ëßM…4Ûøï@ k«ÌìXoÕÃ>¯.·vè½4Ë…:ó+®-²Í"a¹œî9ç:;ÌA_ƒõ°ágwؽoÝB;ú˜ KY(åø«@¯êzÝú´›ã¤Ó1ÔrÌKYþë \ùÃ5ˆ=¶BÜn…¸ýÙ*àâ¯/`þÕs40‡˜ó¿ZÀêÝU¬~¶‚éS(OxXoGˆÒªm0=5Åß\+qõ\fÚ¦ì¸Xº¼¤=Ò™ñH—FC ´F¶¹Ó‰Ø ÑjGª¶<”P“±Du¦Š…_,Àó8Ö¾¸‡›½‰h+TÅaŽZà Èíl܃L"Da áÕUÔNÍ€9@óŸ ¬ÜYE³ÙDå9R2„š`ÌÅÙ—gQ©‚ó>QKŽJøÃ'|0G§N$V>]ÁÚÝ54uf¾hK€3`á_Ïazjá럮`åîš•®WB¶C+ZJm ”ŸáXøÅ<|®JÚ.T‡ØŠCÕ«ŸuÁ±ÀøÔWÀa®•I.—w” ¡KUå„§o¬#$ÌòVä,S]¯4±-¾–97½–}½Bæ¾tRu`—ÀµŠØLÎÞÃ˾Vì¼ÙYSÜÕæcvè[·œÅ²çø˜{Öýì–3 s"é±,aÖÈ’cà­K‹X½³Jñˆ\ùÃ5¬¹‰«ï.Ñ`R~¶€êLW~·„p«evá©í[Jr¹Œ¹Wò >퇇ó[!0x:ul¬=ËÓç`,9\¦rê3Îày~¦êÞ‰ÁÇ›.Ñ|4ïÁÕSÊ"૟)aÝøJ9¼)Í‚äL'´‰-ãÜOk€{÷Pÿ°Žà¨‚ãÖÇ·P.ûX¼ô6f_ªef^ »iµ€l¬LMMcõ³Û¸þ~Í*Õ¾7î¢v²ŠÊ‹H 4ÿ±Îtx óàs堗ɽÔs_yû×NÖ”Õ˜ßüx€Žp€³/AùHYi8JY"6ÇÎZ7Áú¿¯CÒ”ó„›åÍëf'¶Tþi’—Ng=ÀÔYÓf„®t)ñʬ:ÂÅkfþ…ÈÒé*ôA{'wôBj Æÿ!×gÖßrî:i‰îYû.ìë$ªÔáÓNýƒzNÈOŸÄÜOç0}|å NOö>´¶Ö¿\Ç­¿ÝÂæ—›”J²þA ¿XxäöÓ:á´ ÝmÚt¿‡´ÖŒ3ÿG ¿XÀÕÿ¸ªBêd ®óܧa`©€bŒå©þ2£.cðì”ã23¯Ê¶D(C_óžÔ©vD;s^RNè*cœJÁëMø&·¼7áÃ/—nµ”˪üív˜eõK€0l"8 8 ÔaxÞ8Úɪé+õÖ&TêjrR Á±2æ¶ÑXþpY‡b»z×.³\€’,Õ`D*RMW s™!BÄRÝ·ÜŒ{ ¸.CKÄiåÓDmQà08b[š2{¶ŠÜòõ.$`Qä+²¾ œØòâ×_ÞBõ¸ìZYn÷ô5V‘•õŽe×6rS—€Lû`;͹ýÃô²Lrqϱ@EDzO}4Ò.?‹X›Ü|UÀ~^þ°2>Åæüüñy­ ÷”ÍF×Þ¯›¿~6ùŸ/˜yî2f<`cêÓLaî0Jõ9SÅòeÔ?R;‹kï×1ó£*&+•¡.[¡Jô9ìþ9¨çSÑ7ºÆûãB9n3LŸDpÄG6Màœ£ñ ¬Ý[‡¼ä)d+ïq^ÉcY¹Y‰”È,›[‰3ªÑñC–Ñ.‘¹l¯ÄsEwRù•Úê9suyWå? avÞ>çh6›mða„ê‰iœ{uΤ˜ [!–ï¬Â¤D<Μ»™‹ÚÉøŽÆ~q«Ÿ­"|¨|¤þÜÒªy¢-Py~`\¥âu˜®Q/óŸ»XçMp4îÇÀ6àŽ3+/>Ãê5„-ålè0G©¯Ý„e™ézî ³IÄŠåÌDT9òYÒÙ–×o—4†Ì?¬KŒ{g,O|W‰@;@n‚¦ÿDZåqîvOÅëXö¢‚;WQ®ë8uŽIz^·UšÁNlG€ŽèÖN'Ÿ ù³#:TJ²ÿ>Ålü÷†ÙUŽOâìÿœïot™Ê9ݵdóS†LXV`#-í©ã¡ÏÎEã«66ÖÍØ%è“´Ô'èsâs`Rœ?6aŸ:[—”Á'8x‰g;xý]ÁêÝU0Æà°q+L ÑÞܹªrè!¼˜å –_eJäC¾ÌëíLô!û@v)Ú’Wmg_z7¾Wx¤qæ"޳p4k·ŸfÉcÌ븗üb ÐÏ>,{4¤Õ+Öõ\=ÇÝÎÊ|EAn§±’7ÚÉ|;úú!t¤à}ŠYÿrÓø4ÌžžÕjCíü€§Q-“Òï+1¨ eqÃM5d P;UÃÿßÞÛ…Ú•]g¢_`ö¹àö jämh‰ÔƒDùÁ2~°L“‡¤ˆZ7 }+1tJmˆ-ü`_pË人¡;u¦ªL)Цä_¤@B)P¡ŽÁ&[P‚µAÖ„³a8 rƘk­}tôר¥=!±êì½×Ïœ{¯1ÇßÏÁG"ØñáGãõßüs´êO¾]‡'_‡Õ¡Ãb>>•PÝ!cùKµqe)Ö¬ëÔ:4óê]x©w-ºPz¯ŒæÃ{ÐbäòñÁ¨ÜíÖeI[Ï-"3s4{â67?SƒfÉÑŽ*±j…rÉ[î ¥–år)×ﺔ)k†ì™a Ð>ºž(çÉý¬~ÞaùÉJ„mv¥-ÔðœhøælƒƒŸàöÏn㯿"ÀVÉZVPù“\í Õ†Ú~… møóÇΦ®wb]ÎÀŽs®î@Á<_‡H÷ŠÙL¨àMŠèd7]–Öõ=³ôþ’C|ã—ÑGŸúÙcxn9§mh,¼óùû¡AI`*ýÐÐçøPÞ¬U?4»ÉLfRk¥bÀÉ+"JÅ ÇÅ12+DT'#écY§*5^ıüÅAœ»ÅK‹ø£õÞÃìÀ¶G_þ–BV 7ð¾ƒ?b5ŠZ¼´Ðï.ÉÜ>Áè¶0»õvžbüQ‡N³ÕgìnåÎÏnãà`‰¦©%¸r.š3 j;ÇbD»fµÀÊÅž} ¢YýͱÒ}›½óúLKMfˆ@ 3Ú‚‚g ÷X=좵lž“A˜U‰ÚàôÖ:'å}U·cu#Í »Î£9×ÈyU†* m[ЮTJæó‹Åµ•÷uë®c5ÕQ~üºƒg iä}«•Ó ‰>Ó´£iw"´«´;‡ÄJìÑ,`•ø¢to¨€€H6NÇ ;K¾1Í^»W†P²³=­MCÆÞŸ"8äæ)fzËQ鹕j&ñ—Ì5ËÝI¹²s€ævÒÿÆ ?ûa„£!Úb &+fÇ<Ñ’ˆ÷’•Г O@‘69U¶ýµ:3žñÌIm/œ3*J™¨ñ ”&?ÉÛ)@j] 7/<//ïqfh„^”%¬â%ByßoAa£ùÄFúdò¤}tb)Ûuxòuˆþå'Ê=Ù àößÝÃÿóûL#1S‰TºÐy)ŸÓŒðÊþtk×9@ÅkÀTKûÍÌÂ։ϕ÷zM¨z†;‘iá8øu‡ÕƒeÌúW‡‚ög×9t«÷EDhæ5Îײ¡_=\áàrÝDÒ.2¦F]‹1s »×É› •¥pƒýR÷šUÇ¡Õê*‹ÈÐÓ©¨< g² »ÆŒf¯–Ï’ ÜýC9=Kóc”º·ÐºdGgJ¯åàœÇþ¹}T%eMElr [Q>áéÕŸÞó|´!¸ôåù"˜®ØðÉå»P‰èSc Ðà*Œ{ôÈι³*³æìW”××a&}nÔ«1Yé<¼>B‡ÍA\‡4gfF$åGNz§"h”çõ>ŸßÁ½½Èƒ&¾×þX‘¿_3ó¿h¾~¥YE…K†?Š“yµè ƒÖÚu½]‡§XfFwÔI¦8{¶§ýã¯_Ã{w€X,pŠ|íNþë¼xmk¡Š‘”ôyíÑ­àºÊÁYÂÜÉëumSU²ùYŠBbB‹kÎ4ê[Ï躨2ä5“¯g|´R  ºV«Uì£wWXœkpþüÙÍïà=£®-xFp®‹ß¿¦i°\Hß~íЂÇÉ`ϰdÅáO-eÛODªvñY‹å‡Å¹n¯oÁõ",$|{1{[Þÿ^½Œa=ÌTJØ÷ãˆÛ4 Ú¶E=3ÒJјª#oÙMYbžINɧ’†“%ëqÉÝ>ÊÞû¸èT*íMÑÆ¦l`s¾ûñÄ5g¿ÍœŠr¹/”ø¡@= ó‚Ä$H ƒ¾˜Û1š¿˜_³ñø€ŠDÄÙˆ¾tºŽ¾?6U(^ÔaLÖ~áìó6k<Õà ^7„Ö¤Èï'Ë$·ëðlÖýóiwÜþém´«%š³ ,?Y¢®k,Î6™ñŒ”•¥ÝÂÝÕªi‚ž©?ß3ºC†?tш&ÐÁX[¤œF•A»Zbµ²È«¤×¾RKfÆâl#ýñƒ‚"‡{¡èyõŒð¿÷.½vÎ9Ø™•gïN÷uŠŽ_2æg\|õîþý‡ñÙYÈÓÆ^ºÒê/pùK—ÅG^ÏùñG÷`UsàààûŸ·¾K/`ÿ³¯”-¯>FÐWŽ©í²¹…s]çPŸ Br€\kÅÞ'ºW&žCZÇY™=¡AöƒÌzÄE@˵Õ3Á˜!ø.ô ¨Ø¦ü€?¤’´íKÜFw‚›G{¨Àˆ»#ÓÞõùË«¦‚¡‚lèëlº—níÆÕ‚âA˜Ï·}žóê@5¼NŸ,1øü‹8²ïªWs pɦWDQ ú¯€ÈœQªê3§ž`z¯=Gvè‘X‘Mc»Ïf¸—ÿ3ϸtãÛ×±Ø_`y°ÄÍÜ„ï:t®¹èH¥öÒªTd|Ç"s¯» n¦ˆ×/íjŸ*²9H¯×ŠQ41s'ÐL޳|ÐâàçKìÿ¦”åßøwWñ¿óU¡¬©tmöA4ÚÅgñYJàºõŒÐ=”kmW+¬V² ˜ï®ýé›h1¿I0‡•RªÎ_€%;F{Øbõ@QûÌh´áIÅÙÞú‹›X¶™eüàØ¡sás¯`>·@,¬°¼¿oªA½K±XaV ´ìÙO;¦,Á¹ÃŽ®A#Õ¶±½jRÙÛÀ<ט¿ÈÅñ¦~'”ûâ(ª@¤B?JÌ^_׆ùàñ§H Ï?[‚u_è ¨tõ̦–@?.áî­Êébf ÒóbKàÒà:1;J"T´í ‡¹(~ïa®(–oÍÓ”îŸr>³ø àŸ—ÿ¼ñõM¯}šÖáy+¿}E‚«²+ LeÐÌ›~cÅ-^zçÏŸƒ°¼¿Dwä°Zu‘gÎÁl¦~$Ö&ox a–ÂXœ]“îVhëmÛâý5®ÿÙ·@°ÿ›ûÀg£¯M¤Ü'±Ù ¯‡äÏîÚ‡]¤q|ô!Þýñ»xý÷_pþ_í˱ãse‚«®N¨rÌ ›(€ïýÍ{hv1 ¼ý··péÕ ØÿÍ}ÌçsÌÏα¿bÜ(§r,ƒ$_·þò&Ú¶Åþþ>º.TE²MU¨f¬=*['ëÔœr|âwZ Œ—…²"‹Öà‘Ç¡û]ñ…üÐý YfT¦Ë6aåh;°ÔíOÆ„’HÑ×ÎøõÌ"zOÝÇ€7z v‚¢ý/N{yÀ/>ƒdËEƒÍÑh~i©¶ÜúïÁÌÒî‡zâ õiCáî¶!R=iéþÉ×á3‹ÏàΟ¼‰ïÝ› èŸY|ïéʧ&ØŸ¸ÏkSÊÀÛó6þúoÞ`à{¯-I5´™‰ ‘_wXjÖÚ>º˜˜Öè‰;PÅp e9ø.”Á3,“4‰ ÚU‹š´§~¸” sܺõ>êáê^…µVÕôލÿIE‘AæœÓR·dÜ8êÝÞhÏ|¹Ä­¿½¢ZÌ›þõ~)›k½äÿžY­JȉïýÃ=ÜúÉm¼ó×ï iÄ¥Žl{wïàæ÷Þµo¼‰ó¿%œ}šM>­Ó3^1¿\âöOoãÖOnkµB0f·‰sg÷”rÍ*F˽J‰¿>•‰¹âd9×|ÐÃÏÜÓF¥o”ï“Ïó¨´LE¾¬aŸG~ù‡ßÌ< ðúü¡/ÿ×>ì šé—.J8j _¤hùd³>c¶Ç£‰õD—9:«¡Ï6X6pî1>ïÄðŒ—˜œyâ‹ïG0L:íXþb‰ëß½»wÖZ¼ñGWqõß^ý•œ1á8}?wŒóHsÅìcõìÉ3ú§[‡îçh ¿øÌ˯àƒß¿ >lG¯ý:¬ág^~ÿü‹O¿Ïi\ûöuܹ{Î9ìïï£}(ýóƒ_.Ñ4X~ÒJp¯+ç°ºw^Kèv¯Ñlݯ|VK™››h¼Ò±Ù‡S‘%ßÜÃ.>×Õà† Øux÷½wqpp€+_º"@Dcà}äÄ7güb‰ùž…[;ÜþÉ-ìïïãÿ† ä™Ñv]Ô`>üh‰å'7±8·À•ßþŠÈçö\dõQÅ‘íj…f>‘;ìЭÞûñû8øèæç°{šãv ÅÝ>ĵo^Ç•/_UûÛÄ–'Ó4#8çðÎÞÅÁGØÿÜ>.]¼,àÌYå}áî/?yníqp©Ž|„*ŸÞ(üqW`ôße¯‡ùGãì2,±ôÕ(ï¨Óˆ‹_”ò²µ‚ÛJ4ù#v®EÎÊ'Œ¦iÆŸÏϹv›•O¼`»Ü¨'Λx<}Ÿ>ËöMÉiN:$5bB:”*‡/âÈÅ—¼ßTéáŒqñèc¶m‹¯~íu\ÿæu¼õ_ÞBÛ¶¸öõk¯íõ_¹9¸üå+¸s÷Îéæ«ižømx Æ“Œ§Y‡>Æ+û¯àý/]Á_½vŸyù•ø·äïhõ¤µüU]Ã\øQëð¼Æ­ŸÞ‘œmÐ1@F|Ðoþàû¸ùƒ·¢ú[·îp~ï¼ØÑîÚv%eåµ d%øÖ{6”£™á×,HþcÌ*ú¢%þ³sñ‘_;®]¡]‰f}wßáÞ?ÜÃ퟼å}Í²Ç IDATqÓ Ù}xÚ½9V+yíüoÇå/])æ—¨†­-š½fæ`g„ö°Åò“n|÷fDòGà]Ðá‡ÒŸ‰DŸje/-°þk…Y°7LJ`±Ø‡îÝ»‡·þ¯¿ØÃ³+cÔ¬Y4{ ÌÏ-М]ÈüxÆÊ1V;|ÿ/ßÂòþÖ6 ™Åb±€™Õ¨Huˆ#< d>Ëö5M˜ÄPQÒˆ™:{¸cènSÅw‚íiÀ:ûWtÓ(ÓE–Ëy~ Ä~$ëRu|Ì"™tšJêf´Å:ÌçTé]u™ åÙU„HnÄŒüzVkáüº8«PœK¼èº÷ƒÒ}5…ïI”AVÕ®ÓŒ·ÿûÛ¸ú‡WqåËòYœ[àÆwnàú·¯ÿJú Êuê@*JÙ¿#ŒY…Nè©J÷ÏbBVŸùƒ®ÃŸÿÓ=||ðñ¯õžjžÓX,^×@ͺ¡ ]‹ÅþÅ yÏhvêç„úhÛ”(x«Üa;«Š0öŒèÂ7{’pyfØ>ÉÂÊR¨{í'KÜþä.þÞøßßÀry Á4{ŸÕÁh‡YEoêø]ýðк—öÏcÿ©294/ïƒD¬§[«/½uVa+­ö2cuèàײ èÖSÁ³Qþ“ï;°xù<:çàŽ:XÔ ›@»ÜlÑzƵ¸+÷ùˆcœf >:ÀõïÜÀÁ/`­Åµ¯¿ßý¯žj¦ÖâQkù)çêy {vrR’FoYO¶lÕTJ±S±vÕÆØÐœ¿&8U»[®ZQ¨ >$Q/QÖ„^Ø™Q˜šŸÝÇå×ί´µx˜#Î|GzàÞ?àîÝ;"›{èàþþCqÂ[û(Vƽ—MI` ¨Ì®ÝU7¾Ê`¹\J°'`1k¢Ñkâ›æH6 u õi(g/`AÏ¿u>u¤ëeSefªÇçB6^R±°q³îÍTê•ëRƬßzÕ–Ò¤³úúrÏ ž¢, Oð¼s%¼$wkF"3uVrFܽLRØú Îsá='møs!šM£O¥sùrÔ¥´÷^P¦ÐÛ£`êµó2¸ÿÁ=F€ ÓU’M_Ü©à+ê…õã ÷Àt~ípÝ A Í"OÛsnW+,šÅ‰ï¹ñ½ïã+_¾‚·ÿÛÛ¸õ“[¸ù½ïãFæá¾|ÐâÖßûwðÇz ßûð‘¯ÝøÁM\ÿÓkX¼¼À{ÿã]ÜüË›¸þÍëñµßýí+øánâÖOoãÚ·¯ãýÿñn Šäûé¹ ¥JCTÌícúg´Ãñ¿ý·O}Ÿ§YÃkß¼Ž7¿þ.}á2nýøn|ïF ôZ§©µxÔ>î:<¯!xË5Õ`îÄ×EÚ¶Ù63hÍà™|¬­cÐùðïeÕc5g™ ¹j·;ͤ9ªäQ¬Bé}—b0$H¦ÌkÆÊÖfÏÀ Ø)áÞ+=O'ìîßÝÃ;ÿï»øø`‰z±UÛÁ+:?$|¦LAŒMzžn­­…^ôþ‰ Vë~Œx(¶ÂMìï_ÐØèUú—Ñ=ä¨fHU²˜íÔ̆œU,ǃ”6È>´ [B„²-¬ÉgEF¥`Žs0Ýt&dø¸ç”×V)ÃA0”iN ¼Å̺ʄh6 /òÐéãähþGUô" ¾Ì¸Ç3þA Á!Ðåd *Eïrä‚tµ?RìÆŸpM4V8^øŒ>//ûu71ï¹3ú˜®?AX ÀŸÝÁõo^¸ôùËÒûËÖâÿÝáÒç/Ô·6½vû'·å˜=pñµË¸ù—oáÚ7$HÜþém\ÿ†œïò.ãò.Ç|¬ °ç ¿À³×²ý“£îýì1ÖáÂù %èÀW~r Þûðô÷yŠ5|Wƒ3 ”³ëß¾~ºu:a-NZÃÑ:=jžÓàu²µº¤ ¨-ö¨ILU$øw’ÕÏ(rþ=cäå34SJ]ì+=Ï+ÅÍ(¥»uÝa ^w€!ØŠPÏ ìšÐ±Ç»wÇó1ag®}Ø35V;|x÷.nÿìÚ-ûû`Í´-D6&žT™T]‰•aÜõ¤!ktìA»5ê½¹Tê²Jòr¹ÔÿÖÏ­Έ)\§‘@¡×š^>¼Íá~GV¶F&&ì@Ûr£“‰ À`ÔdUf•29XŠ = 9)@SO±4>ÒÐÏ@f\IÙ†yC&Pe¥–†}qîÉŒšËýÔýÅ Þ'&?^e”³ døèͨ˜·6¢Ž3õ§À†ˆÎ|>+2ÛVˆ6—EG×S–î›yƒå/–Ñ3|wÞÿŸïã+W¾ õÅs÷ªa¥¥`·œâ5ç.œ¿P^{xíÐ Ìš0ù¾§ÁAì)ÀxO³—.^ù'¹ÇÓ¬a×uxïGïay{þ§Z§Öâ¤5|¬{xŽØßpvÏbqn! 4ß¡[3l,^’õ—r5ÏäzožîEñDfˆ•©€æŒE½×hKËc¾rX=´†Ö3£{ØâîÝ»8¸wOíp‘ñ¡ª4Ø I¥V©z{ ͼ§f4;P.¿-ŽÅìÁëN,fUÏTª ;Gs¶‰ßùÕªEwèÐ>X¡] ð; €caø¨û/ªyØ1¢š7 f§ï‹lxÅìÆJ;Aå„ÅTÇGœV¹Y’õ¨rPYôžä…_² á@ô”ª³°—Mø[æPÊ¿ÌJ+zຳÔl=¿—üü(.¿/3ô•ÏèiÃö€Ox€ ¹óƒB´dJñî JúJg¤¡ Îp]NØÑh¨åß§ÅxÑyôT"„‡Ä)•Þοzw~v§wîÞÁ{?z/ km´õÞGI̧ÖZÜúñ­É l|x<‹VM¿9[d52¡g!˜ó˜ëùƒ®Ãµ ïý/]ÁÍߺˆK/š]pš5¼ö§×pþÕó¸òå+¸úGWñúœ¤wÒZœ´†»Ïmô |ßA”ì4‰cí›W€'íæuZ±,ètö¡lN‰¾l/ï/AÐÍj°xÀ£}èà\‡åýåà·<Ý=¼NråÃ*ªDE¯¶5šssPmc ó¡%!^ îp;]ôe!’ Œc»«æMêÌËDz[XëJ•í¦kãà#­îXc0m®i,”’[3:õ€Ö°R’ìá×€gS¹î¶»"1|ïY[>à·Ty™>ôb¹>ö l—ïÔwÆ#ê Ãdæ’ž÷à‹‚m0iðÄmú’åŸÍ¥h©°°‰_`"«”ÎÃoÚ k–}ÒF¤<&O¾§¶RòµÂ"fü\:Ø:x™Ñ5ÚûÌ›¯ïEUÉÑ.–ýé¬ùxý÷¾Š«ÿö*šÆââk—°üå7¾w×¾þF<Æ¥W/àößÞÂWþÍÜýém\ºx¡<þð\§xíÒÅ Xþâc,^^àý[·ðÞoáíÿòÃøÚ¿¿ƒK¯žÇíŸÝÅÿóñÞß¼Ñu­ø†?昚³HÍ}RÔý¬Ã¥ÏwþäMt??ˆAþÎÏ>À¥Ï­gì×õ3_Ãåý%ÞüÆXÌx뿽õXë´i-NZÓ®ÿ‘sö,GŸpT¼f,Ý2“­eð‘vÄJ6‚ÍÔ¸¥sN‚]h'ö%-Û÷ŒÅ9°­Ydu+¥òÅÙ&kÙLˆ‘v3VÎÁ3Rv«q„ ¨ý¦i„ëÿ‰KíiÍ!S•WиTˆv×D¡è{Æ*S U’Cù>^óQ§b5J«6FÀè•Äù^zÏŠL/ç\Þo¥_¿v±ýŠP+.V?´"`b§Š­9¶DÂc>ô𫼔ä²/S@Á *Ðho !ù8hÞÅ^¦”Ø"¯»øRc€åxÀM‹ÂƒÀ1Ãì<§Ÿe;˰øÅ} æ0#çªNíOPÞC8¿Ë®gœý‡µÈňòk9•MpÞ“ë‘êŠËyüý ªð“klâ$ë™ôݛãúwnà­ÿü®çÏa­ÅÕ?¼Š‹¯]ŽŸ¿úïßÀõï\ÇŸÿÅ÷qþ_ŸÇõo_/Ž=<Ïi^»úGoàÆwnàÞ?ÝÃâìßúö·Ê×¾{×¾q óù׿™Îwñµ‹øÊ¿ù*>øŸ¸ýÁ3YÃ7ÿ㛸þípÎáê^}¼uÚ°'­á¦9Ø´Ïk¸®Ã*€Ôfk¸ì=œ‚1ƒ•6¯­[ Â<ô–ã¦KãHT7è˜"ØZ‚¤ZíV¤ÈöZÕã(njÛÀÖ$6¸=`fMʆ³M‚€þ‹s š—öÑvb³–×LEâ3²cÀ¾‹Ì2[×0D=Z¼vÌÔaõª±sX«=tÎ*Qk’EA^§2{Â:šø…´tetíYl€á¼íˆ' sÏÚb˜~ãâo¿ñ/ã/I¢Ï•Án³{pBF<ñÞ˜r»ÕLúPo­üÜHP7>ëãq@Íz{€Nº ’µÃ÷ uòû0>ã3ÁÙ\hýaT¾GúR×–\ó@=5òvÈäõ¨üÜÇ?“lâÞ/ µŸš ~šñÎÞ‹ÿ¾õãwñ­?»®?~C‹sóS÷q˜`ùÉ ž½€¢¬ÅŸÿ7°ÿ¯. 9#ß×ïwû¸¯íõ'Z‡/^þ"Œù/õÚe4†ð•ŸÜ:U ÿ4¬Ã›"èýú)ÛB-78ÿYÕ$øÚ÷±_uš-j| ¬һ“{çܤœ9S´QóÒ¾;òQ)_rõñ99õƒ¦ÐÞjéc½®µCçº(ÑëÖš­Ï¬ é)%„íj Öëá5Ãu1ÀÓn-ôç*pÜfæM4ð òÃ!Ãê›KtÎÅó60‰¾N)[§€û¨vfTsEQÿ &Ž[m±ä*~ÕtÏHÔÖRP–|iðß( üáµaé([¸ ©­ch [ÐéÔ¤eìêƒq‰_ö(ûÛðÊMF,^é3û\œ€[­{Ãy8n&xb#‘\í8ÈëNôʃ_½/~L|#m¨>„]ô`¯2t ´ªƒ°-Ü£p2ôLj%gSIyíqƒ|6'OS I²Ð2oþ°D¢w>{BÔý®Ã¦y Yýiçþ×q §ÖáyÅb{ç¼ö`6 ÊJæ{¦Ž@LéÁ—æ,D«ÃNŸoHƒ*ke$…”ÊkkSöD”@è\P ²–¤¤ž”ï<–VVñ™[—Zåì¥úÀ=Ãîvà=Æ|¯mµ˜Ÿk”ƒîSÒÔ'³¶f¯W !¯sà{QóëzÙ䄘áH@怵ŠÚÀT‰ý;U¨N–·¦šÝGsÖ*áÙÁ½xR^8[8·zS–îËqR8àrW’ÙÑFx¥ÜÊL-®[uÎç5—Áiˆ@ïÇײd>Îyúf¼!Ð ´Aøwñúó£hu¤¥—‚÷8XòfÄ!Ò=S¬°$ƒ~*÷èœSdø£Ù¨&þ–ÑóÇ’¶Á>nªd}fpOq¼O[¶øXs¹ƒÔëTÑg°O³.¿îk×á9ƒƒ±ÕÌ•ˆÀëvÍ©z ÏÇ!³MÖß¹3€¤µ¢zµ%Xk£¹X·æ$\š™ Â8‡ƒõ*ŠìX203¯Çu+E’R¥8øÜK ÔÀ¯V=«l­³W.¦gŸQ?ĽqÕY7¾ç¨èǽΧ ³–©n^¤j R¿îˆ#í’„lñ:£í†ú5!.H AµzTÔ” v'-Rm~=,ÞØ@p¥7)À Áz=Ðõnz‘MÒðk¹Ñq-œ©Ô­*”"3ªõ>þ!˘{÷Yàì³Òv¨„*@nÔ{ptÓ›xÿ¦Q•µp-Q=/”»úæÿNÐb6H.Ó$r>ÿyEä p/䍯‚9yÅ%xnKøs‘•ãî qéŸ`l×á­ÃsûûûpG,475«iÚC‡zFª-Uw“@排¤±­­ðë‰`¬fTT/;׉(ÌšSù»÷ 2¨‰0iÍÕhæG34³`"¡Í!`š8nNøÈÃîÔE÷ tk©°÷I³%£ÑÙº†±. }Ÿ½/”ùÙ%=Žn]™iÇÐÊÄ(ÆÌàÎú4E¢»pÇ)ÛßI‡àþ‹g0=Gþýu?½†”)JWÐÌJÚ(÷¢rzEöÙÈ`¯Ù²ÏJߢ•ŸÊäTêíGÆ„°n•2æ€V4‰ÝN?OÅëiD0_ðÐã†ãåÁ;Íß„]­ÞgØuå*Ljy§ürlÞˆLž!fïuoûœ”‡Îlu_‘ª!nÇiFn€Å=P“A=3O\ºß®Ã³Y‡ç5BFQ–¶™ÏÑÌÌ›«¶•Ý‹Ê[€ÐǤ›@éu’”°–ƒc-—«¸ ñ¢®”7N«r|·îÏ#!RIÙzÏbn¥wŽ Å´]'Æ9ú73‚Ý­ôVh>Õpë.nj<3ÚÃV“;Ѭ·¶F=³`’ÌÛ=lËŠEKª„-fuêÕ*…›~/¦¢¸(71ZU°š2˦ä¨üÌÏÔá™ ¤Ø®jRÿÙ"Ç(¿ø0ŽË~ì“Lž¡²W"½û©Á¯]*-‡]PŸ³*l\äŒ\ò Ë͈€8nHô~òrxVB/À+…D­Š;Ìlüïpô¸ÊÌ8xPò/d‡_¤Ýei‘‹ñ×wi!wôøÙ1yxÿU¾ffÐy~ Z¿Ç™-”Þk™ŒÇßÍm6YÎEþÛ!J}a"ÉÒò¹}Ü€µ]‡§_‡ç5r'¹\ÜLoAʃ׮Øí7÷9Ó ™®‰rÎ|,å‡g—Á;ÀÁ:Æy ÖâS/À;TÂó=Ð9'Ÿ©Ê6Ò¥‹—DZV-d¡Ÿ79›ªw¸« «ªw¬¶º†âƒT‰NÊâåýâ86ÐÄ˶mìçÁô¯j±Féu '´uî¥7ß±‹xfq¯‹1mpÞj'~€#Ç@Œ%ÏØ‘n°ëX§Ìeó"}(—”eø¼ün§[ !s®t&;¾/ÞË(õÍÑ—×á7‰ŠdÆÞòÐHØhL*‚ D| £ÞHß™ò02‰ˆS?"÷‡ŒâKµ±¾À£®ëT)RÕªº&pP°êKPå$•éE•‰Š—fè:' ¢™€ñê@£ẕ]‡g³Ïí7³gK€²ÚÈvk†ç%V»DCÒH±ç¹SÑ˜Ž½ÍR€­gdíÈUÞzÆrÙÂîæM9úñ}óc¬[Ùxpî j’þ½ôÕÝQYQÁ«³gB=³ ]©Þ†MDHÄØ3ºBߥU \yöfIÞà9Mºñ H®¡¯ÚŒù”éä‡Ðu]Áí¯‰ f4².Þ9Ù,人Uà%Š]\ɲ~}Þÿ™D¿sšvŠ€Á˜ ø’’^¦œWøÚ1LûÄë“×XF±§‚ò Ë@›gÚÇSf0]šäÁ…ì~²LÙÔºJÁË ¯(•ì§/DXÐ\ê7Ÿghñçî€qÃ5¼·ìÜœ#a_ðg¤ 2+Òåý%êú|¡¨Eú=Þ—XÂwŽ(͋̅!³CÑ_üqÇâåýí:<í:œiž›a¯9K®²g珦 uq/Èt›i‹íRõBì®)¥“•jã~fÞ4±e ›Œ$‰ 2 D­ÎöAœLúôÝ}'åñ,˜[S§¬^õ`Ú]ªIãÅΰW­°zÈè:t]‰ À?Õ™¥yôåÔ»¨’ªÉ¤­S%,OâœjÍ„5w]—ð,DR1Ñy«ÃšDì—l¼ª¡ª›<,9 Q  ]ú!OÔ¦ÊùY"(B.Ôd¥å!½-(&•ç¨Ëq¦«Ï™}"sÔƒ1ý Ú7>@ŠBÊ·üûh«QMXúÂ$=¿a–ø¢ùL¯qTÎÏQùa2àÇðl%¾ðãxýrç;¹Ï1ãŽÖYrÿô!( ˜‰"킦׿¹¨¥R:ÛÑn [!2ˆLf£ëãgrÊa¨r¬³ìË)~zïgÁ1¨Ä ôwÆAoÐ3/&¶ÅM 'F(q]úüE\ùè ®}ã®~íuìÿæ>êÚ"#IJÀ9~qq E6­€¢ïÝÃ[ÿõmìïïãÒ«—P[[€w\zõ"®|y»O³Î_PZó³¯Ù5gh[±Oe¡ÔÍç ö?×eý”ДɎ{Ø%'}|&°>/…ÇJ%¦Åic@úÒ°Ì{ÑCm´džš]°-*Cœ¨Ë¾½ó xŽ’äá9aÏ$e¿ˆ˜WF‚¸MŸDl¦¥žIµ¢Ëp#–D%྘µ¯}l',Î6hš¦¨ryfÉì×.ZåR&¶Ã뤎zT¿qþ Wÿ%”Н†ÒǸÓ‚5q(*~ '3wÎÜã†üø\>6žc€gï~xþ ™öp ÕùÂñsc‚‰Ee#Œ?_pŠ*Fz(¹£üþ³9ËæûÄÑOˆñìl2¨™PÉË«pçÖ_x1•ñ¦Æ»wñöÿó>úPDA¶tÄÉ!ýx‹ÅK \¾x Î_€µMÓHÉô)³Éí:üj¬ÃHo&é~Í0U†IÒì´Vyɀɣɱ— ×n½ú|èÆÅe+¯Uó&ðÔ9”Çãù4p†MÈ&M‡¨~·N}z@dtþäÌ/4k{ÆÿÖŒ™fÒ7¬¨Lá/ºÍ‘ÁþË‹ žó]\çÚˆÈeq£ÎÀÞDˆù ÎëêAËî¡E6Z¿qñËWÿ%fˆ9è%LH69“Í,ËЈ@B›)ˆýá}™«M•ç`¹|3„’Où~~Óýëp¼òýãÞþÐÔgøâãͯiÇ:¤`Цù¾gSÉòT†—Sçiè§æRP»®ë”JÄ[kßM#ƲuýL‚Ëv~uÖaèÏÏ8fš9ˆ ƒ‰ÍL«;•‰H|ÒJsââÇêçÚ%ïú)‰ñ@_®JdÊ|ê™4½¿òèƒ! Í(îH{!öË{ ;\ÔD Dêw;æÈ,@ï!>:\XŸÛÚFÆY=£X‘‹*ïÉTöÆZU5’É´î7<çµÕ±j»²‚æ¨"T\ SQØO|Q Î}øÌ‡ž—Ýw†à4£€¶!?A_+QIÉCxÍm[Ãd‡ñß&zá¸íÕ^‰‘Ï0[/-Ç&|âÒL„ÿx²ÞþFŸïþ_„cóãMÙŽ“šµµ a>SÙŽá3ú ¢g ۮïÆ:dí}É Ênd‚ÍjhwB©o"g £>ôËùÜsN©nuƒ¡±ªC_A-Wåsîa«+c'ñÞƒ­­l.¤ï*C…<¡3Øc$NqÖZÔ{MB¸ƒbÛ3‚çTŒ†×]ø‘û’*‹Uu?wØŠ`ÏQ§%÷H¥ š;^(ß®ÍL¬Œä¬ "B»ZE»ß¼Íª~gÏ4â'Påæ©tí'9ó4Ðf‚™Mx=/ÇWª,²ëçµjÄw‚¦g°Ê‚«Ò1|O 5£C«iŸíª=CźŒfÝÁÖ.Ú¾ç>3³©’‘?»Ù‹;Ð1€]ÄÄ6hó£—ÖÍš ÀÑÎltÄcFª8 … rµ©7Ì€œ4ÿï,ã ¨øÒt&³•…¨[å¯OíÊ ­ý,û—Ýð¨cIDATÎq@í˃þ°Ç>Ø@ðÍÏÎ8’*kˆ5–®Sîqy¥`ØÚˆ½ª ît©ýàÍ1”ª_ =©ü|CÜBÕ?P³×¶c;¶c;N3š½RÉÁžM¡”ÙKFªIXemâvÕ‚n"›km¤ÊqÖªñë ´F™›]E¢‡O §aõ®_= ­GÍ]ìL=ß‘—Ð †8 愞y´m ÀK‚êô-™DÉË…n†IY%¶½¼úû}ìQ`fQgø†Ü¸Ç³´9V]U^i׊z_¥`ê¨ãx^¥k땞õvBeguáa>94cu/ÕÖ …9` ÉN§)«£íhÜ)uø·”¦OØÛ6åbÔ€Wþ=ˆA=༟ì‡Gߣ®8.í”=¢Q (ðñ@b7 ù·Ë€ r#ö£ß¨`þ}¼Á¶w;¶c;¶ãƒ2 ט´±`(X“""PÿZù4•ÐY½¶^Ù{¸¶˜]>p^sF°ffA»„ÆÖ±¯(è®÷ÒBX{Ø™A³g±87p¿XF~½û¤ƒßåX!èœC³×¤ªu%J|Ášs:í%ßù8úÄ“ñ³Ï°aÑZWLi¢)#â ¬­%÷ä0ŒÒZAèœè þ¢ËïBÅ `-‚p>ãà§Ë¯Âÿßì—®Œf”ÉØ†÷*0!ˆœðE©-ÀuÓÖ®Å'(eÜqïW*ŒÍlTH‡Up'ró£ @Vj7™Wðà6!y^-ù$mô=C½ÙõùìX‰V˜#Vã\ç–= ©ÜQ°Jº€Í6%ÛžçvlÇv<ÎXÞ?Tš5ú–¨m½gÑ­%s=íPÒö@ÂI‚Tðj½­e}ÏñùÌGŒö°µx¯íƒU®UÀjí°|ÐY’zØ’XuhïwÒÓfNYÿ„…,´Ÿ$½É-wa`s\Y•xî¶ê½9eä½ú@“êaq®)ˆ,13*8ô43"¹änK"qàÂî!à3‘WKåÑ'±•¼48)ñ‡‚4!XOv/6¥Æzf×ç*ySŠr2 e¸ 4fú»è{½ñ"à oèÉë{7‚Ùd E1¶ |¼¯0êÙÐ'³Â5ö²% ¸q3°¶Æê°“þ6D5 *[¢ŠE§N•.‚zÖ”ÏNhÈé:ºê—·|3c³\c$€¡¹×grå÷Ðò ü@'¶€ñ¤·Nж¨m »'›ôB7\­pðO÷0Ÿ7i3CåæpïÞ‡cÈ“;=¥5â5ó¹ŠøxÎÀðÒ’h[¥ç1:¨IÊ÷Vðj¹šOZ >@®¤uòÒ=åèôÖ˵×#­m"ˆ{ñ>t¡hcJâ…VýБ­‡¨Å«ÆL8P®+Ì|2ãüµÏ~$1+A¼SöHÆ;ÆTÁ˜2£ <ù5ki¦6Ä¿\½Ì„@\¤2‰sÔëß÷´Û±Ûqê‘™SÀrp`t‡®PÝäu§¹¡QÚ-Yº¤ö†”x¨,'»žKú»k“T®fì­ã¤¢€jÒÞ8ÍR;!ç¸Ç—qŽ×Òÿ_q <û×ù¹|øKù‚ZíÃ6rëE>ÍE¸©:gÕìŒ/ÏPÏ‚áÅÍG·–‡Èú&ÍÊžïžµ‚DÕ<„õV‰°{…œbÐûè1OȲw Ö9a²\^d 8ƽQªÝÀVµš×Ùµ‡ÉŠ7†2)P8é…cB^/ÆÍohû·qôƒ£ÎEêé”Ññ¿ŽÍ?&SÒÕWž2±î‘Êÿá,;Éz’J•¹#õ˜¤MnÇvlÇv‚°s“,Û©ÊdÆ{€î(ÃuÍ´@y•dëAAhþ.úÊs´‚_€‰ü~Td(I¦Ý•¹Ž÷¦ZU^îÈ3ÌbJdPφÉä€î;$%<ýl0¢xÃOŽ*w·ËÏ´À#Œ@xÕh a³K›ó%õ-·oåûìý#¾ˆÎÏ n2À S‚Qe@«ÇH=ùB"åY«!g_9œžÇ-?Ëa!Àà#‚`¶ÔºíØŽíxÒÑ®B"“ì°C?;ðЙîÕn\ƒ™s–Ñ€ÆÄµpÔ¡µ‹¾íÝ:ó= £JÖÒDÕã:î¢RU’äX$ÝxfFÛ{xÇ™Y G ö¢¬%#B?5Åg¸íE©ˆ±|°ŒmR2º Q 6˜aÏÔƒörVáE† [K!TæóõÞ\Ôòœ÷½Ã®X#ƒ;PàéHñ$ÚÖÖ‰š}ü5ºS¸RæÅª<ÔÇÛN¬b×¹[‘Œ<ïê±'†ÆÞh†=4lC²æ€žÜ5Ó½ëL^‘Â5ïø±¿üÀK>ÞY¨hh Îõ™spŸh Ö;B‹ã·ñÔuåxF¨¦„MQ®"UãE÷¡ßŽíØŽ'|Ô©÷{ö·^Øž9ö²Š6ï˜)"õ“jxŽ™d£=üàêæŽP— o>jA»„:×s àæ ”£¼ó`’#×ÍZþ§„-kÿ^þ¶rhÝ¡}p_)®hE!¸ÏM}cD°F¬].¿Ou²«Mí ü{׉ÐÚG€U„ælSœ@f—Îý¶P"—>iÄÍ…¸×ñdv8Po×EØœŽÐßõ„r šX¾@1äèëQ+8»ÎËÝC§¶ü:«¤|d†÷£çÊËü1;OHÃI°œÜg¼+MvâZΆùɇ²"Ôà˜¢•`œ×¬Ê çsì7c@CNþàh&ÛÛ±Û±'`¬’sÀedr¸U0×vð*JDh¨Ýk4¸–@f«·–ÏHBåÁÇT0¹‚ri·î²˜ôäüäv»5gb3<°^W x†;îÀkñ"É+©T´KIK_+Ê4#Ô{‹¤°‡ì#°F ;fıl_W1B¥ë@T£Ù³¨UY¯[' Cª¥‡³ ‰g¥¦äYÔjÙ{TTQÌ€'¼Ds¡a d¯üè9rîýÔ¤ž4úAûx !‹`Ã'{!ÿ—iåÎnÃ’ûÔˆ g¹x=&ò?‡£8O•uÄk^ߣÁ[‚¶)€râ’g"È/ŸÙŸS‡ëÑóÊͨ†r lµÆ¶c;¶ã1FÔªV«"Jcfu4-ókA¢£½øf/,N¦-qƒDkhFØÿì¾ö께­ŽÛ¸TÚu+®[KyݨNýÂ"rá‡H~&º²g¸>Å=yvêæÅ ÕØ]Š™XŸTÏHœçuÊÂwuÚUWh¯tN2x"ƒyØTèÆÂ­:­ªÔ³ÖZ5ëÏ*åʯJ©ˆhÇLl&Wáá]32‘¡*‡üú[B¡ÓŽÑ›„*ÏÍl´ÔÌ(­ ãçÁt7Ëf'2b)™{L³È³²üN)ÿËòFw”f‹Â¿ûì—.þáËIÞÍöÆÞ—ÈùS]#”ÑXr`ðS™R”g;¶c;¶ãÃTî;¸#§¹$L+ê`w[µáfM¬˜Ç!kGä‚™¨®ç]Âq[ØºŽ¨ñTž†¨îí$£»WG.{Ø PóšÄqæ ¯^ð€õÌ,}Öyp×ÂÖ Ø¹$Á«*x‹sê¬ÖƒžŒëЮQ(äuk‘ñe– @½WG»ÜnÍ`îTsŸáW+´«•+§V÷(\ÌêPñšJ¾¢Qß\O7pª ½ -Gëp]‡ø®¨/?,‰ÓXÝmà%<æŠk€7›ËÍŒ»[Ö‰CÙGþ^õÈ{èüÐ%|Âd¸3¤Ïù±–~ÞÓš:g¾P )u †V¼…àÏ”+žÒ1D›ÓoÇvlÇcŒ ØV™ØWgÏ ~ ‚6ù3XÊâd Z{ø Ó%(y­@Áœ[h6-H}V¤=)ý. èDp³‡sݺCÛªéήfèPtøï„\§´‚µm¸W‚%’À©€¿z¯‘ÍCà¾3ƒY…Èz†W|Bs¦‘ÏÏzßJaPgEÈø‘€{}n‰®BBHA_D† ½–JI­ì‚ànȵ²Ïôg eÅÝèúéN6å=àÑâ'nü<Ð%Frºáóyéñ˜áø4øRÅÿíüûüZò2úðòóŠCxoÞëÎ+á^òムIsƒ‰½#¶.ú ÚÞ”ð$(2û¢Nø å=ÞßN^³ÉZÛ±Û±§®³hæH™=ÚCÉ`KÝ”ÜiŸ][ ÝšaúV2p.•ÛšyKïž]Ô”§s @äÜË¿“`N=Sg•#"±ÉgVXêEàÍÎj`ÞIJ~ѺVÕQÏœÔè6 zÙ %õÏ~ÒœG«¿vOr8çè« zæqï­OÇ Jáy×G!9©„p»©†*BÅÇ™²Ûñ´j[ìPï%ØËL()!gR6ê=Ú¨N)ßåcxÜa–Þ«˜^:Ï,mÐð瞢-o¼¯!p/dí` ƨú¾Ì¨ók¤¡­.hsž¿Žœ•0eOy©Ùñ‡RÀ€M6»Û±Û±§b“m@,æ3níTýN²U»[ƒúº[ Lëp›¹èÁwNäáï4«A3ЉZmçhûÕžE1U»uk¯÷@íW)]Béß­†8æµVD³J¬™Ql/w­ú½sKÏ8ë=°¼¿ŒŸõœIªðh.\3š`æ×¨Ï¼Ppô;¢œÙ–$n™ ž8nìLZù¦#ÌuX¦€_æOÖ§’%mõå7•ysT$ í@ïr®aLôÙOÖš×÷"-lùo3ÙÍ8éY« Žü¾Ž Ìâ¢h1dJt¼iZrœžw<57å*R~¯Ã9Á4 /´J(¯ª€±äzú¤[%½íØŽOÿ˜Üø—Þ| `íÑêÃ/˜Ðˆ| ¿~ŒÎqôSÀãàÞé£ì«‘´spÎb>W™©Q[’ Þ‹¯»=cEaO¹úÖ9¬2§¹¢LÊë®e¢3®Q3%¸µ:á>½fÓ’IË}¥ÏÄû̓( É)Õ S•*!ÏyöP>}me3B»”ú÷=G–V-Ú#=–bî(3¢]BewM©ùŽA?9/ {_¼¯¾´lÿ0ñœ9ÎMŽjŒj—a’oû _Ì!=ߌÊå•¶Tü†b&Oc´|8_ã…ëšöÀ‚ûFkØÐwýðTÂgs®Uî³MÙ ç?’®Ò×W4B)ØY ‚ä­ŠÞvlÇ‹5*:õSCÜ=“³'íh×D56¶ZއXnwŽ£u+ ™¼³Èß±ŽÈY_­4Q¼/Žt~­Â7FÐä+/XÉ|‰ÄªÖ÷3ŒëÀ•)ýELÉÛª6,CzòÆH…€È€ |üŠP&›ÉY{¾Håc°Ò …Ó¯˜„ÌÎ’rÑ eªŒXÖž[ÄjÇò¥0TÚ‰MÓ ‰²½È6,²9©\§Hî`ã:µÀ¸ìn]|1†ƒ×¹©L)ê¤@Wô—3÷9C“^º¨|òRÆÆ1Üì.•¶µåÙbé{ôJ轘 Ù·OžÅ›çÇŸD8s„Ldß Éš6[ì‘ärãü‘èÚ÷kÜ~\bZçÕø u."UeƒA'þè·c;¶ãÓ48SµÛ€ÕÊÝáb€œsòì¯çB•«½…i Õ2z¤gs®Í’ž;PW¼Îu"^}ãÛe ˆá9­b9ÌØ Ì­öß1°þ†dÞnÝIæY ­ôZj›»LŸÉëT‘p cOXzë´7Ç<8ÛéF…{ùÜÀÌË_.3œ[ sl‹‡~;ÁTÚÚ0-p¸‡.ÆÓ€Þ—ë­°h‚unIvk' F*I¸iBnÂu#Z\G¼¦‚ÎÄç"Z=‰þ&mœ%öݾ®[6*¢lÄÑdfº·/_2ξyyhÒ#;VŸø÷C^àVæÒƒñ¾GŠÒÎvjIœÒ¿1‘>’ŽŽ™Ž[ÏêAï}`‡~Lƒ ³”ï©Ê¾ÜÛ’ývlÇ‹52€óðº™ÏSµ¯Ïk´„l*B»jÑiЗv$n5Su®ËÀt‰âF;P/y`Þ}NDg:Ô%ÑÍRÙwhÚíP[±¸õ‡ÈÒ2CÂW˜Ÿ ùÈ Ò¬zFÒG¯kÊ`ÿÜ<Þƒ{Ø¡=tÀa+Ïc2¨gšÅWŒöÁÝÊÄÒ¼µõ<‰ QEâNWÉf­ØK;¡Ù³lšìŠàÖVߪ{]†ÏÊ*Åíá*±úÐÊàøoYOFÅÇY?9â5 Æ›¿(Y6MAðYÆ\R>îòâ5„ãÕ‘?†ÏEgzå½›“Qïv—ÀÇêýž}Q7¾ ©€eṽ`ή+î7ÿñW#éûg½þŒ/ÉÇ)¥û–r¬ÍΛoÄ(Î#å¯+ØÐ«Ícò (•ö˜},ÝqŠm ßŽíxA‡–„‡OĨ­>ƒ…ç ™eïcQªƒ?wq©S€šµ°ÎÁ©msÖâÒ9Q…ãL|Œðk·~ð+íû —?zÐ{Fë—Ñ(†L­Õê„s`fؽΉD.*HpÕøáÖòž~ Œz¯–Ò~%Ê´fFâ Ø3ª‰î£ÛUe@‘…5Ê{¨Ë[J)àd„¼¢÷Ã9Ølø¥*„jRÏ:ߌDkv7Ø †šïc··©Á°Ð[„Š  [`_Ú]3ÞØdzû¹AC\@ÐèÇŪijþà3?pCBeT']_œ×üXÙ÷1 pHYsÚk¥óÎtIMEÕ €Ú IDATxÚíÝ_h×¢.ðÏÖ€ #HA dL‘Ùmsú`±ó?D&…ÚtC"ZØU[رwà4Þ“èä!WéC®Ó =IôD»Ð¢n± 'Økª<ä"oèA>UpÉC3Á,È€ïÃH£?–dýqËù~`bk¤%i-e}³Ö¬ „ÿpz-¬ÝÏ€ˆˆèUøôÌŒ÷K ~‹¤ÿíÚ@€EDD»Å­›×½;;³%´Ê–”ÒÝ%ï.!ü·cKÀ’€ %¿["àÕm0¨ƒ•‹t%땈^ uPl °¯Ë6[é›W}hI·ÔSJ!„»z/á¿ é†Ý¨}Nº\À`m " «>DD;Ù÷@©JÍ]N"y9ÕxÄÕh¤Uý`°»æn½Î•]éËc½‘¬®z{,!] uP@Æ~F.¹ž¯Wõh˶eMœ™¶DpPT¥aåX‡7´+ýæzÉh>³ýHÔ÷‹/ðŽgmØ ­W=Œ/<“ y$)%$ËhÏØ•}½-*Ý6ùAW¾-ßu_åN¶ €âGš€mÛPÈ€—ˆê (é$Dy4æ HHȪ£÷¶-!%DiØfÛrGÊA©uø9{åéMφK7¸2 ÀÉC¢=0³²C}t¯å €€lN)—Bª }¿êß7°–­Œ¶ÔAê–¶ jþ~·tËÃ9QÞ•ŸXÔ¸7m ª´PhgÊ9‚€×q:=¶&þ”lºmñÛÔ¶+ß§þïBÁ@ú§,æ.$Ú.c»Û{µÓåÏ$BƒvQB c$Ú#®]ÒׇB¥Å`bK;Aú|Õ¤ -%,[B)/3÷–Â|j#|@ó’1PšÞ1ŽF{äÒõŽ™Omè*”ÞL‹r”}Þã§i9¢\Nñå.Éo§ìò}æÿ#Uó÷ìÕtÇetóü/ë}µ[NùƒiC ÉD{!¸êúh-¨´¼ÿÚc³­¾¾\Žó¢öZÁ·”唎sI Ç‚ª€*4Õ‹2?¸dÃ…ö3ËûMǃ۾ùüº 1ïq‡+yY]rP.Tüû(Šó¹ãŸ/Ö¨«Éd¯æÿ½ÁÈ«ªì¥{ydîfñÑ-÷™úsÊ/§ü;L}–l^~ƒçiv{nµ€Ûw²0M šÄé“QDFÂ5woç>årí¢DòjVÑÁÜ¿$ ½ìªÞl „×dpõ»ú>zÛX‰¶úz¿ß7ç…¸^_ß¼œ­Ï-‹Â?ßË.§´Gî”ÇR®·Õ´¥7œsä×MŒÖZ†\Òõç„Cm9 àJßÚÚqjo)MÊ©Œ wlÒb[v¥€ôÿYòÿ®þ]¶YŽìâ¹Ë·ç ®}3_Ù2-ïï³qŒ†õ¶ïã×› ¤nf`>µ<Gðí`×S|–¬ç’RB r²¨ïG\õ}ôvÚìëMË‚ –ÂKi#3àÿëÔåS™\ŠªÖtžåÕvi$æMê90ŸZ ÷ÔͧLÛByÑ.JØ®€]š×¬/G 6ÀÑÃr…‡5åT*kç*þç­Ç}2ÿ–,¶r€èØ(â“1d–]É7~ ®÷¸ø_R5e´z­ž»ú1Kw¼çŒ"1Ez!‹ÜJ ws=¬·}Ÿ²ëßÌÃ0LÄÿCø°Þ[=ºµÓ†p9â"êûW] Ös§ÁHKB+íø¶Ó×ðž;þÔ`»™ 4™Í©Œ¸ìÊ’Ä ð¾‹àÔ½p€i95óŸ¦åÀ©›úrž; µ4Ttžw·°\NMŽī7”Ë67L@l| HDøÁUÿüÛýÝÍóžxÏúý(ðþÍ­äa<2:ºOÙêƒ ´?ØsýùÇ´¤ü6&¢þÕ¨ö¶Ž‚Úíë&;ñ­Ê)_ÁÇ’U£°º5¸šíY—ÓÓ;_GñÇdåð2-§j‚K85©[~Òúr>µ ”–ÜWO”9né\2Ô•ãwšÞTÕN¸þ¿f·V¦»uêÎqk7Ôßg»¿ÛyÎÕ5ÕüÉ_´¾=:AÚ˜Gî—º¼¨¢>z»¾Þ´,?7ªlÔ—cV÷'b›c\(?"„ÿõ–tª:?áü¨¾ºJg:ÁÁÊvK:$‚Â{¡õå<4­†åˆ@ií~]9Þq.o-¿¾_ `Z/¥ñÊ×äÿ.„IÅRi=>Š¥¥\Í}ê3u2ŠùŸ²Ž,]ÉÙöyš>ÿ‘âŒ!{oæS êÛALA?¤vtŸêrµC*t]ƒa(<2  uT7Àè!ogã‰-èíL”Û˜ˆúxÄÕc½]__^©^.Çrœæå”Ï8þ*r‰òyb§ ë¶T_’£|R0\À)½Å/Ô»†J/^Ö-[߉rÊ‹¼£ÂxfÁîòºO©KÓÍ¥jh:úû0F_9'*òO#5÷)—Sþ;üŽŽä_ ˪îúmnÑ>¢7}}íܧ¾ÜÄG“-__+£‡ƒP…€ñÄ€ùÔ„~8 …'í »©¯¯^ ÒzÄå¢t²XmG`ôÔ\Ç•9¼óå”;Z&~¯a~Åä÷p½"რÆJ£­ÂƒÔ u0Xs I"ê_»©¯¯Ÿ‡ª±ÍÍÍMXÝh^ ¹±ÂjÖ3³íܯ!<ñ¯_µcå¼ï†RK×Ê›ÿoös~è^¦H8è‡ÖÂrVÐêî×\D{È®êë댔nðƒËxRJ®€€"JçêTMZ¶Õä²P‰A Z»G¾Så”G]åó‰VŸØÈ¯[°‹üà혠k ¢GT¨¥ºÏÞËÂ.Jèºm¿1¨nwBõ‘]Ó×»Þ4£#á_O?Ú&¸J 3vûÅSEé‚Àe¶”06J«Vø%“]Ô§@Px_C í¯|]‰ñÄðVVMÓÚ¯A)}ÁÑŽ¨[úZ·qp5Ø_–pÊ—Üpå®Þ£¶$€¢`@@oÅáÈ!ïµ°í{f<1`<ÙÀÆcªª"øvªªz«H]@ò ."ÚinõÕ6÷1~,m”—Ö]ä°/:X×[~.\Šà:üfÞn§ Š€t¼a> ƒÁƒ#€Pà ªðÏ¢ç¢"z…ôFÁe<ë÷½gáýlùú1ê´•`õ¼´ßSl¾DDô2[ƒ+<hÂdíÑ®bTŸ€ü?X%DDÔO\DDÄà"""bp1¸ˆˆˆÁEDDÄà"""bpƒ‹ˆˆˆÁEDDÄà""¢7,¸´ƒCM^뙽#å˜H|>=< =<ŒÄç3076:*ÃX70y*MÂÈÈ(ÒߤwmïT½í‰—ùøaß—!r<ÚsNÑFêË9œûçiòXû%ø‡“H]ƒSl¯ƒ776ûãâ§ã0××°ðÓ<2?- ýíî ¯¨7"¢=\¯’m÷>r¸v3ÄGq ‡ÃÞ7= DÇ£¸qu·œo«Œ7Ó˜þSS'c@@@?¤ãúÕ9dn/ìÙz#"z#‚+2ùÄ›‚3žl r,âzâ{Ól“§âpŠ•ïwÒ!ým#ïF éCX¼»äß^ýoýïíZº»ý°¾uC˜ÿÏ¥m_dïe1ñ~¬æáÃGÃÈ./ú[¶íO%NžŠÃª Ve·ÚÖªÞœ¢Dâ“O¡FäØ{È?(4­7"¢7:¸Z㊎G‘½—äîe-MY%/Ïá⿦`®?ÄÔû¸òeª¦Lãñr÷³¸uó:>=3þôcõ4d7S’Æ#Aµñ—LþQØöu€¹aB? ·|žä¥¦ÞŸ€¹þñÓq$/§Ú*»Õ¶Võ–¼œÂ䇓0 k¸xþfÎ6¯7"¢7:¸ZãŠ"{ß ®ìýJp--/aX×;Ãâr¶¦Ì‹_LC'b;þõð" šn“®lûu8nëoÎÞËbòä¤÷Ç£Èvð›mkUoÙå%LŒG0q2†Ü½ŸùÉ&"W§ÆÆ"Èý’\ ÷KccÞT¡ý̆¦{#³á££Ø¨[ѧ ª/íÍj´š)¶2˶¡ÒÛzÚ ë¾)Ú•˜ÿ©rŒË¶m(ƒ^H*Bl9ÎÔê=6ÛÖªÞ6lhÊDD ®6(B |$Œäå$ÂGÂP„×±ªª Óxù«‰ˆ¡°^Ør»±n 6k«Œè±hͱ'X¼—ê%ñªªúéH Uí=Œ[Õ›:¨îøè”ˆè .˜8EúÛÛ˜¨Z’bm½¸@æÇÄNNµWX5‹ºqîÌ4Òßg°Vðž.°V( ý}Ógm•‘ø<ÿ‘Æü%8R"¿ºŠä…$Ι®¼ÇãQ,ÜY\`i9‹èxïKÒ[Õ[t¼4-ë‹w—9öÞŽÖÑnèåÁÍV«UçÂÿ¼â߀ԥ$žÆÊßW~GGúæ­öFKãQ ŒÂ4úÏÝéhMH^˜EòBÊ_8=EêR²é¢zúÒßÜ@òr 3ggÚÂìÙLœŒmy³’ˆÃõ¯oôÜP­ê-u)‰™?O#þɧÞòü¯çšÖQ¿ØÜÜÜ€Õß$4a²FˆˆhW1‹ FŽ„¼Ðൠ‰ˆ¨¯0¸ˆˆˆÁEDDÄà"""bpƒ‹ˆˆˆÁEDDÄà"""ƒ‹ˆˆÈxSÞè¹ó³lm"¢]"s{O ×vâ§âü´½f‘cޏ:;9ÉO ÑkdÛ==žÇ¸ˆˆ¨¯0¸ˆˆˆÁEDD´ë‚K;8„ùŸÞNDD´+G\7n¦áHÉZ$"¢þ®Ä'q\ûúk‘ˆˆú#¸â§N#w?óIã¥ùÕUDOL@Ó‡Eæ‡Ûþ6íà2ßßFøè(Â#£È.g‘½¿‚ðÈ(4}‹w—üû:EñãÐô!LžŠÃ)ÊšrˆˆˆÁÕ¶ä…Y$/§n›ùbçÎNÃ\_CòBrËýò…5äWr˜»œBêê5¬­æ‘_ÉáÖÍëøôÌLå9.Ïá⿦`®?ÄÔû¸òe¥óñC¶"ƒ«}‘±1@nee˶ܽŸ1q"âLBk‡%¿˜…2(0q"†Â¯$>I@Þßp+÷[Z^°® v"†Åå,[Žˆè µ#WÎH]J"ñçi,Ý™¯¹Ý²m¤ÿ–FáW…ù- îWk^…2(–o?³¡éœ$"¢:K;BäX™ïo×Ü?‡”ñ'qëoé®ËWU¦ñæãÊ1¸zrîì4Òßejn+üf`òä$ÆÆ"HŸéºìèxkëÀ2?. vrŠ-GDÄàê"¦?OÔÜvý«9|zf£c Ò».;uÉ[Ø¡Bú›¸ñÕ\e´ÇU…DDo”ÍÍÍMXýMBæž}£çÎÏ"~*Ϋýf¶½U µý}\fQÁÈ‘Z]/Îh5Òá1(""zYº.†½¼:<1¸ˆˆˆ^–À›ôf#Ç"=e41¸^‰Ìíy¶6ƒ«´»ì’ˆˆv7ã"""ƒ‹ˆˆˆÁEDD ."""ƒ‹ˆˆúÐs×¹ó³lm"¢]"s{¾ëókߨK>ÅOÅùi!"zÍ"Ç"qu‚_$IDôzõzÍXã""¢¾Âà"""Ñ® ®Å»KÐañîRG³žÙ5k‡ØDDôòƒ+ý]§OM"ý]¦£ÇEŽGkþ6?dkÑË .óÉŒ_ ¸öe Ư˜OÚ_)bÛ6kŸˆˆ^mp¥¿Ë`êÃ) 0õaéÛµ£.§(‘øäS臇9öò *Ó‚ÕÓƒÕ¿[¶ÉSqhú&OÅaU…œvpéoÓy7M¯¢ät#ƒ«9Èü˜Aüôi@üô$2?d·r—äå&?œ„QXÃÅóç0svÆ©•¦›M&/¥0õþÌõ‡ˆŸŽ#y9U³Ýx¼Üý,nݼŽOÏÌTF€œn$"bp5³¸¼„ð;aè‡t€~H‡~HÇâre”]^ÂÄx'cÈÝû¹­²³÷²˜<9 €ØxÙålÍö‹_LC'b5AIDD{_×WÎH—ÁÊßW¶LÏ¥EÆ ¶ DÇeÛ¶ eÐ{œ"Ä–ãaÊ Ê–#"bpµ¯¼(Ã4Ö–àJ„ßÀ|²í@ê êˆ:|UUá%”AGJ¨*ƒŠˆˆ<]M¦¿Ë ñÙôÖ@ L–ðiDÇ£ÈÞÏ®w¾WäØ{5‘i5YY=ÅÂÀ––³ˆŽGÙRDDÔ}p--/!ñqã+­'>N`éÎà©KI¤¿IC;<„+W¯áú×sþýbãQ Œ6,#u)‰ù…Eh‡‡°ðc©Kɶ^Wí}››››°ú›„&Ì=ûFÏŸEüTœW‡'"zÍl{ªjûû¸Ì¢‚‘#!/´º:ÆÕîȆËÓ‰ˆh§u·8ƒDDD¯ ¯ODD .""¢—%ð&½ÙȱHÏ_MDD ®W"s{ž­MDÄàêí.»$"¢ÝǸˆˆˆÁEDDÄà"""bpƒ‹ˆˆˆÁEDDÄà"""ƒ‹ˆˆˆÁEDD .""¢—®§kªª!DÛ÷—RBH—ODD¯aÄ%¥„÷Ó2K÷qÁÐ""¢×7â²lê~ O äVr¥áýÂGÃÐß Ã¶-8P[vp¨é6óñÞްvp¨i­¶u[&í¢à²mË “'&â§?¤._„v@óoO^ºp^8°Š6dPCÛ–Í "¢.ÓÜÀH])ÉKW`k]® º§°O°Ö‰ˆ¨k=ã*¸D@Áõ›sþíº>\Zå ³Š6ðBîÈ ×!ým#ïF éCX¼»äo˯®"zbš>„ðÈ(2?Ü®yìÚƒ"ÇßÃä‡qX¶Ý°|§h#þqš>„ÉSq8ÅÊë¶l“§âEæ‡~Šˆˆú%¸ª;sý멹å>ÖS¡:@Ž‚©ÑO5ãñr÷³¸uó:>=3ãß>óÅ,Ά¹¾†ä…$’—S5KŸAny3gHÕmóGŽ—çpñ_S0×bêý \ù²r¿Ô—)DGQXÍ#ÿ ÏOQ¿¸ÚeÙ6œ6Wš6ü©vñ‹i(B`âD ¨*7wïgï¶€@üƒIÈbí(oö‹ =ÅÒ½lÃç_Z^°® v"†ÅålÕ¶,â“S@˜=;ÃOÑ+ÔÛªÂç•i6㑉ØÔ–ûßÖ`kÐa­}ñÊ Ú4 ÓK£ð«Bƒ‘ ùïÞn2Uh?³¡éCMÛFp¿Z[íþWõHfæÌl%8žš5Ó†º> ¸ò¹\ùÒßTüTRJÄ?œÄ­¿¥·Û3/¬)R‡Ÿªª0Æ£½Ðþ_Fù_""êƒà²‹ eͨc­‡ª c}­rR‘ò•¼©Âo&ONbl,‚ô÷™-Û¯}}pìýœ7¥Ø@t<еõà™;YMNŒG‘¹ÜRYDDôÊô4Uè%¤”ƒ ,ˬ )B! Îs ²4Ê’W³“Û9¿ëúWsøôÌ ,ÛÂì_¦·†Òñ1ŒŒE0üŽŽ[ÿ‘nXFêR‰?Ocåï+¿£#}ó–¿íâ…$>=“@úXÉ Ià[~ˆˆ^•ÍÍÍMXýMBfGž»zÅ»ìS›¬¢ÄGÓ>fÍQ[Ì¢‚‘#ÞÌÞÀÀÀ@O#®ÄçÓ0Ö ~+@>ß~áE88Œ`0Øõh«ÝqÄEDD´+F\ü>.""ê+ .""bp1¸ˆˆˆ\DDÄà"""bp1¸ˆˆˆÁEDDÄà"""bpƒ‹ˆˆè¥kxuøÌ·Y3DDôZÅOn?¸Îýõ"kŒˆˆ^«'FûÁÕìÎDDD¯qƒ‹ˆˆˆÁEDDÄà""¢~`uÎX7ÿÇ*VWóÈ?(ÀÜ0Y)-h! £GÃÅèïF Ö».k`sssV“Ð+žˆh;™ncîë묈ÌžizžV=³¨`äHÈ ­NuàÜ…$CkÌ}}ç.$»z,§ ‰ú”ã€\ÖÅö½œ€²½]úÛ4²÷²þßÃG‡1ùÁ$FŽ"´_e]·°ñÌFþA ?-`íÁ {/‹ô·i$þ”è¨,Nõ[`I Y +!*·¹•mo,W6/„P„èªØµBñO*lâ£8â'Ø]´Cævéï3þÍ™¿¥17-ª~ª#.¢¾ê »(ëF^§ )½Žá ¯"é H)!¥\(^RªÚUx­þ÷ª?j ÆÔãÞs°:n‡©É)~-`u5ï×m«àj8ˆ&¢þ`Ú6¤”@º€ „7]¬ bPÀ ‹Ç¢(¥ÎÔ›²ÒC¡Ž{¿üƒ5ᕱzl‡èñ(  @À«Ûø©öËæâ ¢>b=5ýÿøŽãx{²T·;.¼^иÎsËßì<·`ÙvÇÇõ‚_¶~Hg;ôØú!²tüÑX/tT4ƒ‹¨øÇM\Çë^À?– °# öbyǼpñ§¯ ;.Çë„Ûa'ÚÁD@dõõÓþ¢ ƒp^xp£C5¯ªÓtvóâ·4Wž¶s%œÞÊB)%¬çTU…2Ø~‘"P[>¶CíP®C¨«[Ñ .éø€·÷Ê:i{´äJŠW‡nçK×EìŠvnº-¿ºÖWí Di¥ç¾ÎŽ 2¸ˆúˆSZ¡U^r ¿3pJëØ8MïøJy9¶+K# ¸Niɺ÷£t²ö/ ¼övÐaqe¾Ï%,Û*…©ÄèÈðî ¯mÚÀ>QS· .¢=7â’5{ú¢ú\×[†ÝjêhH<46ÝÞl[_©;‡¨RW¢R‡ªžÎ굺¥ª^(ê‡4äîçkÞË®¼Vâ6í JÇ;*äâ ¢> .çEå`v''»éCÈýåný!êXýöÅñXÃm}YWuu#ÝÊ1©®¦öJ«ä=µÃN0™]ð®jJǧpÄEÔWÁUµìÚuJÿñ«öf·Y)gýZ€¦ˆ-{ÃC‡‡ñó©ä3³ážò–ŽsÝ@òËVþ¾UU1ýY‰O¯­^†ãáúZmgY³ç_©«š:ìzÄÕ[;ô\ëF󣯯0‘úò ²÷r€èñ’."ÒšÖaÙíï20mçÎNwZ­Ú!ÀÅD{žãÈæUi¯µÙ^ÿZa Ãáa,ŽÇ¼Q×áaÿ¶rhåL³e`š&¦>Ž#y!‰ÿ~¦iböì,øÇñ×»g_0M·in\UK{i‡NDÆF‘[É7}=F]õÏ+‹©«×øl©«s€ äVr˜ûê’’ƒ¢éc3·3°mÓg¦;~?í´ƒ¢TN1è§ ‰újÄ%ýƒÜåN¡rNQûSUåQWuh, Wþ±ŠµBëƒûéoÓH|”@ìD "  Ô‘ºœÂÂO »£ŽÜJgYý»¿8 Û)¶º©Âh‡íBkúü4"c£Í? m¸ñÍ ÄOŇ!J'GG‘ú2…ù…ù¦«­—Ö¥R¯ .¢=\î6·»²åÏÚƒ<&–—‹ã1,ŽÇ Ÿ™0‰ÙÿZÁÚƒü¶e¬ÜË":©¹-Ö1ÿcÆÿ»°ºŠ©¦0|t‘c,Tm#ó]ÑãQ Fvy©Ò™Ù6fÎÌ`ôè0&NL °ºZ³-ñYÃG‡‘øSÒ¶·„GõßÛÖU‡Ê'+ÞÛa»ŸÈØ(2w3Øxlú!Ö,ÀìgVWò–løÜÙ{YèC ŸgéîRÃ:Ì|—†ýlÓŸ'z{/Û´ƒ(Ì.Î Úã#®òT‹[;EÕË^þ§ÿ/ë…VÌ èZëo¯½Äôç äÉcöì,RW¯Õl7ž˜Xº³€ë_Íaæ‹YÿöÔWs˜<Cþ—<¦ÏNcöR²f[ò‹Y¬4ûñ·$IDAT­æ1‹bîë¹¶ööëëªëU…Bñ^V;@äX™»ÈçB5DOÆüŸØÉ¾›ÇêJ…ÕÌG&ÔP“§'`>i¼ªÐxd@Uƒ ·~-4i-ÜYêz¤ÕI;”¯Ö_¾dÛƒ_vDýÃi´° æÊÛ­§\FGFka˜X^B~5ß~‡°]‰V×?Ÿÿ©2;CòR²¦ü™Ïg€€@äXp+{åÙ{Y$Ï'!á]„5zŠ…k0~3ÿeKw³ ë@? ÃzjAy«vTãz9¹üÓm;lZͶÒÛÏ,äÉׄVóQ\Æ£­ËçGÆŽÕÜ6{~Öß±H]NáÊÕ+°žZ=„Ó6íÐårxQ?—»ÍP¹£¨ú‰ŒEûË9?´fÿk¹û?LG" 6}l£Ÿø‡SÈ|ŸFvyŽcaíA©«)ÄOOú÷1ˆ`äwaoÑF}'V]fÕß‘±Qä~É®ƒì½,&?œ¬Ùf¬¯®ƒÅÿœGâ³Dë2Û­³¶ç§ªVvÑ­~–î,"~"Ž…—¼/¢lÁ|b"¿Z€ñÈôBëÎb˲OŸšÄÂO·aÖÇFa ·¼ø©©¦u \üâ’—f½Ç¹]ül×tµªS…Dý¤Ù91/¼•}•ß«Y¿üÐú9û3œÀÏÙŸñ^ô=ÿ¼®È±÷ðsöçíGEûCH^NáÆÍH^¾UU‘ø(±?Dýç>÷×sH^JÁ¶m$>JÔ¼Æúß«ÿN|6Ô—)ÌžŸE(BòB²vÛåVÿ± ý€Ž‹—.6,³º”};7UXþÄ^Ú¡•ù…ELMNø#°F½³ùÄDáAæc…0¿°¸ýóšÆÜ×sXý¯UoÔüO#˜93!Ô–í¢ #z<†Ôÿ¾†sÿ|®³új£¡x 4.Î ÚÃS…­§¡ubå€*ÿ¾¥3tdåjíNþ~·¾¹Õrz*z<êÿ=ùádÍë©}ÕÓsWçšNÎ}Õx[uÛuä]_9CˆžÚ¡£ðr%b'½…)Ö3oªÎ~jÃxbÂ2+¡Õ.u¿ŠÔåTËû4Ûi‰Œ!†XÇï¥veŸÒñ1.Qq^T¦V”€h¯“lÖ)mj”ïßÉó¼N"€š)©nCE­ºÂD·íÐIx‰€wá¨ìÝì–c@„V«öz•mÖ¨T! Šš«w0¸ˆöWBÙØ;Xd§×n §v)ûÐýTaݪÂn‡Fáþ]"ÐYPõC{ùíPZQ¨pU!ÑÞU^Íæí½*[;ÚZ¥s…Ê£–î/ù¤ø?¯¢æ;žì»vØW¹#.¢½\n¥É i“(OQ¡ûU…j£‹Ñ¾ävèçÐj§‚BApPáT!Ñ^ï€G–® .îáîÔ±–½2ê*w–BˆžêF ªl‡n!T`PÔÔ-ƒ‹h¯Wé«,‚A)ª®R^u § «{8(ˆ”}€eÙŸìZ ýãcl‡i1è-΃Çc\D}D?ö¯‚P¾TNùB¦Üïí(…ðާ!|Ë ã‘àÛZW»ìª¨\žH?¨³zm‡  E(Pö ¨\O´wM}0Ôåô/ç|K@ÙWšv)}„áíéwx°{O)]±AºåβôuñÏ-¤¿Ë v¸8UHÔÇ@PU!B;ðÍ»oÂ^¿w‰&±³Iد¼\D}^J@PXl‡7—ˈˆˆÁEDDÄà"""ƒ‹ˆˆˆÁEDD}È¿r†]ä—ÒÑîT¾¦aí•3ð.$$sŒˆˆ^1 ø—ÍrÿòYÕãõƒË²K_ò%¼oõä55ˆˆèU®7€’^йõã(?ždiˆ%]ïJÍV""¢W¤4Ú’M.XìG“-+ß$#%`—§‰ˆˆ^¥@%‹Ê_HÙ0¸ «‡c²4T#""z}áÕhÄå¯*$""Úíþ?Ñø¥d7­?ý£¯è%=è%=ØÍ7¸’VâÂJ\ø”¹ôƒsÐatDƒ–ª°‚ HPƒÞPA¾ÈQÇùá4MóãùÀlŠ,ÉòK®Ÿz¿%Kðá0ÀŠ"J]÷ÿf'—qqΙ@L ""—ˆˆÏÏÁ]oJF‘ËQÄ-‹»$¹v÷AF+L´mí #Æ S´ªåîp·v@B•`k|_q&°ù\ò↑KÜ%‰qιË“8·½)¹ËÂÈ‹0bärbÄ9góò‰óù,[”~œƈqâä#?è܆%‘þ³^¸[¨/£ò³½ðjÙL dr‘¿*.·jõ5¶jDD"cTC^nQL`D<ü+FÓu»òÔ ‡dbL7ìâzì°,™]³Q(Ø*_Yq×K/""«f“௹Ă2#²g Æd›Ûþ\œ8#æÍhÚ†,Éæ S )¦mÊA…\Î9ão|&0ªw9w9'îp"brÈåä-P`ÞSD$%ˆjÎ\Gp×Qƒ¢d’Ää c¢HñWŽesbÌâDD2#Ήø*aÉ‚,Ù«†ß—Xª³|òYù¹º¶ß7ÿÕCDŸþ÷ôªãÇ,7W#í€ïU¿ú¶òvwÖ‚¤(Œ»dTÆDå Ä97ª“e?ùŸK€w޾䜳 #—ÌYÓüÅ´gmÎ-Ö!+²Â‚!Vãr1AæóÑÃX½9Ç]nVM³jÚ·f+ò{Ì´I2rM"YfõnQ¿ñÊ9ç¶eÚUÓ4mÛbL”öIUFŒÉJ‡D$óùUÿK’ mTg~@’$I–E&eY¶Í]bA‰\‰lN^£Óá\\˜qIX21sZ Iõöl¨ƒ¥Oª¹;|ú's»mGgÍã"úô¿‹«.ñÜÇ=+.ycHA‘‘mZ̨òPˆ˜`›&7^Ø¡÷dIbDÜqü+€­@d"¹d<7JÓ%]×­Ÿ û•)ígêû}݆UU±\bA6ßwêõ¾Öò<]®T*æsË´ UU•÷º#=ae¿(‰“ì# â|_)™US\)UfÌçUÛ6É%)¤tÒ¿[®£õñJ$5D-‘óÚxbAÆ:HÞ'Z¯,ý§RåQÅxb0©ªª}•%…×˲Ø^Ɖèõ²o>Ö IÌxÁÇnWlNçNjÚûRßµX©çeä’èUC¬:ËÇïe½>~ür”ˆ&îñ^•sž½©Çz”è¯C¶ÍÇîè3†µÆi”}bª_ÓÞ“H £Êswuã—…yÇnëÞ«Už»£¦å½z_ïUÉ¥üC£¹8MÙøºõoùÉKE"R9Õ¯©!FDú ;wG7-Ç›€ˆ¾ù¯…)W®ÆWßVÎ ›¶íµûÿ2mYŽ"‹ÃÿÑcÛ<}­Ôâ÷ǖƒ"qǰÉH’È-Ý’‰ˆÈáÚ—°¥š˜æ s2?i<5ä9{I"&U9M~W.=0Iˆ*ŠJ5ê`þô^c´ô°T¼_4_šÝ e.÷ _-–Lòš?w¸Ému1IäÄ­YK¬–ŒŸu‰1í€BœÌª9óÐr8E~5k¦ÈDI’¨áfC¬ÚŽË%Æ$—ñ—ŽþS¥X(šUCˆ“¨Wt³jGû㌈8§=Ä^¯Ô¡ù@!¢ÜÝŠùÒ"¢Ü]=uBËß7¼×ê>¨¤Oj~ÓóÜ)mä[^~²Ðô8®zÍí¡SšWIb©ãÚ¹ëÅ5N“>ñ‚ŠˆÔ<¡»¶0¯ÿêjˆ¥úµÌ"Eê·LዊÓdéøÆ1.'¢Á“š¿iµRú¤–¹QZ:תոx:LD¼Jú¬Ýs8> _ZÚ…ˆÊOíÖk¸‡ˆ‘øš¬YËvI Šôʱg"R‚õ üû€-Á%‘‰Žë˜/Íꋪ]³•"’LÄ%ø¬mÌšÚ!‹ÉŒ¿"&cÌk’:®cš¦þX7_š]ZWærÈúR»n”+eíÔ}¨Ï|i(LasÈñòUÿY7¶RgMsôD.iŸ‘ñ ¿YPß#õ`Øzi‘$I¼áÛÕÏËù¯‰Ù.'bú£2¯²@ÄÈrYä—3æ£z¤O7JÌ•$¦¬—^O¬ñ‹åMcšV¶!*b½*MÿXÍ}?“ú}WϯCñ^ÕoTQîŽn¼°³_ô„:ØÂpˆ5¾âÊÓdæÓQÝ/{Ó4Ϋ?µGþYkrúTXŸ¥ïˆJDÅ«ßÏ ü¾+úëТâ,6~%¶t“7 {EÈüuÚkÚz’ç ãWcÞÀ«Qü±:‘Ÿa{I; ÷u”‹ÓF÷A™ˆô'fË5tRɲ\nØŒ½"Ùµ,¢NÜ!I Ž3}` å%wˆÙ¶mÏÚæsSíȶ‰®ÉÆkœUWº?Œ–õ¼Ä˜,‹D䫾°ù,³ž]Š}ñsÕqgˆlåµtî4eÿLºnGz%óñ “ 2&0Û¶í—¶ñ‹Á:ˆª¢¬:±~N.ñš£ÏrTŒªÕuH4tƒíed׃yQû²ñØ&çD̲m’¤Âä]R˜ÅkÄ‘[ÕÝPîŸEYŠZ³\–¸ÆQkÂâ%/¦½'Ñè÷eÎùè÷åž_ÇÔ÷¤Æ‰‹ ?؇ۚFS•È¡P÷ûÊÒyÇî”-nÛéSaêOymÁüý²ÅyþÁŒ——˽… SzÃÅŸªÑáì=FÕ®èæä£±U·°ž«U#ÿ`Ærm²¼³œÃá÷Cœ¸ö~ˆˆ*OÍ–kȼ_ñú_õå+""QÄ™>°…X5‡fmιã2"3ù¥&I6½´œ=qùÜŽn[“·Ö!Vg-%Ä­=DD¬fã7l2†Î&9™2'r˜ãV8QâÒämC˜=kØ–,K2¹ÄçÓ!Ų&2ÂGL‘xé>+<Œ0l‹‘mÛüÕ¢Ÿ”,œïþ=9çú Q{_ªèj~ÂLÿAuïøêÔyæ'¦i2¯YN˜+ûÇ]—ªÎòPSöIÆ/6)û¤s§ºs÷tý‰IDœˆq—¸K²È¼1«a7äJãðÚ§‰ÑÒ'´ü#{«4úѦy Ónl6>e9õ[úT£¾³yxêZ¼¹Œ.ÑÈD©jjaMQ:X¼WÓTe¨¡?yá%V«†ù’{š÷  «ŒQµÊMk™88w‰q"gþm—lNDä´±ðÖñלˆ›¦%3"&Þ( ~Q÷T¬W‘aÛ4y]RŽ0Î-Ç9qïÔÛæ–åÈAEÂÃWKbÎ}LD ÒØŸE“ípÔ&n:¢Ê뿪t‡\b³f­è‘™H/‘Kä²È1‘ åñûr×>\âœsÎÙ^æµp¼Ô\ÒKÜyeÑ^nÚŽªEs·'‰³ôgcRö*/>•ºGÍY“¸IœwHX6/KÍx¯šîïÎþ³D.¥Otk¤ô‰ðà“ˆŒ¶v@Jÿ^ËëǺˆÈxn/íÏ|“áÔqˆ ÿ2Ô¼ÊôóU[}OJý¾{l¢ì­U‹)—[BËå»4~O¿§+û¤oþ+ª§‘ã.qÎW­Fc«´ü³û­ê½»òSs¹Õãä8.cÞ!qÎ,N¢`1WäÄlÇ¡=ø [s™Usã¼FÚû=¥‡ÅÜuçÜÇ ‘ɉF¯«ú,%>ÔLÃ÷:TãŒIDD.ã5‹Ww?•‰¹:¨Z³IЈ¬Hj:ó~Äɹÿ_UUÍuÈÄiê>王YÒ{²$íýˆišÞ·7w8‰Ôܾ¤…þXÇ®1š%±ÃÖ4Õ²#ÅëÎ › ¶>Q?)ª\š.‰$ÈÜ%¶|—ìø½J4¬hïKã—ŽóMÜ­x¯•¿¯_<Óýý:?}™µzÞt˜sÎûæ?£^·$c$É^¸Ào΢‰ûúÅÓ=Ñ_‡¢¿Ž-³dZq|ó:Œž©ï-\CGn{ãí—‚lüJlú§jöëb[Õ¨<©Æ~«J#¢Š^]võ\²k "#‡»Ž])HLp8gVÍfËïèl6—˜ÀìYËá\ÕdÎÕò#=ûg9õ'iä·ÈLœŒjZwþNÉ!²\‡yáG&·jFW8TeL91s¶Ê]f…Tª…;㢨p—[¯,¯?Öâ–òžÒÝ¿UÊÕ,)HÜ¥üÚÇ¢'RlŸRyX¬_97´‚Ž_6ü¹qy湡T£ÇbFEÑgM˜rHV;Â3•Š®LVˆˆØ¢›££æ¤®æÓñžÈ¯TÆÈxaOÜ++õi+3ô­3p¼[íª³öèò´n,š½aÉëÎ~[ú8’Xåi5w§<úŸ±dL™(-Þÿ³øhFb”:ÑÃ]>~¯’>Ù³tÊ–¯¸Ü:dn‡þ ×4V‡ÿYòÆÝ*¥OE$Æ#î:mU£¤D=þð ›À²Ib ĉ,ÛaÄI`äZö¬,w C¶N^rªILPÌšND± íC]lýÝÖŽ±H8ª”JÓ3¦ij5™‰Üµ‰ˆjŒ\".YUŠõ¦Ê•Jîïw ²È±îð‘X©R2_qU!ÇuXmþâ5Ή‡ÞÅBIãÉŒQ5dAލšö+•í£Êã’eYÊ~¥ÞÄlh‡é ãã÷K~„’KD¶m¹¦’5¥G9 sÁ2ŸÚº^šÑu9(IŠJL&†«¾¹ í€TyZM_Z~*±»ÃTe*¿bF•uK\U¸n1£ÊÂåÈT¶ î’ãZDD\®V ‡xךvP’BJuÖ¶L§ò¯ióåŒ$u©û1Uˆˆ#«fñ·m›\ ½êV¥Cµjd˜†þo]b¨ï)¡}!’HD¯_Íœ5mÛ&BÁP×{*SUbDvÕx2S®v­ªìWC!1XŸ>Ö3ž¥G¥¥Ç/ëÃRÈfÆS˨LX5C˜Ã‰‚L*Ò^‰˜H¸šÚ;"2Ñ;ù8m¬¼ ¬©2÷ÌïR¹D{8¹d[–B!`Ë|­ $’踑)u3KÅÅ©;œ¸IA‰H–;H v‡ö1î2F–ÿGDL`RP²_š•ééâ]‡ "ˆ\G ‰!UcRýDÇuîÔ§—$Û6uC/>*rÎI`L Q IRTUóNcu\§é hKŽ_ãDÌe"1G &“ã¹ÄˆS˜Àˆ Ì;DH6ôfûázŠ»” O>,¯¼ÇfpIyU•D¦Üä\â!‰l‰ÙælÈžµ¥•\ õ€wÎqiþú Œˆd‰d¦rÎ×!"÷ˆŒ1bĽ»f¹Þô‹¢ŒÉ²ºWVöqçµÓ8Ëü­´MÎÆ‚²",ËŽSEÉë:åÔp¢ 6´/½Ášíä'FŒˆ\™½h˜lá’8md³E>‡-{gÉ œÑ+ƒ1‘q²-Ë"IAl>ØJbc.ãgA&‘äßç«ñš®-fwë³4æb‹Y"—$&#îrÿ">ÞBµ%Ý…È\|~¬Küñ86Ö3ùØÛöŒ1YÎM«Þ 4Q€5HžJz©Ù|ü²p¯€êQìxÌoq¶:ß[rýXX./ ÷ XC^¢«ç%úc–õÿ¼ÿqÂL€Û—cC!VÉËÒ÷Yó…¥?®d/—P€¥þJ°¦öåÚ;›FÉ6ÖøÄdµZõ† ½¼öU­ÕÛ¢yID#×p°à-ê鉸oñ-0ï Óqmkç%…B ÷N,Ü-änæ&¿›<ú»£áÃáÊ•Š?ôÅúÒLÇúc@À²,I’ˆ(ÌÍÍ‘¼O6 “ç\Ù¯X/qK)ؽü–¥»œÜù{W-IM^³ï›[:/E{£ÉO’œóò£òäw“Ê~ŶíâÃâäw“Þ^X6²gmdDijgml€¥ßÍaˆssy9Zsˆˆ1±½ºäìú븉‚ø&¡÷¦yÉ‚Lû@ûëXw¸[’¤È‡‘á«ÃáÃa¶ü¥‰×8 2^ãR‡„+Äzd¾^OoœÃúÜÑqι— ;_|).pˆ1&¶»·±!yID}±¾ì•ìÐù!¯¹™½’Í\ʬ0}ìxlüÖxêt*7¿p«X&,ëÃ{ä9§ÍÈtɶëÝxL`$Qi×Ü'ž¹Œ{\îÝPšˆ8ç$Ñ:"sò2v<–¹‰öF‰(z,š¹”Y9Ç®%>J|úù§±c±ñ Ü¡`õ°¬eË|¶ö%X¶å·#¹Ëc^+s—Ð!‡1FD¼Æ9ç$¹dÏÚb¨í¾Ù ÈËðá°w"õü¦Ç&¢–ÃR‡ôCñüKX),÷È-ÇËJçÚ#Ó|iÊ{åz£J "r\g÷ä¥(ˆ^d2άW Äö2"²,‹1&Kr[ˆS¬¶¢¹× ¬©‰9çX¶ÝF—,çœöw¹ã8¢(r—ËL^ßú”– ÷ fÕ\uJ¥Cééíéëí{ç ³pŠ“·&.ù³vÍfAÖÖ®ò`ÇòNíq‡»œ^“Dë<ÅrôúèÈßF¢G¢Ê{Jë†60^ƒ_V>®dÎgCæž ë­3w99Äö2ιã8ížñ„¼عyY›?vþ±ŽþØ™Ç3#ÉÝÈ œXúOúØ×cúOºÔ!E{£©Ó)&°ÂýBâ£DôX4òaäÝWA šÿU«—‘¼Æ9ãëZ ìDw¸Ë½Çº@2ýã´z@Ÿˆ/MŒ‰[£×GSŸ¥ÒŸ¥¹Ë'¿›L|”ÿÇxìX,ü«piºÔ˜—ïä¸ic£¶~!—;Ü‘Hâ.©UÂõÖ¶žzsÏÍ9 ŠŒ­õÜNÎycãÒ ŒvûE­W–²OñN4md<5†¯ çþžë;ÖÇÓÞײW²±ã±ìÕ,Éûdÿ§,8 K¯|={h_l-L`œü~TÞôÍ‚RóÈåÙ5ÛoZ1ÿw—.9ÔNd.-·'ñ„z@õNò^"u:Õ÷û¾êlµþBóÙÜ©v6ÍþÌxæ÷Vµö)—[y¿~Y—ÛØôô†]HÝqçµ³p™·~ɶ×,˜ÑgR§SŒ1D‘Õ¯~Ê u„ŒçÆÒ¸zöäÙÒ${öäYM½ö…õ÷Þð#Tçµã8ë9óy °…ÿ¯8p*)2Æ“‚2±eƒí«ÿΤV»ŸWýÒw I¹ê—ÈH=jý¢[IãÜõ­!Ž_ìX-‚aþ@f[– gA©p¯Ð4²Z­š/Mõ€JDŽë4.¡å’;vú¹ä"G"Zgá^ÁY­&?Nv…»&nO,·„UÖÜmÑ*E^À’t\ÜÆZèŸ\û£•‰[’¢é?ë•+/—½œíû]_¨#ÔÏÞBº´.ÿ±háóÆ £p·0zmtðì 7røêp¤'R~X.WÊm¯¶ÿë‘¥‘¿®S…7µ?Ö¿fµZm¼‰&lZû²~2ÑzC—ˆ&nN˜5Jžì‹‰¤þ˜ŠöF¢G¢fÕœ¸=¡½¯¥¿H7^OÇŸ«žyóɽtxð³A(r$âÏX|Xœüb’OIåoç×Ù¥¼AíËMÍKÿ²Ú! ·‰xÛî4ņ×E¹ê5zVÈ›‰›&§øñ˜1kMWtUUÕýjñAQ–勺í. w ­ºùñŒ±…i\""{Ö–÷Êä’"+ëk6žëÔº,[3/}¸M4Àf´/—iµÕPklNÜœ09‹U«8=­OOe/e´_i˽JËvär+³tb©C2_š²,[–Õîj¯£,+Û€ã—ö¬9‘÷ɹos@Àé4{ÿ€·˜—|Éq»¦£†íÌÝœ°\?5^˜ÅéiãQ1{aÙ°\ë+R« 懣G¢…;r)÷m®íu^ºÌåʲiy™>›úrÈüÅœ~8½–é½^ÙÆ[}À[á¶9~y…ûEî²Ø±¨þÂ,>Òõébæü¹UÂòÍóåér¥?ïþ ûݾ}ÚþØÂ½Bîëcì⥋õ]Ø‚íË7Àˆ´ƒŠþÜ,=ª•böÒ9íƒ6²ô°´òøÆ üaQGþ2Rù»Ò»-Ëä¥=k{×ô~p[„óÚ÷ˆ\à\àëþ¾—‚’eYÝvg¯[œQ­š¹°ZXºdYV×Á.DäHd ú¶D1‰{Dçõ;:ß' ñgAV­V[¦)>²ï†»ë^†¦icߎÍ<ž¾œÕÖ¥iÕÖQåߕʿ+‰xâ¥cË&²À¼j¼³þØÄÉDþN~àÔ@öJ¶qÁù;ùØñXær¦åËÚ³¶Ô!áà ðöxL`\XÇlס®x<ñQ"Ö[K?bõEuòÎdìX,r8²U !Ô¯b_¿qô»ê¾2œH¤>Ke.-D£w4)( _^:K¼?.+òÜkœòðv9ŽSO‹7ø1Æà™Á.­«ø ¨?ÖWX–åô™tßñ>Ú³• !#¶îÆåÆä% ²©ï§¼áÌ…zdÆOÄý8LIyþ9±“ùI|ˆÞ6dœsY–É%âä·÷´ßæ=íF{£ÛìýÏG˜×+Š¢eYë‹>\?`Çê:Øe<5ˆHÅEWÏvËí©“RE"2ž²,¯ãíã~^;V¬?–½’Õ>ÐĽ¢¸WtÇ»Y´Hâî‰L/5½;~Z¯¬Ü?r±c±úÈw˜—¸ ÀÖé‰ÄŽÇϦ>Iih^ǬóÚq^;"‰»¢‘we>ÎË˹¯sš¦u‡»å½m71ѾØÉ?ìwß»>fÕ¬uŸí²ÝSSʪªÆŽÇºÃÝ’$I’$ b›Ë€ÞÊŒ|±l˶mëÕnL?8÷Ê’$ÉÚ—Ð2'$™YÈ mÔ]>¶£ú¹?‚ˆó}`Ùï{¯r·¹Ühø= òy °òÒxjtìlk–@ à ´¼« ÀÌËüÝ|¼?ÞÖ,þ• ´C6슼œÌO6Þç¬-¸A&슼´m[ÿYïùM~‘#yŸœû6ç÷¸úÃÞ@ãvr^îbÇbÞ/9ÓgÓC_™¿˜Ó§×2¯×+‹«ÎÀÎÏË©»S}ý} ÙÙcŒ]¼tÅäå<— ÷ ±ã1ï/{ÖfŒ‘z@EqyYW|Xì>Ô-I’÷g(â5NËüJ§öÀ.ÍËÂÝB¬?æÿ™8™ÈßÉ“KÙ+Ù…‰ÊßÉsÎ3—3-! G`§çeÓ//‡¯ ß÷ŠŠ¢ø#'¿›L|”P%|(¼t ñþ¸¬Èذ•½éýIž=yÖø' ²©ï§¼áÌ…zk2~">÷º~lêLÊðωÌOb3Ào_ /à-ç%®BÈKä% /—ÈKä%ò`·æe ˜¸9Ñ4f…éo]ÒrÊ•gØ®íËákÜó5N¬ÒVž:€™—éÏÓÙËÙ5NŒ»wÀ.ÍËÔ™TñAÑxn,ƣѣ=£¿;jÛ6Í÷µ6ö¸NÜše9°'¿“÷ÆøÏ±¿Ž)û•ÆgmÛ>=*ËòØ_ÇÐs Û)/‰häÏ#C燚ÛgÓ§朹ÔéÔÐÙ!šïkmìqy;t~hàÔ€iš•Çl?ØfyÙóÛ"*>(6Ž,Ü+$O%I ø‰øäÝÖ÷¹:?Ä‹Ÿˆ“ÛâÙÌ¥LÓ³Sw§’§’Œ±ì¥,¶l³¼$¢á«ÃMML{ÖfAFDŒ±å[J’´Â2—>[­zË ½Âö€í——ê5v,–û{n!í:$^ãDÄk\ê6äU$Iò…6þ.`Ûä%e.eF®øÆŽÇÆo“Kù»ùØñX}¬ðF§È&N$rßæÈ¥ìôÇÀöÌKÆXæ|ÆÿsìÚØÄ­‰€¿9>v}ÌïËŠ¼î—¾2<™ŸTö+‘ž¶láÍÑty>ð†¥é‡âMÓOæ'[Îë/h–:¤ÒÃÙ³öÊÇ>¶hûrȲ\¼_äœg¯f£½QlB@^¶0vc,ùIRÜ+Vþ]»1†M›@Øvk¹p·P¼_ôúrówòõ¹l»/Ö×8—×/ÚØ;:qkB–对ügmÛ>=*ËòØ_Çü‘@`ì¯cÊþE/´(—¼h£ü|`O °'Ðu¨kúÿ¦×2 Àúô|<´êUÚ–y9~k|âæ„¢(ƒ_æïäõŸtÿ©ôÙôÀ©9g.u:5tvaëuÓ0s7rC†¦œ6ž“ßM&>JxϾ:<çÌ œðºv½¾ÖÆ×™Ç3¦i6Îå:?4pjÀ4ÍÊãJãxÃ0š^¨i®¦m”ø(1z}tîõ\ör6y:¹–YÖïy‰¸Aĉ¬úÃ5éE™^”íì ¨Ðæ „‡‹ÓEó…¥?®d/g ÷VÚ çΦG®…B¡¥OMÿkºø è=Æÿ9>pj€ˆä}²i˜,È8çÊ~Åkwë¥%uHäR`OÀyå° óÆ{‰¨(Šù‹IÙ³¶vH3M³ñÙú,K’¤Æñ³O dÕUe¿â?»t–F+¿èÑèQÆØ¹ÿ89ñzž—› -Õj5 ù§4÷ã=ÑÏ%ê©#D$9DDœÓ¬IDvµJDº>CDê±< øVÅŽÇJÓ%ã…¡?Ö7ì÷$=¿é¹øŸøßÊÓåsçÏy#íYÛËBÆXãH©C"ª<õ&húôö€¼On<-¶‘—|­?|³Uo™¡÷BkœeÕün’sÞ÷û>Y–+?VÖ¾žoÆ!""ŽB¼s—ò>™ó…m>öæI¯q"â5^ÏÈ5:¤¹×s¾v×G’$oÚʰ•_Tê~(þà¼rFoŒFG7d=ÚÈÜþy™èOŒüyÄxjKö¬=òבÔÇ)¿%;~kœ\ÊßÍÇŽÇÖÞþÕÖɥܷ¹HO¤>VXë)²‰‰Ü·9r©­st[¿è¼ÎƒùÛy"’%ÙßXy€ KJEØy™½’->,vØØP5Õüž6ì=5vmlâÖD@ Œß»>¶ÆŽ]<;#×Frßæ¼‘ñþ¸¬Èk™}øÊðd~RÙ¯´•a-_Ô7þíxæR&°'ø(1ùÝäZf€d~ …~øßZ>åuc6lìºl9,uHK8™Ÿ\y®ÆÙKKDdÏÚþ1Ëå^tѪþﲫÚóÛž}f-³Ú—Ûƒ,ËÅûEÎyöj6ÚÅ6äe c7Æ’Ÿ$Žbåß•±cØÆðæ„÷–N x¿þØ!p¾Ú—ÈKä%ò—ÈKä%À¶ÌKã©Ñy°“ˆòwòÞ-®:ÕÎéÿ›~ó%5Ž\÷Ò6)/ówóñþ8ù—#ÿæëo’§“¨/ /Læ'ñ‘Kñq"Š‹>{òl3ßIäH¤ø ˆ- [4/mÛÖÖ{~Óãýi<5ŸíT;«/ªDTùw%LÿkšˆôŸõNµ“ˆìYûhôh`OàèïŽú÷• #éÒº½Ê¬}4zT–åå½œÍ\Ê,MÍ–3Ú¶ˆ'DQì<ØYù±‚ÏlaŒа#ò²p¯;ó®D{îOçº{º‰hì¯cÞcÇcS÷¦ˆ¨x¿Èó¬x¿èÝ>:}6=pj`ΙKN ò—)IRiºÔø*Cç‡bÇcÖK«ò¨u¼E{£¥‡¥¥©ÙrÆ¡óCÉ“Î+gøÊpòcôÀÖ‰·HMØîy9uwª¯¿Ï¾:\¸[ðB4Òñò²p¿@D…û…ôéâýb=bǼä©$ ?Ÿ¼»p‡ËäɤëÊú«Ü›JN‘@™ ™VÆKÍhoôhôè 3NÝŠ‘@ñ“ñ¥7¶x÷-ÊšE©Éˆ˜HLDqÞ•7¾?‰K…û…ÆÛfy³SßOö¼K~’䜗•'¿›Tö+¶m½Ó‚ìY›1ÆìY{áƒlÞ“ªÎV¥‰ˆBï…¼1þÉ®÷.>(f.eˆÈ¿OõÒ½‘Œag ¶p ÓedÛÔøMÕ!‘T“Z4>×ð]í¸Î.¯©(ˆozoš—ŇÅîCÝ~[PÜ+š¿˜ fA¦} ýu¬;Ü-IRäÃÈðÕáðá°—ˆR‡Äkœ¯q/Õ–êU«ÕP(T­V—ÆdcRf//ºMôÒ‰H’$rwäÝÌ`Gø`ù{ÝPˆˆ•Ö¸$‡;õÛ $ ¢ã:œs/AwþN‡»hÏ‚ œbŒ‰ëj¦¿ibîbý1ÿÏhotüæ8åïäýe÷Åú²W²C燼 ²W²^°QìxlüÖxêt*7ïõÐ.'q"‘û6wñO³W²-'È\Ê4%å 3z½Ä±c±üÝüÐù¡M>•`9ªªN›]Ó”µµ4+ýS)™À(H¢ îž#¡ÌeÜãr&0/>9ç$Ñ:"óMó27ÿýü?G¯öè#¢ä’SßOùᔹñ’,z,š¹”ñ£qìÚXâ£Ä§Ÿ;Ÿ_á…†¯'>J(7”‘«#c[:Aéaií3Ž]K $ú~ß§½¯MÞšÄ?QØ"Œ×I:°Æ)I]m˶üv$w9cÌkeî’b:äx‡ÞxsÎI &0rÉžµÅPÛ}³oš—M-3õ}uæñL p^-t”‡‡ý¾Óžßô4ö£J’ Ñ×8?Ì‚lªPàSmì_´šQê~øßð/¶ žžˆ×jý-0r9M?\½KÖ|iÊ{åz£J "r\g÷ä¥(ˆ^d2άW Äö2"²,‹1&Kr[øVŽà5Y€µã.'—¸@ÌKǦgköÚO¿àœÓ^â.wGEîr™É”– ÷ fÕ\uQJ‡ÒÓÛÓ×Û·ÎüX8ÅÉ[g—üŽY»f³ kk×g¼l=‹Ã2çæòr´æ[Ûá7ïÔÇq¸Ëé5I´è´ÊÑë£#‰‰*ï)­›³ ŒÆà—ƒ•+™ó™õEÇ;¼GžsÚ‹L‡;ÜåÞ£©95ýã´z@Ÿˆ/͉[£×GSŸ¥ÒŸ¥¹Ë'¿›L|”ÿÇxìX,ü«piº´¾¼|'ÇMµõŽn—;Ü‘Hâ.©UÂý/¶AXÖLjr{íKΗ^`xb½²”}ÊÒ+·Oákù¿çúŽõ1Æ´÷µì•lìx,{5KDò>Ùÿʶá64.½:p¾ŽŸŸ¢} °%ÃrOëh”•NË\ëOÆíší7­®Úî’C˽›¸=‘ˆ'Ôªw7cêtªï÷}ÕÙj}öùF›wçŒFÏŒgÞxo`UkŸríìY{á8 oÓ/‚_ä%À¶7÷Ú"551ç˶Ûè’uÇyí,\æÆ­_òf…;žÌè3©Ó)Æ ¢ÈÈ»|c,Ô2žKC¨ùz/îüȵ7à6úJCÑcÑò£²Ÿ‘/Á]î¼vg=g!/v¬ú¥ï’rUõ ߤµ^ԖײǸñîúÞ Ž_삼ll̹T?¨” ÷ M#«ÕªùÒT¨Dä¸ çùÃ΃þ@î¹È‘H§ÖY¸WðFVg«É“]ᮉÛ-—Ðr.Û¶“§“Zgòã¤mÛÞÈäédñA‘»¼ø ˜<ôæ%"üsbß<û‘—;—ÛÜÆjêŸl2qkBR4ýg½òc¥q!ÙËÙ¾ßõ…:B¡ë-¤Këòãýã…Q¸[½6:xvÐ9|u8Ò)?,—+åEKsWš+{5›9›™©ÌôÅú†¯ {#3ç3_]ýŠsþÕÕ¯2ç3äÒÌã"šy<³ðë‘¥;ëêF,À–Ì9—ˆøÜœÓ4žÅö®ï³dÉõ›Q/ÉŒ‰›f’'û¢G"©?¦¢½‘葨Y5'nOhïké/ÒWÉñçªgÞ|/ülЉø3'¿˜äÄSgRùÛù–-ÝsÝ/f.d¸Ë{~Û3|}Ø»‡‡²_ N~œìù°GÙ¯ø‹Z´Ì j_"/¶&°…HkÊXP"w­_÷wšbÃë¢ô.;Þ–œâÇcƬ5]ÑUUU÷«ÅEY–/þéb´7º(.Ü5´ÕæÇ3ÖðZ.‘=kË{erI‘•å–Ðb.Ûîw/]~êdªïVßðåá–kÕx®Së² /¶©ééÒF-j¹ƒ”Üå¼á®Ó7'LÎâÇ£FÕ*NOëÓSÙKíWÚ²ó¶jG.÷ÒK'–:$ó¥)˲eYË-¡Å\’T¸[ðSËŸ w+§ýJËÝÊ Zu­Öòìrpü`Çjîxl:¾HÄ]ž»9a¹,~h#,KËd¶?¾qXÅ‘¿ŒÔGþ®´òbýaY–Çþ2Ö4¥¿œHO$ÒS¿ªmö²oXä%À61–K¯ïÓÖý¼œ×ޏGäçoú¾—‚’eYÝvg¯[œQ­š¹°ZXºdYV×Á®·ýî#G"kIå¶ãN &0qè¼Æù>°8áüœhzFÓ´±oÇfÏ _Îê?ëR‡ä]Ž`•W*ÿ®$≷½ÖKÓóªþXXÄëxdãBsdס®x<ñQ"Ö[5)‰¨ú¢:yg2v,9Ù~…ê¿Ò©ß8ý±ÐÄqœzZ,ùÅà™Á.­«ø ¨?ÖW]Ž,Ëé3é¾ã}´g{B FlÝKä%ÀÕò~^Þý/×~?/dœsY–É%âä·÷ÌûÜCÑÞh´7ºc‹8qL`^g¬(Š–e­/úðûK€­hîuëûv­=,‰¨ë`—ñÔ "Q]1GØ-ͥƤE‘ˆŒç†,ËëxûÈK€­™sͧqÎ9V[KˆõÇrÿÌ9¯HÜ+z½‘Îëù›E ;ýјšŒ1ÆÇÉý#×óëo享°%#ÓÿIÉÜk«Ýco‘žHìxlðì`ê“”öæuÌ:¯çµ#’¸+*(y×ðã¼ü¸œû:§iZw¸[ÞÛvy ° "snΡu]õtðóÁîp÷øÍñ±ëcVÍZ÷Ù.Û=5å ¬ªjìx¬;Ü-I’$I¢ ¶¹ Øjæïçå]ß§Þ1+0¢öîçå·2#F,Û²mÛzµ[#Óν²$I²´)íËjµŠ3À[²÷óZ”’Ì‚,ä†ÖwwŽS[HÄu¤_{sŒOL⣠ðVmàý¼š¾ï½ÈÝrärã뇖%À–¡jÝ(ÂÖ„ß“ /—ÈKä%òy €¼ä%@»Ú¼ÞÍJ;FòãÔ[ÉËsºˆâÀޱöë¼âú±«ÃñKä%òy €¼@^ /—€¼h—°•WîÜÙô;_‡ñ‰Éü­Õ¯šéíÇiël5lJØ]yIDÉSÉwøê‘#o ~2A#—sΞv‰»ïñIÚ:[ ›vc^Q¬?þ®^Ú¶ë×Ëå5ÎcŒ5|Ã'¡-·Õ°)àmÀñË5á®SoŽlþAL`¨ 6% /¡×_çrry ’Ëýñh—`SòÚ%œ“K=2öÈÞw+w9*ƒM ÈË”Fû•©{S«N¿¾a]N.DÙeo$¾g±)yÙš9¿ü|pÕÈÜ(¶m÷ÅúDQ÷ЉKo^½êëç’¢v5÷*Ž»…ÎÙ´]“u¼ç\Ù¿5öœ¶Ã¦ÜØÍQ|PL´>c9~2^|€S‚ÞZ^úúŽ÷Þýô³O7g]‡¯ kh–eY¦¥PG¯¶;Áº9.¦—Ët^5<,“\rÐ(YCD%>JT_T·ÂºìÂM™½’½ø_[?u9›½œÅ'à­ç¥™þ^¹Ss’Ie¿?wjNÓ”åJ9z,ªìW´CÚø­qodøÃ°ñÜ "ã¹鉬²›|¿˜ú$ÅcA–þ<=ý¯év'دþ…¬MäHdøêðLñݰ)KÓ%I’º´®–Ïvi]’$•¦Kø”¼õ¼l”¹œ¹ø_MÃLÄ_]ùªéÙÁ/Ï}yÎ4ÌÌ…LæRÆíz¿/>(FEW^¾þTW¨Þ°RÊËíNð&¸Ë½Ÿ´7Œq–;â5uoJÙ¯(û•ho´ü¨¼Âþ„SsRŸ¤TUôDÊ•ú”–mÅOƽ)-Ûª¿#EÉ}› ‡Ã‡½)5mad¹W_ÔÆjµ&-whZ®MÞ™Ô4m-°‰(s)£} m}[›²­ 4~s\Ó4íV¼_,>(j‡•hÕ Zn‚7Üî…»…Äï+LÐ÷û¾Âݾ 65/ ÷ ]»H ØñØÒ¯ÑÒÃR_ ”<™ä5îçåÔÿNyMÃhï*yiÛ6 Ö'dzgív'x£¶ÈÂkýÑôT£O?ûtøÊ°ù‹yîü¹Á/WØŸÈ\ÎÄOÆ'ÆÅ ¦¼”IĦa&’þ¾†Qš.}óõ7~xör6ÚÕëaÖòÕWݳi¹CÓrõˆH×õr¥Ü¸&+ˆm­fe;›²­ T~\.?*_Î^ÉÎ<ž)?j.ÑÊ´Üo¸ÝKJáÃá&—¡} °º@øp¸8]4_XúãJör¶po•=MEQLÓl9¦é¼¤7`ÙVîëœþ³®ëºñÜðF:5§ëPW¹RŽôDôÇzÓå†ÎM'O%ý+Åöæ^Ï-¬úâ?×2A»l»*I¡ü­\8ÜÍ]®„BM˜Õ*X¥Rnºèhüd\Ü#¦ÿ˜™èÔizE',ÛŠöF+• …ÃáÊ£JÓ×4­ü¨,E‡;Ýán]×½J>{òL ŠUÕi¥%¹C6«fw¸ÛÙòÕ-¿Õš4&в¿¾ü–«§(ÊŒ>#KrËÏCÓV[ØÀÜÜÜ»ú ¯{S¶µfÏȲWÀ¥kÕ Zn‚7ÜîêAu¦2ãÍÞr§æt…»Œ'¾ Zîî—¦KÆ C¬¿iûrêÞ”ÿU"I’ù‹ò¬Ù4eòT’sž<•üæßø#Å ¨ýJ¹:Òî^õÚ|’$-\óÓ%I’Ú`Óäþžs^;‰D—Ö5óx¦þ•=k+ûEQº´.ÿÜÝêlué·mÛû‚™hÛvc¹–N)wÈ^ÿóʯ¾h®VkbÙÖðÕáÔ')ÿR«Ë­ya¹´µ¼máM¿tc­:AËMð†Û׸?{Ë Ä è÷÷ÀÛêº75øùà7_×ó/z,:ód†\¿5ëoî‚ÓÖã'â===¹oÝ#"ÚÍÝÌ­zð’ˆ´4¿‹Õ¶í¥‡ÄVàMûñ\b‚è?V8UD–äüí¼i˜ÃW‡‰ö'¤ ´t!’$y‡ú¡Ž5k‘÷ß^½iùKפåMËÕÛöÚÙ”o¸ÚÒr¼ávgAæ¢n9Ssü£°Áyé_®àÓÏ>½1Úw¼Þ•½œÍ\Ê(ª’û:7ö—±¦¹F¯~úÙ§ÝvwìjÊKriÕƒ—Þ”£7F9çœóñ[ãKgYu‚Mé‰LÝò¾­üöGËý‰è±hña‘\šº7åŸ!=ÍßÍ“K…{…•÷$úŽ÷OŒ“K#×GV~õE…jµ&-whZ®Þ®ò†¨-ËíS¾ÉvWßS ÃXaÃ0ü³ä`mߟdiGkÓîírÓ÷õ÷õõד5u&åO îWÕ÷Õµü‹ü|0~2>"x_Xãÿ¬Ÿè[n‚ ©SW¸EZÌ<.µ,áèõÑÁ³ƒŸ~ö) ä·¿³—³©3©éMkïk¹¿çü‘ƒŸ&ÿT¨£7ê?Í^ʦΤ†ÎEDý‘-]¼pñÓÏ>ÍÝÌe.dV~õF-×ÄÛ¡±lkèìPã”KWo»äÛÚ”o¸ÚÒr¼ávôD¦ÿ5Ýu¨k¹ ¦ÿ5½;÷„ÚÕöù>Þ36|m˜»¼ñŸ½o¹3G6ÍÂI"vsλ-úZ±^>3«UÆXåQ7Þ:[ ›²QùQ9s9³Â/Fbý±ìålw¸]€ÿ@Î÷yÇ÷¿TªáÃáñ›ã[¼d¢ÀH ëå3y_§7Æyerî0‰oáVP-Ï4†í¸)ß¹î»yÏè3-/Y0óx†sްX‹wœ—þ‘•mP'ˆhα¢<çXó#í·QBäŽÙ”[AæRæ«ÿþj|¢Å^éWÿóUË®Øry¹R~ã£þ ëd8±p{61wÓ¦ŒöF—;÷­eˆÀVÌËíÔˆˆ8¯_J " ÄäåvýÔcS@[p¿èµò¾O¯;ÊƘ¸S;ñ°)¶PûrU‘#Û~÷÷ª7>\"aþ‡íq—3Æp£’-»Õ°)`·äåøÄäYÜSw;n5lJØ-yé_Úô·–ðÛÊm¸Õ°)`cáø%òy €¼@^ /—»Këß_ŽßÌ¡4°k%?N­)/Ïýé"Š»ÖÒK¯kœ`7ÃñKä%òy €¼@^ /vaó¹ä¸Ê·Q×]]ÔuFQgÔy«Õ¹í9î[ŸUDÇu8çÞÚå¸Ëý)pˆ1&2qKCQgÔuF·TÛÌK—lÛö™À(H¢ ÃÎ s÷¸œ ÌÛ<œs’¨í>êŒ:£Î¨3ê¼ÅêÜ^^Z¶åï§p—3Ƽ½l "rÈaŒ¯qÎ9 ÄF.Ù³¶j¯í:£Î¨3êŒ:oµ:·w¾ùÒ¬o ν|F/¹ÏëgŒ19Žã8õÊX–Õø9FQgÔuF·cÛËK¯+œ»Üqr‰»;/ û/þGS¨÷Ô›ü.·kv[\ÔuFQgÔy«Õ¹½þXo{8ŽÃ]N¯I"i+–ã]có69Äö2Îë_ÔuFQgÔyûÖ¹ÍöemþT«ùÚû-÷@¸Ëë%ò»ËQgÔuF·[-ÛšÑgÞb9wfô˶vOÛk_:Üá.÷[íå­ÐóÐøéôJÄ]îpG"‰»\$uFQgÔy»Ô¹4]J™΂JîFN=¨úOÏÔ™”e䲑kcÑÞèn¨sûÇ/v^¼—Ä®â"nÃ΋W%ÞöguFQgÔù×yìïcÉ]?ÜJEÂ,õyÊš­7%ÍY3õÇTDã…k‘Ô yôëÑmóûÎ7«s{íK»fûáÌüßõ¸äÐô;ÕN˜1é‰ _–$iC–üÌxÖ8°±£qÿÅ+‘_´ªó;,NåQ%ýeš»|ìúXOOÏrË1ž™Ë™éMK’”þc:õIªiùÛ¢Îoç|äêÈÔ½©êl5 %O&Ó_¦7d“½¥/—ͬó¦g«|Œ·üçÙq9(ÊeÏFÎ])&Ï$sË‘@©3)M±.žî"×ÉY.•7¯€›Uçÿ×nùœ×ÎÂ…\Zh—?3 ^IDATûoìƒèÙ“gÞ£ü¨>Î\ÊlÔ’›6îÑÔÂ]î¼^8qyÃêüîŠ3t~({9;|e8saÙW¬¾¨&ÉxræñÌäÄdþv>÷ÜÆÖ|“êüCg‡B¡â½â3ýYán×øÈÕ‘Ùdî¶ý,FEý?UM¼3Ù´Øêl5ùq}=«³Uodá^¡Sëì<Øy´ÿèô£éÞÑæÔùm<”÷”±cþŸ,ÈJÓ¥ÞiçÁN¯ÚZgá^¡±z]ᮉÛoãc¼ÉŸçÍ/Îù¿«:·õH$'’Ÿ^(ζ¤Ñ Ýcº%Á1žW¯›‰éä’ï¼€›öynó~^nsJ×÷bÞB¬?l›öø×ãÑÞ¨÷göj6s63S™é‹õ _öGÆûãåérúËôÐ…!¿×%ýYºü¨<ôåPöjvúcÕd™¢m@ß]qâýñô—éâƒbörv¹"˜/LUQWÞ¬Ù+Ù¾c}3fñÄð•úzž¼øŸgÏœûìܹóçVxG›Tç·ð¾2Ö}¨;r$ÂãnýâÅÍÈví•» JKÑX”‰½‘áÃáâƒbña±»§»p·°Â;Úœ:¿‡zP-Ü-Œ]“;äñ‰ñÄG‰üÝü ?$"G"þºcý1NÆï¶ÎkW¸W¿96v^S%Îm›sG‘øði–þ{NbRr Ùr®Í,à¦}ž…u¾ÞÚÆ¿ù¿ÕÈ‘ˆùÒüÿíOhÛVÇ߆z€;Ô°B Äa…9,0 r°Ë Qh 4¢;ÌtP”º„R-‡Lí¡8¬i¯°b:œÂJX@9t8‡‚}ÈH-¨°‚ÈЀćdR7NBäIJœ~?øýyïó~öÓ{Ozorzrîç9w;Ïóù§ùí„»»ñ<ïN9_Ëø•ñhT”“—’ʘ²Èú?š>¶|D‡ìH¹ÏrÌ7¦ø™È*L›Õ¦®LI1I”ëw‹öGC9Yýž2ÙLâëÄŽ$ÙomJ©ã8<Ï»i½{ç.©Å?Õ+j~)¿WŽ|ó|äȃrn!GiõÍhQÝÁ˜}rZ›˜êžŸðÖ¿– ¶mûÆ>xöGNÀÃ8hñ\|^LÝÖS‘è)Â6ËÚC«l³Ô·\$Lô ÜÔƒ9®“’‡êl¹ÀfÄóáúc›÷P{Í GÎ0ÆŒeÃýWŠIæK“TÈâ‹ÉKÉí…çR!ÆŠ1<:ìn4_›‰x"úy4÷{n—‘¹f¦ùˆûUv\¢Erb_Æž,‡˜¯Lë?+÷4×{ª·~7eTÉ<̈ã8ëkëú-]SvœVê—Œ%ƒTÈêʪ“ª£J£ÃƲA¡”–7Ë{æÈ7ÏMøH1)û(k™qˆmÛ™ÇyPÞ§ìvMUb ‘’'’~nâø¥ïžý‘”0nçƒÖKëÚ¬¦_§ Û,Ï=²JfØbý1c"EHê"w÷Î\aµÐJ>Æó¡ž÷9dëøàhÓÚüýy÷Eõ²šº—’âRöQV»¦¹;¨j&›‘âRú~ZŸÑ·Òf´¡o†ÂŸ†ý¸ñ>B9^Nå›mZ+>/Jg%mFS.(¹lÎøË˜¿7¿³&ÖoêéßÒgΞ™šžJ^LÖÏ•¥N¨ùå¼——Õ µ6#Ò€¤Íhúl5»ä¨Ežõ²Z,•ï)!)cнaOMLí™Ó}O2<:Ü×ÓwœâÙ9A ãVÿn„l6;2ÀÉýcåô’½¸Æë³º>«—6ÄÔSF*DŠdœe²²EZ&ÐG9E¿ˆ«†õÆ~±VÒgu·ñ»ʘrýÇëår™m2ŽãÂa_ê¡6IJ,Æ×Éñ<ã§“W'ÅnQà…Ïð ÏðÜrÏêUU>m)taÅN-‘Ô­Tow/!ÄúÇR¯©#ÑdœË—X¦Iÿ’&ÇÓ³<(V æóÅÚ Ïûl9´ƒ²c!æqèÓÒ€´ëö³B{Hˆ¸ëwÓêly·o¾ç†ÛFl»y>H`·üV{>&áÚnñ'ë7õHO„vQÚEÇq#¥„¢HjKÅ]«Õ~k§M»zyê!gx†gx†ç yö¦Ð;jü‡ñäwÉHOÄmø;[޳åP‚VU§;ƒsq­èN~Øíº¼Ý*Â3<Ã3<ÃsÐ<{›¯À¥°ZÈ<Ì”J%{ÓnöÌ>mZ*B§ Šbì«X_´çùp8,ðž{Wàžážá¹µžŸ¯`û.Fê—ì²].—í·(’} ¦Kày¾ ‡gx†gx†ç@y5~%^à:¹•>/ÐFTÇ–C´ñ‘x†gx†gx†çC »W"=ã; ‚gx†gÏ-çc(P_¨/Ô—êKõ%€úø òÞ<³ò9R€j%Yÿ§Ø-Ï È\j—.Ù®/ÇqÖ†;ÀîMMó•i¾4áØ‹ÿ󞉼©óIEND®B`‚kildclient-2.11.1/doc/C/images/testtriggers.png0000644000175000017500000003635111405233117016274 00000000000000‰PNG  IHDRAg.{ L pHYsÚk¥óÎtIMEÕ 2kfy IDATxÚíÝahW¾7þ_&pT˜/h †NÙ@Çl #nàJ\¿°Š/D&"“Ñ…Vi µxêÜÂ?ÖæEþJ^ôÚ]ÈÚùCmaƒØ`6ȆV~ü ]pÑRv Œ †ˆ`d^ü_Œ"+ÒH–;±“ïÓÚ£9gÎ9#ë›sf,½“8• €CH°~±0 p(3ŒˆÒ—òÍŸ™ÀÉc\`œs&ˆˆÈ#"âÏKpÏß“‘@äq âËàIž9ÆHbe“‰Ž£cĘi‰v­Ñ#Ú{F ^Ó g{ž~0òˆ{$1""Î9÷8c玿'÷øV@ø±BŒu^ýk眅ydmZÖ/–³épn³Y‘ ³:—CŒ 2Œ5¦=ÜãVͲj–cs{³"e–Crˆ‘gÉ2k,é5'yœsîØ–S³,ËqlÆDé7Rc²2 Éüùj`óU‘ [s9÷ù7¢È˜($I²,2øSÛvî Iä‘Häpò'g.çâVÁ>ítšú$ºÃ‚nGªìSD ‰ŒËff‡ÃÄDz¸ùÄ •%‰q×sñ‹¯…ÈD&0òÈüÙ,­• ð4§–4ÈÔߎEN說ر{¾îç¯6¬¼V®T*Ö϶e›ªª*G#±¨® ŠRˆ8É.¹¢ >_ç#«f•R¥jý\s‹<’ÂÊÐqMÿÝö\%ôÂú¤DRKü¹Ïš±K,ÄØÉ¿í§¶ñC©²^1›L`ªªj'ⲤðºkÛ6{—q"zÜóÔåFlä¯Ä[$¢Øqe|T K¬¶ÉóͲѸ©DUäô)M 3"2ž8¹û†e»~q"ºý‡özºÂÿñê÷•©3ºå8™›å¶Æ¢jrDåœÏÜ3²Ÿë}>Ô­Ù‡ ìHðóãˆ#‡Dâ®é+"‘Û†#º$)‘Ë]ÌÃàõNŬ'ÖâÒ¢ù“)ÈÙË1©Æiñ¯åÒªEB\QTªóðkîïOÚJJŇEëW+¢PæÊØÌ·ÅÒê"¯›ÉÓI—[ÜÑØ#‘DNÜÞ´ £ø¨dþhHŒiï)ÄɪYÕG¶Ë)öoq«n‰L”$‰Z.‰µ¬%6oÍð¸Ä˜ä1þ«küP).­š) ÄI4*†Usâ§’Œˆ8§#Äžõ½Òõ¼þÈqeâŒæ`SkWo9UÓ&¢É3Zs´÷¤‰3ZæF©[==á›þT'"^{¡kDÓ•³'UÂ{ñc­Ï‡z4»óp}uÄw„ˆ‘øŒìMÛñH ‰ôÔu6]"RBÉ5~…àõðHd¢ë¹Ö¯VíIÍ©;JXI&â’@|Ó17-í¸ÍdÆŸˆ1æOÝ\ϵ,ËØ0¬_­!m(ó¹d^¼ Í_7Ë•²v\г~5¦0¹äú™gühX?ÚéÏ]MsU"´ódþÂów–Õ£¤Óí_m"’$‰·¼Ú mË‹ôŒ8‘ãq"f¬—yÍ”"F¶çÊ‚$ÿZµÖÃêð˜a–˜'ILé;ÃÿO«D4·RÚ°"Ç”©OõİV}\"¢°Äˆ(ó§5ó—­lH}³œÿ6áÓç!|Åÿ[[Xª²w[¶{DD‰¨FDÅÔþVM'‡¢ÿîç¡Íî<\`G‚=]Rɶ=n:Œ=%Ù³m¢*'î’$ÇÝð:3Œ»ÄÇq6ëgKÈq\‰žÅ\ÆëœU6*‘ñ²±$1&Ë"¹ÄjO¾ÉìŸÍ!Å™þRu½*‘£<“¦>¥ì‘a8±ÉÚ¨2™±csÇùÕ11ÙQM”U7qŠ“G¼î›œ‡³fMÃdï2raùÂ<¬õZçDÌv’¤åŤ0›×‰1"¯fxáÜ_в·7¹,ñæ]%ÛÏFŸ×¯†%"šøXŸøXol9ÊüG‹?Ô↳_EÍšS1¬ÅU³u²ÕÂíá[Z­ÚžCvûþŸÿh~µêUumvçázw¤óÿh7n¼iL¼ž‰"îæ€×É®»´épÎ]Y© š$9ô«í±‰ËS_¹†c/ÞSØ€XÛ´•0·±ºCŒÛÜtȼøuŠ“%s"—¹^…!-Þ3%9›¦c˲$“GüùýírH,:‘©["ñÒC¶ü(ÆrlNDŽãð§/Ü^¿uOoy¹äœODí·RÅP—¬‰ßËáá_¯+Ü—«?0M“yÝvCÄ<¹yo»Õ®I!æ?:»PªYš®)ÊKŽhšª\¼^짆À¬_yÛ–Æþ 0DÜÛ*²ýCÝ›Ýy¸ÞyÀ¹GŒ¹Ïï^õÈáDDîö© °ø3NÄ-Ë–“çn,O^ˆ©G*öS‰ÈtZ¼.)ÃŒsÛµENÜ¿=Âq¸m»rH‘}æÛ’¢©OˆÈ&Ašÿ/Ñ"Wû0î·\Qå¿úr]—Œ[›q‹8#î’ÐW†5ë7kŽzTš½S)VÌöy†Gù#¿b(¿‘nÿ!®½'µî 1ƽž×‡Ú«sOÏoWÃ,9¬æ–Œ³£C}?Ô½Ù‡ëÙ‘玮ë1æ_åÌæ$ 6óDNÌq]:‚_"xm˜ÇìºËçuÒ~-=*æ®»SŸ(D'š»®›4~B³LS|×¥:gL""ò¯Ûœ¸úáùC™ˆ‘g0ju‡ÈŽEUË4˜ÿGfœ7ÿ«ªªõĤ™8r„-••i¿Y–ÕX)t9‰Ô>£­µDש3Ú$qÀÑ4ÕvbÅÿ1Üc3¦~VT¹´V"I¹G¬ßåÄÆnK©O£SŸèSŸ4å*?Ô27‹D4÷MB=ºõžÆÏŽ_Ê©s)Äò×k?Ô²7‹Û¢Ë-ËŒ‰3zâßÔÄ¿©µïó¡Íî<\·Žæ®S·I¹ÜsºH!b‚Ë9³ëëóßûÁ#&0gÓv9W5™sµ¼ndÿKNÿ§4{‰ÛdŸ‰kZdé~É%²=—ùD·ëæ®m2&ˆœ˜µY㳉ôI©ÇÔåûyQT¸Çí§¶¿–hs[9ªD¢±üÝR®nK!â-­òðoXütšýF©<*6þÚš·ÌX¶®‡µüólârõgS=¦ÆGfE16-˜r\Vôj¥b&“""öBÁž }ݖ׫\ ³£š–8§âÿ˜ó kþ£™Å‹¿é¿ Qå§ÚÌ_Jþöù»¥‰cc¬çáÚêÜÓß²´ZfŒR£ºå8Wooÿ!ÙÏC=šÝy¸n d;$1—âD¶ã2â$0òlgS–°˜¯1Ã8Õ%&(VÝ ¢Äéqí„alØó·m”Åô¸zL*­U-ËÒŽi2¹çÕyD\²k”I—+•Ü-—{ …Xl4¢'J•’õ”« ¹žËêÏÿ ºÎ9ñðoÉpÊ|\5k¦,È1UÓ~§²ßPe£dÛ¶2¨4¦b-³‚wôõô¥|þa©kä‘ã8Dž¥†eM‰*ïÉ\°­ŸÃ(U CI’¢“‰¾·ò+ÝH“@“\.?¶âºšý<îÔyâë|ï‡ö°T™ÊO™Yc‰« 7lfÖ˜~L޽‡ß!xm¸G®gq¹V3]âChÚ1I +µMǶÜÊ?Ö¬_«’4¤2bª(1FvÝæuî8yþm8¢*Ê€j×É´Lã 㱩U¿ “D¢ ú NÖ¦å8 …‡ŽªLU‰95óqµ\1zMTÃa1ÔØ?q*aþl–ÖK×ÃßK!"‡™?ÙfeÁ®›¢À\NbrH‘Þ•ˆ‰t8ßiíÇZôwá¹ÿ³õ‰3ÅõÆ%®í»NªÌÅ#Ïÿ%âáä‘cÛv¿DðÚˆ‰$ºžKdIänRqµX¸Ï‰[’ˆdy€”P$üÆ=Æžßî¿›.˜’œ_­ÊÚZñË‘ Dž«„Űª1©q3†ë¹.wûK’ãX†i׋œsHH’UÕüÛ]Ïm{뢎ëaÄ8ó˜ḦIÄ$ƸD1âÄ&0bD#åS8dg%{³0õûxì……˜SçÅusþ^Éï~‡öï:&—”§5IdŠÀ-Î%–È‘˜cm†MGPɳñ»¯žëÑó·îcD$K$3•sî> ‘xDdŒ#î‰çïÿB¼0YVß••ßp÷™ÛZäùÇž¼°; ÉŠ@²,»n#¨šE$ÙSk舂Ø2ó¿­;þ}.qbĈȓYÈ?@Ën[&}Èî;°ë6§/MO^˜lVkF¹RÞ¶¿Ù+ÙøHÜØ0Zó¯Ugˆ({-;ž/WÊU£Ú{ÏÞ§àÜùs3×f¬_¬©o¦üÆ·õ®Ûé迃=jè|òö+pã¶OÈή-’wôõâZñùß8g·ý LEQºý+ŠòÏÇÿCbën­ûkÇ5£b@¶cÇGâ•J¥­TàZ¿é¬?°În Ö4­¼^C¢Ë݈1 £sçr¥¬„òHÓ5cÃèóÕª< “GÊ`@#·x¤ ŒŒ®ë•õJÛçs+ŠR5ª²$oÛ_í¸VZ-ɲU³"z¤×‹lKt]/=*‰!1¸TPSOAòLR<"N|1¡ŸÐE&ö~ž´nᅢ=jèlO`¿7nû„ ì¼^‰“‰ÒZÉ|b†°·UwFQ+gÓQ•–ê½g·:ƒà8~ "»]VQ ‘°uÝ¥ŸCȲ_*°‘¶cçnæŒÎÔôÕ6kt*ü×÷mûë8Žß€Fã;6 ¶Yk¼ú·”Ú¶©½ËÝÊ¥?OŸg+ü­0t|¨ÿ'LŸÜÑS"°_·}B¾L×à^åÁ$I26Œ½=æŽê”$É­»þþ(þQ@ÃBy}ÀÆ„Â~³»ÝwØ€æhX5«ÿ¦æÐÒ½%òhñþâøÙqòúŸ$ýê¶±÷±ö¶k°çöÿoœjÞWWÉ£üÝ|âTbOªß¾Î°ô`‰KW‹c'ÇöªÙÆFòt2æ¾ÏukXñQ‘<*¬bÑØNû;vr,¿'f¯Ïö߀Ähbáîy4c~›¦ö‹Æ  DÄBlkvÛÒ»n§ãåOhð:CP¿7n{¬à®À¡Î°ýsb4Ñ\É^Éf.gUÉÝÌÍÿqoÞ,Û:_hÀåìâ_UYº·Ô¼e£ý5t8®ŸÐî,L_šÞ«fÏ]Ÿ;wþ\äDdèØP·‘ÉÝÊ)ªrõÚÕ¹s;íïô¥éµ¬éQ]×õþ¹œ),ô/” ÜsÛÞ]ýöª2¨œ;îöÍÛ½ëv:^þ„ ìWàÆmØ5Ü—ppìøžxóØŽ‹Æº]{Ãúõ¦vàíÑzOÇÁ}¿Dükw¿©ÇÔÒ£’ËÝùëó½0߀~½©xË ¶eø+œý6óíÌÄ…‰Úf-ú¯Ñù?Í¿ÙýzS; € ƒ·ÔøéññÓãoI¿ÞÔμåðÙ+€ @† À @†ÀÛng†÷ÎxóôþÐA×s÷õè¢ îúo•w\îìÇIœo€7C~añwÞ |Èå.y Ñõ\ιŸj/‰{ü…N1ÆvñI³»É¾ÔÇ)œx€Ã.6ë1ýj~Þ…HDb{s\æ1îó8˜iœs’h§1¶Ëù[âfc‡›ãÔº=d;vs¾Å=Îógc{r\—\Æñ:眓@L`䑳éˆá­+âžhgýÚ¸BæÏ–ˆöòª˜Œ1Æ溮ë6j¶m»5;‘a°¼ÞXßs]—<âoÜy±oßŒÃÆlŒsÿJçÜqœ…%Þ·Ú9uG!Åu÷qHžDÔïÝý†P3#=×°Ö£8ug§õ`-Úù×Ãü˜aĈ¨¸Zœùv†¹ÜeŒ¥?KÇGãS¦vS»ð²dó̓b»g?µÝgnã/·IEŽGî-Qså{Ü}æÚOmd¼ô<Œ?Ÿ=­™k3‹#ÑHæJfùáre£Ò¼Ž•½–Í|“©nTÇþ},ûm¶y ÍüÙ\^YžûnnòÂdsÏØp¬´V*WÊ[ó:Š €=È0ÿG«ÇÔâJqþú¼")ù¿äÇÿ÷øòƒeÿ:Vqµ¨ª*y‰/?ll$¢‹_^d‹Ä›W¼ŠŠãÿ1ND_LPç›Ní<Ãp= Ú¹¼ãþx¸ÇµcšvLKý>eÆÔ7Sñ‘89›ÎÐñ¡€(¶¾÷¿q6Æç\~Wîë È0x©y˜GD/.-Šbãí¦TUuÇŸHI’´ü`¹™'ÍÙUë4«±ç€dýjɲlÛvk廞‡a-zfy‹Æî.X¿Xä’mÛù¿æ'þ a,3›äQáo…ôçéæZâÖ}óϿǗï/Qîû\[€!Ã`2Œh⋉r¥œú,‹ÇRgSv;øÕÅæC37fb#±…» ™o2=ªõ+IžNF>ˆôsÐma-Ú¹®+¹Àý÷""Y–çÿ8¸sàC¥G¥ÎïEQœýãlcã¿—)$˜xDl¾ù/2 ^nö<]ü-6ÖT»ÃÖx+aó0Ø‘á^ÅUpùÂÂXó È0x¹éQˆÙ¶-Ë2yÄ9wŸ¹D$Ù›ÏÀl&˜?EѶí]$îé€vCdž̟L"E‘1¶5CÚ£kM/ÿ~}ógS–åV¾›¶Ä†c=>Á»Ä©DöZVû@ßÅwEÿ“0]rEÚ³OÂô“Œ‘ýÔÎý9—M46î_†åqvÞl±h,q21ùõdú³´öæ/*ºÏ\÷™+Ò^¬( Dþ‡‡q^Þ(çnæ4M‹èùÝMÅvœaï¼óÎ.ÀoòËɈÉßÉÏ_Ÿ·ëö.n¸è'‚䬪jâd"¢G$I’$IÄT°–eá¼¼=³±Ø‰˜íØŽãØO÷'Æšaö®,I’,íó< Þ"É’ÌB,ì…ÛÞf~5îïÄWqO¼U1æ¯ïíÍ•°=…{ëà°B†2 € d2 È0€ÃigïÓ‘¿“ÃÀ¾J}’Þ— ›úÏi .ì«Z­ß¨ö©^€ý†ëa€ @† À @†2 € @†2¬IQ”Å{‹m[^¦/Y¼›ÂJATÒŸ½ðæÇö¦ý*ÛÐ[kcúo@·.¼|öpd^Ëx2¬/ó7æ]îðŽ;îöÍÛ¹›/|XLl8¸³eY¯¾…ݳ¥^Mm‡ ÃÒŸ¥g¿›=è=óhìäXÛûò;Žsp¸»ÆìmÔ€¼Š K}’*=*YOÚç.­+HÍïEÉßÉkš¦׊‹ÅÕ¢v\S•ÂJ¡¹su£Ž%O'm§±´åÖÝÔÙ”2¨$Ï$ݺ۬*w+×9u°;y&éïì×à½mE«mckmͶc'O'5MËÝÊõÞ¸m ýÅLeP‰ÄËëåÀ±jmáâýEM{adÊ•r|4® *Úq-7ß­_}Žó¶µ¹u7ýYZUÕX4V®”{4,°ïþYдFåO €‘aD”¹œÉ\Éô¹sy£\^/Ï\›É^ËV7ªåõòí›·Ï?×Ü!w'WZ-M^˜Ì^É6ê¿’™þôeZãÉñ«×®6÷”$éï+ïlÌxrÜ2­ÔÙTær†ž¯ ¶­vnì¬-{-;ž/WÊU£Ú{ã¶-2º3ˆH +þÍË3Φ£ ,CwÇß.2qGx:k«mÖ/ýa¥÷Æm[˜»•Kž?;ÎVø[aèøÐ6£$Ém[lÇÎÝÌ?~*¿ä8o[[m³ø±Þ ì»ã8~ZG `_í>Ô£Jl8–¿“ï|¨yY«Oö¦-È.wÃa‹$IƆÑgë$Irë®?“$ée†£Y•U³¶ÝØ»…²$/Ý["ï/ŽŸ÷ç—;’ú8‹ÆR§ÂGÃÅ?zÉ3½mmRH"¯¯gD`ßÃaÿ<îíÝÿ=¼Ôß8O}=•ûs®5 +—»;½kqöú,yT\-Žó·ÄGãÕÇUò(7Ÿ8•è]<>_z°D-¯,ÇGã½#»w¾&F wÈ£ùó½7nÛÂX4VxP "bÁ³Ãícüh$O'£Ñhîû\ÿ¥v][|4^|T$ +…X4Ö{À;û>vr,¿'f¯Ïâ÷ A†‰Lœør¢ù£Ù?¢G´cÚŽê‰ÇõúÂ…éKÓþ–ì•lærFQ•ÜÍÜüç{Ï^Î.þuQQ•¥{KÍ»BºETï5½ÌåLa¹ ŸÐu]ï½qÛÎ]Ÿ»úíUePñÿRm™»>wîü¹È‰Èб¡þKíº¶ì•lîVNQ•«×®Îݘë5àA}Ÿ¾4½ö5=úÂ(á¾DØW;¾§ã-a;v,k»t¸^¥Ö{:ð~‰/P©¥G%—»ó×ç›ëiàµ0­f¾™¸0QÛ¬Eÿ5:ÿ§ùv°ŒŸ?=ÞÏFxí°–È0d2 aÈ0d ÃvÎüÉô?7Y×õÜ­ÜÁìXÿïÔ×ú>ë»+õjßÿÆý†o Ÿ|IDATw¦€ÃšaVÍJœN¤Î¦,ÓZº¿”ÿkþÀÆXŸbñWVêÍð6÷w†ÍߘŸø|büô8 ¤¾§Î}7—_Èê!ØÑÇf¾d©7ÃÛÜw8ÜV|Xû±æCÇ‡Š«Eÿ{Û±ý5Æä™dóS©EÉßÉkš¦׊‹ÅÕ¢v\S•ÂJ¡ÏÊ•r|4® *Úq-7ß,•û>§ëzëž~4mk7"*¬”AETâ#ñòz¹­;þZ\ëŠÜâýEMÛ¦¥”hÌzbQu£ª(Š8ó'Ó§ànãÓÖ˜V=jSݨƆcÉÓ[uºu7u6åÈ­»EÇ$°Tç8·õŸ®‡)욥UÊ\ÎŒ'Ç-ÓJMe.gšÛËåòzyæÚLöZ¶ºQ-¯—ýOës‡É “S¦,ÓÊ\Ê´Vkšfi­ÔºgöJ6>76Œre+«Î?7smÆúÅšúfjòÂd{w,«ù_ŸaåÊ6 è,å‹G‹ŠDT|TdŒ•ÖJDT\-ÆGâ=Ƨ‡ÀµÉÝÉ•VK“&›Ÿ–¹’™þôeZãÉñ«×®v “n¥Úƹ­ïƒðÊìøóÃTU­U‘‰išV^/‹!ÑånDøŸ³¥(Ju£*Èä‘2¨üóñ?Åèo÷_þ¶Ýa‹GÊàV©Î=µãZiµ$ÈVÍŠècòLR<"N|1¡ŸÐ›Ýz EQªFU–ä~Ðùò]X),Ý_ÊÝÌ%Ï$#z¤¼^^º¿”:›JšŽÆ»OëÑÛ*ìQ[ãË•²VÈ#M׌ Ã/eT ÿ3šã#ñJ¥ÒV*pLKŽs`ß^—úü0å¨R{Rk}Y_¼¿èë8Žÿb'2±õ’‰< 5Þ"ßß¡MïlÇžùv&ýYºíV‚Î=Çñ«RÂ[ \¹[9÷™;~v|HªnT·í `ý4 S|8^Z+¹Ü­üOeâˉÊ·î–ÖKÑh´ÇøôØ£ö3â?$l]¦r6ePQeHªÕjS· 1éV*ð”;ΰøH¼°\Øšy<,Ìßh|¤–$Iþu—»’$íUS§8ç©S·ÿ|»÷žá°ÛwëÍß²$/Ý[²LkæÛ™ñ³ãûÚ1$j¿ÕrÎé¿ÓeIÖ§Ï^ŸÕ§û1Ð{|šW³¶íQ{ÁMÛ¯3<nžë«)0§;ÇdÛR‡>ÃÒŸ¥çÿ¿ùÅû‹.wË•ræRfêÂT#ÞFãK–È£å•åøh|¯šhüh$O'£Ñhîûmnâ;9–_È“G³×g›cÑXáAˆXˆÏ~„àüئ]JÅGâóš÷/€Å†c¹[9ÿû®ã#Pa¥àrwö»Ù>{Ôföú,yT\-Žk¨ú¸Jåïæ§EÇdÛRýÀÍ0õ=5÷çÜüù÷½Ÿþ,}ñë‹c§/ÙËÙÅ¿.*ª²to©yÁË›»>wîü¹È‰Èб¡Þ{N_š^ûÇšÕu]o-~õÛ«Ê rîü¹Û7&R‰ÑÄÐñ¡6 [©øHÜqÿFÄøpœsÞ̰Àññèí˜ÖgÚ8×Oè w¦/M7t%›¹œQT%w37ÿÇùÀuŽÉ¶¥ûŽûà5Úñ=¯ÑKÝÓp@ À @†2 € €·°£½§¾žÀÀþÉ/,¾YùdÍ~7!€ƒk‰pX »+‡1v°‡ú_BÄ< =d ÃaÈ0@† Ãa€ @† Ãa€ @† À @† À @†2 € @†2 € d2 € d2 È0d2 È0d2 aÈ0d2 aÈ0d ÃaÈ0d ÃaÈ0@† ÃaÈ0@† Ãa€ @† Ãa€ @† À @†´vW¬V«aìó0€ýŸ‡å1dp(3 Kˆpp`-aÈ0d ÃaÈ0@†í„Ä߸sÿÕ¾|Oú¯ÄÞ´÷o@ûŠ=éõN«ÝQß_²Ù­ÇÚ§ÎîßÓ ÞÀ ³žkû¾ÛÎýWû*û޽Ág´÷`¾|ßû?Y¯kœ_ñÓ M†½ÇykÏ÷«ìûÛ<ÎpÈ2lñþ¢¦iÊ RX)ø[šK:…•‚2¨(ƒJ|$^^/w–ísÏX4f=±ˆ¨ºQUÅßÁüÉŒEcÝÚP®”ã£qePÑŽkù»ùæ±:—›zWn;vòLRT’g’¶c·5;°B¿ˆ¦5ލºQ Ç’§·êtënêlÊ?[wÇ*7¯S[K)Š’»•óç=Í–(Š’û>§ëzs@Úúx¬m›Ý£þÎÝZ‡¥óìôÕÙ;yMÓ´ãZña±¸ZÔŽos~ûoa·ç›[wÓŸ¥UUEcåJ¹s„›¸1°Xê8ˆfF¹R¾}óö¹óçÚ:wþÜ̵ëkê›©É “=*é½gt8Z|T$¢â£"c¬´V"¢âj1>ïÖ†É “S¦,ÓÊ\Êd.gš MËM½+Ï\ÎŒ'Ç-ÓJMùõl+{%‰Fóu°SîN®´Zš¼0™½’õ·d®d¦ÿ0m™Öxrü굫¥ÊëåêFu<9Þ,ED’$ý}åïm{š¦YZ+5¤­ïÇê§ÙÝêoÕ9Îg§¯În”Ëëå™k3ÙkÙêFµ¼¾Íùí¿…Ýžo™+™ä™¤ùØœ¾4Ýú$lŽp`³»õ¥³XêØCïèêŵ¢õÄ66*Ù+Ùå•å~Š)ŠÒú«¨(JըʒÜúPó›ä™¤xDœøbB?¡‹LìQ[ï= +…¥ûK¹›¹ä™dD”×ËK÷—RgSéOÓñÑx`¶x¤ ¶7¬ÿÊ5M+¯—Åèr7¢G Ãh«§³×Úq­´Z’d«fEôHçE)WÊJX!4]36 ¿”Q1H Û±ã#ñJ¥Pj½¬Uܺ‰FüRŠ¢üóñ?ÅØÖ’ÀÍ–«Ÿf÷¨¿Û“$ðìôÓÙêFUýÓ×ëpAçwÛ>ßt]¯¬WÚÞ »µªnãÖ¹qÛÀ.$N&Jk%ó‰ilÂ^Uê¿<Ï6nåÒŸ§ÇÏŽ3þV:>´»=ãÃñ‹ß\t¹[ùŸJîV.r"âÖÝÒzéöÍÛÝÚ`;vîfÎøÑðS§‡Þ•;Žã¿‰Lìó2ã8ò€LDJ¸ëÚQã!aëÒ‘³é(ƒÛ¬5)G"C/´Äo^›À[- :V?Íî³þmŸ!ýtÖoŒŸ(‡Ûöüönaàó­¶Y ü8‡fUÁãÖ¥/;"Ø)áC–ä¥{KäÑâýÅñ³ãþÔa{Š!Qû­–ûsNÿ.K²þ;}öú¬þ;½ÇËDêãT,K}œ  ÿ¨÷ËqÊ%Irë®?“$©ó•´³Âð@ØÞ´å¹Çíìþ.wÃáæ‚•±aô>-Rõ­R»x¬~š½WúéloýŸßþŸoRH"¯×oF`³_¾/° ¯â¾ÄX4VxP "b½'1Ûî‰ÏÿiÞ¿FŽånåšÃ?ÉÓÉh4šû>×ܩӣòøh|éÁy´¼²7ë)¬\îÎ~7ÛY󯃱üBž<š½>Û­y³×gÉ£âjqìäXó@ÕÇUò(7Ÿ8•èQjáÞÂØ©±]ü£¥Ù÷ÀcõÓì]+xîÛGg{ >¿/÷̌ƋŠäQa¥Ð¼]hÛf¿|_à€fØÜõ¹«ß^U•sçÏ5×ýv·g|$î8ŽÿÊŽsÎ{gØÜõ¹sçÏEND†Žm-K&Fë™=*Ï^Î.þuQQ•¥{KÍ;)ü õ=¢Ó:k›¾4½ö5=ªëºÞõE|8®ŸÐî,L_šnèJ6s9£¨Jîfnþó¥ÔAU=¦–•¦¿™Þé¹hí{à±úiö.ލŸÎnûÔê<¿/ùÌÌ^ÉænåU¹zíêܹ>›Ý_p_"ÀÚå=ðºàÖx˵ÞÓ÷K€Ã È0x%°€ d2 È0€lgïï6õõ† öO~a±V«íK†Qêã†öƒÿI³û5ó%N%1аç§¶£ýq= +d ÃaÈ0@† Ãa€ @† Ãa€ @† À @† Ãp°;-Ž9N ‡,Ãò ‹28”V«a®‡2 € d2 ȰˆEcæÏfóÇÂJAQ”ÂJ¡¹ÅüÙŒEc;ªSQ”>7Ú›ö.Jõ>hÿEúoü~”ÚE×öpäm{:öiô^xú *éÏÒ}žM{ÓNžN*ƒJâTªYøåxë2,q*Q|XlþX\-jhÅÕ–-‹‰“‰}jklx›t´¬¿0í¢ÈË{-Ýó¶m{:öÛ¹óçnß¼»™ë³Í™+™ÔïS–iÅNÄ.~}¿üo_†Lþ»Ðša™K™µGk[ÿ4þïÂþe˜ã88aÇë?ëÿ­fŠ‹‰Ñ 4õõTñQgà­Ë°ˆ©=©¹Ü%"Q1>'"ë‰ED.wȉÙŽ<“T•䙤í4Z—z:—}ü"š¦åïæ;íïßZjñþ¢¦iÊàÖbfóQ•ITâ#ñòz¹GZ—¡rßçt]o­Ð­»©³)¿nÝ ¬¡ºQ Ç’§·º¹m©mšþ,­ªj,+WÊÝʶ~8tÍè=ÈÛ¶mG§£ŸÑkmUÛ³Åvìä餦i¹[¹ÎgKk: <´abHô¿QßSñËðÖeÅGâþÄ«ô¨‰û1æÿ«¶¸Zô·Qærf<9n™Vêl*s9ÓOÍÙ+ÙøHÜØ0:_¸éùW몑aåJùöÍÛçΟë\eš¹6cýbM}35ya²Ï®™¦YZ+µV˜¹’™þôeZãÉñ«×®–ÊÝÉ•VK“&³W²ý—ê}Ð䙤ùØœ¾4Ýgã‡.°½yÛ¶íètô?Ï–ìµìxr¼\)Wj?χ*ì~èÒZ)õYjæÚ ~ùÞÆ KœLüÄó·ø—Äk5Ï×m’§’$Pâä —ÐzX~¸œúß)¨Ïk_NˆL;9F^ûCÑ.¯,û)[Z+õÙµéo¦Û*\^Y:6ä÷¢s.â»øõE(>_~¸Ü©->,ŽŽ‘@c§ÆJJ»ºÀfìh;Û¶£ÓÑÿ8>[Š‹ÉÓI‘‰¿Ùñµ«n‡.=*¥Ï§s7s¯ýbì‰~X4–¹œ!J륹sD;›¸0ár·ø¨Øœ‹8Žã¯ÛˆLìó‰ã8ò€LDJ¸¯ÛÕdIîöPîV.ýyzüì8Xáo…¡ãCýTè7ø…&m:Êà6i´Vغ>ÔO©­mÖvzZ‡.°;äζíètô?Ï–ÚfÍߨçó¡ŸCg.gæ¯ÏïôÖYxs2ŒÒŽké/ÓÚšÈDKìDlòËIõ=µùª'I’[wÅèrW’¤¶:š×q*ø~ËÙë³äQqµ8vr¬ÿR½Z|T$ +…€CÐ]`3¶äük¦÷éèŸ-‰ÑÄÂÝòhþÆü^8˲výo xC2,>gŒ5oßð_nükÍ-ÙËÙÅ¿.*ª²to©¹Àè_ðèí˜ÖYíô¥éµ¬éQ]×õàìMô¹*8w}îê·W•AÅÿ¢]NöJ6s9£¨JîfnþÁ¯¤ñá¸~B_¸³0}iºÿR½š»•STå굫þjm«À1 ºÀfl;È;ø§Ìv§£ÿq|¶d.g ËýÄnšÚíÐ/ùWÕpм£¨׊ÖÛØ¨d¯d—W–1(p ØŽ‹Æ ÃÀP%N&Jk%ó‰ilx¿D8 ÔcjéQÉå.î€npq¨™og&.LÔ6kÑÎÿiÈ084ÆOŸÇ8@XKd2 È0d2 ÞvÁ–¿“ÃÐÀ’ú$ÝW†Mýç4 ”Z­ÖW†uîpÐàz ÃaÈ0@† Ãað¶Ãç8*¹žûæuKÄ]$2 àpp¹K^ã•[D×s9ç~ªFÜã/ü(pˆ1&2ð¦M¿Çñ¿e£‰‚HìwˆyŒû<ÎæGçœ$ê?Æa‡€íØÍù÷8cÌŸâi%¹Œ1"âuÎ9'˜ÀÈ#gÓÃý®+➀CÀúÕjçþ”å°_ó/€1ƘÀ\×uÝFwlÛn ldÀ¡ç_úâw]—<â?Ô“°2ØŸry+dÜãNÝé3¡±–ph2Ìu]îqzFI¯:iö ˜]ä{—qÞÈiÌÃÞ” «?¿ñùWït±»jT]°ËݪQµû@tL F€y,—ÇvP6—»Üãþ×¶s”ÒZiâ„(pRr7rê1µùù³™þ*F¢‘åËYÝâ¢*ÜãÑ‹.?\¨ó0€7Þ ­ÜœÁpÞc¶ü`9g~þkM•8w^w‰Ï|Ê ÷rù¿ä»•RŠeZ[[8-?Xn›‡9Žã¿?/˜ã8þÆ™k3œóÉ “ñ‘¸±a4÷Œè‘ˆù(þ‘³é´ßÓÁ[f“=ÝþÆà0ÌúÜÇÑm{y½<ó]væ+MxÝÉܱ›Ïüži e?f¿Ÿe!6–ë,¨ŸÐ‹«ÅÔ`Êÿ±ô¨”_ÈÇGã­‡“$É~j‹¢èº®$IþFñ]qþOóäQá¿ &–W–ý=—,7£fÛ»QúÜó0€C•a¼ã¢Q÷ûÝ«•jæJ&û¹?N¼îÌÞµ*¦bq-ûWÎ=Ši4ó ›ÿÓli­ÔY6u&•¿“/>,º®[ݨf¿Í¦Î¦ÚŽ;+®É£µÕµX4æoLžI‰HE§Þ˜rÅ¢1ó±IþVHž¼ºÖ~©k‰ooÛƇYâãÜÉ­Ø… ){%›½’­ÔÔ™œ<Ši”áù…<=k/«(JöZ6÷—ÜGÿþÑÅKÓŸ¤;ßj⫉å‡Ë±‘Xa¥0ñÕ„¿1s)3ws.6Ë\Îd¯d{~11sc&6[¸»ù&³ëuƒµD€C8ëÉævT"^w–VíÜ*Í|›UU•ˆf®ÍL|3!?¬¥G˜êZgDä¿Ïwn/=*ùßȲ<ÿ§ùöRÇ#KwÛÿ’L–åù?Îï_O‘a‡€û̈\à\àÛ¾rÿÇøÌw٥՚ͥì¥ìб¡ÆkP™½2;uyªX©Yušø*IGÚËÆ†c=Òk¿ä޳xDtŸáž€7Œ·õB¿í¾ñ‘¸úžjþljhŠ¢´>¤Ss7r•*jXm}?ûWW]0ùÄZ"À›Æ_acãB_Kmªªúë‡dYŽÇPßbãƉ{:Þ<®ëö9;|„çó0o§åàÀc!Æ9—eÙÿ»cÿ¢‘xD<Ä]zž?L`~€‰¢hÛöŽr ó0€C`èØù“ID¢(2ƶæ+Â!žŒ´¦—(ŠDdþlʲÜa‡@âT"÷—œûÔ%ÄwEÙÍ}öüc$…CøÕšdŒ1Æ\×Íý9ý—¨¿q's98ÀbÑXâdbòëÉôgiíÍ_TtŸ¹î3W¤C»¢(=ãÇòF9w3§iZDÈïö;C†“_NFôHþN~þú¼]·wzûÃAN29$«ªš8™ˆèI’$I±¿¢pxfc±1Û±DZŸ¾A1Ö ³weI’d ó0€7’@²$³ {á½ÅûÁ׸¿Cû&dÀá‹1©í_ Û#¸/aÈ0d ÃaÈ0xÛ D/¼¯bâTƒ:¸:¿U©ÅGE d­oißÌ0γjFÓ”ÌüÉ4› 8\þáušîXÈáIEND®B`‚kildclient-2.11.1/doc/C/images/Makefile.am0000644000175000017500000000033011405233117015060 00000000000000# $Id: Makefile.am 1014 2009-02-01 12:46:52Z ekalin $ pkgdocdir = $(datadir)/doc/kildclient manualdir = $(pkgdocdir)/html manualimgdir = $(manualdir)/images manualimg_DATA = *.png EXTRA_DIST = $(manualimg_DATA) kildclient-2.11.1/doc/C/images/mlsend.png0000644000175000017500000003104111405233117015017 00000000000000‰PNG  IHDRT¢ô—Ç pHYs : ëšÃ€ìtIMEÖ è€ô IDATxÚíÝŒç}ßñï2Cçôhì&$rƒ­–1k-a§¼ƒøØ²€NP ÁâÁ.B"œcü‡)©IÂø•Jƒ„tWtŠT€'H1xLä„VÅ]º·j­pÕ’Õ!áY€WÏZxžJ²ÌÞÞÜîìììÏÛïˆÁÃÙç™™}fožýÌÎì¦fþ躭DÕL×^9%Ýæ–eé):Z‰h‘ðT¶þ—)ÓðKB ™= ¦ö ´jú›oÖq©©?XC‰¯«ÓµWNöbõùû²\íWW×*e‰šIyœË"RóP6£æž–ôËÚo„GºÔÔ]¯¾Û§½âºJâj±?Ò"££H¸qÓ©2eᥔ, «´ø"†DO¥ñCQÓ;?¸fºùÉÉI·ìŠ5g}a6²¦ó°à®^³ô‘.´´|¦Û?zI(% 3*­$ÿP– :¨£}Q‰_“L™2‡iz—2 ›T¹Ý¢Ô–Œw?gýÓß”"¾¿vñTõääÿ!ïµ[ö×µo<ýØ7Dôcßß($šòëŸUVZŠëòöÿ F>%¾¿q,ÛZÞá7©°µ<‘=Xþðoã…_?òÌ‘Âÿ¡þù}fÚª©ãi×ø»¿z亹çÏïœP--Ÿòö—wD<äì?ø¿Æô^±>-ù¿÷ýÇ¢‹2”öu ¯L¦L™ŽúÔýØ×Z ë~þ'~*eìKW¿û>ÿÃÿ–—òsÙgOû²9òåïË¿“õŸ''ýÐI'_‰Q3•e‡üÆç yã¿ê~&þñ?öýâUö›UØZ–džÿ‹Ùâ;åú[ûÿö?ý¥±ïˆ|Ê×qß]Ô?H}ö_NìÍ&Y&åÁ*7xI¸e?ó ëÓ²3e¬ý¤¼Ó0ü}µ£…W&eÊ”Gº¼uÎcßþ©ßñü‚a’ýñþ@þ*ŸùŸó''=_ÌÐy§à¿¹=jj¯X·JRp¥ø¨r&s³ÉÆÔóe6«fŸ–BI®ÝÖÕÐY¹~¡®,Í*D–‹·—2ëËétZDò%ɽp¡Z§¸zÃò׊~6÷ìBKˤ{úo_9Œg· Ú{,¦ˆ÷XvŠˆˆ÷XfäÈ?’éIßú´á¬õÇ~Yû»>åg?]Θ†<ûg›MªSSäW÷Ö§åÖÚ.o¼‹÷µì0"Ëþc#¾Bdy×/í»û¿ ©Ÿ>|ôÓGÿÿÙ®³ë—Õß!ë÷Vöüô?~¢œøýFmÿä„úõÏG~Åøá=ß÷µúÔÄÅãÆìg#¿b,ßócÖû'¿©þ’±ò÷¾ïË¿þ*û‹Fþ'~ÍüFõÕÙÆòïU'ÿ‰±tÇíÙ,?nøPÙ—_ûec÷„,ßÿ±öŨ¾ê¯@Ê”)÷¨ü\ÖOÊÐE)ÑEKùcí?6´Ö¾ï»?óõÇ~¹\Ö¾ìúTyå¡Q3:üóÖ›KhÚ[{ê±þÿkÿÐk—Ú¡+W•ËRA{¾ˆHuêù’Ý%3“Úš¥”¢&”2”2‚jRé©Imí’š†Á4·[D¤è¨`ÐÖ¾ˆ4.7­Ð œ{þì×s×ÝâzÑ}ÿMûýewÝõ 7 Ýì±cÛŠˆ(C–¾yDDe3ÙÂu¯ü޳^±ïå¿qDDÒJt)ã•yÉ?”×¾u!˜ß¨~£:ÛZ¹|Ò˜íÙì·˜jvYDÄÊ(­uýk)S¦=:e]*k­EkQ†(CÒJ¥•¤'”R*Ä+C‰¯²h¿vpi£yWÖn$ù‡""³O‹\áY(‰]%R=¸'š2†+¢”!Ú×ÊW"¢”èr° m*¥Ë®%Ú–tФÒЗ ¦ˆØ®£r¨]S[iR¡qùà‰ wÞ:oIZûº¸ºhM.«²NÏœ ¶ Q[q]W)uäð´}??››qË:=¡6»úµ/¦‹®\~GËÖre¨¹pL‰ÈÔ¡©ë~éZAOíUêÔÂÒ½Ê7×µQ_û[ê¼öÅtÉ•bYföŠ«eñGºðHÄ×SÙôüÓ’žRYn¾/ùnÍögÓrzJM¦+¡~1¯µŽnuéUr¥èÊÌSâjY|O \1Ôô>™û\åšÉ-çœÛêÿ^•c_¶+¹IQ†_´ÖÊP[^º”)SîeÙ^·3YíkÑ"A"ª^’mˆüýúZDÙë¶ëÊdÚ /§æÚ†NÖ¾|W‚;†wT®sy¨Å]ùW)›¢Óâ™Ji¿rß•""iUY™§uf"6<Ówƒ&["õïßU£rÓ 1e•ÎZ_8ëú® ºÚv÷Θ{sÍÚŠø’ÿQ~öèl©°–Ý-kï+[¼FÝ{ùÅ—ŽÔ—WÞ)|P8ýÅùÅ—gED—Ýâí¥ÚumR[êˆL¦Å{˜_zg5­dn¯[¸½œÝ^xFìu÷ü˯:÷ _)­ÕlÿÂŒJOÈ«ÿîÊâŸ_›Ú+9½lM¨úVÁsœL‹WÚXÅd©˜_É¥Õ©g”øúÊë×”[˜Ü¸ªíþïU9¶Za]Ddz¯ÒÚ æ‡_º”)SîiÙuD‚¾ÖAaó–$%ÊÓ•;è\Ç•²®"›§R©ÔÎT£æám77w¦R©Txí™]¦µÇl´vÛu]]ü|):Áa¥2PUΆ•‹™´é‰_‚³£•:"ʨÓ=_›J¼²j.áƒþFéPßE”›VhR^/ˆ!ÚHÜmš†Yé—Ø¶•Õ•™gg‹…•lZ–ßYÞ’š•‹ë®ˆè²¶Ë2û•kÕùs99÷¬:÷¬Z˜RñË)Þ/>73½ðõ Åû¥ìS“+¯¿8µODäâËgó—nÛ"’“‚}/Þþ´!¢µý xãÇúÌK—¯üñ…œäë[ïåëW±üú‹GˆˆÌ=?{þçO¿r-8mìµöû¿'å¸jVZ‹ÈÚ}­}<…ðK—2eÊ=-K¶ˆ8e×Ûˆ:Á¤2<*¢Š%ǫꛧR©à@”Ú™ŠlÞ†póJ«T*X{0|6YûºˆÈ­E‹Ø®+RI‹Á¦¸¾ö\;=¡LQ–efv™©)sg*µ3eš)sWjÿ¾Ìþ}STz”²£µv7n=Ð+Ϧ:¦Ü´BLÙ¹·&÷–½Ý3e:®ã”}ïMû~¾Y[‘åÕ•ìÞÉÜQ†,ݸV“ÒÂ)0®l¨ÌÞ\u¾•VÙÝ’Ý-Ê/¬¼~>¦­»îªÝÙã/ß”‰IÑëÅàzÚÅ7ÿúÆÕs_žk¯Uxg1¼ýWþF ÷‹¯}ëÒÍoŸ½øÒ¹#¿{){ ÕêZu³/]—tei%"²ú£ÕÙ—®çN\°õæû˜öú¿GåøjéàÄõ'•Ïj^º”)SîiÙ)ëàORû"¾ª~ìU`üÊIÏ×Ny³Uu95Í«#V ³Ë¬oÞ†psÇyR5M³²œ;E'fí×Vu%ùU‡SµqZ)(—\×4Äóõ‡E'òÛb>,:ž¯Õ„*¹%Okµu!•Cjp=‚ÖRI²Ñ妕µkËê5ÇH[G_TGϺZ»e7í§õ;—œu;¦m5ù‰ÈÙß;­}É¿—¯>µ ¦Rµ÷bxZ7-_ºåZ‡çS©Ôtî ]\‹¯¯&ÒáùnYDdv*•2Mó`îàÙ¯žõœbxûÝôÅïα'~h€ ¤‘’ëV[U—nžÉ¤ê—ƒÙLMóð6Ô¬ÝûèI¸­ýÈ‹_{0HïpýÊáC¤vêyÊÓbJ‹¶y5ç8ž1 åºÚùHD{õ S©ð ¦M+DOEôêeWtæÙój"­vgÕÎ)Ci¥'ÓJß¾ß68iYteîØ\þ½üæ©Z1”«%÷¹Ü•?½ð‡ÇBC Q[¶&­\.[3ÿÈW¯ú ïäÎÜ++1mëËËDD®¾qõµÚkEïNáÎÂwòÓ§^ oùÙ£êÊ×fÏýÙõÙSD¤x¿påkÑ­¢Î¸.ßÕ"rãû7æ?¯/«^»+íô/§ñ‚K“ì$xF¾€™2eÚ£©çU®–—à xƒ/mÞœŠˆ> jÖ .›Í}gMóøµKíY»¸µ‹ˆ«eÇÆµ-›'”ªeWT¾héÒ)k'4þ9= î"ôDmÇu×ßr†ÓÜ8¯| ±½[,7­YÖùEKiyú´Ú«D}Óú©“SŸ™²öZS“Jÿøz£¶Õq®XY~{)ý™©ÍÑBëk«â®»'OÌÝøþðüp9ÿP&÷N^yåBén~kðº¢ÛF–×¾U8xààÙç'•¸g^zõÕ“–ó ^æ¥w´}¿¸ð…ôÜçÒË“¿ðÍ +ï_}+ju!hqWdí¡¼úV^DN>3yç^¡p¯X­Ójÿ÷´_-£‚]õÆ[·-/]Ê”)÷´\rÓ¨ä\hX9©EÔÆ|mRr-µ£C¸¹ýÈsœ'Žã9=qÏqžØ¼;E§¦yxj֞ɘ[Κî1ã×|V²#¸ÂÙ̪j³¼+»ü£‚i(eˆq|œ]õ¼'"ZbbŠZ~¯àTNønYHp=Þ‘}Õ¤>7U[nZ!¢\\ÎMØwŒ\:7ž¯¦æ ¾™Ëæ2Vf6ãʃBäræ_×™=¹ü®»ÿè™ ß¼`˜=þºÌQË÷ܹo.›{¬ó_9½ÿ7ÎOžæÝ­–/¼íNÏ™=6»öݳáùáu…ç7*¿ø}7“­”W\kîåëfÆÚoe¿{mê÷3¹Ùð2 %9û—væÀtÊL=wôˆL™>qqÅ͆Z½´š]«Ð¾>ÿ}¬BûzÍÍÍ~cÑÜc=wøàì /šÖ~Ù|ï&íì‹”cÒÁÅÊîÝBpùUíK—2eʽ,{Z<_‚;ê¬=f&“ÊdÌÌ®T&cf2)ky0›I+åùâiÙr"ÔWޝÛhÞ†šæÕ“‘ÎÆùÏøµ‹/ZKêÃGO´/ÞÖQ¿ª&v~éôQkþh.*McãnwQ®¯Å{Ý=ýÊbzw6s`JMXáæ¹I¹xL•\YxKk_oÜŠ¡"Ë:Ȱ+Ԗ׋3Ý(”D>[ßV»Î¬±<ót¶´^²KÞ’1+*ÓÚò[)k×ö •Igz´üñ,Kã—ÄÜÓêܳjùž\xc)³'§&2bðˆL™öoZxûÊÍoŸ ®$Ø¿/}Qˆí˜"³_¿bžKïÎ…—PxûrëÍ%fíŽã)C™»RñkÑW^HïîxŒákÍM+wí+×ß-˜†#8ôˆ2‚ñO®¿“_øãE­µL¤EÌš…J¡$“i™ýŒ4}›ßj>;¿º.îS•¯.ÝZGMXËzúÍw‹7쬰`˜kuùL·}Úè¡ÓS2™–¥ôÊ»KÞN%†éÖ½t)S¦ÜÓ²£à^€»¤6nÆÕZ|­}­”R†¨‰´£ð7TËi£yx:\{pµgjåî1äÂÜà;°«ß£«¿&ªEÊv±°â¬µ·qþN­ •I[’¶Òûræ„¥‚/‚Ù²¥E_<–žyJJ®,¼åêÊïr‹'bJm9r&å±-G>4÷´œ{^‰ÈsÿÞõ¬™{²¢2•ÏüÂ/]Ê”)÷²\\] ßÇC™jú輤³áåo·Ü¼úëÖÊBgkW†\8–N­Ü}≼zKGünõwÛµö´£¢.»Rv*§M'2j"­2YSeD5øE]eÈ¥Ò¹I)¹rîni]<Ѧ¨š©ˆÔÏd:ÎÓÚ—„¡fÔ©g”ˆœþ®.Ü^R{r¢2fèKl™2eÚ·©·^tí‚^/Æ×T»³i+gîÎÖ .-7¯ŽG¯Ý×O¤S7 žuáíà~v Oƒ+\BÿÕºì)ÑúQ;E‹R¦ˆªo¸1­¼gO+¹x,Û+"²ô¾,æuqÝ57ÞË{¢ÍàRTÑ53)sYD*¯ CÍ~F-̨àkHOWçW—Ò»³b¦Í‰ÌÆ×ÓHã×!S¦L{0qʶúD7ùQ½*3ayR7¸´Ø¼f<êdí¦!ø|:u³ðD|¹üŽ»ñ€6 Õ¨\ù2ÏÆ¶–Coä}}þùɹÏ·%Š[–å{ZDéêI..¢bž¦MɦUfBföV¾¯vé}ñ¶[Ì«´%fZMd6ÓaðzKúʤL™òh—›Ô¼p,ºž÷DÔ¥[¥Ê€lWÑD—«g]“T6­oç}ɦÕüa5µWew Üòr#﮼³,J©´%;•©2•wsÁklã3¿¤¯LÊ”)n¹iͳϦà˜„Q·ÅóKž¦WY¸'†YtK·DkmíÎä&•2$»'ô]ÏS¦›ÓÒGÚ.Kq]Ûwïhí*•–´¥v¥Å12žx¦an}q&Š)S¦‰¦"*uuÕ3 uéÆªªÜJ7•oÓH<­?[ùò7ßÛøÉA©~˜4¤Lyó-QõëO•¹ñ Œz]µöÊdÊ”éøNærFpzTêÆW-N¯FÛÉïØÁw{jÓP5ߊ ÀHÒ¾6 µ£šüèÀÈS†ò|Mòü ù@ò€äÉ’$?H~ hò³B:\}äª3ãmcÉmoI|“ø Nø¼}N~FòägY–mÛþÛý\]üºêísWú—üîëã`P®Ïˆ1©±Ú¤Q嘇-¤fÃmLý¢jš4zv1›0  ÿɯ…ÏülÛŽ<¦0PsL¯™Y?§~4­Ž©1•c /¤~Ã"7¦ink´ºÈ¶z# FAèOò3ZJ~ÕAEœè‹©d`Hr"±“ᰌۋMêJ[@òäg´qµg8WmKdI>€mK–ji¥ýÿèH~-$¿˜Ãtÿßõp «6éѨ“ð=A0~3ìÀ¶$¿.ßç×£»:o^½,¥:Þ´ñ™`ì’_Íh9Š4Íaõž$Ï—‘ˉYHò ë$„Õ´­Yi|\Þö»G`<“_êêªgêÒÕ¥¯gé”>c´€>›ûvñüɾ۳á°ÄÈ£šüønÏh½–ù`[ð«£<¸H~ü$?’`|’_ÒûüìŸQÝÔ¡©R©Ô4ùµðÝžk·×èVÀÀš><ÝåäX}Àð€üš×ióW®ý›çž|ò„. ”3¯,'©ÆÕž€±ÃÕž€±Còü ù@ò€äÉ’$?H~ü ù@ò ¯Éß3üõäÉ’$?H~ü ù@ò€äÉ’$?Éä ù@ò€äÉ’$?H~ü ù@ò€äÉ’$?H~’É@ò€äÉ’$?H~ü ù@ò€äÉ’$?H~’É@ò€äÉ’$?H~ü ù@ò€äÉ’$?H~’É@ò€äÉ’$?H~üئäg´šüμ²L߆:ùÉ“ßôáééÃô`l’ßÔ¡)º 0^ɯT*Ñe€ÑH~\í »äÇÕž’$?H~ŒGò³¢óí‰EnRuæ¶lp+íp;«;(a$_]xïæ š&¿¤÷ùÙ¶]=ØUËLm죄õÙûÆ+ùµ‘3jfV“bLVèd91K®©IVŸx’o^ÍÚÛnÒR‹Œ}1=ß9õ iT!~S`È’_’4P_hTŽ ,'\ˆŒ5 ›7ݶ66/¼öNš$ܰš'›°böB£…´ÚE0RÉ/ùÑ-aͦÕb*$YE‡‡ãN6o7{[VÇÈ`d“_£ÐÆ2h>böíÚÀ®(²[z§“ÕqÂÀ°$?£G÷ùµw¤®?WÖ·è0È+êó)ĶWGÎ0,ɯç÷ùµt }çËé<|4]B·òMßžQÿÓÀ8&¿ê©3iñÁšnÉ—nsÍg£…4]Qd…–žføj”öš$ß°ø¶º:Ùé\ð`0“_jñöÏ××– 7¾Ê»uÀˆ;ù{a.gðÝžIÔ¤IÒ uò3ønÏ$í`4ð«€1M~üª€äÉ€K~I¯ö´K\ñØ´v{íø‰ãƒ6XDnU}òkájÏ©CSìl€ˆäßËà`³Um&¿ Ÿ=âÁ‚Ïüc‡«=c§oxaŒ õ`Aòü’Øúæâ÷Ï|åLÂõ]ýWOÿÖiúú¯p¯0uhJ—û•sø‚—.üžß™¯œùëåµâŦÃlñ®}æ+güC˜üê?(®¾[hZÍ)s< œ¥[Kó'ç«ÿ½~ãúÜós£ý”ÛI~Õ %Ææÿr¹lö©I§¬ó· Zë-Õ|šÉdÇ ¦õó;|’]YŒLè ÿwùÖòü—æmûCÇuE${mþäüõ¿¼>ûülwW>&o†¢ƒsŸÔÝI~¦ˆ2”ˆ‘ôîÉspÊ]wÓ»ÓÅç§/¿r-4Ò6œzñü#‡U€ˆÌiÞó¼+¯_T†ˆ/¢Ì³ÿêÔü—æÃuº2Fä·ëàÜ¥ox1D Q"âºî…—®,¿»|úÔüٯéò*ºyh¦óÈÉd2Î#§þ¡ÌžLµNuŽóÈ æ‡›Ô×l¸^7uC­mñE‹(CtÙ›Ê|í;•!Ú—ìSYwÝ™ÿÒü–Ãi»+ Úáù[þëÇÃc†€6¶­k¿äNuº¬§sÓ³ÏÎh-ŇEk·™žP"bF%¿„Û®Y®/„ËmwŒ<¥¬àšDûaQÄÔeg3Øøâ}"sÇfrŸÏ^ùÖµnå¿VöM‡€¾$¿z†ÙøØÏ9ùÅÙÜç²—ÿìšÖZMl¸†O*nWfªß†„ïªMZzÊ€n%¿¡¼Ï/ùµ3½ dmßàQ3`“ `“_øøï"¬_ʱf-I¶'fàiûÔkýB’oXPŸ,}H~©ÅÛ ¸µô´IDATO<__[*ÜøêöG„ƒí9ù{a.g´ô /õ金0tɯ…«={:5:½É~tÑ`ýªã oÉ_uü ù0bÉ/éÕžv‰ÏäƒnêÐT©TjšüZ¸ÚsíöÝ XÓ‡§»œüÇO§sƒ)ÉIÊv~ÕAD&wOÒ¿€ASZ/%©ÆÕž€±ÃÕž€±Còü ù@ò€äÉ’$?H~ü ù@ò€äÉ’$?Éä ù@ò€äÉ’$?H~ü ù@ò€äÉ’$?Éä ù@ò€äÉ’$?H~ü ù@ò€äÉ’$?Éä ù@ò€äÉ’$?H~ü ù@ò€äÉ’$?Éä ù@ò€äÉ’$?H~ü ù@ò€äÉ’$?Éä ù@ò€äÀð'?£ÕäWZ/Ñw€¡N~Fòä7}xÚ.Ùt`\’ßÔ¡)º 0^ɯTâl'`D’W{Æ.ùqµ'€äÀ¨'¿¤Ÿùq'`(X“VÓäÇÕž€‘…&W{ÆŸùÆW{H~ü ù@ò€äÀh&?˲Z}4~fò&mWkºº.®¨[Í;\cÌb»»ä¦Kë°ç`û“ŸeY¶m÷á(fÛ#õ…jm<^ô@°û¶«oGlŸ¯ä—߷ПgG0(É/þ {õÌdõ°9³išŒ_xÌBjVÝêê’4¯ß’ÈVIžxWBRüZ’<£$ÏBB— %_f'Ï(¼p.xЋ䗺ºê™†ºtcuéëY:¥ ¦ÇnFHhîÛÅó'g ¾Û3ùSSð`H“ŸÁw{&”|¤éé¹Á>¯FL7?óCÛ#åà¯F/ùñ«€±K~üž€äÉ’Ãü’^íi—¸°0è¦M•J¥¦É¯…ûüÖn¯Ñ­€5}xºËÉ/°ðå:0˜òïç›Öá3?ÀØájOÀØ!ùH~ü ù@ò€äÉ’$?H~ü ù@ò€äÉ’€äGòüÕäg$O~Ó‡§óïçé8À°'?#aò›:4E—Æ+ù•J%º 0ÉÏüc—ü¸Ú@ò€äÉ’$?F-ùY–Õê£ñ3“7i»ZÓÕõHKë²,«»ÛÖtiÛÒ'0|Éϲ,Û¶ûp¬´m{¬öGбÛõ¬Ç­·üºó™_dj‰‰2Áüð£5•cj´kC«‹oÞ¨Bu±‘‹jÚ]5Á«Ñ–'ÜÔFÛŸ$PÖoI«C”üŒ–’_N‚ P-‡ç× õ3ÃQ£ÑjRHÌCá…D.-ùêâ›ÇTˆYTÌÀ_Ó¼fóâWš|f|ï5ÝËÉ×cšüªcL™=ªÓÉvv}Q=š.6\¡mHØ„‘À¸$?ÙŽ+#ª1öúh›üÜ`?ur5P?;†(ùµð{~1'$û0þõau-%ª~Žý1;¢oc9À(%¿.ßç׋˜2€)§ë·atwi=í1" €ñJ~ñ± zf²zpŒœÙ4MÆ/3~™áóc‘ˉßSnÆ(éâ=ì]y þ€mH~½>Û3ø:ÿ¾’ä=Ó´fL…jÈèêGø@Üݯ§é¤£í€AI~Òìã÷˜G‡÷­ëÁÜÁ$ÕVVWF‘§¼z*rÕM÷×Vt²»»õGÔtß؆äóÙè£Á8c3ó…™ø «³Ó]áè[WÄŸ–lz.tœÿfÚÞÝÝ Ùœê:O~íÿž_£¿Àq;>êXÝJÉôjÍg~]I!c»ÇÛØÝÝŠ€äo`Û’_øÏ¯æ“ž˜ Õjmïãú'Ÿ<©^XWCä£}{ÑÆüšóW‘˜|fÓµÔô£¶IÖì²ä›1zï{—Èã»”Óž@“_ Ÿù5=ÔÆÌéÊ5õ£ZxNŸÇ¼p‘›oß<~¬ò+nár{ÝÕê̦]¼ÿ›®1æ ö$¿mûU‡‘ù»­^ìpäð9røH/®€À8ïîä§Ät?ù¡Q?VËÓSÓ|Á?»Àà'?ƒßóë< Ð ìn$¿î˜><??àØáMÍãf(ö)» ùm›©CSƒßƒ|‘ÕŠ}ÊîH~Û©T* ~žþíÓ¼ŒFlŸ²»1I~;øÌ0nÉoW{H~ü ù@ò€äÉ’$?ú•üZþnO»ÔüWĦM ûwYF8ùµóÝžk·×b><]?³æW§{ý#ÔÕåǯhH Û²¬Ê‘íÛø„= #’ü _^hôPÓ߬éçárôŽËáQg¶‡‘À0&¿~æW?òYâgåúšõ­"CR£%ÙŒ˜‘&ùvvòŒªjš„ç7ZxÂ^jéYDöpÓ&2Z ùõû÷ü"G¾êœÈ3iM+$ŒD–™d-1#_ÂíìðU˶m·±ðF½Ôê¶%ïäM`Ä“_燿„gØ"«urv®Õ¶ÉëÇ×ìðŒb‡ ©Ðè¡6šÀˆ'¿F§QPÀÑ·ÿkOØ*ùƒìX3ËŒ[òë÷/¹‡OÜõ(¨5Â'ôúßÝm<£äÛÜÒÂëß…ËŒ[òÛ†ox©†$ñ¥þ*Œþ'¼V_¿§CoÓ…weÛÚx „Kcüjò_x ‘È[Ù"OÙE>Z¨­Yf}úŒÙŒF£uòílT3ù»„úm–­WÁ$\x'ÛÖ´CºÒúüRWW=ÓP—n¬.}=›èpV²×n¯Åßç׋oxÙÞ›©“¯›¾éƒlîÛÅó'gÚI~Ó‡§›ÞÉ^à‹Œ¬ð ÿɯå«=§Mµ±²a<¶w®ô!€AÖæg~ÛõÕÛrèlc¥â郟üø=?ÀØ%?~Ï@ò€äÉ’C•ü’Þçg—¸`0¬I«iòKzŸ_{÷¶Ðgñ÷£·–ü¶ëÞvºˆÏüc‡«=$?H~ü ù@ò€äÀÀ%?ƒä`(Œó—,®Ý^;~â8Ó^çD&?ƒä`XŒç÷,æßËÓ9vÉFÖ›ß}³ÑC§~ûýCò0´|º ÎòÝÉú™W_™¥ßj’W{À(cä#ù…·ítBK#ŸÖôÉùH~ÜçŒ|c˜ü¸ÚÀPáã«„#_™‘äŒ|%?>ó0²Ì]¦¹ËŒœÏÈ7æÉ«= ÙÛö„53™ÌÊ×ÎÝÉçÍ]¦ã8áù7ŸŸ«™9æN̹®Ë‹$Iòã3?#Ëù `™ªfDüëßZÐëvÓss!½#3™Ì€Á]ìŠy²$?#=ò9Nò®þ³Ùà°[ùVl;ù1zðǧ¾Í£Ñ$?C¨õ«=ƒðWù Žóêûy瑹¨ÌžLÍCáÿföd6g†êó«3#k6šÙÍëWýÞvx']Q™3ë’üŒzø{ädödn>?wóù9Ñë¶íéó?ZÝ2ö$AÁ¸Ø¸\_h:s(:°v´n«+ªƒå€$?®ö0FÎü—å¶GF ã8ƒ\üöC`’Ñ+æÉN?ü Ÿ–V–e…/o9~kɶí¦Kˆ©`YV}µpýÈ™áÀ”°f:§%¶mÛoo|\Úô¹ÄÏÜöäÇg~FSÍÈוVýáQ°Õ!d¸ú°Ñ6Ýs©I~|à €¡â'úWù ŽsüÖÒñ[K"ré™˲âÚìš:›ÿ ¯]$áÌÈæÑËlô¯ÛÓÂ?ið_i¹*oz±…$?kŸµòµsÎ…‚ãœÿѪýÀ¶öY¶§s™D×\õÃÿ­Ÿ_Yæ»é5ŠžLØI–P³¨mO~|æ`…G¾ê‘7¸ç/fЪ?ÊÇ̯.9æÑ¦‹üQ0IWÄ?ýð9ψä`øx¾×´Î‡Å÷g÷…p}ÛÓÁ=1 Ö/pd:§%õ½1,]Aò0ŽêÑá±¥†tãˆ!ùàPޱCò0„ø1[:§ÉoxŒ]òã>?ÀØ%?>ó0dG.:Î!ùÐròã3?ÀØ%?®ö0T¸ ‘ÎéFòã3?C#ÿ^žN sH~ÆÈÚí5:Î!ù/ÇO§èœn%?®öŒ]òãjOÉ’$?H~ü ù@ò€äÉ’$?H~$J~F🌕»ø®(C´¿9Ùò_¦L™2eÊtا¦¥LC¥®®zAø«ŸŠH£‡˜2eÊ”)Óáþ8>z¥YÂnIEND®B`‚kildclient-2.11.1/doc/C/images/we_logging.png0000644000175000017500000015364711405233117015677 00000000000000‰PNG  IHDRìÙì—tâsRGB®ÎébKGDÿÿÿ ½§“ pHYsÚk¥óÎtIMEÙ 7 äKVtEXtCommentCreated with GIMPW IDATxÚìw|EÇ{¹\ it顊 ½WAŠ ‚Ò¢*J‘.ö†Š]ÄV@@0´¢  êKï¤×júÝÎûGr›ÙÝÙ½½ð|ýDîn§íÌìì3Ï<óŒ4;<ƒRN±³W2@AAÄ¥tˆÓ‡·“øßì’$1†ñÒy&ùØQ¿:2à _ÀáèÖî0$Ì¿FqE0Ñ5IËý¬‹drí®[˜ÕQν2Æ”Ï`¬ÈÖÄ•9åg9íæþ,ñm} ·¥äá>UurõÙ|Á˜j¬0ª7³1åV¹OwgîEù^¹g”ƒ”çØdìºú¬¥wcžßqê'?ïZâö%Ó%!Sü‘‰Ò?þËlŒá˜Ù¯–้ÇγêåÂVÕB](ÀàCïœ<¾Ù%¡pæ½þ×-È™„S H”¦VÉë=ƒDEœðš6žæ¥§£˜$I=Øj¯iÂ+eçL¡Š£É[²X7à êAòB¨W•S’t}"Âf غ¶çïÁ œ»_APF‰oSAžÂ2 „<•ÐÃ$›M,\pyºûƒ( ß?Œòä?Û,„áŸ+£|µ÷£z& Æ UL~„}ÛäwwÚ´µyó3ÀuõʘÒꈞe a´ÏŸY¾îú4js&˹Ÿ&š< ïC–UýG›§6-w|&zÎmÁ<åiVFÁ¸`Egf‚¬'ÔÃ;ƒ¤kÔOuõdq¸œ|'’®áµÍ%c 6;‚ÃJ qYJ’°n>gµ3üDÿš>Ü`kåAÉkù=Þ—Ù=RŽà¨ tšH‘¡¼°¸ÿRäÓ3Ë‚k|x~Ö û¢8Þ@\xf1œQxIð‚ Ôм¬…aÜ‚¾öE¡™¸…_QžLžh%ó“YVMµÂ xaCðT•±láK3)æódü}ÕNù½D¹ï²A¾|ÝȲœÛWsÂë䜲ºÃÉ9—o'­ÐÌÇsÇ…¦œª´¸¾¥Òüz(ƒÌ *%DŽÌÇe“IƦÝG`?w5™Ì%²HÐ΃¶ÝÛÎ] Z÷‚вk5ø^þ–V ¶å“L„"á‹ÝàšVp2Ò Lc§5Õ (*Í ¿ m Ĉ„æIh×L8ÌÂóƒ&? òõ- £’E¦+†aiÂ@ÃÇd’Íf˜¦'ƒ¿w&ËBó^(äµ…Ì䥮VLw¦ÑTš™ËðZw³I­VØáŸCa[ àëž×Ü Ù´•ÙókfB¦ëkܳ"kîWÔW´Ï4ïÚ‰¹á˜âî Mº°k…j£þœ#Xó+sF‚¡'óþ^·: hµÂ¨¡ÐÌM$´«8·³°Î«XZ93øÝè™`š•Oï)ŒY¨]7x?išù±À[óÓ‚Ò®çEX÷¤Mw:8ú߸”„âÅ‹£ö=µŒ´´4œ>u [þý¥Ë–ÅÝwß ¯ä§Ó‰£G")) ÅÃÂP;â]ÚeÊ–E­»ï†Ýn/RraA—½D )ùâÌå ØÀ×–Í`®^½ »ÝŽÀÀ@Ã0W®\Ahh¨W7Y¯^]Óë»wï±ßNûÝè7#èöN<‰Å‹£f­ZÊﯽþ–ÆÅ¡[·ñÞ{ï)8>þ¢££€M›þ‚¯Ãaª´"€×­[°gÏ^SAºNH%œe!Ÿ_žµ0xXZžãµ—&&5:»eÆ\,ߪ4’ÜK“YŒÖüÅPC©Yò7}QjÂß,¡"aÈhé[`²!™”Q öênA´^0kKN× ž4½ÌÄ|H$¸h_42ÿBâÍeDÏ«Vx7Xê5Z’9m¬è¥h¸¿ƒÞd^Clfž`ñ%.²[ç7˜­,‰&&šçŠ™¬,€›)Ï‘ÀMÛ/Uf/&‚’Ä Â"A]U^3«±ûÖ™ñæF‚IžJð×Lþ™`JkŠg¸r!è—B³+¦2|]a]8ÕþnÁn]¥iº ÂÃŒª lÜ …OÁŠ‘·Â·H¸†FàB//Š=£4N'Ž?ŽbAA¸»vm R&36› U«VEjj Ž$ÁP«V-øùùY*CVVŽ?Ž bÅPÛ‹´‹…Qv_‰Á7[•#°Û¬ÏÖîm×÷µo)S¦è®%%%aüøñ8~âÖýñGžnØŠ0}#hÞ¼9–œ<‰­Û¶©ö;vdÿ»k§ªSoݺM‰çëë›;k7̬hÓ½îÍl¶k±ñ”{¹h|# ºêE—3ˆŠÌŒÌ´ƒ¢¶NµB¸(¼ÖF’·k íFá Ch-ã M/tI ÍÓÙ„šlÂô”·h.3h5§.Mþ¥l q ë‚þÁ´×4ZwOÂ;Œ6°qÞ~ŸäŒr&ÐX‹´ÜÐh§=šM”,òFKúF6ÓF“Y hzíÄŒiêF FjªÍäµÕAÝhs§™ .Ô¬ZI‚>®›äiòÖ™MhMìE“Zƒ•$x¬%3®[MX‡—º6¼Ñ ”v¥ÍpS©Yžlgîñnð¼¤) c çÏŸG©R%Qªti8³œHºp^•¯Ífƒ¿¿?ªU¯†bÅŠáäÉ“¨R¥ ìv»©Ü"Ë2Î_¸€Ò¥Ky•vxx8|||nªÌX˜ewä\¶yS —Ë…óçÏ#ËéÔ]ûý?Щsg¬[¿#GŒ¸é÷îÝ{ò%ü·lÞ°mÛVå·Ë—/ãØ±c€Ó§NáBR’Òñ¶oÏØÛ´m+~1X¨E‚îåg¢9òjBÀ½H™ÉÌßÊFÕ=óš%Àpc‘êw÷Æ5Oá‘»ÉM´„.Ò(¹7›i_æÂɈ&<ƒ»W^cæ)Ž7á› …áù z‚t™Vã'Tü¦9­WYVê‚ßxÈo"…F(S B¡È]¿L³ñœi6¬V gœà¢Òúk7hjòWmVÖþ êL‡ñeÒL2dö×=€‹ž)e£¬ö³»Žª ¬/d÷SíŸQx£´™¦,àÍV4Mµ÷æ^Qàû!ß· ©CQ¾¢¾«m/]»h7’jóâïYÓÆªI­&}Õ¦dnr  «ëïšrK¼–ë/²¦_é6'óÏ&¿OÈ ¯3Í'/cˆHè6l !Ý›ð„WÙŒñ†Š~²›SÏ’`£ªÎÁAN_™ ‰Ì™vÉÃûY4Qš¶Ì¯&]µ²nÁF;!¸~ý:‹CXXRSRžž¦cdYFjj*®]½Š’%K D‰¸|ù²Çò¥¤¤ X` ×i_ºté¦Ëœ|Ù<ˆ·ß~ ÇŽW…ùï¿ÿ0iÒ$Ø¿/Oe÷Êø'---Û¦¦D •‰Ì»ï¾‹9sç"88ß}û-î¿ÿþB­˜Ÿþ_MŸŽ³gÏ r•*<ä Ë&2VMcš5oI’°}ûvå·]»w1___deea׎èÔ¹sŽÀž®Më6JøÍ›7ãëo¾ÆýûÁÃ=öÌ0´jÕJé´î²lÙ²ŸLù«Y+W.c×®ÝÂÙñŠ+0Ý}ï•+cÈOzœËLBz–Œ,ît!Ë•ó]2²2\ ™.À)3d:LC¦3û÷ 'ádÈr1¤ç\Ëp²œ‘Î)#à ¸˜XKl°q^¡®Kªk’aº÷£$X&†ðº8UI²Vv wÜDÁ¦ÖTÛ yÊ›KÓüº¾ žëÍØLE¯Õ†êºÄI>Š ÎœïªM¿Èù3÷{‘Ó”e7C®`!!;€;=À&é÷>00U}¨VlêÕ›ò]\|Ù 0;4}HØ4 ä¡Õ”zlKM›æ/Y裊À¢I[S‰¹y3ÍuI—®ÊÔ@r?Wú{ömNДT–Ù›t ëƒåˆ=ªãúP¾óýÌÆ¯Ìêƒë½ÊÄÓ&©ÊÆ ÿÊ/¼9šÞ¦¾'ð‚Tf‡ZáÌ&iÍýÔ¶ô6ɦº¿\¡_»"âÖö«ŸLa¿ã‚H0›ã´iÿQ’fÿ‰ö¹ƒªß©÷p.T¹°jwúþÀ¸²Hš²3~ÜR„lõ8¥_Úro8'\®P®©0ð=Eÿ4ýš~—=^É9÷(çô;YçmMR̵rûvv{ç¬æ09wÓ;×w•ïrŽ ³Üþãn$ämãª,Ë™Œ€€dddx\—eiii Â¥K—át¹`7Ð&g+\ Ô¥½eËLûò Œxvš4nìuÚ7B»Î—}ñâÅXº47nÄ矎ʕ+ãØÑ£9êY\JN†ŸŸ£Gñºì^ ìîRåJ•åtbAl,>üè#œ?mÛ¶ÅG~ˆJ•*jŬ[·/¿üš5mŠfÏþŽ?ŽÊ•+cçŽl3˜.]ºbÅŠŸ±s×NtêÜÇŽCRRªU«†òåË+ÂúðáÃШQc¬\õ l6&>7Æ=ƒéÓ¿B«V­Tù-ˆEÿ~ýñÂó/ÀÆyÏàºuë×㥗^D³fÍðÃìÙ$ Ÿ›àÑtƆ ?ŸœÁÂWYšáµÜnÍ$I°i~³qׄÜÀë …ê։ߌ„B>€Bk¢ñXPTÚÆ –£…‡iMnŒìœE¦9žVƒŒ–ÛM›šy*»Wû¹sç²ÕúG¢S§NHHH@Ù2e0uêTD÷îíµÀ&Âhó©[Èž1ã{ÀØqãQªT)À¸ñп¿o„–-Z >þ¶mÝš-°ïÌØcbb°bÅÏØ•ó}‡[»Þ¦ÒÉ¿úú+ȲŒqãÆ¡tN9ÇŽýû᫯õ{ËV­nh›.If|ÿ]v:csÓ?á9ôëûˆé  xŸ$8Nå_áàÈ? ùtùhäFÒò й}4h5›NEžjLd¸Ššd–‡P`ðö %͋ɣkPÁ£p³¬ÁR¤·t¢ ƒ"W|áG·1VSŸF¾éA^‚•m»©ê^3á5\’øD‡a¿´`ßêÍuQ>fKìÞ ]F®P½-§áuÁ`faÌ€™0ga,âÝ/òíkæÓHã#Ï@fgˆö Ì ùûm¨·b›n¸AÞƒ O½…ñÞHPg&¶çFvê†.Gákf¶ã¢<̼–©ÚÍ“²C3V‹ìÀ½}OºßϺþ&HSûN·ò/4›ŽM½ûô€1T«Ž—^y wÝuWžÊî• ûñ{œ™3g"!!¾v;V­Z…>ÑÑ"¬»sÑŸ›ƒjÕª©üÆ.Hš7o Û>=ËéÄÞ½{P¦LDDD bÅJØಲ2;÷Ö­Û(õp`ÿ~ÀÝwçnX½;§œû÷íÓåU­Z5±ûÞÝi2ÆP«f v£M)¢k²2øh_¼Lc+ïi Tl5šf2èª}ÁÛkçüÿFÛ°s¶³¢AÙ&¨ om¶uö–ðÜ–JºÛÂ]my¨¦·Ë7.çFÊmÏl-½dZz{ñ\í¾Ê–Z[vMºžž›$éVé½é£Öê͸-%áÒz‚¡ »IÿôËA9÷kSÛ.ÃhŠæé•4‚©pl óæíÇ•{s{®‚f„R L±é—4eÕÆQ÷%n_ˆ¤ùMc›.ARlݵõÁ4õ¡Ø`3fØÖÂñF%‰úc{Oƒî™U¿ˆTvùî6ÖíAáVÄ$ TˆÜgJ¹Ï'oçÍ•Mû 00±Íºæ»ÛþžßB*ñÏ {o WÇPyɶ-ÕŸvÏÛ†n›v Ç¦ÝÆMäœ:áï‹éV$mšý¹÷”½/€¹ßKÊ¢¯[KŸÛ÷%ÎS›‘BO»2YºtiŒ?ß3×®]Åü¹sà#•+W¡ÃPªd)ÕüÒf³Y^õÜò´ø¼¶mù<ø¥´o„À®ä^8Ëã– 488{Ÿ‚̰,n1J•.ƒR¥K[®—< ìûöíCëÖ­ñâ /V®Z…iÓ§£Bl8žˆg»=ŒºUªbóÁýxkÁˆnÕ¶ÀöÚµkc×®]ˆO@dd¶ÿñøø„Bi„€€Ô«WÛ¶mÅo«W+‚:Ô¯W«V­Ä¯k~ÃÉ“'Ю]{øú:”¸÷DD`玈O@DD$IÂÁCñ€ˆÈH¡†ÑÓ,üžÚµ±s×.$$Fdd$$I¡œ4UK®šåI‘ »”ãÔ=`òZC›UÛõ¢hî±Í¾‹df¶³7Å^ÚÄOù-‰Öˈ‰Y†¤•lµ¶úÏFР¢C{`Ál&?§B?ÈÛ¨àŸUÁôyN_Ð>,cƒ{)´.ñ¬<çí¬iíÞƒ²‰”²¢ÌÉ“¹‹Á}hÇ:O§ 5ð07a±GdÓ. VÖÌlÔ…J2AÓšDYÖ¢ êOgR#Ùrö9Ø 5ÞF6ìÙeSöªæ\׺68ÅÙį¼»m]r¶7(·ÜPªti 6?ÌøάL8<:d(ŠÏuNâr¹À˜ìñ  >íÖmïE±bhШ)ŠÏÍkøHìÚ¾ 7õ*í†/û¥ä‹XøÓ\Ø}$TªX]|«V,CÊõkXøÓ\ô‹yÅ‹—ðºì^ÝáÎ]»0pÀåû‡|€‡À‚ÿCt›v¨S9Ð.²^NÃÊ^)ƒ ÆØ±c0å“ñþ¦|ò±¥¸Å‹—À¥KÉ8räªU«f)NóæÍ±mÛV,Z¼([P¯›-°×ÍÜ—,^ hÓ¶*Þ3O?ƒáÇá“O>Æûï›Í†Ï>›Í†§‡>-MÌO$I ÁC0fÌh%MI’T÷ndÿ+ ÜÚ™-}™.±¦/olÞEvÊ’Ñ ÉhpÕx`ð8 ìÖÍì-=Å‘Œ6» N4 ÏMzxso„*Ô¡ÑËXg›h$›¬øH0>8ÈÈ&Ud³ªÔ“Ífl†eáˆmOý}\Õ&ídåž û½Á²¶WZœ|L|óßèñ4ˆQ;êê6…Šˆ7šù”†Ù™œm±hO‹Ñ=IÌl\³¸kÅ=¯Bºp2êi¬ƒ`#ºI»òÏ™ÎäÐlI·A]˜Ž‘@G];Iõä©ÅÈ^]äs]æL%®ß(g(NtÌWõ™fäã㤦¥!¨X±\ÙªDIôé7[ÿÙ„f-Ûª„u¸vý:¿ì3j ЦV¼8Úw¼_(Çñ¿[I»°Ñ–ýÐþ½pØí(^¡º=Ü¡¡aðè ¬\¶©))8´/Z´¾×ë²[^C8zì.\¸ h˜ \¹rˆñ l>>Øô˯ÈÌÌT®µ‹¬‡úáÕ½¾ñzõê ÿÜtìØo½õ6NŸ9‹û;wÂàÁƒÐãáž–Ò1rBCCѳçÃOVuÓ²E¶?ö””øÚíˆÈÑêß]»6‡âê²mkµÀÞªU+L›6N— <Ð]ºÜôÌLLûrZµj¥ùƒ– ^¬:tÀÛo½Ó§Ïàþû;cРÇñѽ |¬[ñ×êñ ÎÏ:LŽq¶²™N›®¢¡”Çì„R÷`ÅŒ ͡×ôhm¬ _¾q }oý³»µBŸñ–mÞM|°ëڙǽœ<úh¶hw®³!‡Þ~WÖž2É÷·?jO|YkÓ+:À†ûÚ£å5ykíìE>ÚùrˆüC‹ì̵¶ã¼¸Î7ºÆ\Õ9g7®ý…Ío|aY¸ûUùn×Þ§¦˜hRÀûbì9ÐîGáÓí»Ðú‹çÿå>®ÊÖ›+‡ªÝØmZ¡õ®òýÏ ¤6ɦóçÏ$í;“ ë\Q½gµöæ{{aKjí»ö™qß cPi÷%hVû4>ÔÕ6ìLu¶‡¤ïrÍ_l‚þ¡^ÁæmØ%ÓñF«U×iym6\¾rçÏE¹råLµÃ8~ì*V®‚%JÀå4—3 3í¦0ËþÏ;æ­ÝmÝ$fÓ¦M(]º´JX€¿l»íæ-[bÍ’¥xôÑGñýŒ &áÛ£b”‰šç^t’pn´”%Jß&19lÙªÍWlØ%‹¾×%›Me¿^lØ™àx÷ÎÀ£]o¡å/X¾¼Go޽º™ý£‡¶iî$‹u,ݨ{ÎÃý Ó0šaykƒ\ù•ÅCY ò¹5Úï¡m_m0ó(Ñ ¢qÔÈ©iß4q¯hÔ¯-™Ãp¶ô2vZØÇbfÚ§m{]8ÑÞÍ~fPf+îs™°0þu×£À¦]òô]ÿr— IDAT|y0™Æ3ðªäÉE£™W—\¶Í8ŒfÕ@ºM~üP&&¯nÏ=ÅÃÂàr¹p8>¡a¡(S¶¬Ê;33gNŸÆÅ‹Q;"¥J–Ô¹’Q˜i67¢ì–vY–ñçŸ*nyW«‰}Ç¡ß㡌 æÍ›‡˜˜,\°v__øÜÄ»E_™.™¸ªÓÀ\ƪ©‹{[â\õ‰4ú†//omÞ!¶u7-_“$¡  »ÖæÝô% ±‹ÌmØE¾ÌEEu§äE+žú’¨¼Vã n^Ä7럒É$Õ,žV¸0;‡‰ÚúÂ6ò1,ŒcÖÆ"ÄÀVßPP5:ÀÅÂ8QPvðVò5+³©ÀeÒ¶Fþµ==Ÿ¢¼$“Ĭô3EŠÑF"ßëV&¥–'e^´¯ð01/|ƒ{ò©nôY4ε±™ »ÖößÊØ,ê30io3á<_ï$ÍäÆÐ§?<û;g;ue²çvªÙ[!2qq–û0ø6€&¾'³äÈw•-‹b8rä6mØ—,#ËåBff&ì>6Ô¬QM›·@PP2ÒÓ­U…™ö PêvÙíVt8çϟÕ+W3p€.܃Mšâßøømçv¼=é „†„à»ï¾ÃÔùsÐõ¾¨W¥*Iæyè³ÛE5š äZªwõ5í¿º™µQI2MGøË]Ò„Nxg–_:?»|nI]2}õpw'óZ Q~ê{É­ÂÜzU¯Ì %LU_L‡“™¬9ŠœqaèO>¦áöã¥ÖÄ@ ¤¡ÎÚ@3'Á’¯r«~~$«Ö\WO¹vÒúͬÙZ1N ÒÄÕµÓ”Ok»Ê»ˆËùO/¸ ~“eý¤‹{i OÎ1µ¬ê#Pò7~ðõš›Ó]3Z¦Óý¬šu¡¶ÓèCàBQ_oj!–Ï_¹&Çk«´*YæµÞê|ø1×½–æ$RYïÆ‹Fø%M­›N£c« ëNPÇ’7¢†ò¶ôªçŠÖ±¶~8·e²HS-ú¸t LÌÌ5Ä›$ìûfæ6°g~µC²·/…yæaòk(¨»?s;QÅIý3ªL° ö¢¡¯Cè„CõØÆOŒÕZqQÙsïSÜ?Ý+gùèýyzIjn½É ?)•e½€)ËêQ¡qý'ŠŸ­±Ï­[÷x§ÓÀ£þÌd­6ŸiâêëXVòËŽ/ «ŒÏÇÝkæ!&ýÚèpñ³`äa…)Jw¾îU‹=’ø]¬uÕŠ„wïr³®¥÷F“¹Äår!55 HM+p™§0Ó.l £ìv¨Í%ø!o  žÜ›1wj˜; SÍvµ0• ¦®˜ja,û')×[†v ·Ð¦ Ãø¥!î$4%›Ü0šm/ê²2nILõôé—Ûr3àV&Ð A}‚¦à0lO<ðˆ6üè\æ©ïØ=ò*&&RÎÊž¤øc@®_W®Ýôí)1@v¿£e–c£n;‰qfLÝž|[›‡q÷/¨ê\m9Ão.L›Ž~$Õ×7ãû¨A›0®oò²,ÓØLåk¿ „5‚ ˆ›‰jïŒfòæ~ïåšIê£`‘ëIHR Źaø•6^W lùw“’·¨\ÿ=ŠBzqOd<Õ»vï1#*ö·CññèÛ/u¢nýÆxìñ'pòÔ)ê|AA;A˜³iÓf<;zü§Ó‰ÄÄ#ùìlÚ´Y ³üç•xsÒ;¸téŽ?gGÓ¥c%ŒÃFŒÂáÉÈÊÊÂî={ñÒK¯æ+Ý>ѽŸNý­ÛvÀ;“ßÇ©S§-•e츉ø÷ß-HOOGVVöíۉϿ”ïz3ö9lÛ¾™™™HKKÇæ¿ÿÁ˜±t®AAÀN˜öÕ7`Œá‘>ÑØ¾õô‰îƾœö•fæÌú÷Åž][Ѧu+]:VÂÑ»wvïÜ‚?zTö¼¤ûÜ„±öÌPøûû#%%3gÍF‡N]ñÚë“––*ÓÞTgé’8¿ ‡öbYÜBÀ±cÇMãXáøñ€Ÿ—/Qâ.Z0: AAÀNæìÙ³ðÂóŒžÏÖúîÙ›+ŒÆ'<õä`èÐ'téX cÄø±£ˆºÞÈÌÌÌWº>>>?n46møÆEHH0\.æÍÅo¾í1þ®]»ñÞûaâó/œN§Wu*˲î·»uôŒêƒÞÑý0õ³/påÊUê€A¡ØËý#°ÙÔóY–ãU’ô¨ûßÿC!Õ,Œ%K–8ŽM7,, Ï<ý$þX»#G<XýëÓ83fþ€Þ}úC’$|ôá»^ÕeVVàҥ˺kï¼ý&F=; ÔÇé3gðùÓñÌðg©Aw$¼Lδ;Ajî©}7àý>ÂÕ«×ðþûêÕ««„©^­*àû³––†é_}£KÇJ#$~vPé¶jsjÔŠÄì9?"%%¨V­ 0P/ð_¾|YÑv:5Ûíctï(?q’X˜aÀÚµ --Må:Ò¯¯/F=;?ÍŸƒŸæÍìØ±“: AAÀN¹Kø?7O>1»`5i…‹–Àf³aäˆaJ˜~ýÌ›‹ºõ›à_[C+aòB^Òí×70é­É¨ß°"ë6¸ñ@u_aaa€&ÍZãù³Í_J/èÚí!Œ9AAA€¤¤‹†q"#î<;zêÖo‚Ø‹teêÕ»¯R÷;?¨ÏMŠ‚ ‚v‚ „têÔS?ýwת___Ô¨QÓ¿ü -[4WÂÄ ìqcG!445kÖÀgŸ~ ÛVÜ›0y!/éŽ1 ÏOš5kÀáp 6ÀWÓ>ÇÀý”pÆAÉ’%àp8pýúuÀ‡LFµªUáëë‹6mZaÎì lÂÅyû­7P¯nøúú¢jx8¦|ü®LŸ6íîm‹€øùù¡u«–øøã÷©ADRô{kXÿŽõЬl†òcFú5K‘7¬_‹!CGÓ‘æD¡˜°ÕkF 1a‘,c µ#êÃåraþ¼ÙhP¿~ým ÆŒ}eJ—Ææ¿Ö[ SXyAqëáç¬|þß9æÿ¾öÂÈhýúõhß¾}þf¶»¾¾¾ˆETT”*lAM 2-â6ŸíJZ¶lŽM›6£ÿ€ÇT×:uê`9LaåMAÄíA¡˜ÄÜwß}X¿~}¾ÓaŒéþbccƒ¸¸8U8‚¸|ôÁ{x°Û ƒJ•*‰~}ûàù‰ã½ SXyAqëc/¬„ûô郅 æ[Ó®%** sçÎEß¾}U>© âfPªTILýô£|‡)¬¼ ‚ ‚¸õ)´M§ .DŸ>} DÓ.ÚÝ~µùL\\$IBHHºt邽{÷ªÂ~÷Ýw([¶,BCC1xð`$'' óIHH@=‡ÃˆˆÄÅÅaß¾}¨[WïÅ"-- +VÄ¥K—¨gAAE[`oß¾}¡ íFôíÛ±±±`ŒáôéÓèÙ³'úõë§ óÅ_`óæÍ8yò$BBBðÌ3Ϧխ[7œ9sIIIˆ‰‰ÁÓO?ÈÈH”,Y¿þú«*ü?þˆN:¡xŽû;‚ ‚ ‚(²»[h1bî»ï>¤¦¦Þ EJJ ((Æ SiØ`Ê”)¨^½:‚ƒƒ1nÜ8lܸQ˜ÖöíÛ1lØ0 $$ãÇÇ… #FŒÀǬ ÿùçŸ ÿAA‘iþ †õë×ãË/¿ÄºuëxCnhæÌ™xôÑGѽ{wÄÅÅaÙ²eº0-Z´P>W¨PIII†émÞ¼¯½öú÷ï:uê(¿GEEaß¾}ؽ{7`Æ º´ ‚ ‚ Â;ô2y¡iØ×¯__hOÍèÞ½;vìØ‡z+W®Äˆ#0wî\Uþ`³£ß¿ýö[ 2•*UÂÈ‘#U&0v»C‡Å'Ÿ|€´ëAADápËy‰²7–úúú^oР4h€¡C‡bûöíhܸ1bbb”ë»wïF“&MÉÉɆ6ç&LÀáÇQºtiÀ¾}ûTׇŠš5kbâĉøý÷ßñý÷ßS"‚ ‚ ”BõSXÂzLL bcc…×ëÕ«‡éÓ§ãÚµìÓZ;¦îÇŒƒÓ§O#553fÌ@Ë–-…i………aõêÕHOOÇöíÛ1pà@ÕõråÊáÁDŸ>}êQAADÑØ×­[W º$Iº¿¾}ûbîܹª“NyæÏŸØØX”-[V ¯î{õê…ÈÈH„‡‡ãĉ˜5k–0­3f`Ò¤IFLL ž{î9]˜#F`ÿþýdCAA …bSº7§—òa###=º‘7nÆç1­Ž;"!!Au]«e¯\¹2*W®ŒFQo"‚ ‚ UAÞIOOÇ´iÓðè£ReÜaÔ¨yÛæ_ÐióédÚžÒÊo^7» ‚ ª ï”,YÍš5êU«¨2ˆÊáø}”6AAÀ~{â©'Ü4AADaA&1QȲŒ÷?ø›¶DzÑ·_ ¨ÂLùôs4lÜM›·Á÷3féL0Ì®k?/[ö3îëØµj×EíˆúømÍZ¯òâá¯ý¶f-jGÔGZ‘¨ß° y ññ †q¯\¹Š_zš´@ó–mñ㼟òœöÑ£Ç0ôéáhظjGÔG—zèîkIÜ2téÚš´Àè1pùòeò}öù—hÚ¼ 6nIoM†Ëå²\n‚ ‚ n3fΚ §Ó‰ ë×bË¿¡sçŽøðã)Êõ…‹–6oZ‡¥K`Å µY•§ëZ–ÿ¼s~øñ÷೩cÔèñyN‹gÔèñølêÇ8¿ÿµ;uÄè± ÿúú›èÔ±þÙ¼q‹`QNÞyI{Ô˜ñh×î^üý×zlýß_èùp¼òꛪ4~˜=ßÿ5þþëO´iÝ3fÎæ5o~,ÂÃÃñׯ?ðÏæ?a·Û1mú7y*7AAÜŒû#",Z‡ÁƒC±bÅàÞ½zb×®ÝÊõŸbbàÀ~@… åñê+/©â{º®åµW_BÅŠ÷wî§Ó™ç´x‚ƒƒ‘–š ÄÀýðËÊe†á·lÙŠvíÚÂáp |ùrxùåòœöò¥‹0p@?øûû#((O „äädU¯¿ú2*V¨???tëÖëÖ­æõSìBtêxüüüðÄDZ$nižÊMA…‰H&§M§Q;veË–Q¾‡„„ 9ù’ò=>>%K”P¾GFÞ£Šï麖J•*^ó6-ž÷ß{CŸŽ+AŸ>½`“lèÔ©ƒaøääK°Ûs‡•Ȉˆ|¥½}ûNlظGÇž½{uiÔ©“›~@@ü'Ì+1ñê5hªúÍÇÇ'Oå&‚ ˆ ìqƒàm¦ùÏžÂZÁf³XZ<îk‡Ÿ—-Æ®Ý{°nýlذ )))xøá¦ù¹…a»Ý'ÏiÇ.X„￟…'ž„¶mÛ LéÒ¸¯cU’$YºY–q`ßNÝ©Çy)7AAÀN·ááUpîÜy”/_põêUÕõZµjâÒ¥Ë(Uª$àà¡x¯®{C~ÓºçžÚ¸çžÚè×·öíÛ‡£ú ìÁÁÁ¸xñ"Ê”É^]8ä!/³´ß}ïCü±ö”ÈYHH8¬‹øp"î¹§6àÚµë¸ë®²Â|ªT©Œ‹“ ¯{[n‚ ‚¸‘ЦS‚(z÷ꉙ³f#%%iiéX· Å‹W®èÿæÿ´iii8wî&O~_ßÓuoÈOZvÂó~R\˜ž:}Ze:¢¥aƒú˜=gRSSqþüy¼c’—§´CB‚±aÃ&ddd`ß¾ý7~¢.Io¿‹ó. --Ë^¶mÛóêÝ K—-Gjj*ÒÒÒðÕ×ßâ±ÇŸÈS¹ ‚ ‚v‚¸E¨Q+Røƒ=´m×­Û¶Çöí;ðÃÌo•¸ô‰†ÓéDÛ{;"ªw?tïÞMe®áéº7ä'­O§|ˆ•«V£yË{Q£V¤âÙňÞ/^D›{; [÷(tëÖ5Ïi¿÷îÛøüËé¨× )ÆMxO>9D—F÷n]ÑíÁžhÖ¢ 6ýµcFæ5xÐc¸~ý:îmßMšµÆÿ¶lÅG½çU¹éäS‚ âf!E¿·†õïPMËf(?ff\·yÃúµ2ttFDnö£zÍ$&ì¿íïõÊ•«x¨goü¹nMž®d^AAÜ<~AÊç-çý0ÿ÷=¤a'ˆ›A“f­±lù ddd )é"¾úú[<е‹åë™AAEN`gÜA…É”?ÀwßÍ@ý†ÍЭ{OdeeaÜØQ–¯d^AA%ô2y‘õ#IÒ 3µY¼x1z÷îMýƒ¸a´mÛmÛ¶Îóõ‚Ì‹ ‚ ˆ¢ ™ÄˆŽŽ¦J ‚ ‚ H`'‚ ‚ â6Ø%IÂܹsQ½zuøøøÀáp ..Nuý»ï¾CÙ²eŠÁƒ#99Yu]”¦ö_«§&AA ìæÍ›‡µk×Âår!66}ûöU]ÿâ‹/°yófœª›<Ô AAÜ»Ífn½ããã£zšát:©å‰|q'œ¾Ê³aýZª›|Ö AAäY¾]nd÷îÝÊçääd/^Ü0ì‘#G¨å ‚ ‚ Øo$cÆŒÁéÓ§‘ššŠ3f eË–Ê5___ÄÅÅ1†øøxŒ1B·X±bˆÇÙ³g©GAA$°½zõBdd$ÂÃÃqâÄ Ìš5K¹æö*c·ÛÑ£GŒ9R÷¹çžCãÆ=ÚÉAAĦÈÚ°ó.E7ãÆ¦…ÌÌLÃø¯¿þ:^ýuê AADÑØrANAA7‘Ln£j!ˆ‚çܹ󸘜L‡qA‘on „"¢¨ŸxgϞᄤ¦¦P…Aqg ìQÔÈÊÌDzõVûÆãø‰“eWžÓÛ¸ñ/ô탈: Ñ Qs > ‡'ªÂ¬þuM¾Ë]ixâò•|?ó$]¼âñßÌÌ,逿ÿÙŠ“§Î(áÖ¬]‡bA!Ô) ‚ Ø ‚õ^× IDATÈ9iW’ »d\»~Œ¹Ð°Q#4hЧÏ]ÀÇŽábr2œNk‚û§S¿À‡LFÍš5`·Ûà¦MãÃ÷'ã7ß¹¥êÆår¡çCQXº,tí†9?þ€èŽyóçâÁ»cþO?âÁ»cé²8 4iii¦émÙº?ÜU«VGòÅó8y<ËB‡í°qÓß(¬„½«\EêœAÄ­.°3î ˆüÃÀCfVRR¯#°Xš5kŠÒeîBò•«8vâ8®\½êù!µÙ°jÕjÝïááUðׯ?5jE*ÿº?=z CŸކ[ vD}ty ~[³V‰_£V$~Š]ˆš#ú‘Â4 »ÝK—-A¯¨ÞX´d‰î‡ÅK¢Ot_,^²ѽÁ’¸ÅˆêÙ ?Ìž‰bÅŠyœ?qçÏBffc`L†¿Ÿ/‹é‡R¥Ëáëog&Nœ¨|fŒáŸ·bÖìyø~æ\,[¾ —/_QÒýúÛY8x(³çþ„™?ÌÃú?7!=#ƒº4AqCä­L^ ~Ø»›ê–(p¦Žíu‹–<[Ã.I6Øl>°IÀ²²²ÀP±B”.]IIpòÔ \L¾ˆJ+Âáën ~bÈ ¼øòkøbÚWhÕ²4¨&M£zµªJ˜ÃñûP£V$ÇïS~5f<ú>Ϧ~§Ó‰9sçá•WßÄý;)aöìÙ‹Í›ÖáÂ…$T©RY—FA“••‰¨‡{aÉÒÅa}¡"¬G÷îƒeË—âñÇãÚõk(h˜^ýzu°dÉ„„„ |¹²(S¦4,Ї…"++Çþ‹ÇÓO Â×ßÎÂ| Ä‹[²Œ1<;rBÊãï¿ÿÁî=Щc;dff æñ ÿ!f`T¨Xk֬Ŗ-;Ñ®]+È.=œAÄ …Lb¢ Åu)[ƒ+Ù$øøøÀæcƒÍfË6•a N—~~T ¯Š&›áò•ëHüï¿ìëžú–Å-Ĥ7_Cùòå±xIºtíŽ^½ûâÌ™³†åX¾tèá‰!ƒœœ¬ 3ô©'ˆ*U*ߺq8ü·t zõìm(¬Ç-]ŒžGaÖ3lnwÞ ~ züQDGG£b¥Ê8òß1,X‡¥ËWáúu½wžÄ„ýHL؃‡кukøùùáôÉ£(S* ÇOœ@‰Re”°=ôªT©Š¤ógPµJ?~¥Ë”£NAÜpìTQH³aÉ»=[á 6[¶àîãc‡ÍW¯^Åî=»àcªT®bêž422ÐîÞ¶xvä0ìÚµ?¯X…W_{ß};Ý0Þöí;±aãF=z{öîÕ]¯X±Â ­“ŒŒ DEõÆÒ¥q:3·°Þ»W,[¶ƒŒ+W.#((È4M?‡üü¨[ç4iÜÉ—.aÿþƒØ²m':wl§SïiæêÕk(W¾Î9 Y–áëkGZZüý”0•+WÆ…s§‘••‰ÀÀ¤¦¦" :6Aqãe ª‚(h$H9»ì6;ì>¾pø:àðõõk×°wß^ìØ¹ ¥J”@ƒzõàççÕyõë×ó#‡ãŸÿg&vÁ"¼ðâ+(W®}tfÍøVÆÇÇç†ÖŒ€?/YŒ¨¨^X·HÒya=néôì…~˜‰âÅKXœ¤#5å:.%_€Äœ¨Q GŽügª÷õuÀår*ßeY†O®Ãf³!==@öŠ `³ùP÷&‚ H`'ˆ[^\ϱl‘l6Øí¾ðu8àïï¬,:ˆ„Ãñ€ìDíš5Q¦t)‚zËÖí˜xD÷»Ãá@É’Æí»ï}ˆŸæÏFßG¢Ñ¸QC¤§§ßôºIMIEï^½±tY¢{ñBz®°Þ+ª7–/_†ÇŒ¤ä‹¦éÍù1VµYÔMVVü(Þ´‚«Ü†ßÌÌL]˜3gΨ®ûùùQç&‚ H`'ˆÛDdW4ì~°I>HL<ŒÝ»w"+3Ë•G¥Ša·Û-iÕz #žƒ?Öý‰k×®ÁåráèÑcxýIxêÉ!J¸€€üwô(.\H„„cÆMÈÈÈÀ¾}û1nüDyiÓ(hŠÃ’%‹Õ³~ùeúõ€U¿¬DßGúcåÊx¤O_¬ZµRѰ—*QÊ4½ºu"°~Ã_8}ú,233ÁÕ+W±qÓfÔ¯WWÑ Ûív\¸p©©Ùn"ï®Uþù'd™Áét!>!þþþª´—/_Ž,§ N§ Æ]w•,ËÔ½ ‚ ˆÙ°Da‰í’„sç/àÀþ}ð÷w bùr(I’¼2úÔ(Q¢¾œöNDVVªU Çã?Š>ѹžtžzrîÙ²,cïîmxïÝ·ñêkoâù_Axx ö4ÆOxÞ4/mÍõk×Ñ»W4^|é 4/½ül0^xñy z|0^xa"|0&Nœ€Gé‡ Ij¼ñ´Aýº(Yª4vîÞ‹sçÎÃår!,, êÕE«Ö­qùR¶†¾~½:˜:u*dYÆÐ'¡nìܽ³çþÆd”/WýúF«µªS§~œ·P£zU<üÐCЉ AAÜP™"ú½5¬_‡ºhZ&÷€’¬Lk/¥ ë×bÈÐÑxpØ[^°Ó^¹©î"ovþD¶[Çê5#˜°¿H•ËS™|ìvü¾~=î*[))WQ³Z „†fàã ^”p?ëž\>zª‡Ã.$¡LÙ28{ö,îºë.ÓËÝUÎ’†Ðâp8ü I²23pùr2®]½¬„)^¢4Š—„$I8rø d©² ¤¥¦àRr22Ò7“Ρx‰R` ¸~í ’/^€,»¼®‚ ‚°Š¯#×ÁÁÖ ˜ÿûÒ°AÂ:‘gCµ*Uàëp âîš`L¾á‚º§ƒn–€™™™ÐÐ`d¤§¡xX¨ÇÍ„u÷!Hžxú©A€KÉp)ù‚êÚŤs¸˜tÎ0îåK-=AAÜ,H`'ˆF–eT cL¥½‘Ü ß§Ÿ„ê5#,…-j«4AqGì’$aPÏèÒº!¾v>~Ÿÿ¸'Îæn–‹éÑ=Ú7…ËåÂÂß6ã‰^Tšs³ë¼IÌŠi¯àãYË0°û½([2 .™áýïãï‡,çEÜ90ÆT¶ÐDáQX‚¸[+OA$°çƒž›ÃîãƒÁ¯|YfxðÞÆx¼g¼ýUö&±Î­ñS„âŧ¢Uñ=]×Ò®i¼<õGœ»x-ÜçŸèžÏNÎSZAܹ“‚ ‚ð–[Ö­cç–õ±ô‘–ž‰ŒÌ,¬ýg7î/¯\ïÚ¦!VmØŠôÌ,œO¾‚oþªŠï麖¯üŠs³7°ý½óì>¶<§EAA·½À^®t $_¾¦|¿žš†Ð ÜCRª”/ƒË×R”ï‰'Ϊâ{º®ålÒ%ÃkÞ¦EAA·½À.¼›¤|ö±™ßš§ëZ̼|x›AAAXÅž+ÞZ?}>%‚q!9ûXò ÀÕõc§Ï#$(—¯fk¾Ã+”ñêº7dZÄ­Á†õk©¨n‚ ¢ÀÉä·ì¦ÓµÿìBÏÍ1wÅzÈ2CÇõpõz®Ïæ_6nÇm!ní?(è'{wVÅ÷tÝ 2-¢è#IUÕ AAÜ08½è©ØWL{Eø{÷áocéïÿbpTGÌzg`ס£xõóyJ˜_ÿÚ˜í1óQÈr:±à×ͨU¥¼åëÞPiE:Õ’ê† ‚ ¦û\d5ìž|˜3Æ0cÉZÌXb¼ü>÷çõ˜ûóz@P ?zujaù:Ÿ¿¨,Úß<åEAAyá¶Ý-9ÿÃñh߬¾v„…CŸ.­±iûË× 2/‚ ‚ ‚È+öÛõÆ>œ¹ƒ{vÀ˜GBJZ:þܲ3ã~·|½ ó"‚ ‚ Ø5lߟˆíûó|½ ó"‚ ‚ Ø ‚ rS©æÞö¨‚ H`'‚(Z :š*Ù›ýöSEAÀNQ4…ÕÛI’,ÝùØ'‚ ‚¸IÖœ âØ8""‚ ‚ ò‡ª€ ‚ ‚ Š.dCy¤F­H¯ãŽßGGi®]»†Ñc'`ê”LBQ ;AäƘå¿Â˜VZù‰¿ú×5…v_ž¶¬VIKKÀ‚%J`РA8wîÜ-ߟ].† 6aøˆÑp¹\^·IA·wAòÛšµ¨QMš¶Þ[a÷Ý¢¢8¸ÕÆ»‚v‚ ˜‘ÏŽ¹íË:}útÔ¬Y.\À±cÇP©R% 8ð–o»IoMÆßÿü øûŸ1é­É^§Q”W‘FϦ~Œ¿7ÿ Ÿ[ºïÞèú¾UVóSÎ[±ý‰;2‰!‚ð’_~ùï¼óüüüàçç‡'Ÿ|“'O†,˰Ùn]=È›o¼Š7ßxõ¶m7§Ó‰û;ÓÁOAÜz† Š 5jEbÙ²Ÿq_Ç.¨U».jGÔÇokÔ'n~óí÷hsoDÔiˆÂG¦eöÛ•+WñâK¯¢Q“hÞ²-~œ÷“.ügŸ‰¦ÍÛ aã˜ôÖdCS wº5jEªò˜9s6ڶ눚w×Þ‹Õôµ=z CŸކ[ vD}ty ‡*m· DZ‘¨ß° y ññ ¦eµÂÁƒQ­Z5å{©R¥ Ë2dY¦¾«1ñÔÍÚÞ¬ýDȲŒ÷?ø›¶DzÑ·_ XjïÑwkÔŠÄê_× Ë=pOdtéÚ7þ…¸¥ËÐéþnÂ:òÔǽ­o7mÛuÄéÓg”ï‰GþCZ‘زu›òÛéÓg”“m½ÉÇÓ˜bÖNÞ–+¿ýïf]fuàfʧŸ£aãhÚ¼ ¾Ÿ1‹LjH`/xÖ¯__`i-X°’$aÁ‚^Ç]¼xñM¯`mèðÂ*Ë^‰9?|øƒ{ðÙÔ1jôxåÚüŸ T©Rømõ lßú7ºÜߣFËS>¯¾þ&:uì€6o@ÜâX´h‰êú¼ù±Ç_ÿÀ?›ÿ„ÝnÇ´éßÓr/GŽß§Zšþ}Ý:Ì= ‡öêîÅ›ôµŒ3íÚÝ‹¿ÿZ­ÿû =îW^}3÷zŽ Äáø}øû¯õèÜ©#F`ZV+\¸p¡¡¡Êw€ÝN‹–ÞôcOmoÖ~"fΚ §Ó‰ ë×bË¿¡sçŽøðã)–ÚûFõÝY³fcÚS±kÇÿÝ ÃFŒÂ²å+0óûo„uä©{Sß[¶lE»vmáp8P¾|9¼üò ªë?Å.D§Ž÷ÁápÀÏÏO yKâ–z•ÇÛ“Þ@•*•…÷’Ÿô—/]„úÁßßAAAxbÈ $''+׃ƒƒ‘–š ÄÀýðËÊeùn›ÌÌLøúú椶[{±rÃúµÿ £{j{oÛoÑâ8 ôŠ+†€ôîÕ»víÎWÝtß}û­7P½z58Ä €ôôt¼ýÖ¨TI\Gžú¸7õ­Ø·åÆ™™™XµêW|ùÅTüþû:¤¤¤¶n݆&‚±Y>žÆ³vÊo¹òZ7zìòÔWŠ]ˆû! *”Ç«¯¼D/Å;œBSõéÓ .DûöíÿÏÞ}ÇEqôÿœ4…Hl€‚DÀ(MłЀD b¬Jb ˆ-–ècŒ±ìŠFQAE,AÀPlE”’M‚b¡J¹ßþXï฽;Dý¾_/_ÞíìÎÌÎÌßۛݕ:‚‚\½z999000@aa!þóŸÿP¯‘OBÝparss™³ºMUTT,pfØÄظ^Y¡·i_eÂ.Ø“~_š–jêm$&%!/ïîÞ»'¶~Ý/ðùvNŸùîî®ãÈÁÎnx“ÛLIII`¾zmm­ÄmÒšL›áËºŽ—_3ŒcÑ}/iÿ=|øÚÚ˜÷jjj(**nÆãPò±Û­›óZYùí1ܹS'©Ç¸$õågai°#o¹þ=6VVý £Óƒ Äé3¿ÃcœRþLÅÔ)“$.‡í3ET?5µ^Ò¶GKv±Õ¬¬lüGSó]šÑÅOsZH’ÛÏ‰ãØ±cpwwoÒ™öððpŒ=êêêprrBx¸à<8aÓKê–ñÿ_÷º¶¶‹-‚¦¦&TTT0xð`dff l{üøqCQQFFF8wî:CCCÈËËCAAQQQÌ6ÙÙÙprr‚ºº:`ll̤ «Å©Ohh(ôõõ…–M>òƒSÄYÛêê©ó6Ç’—+ø§¶¶™é·™ŸŠs²Òñ S²³–¢þˆ5%ÿˆ£‘X¼äGtìØ“'OÀý{Ò‡Û Å©èã°µµÁÅK‰øïO«}ªÉ}Ó¡C¼yó†y_YY …v¬åfg°þkŽqÌÖ÷²è?qç·ÔØ–Ÿ¨©’lc\’öægØÃOž>ÁË—¯q îcßžlssÅÑcÇñâåKA_¿»TåˆúLµ~Së%m{´ôg[›5uÜ’›@LΫ°ËÚ°aÚ´‡††bÚ´iOOO‰¦ÅÔ}ñàÿˆªª*<|øpvvÆ’%K¶Û¼y3Ž?ŽW¯^ÁËË ...8|ø0bccQSSƒˆˆxxx0ë{xx`Ô¨Qxüø1 0iÒ$|ûí·ÖŸ8õ CBB‚вɧ«[7=TUUIµí£¿ÿx¯ªªŠÂÂBæýƒY麺:(,,j¶}iJþk×mDø‘Cðç s3TTT4XÇȨ'Æ{¸cí/«°g÷vÌ_¸¸Éu611h³¢¢"´mÛ–f3ô½$ý§§§‹§OŸ1ï_½zõÞëßTâŒqi¿H™öéƒÈã'Pð¼ýú½=SlØ0Ìž=666(++“hÛœœÃÚÚ0dÈ"''GêúÃßߪªªPQQ§§'®_¿.°NPPŒŒŒ ¨¨ˆÙ³g£¼¼AAAÌ!\\\¥ÔÔTÌœ9ÊÊÊPSSÃüùóñüùs™ÕgëÖ­èÖ­›Ð²É§ËÝÍçÏ_DEE***p$ü(œF» ]—Ëå".><ÿËËÃÊ•«ÒÍLûàPHÊÊÊðìÙ3ü²f}ƒ²NFÇ ¬¬ åå娴S¦z7Z7eeeü//ÏŸˆ½/’äÏOMM‰‰—QYY‰ôô Ì›¿H ýkG gæ¾þ›Ÿ/ðS½¤u­3bÄ„††¢¬¬ eee E=h`J1ŽEõ=[ÿÕ7ÖÕÁ¡´´åå8 ±ëÓ’cW\lc¼),-͸yÜÝ]f·±.ؾc·ØvÖÇö™ÂÖOÍU¯ÖÔÿlm0á›q8~åååxúô)ÖÔkCB»L]ºt ;vìÀÅ‹¡¢¢"Ѷ!!!ðôôdÞs8L›6Mª‹Où¿tâ›+¨¡¡Ñ ¸þâ‹/˜×uuÖÕÕ™orr2V¬Xo¾ù½zõ’i}øoGHÏ©“‘yÿ† ³‡¹åÄÆÆaû¶ÍB×­»³ÁF½áã3“'MHß°þbðáåè‚Q£¾HŸæ9%%%2Ì–ýáÆÍlÚ´®ÑºÍ˜î…1Îî°±uk_$͟ߺµ«±mÇ.ô6í‹y ~Àôé^é›7âÌÙXô0†&Ì]G¤­k)S¦à?þ@ûöí¡­­ØØXlݺõƒW—¯\CÐÞÌ¿ËW®5kyl}ÏÖÂò“——‡õP[ ²†ÔÔ[8¼Wìú´äØÛoRÀnaŽêêj¸º8× &ßž²”20ç3ET?5W½ZSÿ³µÁ8w7TWWÃzˆ-\ÆŽ‡£ã( Ýɧ‡ã¶.ž7~ø—°h_Ê,¬©ï'·ÄK ðòñk0݃ÃáàâÅ‹MºðÔÀÀ¹¹¹B—ggg3åð—]]]6mÚ0Ëê§+))¡¤¤„9CSSS.—Ûèúâ,Û»w/0þ|£cÇŽÐ××o4Oþ÷²ªÏÇ*7;ú=Œ›4¶9IsOÜåi„ýsî£ù#Àá0ã²¶¶ñç‘——LŸ>%¯_âù³Ç004ÇkµÇ#!³—/_a´óXüq1žã Ï}wS‰Ô¹p¯uÞ%æêÕ«PVVú²W¯^¸ví¬¬¬¤ýõ×_"óíÑ£òóó¡£óöMÅÅÅMÞÏ  ''ZZZ€ôtñ²æ¨i9² ¾ùƒ êÉû"''›¡‘ÄåbÊ”)¨¬(Çóg©aia–ýaùKð•ƒ=^¿.Á¾ý0ò+j˜Oùó¹¹2nÊ-CBBàë+ü6csæÌAHH M›6ˆŠŠÇCVVfÏž-°nÛ¶m‘••…'Ožx{áj`` ^¿~²²2 ŸÒvQh;!„´ŒÃN!äÃùRB!¤õ¢€BÄð±žY÷º º¾‚B(`'„V‹¦ýB¡€BZ©!ÃìhÞ6!„÷JŽš€B!„ Ø !„B!°B!„B;!„B!„vB!„Bì„B!„´bïnëH÷&„B!äý“ÓvB!„BZ1æ ;_'„B!äýâ yMgØ !„BiÅZmÀÎápþq¹\tîÜsæÌAYYY“ò>~üx‹ï !„B!UÀ<ù÷æÍdee¡[·nðõõmR¾nnnÔó„B!„v™VTNmÛ¶Å´iÓpôèQê9B!„B{kÔ¦M(((0ï9öìÙƒÏ>û  ÔÖÖbÑ¢EÐÔÔ„ŠŠ ŒÌÌLfýºÿë^‹Z¿Î† еkW())ÁÆÆYYYLš8Û×‰ŠŠ‚‚‚8ÔÔÔààà€{÷îÑH$„B!vÀ^[[‹üü|¬Zµ Ó¦MHKIIÁ¿ÿþ‹@`` ªªªððáCÀÙÙK–,ðvšMÝÿu¯E­AAAÐÖÖFff&Š‹‹áêêŠqãÆ1élÛóóðð@DDx<òóóáììŒñãÇÓH$„B!BqÜÖÅóÆÿæÿ)y×Tеqâ¥xùø1¯L+VïBM%%%tëÖ &LÀâÅ‹Áår™õ²³³a``À¬Û«W/œ={:::€‚‚|ùå—xüø1³ ÙÖ·´´DRR”••…ÖU’ò´´´ˆI“&Ñèc‘›ýÆÈÍÎ Æ „BÈ'AN^‘yZØáîñ=é´÷‹€žžžÀûœœtêÔ‰y¯¡¡çÏŸ7º=Ûú™™™ë’– '''„‡‡ÃÛÛrrr3f NB!„"÷£Ø .ûnÔÔÔH”'ÿúÕÕÕש±òqëÖ-ܸqgΜAll,^¿~MgÜ !„BˆP僓zôèüü|æ}qqq“Ö744Ä›7odVž©©)|||ðÛo¿!&&“'O¦‘H!„B>€ÝÓÓxýú5ÊÊÊpðàA´oßžIoÛ¶-²²²ðäɱÖ÷ööFLL ÊËËQ^^Ž   ˜ššŠ]¿Þ½{c×®]xýú5àáÇhÓ¦ DB!„òéìþþþàr¹ÐÑÑAçΑœœŒ¸¸8&}áÂ…°°°@÷îÝÅZßÏÏiiiÐÕÕ…††"##)vyüŽ9‚ˆˆhkkƒÃá0w!-ËÀФÑõ×iì=!„BHKhµw‰!¤9ï#*ðÎÉJX§±÷„B!²öÁÝ%†æ&*ø¦ÀœB!­"ˆ§& D8q¦ÀDÇœ†ýˆ¯adbŠQŽÎ8þ"5!„BdŠÎ°“O>(ç'ÉYõ¸øÌ_ðó>++³æø!4$}--¨q !„"ÿ†ðøþBXíý-°9p#2îÝÂîÛ#Ä‘@ IDATPSSƒ}ûPãB!D:Bbr:ÃN>iM™§ž™y0סÀò´´;Ô°„B‘šÃNˆ”jkk…./**¦Æ!„BˆÌÐvB¤dhØ÷î¥cËæMaoGÀ"„BH³ 3ì„HÉkÚT€ßÜ021eî*3Ãg5!„Bd†9ÃN—š"™ÑN_ãÍ›7ØûÛ~<|øíÚµƒ½½-–/[LC!„©ðDì„|JĹشþ:¶që·±.Ô „Bi64%†B!„ Ø !„B!°B!„B;!„B!䓨ÍÌÌpðàA¡i„™™óžÃá´X½øËjÉr !„Bì­ÊíÛ·±yóf”””,/))Á† pûömfG7¥$„B!°·8{{{œ9sF`Ù©S§0bÄê9B!„Bûû6fÌ;vL`Ù±cÇ0zôheüSS¢¢¢   ‡555888àÞ½{ëoذ]»v…’’lll••%¾råJhiiA]]¾¾¾¨®®f­kvv6œœœ ®®#**J Ž¡¡¡Ð×ׇ¼¼<ÒÙÊ­­­Å¢E‹ ©©  <™™™BÛ@Úv!„B!°KdÀ€HIIAii)€·Óa®_¿kkëF·ñðð@DDx<òóóáììŒñãÇ3éAAAÐÖÖFff&Š‹‹áêêŠqãÆ1é»w¡!þùçÐÐP&]ÐÒÒB`` &Mš$4_KKK$%%AYYYhº¹¹9Ñ®];À¿ÿþ‹!C† 77·AYü¯ë«¬¬„’’’ÀºÙÙÙ000h°â”Û«W/œ={:::€‚‚|ùå—xüøq£u‘¤]Z£Üì è÷0Fnv©„BJ¿‡q³Ä¡â<½Y‚s9æõ­¢v¿pÜÖÞ £GÆáÇ1nÜ8=zß|óÈõƒƒƒáää„ððpx{{CNNcÆŒaÒ333 ÖëÒUUU–q¹â5Srr2bcc‘”””éÝ»w—ºÜœœtêÔ‰y¯¡¡çÏŸ‹ÝŽlíB> ‰—¨!„|І ³k°L–'÷ZãßÊ·!@+½Óн½=¦OŸŽ‚‚\¸p¡Ñ[=ÖqttÄ­[·pãÆ œ9s±±±xýú5sf™m>zmm-*++¡   Q=÷îÝ‹€€ÌŸ?èØ±#ôõõÖ‘“““i¹555¦ÕßO¶v!Ÿ/?jB!$÷ñÿò.$&oõgØUTT0pà@,Y²VVV ÎB cjj SSSøøø 55L`jhhˆ7oÞ4àÙ³gèÒ¥‹Dõ\°`rrr ¥¥HO—ìg¶r{ôèüü|fJLqq±Èüþúë/‰Ú…|zx„BȇäSž"ûA<ét̘1Ø¿¿XS8z÷î]»váõë×€‡¢M›6Lº··7bbbP^^ŽòòrÁÔÔ”I÷òòBHHJJJPZZеk×ÂÎÎŽµ\uuuÄÆÆ¢¢¢©©©˜8q¢DûÈV®§§'ñúõk”••áàÁƒhß¾=“Þ¦MDEEÇã!++ ³gÏ–¨]!„BìRstt‡Ãip;GaŽ9‚ˆˆhkkƒÃá0wG©ãç燴´4èêêBCC‘‘‘ˆŒŒdÒýýýñêÕ+èéé¡}ûöHLLDHHk¹û÷ïǪU« ªªŠI“&aáÂ…í#[¹þþþàr¹ÐÑÑAçΑœœŒ¸¸8&½î®3\.NNN˜3gŽDíB!„BZ§·w‰±é3Í×ÌB¯J¬›ó.1„Ð]bdŽYB![\ ëX¡îoå{»K çÝ ˆ[Ū¿pïÃ8ÃN!„BȧŠvB¤``h‚ðˆc¦}hrssñÅ_Ž?Þâe {R¯¬Ô=åWØÓ…¯_¿ŽÁƒ7ئ±úTTT`ܸqزeËGW7Iëâêꊓ'O ÍëäÉ“;v¬ÔûØRm)Œ¨±(ɱÑRÇ!äÓÀ¥& D:Ç"OÀa„444>ø}‰‹‹Ãˆ#nnn-2e†¿ÌæÄ½†‡‡Þ¼y÷`¸ `ãÆbåSXXÌž=...]Ý$­ËŽ;0bÄØÚÚ Ü½ëõë×X¾|9s¬ö±¥ÚRIŽ–:Ž!ŸXÀN+„Hf®ïlØø+Ö®ùù£ؽ¼¼>Ê2«ªª˜ ¶ªêÝõ9QQQøüóÏ1`ÀÖJ:æ¤)ç»ï¾Ã˜1cðäÉܼyS ïœñªwlìܹ;vì`¾L¦§§cÇŽعsg£Ç!„PÀNÈ{ ­­ ‡ö8x(ThzÌÉHLœ0JJJh×®¼½<Î4ÀêŸWB_¿;0iâTTT`õÏ+ѵëÛ§ÞŽ°·Cuu5³~xÄ1ØÙÚ@AAŠŠŠðöšŠQ'¥Þ‡øøxÖ¹äAAA022‚¢¢"fÏžÍTUU1oÞ<3Ï¢Ê †¿¿?TUU¡¢¢OOOæ n]` !2GÒDžS'㛉SàøõHtèСAzjêm$&%!/ïîÞ»× ½[7=æµ²² s§N–—›ûz›öX&///uýãââ°yóf‘ëÔÝÍ¥.PÀ:ÕƒŠFçÎQPP V™999èÄ·ÿxþü9óþÞ½{ílnn.²... .[¶ ÞÞÞhß¾½È srr999,_¾Ó§ODZcÇöÝ»w"##acc}}}ØÛÛ#<<3fÌÀåË—áëëÛâu€ÌÌL(++‹=¤­ ÌŸ?‹/Æüùóe–¯¤cNšr žøÌ6–ê366ÆÌ™3abb‚õë×ÃØØ˜> !°ÒÉËËcÑÂùøeÍlÙ¼I -âh$öí;ooOX[F--ØØ:°Û¢æ½ÖÖÖ"3ý¶@ !­—/_"77–––¬û(Iëoÿ®¸eòãŸrÄÿkƒ¤þý÷_DFF"-- @ã*øBáììŒ .`×®]˜9s& W¯^øçŸP\\Œ={ö`ÕªU///¬X±cǎųgÏ`ddÔ ­„M“eÝZ²€ËåŠõÅQ’|¥s’–ÃãñPSSÔU·’ª­­¥BBH³¢)1„È€¥…9”••pùJ²Àòµë6"üÈ!xŒsƒ…¹***š\–®® ‹dRïóçÏcèС““ýGÁ;w˜×EEEÌí/ÙÊìÑ£òóó™÷ÅÅÅé½zõ8[Ï_›üK—.…’’’Äû³qãF„„„0åÉÉÉÁÊÊ û÷ïÇ“'O0tèP€?~Œ]»vaàÀàp8Ì\fQsšeY7044lp&¼%Úé}ä+m9êêêxúô)óþîÝ»•“‘‘;w"##»wïFF=•™B;!­Ú¢…ó¸y›À255U$&^Fee%ÒÓ30oþ¢&—ãîæŠ“Ñ1(++Cyy9víÅ”©ÞRå%ì^èmÛ¶EVVž|?üð¦M›uuuL˜0ëׯ§†!„òqˆyõöV*$$ß|ó BCCÅ Ø !­á³¦ù¾x:88ÀÁÁ™BÈ'£Uì¸zõ*rrr```€ÂÂBüç?ÿ¡^#„B!ŸŒV}—˜ððpŒ=êêêprrBxx¸@zqq1¼½½¡¡¡mmmìÚµ ÀÛ{>wíÚ•yÅØ±c¼½½ÞèÑ£„ 0ëïÙ³ŽŽŽÐÔÔ„f̘£G¢ªª Û·oÇ·ß~Ë< €nݺ!**Jà‘ÖAAAÐÖÖFff&äååñÛo¿aܸq¸}û6`÷îÝ044Ä?ÿü‡eË–aÍš5X±b…ȺÒèÎ;„BȇãÝm5^ñ-ï‘ÖÍy‹¸œœ|ýõ×xðà€·sb¿øâ œ={€Ž;âÑ£G̃0._¾ kkkðxбcGèëë lÏÿ¤¼úøç£ S[[‹ÊÊÊO`¬ÃVwB!„ÂîS¸Ýr«¼èôêÕ«PVVÇkðOQQ×®]¨««ãéÓ§ÌvwïÞÈgèСPWWǯ¿þŠÚÚZ[Á-X°III˜1c „òòr‰êhhhÈÌgÆÀÀÏž=k4­î„B!„´Ú€=$$¾¾ÂçÙΙ3!!!+++lß¾%%%ÈÏχ¿¿ƒõýýý±jÕ*øúú üd¢®®ŽØØXTTT 55'N”¨ŽÞÞÞˆ‰‰Ayy9ÊËËSSS&ÝËË !!!())Aii)Ö®] ;;;&]œºB!„Òêöªª*œ?“&Mš>yòdÄÅÅ¡ªª ÀÓ§OѵkWôîÝ[胕ƇîÝ»cÊ”)Ë÷ïßU«VAUU“&MÂÂ… %ª§ŸŸÒÒÒ «« DFF"22Rà‹Â«W¯ §§‡öíÛ#11‘ù¢@¬ºB!„Âq[Ïó¨w—N+¸K !t—B!„|jx|—˜¦ýÿ]bä¨Y!„Bi½(`'„B!„vB!„Bì„B!„PÀN‘C„Gk4M\±çâeV§Y³ýŸp^hZ|ÂyÌžãG'câô_\|z÷eߨ©©i°$ãEZ—¯$cÊToæýä)^¸|%™:°™ŽEª3!„vBZ‰c‘'P\\ܤ<æ|?WfõY¹òGnÞ†ÒÒR奥¥ܼ ÿýïÔi2&NÿùúÍÇÖ-¸šüäåålÓOúÛ¶m'üüæ0ïýüæ`ûö]ÔÍt,R !°ÒJÌõƒ m5õé ¥…©S&aSÀfå¿nçÔIè ¥EöTWWc„½Ú´ió^Ê•…²òrX˜›1Ë,-ÌQZZŠYYÔA„Ò";÷î!¤ÅX[BiYþL½Õè:µµµX¿!} Wo xŒŸ„ÜÜ¿¼› a`h"0-bë¶èÛ0Ì,¬°êç5¨©©aÒØ¦OŒs‹œœ\¤¥Ýܾ†ÜÜ¿0Îݵ>åÏVæž½û0xÈp÷2ÃÄÉžø_^“–—÷>ß΂™…z÷ÃH'ÄÅ'ä} 6¶0ìù%z÷H§.üËꦟš Y?xzÍ@VV¶Àú¢Ú·>Qù 뿺©R¦æýá6nBƒuÛ†_bÏÅÃa¤ŒLLáð•#’’® êd4ìFŒj´DíÓ¹sñùÕˆûöÕW#pŽeJ…¨|Åi릎£Ç"Ñ€5LÍûã‡ÅËðâåK™Ö¯þâï¶cEÒc¡þØgDµ‘4Ÿ„fÆ“óêì„÷fÙ’EX¿aS£ƒBuu5/%àæõ+°··ÅÆ€@ï¦Bäd¥3¯ÃŽD@OOW’.àZòàr¹Ø¹k“Ûô ‡ƒÕ?¯ÄÊŸVãõë×X±òg¬úi…Xõ‘Æ‘ð£hß¾=âbO#5å*FØÃ×w“î;w>†‚«W.!åÆ8qÂËÈ#æÔ„܇¬ûw±uK|ýæK]Ÿºé'9Yé¸zåìíláç¿€Igk_IòÖp÷î=$_¾ˆ€ë¬ÓØ6ü8„Û· íÖ ¸¹¹bæl_DÇœFð¾=BÛˆmŸþüó,-Ì”ciaÔÔÛî;[¾lm-‹±†ca¸’tíÚµÃò?ɬ~ü„õ‹¤Ç ÛþÖb탈6’æóƒÒò(`'¤ÐÖÖ†Ã{<*4=òx¦yNAÛ¶m¡¬¬„±®ÎÌÙoaÂ#ŽÁÎÖ PTT„·×Tœˆ:)QtuuðÕWpí ǯGBWWGêú°‰8‰Q# ¢¢%%%L™<§bN¼ ÆOFbâ„ñPRRB»víàí剢¢"lrss¡¤¤$rÔÔÛHLJB^Þ#ܽw¯Az] * ë×ýŸogáô™ßáîî 9Žìì†Kݾlù Ó¥Kç&íC·nzÌkeå·mÛ¹S'©ÇÌ‹/ ®þYƒíÔ?û /ëM1‘$_ö¶núØ05íͼþüsm±ÚÔú±‘üØeßßúcCœñÈÖFÍñùA¡€Ž¼¼<-œ_ÖlÀ–Í›X×5§´¶¶™é·›|bÝiqþX‹ªÛü×êjÑéG#±oßx{{ÂÚz0:hiÁÆÖA`99é0¬_¿á6Cq*ú8ÒîÜÅÅK‰HL¼ŒÒÒRŒã$Uû²å'ªí›Úwü8ŽÔc¦¦¦FhËËË7i,²µ,Ɔ¨¶ljýd1Þ$9„íÛ>ˆÓFÍñùA¡€’¥…9"#O4¸·µžž.ž>}†N:^½z%2]]áóϵ›¥ž’ÖçÑß‹LïÖMUUUk×mÄ…„ß¡©© È1CÂêgdÔFF=1ÞÃééãâÎiÒ´¯¨üZ¶}ÒÔÔ@aQQƒ»BSC£IcQTÛÈblÜ…/{½½ òåË—øì³ÏdV?Y+lû+MKzü4÷ç!Dr4‡VfÑÂyܼM`ÙXWg8„ÒÒR”—WàDT44ø‚$eeeü//ÏŸÜÝ\q2:eee(//Çî ½¼i*¶úp¹\ÄÅ'€ÇãáyyX¹rµÈüÜÝ\qþüETTT ¢¢GÂÂi´+“®¦¦ŠÄÄ˨¬¬DzzæÍ_Ô´3,õûÚчÙ{Ñÿ›Ÿ.—+P_IÚ—-¿úý'i¶aëQûÔ½{7äää6Ø.'÷/èK¯8mÝÔ±±zõZ<{ö åå83³>2«[¿°+’ Ò´1[µôç!„vB>xšššpwü=Ís äååa=Ôƒ¬‡!5õïeÒgL÷ÂgwægîižSPRR‚!ÃìaÙonÜLÁ¦Më˜õ›úTL¶úÔÝä £Þðñ™É“&ˆÌÏsêddÞ€!Ãìan9±±qؾíÝ}à×­]m;v¡·i_Ì[ð¦O÷jRýÙê·9p#ΜEÿC``hÂÜ)„ÿEµo}lùÕï?qH³ [ŸŠÚ§þýúâÆ› ¶»qã&ú÷ï+u¾lm#‹±áà`¯FÆP{<~üÖ­‘YýØú…íX‘ôX¦ÙÚHÒÏBHË㸭‹çyØô‚©ú»‹†8ñî·šx)^>~àѽÛI3ÈÍ΀~cäfgPcò¾ÇÜ¿0ûû¹ˆ=#°|ä×c°{ç6©ïfÓÜ MZä)°„"+<Þ»ëTÒ^¨!üb:a'„ÂN_¿;Ô?û 7o¦0ËnÞL††F« Ö !äcA;!„±øúÎÆö»™÷Ûwì†ïœYÔ0„ÒÌè.1„BÄ2p€°bÞ<ð[«¯3M‡!„| è ;!„B!­s†ÿ²Qµ !„B!-NØ­\è ;!„B!­ì„´2ü÷H矀žÆ}`N”§3 IDATÙw jjj¼bÏÅ‹L¯_ÇÆö­9Û°5ökK÷KK”-Il㦵õÏûhÏæ,¿5¶?!„vB>XüÌÕ=°åjò——oðþ}˜óý\‘éõëH¶Ž~¡ú5­¾-=ŽeÝ^ZûBè.1„|0ª««1ÂÞ®Ñ÷B !„"9:ÃNÈ{ôòå+,Yºæ–Vè?À‡ÃÂÒë~úæÿ¿îÿû:[·í@ßþƒafa…U?¯˜*c`h‚ðˆc05ï·qÄÞ&:úll`ØóKô4ø¡uªOXº¨ŸòEÕ£nj¡ ú˜õƒ§× dee‹lÛQÑpøÊæ–Vð›»/^¼`ÒòòÂçÛY0³°BOã>péÄ엸剪/[¿ÖW[[‹õ`Ñwzõ¶€ÇøIÈÍýK¬~§Ý 8ø¬‡Ú¢Ç½„n/j$·¢ÚWš±[[ÿ±µ—$ýÃ6Ž M{.#`db ‡¯‘”tQ'£a7bT£ý%îþJÓŸÒ´?!äC Øy¼wÿ!-bù‚íp\KNDÔñ£ˆŒó;ÜÝ]!Ç‘ƒÝp‘yöêõ®-•••‘û×ÿÒSSo#1) yyp÷Þ=4¶òØê+i¿>|øÚÚ˜÷jjj(**–i?ˆÚ^œq é¸Õ¾M-_œüEí¯,;èÖMo¬):wê$Óý•dÿ$mBì„555Ìk.Wú»½ÔÖÖ"3ý6Ú´iÓè:õƒq¶‘“kþâØê1Üf(NEGÚ»¸x)‰‰—QZZŠ1cœÍ“ÃiüpG#±oßx{{ÂÚz0:hiÁÆÖAìòÄi·¦öký9ÍMíQ¡8û#Éþ±µoSË'¶ö’Õq×XÛŠÒ´·$ý)iûB(`'„ˆ ªªŠÂÂBtèðöìêƒYR祫«ƒÂÂ"|þ¹v³nÓÄ©‡‘QOõÄxw¤§g`Œ‹»È€=''FF=¯_—ä½vÝF\Høššš€ìì‰Êc«¯¤ýª§§‹§OŸ¡S§Ž€W¯^µºö—dÿÄiߦ”/iþÍyܵԱ*‰¦¶!¤õ¡9센Gf¦}p($ eeexöì~Y³^ê¼ÜÝ\q2:eee(//Çî ½˜2Õ[æÛðSVVÆÿòòðüyA“Ú­_;ºàpX8JKKÿæç LifÕêµxöü9ÊË+sê4¬­3ijjªHL¼ŒÊÊJ¤§g`ÞüEÛ²•ÇV_Iûu¬«3‚Bii)ÊË+p"*R·§¤ý"é8`Û?¶ö­_?IËgË_ÖǬƹ´í-iù’¶?!„vBˆÖÿ‚ÂÂB 2£]0jÔWRç5Ís JJJ0d˜=,û ›)Ø´iÌ·á7cºÆ8»7ùçv¶zl܈3gcÑÀš0wqÅqÔWõµ3úY Æå+ɘë;›I[·v5¶íØ…Þ¦}1oÁ˜>ÝK`[¶òØê+i¿NóœyyyXµÅ ëaHM½…ƒÁ{¥nOIûEÒqÀ¶lí[¿~’–Ï–¿¬;YsiÛ[Òò%mBHëÇq[Ïó°é…>Ÿ½»G±œ\­X'^J€—xt+HÒ r³3 ßùÙÔ„Bù$ÔÖ¾;Ÿ~çåg¿˜NgØ !„BiÍ(`'„B!„vB!„Bì„B!„PÀN!„B¡€B!„B;!ï“¡ÉGYV}±çâ[Eœ= Cœ=û^Û,.>=û §qÄÅ'¤¥¥ÝÇøIbׯ²²ßûÍÃ!tµÐøª¿½,ÇΰáøçŸ,¿qã& Mšz»AZ~þã&Ýg­þïóó„ Ø !­œ¬ô÷Vöœïç¶Š<„9'ÇQ8sê½öOÝÙ¶n €¯ß|´µë6bñ ÄÊçÅ‹˜á3 NŽ£à9u2 ü_Í5>`à+\I¾Ö`yTô)èëwGÔÉèiW®$cà+êXB>¶€Ç÷B>ÅÅÅH½•†ŸV®@jêm¼xñâ½Õ¥ºº#ìí0ÂÞÕÕÕÌò¸ø´×j33SÖ<=ú>ßÍÆ<_Œ°·£þH d…äz{ee%âãÏcËæœ‹KÀ›7oöäk4p5! ž¸œÎ°ÒJÔÖÖbý†Xô€^½-à1~rsÿX'pó6˜YX¡oÿÁØ·ÿ@ƒŸ¥E¥×} 6¶0ìù¥Ðileñ«›Îa`h‚>fýàé5YYÙåš0¯óòÂçÛY0³°BOã>pé$P¾¡ Â#ŽÁÔ¼?ÜÆMš‡¨2ÅuúÌï°³µšš*l‡Ãé3¿KµâöŸ¤jjj¸yÎ÷g]7-í.Z‚MÖÁÔ´³Üz¨-òó3ïsÿú Mp3åOfY~þc &<À¯ßu¶nÛ¾ýÃÌ «~^ƒššmŽ‹DÿÖ05ï/Ë—/›”§8ýÍV§ÆÆ|SÇ—°í 8ø¬‡Ú¢Ç½„c¢êËo€U\»~]à©âçÏ_„¹¹)z~a3³>¸páÒ»?ö<®ß¸­Ä›õG—/_aÉÒå0·´BÿÖ8NØ„´09&–çñý#„´¸à‡P]]ÄK ¸yý ìím±1 I?y|ù"Nž8ŠÓ§Ï lÏ–^_Ì©39¸Y÷ï6˜†!i^uÓ9r²ÒqõÊ%ØÛÙÂÏÿ펺©89YéÌkß¹ó1tè\½r )7®ÀyŒ~\þ“@žwïÞCòå‹ظNx"Ê×ÉèS;Ö0ÖÕ'£OIµâô.—‹¸øÄÅ'€Ë厄ūþÐÕÕ¹mBÂxzù`æLèètH³´0GÊŸ©Ìûðˆ£0êù"ÿ¿àfÊŸèkiÑhþü}aG" §§‡+Ip-ùp¹\ìܵG`›0‹Õ¤ h×®–¯ø©Iy²µ¿8ujlÌ7u| ÛÎ_¼ˆÐCÁÈ~p¯Á1&N}ëhjj¢ƒ–îßÀ7vcàîæ pë‚|Óbî?È‚––ÔÕÕÅ›õûƒßòÿþ;ÛḖœˆ¨ãGÆ!¤‰Éé ;!­Däñ(L󜂶mÛBYY c]‘–v‡/Ð:†‰ÇCYY;wÂò— lÏ–^ߊåKÑ¥Kh0 CÒ¼TUUQ^VPQQÁÄ ãñû™èÆ¿,œŒÄÄ ã¡¤¤„víÚÁÛËEEEëøÌð†ŠŠJ£Áª¤eÖ÷ðá#¼zùŠ TûöµÄ‹/ððá#©Êcë?6u]] XRR‚à‡ðýœ™"/H ÃɘS8y›·áõë× ö?ÿ?`óæ Ξ=‡Û·àüù‹(--¤¤ü K{ý¾8;[(((@QQÞ^Sq"ê¤À6Ë–.†ŽNW´mÛ^Ó¦"…4y²µ¿8u5æe=¾`õª•Ìþ ;ÆØêËoàÀH¾úvZLQQÒ3îc¸Í0Àp›aÈÈÈDqqñÛ/ÚÉW¦Ãˆ36Eo7o¦`èPk((( S§ŽX¶l1}`Ò¸Ô„´>‚¶v潚šŠŠŠ™÷YYÙø¦&óÞÄÄH`{¶ôúºvíÒhš¤y­_÷ |¾…Óg~‡»»+ä8r°³.r›ÔÔÛHLJB^Þ#ܽw¯Az—.e^&¿“Ñ1;Ö™yÏápà6ÖÑ1§àûýl‰Ëcë?6#ìíp?#yð븻…††ÄoÏüò¯÷ðá#lÝ999Ì™ý–,[í[ß=µ°´@Ø‘£€ßcã`eÕ::]1hÐ@œ>ó;<ƹ!åÏTL2©ÑºÕï‹ÜÜ¿ÐÛ´¯À2yyy÷¦¦½™×Ÿ®Ý -$Í“­ýÅ©“¨1/ëñÅVž8õ Ø­pðP(¼½° ¡€R‡Nkcó[ÅM¯ONNNfy ·ŠSÑÇ‘vç..^JDbâe”––bÌ'¡ëGľ}àíí këÁè ¥Õàt¢‚iʬ/:æ4=ú›6 ,×ÕÕ°KSž¤íXçéÓ§ˆÃéSo§Ô]Z÷šß|g;íílqõêu ÇÄ ã†= ðäé¼|ù áÇàï7àîæŠÀ-Ûàà`ÂÂ"èëwo´>õû¢¶¶™é·Ñ¦M±·ijžlí/NDyY/¶6§¾üúõµÄ¼ù‹PUU…“'c°aýtw7W,^ºã=Üq'í.,-Í%ú¼`믚šf.Wž>œ ¡€O“žž.ž>}†N:^½z%nhØÅÅ/оý¼§*Iº$¤ÉËȨ'ŒŒzb¼‡;ÒÓ30ÆÅ½Ñàfíº¸ð;4ÿÿ,~vvŽTõ”¤L~·n݆’’’Ð[]Žüz nßN¸pSœòØúO¿nÅÌ™>PTT”xÛÅ?,ÀÄÉÓ`aaŽž_BNN¦}ú òø Ý‹µNõó`+þ4Æêêj$'_ØюBËqqË—¯4˜zÂV[ÿ5VŸú֭߈…óý¦oÔ¿ •žž.<=§à¿+~°[˜£ºº®.Îõ9TUU‰¼à´±±ZRR‚!ÃìaÙonÜLÁ¦M‚wqp°ÇW£Fc¨=?~Œ ëÖ4)OqÚŸ­N²_¢¶—EÖ7hàTV¾ã×#…¦;9ŽBeå ¬°‹36EÙ°þbðáåè‚Q£¾¢lBZÇm]<ÏÃÆ½ÕÞ=0D^^¼[;&^J€—ŸÀ½a ‘•Üì è÷0Fnv5†/_¾Âhç±øãb¼Té²,‹ˆgë¶BçÇl MÞë“u !äCVSónŠâWꈸ˜NgØ ùPXö„è˜Ó¨¬¬DAA!víÅȯÄN—eYDú/>„Bˆ¤(`'ä°¿ý¶}Ìúa”£3ªªª0ÏßWìtY–E¤SÿBAB!Dt—B>ÖÖƒ`m=HêtY–E¤óÍøqŸÄ~ÒtB‘-:ÃN!„Bì„B!„ Ø !„B¡€BšFÔýÈãâÐÓ¸z÷A\|‚@ZZÚxŒŸ$v~•••øÞo ‘ªž±çâÅ®wK·ÓûR¿MÈûéÿ÷96h B;!äW÷€šº‡ñ[»n#ÿ°@¬|^¼x>³àä8 žS'KU—9ßÏ¥¡6i•Þç…½4iyt—BH«R]]övÌë:qñ h¯Õff¦¬yfýàé5YYÙb—'éqÂ_6[ûIsL‹:êÚÚZ¬ß‹¾Ы·<ÆOBnî_ôOì„|\îÛ„Å«þÐÕÕ¹mBÂxzù`æLèètm~$ü(Ú·o¸ØÓHM¹ ‡öðõ'4¯º)9YéÓÎ_¼ˆÐCÁÈ~p¯Ém+N}D•'Nßܽ{É—/"`ã:±¶U'am"Î>ׯÇx°©›Ê•“•Ž«W.ÁÞÎ~þ Ä.OÒãD’ö“æ˜nŒ°1|ફ«‘x)7¯_½½-6Ò‡;!2Äq[Ïó°1AoµÌByyžX'^J€—x<µ$‘¹Üì è÷0FnvÆG»†&8ÿ»@ j`hÒèüÔ7oÞÀ¸—“n`h‚س1Ì4ËË+ðe \º‡.; Ís´³ÂÃAEEðôéSŒŸ0ÏŸ«ÎÂê j Ф?Î3ÁwÊŸ©ÿÍäF÷1.> 6¶n ÀÀVãâŽÈ£a¸™ò§@ZÝÔCüwÅ2\¿qóü}á?oB퇪ªª@ÞήãvJJJb÷= Mwzzº2i[¶ú°•'Mß°m#NøËgÛgqêð!Âêÿ¬oÿÁøqé3ÆIèölåIzœð—-iû‰Óž¢öµ~úȯÇ`ßÞÝèÔ©# ¸¸£qõÊô‡Œ)ÔÔp˜×w^©#âb:Ía'ä}ëÚµ‹ÈôÔÔÛHLJB^Þ#ܽw¯Az·nzÌkeå·AVçNÿ"”ûz›öX&//ߤ:ˆÚ‡¢¢b&cc‘e°·ÃýŒ4æ}À¯[àî6ÌYLàíMþõ>|„­› ''‡9³¿Ã’e+°}k`½}Ï;X—¦¿$m[qêÓÔñÑ¥Kg‰¶‘´ÄÙgauøQÖ¯û>ßÎÂé3¿ÃÝÝr9ØÙ »ïnCì„f±vÝF\Høššš€ììœ&ç©««ƒÂÂ"|þ¹v‹ÔAUU………èÐáí¸²ÄÞö×À­˜9ÓŠŠŠïçâ`âäi°°0GÏ/ ¼= [UU%u&ë¶mj}¤é¶m$­“¤ûü¡õ=úûïËŒŒzÂȨ'Æ{¸#==c\Ü™€­¼¦'ÍÝžÂö•Ÿžž.ž>}ÆL‰yõêè„È]tJH+¦¦¦ŠÄÄ˨¬¬DzzæÍ_Ôä<Ýÿ¯½ûŽŽ¢zØ8þdwzA¢`"„¡%TAZ(Ò%Š?EAEA¥·—j—"$ ] Ez =)* HɲåýXØô„ ~?çä°»wæÎ;3Ë3³wv:jÙòŠ—ÙlÖç_|¥Þ}ïYªUõÑü‹¯ .hÌØ šïØñ;¡öwŒ Né†ÔÔ¸¹¹iÒ„±zï½á2›ÍŽuÿé§JHHPBB‚-QÛç:¦Z‡‡‡‡N>­‹ÿ¹'}›ÙödǶIožôÚ”´O2»Î¹õ8¸µïÙív:}Z#GŽv*¶M-\¤¸¸8IÒŸçÎ9í£é-/«ÇɽèÏôÖ5é>Щc{Í7_qqq2›´4t¹Š)Â8@`þÆ­™Ÿ|¦*Uké­·‡êÅûÝu/ôí­«W¯ªaãfªY»¾vîÚ­É“Çß³6Lœ0FQQQjа©Z·é Ö­[flÝ'LÒ;ƒßtú¨ÿÖ·_Ü9–=-žžeÕ·oo}8r”$©oŸ^:zì¸6n¦ê5ŸÑÚµë4kæ´TçéÅ~j×¾sšÃî¦o3ÛžìØ6éÍ“^›’öIf×9··ö½§*VQÿþÔ«§óWTN›:I«×¬Ugª¼—w²}4½åeõ8¹ý™Þº¦´Fù6òS}ßÆÚ»wŸ¾™ûoà@6â[bcý¾%àN)}K WØ€ŒÀØØ;;;p?%ýÙn;@`@` 6›M&NQZÏèé*5Ôµ[OEFþæ4ÍÔi3U­F]ÕªÓ@³çÌsR“Þüå½¼µ|ùJ5ñk!¯ •U¡’Ö­ß@Ç@`sçÍ—ÅbQئ Úµc«š5óÓ¤)Såß…,•$mÛ²QË–.ѪUk25¿$­X¹Z ¾™­ˆc5cú 4˜Ž€À #B¾Õ }{+_¾|òðpW§Žíuà@¸£<(ø;õèÑMzôÑR1|X¦æ—¤F SéÒ¥%IÍ›ùËb±ÐñØdÄ™3gU²d Çó‚ êҥˎç'T¬hQÇsoš_’Ê”)MG@`]¬Vkг2¿$ òØd‰§gY?Áñ<66Ö©ÜËëI]¾íx~ìxD¦ævw¡SÇöš;o¾âââd6'hièr)RÄQÞýù.Z´Df³YçÏŸ×Ø±25? °¸ /ôí-£Ñ(ßF~ªïÛX{÷îÓ7s¿r”wé ‹Å"߆~êЩ›Ú´i-WW× ÏŸüò*9KÀøõö®M¼U¥àíÚF{†fÛ´Aýú’Ýn§'‘í"OQ¹'+)òÄ:#11±z®}'ý²q=ÀÂjuq<-¬à‡¹Âä5k××ò«tíÚ5ýóO”>ÿâ+µjÙ‚ŽàG`r‰©S&êë¯çȧZmµnÓ^‰‰‰zëÍt 8]ä¾¾õåë[ŸŽà?†+ì ° ° °vv€À€À€ÀØØ;;;@`@`ììì@g¢ ð_e·ÛµhQ¾û>T‘‘¿I’¼¼žT÷绪SÇöÙ²Œò^Þ’¤“‡ép@`2ãÝ÷†ëû¥Ëœ^;p \„kïÞ}3ú£LÕ·cÇ.MŸù‰};ÎÙ†!1øOZ½æ}¿t™<<Ü5nÌÇÚ¿w‡ìÛ©ñãFËÃÃCÁKBô㺠™ª³G¯¾Ú¹s—Ók'#suØÌZ´½|à IDATD’ôÎÛo©sçNÊŸ?¿òå˧€N4tÈ`IRPðÇôå½¼UÞË[‹ƒ–¨^ýƪY»¾¾]¸Ø©<é´Iß²ví:µhÙF*ù¨E«¶ÉN nÍóÓOÕ²õsªè]U;uÕ±ãŽiŽGD¨k·žªôt5Uö©¡Þ}õÇŸ²a °†#GŽJ’Zµl‘¬¬Eóf’¤C‡Ž$+ûàÃuáâEEGGkäG£µzÍ™Zî–-Ûôú ·ùÛ)Y,EFþ¦×^C[¶lK6í+êäÉH%&&*üà! 6ÂQöÆ›ïhÏÞ}º~ýºÌæmûu»Þxó6,vàÁpõjœ$©hÑ"ÉÊn½›¬¬s@'íß»C:J’¾þz®$ç›JÓóéç_Ên·«Kçíݽ]:Ên·ë“O?O6m§N¾—¦Lž INWØÏžý]’´rÅRÇòB–,bÃ@`  ä—$EEE%+ûçŸnNS YÙ«¯öWþüùõ¿—_’$Eœ8™©å9Ê©¼Cûvj}sØÉV¬X¥åËW:ž¿ø‚ãqáÂ…­šµëËß¿©>ÿtf²ù_ |A»÷ìUð’/ ¹qÖl0赯dªý;uUøÍá5·ø¤ú@îÇvügM™ûd†ž©['SmŸ9cª5ô•‡‡»òäÉ£úõžÑ”)ب< ÌæÛÃp]Ư·wmâ­*£/ö U¶iƒúõ$»ÝN¯"ÛEž8¢rOVRä‰#÷½-·¾KA÷’Õê"³Ù¬ððpŸh¤Ðm‘\arUññ‘[wI ‰rž;F°pÓ) …ÿ–ÛCbnü˜#WØ€„!1@NwÇ;ƒÜsýZÈiäôÐîîîxL`r0;@`@`ìþ-&ºÈšò^Þ™žçdÄa:d WØ»`·Û3ü—QkÖ¬Uy/o­Y³6ÓíYûãúûÞ'IÛ•›Œœ$eg½Ù݇éÕq¯Ú~¿—•Ú‘[dÇ~HŸv÷Ȳå+Ô¶Mk-[±2Óó¾öú÷½ýIÛÛ>UÈŽ>Ì Û!·ö?rÞ>àþcH ƒ\¾|Y{÷ÐÏÖª©KEGG«páÂt ÿa\arU«¿_,X@~MkÕêœÊSúˆûÖkwþ{ë±ÍfÓ„‰ST£Ö3zºJ uíÖS‘‘¿9Í»öÇõjѪ­*zWU‹–m´yóV….[.ÿæ­åU¡²*TòѺõóœ>}Fý_~UÕjÔU…J>jѪ­£<¥6$mó—_ÍVƒ†MUééjêÑ«¯N>¡ºSrâÄIµnÓ>Ùë ªïÛT11±ÉÊÖ­ß  •|TÞË[>Õj«o¿—q"Õö§×¦ò^Þ þNU«×Q@—î)Ö‘–ô¶‘$M6SÕjÔU­: 4{μdõ¦Užôñòå+ÕįEŠÛ6#˺ŷ‘ŸÎûËñ<ò·S*ïå­]»÷8^;wî/5lìïx>wî|ù6òÓ“O=â²gÌüDµê4Pµuõñ¨±²Z­™j{Riík96ÒZ^FÚ“Öú¤Õ¾Ôö¡´ê‹‰‰Õ{ÃF¨zͺªóŒ¯. â  °¸–-_©N:H’:ul¯eË3>,æÖЇ“‡çΛ/‹Å¢°M´kÇV5kæ§IS¦:Í7oÞ|}:kºìÛ©€€ŽzeÀ@-_±Jsg©ˆc5cú 4Ø1ýÀ7«Q£†úuë&íÞ¹UíÛµÕð¥Ú†;-Z¢âÅ‹kÝÚUÚ»ûWµhÞL¾•¡ºSòä“åU¸pamÞ¼Õéõ+W©~½º*T¨`²y¬Ó§èdÄaýºu“šùûiЛo§ÚþŒ´éàÁCÚ¶e£¦LŸn$•Þ6ú.d©$iÛ–Z¶t‰V­Zã4zåI­X¹Z ¾™â¶ÍL]5kT×î={σ‚—¨b…§r³IÚµ{jÕ¬áxþÓÆúvþ\8~(Ù²-–§§§¶nþYÛ·ý"“ɤO?û2ÃmÏì¾–‘c#½å¥UžÞú¤Õ¾”ö¡ôêñáGò÷kªíÛÂúý§í€À ›œ9sV±1±Ž€S«VMEGGëÌ™³Y®3äûP½Ð··òåË'wuêØ^„;M3zÔH•+÷„ÜÜÜÔ³Gw%$$hô¨‘*S¦´$©y3Y,–Û!eYˆztï&wwwåÏŸ_ýúêÒ¥KjOð’µnÕByóæ•»»»z÷ê¡•+–ÞUݽz<¯Ùsæ9½6þBu¾kŠÓ(P@æx³$)oÞ¼êѽ›~X½<õ€›6õ)PyóæUÙ²eû6 þN=zt“‡‡‡}´”F æ4zåI}0b˜J—NyÛf¦®š5ªkÏÍÀ~ýúu­Yó£>™5]?ý´Qqqq’¤Ý»÷¨æ}ôÇ#}”Ò²ýýšÈÍÍMyòäQ`¿>Zº,ÃmÏì¾–‘c#½å¥×—i­OzíK*½úvíÚ­F|åææ¦R¥Ñûï¿Ë›*ða ;C,[¾B:ÝÞáâ⢀N´|ÅJ |}@–OJ–,áx^°`A]ºtÙišÇ÷t<öðp—$=ZªTšõîÝ»_a›7ëôé³:xèP†Û)ww÷l­»ys3^ÇŽG¨ÂS^Úµk·$©jUŸ§Ÿ0~Œú¿üªV­þA;w”ÁÅ ÿ¦wÕ¦Ò¥½«µ´¶QDÄ +ZÔñÜÛ»¢Óüé•'uëD,%™©«FÍZ´x‰$釵ëT·nm=öXÕ¯_O«Vÿ ®]´{Ï^õéÝ3CËŽŒüMUªÖrzÍh4f¸í™Ý×2rl¤·¼»YŸŒ ™©ïÒ¥Ë2™nÿ—î]©oª@v[¾b•Ξý]“§Lsz½lÙÇR ìIÇÄfDÒy’†¢[' © ^¢Ù³ç)0°¯|}¨ÄC©‰_‹ -ÛbI»½Y©Ûh4ª[×Κ3gž&N«o,Ôó©\]—¤¦Miåòïu ü 6n SXØÅÅÅ©]»¶YnSJ}x7îÜFémãÌîƒ![êòz²¼þ>ÿ·bbbüÞôš$©s@GM>S-Z4STÔ%•+÷D†úÉf³éèáýruuÍRÛ3»¯edýÓ[^Zåé­OfÛ—‘þ±Z­Ž>6™Œ@`öíÛ/ww÷Ç<·z¶öï?â㳿ÿžf½žžeuþü•*õˆ$)66ö®Û:nü$ý¼á½y%öĉ“ž÷ñÇ=•˜˜˜jèÈjÝݺu–Ÿ+õ)P¿þº]ãÇŽJsúŠ+¨bÅ êÖµ³>¢v:§Øïf}3"½mäåõ¤._ŽVñâÅ$IÇŽGdª<32S—Á`PU…|¿Tÿ\üGµk߸ú[¯^] þ- RõêUÓ<ùKzbuI?\2[ú5½}í^™YŸôÚ—Ùú ( ¨¨(•(qãSƒãw±ÈyÃäË–¯t:p§^=»+ôæÍ§&“IëÖoÝnשӧ5räh§i=<wºá4=:jÙòŠ—ÙlÖç_|¥Þ}³¼.éík÷âØÈÌú¤×¾¤ûPzõU«ê£ù )>>^.\И»ØØ¤`Û¶íj÷\›Ë:´N[¶l•Åbq|ÅS«¨ÿêÕ³»Ó´/½ØOíÚwv Ùx¡ooFù6òS}ßÆÚ»wŸ¾™ûÕ]µuü¸ÑšùÉgªRµ–Þz{¨^|±_šm¸Sß>½tôØq5lÜLÕk>£µk×iÖÌi®;-½z<¯“'#S½Ùô–iS'iõšµªóLC•÷òv|kLjíÏJ›ÒꃤÒÛF]:Èb±È·¡Ÿ:tê¦6mZ;]•M¯<32[WÍÕe±XÔ±Cû$'!”˜˜ètÃiFúáêÕ«jظ™jÖ®¯»vkòäñYÞOÓÛ×îű‘™õI¯})ËiÕ7qÂEEE©AæjݦƒZ·nÉ+ðq ¿ÞÞµ‰·ªŒv¼h4fìgÔÃ6mP¿þƒ2õ³ë@FEž8¢rOVRä‰#9²}YùÙo~uòÞùãÏ?Õ½G…mÚð@¯gLL¬žkßI¿l\Ÿ¥òì\ ûY­·‡†ÇVðÆÃŒa²êßßé ü—O®]»¦… ƒÔ¾Ýsܺլ]_#†¿§–-šéÊ•«š=gžZµl‘áòì\àþ`H ‹NÒúû/«Y»žÂÔ«¯ôàÖmꔉúúë9ò©V[­Û´Wbb¢Þzs`†Ë³sY€ûƒ+ìr½ƒö<°ëæë[_¾¾õ³\žËÜ\aìì ° °vvv€À kLt5å½¼3=ÏɈÃtÈ®°wÁn·gø/#'wþ=U±Šê5h¢‘–ÙœpWí\·~ƒ*TòQÍZõdµZ³t²‘ô$%«uÜÏ«µ?®¿ë“®»9qKºüœxâyöìïjÖüÙl«ÿ^ô9ØÜ7'#;þŽÞ¯ŸÖ¯Q™2¥õñè±wUïÀAƒ5cúýºíÆl¹ÒŸ[>-¸³¯½þÆ}mËý^~FlÞ²U Ô»gȩ̈L@`r”?þX›6mÊÚÁi0ÈÃÃC:uК5k懲EÍ›ùËÕÕ•‚4mÙ²M¾ êÓ@`|'NÔ±cÇäí}wC\M&§ ]ÞË[AÁß©jõ: èÒÝñúŒ™Ÿ¨VªV£®>5VV«Õ1ý­ï|,IC†ÓÒÐåNËû~é2 :,Ýv%³|ùJ5ñk!¯ •U¡’Ö­ßà4}jí“nÙ)ïå-ŸjµÕ·ßKŠˆ8‘âr}ùéܹ¿Ï#;¥ò^ÞÚµ{ãµsçþRÃÆþÉÖ?i?HÒܹóåÛÈOO>õtŠí¾SLL¬Þ6BÕkÖUg|µpQSùéÓgÔÿåWU­F]U¨ä£­Ú:êKmùiõKRiÕŸ‘í^û­V«vïÙ«ºukK’l6›&Lœ¢µžÑÓUj¨k·žŠŒü-Ý}1é>’Ò¾wëñÚ׫E«¶ªè]U-Z¶ÑæÍ[ºl¹ü›·ÎÒ¾vòé§ŸêÔ©SZ´h‘zè¡,Õa³ÙtáÂÍœõ™:up*;xð¶mÙ¨)“ÆK’-–§§§¶nþYÛ·ý"“ɤO?ûRÒí!·†ÚÜ飑èÛo9B؉'õí·‹ôÑÈ2ÝÞ+WkÁ7³qì fLŸ¢ƒ;ÊÒjŸt{ÈÎɈÃúuë&5ó÷Ó 7ßNq95kT×î={σ‚—¨b…§²ÔñÚ®Ý{T«f §ùR뇟6nÔ·óçêÄñCÉÚÔˆ?’¿_SmߦÐï—8-S’¾1X5Ô¯[7i÷έjß®­†ø(Õå§×/I¥UF¶Czíß \åË—SÞ¼yoœÌÌ›/‹Å¢°M´kÇV5kæ§IS¦¦¹/f¤Ïï4oÞ|}:kºìÛ©€€ŽzeÀ@-_±Jsg™¥} ìRôí·ßê÷ß—$íܹSŸþ¹¦OŸžézî¼é´²OMõê¨òë·ßtš®ÿKÊ›7¯Ê–}ìfhýNþ~Mäææ¦U*gù*ûÝ´¯bÅ ªX±‚ºuí¬Ã‡¨]‡Î)vƒÁ ª>> ù~©þ¹øj×¾qµµ^½º6ü-Z¤êÕ«¦ú²ª@ŠŠŠR‰7®:?áT>nü$ý¼á-ZTÒ{²s»e¶þÌ´Û¯;T»v-§ÀïéYVçÏ_P©RH’bccsÀq–õ}r+ưÙÈh4jÈ!ÿúr;tÔ²å+/³Ù¬Ï¿øJ½û¦;ŸÙœ !C‡iℱ*Z´¨&Ž£!C‡Ýõ5e¶}϶項‹‚cÐÿùñ¿Ú¾iS'iõšµªóLC•÷òv|kLª½FuY,uìÐ>IÀì ÄÄÄTo8}éÅ~j×¾sšÃTÒ2qÂEEE©AæjݦƒZ·néT>~ÜhÍüä3U©ZKo½=T/¾Ø/Íågv»¥WÿÝ´ËÖmjP¿~²íf4åÛÈOõ}kïÞ}úfîW™ZæÝöyví뛹Œ_oïÚÄ[U F;^436–5lÓõë?(C?»dVä‰#*÷d%Ež8’#Û—•ŸXçW@Z¬ÖÛC:Ãc +xãaưYEøþoIïýp¯Ø€4@Æv€À€ÀØØØ;;@`ð¯á—NÿI垬D'< \\\ø5bØ ;„mÚ@'à_×°±ªe‘'ŽÐA¼¯v¸S¿þƒèükìv;¡²¢€{ àAÁM§ ° °ÿAå½¼SýËiÖþ¸>[ê •›››ÜÜÜêT¶cÇ5hЀ÷ý8¬ôt55õo©ÿ›:CV«5ÇwÙu\&íŒZ·~ƒ*TòQÍZõ²¥Ÿî\ö½X7 ·à[b€&·üøÇk¯¿‘-míÚµ«‚ƒƒ¯_¿î({ûí·5iÒ$v Ü÷ãÐjµ*66V¡ËVhü„ÉzØÐyÜe×q™U ÖŒéSÔ¤q#ÆùžäF\ap_%&&ªC‡êСƒ¯‡††êá‡Ö3Ï<“é:ëÔ©£… :ÕÜ £Ñ¨"EŠèùn]ò}(’ ‹Å¢æÍüåêêJgvà¿Ëf³iÂÄ)ªQë=]¥†ºvë©ÈÈßåå½¼üªV¯£€.ݯ­ýq½Z´j«ŠÞUÕ¢emÞ¼U¡Ë–Ë¿ykyU¨¬ •|´nýí_ <}úŒú¿üªªÕ¨« •|Ô¢U[Gù­©ï®“Ãv,‹FŒ¡qãÆ¥:ÍĉU¦L¹»»«I“&Šˆˆp”Íš5Këׯ×SO=¥>úHçÏŸgÇA¶pu5ÉÅÅùµ3?Q­: T­F]}¢iÓgªÝsme‹ËÓÓS[7ÿ¬íÛ~‘ÉdÒ§Ÿ}©Â… Éϯ©-qª+(ø;5mÒH… JuÞԎ唎»;¥Tž‘÷‹;øð#ùû5Õöma ý~‰BB–:•§Õæ”–ŸÖûHf¤·îÀ¿*½NC¾Õ }{+_¾|òðpW§Žíuà@¸Ó4ý_ TÞ¼yU¶ìcŽ×F©råž›››zö讄„5ReÊ”–$5oæ/‹Åâ˜~ŲõèÞMîîîÊŸ?¿ûõÕ¥K—²}}ƒƒƒÕµkWÇXöØØXM›6M|ðAª7¤~õÕWêÒ¥‹òçÏ/½þúëÚ¿²º‹+¦!C†èàÁƒ*T¨êԩÆL‡^*«zͺêóÂKн¢¡C;p¿&rssSž«ƒ‡Ý“õíСƒÓ¦ï¿ÿ¾U¼xñToH=zô¨<<<Ò­;**JsæÌÑœ9sT½zumß¾ ™:ãããõõìyúvábý°z¹Š+ê4]däoªRµ–Ók·n¶ôô,+oïJZº\ݺvÖŠ•«U¾|9•+÷Dºó¦u,gFFÞ/îtéÒe™L·£w¥J^ßûù>ØäxI¿>-¥ÿ@SzÍ%é`Ü;/ ÑìÙóØW¾¾ T⡇ÔįÅ=]?ÿüS!!!:pà€¤Û7¤Þz|ËŸ¤d×®]úôÓOµiÓ&õéÓG7nÔÃ?ÌŽ‚LË›7¯¾þª¬V«>ù±fLÿ? ·?œ¶Ùl:zxª7Y¾ÐGï¡ÎõÕ×sôÞÐw2­‹ÿÉ–å…‡‡+<<\½zõr¼–Ò ©’¨+VÈl6Ël6ë‹/¾PÕªXÇHhºIDATUå;vìPÏž=åææÆƒìùÏÒ`Ðä‰ãôõ칺pávîÐQË–¯P||¼Ìf³>ÿâ+õîè4ï }{kæ¬ÏÔ§wO§Oµ22oRéwIË3û~Q­ªæ/X¤øøx]¸pAcÆNp*Ïl›Ó{1™LZ·~ƒìv»N>­‘#GgyÝ;€ã…¾½e4åÛÈOõ}kïÞ}úfîWÙ¾œñãFkæ'Ÿ©JÕZzëí¡zñÅ~Nå/½ØOíÚwv|¼}·_µöÎ;ïhܸqNà ’ÞzË AƒtàÀ•-[VEŠQHHˆBBBØ9pO=úh)½ýÖ}Gˆ}¡oo]½zU 7SÍÚõµs×nMž<Þi¾g[·ÔceJ«CûvÉŽåôæM*éq—^yfß/&N£¨¨(5hØT­ÛtPëÖ-ïªÍé½Üúvª§*VQÿþÔ«g÷,¯;ð s ¿ÞÞµ‰·ªŒv¼h4Ú34sئ ê×ìv;=‰lyâˆÊ=YI‘'ŽÐÞ3“ÞCxy°ÞWøºG<(¬ÖÛŸÄ…ÇVðÆÃÜt ä¹BÍHî×{ï?ÀýC`rþ3À{€”0† ° °ưø×ñÍØäP|¥#r’°Mèv¸¥ac®®#ǸóWG€À@Ã×È-¸é ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`@`@`ìì ° °vvv€À€ÀØØØ;;@`󘲣’ÈGèI 'v»ÝN/91°7lìÏÕuàb ;@`@`ìþ-&ºÜ/垬D'Ü#...:q8Ųò^ÞtÐ=”Z¿Ø@®Ä7Îe¿°MÒ†¯æ¾7'I÷€“%ü 'IYÅv #°vYÁvk];÷—ÎŽ«Øí;õè€ÿéáÀ’McKH‹««\ŒF:,‡Y³ëw}ûS¤¬v»d·Ën—ìºq3lïG4¨=ß"D`¹Ö…EAúsúL=ݲ•wWñ­“v‹¹˜Lräa%\¾,]¹"{l¬Jׯ¯ë'tuÿÙâãu¢ÿ+ªÓ½»ÜóåSéêÕU½y 0λO¶»¨÷çî’Ápã»Ê]\\$»]6»”h“®[ìJ´Ú•h±+áz¢ ÷è;Í ìÿ’Òï Ñþ•+¥’%e¿~].11ªÚö95V§ÑÕª«øOÈ~åŠì×®IyòÈàæ–b]6›M‹ƒ–¨}Ç.ªôt5U©ZK}_xIû÷ÈQ뜡Ôn—‚6ý¦E›N)áºíöI—n\e·Ù%‹M²Ú$‹ÍEV›s%ÕúV®Z£.Ýz¨²OM=]¥†ºtë¡5kÖf¸¯®]»¦×½¥yß, °ÜKEýýtÝEúçèQ¹xxÈ«•+ËÕb•éR´¼üüdûûoÉnWüÕ«ÚªrÓ¦¤(ízó­!Z»vF~ð¾öïÝ¡-a?«U« |éÚµk7E ×­®ç¯é­^þÎ….’]’Í~#¤_·JWâd¿~EÞžÅS¬oÌØ úò˯õÊÿúkû¶_´kÇV½úÊËš>c–ÆŒn{¢££õRÿWÕ¶MkõíÓ+×ô#7€\«Ì‡Ãµðù}WºrE¶?þPÃÀ@Éd’=2RöØXÙ¼½µyÊd=1y‚ò¦Áo Róf7®—÷òÖ”Iã5mÆ,ýùç9 ͘>ÅQ.I_~5[ó,Ô¥K—U­šF©Ç==å3f~¢ß.–ÅbQ‡öÏéýaCSl[N~ê’¦†Q«†ÕUñ‰‡u⯫òñ,¤OÞí"“A2]äf”ò¸•ÇdGWåÏ›G..RTL¼¬V›c¬û-ß.Z¬¯þÏ)¬;öƒ4ðõWõí¢Å)öÂ5vÜDMž8^¥pÒ–Ó1$äZ¶øx™ÿøS¦üùo|÷õë²ýõ—¬ÇŽÉµIZ±B¶GQ©—_JµŽÃ‡ªzõª)–™L&•{âqÇóo V£F õëÖMÚ½s«Ú·k«á#>ršgÅÊÕZðÍlE;¨Ó§hà Á޲ÅAKT¼xq­[»J{wÿªÍ›iàÀ·å‹ËÓÓS[7ÿ¬íÛ~‘ÉdÒ§Ÿ}™«¶ÉŠíg5kåqu}ÖW¥J×És7¾æÈÙÿ#FÄèÄŸÑ:y.F\VÄïQ:rúoýuE/_Õñ3çSü†˜ððƒªqÇÉSRõë=£}û’ßs°aÃÏêÛ¯¿^y¥® ëv{ÙíŠ|ýMyV®¬‡<=eûãÙ££e;sF†âÅsé’Î=ªÇ'OL³š¸¸8,X0catYˆztï&wwwåÏŸ_ýúêÒ¥KNÓ|0b˜J—.-IjÞÌ_‹ÅQ¼$D­[µPÞ¼yåîî®Þ½zh劥Žò àïäï×DnnnÊ“'ûõÑÒÐe¹f“ü_èam:­çŸk¢D¹êôE³ì’\ ¹ ’\d—‹lö7™ZmvYlvY­vÙu㇓LFƒ®%Zäáæü©ÂåËÑ*Z´HªË.Z´¨bcc^[ðí"-[±R߇,ÖÔi3uåÊ•\¹«3$äJ¿O™&³Y:v’mÏéúuÉÕU2d·X”·P!ÙããeŽ–ÑãáTë)T¨¢£cT¼x± -wïÞý Û¼Y§OŸÕÁC‡’•—)S:Õy###åîîžFùoªRµ–Ók¹i8L¢Õ&Ù%›¤D«]×­6™¬Ù¯[g‘‹ì2ìòpu‘»«‹Ü] ŽÇv›]2Hîy\õwÔ•~(¿SÝùóçÓ•«WU¸P¡—“ìÄëÌ™³š1mŠ ƒ^ð?½÷þš5cj®Û×¹Âr¨Õk÷ã:ÕìÞC¶={d·Ze¬[W‰O=%×-d¿tIÆË—U±Y3ý>>í+ì•+{kßþý©–ÿ¼ñÇãà%!z÷½ázä‘GÔ«WwÍ›óUòpeH=^Y,Ö4Ûb³Ùtôð~Œ8ìø;~4<×l—¡•Uï©B Z±Q®²è±byuÕlÕQ Љ³(áºM«îø³Ëb½q…Ýj³ÉÕdP¡|Z´n¿êU*áTwõjÕ´cÇ®T—ýëöò©RÙéµáï¿ëØÍüýT⡇´pQà^Š;v\¿¯ú/¾$<(ë_ÉT­š"֯ך>Е+Wd,_^Ö={ôxƒŠÛ³OWNµ¾íÛiÞ7 d³Ù’•8qR+W®r<7~’‚ÏW×.ªQ½š2ÕöÇ÷TbbbªåeË>¦¨¨K¹zû4(«ÿµ~Rßÿ¦¿/F©Bé2\äçó°U.©ú•JªN…ªñd ù”+¡Jž©|™âŠO°(<òo[ð‹ÜŒvµ¬áüIE¯žÝ5múLÅÇÇ'ß'ââ4sæ§êÑ£[šm{wèÛZ¶|¥Ž °Ü+M¡j­[+ϵk²ž8!× ô×áÃ:uôˆžý‘ö¯X!cÕª²'$H¿ý¦ªmÚèìÈQ©Ö׿ÙVÊ—/Ÿþ÷êë:r䨬V«.^üGß.\¬×¾©·¿é˜¶`Á Û¢k×®éðá#zkðLµ½s@GýôÓF%$$(!!A‹ƒ–¨ísÊ—-_¡øøx™Íf}þÅWêÝ'0×m£å‹kLßÚºs¿öŽTݧŠÉf—Þù¿½9ù;½6á;ýoܽ8:X}?Vï‚5xÆ*Í_½[-ª–ÐÐÎU”ô‡N6l ßõÕ¥ký¶Yf³Yf³Y›~ Sç®=T¯^]5iÜ(Ív¹¹¹iÒ„±zï½á2›Í¹¦?Ãr•‚ (bQJT­*×-t%:Z{W­TÅ`å)õˆ.,X¨‹*êí-Kx¸iß^[6+úçM*Ü´q²ú\\\ôÙ'3ôõìyzsð9sVùòåUýúõ4û«Ïô裥ÓŽ7Z#>øHCß.Oϲzõ•—5øí¡n{ß>½4mú,}0r”®^½ªZ5khÖÌiŽòúöÖÿM®†›Él6«NZš9J'ŒÍ}é0~½½koU)íxÑh´ónî¹rOVRä‰#™žïÜg_èÊòUòiØP;V­R™©“•×§²ìv)nß>]>Rþï¼#ë®]2U«¦cë×+ú O•yãõÿD¿†mÚ ~ýédDÊCÊ{yËn·g©ï3Ëf·kÁO'µ;2F]ŒQлd·Ûåââ"—›—Ñ ƒãqnïsI©ö{FX­·û!<¶°‚7æ ;È=¬V«U¨wO]7š´ó»|ýUY/«èè˜=ñ„l–ÒÙ-[T²reíûî;]èF4¹Ê`2Êh4ÊÕÕ”«¾×<7rqqqÚN7®¢d0ôØCyeµYCbŒ£ Æ›å.7§7dº¹½@`¹,°çÉ“Gnnn²Ûí²Ùl²Z­Ž­V›ì²Ëh0Èh4Þñ7ÿ½"ùr¼{;Ùl6Ùíö›ÛçæŸÍ&Ùí2Œ2 ŽF#Û‰À·nV4Ü󌜻n]%g;ÝåI]ØdŸOüG…mÚ@'Ø9Qnÿ¡";¡ °€ÿ6~¸ˆ~Gú¸é ° °vvv€À€ÀØØØ;€Œ3›Ív §†õððp]¿–p;°Ûlt xxx¨ŠL®y$I¦bùM2^qšÈju¡§€ûÀl6ËÃÃC†˜Ïo’¡È£&—Ý'/ÊNß÷-¤ßú7<<\f³Y;".êóך¸ì.’«ÉEÇÚ€ûÖÃÃÕpc8L•* ;•¨FI’ËÐe›e·Ûåk°›-6Õ{"ŸJvSw#½ü¡=!A¹êˉÚyEÝú°WI2ÙívÙívŸ1p}ý‘+öóWé5à_V<¿IŸ¿ÖÄé†Òÿºš8аüIEND®B`‚kildclient-2.11.1/doc/C/images/we_protocols.png0000644000175000017500000005023211405233117016257 00000000000000‰PNG  IHDR’j pHYsÚk¥óÎtIMEÖ,²Ã_ IDATxÚìÝwxÕÂÇñ3[ÓÐÁBï5´PB'¡c ê X”‹rm´^¥^E!ÒD)]┑"% ©„l™™÷Á5n6K¨&øý<><›3§L3¿œÙÙY©}Ÿ„BIÕ)Š¢ª²ªªBˆ¸ ŸŠ{-%[Ùx<÷÷ YàaaÔKÁ›Z>jB(ªBÕI»î^ô»„Щª*«ª¢¨ªªªª$uê?FËiGÙ¶uóîÇðûÏZwž¶Úd•#ñð©TBߣ®Gi]:IÑétì¸'Þ2^U…ªJBU‘¤ÎO¼ª¥µbWX7G«$+")ÅžxÅžvCIÎVdåó0Ša-¼|=t±‰–ýg­÷p3~ùîcŸìSþþþv»=§\ëÇš…¹¬–zîxêîO3ÌU‚žϱ¿¯<ÒˆVÞþžÒÿÎY·žÈ%¹àøzH~Òc¥ uËý=o^¼TTñï×Ç ¡BH]žxU+Ý´r¶öâ^ÊîY×£^câûŠƒ7îí†Yod_Ø=lP/½^¿~ãfkõ'JV¨îTÇr=Ývhéï¿ÿ^±Ëxï’e9î·2¾ºQ­½õ:1gGöu‹LrÀËû¤bûIË–uBw3¶™}/e{›¤W;øÈŠøÏŽì´åžoRÆ¥$ËÿµjÞDUÕ­»V›dòôͳ\ý}Û<_õZv¥°ò5ƒ8Œþ =›T6î;cÝr,So4I¼Ï wÁñ¤bÞÎë×ýË ÚmÚ{ÛBˆØDËÞ_]_Ê®]Fߨ‚ÞßSò2Š›øõšr&U9•ânF^-Ð „8~Ù–œ­Üñ.[õZ¹¶âw–.ýhYß„ÍÕê5Qü‘\YÉœ}ÂRµfõ {ãÏìãïT2a]Fþ Öe8^T-mèRÓ<ÏuGI]}Kxê¢ÈJÎVô:ñV˜ŸI/ÙdõÍ™²"}tQ|Óo(S·dÝr‹£Ü²°ÈúᤥIe㣥õk®IgÐéõü_ èè\ÝШB¡~/þ]Ž=eÿÛ›ÿ–&/ù1gTkoOéåvÞ½Þ0ȲûíÇBˆ„Ëö]I–ü+)ê”Q«–Òùyës­ö»,+•¼ÕJ>â‘pUœËp=£ª\R'„8ú»]Vî×mhuOܘ˜™tB§Ó™,–3{W>Òj€"õÌÿo$º*êõ¸åèN3ÂqkÒœ*D÷-!¯I›Ý¿¤Bûgù¿z |gƒ¶ôLнIeÓ‰¯^U›¼Ð¬A-“^Ò.n˜; þ¨eUJú!¾ÿ&fþ+Q#?;Z˜Šî[Âå:ä/,‚®fÉ)ÙJy?½0ùÚìVƒÄurEÈ£~V!<%I2õvY±ÚdYÑîÇŠ¢È²"k?ñ¨Ÿ$+RQhžmQ¿ü)ç¹`o½N¼ØÖÛ +v!„¬ˆÇsóßzVÉ×Þ¬Œ¥¤¯§^¯×ëõf“$+ª¢¨ŠPE-çi÷+k»a5_¾nÈ¿wª”4!N¥Øm÷ó_t|>!&ÊsY¡^mð-ë[¡–H\{"5ó±ÞoÛUƒ(Äè£Wþ™ˆžFÝðV^^ºÍ ¹ŽÂYýJÌRÿŒÿóGw¿²*]{}:YnRY´mÛvÙýƒ:ÖsÔ i×öpBü  .BˆÝ»wWªÜ£®gËGM’$öýjýöÈ EsÃK!¯Ú= Ò¬mYî×ÁVL>7w.M.í£ ôÑÿžl:®“(BRÒ¯ë$IÒIžf£Ÿ—‡^§SEBVT»,[­²¢ÚU¨ªz-=Ç’k0˜<ŠBóß3äŸ/ÚšT6†Öñ0lßð™(øRv€>ÓdðÖétB¨²¬t:³Ñ (ªÅfWÕ`ÐëõöRúŒ r€È÷ÛÙÏCB\»®ÈêýüЗÁôH脳«_3¨¤\Ø·<°L9)çZÉÖ/¼ü 9tÞj}x<^Ê0~òÔšUM†:Í˵¿ƒ´(zñëkBˆ“É6!<Û¶m;ã¿oÖ(û¼bÅŠƒ êÔ©Ó·³¿y¼t¨Ûãßú¨c óÔOb.%øð?³NÄo=jh©u;ù¥Á'¯X¯\¾87ü'7ëpwã½£ÝÇPÊKwÖjÓ™TIGl(*’Ó²Júyé)WØÌFƒÙh%¡ªB'©’²^±[IUÉiYÙ™’O@¹"Ò\{ Rqs–|ôw{þÛÐJê³üõ7 zYVTU(ªÐ ¡×ëLF½Ùnȼž«×é¼<Ì%ižòµL)À©¹^' !rí÷=lŒþý[ ËÞ÷IŽlPFs KW¬WÈ驚'G­H«SÖ(„XøáŒö#f*¸ÕÈå×´þϧÉÙ¹öªU«úÚ“«”4Øl¶ & 0 yóæúŒYe|t™™GíÕ¡™bÖä[ y[Ñ£Mý%>ï !bcc› ýOÃ:ÁŽÎ]®Cq™mùÝÖ©¦¹v9ÃÞcÉf׌ü¦PD\¾–Y­r«l·Ûužf“$I:.Ï|L²ÙUUÝåk™¹7Œæ¿&£Ëæf“^qý†õ¶š—/í/„°ØdÇè¥Kø!»ê²ùåL9%[)í£3XíBq2ÙÅ¥léÆÅÒÕË z›¬ÍâIû»@§3õ½Îb³{êf“Á–yÅêå/é\¼Ón ÏW±&'©B²˜J?îk2yèkáÇuºŠû©¢ !²²²JÔéâ¦UÞþO§(*‰q/ ×IbÛÎ/]9u%·Vïçžì%„Ø»gÁÃ7À×C‘––P¯»¢bÅŠ'¶}!Ä{ÚXeë´3xýyœ—IÊ¿öbò¤šGK„‡ÎÛ,V›Þ®(L¶—R2U¡Þ°ØŒz½M–õ²NRT$Ý|ܘPívÙ&˃ùRJ¦M)唌ù›ûšoÎL¼=MÉéÙ…o®•˜úœ\›¢ª>ž7?è•kµÔ\{ Ò`•U!Ä•,S¹¬ô?ïÇeY©V9° ]pú|r)?ï™',ú*³WÞE²¢êu’¢Šû7™I{mgb-M}o\²Z­‹EMÞ˜V¾ŽO¥…ìá©ÏSÿÜj‹âç¡+Q¢„¯›&¶¥ ÓIÞ‰ìá ¶vÕÌáááÝj¸¸ :Ǫz™$??¿¼MŽ_¶ !´§‹lذ¡\ÐЃçm ƒÁp3¶«·Ý™déßÐsÀ€ÊÊBˆO?ýÔ+ âŸâ¨:q«u(.³íëVU»``“…A*O Pd¤eå(ª*+ªNQdE–,I:!!„ªÊŠ,+Ь¨Šª¦eåØ=œÃ1os-t4¬^ñÇc¿¦¹¬È)×Kû{;–^¸š~5-ËÍèBˆ\›0Xe!„°»ú”TÖu«Õ& zYQÎ\L}¼â_"ðÂÕôŒì’×2rR2®ë¼s íä†Mõ4J½tÃv¿òF±Y¬>’äßv¬jò1—«emþ¼øéc³Ñh”râHí¢„t‹Éå}o;|qêçñ9>¹ç¦OŸþéúƒ}wtª¼`ßõ‘AúuëÖ}p,ËøÇÓ]N&Û-6ÙlÔŸÒòúµ_«èOFUµŸ<²ÆX7¼ æ}¤¬å|ý¿ÏgÉÿÚl?ðq÷ì+§c¶Núù˨¼5·ŸÌýbÙêß-ùX“àñßü1]Ý8¦ªl½áS¶ªG©Gí²:bEÖæ å¦_ÒL~U[lê7WkNòïs»¿RU¥j×—ïò’£[må?¦dËùס¸Ì¶Kyë„Ò»¢³)’Âl@‘‘ž}CÒ ƒ^§Óé„$U•ÄÍÏ©ª*$¡Óé BH:‘ž}ã¤s8æm~îJºÑ —$IBkn³Ë×2®+ŠR˜æBe|ò.­R®Äá“ÝŒ.„°ÚÕ›ïm»ŒÉ»ÂîCIMjT6ô6»œkµ]LΨè-3GVTI£A§(b÷á¤á£êœ:I¸l«hhTÑxìÒ}‰mõüî†ÞW÷fW÷©Þ1ï¶™ê H>±¸õ£>²,ûg^Ýwþ ¡B“‚: û$Ù©Ä& w`˨ÚÛ Õ µš6Y”múD·¦Oäû[ÇØmÎ9GšŽÓ~Ñ^ÈBȲÂX£ï”}§Ü {åÏp4qüèrŠ>“Aª[Î(„øýÔ!¯’ådERùÎ7EFfö ¡ ³É (j•?&¢NŽŸ¹$T‘™}à ;‡ãýh~éZ–N’Ê–ôB4ªQÑMs!D®]½y'¹Ë °†’øùÄ–'ºµ¨%IÂn—­6ûåÔL!„N’t:I§Óedåüp ѯ̣ŠÞ铸ó¶^õ=[?fúò§œ{þ«[É8×D:|ä²jnü¤,¤¿\¯ )UÂ3íÛê=^.++K>{x_fƒo9Î× å£&“Al9‘k·Ûd¡· ¤°W™Ø¾nQ…0õrÁ±d6TUͼnñSÃñž7¿”š)©BÕñ>·›æB«, –‚gÛB¯rµ?]»Éf·÷h]W§×©ªeE5£A—kßí>úÙ7{¬6»Á»”Ð{8uòóÛ‘ßmõ+ÛU3o=‘{ow½íâ/¯‹U™uf%ÿÊ{”ÜžÚ )þ—ÜÜ\›MäÊñµ{r¾Þozx²©§⛟s…ÁS‘ŒvYH*³mEEVN®B¨ÂhП½”ª×éu:IcÐëL}N®Õbµ©ªš•“+˪S®ÝóæŠ¢J’„¤SEFv®ûæB‹ÍñÞvS"S‰ ^¶ù`Õ¾]‡“‚<Þ¨F¥GË—úírÚ±3—~ø)qÇG<Í~åªêýÊÉz³’¯“ØDKý Æç‚½ãÏY“³îé´«Z‹:7—ŽKT?#n~•§¾ø<«¤Xû¿^Kè·$äþ´{‹WÙª²Î¨ª³mEÇõ\«ö, EU$E' E{؉N' U•$áa6êõ’ªŠë¹V›âŽos!„EVÿ¸“¼Àù¾Î+ðñJ&¯ŸOþ¸óàÖÖ\E:jÒIž&£ŸiÏR•½ÊTÓ{•vú“æûã¹+Cª›§õòuuzV.¿ÂZÝëx iæ%„˜¶)Uç Þ²0ªŠpwÃ%ƒ›y !†ü÷ZƯñžU„ÑKz•¿Ó%4î^îñFYç[3.»¯iò/§ê=œ¢íïm.„°Ú…´áhŽbÆÖ[|´ªÈŠÝ¢Xo(v‹ªÈ’N¯3˜u&OÁìò™¦y•ôÒMîæÛ´ŠI±áhî—?å\L½ÎÙóЛ¼‚3>ì]¹¤^ñä¯Ûÿƒ9 ’É·ŒÞì}Ë<Ån±_OSl·˜CêŒï’:ƒ¹H5ŸÔÍOZósŽbvìýý.gUQFw(Ñ«¾—‡QBüž¡ì?k‘q:ÙÎ9Tìxë}te}õM+›´§òm:žûî·²Î6ù•3úèÍ>’ÎÀWvÀ½Ù¹äÍ‹äªrßãsîÉ1?™"šú5¬d®QÖØ¿¡'à!°ñXÎú#9»øÞà]Ò\¢‚ÁÓ_gôBUær¸·¬ò[÷ÿMHI’®¤[ælý]±YêW0 IÔ,kVTUÕê†b"9[¾n¿”!Ÿ;ù³lÍÑ›<=K?ª7{ëL^:ƒIH:I¨‚Ѐ{íÏÇ­XÒ/=˜!UUªrå|Úå³6U¶oRlB‘UEܼTŒHÚCs%í!éEÖÙfáÂ8ÜÇÙ¶=ÐàøaÅPöEÓ ¥B;€â‚Ø€ØÄ6Ä6 ¶± ± ˆmpw …¬·sG,;ë¡Ñ.¤3;æØB 5†ýõPU5éÔqö<ä±­ýÆg—k6k¼· ± ˆmˆm@l€bÛk×®5™L’$yxxlÙ²å+I@lß^f?õÔS111ªªþ÷¿ÿ ‹‹ãPc;""bÙ²eýúõÓ^/\¸ðÇÔ¥¥¥…††zxxtëÖ-==Ý1Ež9sf•*UL&ÓÚµkÝ×|÷ÝwëÕ«'„ˆ 2›Í*TX¼x1Ç@lß ›Í¦e¶fàÀ&LÐ^¿öÚkÑÑÑYYY£Fš}zdd$ÇðÐîÍBÌßðËŠ¡þnêíÜ;|Ô˜»|Jš$IŽo6k%åË—?þ¼Á`P¥J•*.\Ðꤦ¦äm[PÍk×®•,Y2ïp², ­UÞ¡ÿÉ’N¯Z½ÏJ€bgÐÒŒç{60ü]Ã;ÒTû199Ùh4j¯õz½£š–ÙyTÓ‘ÙW¯^ýä“O>|äÈ3àaò@/’FÇ[ÔBˆµk×:8 ÀjµªªªªªÝnwÓÉ-k†††ªª:räÈõë×s€ÄöЉ‰yê©§´ävÜU®-êÙ³gBB‚Ýn_´hQëÖ­ÝtrËš‰‰‰½zõ ž7oð0y Éûõë·lÙ²ˆˆ›Íf4cbbw¨EGG?ùä“Û·o¯U«ÖòåËÝtrËšK–,2dHjjê¤I“8Àbû®’Ûjµæ//UªÔæÍ› óÞDæx}Ëš 0`€özìØ±ù+PLñpSˆm@l@lb—j5êjÿ]¹rEqèÐaG‰Vá 4¤ný&MƒZ?!%%ÕM¹£mZõ5iñâKcÒ32œFܸqS—®=„k¿YסS·šµ {vÔC¿‡o«I—®=6mÚÂÉ Û@~<ð“âà¡Ãy N<ýÌð%JØ¿kÊ›“¿]ÿݘ±ãÝ”kNŸ™œœ’\»Ýþö;S7mÙ¤YË)o½k³Ù„?ÿüKÿ'"j×mT¿aÓgþïÙ /Tè˜m»YÃï¿ßüDø –­ÛmÚ¼UѬY“ää”5k×qfÄ6àB³¦MøIqèÐÏÍš6q”ÇÇÿ$„¨^­ªSý‚Êÿr.ê$!„^ÿ—g lÜ´YQ£zuÇT{1ÿÓ‹/;ö•Èñc-^:ÿÓŽ&ƒ \øÙÇy;ùÏœÿûù²‰ÆùÅ’ýûŒ徇£ÇŽ¿÷î[é³fÏ9tfÁg_¼øûo¾å¨pðࡉÆ>üóŒèYùÇûáÇŸñåë¯E¾1ùõ/¿\>÷Ã…¯¼:þ—#G7¿~ñÂO÷îÛÿêØ¨‚ ܬᑣÇ^›™’’:uÚ !DõêÕ„ßmüž3 ¶‚‚šœùõ×ǾšœÔ¬©£<==CááááT¿ r‹Å²hñR!D§Ž!yËOœHB”-[Æ©þÊUk…=z„†…uB|½rµcQëÖ­œ¾ î›u„aaÝ7ntúä±Õ«V¸ïáå—_¨Y³†öú•Ñ/Ö¯WWqéÒeG…±c_éÚµ‹bçÎÝùÇ]ûÍ:!D×.»uí"„X¿a£";;[ñÒèW={ö—Ãñ«¾þª ÂÂlã¨QÏ6nÜHqùò!D¹²e… '83bp¡iÓ¦Bˆç&„hÚìÏÙ¶¯âÆNõ *×T«Q·^ƒ¦Ÿñe¯žaSÞœœwQVV¶Âl6;5Ñnˆó÷óóóõu¤—ÆÛÛË©rJJŠÂËË«=”ð÷×énþ¯Q²dIíuÞíùûùùúú!2òÜ@ç÷êÕd!D³æÁ  !.]º$„xsò$Ÿ„„“þ5¥]ûÎÚÌØea!×Ð`0!EqìŸë×s83bp¡êãlßWªTÀã=ögœ7k"„H:ó«sÌP®9}òةģÿ‹ß÷Áìh??ß¼‹üýý…‹óqË–)#„ÈÈÌÌÌÌB”/_Þ±(ï×¹jJ—.íø  0=ÜRjê5­·€€’ùÇ-Uª”âàOûµ›Ë~BôéÓkÿÞ¸O>žÛ·oïôŒŒÉo¼UPᬡ¶òË-bûOqqqì¾ô„»IcUU›6i’·ð¥Ÿ7 óçvãÆo×W­FÝn¡½Ü”ßR½zu„ÉÉÉNå}ûöB|ÿýæï7mB 4ÐM'½{õBlÞ¼åð៫ը«Ý8v[=8™÷Ñ'±?lBtîÔ1ÿÒ>½{ !Ö}»þU«Q÷ɧ† !ú?Q¯AS?_¿_%„(U*  Â;ØFm^Þ A=NKà¡wç_%²cÇŽöíÛ¾‰$IŽ×Nß&IÒí~ÛÇ4Á=ÔtkìÍšý%¶Ô¯·dñg3gÎjÜ´¥Ñh¨]«æ¿&½æ¦ü–ÂB»ïÚµçÔ©ÓyïWB¼üÒ ‹uÖì9ªª<7êÙ‘#†¹édì«£srr¦N¶Z­­Z¶˜6õíÛíÁIåÊ•Þ~gjË–Í#ÇÍ¿tÜØWnܸ1gμœ7Ú´i=sÆT!ćs?˜òïwFŒz^–•&M½5å‚ ï`“’Îô7€‡Œ´po¶bþ†_V õwSoçŽØá£ÆäII’J—.½jÕªÂ'wÞ Õ¾o{Ù²eŽä¾íU'¶o_Ò©ãU«×I:u¼¸¬°Õj 騭_ß^Q‘ãŠÂúhͺÝÏUßo3£g¯ûvöØïóßà¡1hiÆó=ÜÕ{Û«V­ ¿³«åŽïÞvšˆ¯]»Öd2ÆF9z–$)&&¦D‰mÚ´Ñ®æd6›+T¨°xñb!D­ZµN:%„8uêTõêÕ9ØÅ—Édšòæ¿~ضƒ]áÆÛ¶Ož4‘Ìþ î*¶Û·o—É­=‰"¯ˆˆˆ¹sçæææN™2eøðáŽò­[·^ºtéé§Ÿ~ýõך :4***33súôé‘‘‘Bˆ>}úlذAñý÷߇……q˜‹µn];oÚømY™;x„Ù°ùûõ¡¡Ý8Ub»PÉ=zô蜜{óá“víÚmÙ²eÇŽÝ»wOJJr”¿ñÆžžžƒþþ{çgJ;vlàÀf³yÈ!iiiN±ÊaÛB÷á‡îرÃéC±wlùòåééé=zô([¶ìÁƒå•+WBøøø¤¦¦:5¹zõê[o½Õ¯_¿š5kj%-[¶þâàÁƒ 4¨Zµ*Ç@l‹;»6þÀôíÛWû 7âñU"wð4´ÌÌÌððpp±£=†Œù·8þ <wþpSGEüá¦ÕjÔ-‚38{Q܃‡›÷¿õÀÙ ¸g`à~‹ÿé1_¯:p >%%¥téÒÍ›E jÖ”ùÊ?„ÍfËÿ„†‡oU9{ñ`0ÛÆ}$ËòÛïL0qRXXÏýûÌÊÊÞ¿ÿǰ°ž-Øò! IDAT&Nzû©²,4_©V£®Ówð;´…nªmÙ[»n£iÓ£9”wÀ±÷zöî_\ÖÙ±ªwpÊ‘Ù`¶boÖì9W¯¦?žàã㣕T®\yäÈ‘ƒ>köœ Qã š¯ü¿C¿2füÜ9³ºtîÄ¡¼޽·hñÒâ²ÎÚ7—ßÙéÇl̶Q¼%ž<¹wßþÕkÖ82ÛÁÇÇgõš5{÷íO¸,t9´Ó(.ï wÙÛµk×ù¿ m–þ÷ GM2Ä6Š·%K¾ˆŒŒÒ¾cæÔ©S!!!ÞÞÞ!!!ÚW¡{yyEFF-YòEþ¼tïÊ•«[6m˜;gÖ+cÆk%&N9bøÏ‡DE>ãÏ Ú_,[¾níÊQ#ž=Ë©“è÷g¿6!ò—Ãñƒ"Îþ`Ž›9·ÓïâWÆŒóIÇ=úʼn¯Ovß[™ÀÀÕ+—wi¿k÷!Äî={;uêpËúN«±{Ͼ}{vôíÛûýYä¯9mFtÏaG~þ©K—Ny/æçoå²fá7ÇeM‡ü‡À±÷òîÆÂoxôû³#†öéÇS§Ít³þ.Ï—….‡vÅåwÙÛ¬Ùs:vh¿+.öôé¤Û:{bEמ½{;w~öÙgãâârrrâââž}öY­°sçÎ{öî-h¶]Ð{Û£G¿èééÙµKg»Ý®•lÚømXXw“ÉÔ»WÏŒŒÌ?#vô‹f³¹eËæ;âv:­ÛÛ¶W­ú¸Á`èÚ¥ÓÖØm…ߨæAÍvïÞûãøvmÛlÿa³ûÞºvíâååÒN‹í=ĶûúN#¾üâó½z†ÅíÜ•¿æ®]{zõ 3 ½{õؾc§›V.k~s\Öt(èr·çßðñÿëÓ§WÓ&c´¥ùÏ—….‡Î?ŠKù{Û·kà€p—_z¡ð׊€{‚÷¶q¿¤¦¦j¯:ä(w¼ túÖ¼·]Âß?ß@×¾üjEB §KF£1==éɵki5k7Ð^ëõúÂoÔ>ˆ~åÕñ#F¾`4¿Z¶´nÝ:nzó÷÷B´h4a⿬VkâÉSM7ºe}'åË—Ó.N¤¥¥ç¯™‘‘áíí-„ðööv\:vÙÊeÍÂoŽËš·<…Üíù7<33Óßï/…miþóÁe¡Ë¡óRÈS.%%ÅÏÏ×qŽå?{bû/¬V«Édâàq¥J•JNN®X±¢¢qãÆ»vÝœö5nÜX{‘œœ\ªT©‚fÛ…7|Äs:†DD„W®T©[h/GùÑ£Ç6l`±XœFBøûûïݽÝ`¸íó? `ÙçK,Ë·ßn1ê…}{ânÙ›ÑhlØ þüO4mÒX§ÓÝîè×®¥•.]*++;oBäÝ7r===®_¿^¢D 7­\Ö,ü測yËCpÇ»ÝÇÇ;++[‹F÷[ZH.‡Î?J¡Oƒ’™™Yþþ~yÿî$³ñ`<Ћäyoí¹5âÈ}Á­[ÇÆÞ¼…gÑ¢EíÛ·÷òòjß¾ý¢E‹´ÂØØØàÖ­fÛw0Й3¿vìÒ´IãÏ—}•·|ê´™‹e÷î½]º8ß Þ±CûÓIgdY^¹rõ€ˆ!…«{Xï7 ÿþމì-{ëСÝÜ?Ö®ßîèŸ.XhµZ×oø®k—Îù—¶k×fûö²,oü~sHû¶nZ¹¬YøÍqYó–‡À1»MKK»­ oÚ¤ñæÍ[:Ü©K¨û--$—CçűªîuîÔqõšµV«õ“ù îòìþ³m—_†¢fذ§'¾6yÀ€^^^Õ«Wß±cGÞ¥999ï¿=cú»Ͷ~ º™ÊÌœþÞ¸ñÓÒÓ_|~TÞòwÞžÒ»Ï*V˜ûç[Ò^›ù긨ýûT}üñÿ|pËžöÞÛ¯½>ùÕqQ:nîœY…ì-¤};¶m‚ï`ôòåʵhÓªU‹YÑÓó/}}bÔ+¯Ž‹œðzË–Íg¿?ÃM+—5 ¿9.kÞòÜÜüvÁm;?z¨ð>!jüs/¼œ‘‘9ëýéî·´\Ǫºïmü¸1/¾üê¼>yáùQŽwå™mãM€ä3É%IÒz$iÆŒóæÍ»|ù²ã[·%IZ±bÅsÏ=W¯^½Õ«W—-[6oÇkÇ”¤ßüLò™Ñ³Ï»°rÕ*§Ï€egg¯R¥’›ÏmãŽw»ñÁ°Ûí«×|³~ÃwË>_ÂnÇð7?“üâÅ‹ 111ŽÂ­[·^ºtéé§Ÿ~ýõ× j¨¥5™],Œ7¦L™ÒuêÔ^°`Áùóç­Vëùóç,XP§Ní2eJ7Æ©þ=|JpÿDNx½iP«ú ›­]»î½wÞb¶Äl;555 À©ðìÙ³<òHfffÍš5/]ºär¶íTˆ¢<ÛÖðLrpi¸W³í¿í½m-³T®\Yáãããô¹ ¦×ÅZP³¦.C:?~ë¡øâìŃQ´·’œœ,„ÈÈÈ(W®œÓ¢üAއr¾Â¿ü[¬ÿî·¿í"¹ËKßcÇŽ6mÚÂ… Ož<9gÎ!„ÉdЉ‰éÖ­ÛäÉ“?øà­¦Á`¸|ùréÒ¥9~·ëo¹H¸{ó-i.UªT)00pëÖ­ï¾{ósAÚ=k•+W®]»¶£Z=*UªÄ!üÓ<Ð÷¶3ì¼³ö¼¯Ç7nÜ_>Ô¯_?«Õª½9r¤öbݺu9À?_%±}sqÀlbۀ؀Ø÷“]€û­ð_%‚‡‰Íf3E¿O€Ù6p“,Ëo¿3uÂÄIaa=÷ïÿ1++{ÿþÃÂzN˜8éíw¦Ê²\PûÿâN—M Ù£Ú–­±µë6š6=šCyzöîÿúäà`¶ Ü{³fϹz5åøñ­¤råÊ#GŽãÏ Ú_,[¾níÊQ#ž=Ë©“è÷g¿6!ò—Ãñƒ"Îþ`Ž›9·Ó¬î•1ãß|cÒñ£‡F~qâë“Ý÷V&0põÊåBÚïÚ½G±{ÏÞN:ܲ¾ÓjìÞ³oßž}ûö~ÖùkN›ݳGØ‘ŸêÒ¥SÞ‹ùù[¹¬YøÍqYÓ!ÿ!p¹÷ :RNÇ´sçŽÛ·Ç !âvî ißÎýB$ž<µý‡Mï¼õæÜ¹9r4vËwyOÂkàÛ!!!wÜ_}õ•$IË—/w_­Q£F÷|S}æ<áþÙ³woçÎÝTèܹóž½{ÝL¬]¾·=zô‹žžž]»t¶ÛíZɦ߆…u7™L½{õÌÈÈü3bG¿h6›[¶l¾#n§Sç?lÛ^µêメk—N[c·~£š5Û½{ïâÛµm³ý‡Íî{ëÚµ‹——WHH;-¶÷üÛîë;øò‹Ï{xxôê·sWþš»víéÕ3Ì`0ôîÕcûŽnZ¹¬YøÍqYÓ¡ CPÈjNÇ´s§ŽÛ¶ïÐb»}»¶·<(¯¼ü¢··w—.Ož|æé!^^^yO;>Ö@ÑtWïm‡‡‡¯Zµª}ûö…o²jÕª¾}û®ZµjðàÁnª%$$ÜóMuôÉÃÏŒÔÔÔÀÀ@7SSS ZZЛ—%üýó tí˯V$$œpºäXZa4ÓÓ3œš\»–V³víµ^¯/üFýçƒèW^?bä F£ñ«eKëÖ­ã¦7?!D‹æA&þËjµ&ž<Õ¤q£[ÖwR¾|9íâDZZzþšÞÞÞBoooÇ¥o—­\Ö,ü測yËCPÈ#åtL5jðëÙ³))©¿ü|¤E‹ [”€€’ŽUÕ¶ñžkàa›mk^ø9÷õë×wìØ1oÞ¼mÛ¶åäääŸûj¯óþ{åÊ•Ž;šÍæ®]»:~ÅK’4þü2eÊ®Y³fëÖ­+V4™Lk×®Õ*ÄÇÇ™Íæ *,^¼ØeÏn:Ÿ9sf•*Uòvˆ;PªT©ääd7’““K•*u÷ ñœjDDø‚O?Î[~ôè1!„ÅbÉ?Š¿¿ÿ‰ã?Ÿ>yìôÉc‰ ¿~¬€€€eŸ/9ô¿ý“'M1ê…Âôf46¨?ÿÓM›4Öét·;úµkiBˆ¬¬lí¯ürãF®ö?W‰%Ü´rY³ð›ã²æ-ÁUÓétmÛ¶™3w^£F Ífó-Šûëgw|¬‡0¶Û·o[ɽqãÆV­ZU¬X±eË–7n,¨š6ÖþŒŒ4hPvvv¿~ý"##uŽ9’””ôÉ'ŸüûßÿŽOLLŒ‰‰‰ˆˆÐ–:4***33súôéZ«¼}:ÔùÅ‹òvˆ;ܺull¬› ±±±Á­[ßý@gÎüÚ±CHÓ&?_öUÞò©ÓfZ,–Ý»÷véâ|+xÇíO'‘eyåÊÕ"†~¬îa½7nÜd0üKø;&²·ì­C‡vs?üX»B~»£º`¡Õj]¿á»®]\¼ãЮ]›íÛwȲ¼ñûÍ!íÛºiå²fá7ÇeM÷‡@¯×§¥¥æHå×¥SǯW®nßÞù yþ>oéŽ5ðƶ–Ü£G qÌžÝX½zuïÞ½…}úôY½zuaúß¼yóàÁƒFã“O>ùÝwß9ʧL™âëëÛ·oß#GŽŒ=ÚÇǧ_¿~6›M[zìØ±šÍæ!C†¸ùŸÜMçÞÞÞy;Ä6ìé÷ß.èÄÈÉÉyÿýèaÞ.¨yá?·=sú{ãÆOìØ9ôÑ*Uò–¿óö”Þ}žørùŠÈqcœš¼61rúŒèºõ›,ýﲩï¾UøšöÞÛsæÎ«]·‘öÙ°BöÒ¾‡‡GÛ6Áw0zùrå‚Z´Ù½g︱¯ä_úúĨ/—¯¨ß°Ùæ-['½>ÁM+—5 ¿9.kº?!!í‚Ûv,̑ʯY³¦²,çc;Ÿ·tÇÇ(š¤…{³…ó7ü²b¨¿›z;wÄ5&ïlU’$UUãââ ùwnnn```vv¶ö£¯¯ïÕ«W=<<´~´©°N§Ó^; ƒvk‰¢(F£Q{@‡$IŠ¢8®x;ÖÊñúêÕ«Ÿ|òÉáǵI¹SŸ·ì<‡¤SÇ«V¯“têøƒnfôìsç.¬\µÊé3`ÙÙÙÂëT©äæsÛÐþv¹ƒ(ßY«"eßþß{oú†õ¼KüiÐÒŒç{6¸«Ùvá3[›Ú6oÞ\ýC³fͶlÙ’·‚Ë»“´éZVVVÞw(Ý¿›ªªêÈ‘#ׯ_ï¦ZAã^?nL™2¥ëÔ©½`Á‚óçÏ[­ÖóçÏ/X° NÚeÊ”ŸoŒ‡þ¯B^Ayþ…Ñ/¿ô{ Èï®bû¶î$_µjÕ¨Q£?Ž1bÕªUB£Ñ¸víÚœœœ©S§:–êõú””!D÷îÝ7lØ`·Û¿þúë°°°B®Xbbb¯^½‚ƒƒçÍ›—¿O‡;ë…§×ëß|cÒÌS7nÜвe __Ÿ–-[lܸa挩o¾1‰ÛzoéÎ&ÍEvª­ÝæøÏMÍŸèÞ½+'ß]}¬ð™mµZ÷íÛ·hÑ"GIÿþýßxã «ÕªÝùåëë;}útÇÒ=zTªT)77÷ý÷߈ˆxæ™g:tè°lÙ²B®Ø’%K† ’šš:iÒ¤ü}:Jî¬sÜ® fMùâ¸'îü½í¸¸¸ÛúÄ6Š‚üÞ6à^¹Û÷¶Él0¾JbÛÛ€Ø÷Èí}n{Ñ‚ØeÅZHHv0ÛÄ6 ¶(v ìÜoñ?ý/æëUħ¤¤”.]ºyó ˆá<¥ÚÙ¶NÇWEK²,¿ýÎÔ '……õÜ¿ÿǬ¬ìýû ë9a⤷ߙª}Á¹Ky¿Þ±V†[¶Ææ]t»«á²Éôÿ¬Ùö³#_Ò^(Š’––ºg׎ää«…iØï‰ˆÕ+¿ºûѹþ›5{ÎÕ«)Ç'øøøh%•+W9räàÁƒ„‡Ïš=gBÔ¸‚Ú:¾ØqËÖØñ‘g½?£k—΢+%<„³íE >Z´à£ÿ.ù4ñÄñ6í:²U‰%9TÅNâÉ“{÷í_½f#³|||V¯Y³wßþÄ“'oÙO×.g½?ã•1ãfÉ[¶ÆÖªÓ°fí½z÷?p ^+üåÈÑ~ýÖ®Û¨upÈÊUk$$œèÖû©g†¥¦^sê?##søˆçêÔk®•¸¬æðÈ£{ö…aϾЯD¹ò8 î“%K¾ˆŒŒòòòr¹ÔËË+22jÉ’/ ÓU×.ív»Sá+cÆ¿ùƤãGýâÄ×'k…&N9bøÏ‡DE>#ÚQù‹eË×­]9jij3£g9õýþì×&Dþr8~PÄÀÙÌáÀ ¶éõúÚuꧦ&;JrrrÖ¯[%„hÞ²õ™¤Sÿ]òÙogÏ´h,þxÆ‹öoþ¥Bˆ æ­OÛºù»-o–¸¬æÐ±S·}{w-]<ÿàÁøví;qÜ'{öîíܹ³› ;wÞ³wï÷ß<¨ÙîÝ{<ß®m›í?lÖ 7mü6,¬»ÉdêÝ«gFFæŸ?úE³Ùܲeóq;úùaÛöªU7 ]»tÚ» ({Ðw’k“fY–SS’wÅýù+ò·³I6›MQ©R•½»ãEI:}²IÓæNÍ].-W®ÂîÛ-–ܯW|ᦚÃåK¿WªT933ýÂ…s¿­8ÃIpŸ¤¦¦º©˜ššzÇýÿçƒèW^?bä F£ñ«eKëÖ­#„HM½öåW+N8]~ ,-„0ééNý\»–V³vÇ”8ÄöŸ º)Ìb±h/Ìf-¿m6›Ùì|}ÛåR³Ùl±äÞ²šÃöm[:vêÖµ[OEQ¾Û°65%™óà~(UªTrrrÅŠ ªœœ\ªT©Âtµek¬Áà|®,û|‰ÅbùöÛ #F½°oOœbøˆç:u ‰ˆ¯\©R·Ð^ŽÊGkذÅbÉ?¢¿¿ÿÞÝÛó÷EP‘û˜Å’«ý5Na\ÐR«Õj2™ ßInîß}óÅìß·»[·žœ÷IpëÖ±±±n*ÄÆÆ·n]˜Ì9qîç÷¤»‡õÞ¸q“Á`ð/៖–®ž9ókÇ!M›4þ|Ù_>z0uÚL‹Å²{÷Þ.]œß騡ýé¤3²,¯\¹z@ÄfÛ·áÂùs•«<úÛÙ3=^íü¹ß´BUU=<¤óʘeuâðDøàƒã;{ÆbÉÍÃî•aÞžøÚ丼+-''çý÷£gL· æŽ;Æ ÃÜ9³´Oå5í½·_{}ò«ã¢t:#ÔgNoÜø‰iéé/>?*oåwÞžÒ»Ï*V˜ûçømbä«ã¢öï?PõñÇÿóA4±}ü¸§C§níC:_úýâŽ[µÂóçÎzrèÒÅó].?°¯K×0³É¼cG¬›NvíÚÞ¶]Ç»ªªºí[™pÏÕ¬Q£u«–Oôï¿rÕ*§Ï€eggoݪeÍ5\¶uóálÇ¢ÆmÞ´Áiihh·ÐÐnüÝðLÞ&N•ý”(Qbéâ/Å‚´po¶bþ†_V õwSoçŽØá£Æ,ül»¬X éPµz¤SÇÌp²,¿7uÆöqo¼ñf÷îÝË–-{åÊ•M›6½óÎÛBÚÿkÒÄ‚nsù3´àŸlÐÒŒç{6à6ÜGz½þÍ7&…†v‹ùzÕ¿ÿ=ÅñLò™3¦º&9 .۸5å‹Càžà‹; ¶± ± ŠºÛ»%Íñ…Ù(¦ØG¿Ì¶ ¶± ˆmˆm@lk4h0oÞŸ_F2oÞ¼ h¯%IºûþÜ“ÞøGÇö‘#GfÏž™™)„ÈÈȘ9sæ‘#G´Eªªr0(B±-„hÕªÕÎ;…qqq-[¶Ì?Q^»v­Éd25Š‹‹Ó O:U¿~ý€€€o¾ùF+IKK õððèÖ­[zzzAÃÅÇÇ™Íæ *,^¼Ø1ÖÌ™3«T©b2™Ö®]ë¦Ã+W®tìØÑl6wíÚ5555ÿTÞýjP¼c»M›6Û¶mBlÛ¶­M›6ù+DDDÌ;777wÊ”)Ç× _{íµ‘#G®_¿~üøñŽ’èè謬¬Q£FMž<¹ á†•™™9}úôÈÈHGùÅ‹bbb"""Üt9hРììì~ýúåm^ÈÕàÞ’îÍBÌßðËŠ¡þnêíÜ;|Ô˜»¼”-IÒ‘#Gžzê©Ã‡7hÐ`éÒ¥M›6Õú”$I{ѹsg??¿—^z©uëÖžžžZÃÀÀÀÄÄÄ€€GWåË—?þ¼Á`P¥J•*.\Èۉㅃ,˃Á±455UëÍQÓe‡eÊ”IJJòõõÍÈȨ^½úÕ«W:w¿ÚEPÒ©ãU«×áYiPì Zšñ|Ïz¶]·nÝ .œ8qâ·ß~kذaþ Ë—/OOOïÑ£GÙ²e<¨¦¥¥•,Y2oµääd£Ñ(I’^¯¿|ùrAÃ]½zõ­·Þêׯ_Íš5ó–çý ÀM‡×®]óõõBøúú:.’;äýËÀåjpo=èØ–$©U«VÓ¦MkÑ¢…^¯Ï_!00pÛ¶mééé|ðA=´B??¿ŒŒ §ÜµZ­ªªªªj·Û .44TUUí»ûsÙa@@@NNŽ"++«T©RNMò¹ËÕ xǶ¢M›6+V¬pùƶ6ÿúë¯ C@@€#ƒƒƒW¯^½oß¾êÕ«k%={öLHH°Ûí‹-jݺuAc%&&öêÕ+888ïÏ\rÙa÷îÝ7lØ`·Û¿þúë°°0­Ðh4®]»6''gêÔ©îW€{Ëðà‡lÛ¶­Õj-(¶.\8|øðÁƒëõú˜˜­pÆŒ}úôIKKûâ‹/´’èèè'Ÿ|rûöíµjÕZ¾|yAc-Y²dÈ!©©©“&Mr¿V.;|ÿý÷#""žyæ™:,[¶L+Ôndóõõ>}ºûÕàÞz ·¤áoÇ-iPLý=·¤€;Fl@lbbۀ؀ØÄ6 ¶ ¶± ŠElõÕW’$ô]’$=ø]ð· @1ˆíU«VõíÛwÕªUìzŠtl_¿~}ÇŽóæÍÛ¶m[NNŽV˜’’Ò©S'ÿ… j%Õ«WOJJB$%%ÕªUKd6›+T¨°xñbÇ,yæÌ™UªT1™Lk×®Õ O:U¿~ý€€€o¾ùF+IKK õððèÖ­[zzzAƒ@lÿÅÆ[µjU±bÅ–-[nܸQ+|íµ×ž|òÉ+W®8p@+éѣǖ-[„[·níÝ»·bèСQQQ™™™Ó§OŒŒttxñâÅ„„„˜˜˜ˆˆGo#GŽ\¿~ýøñã%ÑÑÑYYY£FšjŒªªw3Ø Aƒ:tèðÜsÏÍŸ??..N{‡»B… ‰‰‰¾¾¾çÎ{ä‘GTUݺuëG}ôÍ7ß<ñÄcÇŽmÓ¦£Y– ƒ¶’$¥¦¦h¯µÂÀÀÀÄÄD­PS¾|ùóçÏ EQªT©rá—ƒþCŽwÒ©ãU«×I:uœSŠ—AK3žïÙÀðÀÆËÍÍýî»ïbbbžþy!„¯¯onn®‡‡Grr²¢bÅŠZÍöíÛ:Ôb±9r¤uëÖBˆ«W¯~òÉ'‡ÔeZ!IDAT>räHÞ>óƳ&--­dÉ’yK’““F£öZ¯×;  è{pÉ7oÞܼysõÍš5Ó®„—-[633S‹R­¦ÉdjÞ¼ù´iÓ‚ƒƒu:"44TUUíê·ûQüüü222œ¢ÝjµjƒÚív­0ÿ ÛZµjÕ¨Q£?Ž1B»Ÿ¼OŸ>Ë—/·X,Ó¦Ms,íÑ£Ç[o½¥½±-„HLLìÕ«Wppð¼yóܼzõê}ûöU¯^]+éÙ³gBB‚Ýn_´h‘6w/hPˆm!„°Z­ûöíëׯŸ£¤ÿþ{öì±Z­S§N]·n]åÊ•k×®íXæééÙµkWíÇ%K– 2¤ZµjÕªUs?ÐŒ3¦OŸÞ«W¯¹sçj%ÑÑÑQQQ^^^sæÌY°`VèrPЏzKþvÜ’Å”vK7 Ø ¶ ¶± ± ˆm@l@lbÛÛ€ØÄ6Ä6 ¶± ± ˆm@l@lbÛÛ€ØÄ6Ä6 ¶± ± ˆmˆmvÄ6 ¶ ¶± ˆmˆm@lbbۀ؀ØÄ6 ¶ ¶± ˆmˆm@lbbۀ؀ØÄ6 ¶ ¶± ± ˆm@l@lbÛÛ€ØÄ6Ä6 ¶± ± ˆm@l@lbÛÛ€ØÄ6Ä6 ¶± ± ˆm@l@lbbۀ؀ØÄ6 ¶ ¶± ˆmˆm@lbbۀ؀ØÄ6 ¶ ¶± ˆmˆm@lbbۀ؀ØÄ6Ä6 ¶± ± ˆm@l@lbÛÛ€ØÄ6Ä6 ¶± ± ˆm@l@lbÛÛ€ØÄ6Ä6 ¶± ± ˆmˆm@lbbۀ؀ØÄ6 ¶ ¶± ˆmˆm@lbbۀ؀ØÄ6 ¶ ¶± ˆmˆm@lbbÛÛ€ØÄ6Ä6 ¶± ± ˆm@l@lbÛÛ€ØÄ6Ä6 ¶± ± ˆm@l@lbÛÛ€ØÄ6Ä6 ¶ ¶± ˆmˆm@lbbۀ؀ØÄ6 ¶ ¶± ˆmˆm@lbbۀ؀ØÄ6 ¶ ¶± ˆmˆm@l@lbÛÛ€ØÄ6Ä6 ¶± ± ˆm@l@lbÛÛ€ØÄ6Ä6 ¶± ± ˆm@l@lbÛۀ؀ØÄ6€ÿoï΃£ªŽ¿M’Ö1ªS© r8*‡Õ"§DE@ÇŠƒŽÕ­åöër¨X;*ã”¶3:j=‚€B@@™@”AŽDÌš Ù}ýc3+àØÉ†|>ÃûŽÝáý8¾ùí¾}@¶@¶Ùddm@¶@¶Ùddm@¶@¶Ùddm@¶@¶ÙddmmC² È6È6 Û€l€l² È6È6 Û€l€l² È6È6 Û€l€l² È6È6 Û€l€l² È6È6 Û Û€l² ² È6 Û Û€l² ² È6 Û Û€l² ² È6 Û Û€l² ² È6 Û Û€l² ² È6È6 Û€l€l² È6È6 Û€l€l² È6È6 Û€l€l² È6È6 Û€l€l² È6È6 Û€l€l² ² È6 Û Û€l² ² È6 Û Û€l² ² È6 Û Û€l² ² È6 Û Û€l² ² È6 Û Û€l€l² È64Fiǵ÷æ/ó 4€l‡ah¼ d»gï,Sm¨_>ÛÙddHvi†àÿªõ¹í±G"‘M…ëëØ¡MÛŽùïF݃#Ûõ£q~çÓ9Dz[ãüvq$1ÛÀ5'Î4‡å³mh0ddmh´œ’À ®ë¥Ý]¹bi®l@riÓ¶ãû¹ÿŒ?®ü¾²¼¬"‚Êʪ®—vkˆåö&9@’Ææ°—"iä×'ù2[dApöïÎÚ±m׮ŕ•U••UE;ŠèáÈ6@26{ш1/wϪé6m;¾—5H¹†­_mÛ·oß p ² ŒÊ Okö«ZÍž74»îgåå­zËmç_Ð塇ݾ}Çÿõ‹†5ž_mÚA«ëŠlŸ}¶xÀÀÁí:\8`ààÜ%Kt°s^{cÊÔé² @M…ëä¼AbÂovUñîÜ¢#Æ8?¿`ø=#n½eèòÏÝ1,ûyíõ7çö´ôôf‘”#^RtÍÚuãxø cWç-7nÔ˜16l,½>ÿ|ù;¼üÊœ÷ÿûÁsÏÎHMM­Ç”m€†áöE9uß籬¬¼e‹‡ÝôÁûïôï߯iÓ¦ƒ®X^^‘X?bÄ=éééW^‘U]]]Óþå_\{í5]:wš?ïÃøšyŸÌoÝúœ´´´+¯èûqÎ'Éßì½{{ÆiW ¼<þ«ß5}ç¾þöÊÏW¯ÍËÿfëŽßœÖrð»¶ÕzniiYffFb±e‹%¥¥6{É’¥W÷»ªY³fõ{Œ¾· ŒoŒÇä¼sÔ{3·hÞü»’’ÓN=5¾†aEÅžŒŒS‚ øî»’7Þ|« `ÃÆÂƒ>¯ÍÌȨõ"§œrÐô´¤ô¼öÄ×ïDóXš½u˶X,vÆY§ŸqÖéA¤¤ü4;MI‰TWG¿Ü°yîëo¯\¶ºÖ—¶333öìÙ“™™™¨x󿙉­ëÖ­qÖóOM~zåÊU;_d¶ À›}Œºtí¼pág‰Å¼¼Õ×ß0$þ8{Ø]ArÃìYÏ×ý"'Ÿüë={z9##cCþêM…ë7®ßX°&™›½íëob±Øëc(/­Xž»2oùÚC›Á%—ü~þ‚…‰Åù ^|q×Äâä§ž ‚`ô¨‘Ïÿ}Vñ·ßÊ6µ›]PV2 çø'ÜÓºv?êw®²o»uÚô™ŸÌ_¸oß¾  zäÑìÛÿß´eËW—÷éÝ¥s§9G;·¼KçN~øQ^Þª¾W\_syŸ^›6o‰F£sçþûCnNÚfïØ¶+väïwí..YýÅú¯7oË[¾æ°G»{øÓg<»8wÉþýûç.™9ó¹áwKlmÒ¤IM›6}ø¡ ãÆ?¸ÿþú:Xo’$W³S^PXPV?­MÛŽÅU?´ÏlqÔçvêtѤ'Ÿ1ã™»ïÙܲeËìÛo½yèMñMS'O5z|iYÙ=Ãï¬ûEÆ}×Ý÷–—WLŸ69¾fÂø1÷»té²ÖçœóÌ̧“pÐV,Íízi·ž}»]~UÏ&MÓµÛ‹6æo*ÚQ´&/ÿH4mßS&Mœ8eÓæÍç¶i=mÚäÚº[«Vg¾îÚÇŸøä«—ƒ¼”»7‚Þ]óÖmþÁüâZŸÛaó—ùÇží÷²%š}àÊ⪎zVZRùtANö#ëþ ·iÛ1 ÃcŸºçÜ=ûv˺ºWjÚOÀ‡±p×Îâü5vn/*XW˜$!LÇõ§yÓ+åÃ^`¶ DâÓëCÿC/®ú¡ÖEÓ›Àþ`#ºøœ;eõïv—†±XiIùöm;‹w}{Ôf7”Ñ“m€¤+÷1¶¼Ñºîr7i’ Ãù~–’šrà¦ãöä$Û ²åÔQîvÎMIMi wÔ®›3É8Ñʽ!ÿ˲ٲ À‰YîõÐddmh´œI@=ûtAŽAmYj"‘ˆAmYB¶8N®”bp~ANIÙddm@¶@¶Ùddm@¶@¶ÙŽGä¥Ü½A,Þ²ïÐmi©î õ£:ÖZsÙ9'ÕÜo;#=%‚Ô”  ¢± .¨O©)A±0ˆÆ‚0¬ sM¶Ë+cñéu³´HŠ96Ô·”H$†±h…‰ÙtM¶¿ÿ1L‰©Ñ :zo’Du4¬ŽÑX#¼&Û?Fãa¬"‘0ÕŒêÂA°?Fà <(ÛÕá{· žE"A­yôÿ Ç`Å1IEND®B`‚kildclient-2.11.1/doc/C/images/pref_sending.png0000644000175000017500000007164511405233117016216 00000000000000‰PNG  IHDRNÀT çÀsRGB®ÎébKGDÿÿÿ ½§“ pHYsÚk¥óÎtIMEØ  v÷•¦tEXtCommentCreated with GIMPW IDATxÚìwxÅÇ¿{¹ô„’Ћ -¡w$ Ð{“&MìT+Ò; ¢*Â!ÔP”"=€RBïE¥HBúÝíïÜmv÷fËŠð~ž'Ï]nwggfß™yç}ß™å¢>] 1ß÷­Ã›ÍfAA¼Ìx ðññæ z8vô(Œ¶ƒ?ö«Ëûúù¡páÂððð Ú"‚ â¥Æl2áïþáÓÓÓ€­8ýد.Œ¼AAHKMEVV, $–'Žƒp• <σã8íOÇzÏw =h}êã´ Ê<Ïö/û²ßa˯øYÞlÇa-§ø\Û1ù5Âs²Õ ³h¢kEùç\­µKu¦Ç1d ¢ç,®{N\/CÎwQÙåõÄ Ò´mé±¾+”ƒw¤¬Zi)”Qž?=çÏVå<É5:ÊÁ«ŠCÎ}l犟‰ü<‰ü1êYI¦eÝš†ŽgÕ§‚’Éj׺”!FŸlaɪ%ÈA¥Ii¢ËªOGûk‰’Íh¼HþXMVûáeé*aò‰:§s’¡K'•õÛîï•'gŒ:¬ôĺPjZ‚ƒƒ‘–š ³ÙîØ±c|åÊ•‘žžŽ¤ÄD]ƒ¦^åäYZô<½V'N¡lL! ¬JQlePj¸vŠ”LÒ²Rñ ¸’•ŠcXµ\VžœUа<ÙY”ÊÇR½V6G¬JJ -kÆÈó<Ó*¦TnÕ£¬¼v*càg)QrYd*¦*Ê™’EHmÆ®5¹c°Vêlí¬N Š’R¿eS–”JÉuâòèx6š&«5‡Ù®Uh—­Q* Œ’¢&Wš”ÎQ,·»-M rå¬Ò$V´õXôxxù1†,*öG²úJMIÁí¿ÿÆÝ»w‘””///,T!!!ð÷×7~)(ð¶´ïݽ‹¤ädx‹Òö—¥í뻬M’¼ß»‡¤¤$x{{£`Á‚BÞyr;Ox{{ãäÉ“0&&&ÂÃÃ&“ÉuEÈÓ˜~ë)¯ÿSV¡ŽvÊveÏî5fÅ’ÁWfu’ ©Ò,[2sfÌRlåSsMˆ;mIG&7íÊf–¼ÜR¤×tïàyÌ´5Γ+ ,EÊ®£V±´(ž£ ©¹¿8™Pqæ-îpÏ_nª×R „ú‘¥ÉxmåµYYlò¦Ôi2f½Ìz–ÍôÅVÖŒŸ%«ò|ðÖQÖyv šµ®-¢| Ö1ÖsSP\T]y2åQb]ÒpµAf9”×­ðÝšg%·Ó2¤$ïr7™W Ý¤MÖ¯sòg+³ø²ÎQSšÔ¬òîRš\qÏÉ•&ŽÑó*ÇXí€g¸¯U²²L&\»z÷ïßGžµÊ‡¼Þ䊆–¤ênõwâ¾)µ…ø^äìœÒyz”Yy¡OJiâTšä\–¬òr…I!ÖNR·"¥”9Yf¸èÄí<++ ׯ_‡@@¶ÂäïpœÁ€%J -5W®\ÁÙ³gñꫯÂÛÛ[±íŠÇ¾¬¬,ܸy¹re+LjiŸ9ƒ°W_…}hl~ZÖ&“É„›7o"WîÜ×Î{X˜P/Jˆc¾¶Š²Åhe>** 6ÄW_~iw-bÄölYÏ@$3’Y-ãXdòj±¢’ÁM$G¬:¶/žT‰e·XrêU4(ý‰óÀ\‰d=‡õ§t¾RÚ¬zçÕ–y¿ ¯'V½ØÕ¼ždÏÀN®YùÉ\¾yQý[XçÚ:Ñs°XAˆÿ„pq[õ•‚,Š•9Qy9Y,2%c¥¨¨]*µ[Þɾ@­o«ÿb¤§v>§2>9š¾DO†d²Í —?;›Ì¤¤¤ ÀßAyƒ‘žŽÌÌ ¦‹=#=ii©È—?‚ƒƒððáCvDŠìã”8”vÞ ¼xðð¡tì•M®ô†üØõ7²<ªM®?~ŒÀÀ@å ÂÅ 0nüX\»v]rîÕ«W1vì¸pá\v½ä Æ£GTu 1F½ñL–– ¬‰II˜2e –.]ŠÀÀ@üøãˆnÖŒ©ˆñz"êe¿—(Yðï¿ÿعõââŽâ«Ù_á·_Cbâ#œ8qðçñã˜7ï;œ&žÕ² :8«±ˆýf;ÎIþý$qÍÙ~ç$éf×`Èé¤ œx°É¹·DïBN¾XiÚ̽PÌSÎq¡œÖ²±âßÄ1Þ9Ž‘¦µLÖëŸh¾yœu±ûYæ­áy8 ΋è{Žû<§,`ä²|Kä€cÈxQ¹”ÊžcE38IÙÁ3òÂÙ[—Å¿ñȱ–Š—’|ƒ8ƒb¾!Î7£>å²b“#ˆÛ(m^HÂÄÓVÞk‰ÈÕÍCxÆ|ø0æÌ™¡Ã†¡VÍZ’´såÊ…÷eM[ÉUù$ƒÁ³' ¼÷U11X³z5~ßó;,X€\»zƒÞ~ àãåá#F W®\H¸Ÿ“Ù ƒA3VÛ¨fö’gʦ©/^Y&bV®ÄŒ™3q÷î]DEFbæÌ™(^¼¸¦)Ó±jÇöyåÊ@¡B…픬˜˜tïÖŸ}ú™ð[\\ zUªTÅúõ±Ì• Ó§OÃðÃ1)c Úµm+¸m ÓéÓñ’{9ro¾9UªTElìbšFÚµk'ì•+V ûë=ðé§ŸÁ`u¥ÄÅÅaàÀ¨jK#W.L›6ÆÃkb~øñL™: Å‹ÅÏË–aæŒøäã°be Àó8uú4úôî…|ùócî×sQ><7nÞÄ‚yóЪUk!ßú÷CÕªÕ°qã&äÊ• S§NÁСC0eê4´o×ày :§NÂÜo¾EýúQH|”ˆÃ‡á«/¿Â²åËÁó<¼|<æ¸ì2Y-8ÇÁ úÎqÙ>cÛ *|W>v5¶ÅQžTºzãN´fXJA£Ïj‡âroöÓ,›ÝýÜóGqÕ#~‰wRNø' ˬm„‰„ÊĘ哯S PsÅq,+kq„ÌŹ#†I^Ï:Üxœ–k™åÖ´;ß °Ý€ü|VÛàeê8;^Ól6Ã`ð€ÑèžçqûößX¿~-Úµë€bÅŠ çݺy±bÑ¡C)RžF#<½<‘™™ k0·<ÿf³¢´mܸqÆEzz&Œ‹yó ˜u¼çy>;mo/dffÂÈØDûI)Mâgd6›aå½[÷×qøð!$$$àã>Ĉ?ÄŒéÓa1™PºT)tëÞMÈ»——'2ÒÓ³WÚi,pãvíÚÅ7lØ÷ïÝËvÁ©öøñãhÓ¶-úõë‡}ûöáâÅ‹(X FŽ…Î; ÚµÞÆ-þ¬T©"àÔ©Ó‚›ã‚5Æéì¹³ø|ôhtëÚMbqZ»vÂÂÂ$·oß¾8vì(Ö®Y‹°W_ÏóHLJBD½×ŠM›6 ÷”[šl¼ñÆ8vì(Ö­]‡2aa€ÄÄDÔ«÷BCB°ió¯Ç¡‚ÕZ´~},Ê”)#©ì7úôÁQQÇ!11¯½V¡¡¡Ø¼ùW‰ÅiÍš5(W®Ô–«MFäÒ “ æõJ¯¥Á㜓1KŽ^ã¨2¤K1b)QN¨ Æzd†<¨m» ´ïޢܱâ‹Ê’ÒB¹¬ñŒx@­:SÜãÉ “fõÊŸ™Îý–äqL̶, ¹PÚØRi&­ý322eÊ‚Ÿ¯ov(ËO ±iÓFäÍ„q& H‘¢¸}ë¾ó9=z„6mÛá¾ýÀq’“‡€€f=effÂd6 i¤eà °ðɽlyNN~ @`@€æÑÝÛØòn¶˜%yÿûïÛøbôh<|ø‹…GpPÆŽŸ„ÂE KóÎóð-|ãéé‰|ùóc÷îÝÊ'V!¯ß¸X´hQvBF#~ýõW.\˜@­Wig²bÅ Âw„……aÊÔ©hmµªˆB©R¥ìòŸ­htìÔÑîÞ7oÞ´ß ˆÑ!ÛÒèбƒ}·nÙ壤5â4O«¥a͇¸®ÂÂ^òåk}è¶`4Žãð×_È~WŽÒlþôéS€víÚ²ïi=¯lÙ²8}ú4zö섆–@ÍZ51`À@*Tˆ¬(ñW;¢@ÉwVS KëmA)Ti•™ü»¼cÅ`ØmÍÀZI%˻֮Ár%FmC<ù*I µ¼S6T—â«uÔÌUZ,W¹<YÛÉŸÒÖj…ªíã€b­¯Ç)ìL®TNÉÄÖ†‚rÄRx-ÅJ´U€ä…\2Ð3¶áÕ”3±R#·“MJı~’I‚¨Nìò'ZÀ¢´G•Dé€t‘Š#ßîR˜XuÏ+¬X÷-<úɋbÆ«»èbKüK—.ÅÇŒ´Œtœ½}i™(Y° æÉ‹ûI‰(˜'¯öŒYÄÉ“§Ø3†ð Åt8ˆÀÀ@{ ׺"KkÃ<8xð†ÚÌÔ ¢:t8[³‡ýry‹l{wVڒ΋Չ3Ê~äH%JŽø¾sfÏÁì9spðàÜ¿çÎŹsgñçñãXµj5ÀqÈ4©™¤e)朧,e1NiÖ§Œ, Òž³'û4]Œq‚5ŽC‡aà$Ç M"Xq9œzl‹RŒDq/Ì|ÛbL„X Q|$Èš®AlQ³ÍRŠqâq$œ¬Î ’oQX‰he‘B]hÅ8‰c·ä@+$É?oŸ½ùæ­ñhÌ85ÑM "9ÉYüb3––ÛúQ ³Õ-qü’5 gÈŽ+3ˆûE‘òb0äÄ$ ý€x¿9õX!^©MYåÈ ]ËiâØ)í!ûb[¾9YÇÅq°_M,Žâ¤N,=1NâX!Nä«4éð²g&ö¨qÒ6dkW¢>*»åÛ`mõ\Žr*ÄÓú"—“¯ìK­u"Ræ ©Å—WØWNÜ÷(XŸ|ö9æ}3II‰XúÓBÀ#ä•âxûý¡ÈŸ?¿(>ЇÑÓ 8ñ3ròì·KK|¯#‡ö£MûŽ9i ºösd)K¹®ê£×wïü‹µ1+‘;0 » Zx¬ŽYw Dþ$õâé©K%Ò§8Ù2zõêá³O?lþõW|7oŠV(½7.ブíP±L(öŸ;ƒñ+Fç×"Q0O^§–êÑXÙ«Šˆ‹‹ÃñãÇP¿~]æ=ùl]) 5·/[åfKãØ±£hР!3ö‚µ'ÓÅq¨R¹2>Œ¸#G!™ÍÚ”ˆJ•*áÈ‘#ˆ;‡F 1—ïƒãP¸hQLŸ>ššŠß÷ìÁðÃqþüy¡¬Þ|ü³—¬ Þ‚‚ȱbž a€2<1Nz^9ñ♞J ÂPª¯ÿPŠ7ÑéÎs¹nôœþ¤îõ„b¬˜î8×°žËͦ¹»ÒPß 7£sÅZz•½¼V%ë +K³ ;`U’—OÈ7£(m)À)mXËÚ>…Ï™XIŸ¹ÁΗ­M‚‚ƒ…;šL&˜-a³J%ÅÃlá…´ë7hˆ??T¯Uyƒ‚E÷Žãq‡Q£viÚžžŠc­+¯PQÚÞG~ޏ^$ÜDz%?ÁüR¬ÚtèŒØu«ñ89 Ë–ü„>ýÞDPp°w_£›'øëÄ ôìÑCÈàŒéÓÑ®gÄüyëE¡Â+¡€ᕲ+_&Xz:!Õr•Æm;gðƒÑ@̘>… FÉ’¥pïÞ=ÄÅÅaÕêUøyéÏÌF&v <ýû÷ÃôéÓQ¨P!”*U÷îÝÑ#G°zõ*üüó2õíI… Ò8lKcéÏÌ}},`o~6tØpôéÓ&LÀÔ©SQ¡Bܾ}ß¿“&OÏó2d(úõë‹éÓ¦¡ˆìž«VÅ`ÙÏËÀqôï‡={¡Zµª D€Õª^¡‚4ÖÁê*´0\ª;‘+ÅÚ8¥ç:žÑx J¯Ó€òfJñ>¼Š<ª*æ;H«u"œÖ»ãT^m"SÚ!›éÖÒxy©Ý††N¾.ÅYÅÙÕëcXTâ§ä.'¥‰K1‚RlË-­¢ i8 ¯æáu^«+ÅRF÷»b·hœ«[‰vBYbõQÆÿJ{Z ç(¼ÀXìfe¹ë”$ßM_¾GœMmÔÔÔTÁ£AÁùУw?üc7êE5’(Mœœ £ÑÞ^^Šî3@”vÞ `4iÞÒ®¾ƒ‚¥¿'''Ãèa€§u(=o¶[PQšy+‰Ñh”ä=þÔ_ðôð@±¢EѾKäÉ›} ºU¿ åñcœ9u !99agu·)N×®_ǽ{÷P©R%¡0… Fç÷ÞÆÁ‹ç°oË6t{- ^^^€úᕜ,ÑΕ Îé DÕ|§€*U«â矗aÁ‚ù0`?~Œ   Ô¬QÆU|ª¸ÑU­Z?/[ŽïçÏ“¦Q³†ZÓК­Wµæãûï ÿþvi( v®9ëy+VDÌÊÌ[0|ð>’’’‚·ßyG˜EU±æ{ÁüyèׯŸpÏZµjcø°aB½ýö;X¶|ÆŒ¤¤ìíZ·nƒ#FhZÿı bk—%J×Ë„YÁ˜×q*±TvîS­=\,k÷gˆb2xÆ (éÄ»AÛ–ÎÊ>Yï'ï=ÅR„, AÀò:ïD.·’ؽkKå53Š«ø¹Ëê㌂¥à«¶zJ2ËÕ¡<žG¬œØmɰFÊ゘¬Êž=ä® –ÌÈ÷Tb)I2™êG´ë<ëåÄJAó’ïŒx)ÖùÜST–äíAÆóåuÄSÉ÷yR}÷¢LŽäª*¾RbÁ²?Ç`0ÀÛÛ=„¯¯¯êÅ_ Añž}íòŸ••…””äË_@µ= x{yáQâ#»´•§­¤Øè±2)=jž*yšÞÞÞxd­—ÊUkÀÛËeÃ+"Wî<€ë5TPrq+Æ.qêVTy›‘Ô±AÖÜm«WaÿN7J“­l¹sç†Ùd™3g‘/8 ’Ä/effâöíÛ¸{ç.ÂÊ–E¾|ùì”–»Ž+wn˜LÛ¦4éqË){ò±_ÕÚ$—y뢫<¹sÃl6ãLüäˬš÷2¯¾Š|V…O/º'‹Å‚ßÿµk×¶;V½dÄ߸ŽîoôA?,_ÿ‘<› IDAT¾½zõBÌÊ•ðôòŠå.ùÖóZï©Ñª\¹KCr¤Kña,G×R 47ÆrWÛŒ^u`a½µ^Ã…e÷Î(…÷lÉMÉÂë#8.[ ,YjÁÈvÀŒÏQü.tÆI±KG®WiÌœŽÎL5 Q‡YšW{^a»µ JV¼«¾•‰›EcUsÑiíŸäØcÕŸ–RžTË¢²‰§fʶ³Ðz6ÐxÎz]¼VHƒV؃Z^Uvx®Ì¾UÇ‚ymçÔ¸^ÒÖD¯ER³ÎëQ¬”¶"êY@¯%óâmHdJ`Á‚áëë‹«W® þÌ.ð&³ð0PªLiT¯YÈÌÈ`–…—Ë®uK„‚ Â×Ï×i ”.]*;mdffÚ»Åc>Ã…¬ߥ¸¸µï Xv,XÈŸ~¾¾¸zõ*âãw‚ç!É{©Ò¥P­F  #=Ý¡~Èh¯Ús÷î$&&¢WÏvç´ªQ‡/œÅ¶¿Žcâø±È+~üñG|½âg4oØ•BJdƒÕüä¶íë9(žk;fïiæíšž½%ÊþÜÓºvzÂwáƒWv^USš±ó|Ž@* yae³?.½žNîe­{^T'Ò†e8iñuÑj^ñ»¼‘Ú¿ŒTĪô]ȯ¦"¥°[4}ë¶×žØÝG¦”s€…·H_ENº‹ ‹âX(‘ Ißó`­dØÉ²ÔšfK‹·ËUN§mß1Û½\>Æ96Ÿ¯Ë!¿§¼b-*’#«/µÓ’7ižxµ—b‹Ü[9+ËÕëG~ÏËž‰HFØù±°eM28æÈŒ½?çwÁå$–^êFädÄî¾Âÿ%ýjs_,^º§ÇÙ¯0û^Þ߀ٗ€Õ÷Xl“"^Ò.%çqbÅÌë ÒgóRóˆ¬}(÷Ù|ŽÐç”K&™™È;7ª×¬‰ÊUª ͪøøøÀÛÛƒ¦¬,¤¥¥JdÝÖŽ8^œ§œ±‚çydee"wî\¨^³*W©Œ´ô YÚ²²²–š*)+^bYRcy…z+S6—²ŠLŠÏå-9y¯QU*WFZ†,ï‡Ì¬L¤¥¦:>yˉqº«㔘˜ˆÜ¹s³ý„YYøõx.ÿó7ŠçCFF:¢*VFÉ‚…UÝнž ~O^AógÅB)ú`¡µ»©Ü¿Ï)ªîÚÌ<ÆÙ DœÎú³™€Å[{æË1;¹eȾna7°vÚÖTS88`‘bÔxV%%™sägÇÒ°·R)™°õ-†+ÙZV‰ü0¬.j'ðP½N¯›O¯UÉQÅÉÑ´´ò¦T>É@©×âé^I¼këÝdª&(¹qxEë‘;w¦!®q÷¯ß¢¤}oÅE÷g*îxùóå¥u­ËšÈÃî^ZíœgÖ‘ö¸b0àåå O//xxÀ[xdfe"###gåŸÄm)­wµ`xzyÁËË Ö .3³2‘‘žžón…`o=‹ºÔÆw¨¼6IS§`0xÀÛÛËZ/Fð¼™™ÈÈHgÆz)áééeã¤ñÒhäÊ•[ñ¸—Ñík½¦ËRËó*…• ’êJ Ò9ì-šr ?{Ûuñ`ÌZ•Ì:&]5%2‘óÊËó™¾’õI<»GËŠ´5VÚï -R6xyYyQ[D×q9¶‹hå–âwéþ#¶:Ívï*çMÒ xeó¼Ýl‘Ñ!Ú¹bût…¥õM4x埙nÁìÍÖDo͉!Pp•HY‘²¨à’Ñr')©•|މRòLµ\,ò¥ÙκÛôZÐSó¡ºRJÅŠÆËfHöçÊëSjP[”4–+]Ú^%ƒ7Ô­fv<'Ýgªú‘®8;‹£Ïbõ3¼…g¯UÛ®CÖ ßy^b­RêÛxYÌ'Ÿ³c%,‚EYÚçÙþ‡mBj‘Z\X}¢];—Ô‡EqÒÈR0Íf ÒÒÒnµ8)Æ}ñÒ[¹•Æ<[Ú¦Ô4¤§¥+,‚äÍ<Ï“¥bÃA;TŽÆ"eåJ]öÌf3RSÓ€Ô4¸ÏvÕÙ™.¤f~Æ1aÌ:&ß§Dl˜³X¤{㨥o‹ÏPxa$ÏȇàK70ƒ!{S,Æ7ŠV(‹E¸N¤k“>A11p°ðÖ•²cÙætNص–‡ômÛà¥æ[Ñ"œ4 œ  q·=KNC]š³ã±µ!ÊÒÈ‘W¼ø–bóŽõ:ƒ, Ø+K°.³?fÓÛ ˆŠåJÇ lÕ–ysâ4D±k÷Œì56vï(d䃙¾ì5œÒy×#Ó—´y¹5ÒU{¿ÏqU›qžØRm`¥!ûßn¯:±ÈYÉ(·\!–äÅÚÿiØê’ËYeisÉw×ûð%+ØÀI~v±ãçÙV©ñ iˆïÍKn*~¦Ö£g]ÁÉçÈ!ŸãJ·»·ÌÝeà `Ý¡_ª` ,ò:Yé$ý“àfÏÞ¢Á¶RX5Ê‹W*['“k/.|Ïvqœ!ÇÞ'>O4Áæ8ñ$Kdõ1—­Í2•ÓgÚv1ÏIC2aI0édÞ Ê3Ï[`€m+ŠœúâlÇ8ƒ01È,=Ì* Y6@ºogýß`‹Ýõg™'H¾hÌÂÚ»‘±i«+Þ&²­V®cê/¢>Â. MÅI¦¸p*³|¨Û쮲=Ó%,—å´]V°_Ϋ¹—|»Ù<£ƒã\KJçç¼þ‚ÑI²\|Pvc±Î³{—•l¥–xÀדd/HßNαґ)¾`¨Ý*#H—xÛ¹ äed ½nñ=™ €sÀ!§S®q;qNÞÃ7X²ç$œ ׺3 w¬4t: Wè9}ogï«¶C¸Â=t­”·U×1÷SÈÄŠ¹JÄ‹\äý˜¸üÌMJåýœ|·qyvª‹ýñNåò— WƒÌUg_zÞ-'_UÉÚtU©Œœ¦'C}âôDëØ‚Gugv=– G¬ŸŒ]ÿ5Û™¬\LÅ)-5AA/3¾~ö±Ýª‚ ‚ }âDAAŠAA)NAA¤8AAâDAAŠAA)NAA)NAA¤8AAâDAAŠAA)NAA/Æœ¯¼õxž)U¦üK[öËÏAO^ö)Qœˆÿ‚Òô2+¥ÃÂqéB< AñÌp»âR¢ Õ*ávöîÙAòEH¸~õâV®_½H HqÊÔüƒjõ Q/²ÑK_$_„ˆ¨ÆØ·wç6ïd=%ˆÿ&NÄŽC÷SÞ ‚x&'žÏþ#‚ ‚ Dz‘H?"‹AA„NHq"‚ ‚ ʼn ‚ ‚'B?þØnÝ{¡|…ª¨R­6Þyw0.]ºüÄï[:,œù ‚ ^4žú˜»vïÁ˜/&`ü¸ÑhÔ°=7ñó²_pàÀ!Lœ0%J„"+Ë„ÓññølÔ z³?š6iüTòñ,–XGD©—MÏ’õ=¿ïEƒúQÏôª-¯——Ñ`0 ((/¢"#ðî;oÁÇÇ›ÕA/¢â´eëv4iÒ[·í ÅÉÌžó ~ß½ þþþÙÖhDÍÕ1cÚdôìÝï©)NÏ W÷óù|ô¸ç~O qþ,™™X»³çÌŧŸ|H€êŠ ˆ§ÀSuÕ%&&"þô|8|NŸŠGbR=w=Hƒ¿þºÅî÷ÐÐìÿc—ä·¯ç~‹šµ#PµzŒŸ0f³Y8V:,±±Ѱq4ÂÊVDÙò•±mûÑ3LÂg#G£Z:¨]7Ë–¯¤-wÛ©¥_Íž‹ªÕë fí,üi1¹út?o>>>hÙ¢9víþ*„êŠ ˆQqÚ±s7""^C@@êÕ«‹;wKŽGD5ÆÆM¿¢M»NˆnÑ“§LGRR²îãðÓ¢ÿ¡U›ŽhÞ¢-fÏùF¢ܺu: Í[´EƒFÑèÕ»öîÝ'IÆMˆnÑo½óîk¶nÛ®Ý{!ªA4h-9Ë–¯DÇNÝѰqs|0d8nÞ¼¥;Ïzп/>5õ6Åg#GceÌj\¾rÕî¼å¿¬Dhh(öÿ± ‡ü£Ñˆïæ}/9gÃÆÍXú¿…¸p3 ƒ‡ŒŽþbš4n„CöbÝš¬^½V5_ji­²^{`ßn¬_ƒM›~}b²7iò4ü¶e›ä·_ÛŠI“§ ®ˆ¨Æ7ÚsaÉŠ–,hÉ’3ð4Uóe±ðønÞ÷hѪ=7m‰wÞ‚k×oHÒùáÇEhÞ¢-Zµéˆ+WIêÁÙv±ç÷½èÕ»6ŽFÏ^ýpøH¶lÙ†î=ú0ëgïÞ}hÐ(QѬy ñ ®\½ê6pµ®”dhà wÑçv÷ËÈÈ@‡NÝœœL# Aâä[·í@Ë–Í-[Dcë¶vç¬Y»ó¿›‹ukVÂßß3f}¥ûøúØ(^¼Ö¯]‰ ±«a4z`ÉÒåÂñ1_ŒGÝ:µ»~6o\‡fÍšbúLiúçÎ_Àúµ1ýù§º¯Ù¾c'æ|5{÷ìÀø±£1fìáXì†M Ê‹e?/–_cQ?*£¿¯;ÏzykÐÄ®[…ñãÆ H‘"X³v¢›·FÇNÝðÏ?ÿ ç­X¹ M7„——¼½½1 ÿX»n½$­1£G¢X±b€fM›Àd2 Çâ⎢~ýHxyy¡H‘Â5êSÕ|©¥µbå*ôìÙ¾¾¾(Z´F>ò‰ÉÞˆáC±víza¼zõÖ®‹ÅˆáC·Î¾½;…ïzž‹\V´dA,éÅbáqÿ~-^*´)¥|ŬZ “É„5«–cóÆuˆŠ¬‡ ~Îß¼ù·ì2¯‹ÁÂæa‡lBãl»ˆYµ'ŽÃ¶-›ÐªUsŒõ¶m߉/gNc×ÏØ ?v4öí݉Øu1ˆŒ¬‡/ÆNtùÙ»«®”d蛯¿B®Ü¹pøHœ$ímÛw¢Fõj ¤‘† Hqrœ[·o#99•+UT®\ ‰‰‰¸uû¶ä¼Á¼‹¢E‹ÀÏÏݺvƉ§tß°a"ê½OOOxyy¡[×.ømËÖ ÂÂèо-¼½½áïï‡×»wÁ£G$é÷èÑ ¾¾¾(V´¨îk†y… DEEH”ƒ 7£QÃúðõõ…··7:wê€Å?}¯;ÏŽ^õ£"ñÁûï fÅ2¬Yõ ªU«ŠÑcÆ ç\¾|•ªÔDé°p” G½ÈFøûï$é/^Lñ<„Q4k/_^5Oji]¸pÁAA¢ü—sZ¾lÖ"ÖøøxcÔÈO0yò4$&&bÒ”éø|ä'ŠÂzž‹\V´dA,é-c“f-1t؇ðÇÛo TÍ׿_· [×Îðóóƒ7Z¶ˆFü™³9ÊýÆÍèØ¡-|||P¨PA üžÝ½i8¡!¯ÀÓÓ;´GFF>úhŠ)̬¤¥§|}}Ñ¡}[,ýßB—åÁ]u¥&C:´ÃŠ«$i¯^³íÛµ¡Q† ^0žZpøÖ­ÛѲE´ð?ÇqhÕ²9¶mÛþýÞ Ä9ƒgþüù˜˜(UTŽ_»~M£[KÎ÷ððüêt<ŽÃ­[·pîÜ»|.TÈî7­kŠ.¢XîëׯÃÛ[yž<;KåÊ•Šz‘ E³o ÎÆÿOOOemÚ ®O›Íf!F£z^ÕÒrÆ%©„žÀîÐдoß½úôÇ;oBhhˆKÏ…%+j² G–\-#+_·nÝF¾|ÁÂÿ%çÊ•«È›7¯ðÿ«aeÜÒ.^y¥¸ðݦ *XP1ߣ>û: ;wîFëV-À8DFÔ{bòàL])ÉPTTæÌý—/_A©R%ñ׉“Âd† RœœbÛö¸}ûo,ø^:ƒ,V´¨Dq2<$Ê•ý@¬|œç-ؽs+<=ÙÅÚ°q3V¬\…îݺ v­F×î½TG=× œÓÊVžõR·^}ü¼dJ•*)ùÝËË ÁÁ9VWð… tê>HHH@çÏ_p:Ïaaeððá#a :çBZŽ`±h¿”QÏsa)¸j² G–ÜÅÛb±8¤À:×.ì•fV›¶ñÚku°háœ={Âá#qHMMCt³&OL­+%òðð@Û6­±bå*Œù Öµ‰ ^XD=/ús/§ãÏÀÛË[ˆ!ÿyzy">þŒpîåË96&%%ÙŨ/Z´(>z¨˜o¿›ï¾™¶mZ¡bÅ ÈÈÈÐÌ»3׈)^¬8²²LŠÇµò¬—~}ûཆb×îß‘œœ ³ÙŒk׮㋱ãñæÀþÂy]:wÄúØ HMMEZZæ/ø}Þ û>U«TÆ’¥Ë‘ššŠ»wïbÒäiNç¹Çë]ñËŠ¤¥¥áÎ;˜ìBZz¸ví:Ö­‹Å²¥?a}ìF\»vý‰?wÊ’³/V ÷ï'ÿ˃•K–,G"Ëí¥ËWžYYÊ”)¶m[ãÓO>Ä´)1aâ”§Ú!jÕ•š µkÛ »÷ìŵk×qôØŸhÖ´ ‚ø¯c¯=•§­[·£sçÌc:¶ÇQøœ¹ßáþý¤§g`óæ-¨ 3u«oݪ¶nÝŽ´´4¤§§céÏË1dØGÂñ€€>‡ÌÌL\¸pã&LÖÌ»3׈iݺöí?€ŒŒ ddd vÃ&ôí?Hwžõ2èÍ8 ¾ýn>"¢£båxÿƒ¡¨Y³zõ|]¢`=~üQ š¢F­z8w3gNÕ}ŸéÓ&!!!Qвu»`[GèÚ¥3L&"££C§îhݺ¥ª ÑÒÓ30iò4Œù òäɃ‘Ÿ}ŒI“§!=={À÷ññÁÍ›·ðàÁ·>wÊ’³´l•1«‘ššŠôô ü¶erçÎ-oß® bc7!==÷îÝÇÜoæ=“²¼Ñw Ö­ÏVêàßïHâéžu]iÉPpp0^«[Ÿ‡† ¢àïïGcA¼Ø§'ƒÉdÂÑcÇÍíÍ£›"îÈQ!H´~T$zõéÎ]{àÎÝ»5òcÉùjÇ»v錔”TtîÒ-[wÀ_'NbŒhÅÓÈO?¢ÅKÑ4º5ÆO˜Œ¯wÓÌ¿3׈éÒ¹#.]ºŒN]z yËvؽçwLœð…î<;BçN°fÕ/8ñçœ9ý'6m\‡.;J¸Á€G ÃÑ#ûê8~úq äÏŸcm`ìü-þ-oÞ¼˜2yŽ=„£Gö£w¯’ãJß•~6ô;€ûv£m›Ö(P ¿Se× ŸõåltèÐNˆI y;¶Ç¬/g[­_ÝÐàÛèÒ­—ÛŸ‹»dÉÕÃÃ;¿Žö»âÔ©x|õåtáx›Ö-a2™Ð±sw¼ùÖ»hÒ¸¡¦ëøI”eìŸcç®=hÓ®3"¢ «ìž&ju¥%Cбc;\»vÜtñÃíÚµ‹oذ!îÞùYYYÙ3«4çö )Q‡þátfÔ^9¡çø‹N½ÈF¸|ñÌ Sžµêaô矡ytS$'?ÆÂŸƒçyæÎÎ{÷ì@ÿAC^êçÿ´HNNF¿oauÌòç6‡îLJŸŒyîäáŸÿÅû ÚU¿hæýY¼žˆ ÇðñÍòòòBþ±{÷nzÉ/ñìøjÖtüøãO¨\µZ¶n¬¬, 6˜*æ)ÓªulÛ¾™™™xðð!–þü 6¨Oã ™™™X·nšG7¥Ê ˆ#Uñ¬ˆŒ¬‡ÈÈzTϘ1cFbÞü0yÊt i“Fx÷AT1Ò²u{”+W3§O¡Ê RœžZfwrÓ„û©]«&jתIá";¶ýJ•@/äª#‚ ‚Љ`qâùì?‚ ‚ "G/ëGdq"‚ ‚Љ°Ás¶#ÈHwn;‚Reè½LO’i+g!#‚ Rt8Îéí?¼}r¶#(P0{;·‡ÓàNòHA¼¨«Ž ‚ ˆ’½{vâDAñ¬ ʼn ‚ ‚'‚ ‚ Rœ‚ ‚ Hq"‚ ‚ ʼn ‚ â@¶½s… ‚ BªåèGdq"‚ ‚Ð )NAA¤8AAâDAAŠAA)NAA¤8AA¼<Ÿ§ÌìÞó;¾ùv>Ξ=ƒÁ€¡!èÒ¥z÷êŽãžøýK‡….]ˆgþÿ¤ïkÃÃÃùòåCï^¯ã­A.ûÓÊ7AA¼l<7§eË~Á›ƒÞʼn'‘™™‰ôôtœ=wã'LÆœ¯¿y©ŠÙlÆ;w0sÖl|0x, I*AAâ”ܹßæ7§OÃÉ¿â0iâ¸l¥jùÊg’§KâŸªÕæÒ…x\<§NÅÂç£@þüزu;V¬\E’JAÏ“âÄàùì¿gÙlœ;&“ ~~~èÖµ3.]ˆGÜá}’sc7lBÓf­P.¼ Z¶n;wKŽ— Gé°pìܹÍ[¶E¹ð*èØ©ο 9oÉÒe¨]7u^‹B̪Õvy²¥ãhºK^Žšµ#ШIsüõ× »tÔà8¾¾¾¨‰1cFe—7v£Cå—sõÚ5ôìÝ*UG¹ð*hס Nœ<hаJ‡…ãÖ­[€›7o¡tX84Šœ¿pݺ÷Bù UQ±ruôycnݾM-‡ ‚xá±éEbÝè¹±8uéÜ 0{Î\Ô‹l„I“§áöí¿íÎÛ¶}F|ø ®^»†¬¬,\¸pï¾?qGÙûÎ{ƒqéÒedeeáä©Ó9r´plÝúXŒŸ0 pÿ~FŽúBw^ÕÒݰq3ÆŸ„‡âÆ›ø`Èp§ë䵺u.^rªü6† ÿ‡Ç!==YYYˆ?ƒ? ¨[·6`ÿCÖσ’{öŽÿ™™™HKKǃ‡0tØGÔš‚ ˆ—’çFqúèÃaxçíAðññAJJ -^‚FMšcÌã‘––&œ÷˲¬¯fàÌé?1ÿ»¹0›ÍXøÓb»4;uꀓÅaÖÌi ± -Z¼н[œøóºvé¬;¯ªé.ú ÇëÝpêÄQDÔ{Íé: 𤤤8U~ëׯnÀØuÙn¿ë×oêÔ©-Q˜lŸ6…êÆ›€Ö ®ËÕ1Ë©åA¤8=K<<<0bøìÛ»Ž†\¹a6›±ü—•;n¢pÞÙ³çKHù Uñö»Nœ8i—æˆaCàçç‡Í›233…c—.]¼ýö›ð÷÷Ç 7ûëΫZº6ëЛûÃ×׃ pºNl “¿¿¿SåsâÄIL6’íþ3™LéàÁÃ0›Í8xðpöïV…ªUËæ€öº Sçî˜óõ7HLL¢–CAâô<'O¼ýÖ@ìÚ±ï¿÷6`ËÖíÂq¥f<´û-88àååew̶Äß×ÇWò¿ÔÒµåÏöiKߎÿù téRN•߯O‹þ‡N]^Çq˜9cŠäXüùQªd <|øk׮ǣGVùò&M‡Á¼‡ªU*ãïþÁÜoæ ÊAAâôŒx-¢!J‡…cÉÒeHII¯¯/J–, ðóËQ>ÂÂÊæÌž‰³ñ î£ógO**G,ʾ˜:m&ÒÒÒðݼºóª–n©’% ZŒ´´4Ì›ÿ½Ãua2™pâä)Lž2Юmk§Êocöœìí:wê€7o ¿óÖh·:Öx¦¯¿É^Ùh³6€§§'ð.Vü²+–g»7ÿ´*tAAŠÓ3¢{·ì£ñ&£rÕZ¯X ÃG| xÿ½w„óú÷{0dè‡(^EX±öæ wºßÀýd‰W¬\ëÖopO9ºw,ÿe%*V®ÃGât_k+KÙò•Ñ©sw\¾|•+UD·®]*PÞ¼€æ-Ûâ½÷‡ pÿ~‚DQú石•X«";uîѸi @åJ©åA¤8=KÞï|òñ”)S^^^ðõõEÕªU0ÿ»¹èÙ£»p^Û6­0uÊD”*UF£yòäA—.0göL‡î×¢E4ÆùxÄs›çšµ#p÷î]¼Þ½+:wê@‘ ‚  ‹“›É—/Øáx«gÍÙxZ%GAz ‹AA)NAA¤8AAâDAAŠAA)NAA¤8AA¤8AAâDAñDÉÙ9œxž*„ ‚ ÈÑ‹ÄúYœ‚ ‚ tBŠAA)NAA¤8AAâDAñ<“³ª¼õ ‚ ‚`éEdq"‚ ‚ÐÉK£8• WýÓË–­ÛÝž7yšŽäÇ•úÐ˶í;P¶|eÔ¨ùÌf³[ïý$êóyäY”ÓÝÏíY¶Ý§Ù6žTÞ]iç®”û¿\èÙ=‡_¦Â^ºïrï0Ô-é<é4ÝÉà!#ðõœYhØ ><<<^ª²ÿ—Ëù$ŸÛ¹ ?/2ð,Êò2´5‚ ʼnxæ˜L&4kÚ„*‚žAÄKÅ8É(ŽØØhØ8ae+¢lùÊØ¶}‡pÌö)6›~=÷[Ô¬ªÕë`ü„É·Hé°p¬X¹ UªÕFç®=˜÷c¥¹hÑDÖoŒ2¯VäAÏ=å$&&᳑£Q­FÔ®‰eËWØ£”+×®]Ç ·ÞEÕêuP¶|eD·h#Éˤ¬ö›š»´tX8bV­Fíº‘¨R­6>ùt%& ÇõäE^ÿz®Ù²u;¢[´A¹ð*ˆnÞü±ëÖÇ¢I³–vráL:#76×[é°pT®Z }û¿‰ .*Ö›üž‹Ó¦ÏBõšuQ¡RutëÞ —/_Ñ-«zó U.¥ö¥GVån'µ´à«ÙsQµzÔ¬…?-Vuw8óÜ]‘uyYÔä\o{ÕÓ¿9Rj÷qDÝ%ðý Õå+TEÏÞ}qõÚ5‡îáÌ3vô=}Œ+í@«îÉ­GŠÓSgÃÆÍXú¿…¸p3 ƒ‡Œcæ¾t!^ø¾ü—• Åþ?váÐßa4ñݼï%é:uöíÆ¬SíîÅJvîÞŸ—,ÂÅó§%yÐ{O1£¿‡&áнX·&«W¯•WK•¿ÁCG ~ý(Ü¿GìGûvmðùèq׳RÙå,]º«V.Çþ?v! £ÇäÜKO^äõ¯çšÅ‹—à»oæàÄŸGйsG¼óÞ`ÄnØ„E ¿·“ gêй±¹Þ.]ˆÇÁý{дIc ö¡îº]´x L&öîÙ¸ÃûÑ´ic̘õ•nYÕ“=åRj_zdUo[€UÖkìÛõkc°iÓ¯š2éèsw§¬«É¹ÞöꮾNÏ}‘GwÉß/+b/_>lÛ² ÇDt³¦Æ•v U÷ä’%ÅÉ­Ö$=ÁácFD±bÅÍš6ÉdRLsÅÊUhÒ¸!¼¼¼àííýßÀÚuë%ç zsüüüòŠî¼N?V8_ž=÷wõëGÂËË EŠƨQŸ:\Iƒ_¿={t‡0 _R»Ý9øÜŸ–œ»Ò^]©?µû8*î¿•1«Ñ²E4üüüàããƒ>½{bㆵÝÙgìè5zúWÚ«}áÎÀÖôpùòTªRSò›<·X±¢çU-zî)æÁƒ‡0suxùò.¥Çÿ…½ük×nàÔéÓOô¹U©RIø^¨PA€¢EЏí™8#7Ó¦N ·ÞŦͿ¡K—Ž0p4iÒHw=^¿~ þÏ•+—]]jɪVô”KM¶µdÕ‘vráÂEå¤^N³Ž}îOSÎ]i¯O¢ŸqTÝ!—/_†K÷pæ;sVãJ;pµ/ Hqr¿Πßg±Xp6þ/xzz*žãL§¦vž{Ê1›ÍBšF£‡Ké­ŒY… cÀ€¾ˆŒŒ@üùѰq´ê½]A­.ôäE~½3×Çqn{&ÎÈM£†õ±1v Nœ<…Ý{öbïÞ}HIIA»vmœ®[ù³Ñ’U­<è)—VûR“UGÒrFî}îî”u½ý„3íß™úÓº;äÑQù3™ÌODƵž±£×èéc\iO¢/ Hqzj„„¼‚„„(T¨às{ÏÀÀ@$$$ @ì™Øùó\JoÊÔصã7Ygó/^R=ÿÆÍ›.•÷Üù ¨X!Ûš˜˜ˆÜ¹s;g¯q÷3qVnÊ•+‹råÊ¢{·.ˆ?ƒvºèî,CCCpçÎ])R””äTYÕòàj{Ð’UG +ƒ‡!_¾`AŽž4®Èºšœ?‹>GÏ}‘GwÈ_‰¡ÈÊÊRTæÜ%ã®âj£§¸Ò.N8¨ Ã××W¯]ý{÷]:wÄúØ HMMEZZæ/ø}ÞàRšZ8zϪU*cÉÒåHMMÅÝ»w1iò4—ÒË•+{÷îCFFâãÏ`øˆ¥Ú¸ÑˆmÛw€çy\½v cÇNt©ì'NÁÝ»w‘––ŽU«×¡jÕʺóâLþA«Ý!7­ZwÀ²å+’’¸ý÷ßs¾:¶Ç¢ÅK’’‚´´t¬]‹¼yó:TN­<¸Ú´dÕz¼Þ¿¬ˆAZZîܹƒÉ.¤¥8ót£¬«É¹+íõIÉ´£òèùëÒ¹#vîÜôôt¤§§ã—1hÓ¶£[ïá\íc´Ú«}AŠ“nܱsø›û£]û.‚Ùµ_ß>xüø1¢4EZõp$î(fΜêP¾äijáè=§O›„„„DD5BËÖвes—Ò›:e"æ~;•ªÔÄð?ÁÀý%Çm+D^-W ƒ½‡Þ½z¸Töèè¦hÞ²-ê7lŠþùÓ§NÖgòï Zuè¹™ýÕ lþu j×Bé°pae#yôðð@dýƨÙÇÿ‰ÿ-úÁ¡rjåÁÕö %«ŽÐµKg˜L&DF5F‡NÝѺuK·¸·ž”¬«É¹+íõIÉ´£òèùëûFoœ=wQ š¢ZºØ²e¾™;Û­÷p®ö1Zí@«îi;‚' ·k×.¾aÆø÷Ÿ¿‘™™ ÈÊLu*±ReÊãòÅ3T«„[•]ZZK¸ƒÄÄ$´mß ¿ïÞNrN/ {÷ì@ÿACœn_ž^~//o*\»wï&WA/&5jÕCì†MÈÈÈÀýû ˜¿à´hMC„KâDÄ ÉW³¦ãÇB媵вu{deeaø°ÁT1A¸„MÆóÙñMšµDXÙŠ([¾2¶m—î¼v],¢›·Fµu0dè‡xôè‘äø×s¿EÍÚ¨Z½ÆO˜,1aÚÜŒUªÕFç®=˜ù¶X,˜6}ª×¬‹ •ª£[÷^¸|ùŠ$ÿ¥ÃÂu¹Gäå݈†£˦–w›‹°tX8*W­…¾ýßÄ… …ãf³GG:µ„ß¾ÿa!"¢¡|…ªèÙ»/®^»¦«œÎ>g®¹ví:½õ.ªV¯ƒ²å+#ºE»4Õê-11 Ÿj5ê vÝH,[¾BR§ZõÆz^âç«UOrôÜOKF])¯µúÕ#ÏzäDK®ÕäPO}8JÍš5Ñ­[7] ‚§ç‹QŸ}ŒiÓgºä[]¼x ¾ûfNüy;wÄ;ï Fì†MX´ð{\8w _Ï™…ÁCFH®ùß’Ÿ±páÜÿ;"êÕÅO‹–Ç–ÿ²¡¡¡ØÿÇ.:ð;ŒF#¾›÷½äúS§NãÀ¾Ý˜5c*3O‹/ÉdÂÞ=;wx?š6mŒ³¾ãz³iù޲aãf,ýßBfÙ´òns^ºƒû÷ i“Æ2ìCáø_'N¢téRðóóü²"ùòåö-›püèAD7kŠÁƒ‡ë*§+ÏÇÑkúõ£ppÿ=²íÛµÁç£Çé®·Ñ_ŒC“ÆpèÀ^¬[ƒÕ«×J®Õª71¬ç«§ž¹Ÿu¥¼vùQ©_=ò¬§üjùÕ’C­úp¦õíÛ—F$‚ø/)N<Ï /2 Dt³¦øß’ŸNcℱ(Uª$¼¼¼Ð«g¤§§cℱ(^¼ YÓ&0™L’k¾= ÅŠ…··7Z¶lŽÝ»÷ÇV¬\…&ÂËË ÞÞÞÐÿ ¬]·^rý 7ÀÏÏ!!¯0ó´zÍ:ôëÛþþþðõõA§ŽíqâÄI·ÔÙ˜Ñ#Q¬»lZy DZjÀÏÏ={tÇo›c…ãû÷@¤(¾ieÌj´l ???øøø OïžØ¸a­Cåtæù8z͆õ«Ñ³Gwøøø ú÷Ńt×[\ÜQÔ¯ ///)R£F}*¹V«Þ´pT´î§GF])¯²®£~]-¿Z~µäPO}‘ÍÞ=;4ÿžW½H¤½”;‡÷}£7^ïÙ­[µ@¾¾D‰Pữ¯ h‘"ª×T¨P^t/._É ½|ù *U©)9_À]¬XQÕô¯_¿‚sÊ’+W.>>.•Ó™çãÌ5Çÿ…½ük×nàÔéÓÕÛƒa4æ4¿ðòå%ǵêM GåAë~zdÔ•ò:S¿®–_]®ÕåPO}‘M¿7kžó_zãK©8yxxàãF`Òäé˜3{¦ê¹,—«ƒÔzÏŽÚq‹Å‚³ñ©n;Ó)»k©§Á`p:ïÖÇÆØ58qòvïÙ‹½{÷!%%íÚµArr2nܸŠrâAL&³Ëåtæù8zÍʘÕX¸p1 è‹ÈÈÈŸ Gë®7[¾m÷5=t×›³¨ÉƒÖýôȨ+åu¦~]-¿Z~µäPO}ah¼`¯\yißUW£z5¬^½ûöP=ïÆÍ›n¹ß¥K—Q®\Y@ròc*TP8ò H~s”ÐÐܹsEŠ$%%=•zÔ“÷råÊ¢\¹²èÞ­ âãÏ ]‡.h×® <ŒZµjJ°%B‘••¥8 =«rÊ™2uvíø AAA€‹/9t}`` ‹çùót×Û“’µû¹*£zÊëÎúuUN´äÐm– ˆÿ&/õÎá4_Íž+Õ$FlÛ¾<Ïãêµk;v¢[î5~âܽwii騰q"##„c]:wÄúØ HMMEZZæ/ø}ÞàPú:¶Ç¢ÅK’òÿöî<.ªzÿãø{dR³ì¶¸¤R‰ *n)* j¸ïæŠkݼ?-õÖí–7Ë%­¼¦¶wÍ¥Ä5ÍÝÌ@Q´r¹j×—RsIYf@†ùýŒ À „ÆÀëùxÌfΜísÎ0o¾ç{ÎI‘ÉdÖê5kU±bÅÛ^C{ËÞ©s-‰\¦””IÒÙsçl‡lvíŠÍÕ¿){z_-³Ù,³Ù¬¥ËV¨KמúzÞÌ××G11»”––¦#G~Ðø ÏjüZüi¤RSSuñâEM›>3×ð‚ê–OOOýzò¤ââ.©Nöæ÷G÷Q{ë[ØúÞ¼¾Åýy°·ÇgÁÉéTªTI}z÷ÌõZöÙ5½õÖŒBMXÄF·n§ÁmtàÀµhÁÇ·½†ö–ýíÙojã¦-jÚ¼•jùùÛÎÞ’¤]±»Õ²Eîë7E ¬úY­Ú„©aPsmÙ²UïÌ{ûO_Ï›Íx}ªæ½û¾ê6Öø‰/häÈá…ÿ™Ó¯–­Ú*¼s…‡wÌ5¼ ºåeÔÈáêÖ½ípVaëdo~tµ·¾…­ïÍë[ÜŸGöÂêQî”4¯Lžb»ŒH-?½2yŠS®‡!**Ê¢sgÏ(==]’dÉ0ib5k×)uÇ2 8Ålߦá£Ç•ú3˜)«¯höå9,‹"†Òžo¾UófMµpÁǶ~µüüeµZ‹=CdÞŠzG £kÖI"îîîúËý(::ºlôqrô¿¿;}«Ê £Ñ¨÷Þ£qÏMÔœÙo9홨e"8ˆøóùøøè“ÿ|èÔëàÂf 8+WJn—’|K‚8 Î@FYàhcgê‹Lp€;ŒK΋àwP«6¡´6NŒÎá'‚Á  $»Ñ9Ü*‰3=®g#kŠÀa¶'ëõnä"k^Á àJÛ-,€l­Ú„–øe$8€>zE@©bµZââ°'pâ/ $3 í§ƒÁiÖ‰àn›Òv‹!Ϊ 8œ€JJJÒð‘O)))‰àTÒÕòóÏóñhmýj[¡§u»–ñØòåW|*oó6*ɶ~µMÖ PPãÇe±X ¬É®ÏéÓ¿)¬}'öËÛXw“ɤÈ××W•*URDD„.\¸ïû333õüóÏëî»ïV… 4fÌ™L&þxà¶±X,zfÌ8ÅÄìÒ3cÆåùwŠàTÂ?zä–ÇÜ9³4aâ …O%ÑßþïY>™eØØq4wÎ,íÙ½CF£ÑîgáNÚ¹+V-[>ÎFºÞÿ}Õ®][qqq:uê”zè! 80ß÷Ïœ9S™™™:uê”Ο?¯*Uªèù矧¸m^›2]{¾ùV’´ç›oõÚ”é'gÔ>,T³Þš©±ã&°Wéedd¨}X¨Ê•+Wâ–m×®Ý nÙ‚tmÞ¼Y:u’»»»|||4räHEGG+333Ï÷øá‡?~¼Ê—//OOO=û쳊ŒŒ¤¸m^<)WÃÅ«“'œœ9×UZí­sAÃkùùkíÚõ i×A~ÖsèhAÓ˯®9}ôñ|µlÕVuê6ÐÀÁúõäÉ\Ã,X¬àÖíTû‘º-Ïì·ç©A£fjÜ´¥æ²ð–C[Ë–¯T`æêÝw€¤¬C3ߘ¥F›«nýFê×Nœø%×87»yš+V®RÓæÁ lØT/üã%]ILÌwù šßÍÛßž›—ÃÞ¶+h[e"¬å節M1|”Ž=fn±X´oÿ5kÖÄ¡mçH]·|ù•:<ÑEùªCÇÎÚ¹3Vk¾X«Ðöáy®CQƱ·Ú«[bâU½øÏIjÔLM›kIä²\5µW·ÂÖûé§ŸôðÃÛžW®\Y™™™ù§“'Oêþûïç 8ýq‘K—«zõêŠÝ¥ovï«««Þ{ÿ£<ß;öÙ jݺ•öÄn×¾ïbÕ½[½<éUÕ®]K*TÐα¹Þ¿nýµx¼™îºË7Ïé-Zü™æÏÿP{bw¨e‹æúdÁb‡–+ûÐKv’jÔPûö°»lù =öè#Zµjµíµ½ûö«qP#‡ÖÙ‘š¬[¿QŸ.š¯£?}¯¹sfØŠgozùÕ5ÛÒe+T¹remݲAöíQ‡öa;v|®y|­Ï/бŸÿgwyV^¯Ëî]Ñúbõ mذé–÷|ÿýÿ´{W´f½9#+˜-\¬ŒŒ Ålߦ½ßÆ*,¬Þœ5»PûÚ§ŸFjåòHÅîŒRùòå5é_¯æûÞ‚æwóö/¬‚¶Ýmuýáñ£G´'v»ÂBÛiÜsmÃ:¬ZµjÊËËË¡mçH].\¬÷Þ™£CÿýN½{÷Ô_ÇŒÕÚu´`þGùî…ÇÞ>h¯n“^yU¡íÚê›Ý1ZóùŠ\Ÿ=GêVØí§»îºËöÜÃÃC’äêjÿr}‰‰‰š6mšÆŽË@p*¼eËW*´]ˆÜÜÜäîî®Çjõš/òþÂùb•è/•/_^#†G(!!A’4xà“šÿÉÂ\ï_¼x‰<Ù/ßy¿2é%=øÀrwwWxxGEGo/Òr5j¨ý׃Szzº6múRï¾3G_­””IÒ¾}ût=8Ù›¶#óþפêÁÌ·¯05.¨®’´|Å*…?ÑA^^^òððÐÁµ~]î/¦©¯MVµjU^žûËÓÓSh¯n{÷îSëÖÁrssÓý÷ÿE/½ô\ãÚ«[a¥§§ç:LëââØŸ÷¾}ûÊÏÏO‘‘‘êÕ«_(v1Û·Ù}8®ž‡'~QýÀƹ^+¨³í³s§Nž<­ïÿ÷?ÛëíÛ‡jÊ´úéç£zô?íÝ»O’ï´êÖ­cûÝÓÓS'~ùµHËÕ(¨‘"—®$mÞ²UÍš5QÕª©E‹ÇµaãfõëÛ[ûöÐÐ!ƒš¶#óÎþ*®çW׬ñOØþ£ÎOa–çèÑcº»R%ÛsÿÇnyσ>ëù©S§U¥Ê½¶ç¾¾¾JH¸\¨}-0°¾í÷ûî«RàøÅ1¿¢ÔÊÞ¶š9cšF?õŒ6lܬ>}zÊÅà¢Ðж¶á;wíÖË9Bƒ½mçÈzÖ¨Q=Çç$kZØ9ìT”q ÚíÕ-!ár®Öÿ:ur ·W·ÂòððPff¦-0effÚ=I@’V¬X!«Õª_|QC‡Õþýûù@±6Ê~K¦3Ý{‘à”‡ÌÌLýxä Cl—¯X¥ùójĈ·Ô½÷Ü£vl_.ýûõÑ'Ÿ,Ô3§kѧKôd­MRÁ÷ë)ÌrùÕ®¥ß/ü®ÄÄ«Z¶|¥ž÷7IRŸÞ=5{Îz}Úkúèƒw4áïY-L»÷|«&Mç ö¶ÝŸµž…ÝíñññQ||¼íùÏyìSùÕ­(üýýsÍ/!!AÞÞÞù¾¿J•*:sæŒí¹Ùl–¯¯/_€ãÁÉ*Y¯?ÊXhš0ñÍ3ËöZŸÞ=õÅÚuJMM•ÉdÒ~¬!CGä9¾¯¯bbv)--MGŽü ñr_åÞ{îQHHkýmìsêØ¡½Ê—/_àò¼6õu]Œ‹“ÉdÖºõÜÒáåòôôÔ¯'O*.î’$)(¨¡f¿=O}úǫ̂z÷ê¡wÞýÀÖ1Ü‘i¦&ް[®ý¼ÜIDAT7={uíÓ»§¾þ:Zf³Yf³YK—­P—®=‹¼<žì«¥ËVÈd2éÂ… š>}¦Ýqzõì® +%%E&“Y«×¬UÅŠmÃ]]]µõ«m²Z­úõäIMž<õ–iLúº.^¼(“ɬ•«Ö¨Aƒ€"Ïïv±·­:uî¡%‘Ël}çΞ;gûGd×®Ø\ý›ÙvÖzö³mOƒÀ-þ4R©©©ºxñ¢¦Ý´OT·¢hß¾½>ûì3¥¦¦*55UŸ}ö™j×®ïû ¤÷Þ{Of³YÉÉÉú÷¿ÿ­áÇó­äd½5•©§¼®>vÜÍzk¦Ú‡Ý8-XÄ%''«U›05i¡ïöîÓ[oÍÈsš3^Ÿªyᆵú5~â 9òÖ?<ƒ>©ãÇOØ)<[çðŽ ïÔ]MšµÔ®ØÝzv쇗kÔÈáêÖ½ípBP£†ÊÈÈPÏÝoúî¡k×®Ù:†;2íÂÔÄö¦g¯®CëÇŸ~V«6ajÔ\[¶lÕ;óŠ~˜¡oŸÞÊÈÈPp«vêÑ«¿:w·{HtXÄF·n§ÁmtàÀµhÁǶáÙgY=òX}=Fƒ ¸e:„©cxWµ ÓùóçõÆŒéEžßíbo[½=ûMmÜ´EM›·²}¦²ÿÙ»[-[´(Ô¶û³Ö³(Ÿí‚¼1sšâããÕ²U[…wî¡ððŽ¹†T·ì¿W…1dÈíØ±C•+WV•*U´eËÍ;7×{ršœ6mšâââtÏ=÷¨ZµjJOO×Ô©Sù¢ÄmóÊä)¹¾_™<Å)×Ãe ÑÙ3¿)=-M’”™™^¤‰Õ¬]§ÔË,gΞՀCî̲,1ñªºvï¥Ñ·ï66µüüïø¼Q:Älߦá£ÇÉZÆŽÀ C†Á`û;g±X1l”ö|ó­š7kª… >¶õ¬åç/«ÕZì"û³RÔ¿µ..YýÝÝÝuÿƒ)::ºlt/ÌnÅýE–––¦%K–©{·®|‚J° &-4éåÕ±C˜’’’5ÿ“…z¢c ÅÄh4ê½wçhÜs5gö[øä˜?K™NæõAMWýúõ4ÿãøÔ”`³g½¡7Þœ¥þñ’|}}ÕµK'=ÿ÷ñŠ‘>ùχN½¶àd½þ@ñúþ×DqÁÁ-|gï¥Æa:(Ù¬7ý”¸€Ã¸&¸mJÛ‰Q'pRœÅŒ’ÎÑ. ÎÔuàNˆK'€Zµ ¥µ ø“Ð9€à@p 8œN'ÜäÆuœ¬Ö¬nä¢ñˆ'œN'‚Á €àPv¸æ|ÂUœr碜ùˆ'œN'‚@Ib2™NŽ„¦C‡Él6œ âéé©€€yxxœ ‹àÕ8(¯Cu7n¹bµf=#ÝÈG´8ä!ëPÝaÕØ“u¨®>gÕ8žr"88ˆà@p 8œN'€²ÃvË•œ7PPÆYoú)Ñâà0‚Á €à@p 8œÊÛuœdµf=$.䋬7®äD‹€ƒN'‚Á €à@p 8€à@p 8œœˆí&¿Öë‰{üXóx'œN'‚@If;«.ë´ºëýÇ9­”uÙ¹Èzãü:ZœDp 8œN'‚Á '‚Á €à@p 8œP0×ì_¬×¸‘‹ræ#Zœäš+WYisÈŠFÖÜ?E‹€ÃN'‚Á €à@p 8€à@p 8œN'‚N'‚Á €à@pÁ €à@p 8œN'œN'‚Á €à@pÁ €à@p 8œN 8œN'‚Á €à‚Á €à@p 8œ@p 8œN'‚Á '‚Á €à@p 8œ@p 8œN'‚N'‚Á €à@p 8€à@p 8œN'œN'‚Á €à@pÁ €à@p 8œNe–kqO0fû6ª Nö * NŽ8~ô¥}œN'‚Á €à@pÁ €à@p 88‘ïU³}eưQcuâØE NÙ€àÔªMh©  ,¡Á €à@p(É\)Ρ–Ÿ?E(fÇ!8PZY­VŠP C‘Æ#8àd¸TÐóG.ðM'‚¥_v¿'~:öó2DEEYCBBtêä¯J3›%IF#ÇO(‰!ÉjµÚÕÕòó/tçæ²^¿ãG(fû6 =NRÁÃ-–¬~PªZ½†¢££iqÀYšî|½N8)G?úíŒ&¾8Yß«¯wì´ûþÕë6hðÈ1š4e†â.—¹zœ(…iA9y괦Θ¥À€ºêÕ³«Ö®ß¬Í[¿Î÷ý‹"—kïÃ:°ŸjÕ¬©—&OSÂåËe¦^'J)GZPæ}ð‰BÚËÛÛCII‰êÕ£‹¶l‹Ê3<-Š\®Ÿý¢n:èR|œî«RYuµ8re™©Á €RÊ‘”Ë—/˧|y%&&êÒ¥K:wî¬zu뢭Q;r…§E‘Ëuôè uëÔQ§NÔÕ«‰JOKSyoo]¸x1Ïigffjé²êÞ³¯êÔm ú1l”[(£Ñ(IrssS¿¾½åb0hÊ´Z÷Å*§«—=ªÀI9z¬óíÕ!´­ÖoÚªÊ÷Þ+oïòJNNÒ￟W÷.áêÔ¡~;sZ)))ªP¡¢\˹ëóµõôˆ¡jÔ Ïi®X¹J#G ³…¦œzôè¦Ùÿ~3Ïñ2335óYjÔ¸¹êÖo¤~ýéĉ_l÷~µMÖ P-?4h¢ˆá£tôè±\Ó˜;ï]5nÚR 5ÓkS¦Ëb±k½N”B…iAéÜ1LO„µÕúM_ªR¥JòôôTrr²~ÿý¬Îœ9£ääd•/_^®®nZ½v£ž6$ßÐ$IGŽü¨† óæêꪚ×ÈsØ‚…‹•‘‘¡˜íÛ´÷ÛX……µÓ›³fÛ†7AsçÌÒñ£G´'v»ÂBÛiÜsmÃ#—.WõêÕ»3JßìÞ!WWW½÷þGÅ^/‚¥La[PÂ;„*<¬ÖoþJ+V’‡»‡’““•œ’,///¹•óКõ›ôTÄàC“$¥¤¤È××·Ð˼êó51DÞÞÞòôôP¯žÝuèÐaÛp™RM’$/// Ð_›7®µ _¶|¥BÛ…ÈÍÍMîîî1|¨V¯ùâ¶Ô+ÏPÈn€s*J ÊÅKñòôðPff¦Ìii×s”––&O¯òrwsÓ¥„»Ó¹ë®»tåJ¢*W¾»Pó?uê´ªT¹×öÜ××W 9.²9sÆ4~êmظY}úô”‹ÁE¡¡mmÃOœøEõçšf^‡ ‹«^'J‰Âž%¶àÓ¥úß?+¸E={Féé×t×]d±\SRR’,…¶ ÖºM[$IO´o—ï´êÕó×TXhÞޡ¶!­Z®œ}”Ú†´ÖúµŸëÐáï½=F11»”’’¢nݺHÊê#õ㑃*W®Üm¯W^8T€“*L˜¿h‰ùAMƒuî쥤¤ÊÛÛ[F£QÞÞ>rssSâÕ«J¸¯6­Zhͺ^a¼G÷nZ¸èSeffÞ2ìØ±ãZ¿~CžãU¯^M.ܸ.ÔÕ«WoyÏc=ªþýúèõi¯é£ÞÑ„¿ÿÃ6¬ZµªŠO¸íõ"8PÊ8Úgç? —èÈ?©Qƒú:þlVhòò–Á`ÔÖ¯wh[TŒ¼½|äîî®ÄÄ+ºœ àMõùºõù†§Îž···ž~æÿôÃ?Êb±(.î’>[²Tûœ&Nx.Ïñzõì® +%%E&“Y«×¬UÅŠmÃ;uî¡%‘Ë”’’"I:{îœ\]o ëÓ»§¾X»N©©©2™LúàÃ5dèˆb­Á €RÈ‘”•kÖéû~T=ÿGl-M^^^’‹‹¶ïÚ­§GF¨K§ŽŠÞ±KžrsË OW¯&ªyãFZ¹fö|»ï–é ½ÿî\5jØPÏMx^þõªcx}·wŸæü¾xàþ<—gXÄF·n§ÁmtàÀµhÁǶáoÏ~S7mQÓæ­TËÏßv–]Îñ“““ÕªM˜‚š´Ðw{÷é­·f[½ì1DEEYCBBtêä¯J3›%IF£•½€¦–Ÿ¿¬V«NûÁöÜ^4â5¨§´4“L&“|||äáá¥ïÔÈ!Õ0°¾$髨íZ·éK5i ÔÔ%'§¨bÅJº’xUW®&iÖô×JEýŽ=¢˜íÛ4|ô8»aÊb1H’<<A÷Tª «Õ*«Õ Ýßî×àþ½U£ÚCŠ‹»$«¬ ¬WWÉÉÉÚµ]þþrws—ÕjÕå+WU»VMY­V [)Îe,Iõ²‡à€“r¤Åiì_G韓§*=-Mînn:qò¨ö멇«WÕå+‰Ê¸vM–ÌL Õó¯#sZš¢vĪêƒ÷éìù‹’Á Aýz•Ø0TÜõ²‡>N8)GBÀ=•ïÖôÉ/«råÊ2™ÌzfT„Ô¯'£««\]]etuU¹ë¿—suU›–-Ô·GW%%™Tãázõ¥²úD•‘zÙC‹NÊ‘ƒÁ {*ß­‰ãÆÈb±ÈbÉTFÆ5yex*#Ã"‹Åb; çbt‘«Ñ¨¶mZ©CX[FF¹¸¸ØÓ•özœ(¥ ƒÁ‚²xP¯"âPN*»“6? ÷óàr8QPÊy9 —# Œ}ñãÏApÀ‰”†NÚÎŒ>N¢Å 'ᬞ,Mhq 8œî“ÉDpp$4>|Xæë×¹”$—ôôt*pOOOÕ‡GÖ-jÒÓÓ Ny1™Lòô¸q_¿k×®ÉÕÝÍM—ââd±Xl²/1PæÂ’§§í0]@@€Ê•+§Kqqrws“Ëü_= ‡RƵkT ”éДݧ)çaºôôtñŒÈç"ßq""Í âÇ{;q²13ˆ7?óÊ’£iÏs¿”6l¥¿ªZõ¥w ­ÈàD¤Dœs¢cŠÈdQ¬$Ë·"ImÀd¡BDœS× i½xöi‰µ‘¶P‘ÞùêVd㼑AŒ¸ÃáÐuIï8æŠ%nІ­$‡`nÂáp”uÎy}+óÔ^(¯»Ô”ÑÀæw½ðŸbÁ_3N”üa¹[ƒÑÔÑle> ¢©óýÌ•©§ƒ¹Ú)û”»˜é˜\Gx¡Ì]íŒˆŠ ÜìÐsŒ…ÞeÎ6*k”Èó™µÍ™ýGñðiVZ¢ðC­ö,ÿ˜ëíá&Í-³9lºÎµá,ÀAÐôÌK6"ƒxí®]¼õ™wÝßoùÆ­vA¥“A‡cm«•®–Æ"2±ýª6h³´|W.£ö ¤qnp2ôÙ§¥õ’:7xI[Ùo«7ˆ nþäf†ŽÚoêµ’«"˜üŽ£¡•>JK¼¶·›ÿCu?ãê?Þ,ô[ƉŒ†ÇVÕ´7¨k^()íDuµ3"Êüĉ¨«‘AJ;Ñ\‰È ·“}vš9Ûˆˆœ"}vš¹¬~CÑ~&2â¼q‡[íáæþhKÖñ„ëƒÊÈG³3/7Ï¿‘Á7>ó®§e«R¥²œ?Vòh’ Œ•€QY> ÕF>XÛÊNæ‰Ê ÑK/+òiõ O¥¤UÌ‘m‰óWµÛlÔ·’%¹Ù¢o¡U÷ y¦ðÜjee«­™ú£Xÿ´ïKˆü'e~¦ø·|¸—ùN­žÔàõ}©MÿI´šÔ+”‰ˆ\íĉÜN"¢džü¿!—“8‘K$"Ê—‰t/o(LJ{˜ï$Ý,÷bå‡1÷±•­›6Üà U¸õÖéº!â_,ÀAù¨;‡’ÁÌ1U¿'otæ%¢Ê¢¾z̃ËG¤ Z¬²¨›S-­³Ùˆ­^hh³vÝ,fŒÈÆDzÝ~èD¥ŠnÍ •*º^7Ú¯/êÌNŽåÇ›|³Þ¤U-0Ù¨blÃoð:ñÚ Qâ{­bðDžùNŠÖKõÕÖ>®•¼¨9‘¼ÇcTX × NW;õ#²QY£ ׬ å4ó±ó]í«:L䵊Áiéµ÷pCR#"}‰‘ÿ^„†ó5-ŸïÍúæÎ¼üõ[­l«¾dM+ˆŒÚ€;'2—جdÄmÄ–;ÒmµtÃlÖyŠ›ù£TÑ—çn̦“•nêò—ÙêùËŠÃFD +Y6ÛÊzCtƒ4›ûo¶Ò8‰Œd‘*å­|Nž/š53ˆÌ{ɯ7Õ²Þã•Á®ˆ,àfD”Ÿçd¹Ú#xJ$¢Ù2oìÁ §mùÃ0êÐÖôoln7bÞ–M[ÔÈ.êø÷ p€F>êÏ×Dlùì°©óõ:­j‹Z´jX©ÚyDš}ZjÜÖò9«þdgÝð“AÜÆj§}ƒ*µ 8ê³.UôúAF"³fíÌÚ´ÕrC.KÒ†­:4_ß:W,Y­*œ‹Œõ¥Ùù­|NM§* ärÒp‹>¦Ð»lmÍúÇÓ׬œÈÿB¾“dÞÄ~¦È¹A3Eîÿ5s9‰ˆò¥Z…r;i¤—E¿¡à»Œˆ åÕZ3Ÿd5l½‡­1¹ŒˆJ ù¨÷G8^÷Úú|½úı©óµ™ Ì Ò}B^»-^K¼.AÔ¶ Zi‡×Íë‘ö* ‘ÄçœÙj«C*œ±õ[•*³meQ/iZëVë¾l¥UQ#E$ïIÏmåjÛÙOõO»þR&¢ø÷ÚøÑw’ùN²¦cùm!±¦ÿ$fŸÑÅÉU#(³ó+W ÍÌ7hf~Õ«f‰œ6~vÕ†â9m½”S_²á¶æ;ɘ /ŠÜ`ÃðpF>6mzæ•%i ­ˆÈ:Å—*³“µ­ˆÙVÝ_j9|p­¶!ó~e6Váúrða:'²‘êncd#©­V^á:³qÑÆ‰èÍ[=/UZ1qÎë[‘Á5ΑùN²ôoüU¶†NDÙŸôÏ ÷ŠDÿVûì=Ñz©¾Zä±íEF_õ*Q¡¬sCd6*,_ª‘¦éeMtŠæ«ó|ŸýYOÒp¯¨´SqƾÑfžUÖîÏVö°…zD"*<-‹m‰‘hÃ/bäã5Ï¡[;ó®×jå;l¬¢ëkZœ×®1Ï;Nª_óADdãd0n#Vw‡TóÎ$dn#2Ì©!NĘã´zš`ÇZ•4.:Yø´˜}VÑ6}ŸÓ®ÿ(¶x5ù¤’|R±7m•ý¹âùyݸÓý—Æþ½_6ÙbæçJ¦Y'kw¯¡d½=ÜÐH¯¤ˆ¬ð¢XxQrSn1pPìíó5_^ê±jácó/ùày×Ý=ÛÌí:ÊhyüÇZ5.µ‘³%†äàú‹¡‘ÿ7ŽÐïD"šÉDQ”ÞÉÆ8¦]„=~¾nJ¨V«D”ø¡ÉÙ[+•Š?ç+/‹­7 Q”“nQ–w¸•ƒÈ{œ9Û¨°ÀÃJ³%vúì=ÉL‰ÉlqKNE<"›S`p0ìñóu½ÐoØJøH?Y^;i~o­6ºÂ+}£{i8lŒI[ÊßÉVÌFÝN&¶1"Jÿ Å¿­Ì½ÄAHD$ÙÉ{Ò1òž¨ˆŒˆÒ³…²æìP¤#"c’ÀA²§Ï׿½V—çkü¿u6 6"Û>[àr2¥½¶ËEgŸq2¨P:Œ31r%RDæ9Vûr»Â‹böÛ<7Hl—¥#Nb†ï³€ FT»é{³ðñ2QÝ ýö›1#RœLn«‚€; O˳ÏJRÛeÇ;"cŒyÀŽZ}WLÿïê®v)‘¸¶ÆþŠV…gDº&Úté"£v7Ïæ¹Vá:çŲΉs8œ.bLcncd0ÜÞv]mä£ë/ÚAIXœH'ƒ¸®êÖ¼Y­‘ÍíÀ€ì¾¹WÂGþ—.€·¥Äe÷qFD¿Â{; á>áá>>á>Þ¾Í~ÏØÈhoÖÁœH•ç‹x`¯‡"»Ãû;>ˆÈÙ¡à-Û×0æ»k>á>>ác#éÉ´`L‡#ûMvÇ6->o€Ã>Ò“é` ˜ºŸªV«Õj5ñ÷ÄÀ¹ïrøÛNnLTS÷Sþ³~ói`(@…þš+Ìá“8$vvÚÅ +yÔòÇùÀl~Ö|¬iÚ€o@° }ï÷išf ‚ÿ".•»žL·®9ö×±.WåŸä»ÝÝ‚]e9ñU3Àa Í0ÆÌáÑpìz¬ªWç‘Ë«B±X,>-¦î§ÔAµuMQgr3D<Œ\Žè‹zôZ4ŒÃì%BµZ%¢ü3.³R‹z#£á±ë±7¼Ã© Ô6G«—š…²,—~)‘´ÍuÊU*•Ìj•JEÅúæëÕÔuÖÆVmÒ Á^kU¿õC«<_tv(¸Ï)ì¼—ÝÇíðšzkSH¹\ìM.H1“Ǫ3è:5­ä¡-h±›±ÂO…|>`OÙÙiYë6LéÉ´•Äv±úªjiÑ͆5½ý^ÎyèBhêá>c€Ã>R÷SÁ@ÐÊÖ•·æS_¿¯ðs JÜIxz<-úÙ°fá§B0ôôzâ·âøŒö”vñŸõ''’ê JFmãõWÞÆoÄÕ€šý&ë:éJ=HµègÚɯ“ê9µ²P‰\‰à3ØSvtÁ)ì:,8€Ýb-8Åw»ÀŽBø„@ø@ø€Ý¡/ñ‘Ë—»[>Úé:Õúð£âÓ×XÁ*í”v¾½ú€ðMx4]fgƒ·w3¹œÿœŠ·à@²á-€×•yœ%¢îw»ÉFý¾Ò/Ï_«ùf꫃ÁתûF>൉í"©gƒ3ßæ_3(r%â:Õ-+þsÁÒ|™–çM‚øÈwf€VO£˜§f\§º}gÔÊ‚fZ¯6­?ómÎý®Çåîžz”1Ë+šæ?t¹»ÇoÅ1M€ðMär„ˆŠ/Šj è?œý~åÛû¢×?OÜ™ˆ\ŽL¥S¹äB Y/†üÉ;ɦfs3‘Ë‘üùȵ(Õ u¬7æ1›ŸßÓ´ÈÕhm—®FsÿÈE/GŠ/Jø€>à QÏø¦Ò)ׯ]D”ûGnÀ¯&ïN˜/¥&§ˆÈÆ×ív—~yž©ûb?o¯Wj›§™Ñ°ÿŒ—ˆ²³›Ùà‚žw{ˆ¨<_®Å—o²Däë÷EFÃø€>VõìBý7Ü ‚°…Þðùí–îwÝÙGSɯÿæ:é"¢ØÍq³¼\.‘£­mÒ´Ð$‰¢£M$"MÓ6³uIV+i š¹‰õò ÒðADÕe ßpk~Å ì/ÞÓÞ©Éd}hp:D¤/i¯ÕOeAÓ—8-¯&Ù³¡¾ÄÍU#pǰ¾Mö°ò ·°ï2Ç{òÑÎÔà ”yT›ï0_RÏQz23›ÏËG;}g6õùŽÝˆeeˆÈwÚk–°6f†‰Mî’ï=/eeÌU#pÇ9PQ]íu0ügýd¬¤óAz2-ØÁ.têÊ}—³^MÜI8Þqxz=Úš_móOòÝînÁ.Ȳœø*av*ÅgE"*>+vžÀµÛ)y'áë÷F.Gd¥3r-8ˆ-Ÿò#£ŸÎ"×¢~µç÷=‰/ã›éÐåê _‰ôüÖ¹1Kb×¢Œ±à…Ð&w)r9âþ­;z=æqwãØã3.äŸq™µºL`d4ü§áôd:<~þô¹ùjèBhüÖxâN"ÿ}þoÿ[}“.WWôjÔwÆ—¼— _ W*"ºøç‹Ê eäÓ‘øñÂÓÂøò¢„C®<_tv(åùâÙóšØí½“‡|´“µ±ba7ÀžRâ²û8£7\óQ­VÍ‹Í$Mòöz33ÙÇY_¿ÏL¦èÕ(c,t>4õhª¡É\aÎÎo¾j->ð¾çÍ<ÌQæQÆš€ƒJqu%n'tÎgr9"ò¼ëÁ{°g½é‚S3lãrÑÔýç|àƒI’òOVn áìpkcå…rCmA‹\‰¨~µ~zÅ÷žo&7£-h3¹ïòJ8¨ÆoÄ÷&:]]Á?„z~×ÃÊ€=ln¯¾å䑞L¯Ý¾Ø.Ng§É ÄÝ„·ß[yY1ËËå²ÓéÔ4ͼž¢ž·ßë=í ])W•®S]f!kcîߺ#W"žc ŸôÞ´].ý¾Œoì»v“±ôd:¦î§Ê;Ot¦¤‰H¥ú»>D¯EÉ äݤz¶ñŠÂO…` èéõÄo­ZÞ8ðþ@ü«8æ\uø°®ÈUÕäDÒÖßP!y'¹ì‚:¨ÖGEQ’#ó8»klòuR=§*Š¢œXµÖ×ï#ƒ|g>ö7ºÚe'#Ë&wÊå²÷´wW=Ô¿'{ìj8<¶çj—=Í ñ[ãkGV`wÙêæxÇáéñLýç>c„×¶…9]×ñéìA¿Â[;Ɇ·`¿Ó "âÖ7¦mîüÏ»”>ösìàœDDÌFÆjOZá*Æê¯ ·1n#ƘcÇoʼnð°›FFÃx`3’©&7J0H[âõ§tcÄ9Ùš n0Î9çœ l28'bœ“(îpþ@øØeÁ¡ ÞhÍÓÛüû2KšÆ9g6âq"ÑÆÈ ²5OŒ8kc_Òu]w8DÄ */hŠÓ¹“‰á`÷ùÎà†4Њ¦•›–W^–ïHÜ ]×v"[žó1Fd8t½¢/rÇ;é‹• c’(îX(ÀÕ.û眈ÈÐ9çú«Úª‡6XIjcÜ nºÙ‰¶TÑV„ÚðÑí7ÑP8qw¢ÛÝÝ¢• ›é¼óDgñÙÊäYz2-Bz2m•Ÿ;Otn¾Ãת ðæÌºÎÉà ëIÍÒ˜B Îl+ÁE×¹Ù‰¾ø:WÊìð‘ÿ!»«ÿn[MÓ¢×£ùò-ZmòŽdsÌ£Œõ4ó(ãúµ+û8»G¦Í»³oág;@_ª¡sƒ8ç˃\7Ì+o›±–ƒ¼vEŒ¡ëKnpŽ‘‹úš¼—´ž&ï&·ëëZT¿š~¸2Α}œ]‹e¯Š#ê*Žìí"í´þ(®®ÐŸ/Vêbå†m×N=ÊÈJgèã¬W›Vkª² ½Öž¿áŽOÞêÈÇrŒà+Á‚ÈŒ )¤.aXMV®—Aø¨O ·ÖÓøíxppåÒ€ü“|·»[° ²,'¾ªU³æ>Aˆ—Ê‚}Õ|ŠÉý[wñiÑœ-+¾(‘Êóe"âK|îǹžß÷lØ¡¶ õyû$IJÜYÙO³P° }ï÷™#7J§Ùsþ‡¼ ¹䈨ðs¡S9Dg¦Ò/ÏÍ?sßÏúN{×#oÒÛG¾ø·[ã‰[+ýòüuÛzN{ñæRsú½G-U4ûc½j5Ñ_ç;:粇r\1OØD”ûGŽ rýÚe½<Œ\Žè‹zôZ4Üì~ Åb±ø´˜ºŸR›Œaøú}æj=?Î ÿëpCè9Œÿ`8·rƒ¾¤ÿ”•NÿPP_ý“v&n'<§ûš67ç2êÿ^Õy³›¶%¢Š¦ù‡j•[Ï5­9›Ï{ûd¥ÓåîN.¯6kºNu'略 °½#+KM­»š6½½iÝ<ËÊ9Â1í²F`(¼—Ô´ä½d`(°ê÷×-r%¢úUó²”µD±ÕÏÞÓÞ™Ü 4“›1Ç9¼½Þ™Ü ç<ûMó1‰µ–Êb»HDÎgýޱ6órj¦-hæ¶²ßd9ç³ßÏF.Gf¾ŸÑ4-ûmÖ{(Çÿõ%žø:á?S{‡#WcŸý{´ôô¹úÁÀç×¢+ï¶$M?œjÚƒ9Õ²Þ„Ëz6m¹U?(=} #W£-v»iÍ‹—Â#Ÿ —žÎE.G¬Â赨÷´·Ÿýq¶a»Û>ÌÿW ªðØ`Ú¥¡ ÂÇZÊ1E9®„>)Çsf%=ô{9ç¡ ¡©uNQ°‘ÛíVjש.fÞYÖFÞ^o0TN(fzسÝY.—‰Èü»vÖlù'"¾ÄÍhÂÚ˜ë¤+þE¼ÛÝ-Š¢ç]OìzÌý÷&·r0X N»{=Å¥èò©:ó8Ó¥(d#_¿oªn.Æ×ïsléýY¯Ã¦²ßdýgüd#ß{ÞÖ3AMkÎ|3=Ðï# žõóåQ–ÌãlЯ’Ÿ\ÄŽð6ÇÞX´<¶ÑôUaƒNÞ²ýq‡Ó` ¾Ž®ù¶ðS!ñUB9¦D¶ºtQ=«ª~5v#f• œ‚ã7Ç7ßCâNâ³û¬~÷|ý¾ä½dèB(ý0m  ø¬µ)ÞÓÞèµhäJäPý#YïWmA“›-¼ul5™­×aóÊšfnÈÁXëµ MkV4-ñ÷Dáçb¡nCÓ4©]$"ÙéÄŽðöè ƒ†ÎÉQ3k8Ä,YÎz«N0òQ ç‚DÔ0çBDɯ“ê9UQ儲µž}ý>ÆXý ‹¯ßG6RÏnö"ÛØõØÌ·3²"{zVn¼¿Ÿ¸7!8„äÝdüfÜêYÓ4sžÅûž—s~h|4E±T|n] ³ÃŠ¢h® Ñ9o=O×´fp(È9žóÿíï+—;9ÛæÕ¼¯uM/Àë|¬É †^»óÇê•[šúÆæðaÝÝËÙá¬V«Ê1¥¡ÜÎÿüéóJ¥2òéˆU¸ö­£0Ƙ®ë®“®úLõUµ~GëY›ÊL•~)†V¡Ø.Ng§«¯ªS™)ë,åþ»Z­öü®‡ˆz~×S­VÝ¿qã_ŽÅæžȠ䃴ÚÈZ1ê=íM?L“A™ÇÙ¦—8­tÛ¬fáYÑÆßÓãIÜ]¹!ÍÀ{ÞäD’ [Žžo%|Í×BÆÚ?6Dø€C"z%¹•Ot&nÇãuS`o¯Cß{Þ®å›ôG¯DRé)ùDgúA2Úr"¬iÍñ±þ|±»ÇÓuleøí³Ë‘Ü“w¯ÇýîJ¾ÄÕ.°#ú+òôö™ÌÇæƒúÇ»>òoµ…ÒbúCÅtÝ}l×ÖoÚÖ*\û i‡õ·ÿ¶²õv1ý ¹™=oZsàŒo`ù²ÐÇ!ó£%¿®ÕTÏ<ßðØ]×ÉÆÈÆ6Ý D4¶ÆtvÚª\ÿ˜Ùˆld¶Õu,8…ªéïý8¼ƒ;ì¤Yyâõ9ìM®Aø€9`Û™3&Œ12õybíÜJãK6Æ™·™À‚SØtø0HeΡ°•o¬5Ç3Z2›¬ºþvaä`¿Û_Ò$IäÆò­Ö—#ÈzùÃa'²9ÈÆ™V©hldzÂÀ.óôz4­Œ÷¶@9á*¾(J’»6b#®[wäÃæ0£cµ:ÅE鈼Ãqá`7%'Rx`ËԳѫQåZLz‡9ìLUûV—Zþ°9VÕ6ôZ@aLz‡¸Aúb%ñuÒwÚkMÁ ||åù"ÞØ2Ï»=¾~_x4úCÐuÒ%I¢NµiýÑ«U×Ю ‡œs}6ŸßN¸\®nw·ÄV-Aø€u]üóp·»;q7¿5^Ѵͬe6bm¢rLñ÷û̯;%Éða)ü\¸øÉÅ™ogDQ †G>iQY„õn£pPyzz<ïöT4M«T*æ²ÓÍ\Àb#²1‰1Q’$Q$L»˜ÊóeïiïØ±©ÿœ*Í—Ôs*³±áÆqÐp>—D‘µ1§Á7é¬yÁ­ÃưàtEôzôâ'Í/³UŽ+‰¯¡?†>šžÒ6FÄ{~O÷ôMÆ22së©û·îÙü¬ùX[Ðú¼}‚]è{¿OÓ¿µ¼é«‚ Œýu¬ËÕEDéÉ´`»Ðuª+÷]G,ÂQi¾¤Ô}Sh½áKá@U¯†.„—›|UÅ™Ü ©ƒêøÍñê«=> IDATjôj4x!ˆã`ÇÔVhæŸq™•ZÔ ]9;”Ü9‡ÃQ©Ţ4ŽH¥b‰µ1ι|T®¼¬PÝ‚Óõ^ÕuÖÆˆ¨ÏÛÇùtÄÓëiÚÿAUž/:;\Þ »0¦Àe÷qF{|äC9¦_¬œ&9çw'ÌÇÚ‚fÆƘ¶ÐdÚ¥é«f!¥î§8ç H’”’ǰcötøð¾çMO¦­§™G™ØÍ˜ùXlù'"¾ÄÅv±¡aëWÍ ÓÙi}Q¿5îí÷â8@ø "¹4»›¸7Á9Ï?É2˜/ùú}É{I2(ý0íë÷54lý*užèL?H‘$Jk׫À! Ê1%u?»s¼ãðõE.GüçüæKññ‰{‚CHÞMÆoƶ~•ˆ’w’‘+Á.¨ƒjê>¾\`çìõ;œzO{­Ëkë™ó& …ÖíM[¿JD=¿ï™+ÌáãØy¿Â[€ð€ð€ð€ðp0Ã_â?¹(˲`:Ot~þŸ[/•ËåÖm7¬°!¡ŽãÇ€o ø¢ˆ#à ‡à‡Aå¨R|Z¬¾ªÎ~?[©T"—kßjë:åjÝvà ›Q]Vú¥äéñ¨gU1oúë½ùukùg\f¥õFFÃc×cÎe'wÎápT*ƘùT[ЗRyY!"Aê¿(®É¶Q…ßšÕ=pÎ¥#’¾¨ïëÏ»<_tv(åy áÀN+qÙ}œÑùPŽ)ÑkQë©Ø.ZÉÃú›ˆòOòÝînÁ.Ȳœø*±¶‚õ þqz2-ØÁ.têÊ}—k½'|‰ýe,z%ºÞÍžÇþ:ÖåêÂáОÉ{ɉ»²,_üäbz2]ø©`–›Ö°Dð|0r9¢/êÑkÑðhxm…¦ÔAuüæxõU5z5¼lZ§~ÍGäJDl×Ûb-‰âLnG@ {zÚÅ”ûG.ûMÖü“ü: Ðz³* öZy}…¦û¼}Œ±‘OG<½kf§!yX­øOÜMŒÝ{þôy‹-ê‹:kc{ùóÆ´ ì–ý1íbêù]ÏgÿÛgÓÿ5=››Y[A[Ð"W"ª_í<ѹùnS÷Sœó$IÊ?É·®ÌÚØð‡­«]ÖÛâO{ÁžÒ‰sn=uÿÆ­iÚÚjÞ~/çT{Ͷ’$ ?‚ §×¿_i\Wl”žLsÎ#W#Öë':ÓÒD$‰RÓL³*yhZôZ48lµEØïá#z-šý6Ûýn·`—Rú¥»3_òŸñK²d>N~TÏ©Š¢('V–¤ÔWHÝO©ƒª,ËîSn«BòN2r%"ØuPMÝO5ÝkÁ©rBáKܺô¦é`3öÁ‚SØFXp »e?-8€ƒá>áá>>á>>ácëAØ–~Êå2>9„ã:åÂ'€ð±s´ ŸÂÇk!þE\>* v!=™¶ wŽwž^/êgjÌÇõÂÇf‹ÅâÓbê~JT­ÂÜ·¹ÊËJ0 †×kX­V­¿`ß±íÖ†#W"Œ1ÿY?+…Ñ«QÆXè|H¹ªà³8vmäCŵ…Î'±6V^Àõ,oŸy ­¦iN§³á%,2@øØ~ÑkQ2(y7©ž]^b£ôdšs¹Y©gC@øØŠ¢8$Gæq&v-f–˜+ReYvŸr[Õügü’,áÃØó²‘ü3.³R‹z#£á±ë1gÇ[\*®ayÛÊóEg‡Rž/â­€Vâ²û8#|· ì0„8¬ás.€ð€ð€ð·>ácû¤'Ó‚ ¤'ÓÖ4¿ävÛÕw+€>â_ÆCBñ/ãÖtr½¨ïw6Øa¶­5k1`Ðút^|Qœûqnê?§E)¾(*ÇZ}S¶ ½Ÿù-u ›±Å‘3aTWÛÌ@Bâv"x>È ž&n'š¦óqýßfbèóö v¡ïý>MÓ¬šñ/ãÒI:"ef²³², ö•9ü“|·»[° ²,'¾J¬ívãþ¿ˆËGWõ »>ÌœÑ6žÂ0(q'1üñ0 <œ¸“ cã|c>¾4 TõjèB(|)lU+üX(K‰[‰ðåpîI®ø´˜ºŸRUóÕàù`ärD_Ô£×¢áÑðÚn-ëõ_,ú€7QK ùg\f¥õFFÃc×cÎŽÆY3sl*y¥'Óñ/âÓÙió©§×¾öŸõ7dëq}¡tD*K¬qÎå£råeŬPyYÛE2H° ú¢ÎÚXó$d`oÒ­õxÝþ+Q7›®ö¼ò|ÑÙ¡”ç‹8ô`‡•¸ì>ÎhËk>Æ?6yVŽÏ~“­/‰;âføØ¶ ™Á‚1V¿hCliùç0+4´ŠÝŒ~*äóù-ö/Š8\¶Ñ6\í²Éäa.5­¾ZY#¢ëúÜsÅņд¹Ø.ò%ND|‰×Ç&xû½œóÐ…ÐÔéÖ5·Ö?ìBøØ¤ÄíDøR¸~¨…1vñ“‹µe§6JO¦9ç‘«‘•¶•,âë÷%ï%É ôô¯ß·É~*AO¯'~+Þ´[ËÖú€½> JO¦‡ÿ4ÜP<ò¯#&È sE§,ËîSnëUÿ¿$KæãøøÄ½ Á!$ï&ã7ã›Ülòë¤zNUE9¡4íÖ²µþàu½é‚SØ_°àv‹µàßí; á>ááöŸ×»Ãéă,Þ²}ÍÛƒë•`—aä>áá>¶•ÎyòN|øc5èþ$˜šœØ|Ûà`_‹W+š¶ÉšpˆÂGâÖ˜Ø.Ån&“Ó±k ¾¤§î%6Ù6yºÅ«áKÁMÖ€C>rO²Þ÷üƈÈÑÆ|gÔÌã̶ôÌ—8>{„FN§’™LZO%QLü=e>Ö—xìz$èù$X|V0 ƒƒ}SÓ#—‚T7™ìË~“ ýa zåbeI³^ª¯°ÒüQzøÏjp°oöûÜò†´è•‹¡¦¥1ApÀÃÇÅOF²ßf‡?Vwâ³ßçŠ/V¾~â^ÜÛ;üzZ ß³Êm,zµqj¦øsaüï)O¯7y7AËó,Mg[´r)v#9òoѱ¿D–7”ðôúÆo§Ê/ð5ô=|(Ç\ñ[ÉðhT¥Ì£TäòG3ßÖn±:ûýL÷»n²‘§Ç;vãoV“ž¯£5ôã?tØXO¯¯Ÿi½Eÿ¹ƒ±îw{¬’Ùïgzz½óŸ ápxs¶½¿‹Êq—rÜEgÅg…؈§×KD𦑭­l.i µ;Í—´º‹\šZ\4M3û”ÚE.onO|„>ÐùÊÊPå˜ËZ(ÊÚD26Ûya­¾ÄEñµkõ%N«¯Î€ƒ>Üïz3Ó¥r™ Ò—´©Gis؃ˆÜ¿éžý1OÍær#Ÿ[÷“žL’AÙo3ž¯U¨/m*LxÞõd¿ÉA麥¯p0ÃGp(T(ÌFFCÁ@ßÅOBÚB)taØ|)ôápæa2èK>¿øI¤u?Îv9ôá@áÇYÿPm݆û·=}¬nfüçCùï³ÃV]Ç]8\ÞœP­V‰(ÿŒË¬Ô¢ÞÈhxìz,›ÛW|û¶å6bú’vñ“`âïSûúóöö(Î¥<+w`§•¸ì>Îßí²¡ÐæòyóôdÒuÒ7à Ùðl>þ8ÿ2ª-i®“îáæwáãM¿ºÅÓëµV¹À›Ã´ |ÀÁõzÓ.s˜€Øßp ì:Œ| | |ÂǶêH’¤ªÚ‚f½´…Þðy |l º¬ôKI=£†þz“®ðy |lkc¡@æQŸÂÇáœ3k(¬ŸL±kšÖçí“$)þEÜ*¬ÿ".•»žL›…éÉ´`»Ðuª+÷]GÀa|‰Ç¿Œ«çÔÍT†CR©”ÿ1ß´B±X,>-¦î§ÔÁZ‡ê :~s¼úª½ ^âÈ8¤áÃZp*+ráiaüÆøfZM=œ cÑ+Ѧ"W"Œ1ÿY?µo¯7ó0“}œõõûž?}Ž#à-Ùëßj»µU¢å…2kcDäìp6­ ŠbC‰9 2ðÁÍ|;ãþ­ÀÛppîóa]…kf MÓˆ¨\.o²¹Ø.Ng§õE}üÖ¸·_a€ð±¥'ÓœóÈÕˆU¦žUwdPôZt“ÝtžèL?H‘$Jfp„&ÌéY–ݧV&Jb×b©tJ>*{z<›ì'y'¹ì‚:¨¦î§pd¼µqƒ=¬Å‚ë%ÿYõUíqèµ[‰íâÌ·3D¤-hÖò«I}·Öãžß÷Ìæp@¼mó»]$IÊ>ÎrΣףÞÓXÀ€ðñ–ÅoŃï8ò?äã·âø˜öÛü©CÀPŸ.Àô+¼€ð€ð€ðp8íÝû|‚°¶°á†ë‚ ´¸; |¼+U´HHû¦]á£%AÆþ:Öåꢺ©MÓú¼}’$Å¿ˆoX8àìBßû}š¦­í3=™ì‚`ºNuå¾Ëá8ì჈DQœÉÍÔ—„Gá@©TÊÿ˜ß°0v=VÕ«sÈåÈÚ>ÕAuüæxõU5z5¼Ä!°Íã沉ü3.³R‹z#£á±ë1g‡² »¸z͇ ú¢ÎÚXýK²,ŸY+Ï—å£rëÂÒ/%²‘¶ ¹N¹J¥RCŸ}Þ>ÆØÈ§#ž^cì€}Þåù¢³C)ÏqèÀ+qÙ}œÑ>ù0SªsêBÙ,tv87(,—» ‚tD*—ËkûLÝOqÎ>$)ÿ$c`{§¢(š 8êóDóÂv±úªjiÒU»8Öõñ[ãÞ~/„&Ô³jâN‚ Š^‹¶.ôõû ?È Ä„§Ç³¶«Îéi"’DÉZ‘ «Ä®ÅRé”|T®ÏM ã7â/]ÂØ±ÄÄÚ®’w’‘+Á.¨ƒjê~ ‡Àö²íý]l˜©j=ÛÅ™ogˆH[ÐDQl]8ý_Ó-6Ñóûž¹ÂŽ €·ä€Œ|H’”}œåœG¯G½§½- ácÄoŃï8ò?äã·â- `wÙÆ †›)€Ý…ïv„@ø@ø„„@ø„½*=™!=™®/¡á |lø—ñÐ…PüËæ·(møæØãöúN‹/Šs?ÎMý產(ÅEå˜‚Ï `_Ûë#‰Û‰àù c,x>˜¸X[ÁšvÉ?Éw»»» Ërâ«ZÍôdZ° ‚]è:Õ•û.gjš6àìBßû}𦵍 ‡,|”¸“þx˜ˆ†?NÜI±nÝàù`ärD_Ô£×¢áѰY¨ªã7Ç«¯ªÑ«Ñà… Y ǮǪz5p.¹iQWøH?Lw¹º”ã )Ç帒~˜^¯ò\aÎÎÏ YãÞ^oæa&û8ëë÷=úÜ,œz8å:é"©gÕÔdªEM8\á#þe<ûMVX–û.·Þ²S"Ò´È•ˆêW;OtZ…©û)ÎùÀ’$åŸäÍÂr¹,ØA¤#R¹\nQQø0—šV_U-º®Ïý8W|QlZßÛï圇.„¦NY…b»8Öõñ[ãÞ~¯UXßm‹špˆÂGâv"|)\9cìâ'›.;%¢ÂO…` èéõÄo­ŒŽtžèL?H‘$JÖ\Œ¯ßWø¹`.(ñôxZÔ€m·W/µ5(=™žý~¶¡xä_GºÜ]ѫѵ-’_'Õsje¡¹Y)¼“ ý1¤ªd£ÔýÚòŽø¸P³ßd]']©©5`Û æ¼Cþ—Y©E½‘ÑðØõ˜³·ÙØßÊóEg‡Rž/â­€Vâ²û8#|· ì0„@ø„„@ø@ø„@ø@ø„Óí7ÑP8qw¢ÛÝOácûåÈÇnÄê¿cVÓ´èõhþ‡<>9„·Bý@MÞKZO“w“þ³~|loK`(¸°žÆoǃƒAëiþI¾ÛÝ-ØY–_Õªiš¦úU‡ÃÑy¢3ÿ¤6F"ÂØ_Ǻ\]D¤-h}Þ>Á.ô½ßg «¤'Ó‚]ìBש®Üw9‡4|(Ç"2çYrÿÈ‘A®_»¬Wƒçƒ‘Ë}Q^‹†GÃfax4<ÔõصXðüJREq&7CD׆Cª^ ]…/ÕZ©ƒêøÍñê«jôj4x!ˆ#à-ªÕ*åŸq™•ZÔ ]9;”Ý9A¨V«ŸÿÇç¥_Jã·Æ?úð#EQ>û÷ÏÌòUU ìµBY–‹Å"c¬¡+}QgmŒˆ¤#R©XbmŒs.•+/+DÔçícŒ|:âéõ4´=HÊóEg‡Rž/âЀVâ²û8£}q©m`(¼—Ô´ä½d`(Pÿ’¶ E®DT¿Úy¢såüºPnšÌäa¶23Æ´…Ú´Kê~Šs>ðÁ€$IÖd l»}>”cŠr\ }RŽ+æ,ŒÅÛï圇.„¦NY…¢(’ѪC±]äKœˆøÛE«p:;­/êã·Æ½ý^‡7|Q0LO¦ƒÆ¥…Ÿ Á@ÐÓë‰ßŠ[…¾~_æq† JO¦ëGDê+$ï%É ôô¯ßgvžèL?H‘$Jõ÷À¡ ç‚DÔ0çBDɯ“ê9UQåÄʈHüF|ì¯c‚Cˆ\ޤî¥Öö¿Ÿ¸7!8„äÝdüf-µ$ï$#W"‚]PÕÔýŽ €·dO/8…m‡§°[öÓ‚S8H>á>>áá>ááÛžÝ3AÖV«UA¨Ý>¶“•0Ò’À¾†i@øhÉšŽ!þe\:"IG¤ÌÃLöqV–eÁ.¤'ÓfMÓ|‚]è{¿OÓ4«ÕØ_Ǻ\]D”žL vA° ]§ºrßåp4 |l ðc¡T,%n%—ù'¹âÓbê~JTÍWãáØõXU¯Î"—#V+Qgr3D¤ªã7Ç«¯ªÑ«Ñà… Ž€G0—PäŸq™•ZÔ ]9;”]ØÅÕk>¬§‚ T^VÄv‘ 삾¨³6V_A–åÒ/%²‘¶ ¹N¹J¥’ùªU³ÏÛÇùtÄÓëaŒ†Ï»<_tv(åù"}Øa%.»3Úï#b»HT[5kæ‰U'ÚrY° ‚ HG¤r¹l•[5S÷Sœó$IÊ?Éã°ØyÁ©Ø.V_U-M+Lg§õE}üÖ¸·ß‹£áãøú}…Ÿ dPâNÂÓãY[¡óDgúAšˆ$Q²V¤À[e;À?[üF\ ¨Ùo²®“®ÔƒÔÚ É;ÉÐCê J6JÝOáh@ø ZsW1ëézw³‹íâôM·è­ç÷=s…9; 7„@ø@ø„„@ø„„@ø8 áC„ K¶Ð |‡E[Ðú¼}‚]è{¿OÓ´…–ÏÿãóÈåˆù8=™ì‚`ºNuå¾Ëá8@ø¨V³Ê‡/ †U½º _ ·(4Å¿ˆ—J¥èµ¨ùTTÇoŽW_U£W£Á A;wr¯V«D”ÆeVjQod4ocläÓO¯‡1vx>ïò|ÑÙ¡”ç‹8ô`‡•¸ì>Îh_O»°6FDŒ1mAkQHD™G™òB¹<_¶JR÷Sœó$IÊ?Éã€Ø1û5|ˆí"_âDÄ—¸Ø.¶($¢ÔD*z%:ry¤¾ùtvZ_ÔÇo{û½8>6àë÷%ï%É ôô¯ß×¢ˆÈFóÂ…üµAŽÎéi"’DiíÒT@øh¿Ÿ¸7!8„äÝdüf¼E¡%v=­­BMÞIF®D» ª©û);ƶ—w®aµi}‰9oÒðjÓB«‰÷=¯÷½Ú KÏï{æ søøvn2€ð€ð€ð€ðpàÂGæaF:"qÎ_0H–å‰{­› ‚𺯶n<|øÎø”%y7ÙPž¸›D)0hÝ|í—ÂÂÇ¢W£Ÿ_ÿ¼¡pìúXäJÂÇöóñ‰mbæaÆ*1†ù'ùnw·`dYN|•0_aì¯c]®.ª›CiZ“ˆò?ä»\]}Þ>mAkØ®¦i¾Á.ô½ß§iµWÓ“iÁ.v¡ëTW€>ˆ(r%½µžF¯GÍaàù`ärD_Ô£×¢áѰUAÅ™ÜL}ëÕŒßŠÏægGþm¤¾Ð ǮǪz5p.¹\eQÕñ›ãÕWÕèÕhðBÇ À– æòˆü3.³R‹z#£á±ë1g‡²Ãû×uª+y'éþ­;ÿ$<œ+Ì­zÙ Á^ûAÐuÖÆÌÇË>V×,•JN§“ ’d©ò²RßD–åÒ/%²‘¶ ¹N¹J¥õyûc#ŸŽxz=Œ±ýûy—ç‹Î¥<_Ä¡;¬Äe÷qF{ÿRÛè•hôZ”ˆ¢×¢ÖjmA‹\‰¨~µóDg}e3yÔ[¯¦Óé$"²‘5±²rz.—» ‚tD*—Ëfaê~Šs>ðÁ€$Iù'y@[¶×Çÿœ¿ð´û.W(¬‹\¼ý^ÎyèBhêáTëæëÕ4—zpÎíΆ&b»X}UµX…ÓÙi}Q¿5îí÷â¸8°áƒˆ¢W¢þsþú‹\ ?‚ §×¿oÝv½š‘«2(û8«žUšøú}…Ÿ dPâNÂÓã1 ;Ot¦¤‰H¥µƒ%°y¶½¿‹þsþä½dý½=’_'Õsje¡²áe·ëÕôõûdEîruM¥ÇNâ7âj@Í~“ut¥¤jýÜI†þRU²Qê~ Ç À–íõ§°½°àv˾Yp   | | | | |ÂÇÖu»»'îM4NÜèvw›AØ– YýlW‡°/ÃGþ‡|ìF¬þ[a5M‹^æÈ›O­¯°„í¡~ &ï%­§É»IÿY?>„·%0HÜNXOã·ãÁÁ õÔš%IO¦» Ø…®S]¹ïrf¡¦iª_u8':óOòVá€o@° }ï÷Õ©4È?Éw»»» Ërâ«„µ¹øqù¨,Ø…ôdºE‡Ú‚Öçík(¬ŸÓi½ç°káC9®‘9Ï’ûGŽ rýÚµ¶š:¨Žß¯¾ªF¯Fƒjé$<žê‹zìZ,x~¥0v=VÕ«sÈåÈzÛ žF.GôE=z- [åÅb±ø´˜ºŸRÕ_ ªz5t!¾nñ6ÝsXùÝ\f‘ÆeVjQod4ñôzcfsY–‹Å¢õÔ*,ýR"i šë”«T*Õ÷c=Xa`_yµR©ˆ¢X_³i‡Ò©T,±6Æ9—Ê•—•†Î[ïùÞQž/:;”ò|‡>ì°—ÝÇíÊ¥¶¡@ò^R[Ð’÷’¡@Ó:©û)ÎùÀ’$Y3,å…òÚÓy¹\ì‚ Ò©\.¯·QmA‹\‰¨~µóDg}¹™<6ìP[ÐX#"Ƙ¶ µøéšî9Xv!|(Çå¸ú8¤WÌY˜µýl6¥IDATÄvq:;­/êã·Æ½ýÞ• `4©Y}Uµ¬·Qo¿—sºšz8Õz÷šv(¶‹|‰_âb»¸6Ù´ÞsØÍðADÁ@0=™Ö]Ñy¢3ý MD’(Y <}ý¾Ìã ”žL[¾~_á甸“ðôxÖë°ðS!zz=ñ[ñÖûÖ´C_¿/y/I¥¦}ý¾ZU¥'ÓœóÈÕHë=€Ýç‚D´Þœ %ï$#W"‚]PÕÔý”Y¿ûë˜à"—#©{+…/]ÂØ±Äĺ~TÏ©Š¢('6X¶Ò´ÃøøÄ½ Á!$ï&ã7kñÅ\¦*˲û”»õž€eGœÂ®Ã‚SØ-»¹à3„@ø„„@ø@ø„@ø@ø„7•žL ‚žL¯WA„]y/vk»oWüËxèB(þeï>À!dÛáí_ç~œ›úÏ)EQŠ/ŠÊ1|SÀá²Ó#‰Û‰àù c,x>˜¸°Êµ­ÏÛ'I’õ-öJgñEÑÌ+':‰(ÿ$ßíîì‚,ˉ¯jÕAˆ—Ê‚}e*GÓ4Õ¯:ŽÎù'y«pÀ7 Ø…¾÷û4M[o»p€Â‡A‰;‰á‡‰høãáĵW£a_¿¯ò²’ÿ¾–|g|™G"Ê<Êøú}D<Œ\Žè‹zôZ4<¶z-‹Å§ÅÔý”:¨Z½ÏõE=v-<´ c×cU½8ˆ\ެ·]x«„jµJDùg\f¥õFFÃc×cÎŽ7š%IO¦ã_ħ³ÓæSO¯'|)ì?ë'"Y– ?Äv±<_–Êÿ{÷×} züg8†ß€ 3 $Ð ¬D +±}°h¬’Ëä¡]HD]m ·rkóàŠ<%AÎBnµ ½Õ-¤Èû¤À và†È¹ÈR¤ š@JÇÐÀj˜æ€xÎx$FFVœÄþ|ÉèH:£ó³ÍùÎ9¿sæÎ;W?¸ºð?––—ÆÏO¾8™÷G;bŽoýæÇŽ«×ëÅb1œ/ìïï¯V«1ÆíÏÞßß_ûk-$¡q«1pr V«u}Þ‡ûÏ{ó‹jßãåÍ/ªþêð€ÕÒþ¡Äð€ç|ÌÿÇüʵ•í•ÌæóøØ¼µY|¬Bè{¼/ÿÒèéщ&BV¯¯.^^ !4n5æÞž«|ZY_¿ç(E^÷ìbomv”GassóØñc;¿³ãy€¯Õƒ;í’O5½sûN[³Ùܸ±‘Oìè{¬oss3O„üûcŒÃCÃç_>?xr0/‰Ñ3£išNþbòÊûWö~®b±Ø>¡³µð±âögÏî|^à!‰…ß-L¿<½ýPKŒñüKçói§ã?ϧ€Ì¾1Ûþ†±3cóÿc¾}Â¥òieâù‰‘§Gæÿ}ŸËtÇÎŒ]ýðjÈÂò{ËùdÕ|aå³J>ïdäÔH¾°ëóßýøÈÂò{ËSÿ}ªcñ…__¸üîå…¹7çV?^í/÷·³ Ï…öC‹ï,Žÿl¼\.—ŸÚgêÉü[ó—þíұ±™‹3Kÿ¹Ô^xþåóÇ Ç.½u©}mK×ç¾>tÂ)ß8Nø¦´'œzoà€øÄ€øÄ€øÄ >Ä >Ä >Ä >ñ >ñ >ñ >ñˆñˆñˆ@|ˆ@|ˆ@|ˆ@|â@|â@|â@|ââââ€ø€ø€øÄ€øÄ€øÄ€øÄ >Ä >Ä >Ä >ñ >ñ >ñˆCˆ@|ˆ@|ˆ@|â@|â@|â@|ââââ€ø€ø€øÄ€øÄ€øÄ€øÄ >Ä >Ä >Ä >ñ >ñ >ñ >ñˆñˆñˆ@|ˆ@|ˆ@|ˆ@|â@|â@|â@|âââ€ø€ø€ø€øÄ€øÄ€øÄ€øÄ >Ä >Ä >Ä >ñ >ñ >ñˆñˆñˆñˆ@|ˆ@|ˆ@|ˆ@|â@|â@|â@|âââ€ø€ø€ø€øÄ€øÄ€øÄ€øÄ >Ä >Ä >ñ >ñ >ñ >ñˆñˆñˆñˆ@|ˆ@|ˆ@|ˆ@|â@|â@|ââââ€ø€ø€ø€øÄ€øÄ€øÄ€øÄ >Ä >Ä >ñ >ñ >ñ >ñˆñˆñˆñˆ@|ˆ@|DÒÓwo~Q5dÀƒˆÅËK xpñá˜p$ÌùÄ >ÄðÝ“¸ÕÏ«kŸ®¯¯¯­Ý¨Ô6kå6ö÷õŸþáPù©ò}®íØ;wBëNûcÍ_ èÉâ^ž{û·Ô&O¿t~â¹çñƒµ´è18í‡váâÌ£V!„¹·{áâÌý¬ÁiöÑÌBiÈÒÍKB±Ðûþpá +×Vòǃ'ÏýôÜðÉá¾ÇŠå mÞj¬ÝX[~oyãÆFaåÚÊÂ&1y¸µ9íÀîÙ‘¦iB1 …[Ÿf­…ßaYzoĘ„c!Æ®`£R™ø§Ö®wòç/L>"£´xyqá‹ù‚Åÿµ080pðõµO»8òÀnûžÐø*Ývx b i’­Ò,¦iš¦iÈš!)„,MCˆiŠÅöÇúÿ_Ï– œÿlj4M‘Q?7^ù¬²¾¾–BOñ±•1þqÐýuj£‘¦iLBš…4„bCB‚M‹!'b#„ô«f³Ù, !„4 ›·å¾¾ƒì×nlÄX!Œ=3ö¨ÒèéÑÊJHÂÚ‰ç³fNè®þ·Z¾³i6›!k>TÛ–ÄÄcŒ…¥Í/ëùâæ—õz£qÙ-ÕÏ+ùJÊß/?j£Tþ~9MB±úyåp+tך²5C–6o·f’PH¶ÍL³wCë,CHòSùnùQ¥,Ä$†=©ÅivÙß|Õ¥RóvHÓ´cþÂÑîY›ßÈÄÌ,IHóó#YÚ¼ IHÓ´þe½X,NìóÓ1ÙZOá‘¥|“c²mÄGi3ßå¤Yxh¯³½û²>fi…4m†ì@×Ê ñŒÒÀÉÁ ×Ö7¾ñQŠ1Ä Ç9µE|°ËKí4 Y3¿j4„˜ï{š!ùkúoF[—’fiÈÒ4‹…¬ÙLÓ4KÓ,-„ýv«Iáë¥þ'ž¼r}©µãÿ2­7ê!„4M‡‡\ì2J!Äp<¶A|pD¯tÓ´ýš>¶où¥!‰]OØ->î^8š5ÃÝÓiâ.ƒÔ?«ôâö—ËO>5øÑs“é­ZÇkè{v®ŸWgÞ˜½þÿ®‹Å©''ÿiòëÛ¢'ŸüËç[ûÔ­×÷­ ÜÚäŽ|ô6J=ÇÇçÕ½H„67k³o¼¾rm5„0zzdæâoúúúwnrîò;‹µFãÂKS-®£”˜p À× ÙL»ì󒨹O !„°QÙ¼òÌØï<úäSƒù§yy¬Öj]$„P«ÕÆ_˜˜¹83ÿóµZmú¥éâÄ _ïëøv:ìè¡.›¼[|ܽ²¥§QÚ×È©áÕëk;Ÿ«ãàÇö5§_¥³o^š|qjö͹…Õë«soÍÏ\œ‰'âÎo^¼¼Øh4¦~5ußmQ*ZWîOÁiv;ò‘æÓ ó=ÐÝZìsZ!?øÑ.J½þú§ë•î$þ°0ùóɱ3c1‰å'ʳ¯Í.¿·ü 6­5?tëAkBåÁOpl;írˆQÚ­<¦^™95Üåbw󿛟xnb`` &1Æ8zztöÙ¥å¥ßÙ.#¥¤ÐñÀ‘$è²$K»~lÜX;ûáÕ•gÆ®<3–ÞªÕšéôŸ®oÜXÛíG®_[}f¤ýéÀ@yéÝÅüqe}}ü§ãƒ'GžY¾»pp`pñ…ÑÓ£ƒ'W>¼ÚÚ6çu~øäàÙ3g+ëëí…“/NžœüÅdÚhlïƒöã]7ðòÛˆ’žGi·‘SË,nþµ–WÈÎiܪ¯__KëiÇÊW®­”ŸèëXÛÕ®vlòâ; [›S¿œìíÛe”bþ.z&œpôG>BÛooÕã úþ¿+7Ööø†Úæf¹¿ÜõKÓg¦~9¹öÉÚôKÓ³o^j/¯~Q»úþòoßš;ÿòt¾dö­¹sÏŽ­}²6õÒÔô«3í…3/Oo¬¯{{n—õÛ7°‡«]b!ÿ¸ÿQ !Œ<=²øÁbúe½ï‰þÑgÇò±gÇ–ßYZ¿¾VY¯ÔnÖŠ}¥sÏŸ­}ÑyµKõfµX,u,¬|Vé8æ±üþÕƒóØw”òwÎßÝæÌù »fÇìË­·6í~°}xhxkzig?¼º¶¾¶Ïn8‰,ÝV¸ô^ëÄÁسc3¯Î´×sþ—çCGž YëEùʵ•™WfÒFOŽžm-üpeæâLš…S?{{~ú•™Îc­£ͽ6yÏß¼õ#_Õ{¥FO,~°X­VCúï_cÿCH³P­T—ÿ¸´v}}åÚjǨv;8±@ ï,6n5žX¼¼4þã½ý%Øm”’Ø:ó">8J;fnPØùÚýÔÈöò8à„þ¾þêçÕrùîÁ,\ù?WÎŽ !Ôëõåw—«7«ù|‘­U%[ó[4ë¼D¶Ñh  ïüMöù•²ž'œö4J;]ü`±V­v^â»íÓÆWiåÆFõÏÕµOÖ¯~°Ò± åÇËõ¿Õ ßÛ:Ñü²Y~¼Üþ¶êŸ«Ó¯L‡,Lýzª\.v»kj¯1bë çÌùàHuÙOgÝ߸µ]•zýì‡Wó™sÿpjäÔÈÞO1ô£¡ÕWÛŸ®^_]~·5átúåéfÖ;3vé­K{¯¤X,î¼9G±X\ýxuõzë£Û´Ë¶ôt“±üãࣴkyüµ¶Ç³6nÕ×>Yk—G·'£Õ›÷\Ž[½Y=õô©ö§Ó¯LçÑ6ûÚìëo¾^ÿ[½—ÎØe”îïR[ñÀ.ñ‘uÜÚ!Ýý95²úë yyLÿéúêÇ…jÍt TÚùÍ?_üãÂʇWšÍúƵÙ7g'ž?—©z³:zzdè‡Kï.Þ³lÿøÝÇ#§†W?Y YsåÚʹŸk/¬~¾²æ•ÿ½4ùâd÷ß{3÷Ö¾Úå`£ÔõãêûW&ÎL,¿{5ì=µ/jkë•êÍÚÚ'ëWß¿Òu%Ï?wnù½ËÕÊFh6C³Y­l\~÷òÄsã;7¹TŠ¿yùÂ̫ӡÙ<ȯ·×(%á~®vqÚ€Ý^õî¸ÁÃíB(o=h«VÉË㣕š·ÃG+ýdô'ù=?FžþÉG+ízÐâ±¾™×fçÿ}~æµ×‹ÅâäÏ'Oýx4_ù…½0óêl£Ñ˜üùdû©·?h?ž|qjöÙéW¦ûúúf.Îl-|mvýÓõòãåß¼ú›ŽooBáø>›¼›B¡Ðë(uµ´|eüÜÙü(HÇ>¹öE­r£Rûk­òieiùÊ®kKâä/¦æÞž[ÿÓzaè†Îÿê|ŒÅ®#Vþ»ÑÓc³ÿvé¿\Øw¥B,Ä·A|p4G>v™}Ù±ÌS#pϾ³™ööe<ô÷C¿ÿÝïw.ÏgæÏýì\û¹¶?o«`ŠÅ¹7;¯g)‹sou.lÿÈn;òîpcO£´d騳£iê·ê!„ÆßÕ/jõZ«<ö^Cñ±âìk³]¿´³üÆž cùÅö¥˜ÄÂñ¡ç|ˆvß÷$1$±4c²×Þtçn·"éϾkûZÅdë$ÂÁ‹¡x÷þ¡¥}û#&1 a僕ís)ö-®cxäÃØ1JÅ‹'bû&ªâ€#’¥…ã¡qØŸ>ÈÎïwÆÞ Ç{9í²íj—û¥Žþøá@LöŽop [£c~«Ã­Ä„SºË¯ãˆIIáž}ÏCakC’’B~°¡—Û«ò#¥¥å+9Éò­¥ã­%‡[­#ìYk¯“ôáÞÒ˜„^ß ®Øñ¶mG4JߪòØc”J±P:QpÚ€£ßÙ4›iŒ1McÇ«áÃÍlø¶É_ÖçûÔcOOåQбNÄö ˆŽ(>bLÓ´TŠi¼ûÞ­wïëðМ| I!$i¾EõzãàwÍ*•Jù‘Gs”â‰X<K¥ÒáÖgÎÝ•ŸÈo™ßH;±‡ãÕ|¾C±“c,}/†ª7«¥ÿÖÀWåÅÖíÅcù‰ò#7J¥b! ÇcÑ¥¶­ñŸž}m¶üÆ\é{±p<6o·Þœ½báx8ôdÃo…¬ò·†±ô½f¡ùe}áűӣ!‰9þQ8CšÒøì›Ö(>=RŒ1ž(ÌùàhüèÔØ™±éW¦'_˜ø»R©Ø Ûnnq»ùÝÝ´­"Yš¦Íµõõùß-  —âAïž_h:òô©±Ö(üh¤T,[!„cwîÜ !¬ÿ9í5ÿÒè°zýúÂ+7ÖêFo}ò“OËß/ž.‹ýýý¥b±×׿Fé jiÿТøà²Po4õz=ŸPùÐí\ó{w–b,–J‡Ø§¥^ãÃiöß딊Åx"öeéÃ÷²¾ýâ>$±ÄÃïR/ûï. I ! …Qºo.µÄ >Ä >Ä >ñ >ñ >ñ >ñˆ€¯I’ÿ/ i5-íòE€ÞeŸ§!Ä­¾(žˆ­ÚÈBšå_¸IH³ r7>jF!‰! 1Ƙ„4Äß Ð‹4&! ¡™¦]â#MCÒ˜ùN¸G!ký7ͺÄG3?6’fÍ â8ÊÉšiG|„,ÍÛ$½w1ÀýJî™ùñ_·Žàdx=ãIEND®B`‚kildclient-2.11.1/doc/C/images/pref_progs.png0000644000175000017500000010664211405233117015715 00000000000000‰PNG  IHDRNÀT çÀsRGB®ÎébKGDÿÿÿ ½§“ pHYsÚk¥óÎtIMEØ  'JôqwtEXtCommentCreated with GIMPW IDATxÚìw|EÇ»¹TB€ ƒB ŠHï ]@QAD©‚/J à+HoÂ+5´zoÒ”Ž ½ ¡$!=wóþqw›Ý½Ù½M(ø|?Ÿ|rw;;;3;;ó›gž™j}µræv­ÂÌf3‚ ‚ þ͸ˆ"L.Aþ›Éþa~·ªÌÓË pqq¡Ò"‚ â_9=wïÝcÉÉÉ‘&HÂi~·ªÌÏÏy|}‘”˜ˆ´´4X,(,O‚Up N.ƒ Îÿ0>ñÁÙ#‚³ŒrÃÙ¿1Õw¨~‡=½òsTi³‡-Ÿò°öcês¤ûd/nÖdçÊÒ/S— »Ïò²äå"ŠŸeyW—“ ŠÊ¸íññ>käƒe&¯ÎâÒÈ£:}FÂH÷V'œâù`ºÕ!ã:ö°ò{¢§¨œrÖªÓšu݇:n­ëÛÓ(o;žç>;ÔS­ÏŒe\ËH8aìmžÓöÉ`}uçùP¤Ïbq¸Wêú ‚"œf™Èò¨›ÎýcÏÓC:é˜*¬f½ä= Nê4S?zϧ¿Ðêg­rÑè¿2[&ŠvÎIß+=ƒÙÐçg%>C÷V–_ˆ¢WWW*T?ÆãÇ™ˆ4Áž^^Èãë‹G11HMM}.¡cXPˆÏYc­.HC¿Óû¯!Æt:¦ê´½ã<¥>Æ{`ä×UwBêsäbHG,ªĬˆ'ÁIe”§OäuÞNÄ“¦Qw*¶Y}MAÝx[,ÜÆUïšêÆe­§¼“ãvìòÎPë‰`¦êlÊEþ¼q®«~^™8× ' qA€ °X,ŠÿZϰü9‹¬3Ñ:r,¶{ËGòraL*?½¶BfÈ:yp„•¢laõ©E1Ó4¶kÛï)¯ñ¶§ŒÁ"OC, œÎØi‡¨‘£ÂDPµqŒWž"“÷\Cœ6Ù««FDP&E“Ö@—Wž™m¯"›ó<0Yýã 4yÏSūՇ©ê‚ÁA†!Mªj·³£¿×NY1êðâ“k¡Ä¤$øùù!)1)ÉiNœ8ÁœœŒ¸ØXC¦QqòwZŒÜ£V'A#oÜJ(ëXµn¢ÜÊ õà:)•rf¥b¸–•JàXµž[}¦ØØX¸¸¸ ==ýù…P&LcÆ­§ÌøUf¶Qvȃ|tïdT¬è|UV'u%Õe+FΜQŠ=zSòF[Ñ©M»ª‘%S[ŠŒšî3Ž·“pjÁÀR µŽ¥E3Œ† Ó›þTÓ€š#oyƒË¹ÿjS½3%•*NnÇkϯÝÊb¯oZ&gÔË-gÕH_nÅáøyuUæÄ:Ê ç Ðlem‘¥S²ŽñpÑÊS‰G…uÉÉTT–CuÙJŸmiÖš–ãZ†´ê»zšÌÀT Ã MÕ® ê{«²øòÂè‰&=«|v‰¦ç™žS‹&Ó3c¼ç€q¦¯3+²ÒÒÓqýÚ5ÄÄÄ wîÜ(Q¢rx{#)) ÷îÜÁñ£G‘7o^„/WWWÝA½½¯³·f³×®^ţǑ;wn”,UJ÷±cÇÏ·ÉdÊ|Ÿ­óÿyIOOǵk×ðøñcäÉ¥Ti?~ü8üýR¢\\\œ ÒÓÒàåå…§OŸÂd/@³á$ˆ‹‹ƒÉdB//…ÿ‹‹C®\¹2%²J—u¸ž§§'BBBðqûöhÖ´™óxTBÇ™Õiû¶m˜8i"þúë/0Æpöì9]1¦iÚÔ° :#d-1ÄëHä=¯ÁÖ}ò,/Z–µxÉŒxÒ ›MâIkD™ˆÔ<žÉZO 0­)N=²È­.‹£õŽ7ͧc‘à (z&Ÿš€lJ<‘a…–UI>]dÿ/¨ü,ôa¦!tœ ”Œ¨Ô”B¼ètZòiJù¹™uÇ!,Ïâ`›GŒ8LŸÚꇺÜÔBÙ`Òn“µwò¶ÉD­EÃ?‡É¦Då» ΈÈQå‘t%xQ¢‰eQ4©-¸¼ºÊÔ‚IÃ×NQ¶2QÊ,s¦èäÏyZZnܸÞÞVÁ”# ¢ˆ7ß|I‰‰¸zõ*.\¸€âÅ‹ÃÝÝ]óÙ•÷}iii¸yë¼}|¬‚I/îóçR¼8<<<]hd}ó˲6¥§§ãÖ­[ðÉ• ¡¡¡ÎÓ"•‹rŸo“½ ì~Î_«V-Ô­[?ü÷¿Ç=z„âæ­[Ø»gWT9Ã.^Ìf3þøã|3r$¾: øèògJÏöÜøqˆ‰‰ÁºuÑÖíø™ÞèIc”¥Õéñ|?¤CÇ:¥ö1ÑšëWŒD9âRÓŠðœâIsºK•{§/òF»œ‘©À™ºP Þ©bŠCíóÃi¸Õ‚ÌÁG‡¼”¦­d Ï¥¨#:S‡Œ“¹ÈÓ öûœÉ© µ' ÔÖ¦®òŒ³i 'þΕS_ U9+üšde¡;-©ž± %gƒÙµ™žU&Fƒ) …ƒˆáøŽHù±XõÞ¢!^¹0­…ª(ã‰+µ†ciUǧ~F™†¿’®O“Ž?çóø4eV4©ã×òkT8ÍA8øÎãf³=x€€¼€ÅlAlìS‡¸ÜÜÝQ48ÞÞÞ¸uëŠ)“ÉÄ÷…²¥Çb±àáÇț‰¸ïܹƒ   ˜L¦çž¢ËŠv—óÇ‘7_ÞL¥ý7ÞÒÎK“\8‰Zçý7›ÍxðàÒÒÒ2Ä„íøîÝ»Q¿AìÙ»Ÿ÷í«9ÕÆíT9™(Š(UªÆŽ X´p‘®S™â¿­"2'æÀ˜˜@pp°n¾!s eœòâšeUªú¦©G&‚ÊÜ­÷ 1‹E9E£7Z·—/Ï •wž,=Zá3¿|Ô­žª`¼Q ºNp œ´*¬*ò©õT•}Ç6uÃäùgÛõ,2ñÌdédùRÜ;ûyêøTÓgötZäÄ~oy÷@Vg£ZÎ=°¨ê«ÅÖ‰*:7Y=╱=¼|P%¯ƒÌbÉ(WY õ'Ow%’- ïO+¼Vܼr’§Õž~u» .'^¹8”ºœT÷À¡^óÒ'«?êúÍdåoá…µ :Ù}°ØAÈÿ$wù³(k+¥º(s²ü ª4XT"Mg¥¨ì¹ÔznYÛ½¶¼ö‹Ÿ^xA§Êlü $ ©ê6Ï\}ïìu&!!Þ9rÀ7/R’“‘ššÂbOINFRR"üüáçç‹'Ožðó ²Ïàíí©¸óøæÁã'O”}¯jpeÔåÇ¡½Q¥QopõìÙ3äÌ™¾y|qùÒ%Œ3 ׯßP„½víFú—.]´–‹¿ž>}ª«ä˜Œú3@RRÀ××W²"ÄÆÅaüøñX¼x1ræÌ‰ùóç£Ñ»ïr…3âQ¯úýÍ·ÞÜ¿ÏaZïøñ_ñÔ°eóÄÆ>Å©S§¿<‰Y³fâô™3HMMC±bÁèÞï6j$]F>5hÿ|îÜyé'Nœ°Æqú´2ŽÆ¥Vhh)À‰'ñßÿ~Ͷtœ9spòÄ Ì”ÅR =Â{ QãÆÒµíqL2 -Äùóçáââ‚ *`øˆ‘($…½|ù2fÏž…ãÇ#66AAAø´W/4kÖ\z¸Nœ83¦ãÔ©SÒ5?ù¤'7n,ݳ»wî`ÒäI8vô(bcc‘;wnT©RíÛŒŠ߆ HIgHLµ 1 HHµ Õ̘ʔjABªý˜‰© ‰i © ©i$¦[Ã%¤ZÉGµ<ƒŽÁf,b²ßìÇÅwÙOŠ©9ûï‚"^kvE1£‘yg“qm…îBFºxqÚͽÐLSÆq)Ÿ¶¼ñüßä>Þ§-O¶ó_hºƒ ò®#Ÿ~VÍÖ0QyZdŸ3¦Ï3òNº¡J·¢œz&Ë—VÞ3¬h¢((òÆI‹àh]–ÿÆa-•O\*Ò ¢fº!O7§<ÕuÅ^ ndq3)NHO{~3¬%²©né3Ȭ… ØÇd²:ÀõB û@×Þn‹ÒÃg/7)ݶãj7w‡òV¥U?·ß Ư¿œº [¾4믺-°•¥=_Rì 0‹M2Yý…µNP”·dU·•´5­r+Œ­ªê¼3 ™u@aFŽÞHOOs:ÅÍ,¤¦¤ §?zŒôôt«u…¿Ùlcxsâ>zô(¦N‚þàJï(âöññÁã˜GH³Å­5Uù"Á­&¥}ÕÊ•X³z5öí݇9sæ ((ׯ]CÏ^Ÿâñ£GðpsÇÀAƒàããƒG1n6ÃEúj›ôÌ^êDÙ•jáÂ…‘–žŽ•‘‘˜4y2ù¤Ê•+èèõÈ™3'"¤8RвeKEÅŽ\±í>n¯¾úDÛTÊñãÇÑ£G8ÊÛãðñADÄ 8ãmqÈ™7ÆOˆ@áB±déRLž4 C‡|‰‘+ÆpæìYtîÔþ˜öã4” ÅÍ[·0gÖ,4kÖ\Jwx÷n(_¾6lØL˜0ýû÷Ãø hÕ²%Àú÷ï‡3gÎ`Úô¨]»bŸÆâèÑ#øá¿?`é²e`ŒÁÝ$ÀÃÕ?A°æÉfÁ¢ì³ XçŒíªôYÃùøy}[2Ë‹Š×¨ß‰³––Óè?½†Cs¹·ÎöËÌ›Ãõ3¹çæª9ŽÿËb=a/ .ó¶M:cÞt˜z…œ–{€ÞTœÀ³"ñG¨,PBvø0©ËÙÀ4žàlj™7­é^ÔØn@ž÷l0•çûkšÍfˆ¢ L&0ÆpçÎ]¬[·-[¶F¡B¥p·oÝBôúh´nÝ „«ÉW7W¤¦¦ÂÅæÌ­N¿Ùl†‹,n;7oÞÀ·cF!99ߎ…Y³ç ­¿gŒYãvwCjj*LœM´_”h’ß#³Ù “,ímÛ}Œ£GàÑ£Gòå` <“&N„%=ÁE‹¢m»¶RÚÝÜ\‘’œl]içd›°{÷nV·n]Ä<|h‚ÓÉìÉ“'Ñâ½÷Э[78p—/_F¾¼y1ìë¯Ñ¦MI]}¸åÿË–-8sæ¬4ÍqÉæãtáâ 1m?j«°8­]…ÅÍíÚµ+Nœøk׬EHñâ`Œ!6.5ªWC‘"E°qã&éšjK“.]ºàĉ_µ6 ÅBB±±±¨^½Šaã¦Í€  ´ÍZ´n]4Š+¦(ì.;ãWY‚ 66ÕªUE‘"E°iÓf…ÅiÍš5(Y²cHNNFÅŠàââ‚Ó6ëUx÷n8räæÏ›ê5jpÍ»:u¯¿Gtôz„/ÀÓ§OQ¥Je)R[¶l•Ê/==K—.C…й‹æ¼|f¶-2µï“Þ¶«Ä lu ùHq:oõ²zÞv¼•A‚Žo» ­eúÐ[z¬7Q;Jk ‚¸çku¼FDC&Ž YôYÊì9™C†„OD9pB¯36*9õAoÛ­}w4ëÏ¿ˆ#–´¢¨ëãø:+3Í=ž²A09-^õ=3¸ß’Ú‰û,«\.´6¶ÔÚ£ÉÙþ)))HKOƒ—§§Õ•å§ظqòäñÅèo¿Eqçöm|3r8ž>}ŠïµD—®Ý â㟂ooon9¥¦¦"Ýœ.Å @—(ˆ°0‹âZö4ÇÇ?ÓÛÛé1»·°§Ýl1+Ò~÷î|3bž-KÇYâˆ'˜3a%Û*@FC+:zΖ"LOœÉEÚßN5(‘ûú) ²2qHŸl‹ÖU Ñå"•Ì8|g—`â•=ÓX±(o[ǺÉd>c’Õ]v ¹%ž©w”—M)3Õ¼zÔ´Y œ=s OŸ>Å'E K÷p,\0`¼„&M›ÊüÍpq1in@«®;Ý¿‡ï'GHquíÞ š']ëË¡_#_þ|RÜ¢èbÈÊþ"vçå§@‚ø¢?ü8å0‹¢ ¢_ÿ’h’—‹uÊÖù€Õ©p’'æÏË—áî={¢HP ŒÅ‹cÈ!HJIÆ…;·”’Š·òåG¾Üy‹|¹ó81Ë8}ú ¤Â©<¢(jÆ{èÐaäÌ™ÓQáÚVd9Û0>"Å¡72uDÁ‘#G­ÊŽËå-ªíÝyq+/^#ÎÉû±cÇ‘3gN…È‘_wꔩ˜2u*>„˜˜\¼x/^Ào'ObÕªÕ€ Õ $¦Z”$¤˜3|œÒž©|œ’l>N)i$ýÃ|œã|N'Øü8ä~¢ 8.B6ˆàùåú¾-Z>Nù½pÓm÷1‘|)dþ= _ [¼¢Ü¢æè›¥åã$püHU™A'Ý2·ÙÊ"²pæã$÷ÝÒ¨j_!Eú™cZŒ¦›ÙüѸ~j²‹ˆ²z’±øÅæg$--··#2GgÛ´8äþK¶8DA´ú•‰òvQ&^D1Ã'IjäûÍéû 1­gÊVD…ëZÆ3 ÷‚ôtÐ!.ùµŽ9ˆ­ÞψÛ$ÚÏ‘'–,j®áêcÔþºµ+#‘+§·õ´0¬^¹½óæC@Þ¼Šrqu5$‰Œ '{‚Î;‡êÕ«ã?_}Ø´y3fΚ…‚¥KaÿÍ+ø¼iK”)V/žÇ˜È%hS­&òåΓ¥%†F+ßbUÇÇÉ“'P»vCæ=õh]+½i¦Zåfãĉ_Q§N]®ïoOî”  \XŽ=ŠãÇŽ¡FŠÑ¬]D”-[ÇŽÃñ_£^ÝzÜåû,ˆ‰'±oï^ 4üñ‡”Ww9¬KVEÑ]ˆÏçI¥Jü'ø8yåÄ ðgz)><{@é¾þCËßÄàtÞs—‘à/êZ/ÈÇŠ;gðÞýàM³9Ý]k èï†Îõ›Ñó¹â-½‡Î^^«‚–uçåô΄UI?)ÝœçDkKAkÃZÞö),c`¥¼ç¢ÃtœUMŒÉÞó§å 圳ٺâÔn@È›}û À¼ÙÓ‘–š 77wôèÕ¾~~ÒÓÓÓa¶X¤Í*µ„‡Ù¤¸kש o//T|§2òøúÉ®5'ÅÛ•«(ãvuÕìkŸç*ZÛû¨ÃÈËåñ£,ýù'¸ˆÀ… ¡Eë6ˆŽZgñqXúóOèÜíøúùIi÷4e³p€ßOB‡öí¥Nš8-;´ÇÊߎ¡MõZ(ýF@вÖÂWU,#®¹ÎÃmóÅç_ {xwLš8xë­¢xøð!Ž?ŽU«WaÉâ%܇L>5òÅýн{7Lœ8ùóçGÑ¢Áxøð!Ž;†Õ«WaÉ’¥úÛ+Š8¥8ŽÚãX¼„»¯üÍÏúˆÎ;áÛo¿Å„ PºtiܹssçÎÁØqãÁC¿~ýÑ­[WLŒˆ@Õ5W­Z‰¥K–B„wï†ö:¢B…òÈéÞ6«ZhéÒJ_ÛT¡…3U¡»¹–¯M|¢ŒœÇ8¨õ: hoö¨åïÃt꣮0w²ƒ´^#"8{wœÎ«MÔ¾`Z;ds§µœ¼¼ÔaCÃ,¾.%«ÂùyÏ×ôaÑñŸRO9i ÜxÂZ¾A¼iiä´ÃÑx53x®–¯OŒhîwÅ9nqÖ°ˆÎ‚XâµQÎw­=­¤0/0–O³ò¦ë´®£ç¿¤ÞM_½Gœ½Ú¨‰‰‰ÒŒøúù£}§n8üËT¯UO!š >>&“ ÜÝÜ4§Ï\\\YÜy|ýРqS‡òöõSþ“‹WÛQFÞ("m· #š2óV“ɤHû¹3¿ÃÕÅ… D«Û#wž<èÞQ«–#áÙ3œ?s 5êÔC||<\\DigõlN×oÜÀÇQ¶lY)3hóY/¾|¶nGÛjµàææ¨Zâãê\+ã‚AGT§ï”P®|y,Y²sæÌFxx8ž={___Tz»ôï¯ùUùCW¾|y,Yº sgÏRÆQéô·Åál´^Þ–Ž¹sç {÷îqhuSs¶peÊ”ÁÊÈ•˜5g6>ÿ¼/âââ„^½{K£¨r¶tÏ™= ݺu“®ùÎ;•1pÀ©Ìzõê¥Ë–b䈈‹³nGмy 4È©õOî» ·vQ†^&ÌsÆtrž ãKå0}êl–·û3d>ŒÓ *ùnÐö¥³ªÿ¼÷“É÷žâ !‹†°ºLå;‘«­$ïÚÒyÍŒ¦Ãª“ ü²Ëê“¥åà«·zJ1Ê—•¡ÚŸG.N6äX#Õ~AÜ VU÷ê© ^Qï©ÄIª:+•l×yÞˉµœæŸ9þR¼ðÂKKêçAíÎýeü©Ôû<é¾{QUÔªj¾RaÁr #Š"ÜÝÝñäéxzzJ®Pø îÐÕ!ýiiiHHH€@^ÝçIE¸»¹áiìS‡¸µÇ­%lŒX™´ú½™*uœîîîxj+—°òoÃÝÍ%BËÀ'Wn@î<¾xÿ£øãü”,fMû³gð³¥ÝHãtUÈ•+1`Àüzü8 ( ý>há\\ýëίŽFåÐ2˜;gÜÝÝù/¿Õ{p (Ê̾$ØÙ”Ÿ–cœ<™yY°nõ†šND!o>ÛÙiµO“|E˜zäëð]Õ!§™­¾Mö}šRÒ­{:Ù÷vJL1K{6%¥1N°‹‚lðqRɬìöqb6&…qÌÉ>NÏãã$ùJ¨¦Vä{R‰Šýgžc'Ù&WÖïL™n›ï“ù†H>.Ïéã¤öÒòq‚:MÏéãd÷{§ŠçÖæcßHŠ×æ# Ÿ«ïdþLÌæ#Û/Iò›dû9I·íYåþS¶+‹*Ç>{šü¤T¾B Lé;Ç”{bÉó¥ÞÉÑ×Ívžl/#e]ö*Rúè \Ÿ3È|³ ŠS”òfË·(/cA¶ÿ•Ò÷Já#f/©½Ïؗɾ“(ؼ¿¤AšrŠU¾³Ýw)é Ÿ'ùû&™¢Ù“[Íõ¦ªbãâððá.TH×Z’’’‚kW¯"‚ðóõUì‚­eA‹‹Ã؇Æã,?Û´—^ÿkdZ.ÓÚòöRDl\=Š1œö|àëë«ûê¹L­ª³sàÀ(Dxº[-L•«VÅεëЩS',øé'øÈœªÞ#ÇPg @Ïd§PïĘÁ£hìÿ’eű À‰¿ï|z•GÐyy¬!?Y£ëfàf2ÁÏ;Ão *Ÿ&ÅNòc™ôqú§û71gÓWÙ‘fy}S¯XÌ„xÏ.kŽ3±­5•Ê ÞŸæïäÄzÉ{³ZN¼×èð|–äVwœ:…úUBêwT:«¯à¿Æ/”Nx§Ïl6­€cή§ãÓÇ›Æç½† ZSÜš¾K‚¾UýÌ(ÊXT=îöÕ«p|§›ÑdÏ[®\¹`NOÇùóàïç‹|ùó+ü—RSSqçÎ<øëBJ”€¿¿¿ƒ8àM×1>¹r!=“qÛE“‘i9­~OÝ÷ëZ›ÔuÞ¶è*w®\0›Í8î<üýýtÓ^¬xqøÛŸQ '‹Å‚}ûö¡råÊÇ*¾U çnÞ@».‘×à ˖-CÇŽ±22®ëàÈ IDATnn’C±zJE½õ¼³÷Ô8+\õ”†qdHøp–£;PN;7ÎrWûˆ^·cá½µÞÉ–Ã;£4Þ³¥6%K¯k…Ò°dé9#;tX×?Gó³ú}t0è'Åë,3s¾ÎÃ,hÌt ˜¥™F½gÛ-è9Qòü­xå­% Ó,N:P½):gû'eî¶K+MºyÑÙÄÓiª¶³pvoàä>Ê`Î\œ¹=è¥5«b7÷•Û¶Xð n£¦œ¯xÖd¯EÒ³ÎVZ[‘Hå¬v wVçåÛ¨D`¾|ùàéé‰kW¯âÜùÝ`†t³)))pE-ŒŠ•*ÁÛÛ©))ܼ0uݵm‰/_>xzyá:'nQ\ÔwŽHMMuœn”÷ùœ)d=ÿ.ÍÅ ¼}åuÇb@Þ€xyzâÚµk8wnƒ"íEƒ‹¢ÂÛoÃÛÛ)ÉÉ™j‡LŽzБþBll,:vhï¦ÙÛ•pôÒlÿý$¾3 ¹||0þ|ü¸b ×­‡²AoZÁzóäöíëh†µsœifž£%Ê1l†iÝy|ÒgéÓ©ìLWŒiØ˘PV´ð’&8WžÏ¤ ÒµleÏde¢|°,G-?Ï"[ Â4?«RÇ—‘ªXµ>Kéu*¤4v‹`ÌaÝþÚ‡ë¨D¹X˜Eù*Ê=X¤º(÷…’Õ!å{l… ‡º¬´¦Ùãb©Êh´f‡—KÊûÀ cŸ³bN|9Ô×T¬E§QÊÌêKçq©eš˜ÞK±eÓ[+ËõËG†1Õ=‘Õ~z,üº¦è3êŒã4~ÆïÒ”“¼®0å4"Ó¨#ו¾[2!”ŒË*î¾XL¹§• €Û®pÛ¦noÀmKÀk{,öAS<—Šp‚\Xƒ{tÚl¦4¨ží6›eTúŒ|©êAjj råÊ…Š•*!¬\9$ÙD€‡‡ÜÝÝ!Š"ÒÓÒ””¨¨ëöçH`ò4eôŒ1¤¥¥"W.T¬ô6ÂÊ…!)9E·€´´4$%&*òÊÀ–%ý>–i”›\LÙ§”uê¤<,³d¤ýíŠ(†¤UÚ©i©HJLÌüà-ÃÇé®Sll,råÊÅŸ'LKÃæ“ÇqåÞ]ôóGJJ2j• Ã[ùu§=4[½ç˜÷dÊŸç ¥9 g»›ªç÷MçBÝ]›¹Ç‡ŽH0X~v°üáv>ò¸ƒÚ2äX¶pè x;m;•)2a‘┘A«’VËÌÏ™‹ÃÑJ¥eÂ6¶B.²YMõ‡cuѳ8A÷<£Ó|F­J™N™ËYÚ´ò§è(Zœ Ü+‰°ÖñÞM¦ka‚Ö4Ó´e‡ÀÉÎ8äe#oþ[”œ_[sQäí™Ît¼úþ2eY²&28\ËÙsθeä¼_Ennîpusƒ‹‹faHMKEJJJÆÊ?Å´¥²Üõ|€]\\àêæ777¸Ø6¸LMKEJrrÆK¸5œ½,êÒëß¡óÚ$§š€(ºÀÝÝÍV.&0fAjJ*RR’¹¾^Z¸ºº9ú89yi4||riw3¹¢Õ;Õ YjÓɬª“ÔZa8Z4Õ ßºíº¼3æ­JæS®š’™È™öò|n‡¯e}’îåÞ²2µÆ+CǤebƒ©óÊdel‘'dØV,²•[šŸ•ûØËÔ:½«6ÅÁ´Íó£ENƒè0«Ù¦k,­ÏÔ@ƒiÿÌ´n¶&{Ûh†ÆT‰²“•‰E)gÓIZ²’e˜(÷ÔÙ‹zivV§ÛŒZ2¡S5Ó¡»RJÇŠÆT#$ǰêòTÔ–mÆ›JW>¯ŠÎúV3‡^§ÏtõQ¦â,rœ6‹×Î0 ã¯ÕÛ®CÕIŸSX«´Ú6¦òùd;VÂ"Y”•mžý;ìR‹ÒâÂkžsEyX4gª|q…SRb,‚ ‚ þÍxz9úv‹T,AAÆ áDAA‰ ‚ ‚„AA '‚ ‚ NAA$œ‚ ‚ H8AA$œ‚ ‚ H8AAp"‚ ‚ áDAA‰ ‚ âõÔñ‘ÙþâŸIÑb¥¨‰+—ÏS!ñ‚aªÿ áDÿlÑD%!'8$^:GAÄK%Û…SЛŨT_ 7®]¦2&þõìß»ó•non\»L7‘ H8Y±£‡¡R}Ô¨Uöïú×å»zÍztó ^Õö¦F­úd-#ˆWr…8rø AÐsLÄ߈dqbÌúGAAÈt‘L‘ʼn ‚  $œ‚ ‚ H8AAd/´ñʪ{ÜÈꥭÛv q£†{>´ÒªÎ£‹‹ üüüðnÃú:d0<==¨"A¼ŽÂi÷ž½ùÍ·3zêÕ­Cw 9zì8ýo .^ünn®¨P¡<>ý$EнÐëÊ·Hø»¶KxÞ¥Ý}?ïÿ_.OŸÅbAJJ –-ĘïÆaüØ1ôÈê£Qá뛵jÖ@ŸÞŸÂÃà ‰ ˆWG8mݶ Ôöí;I8e#k£¢ñ뉓2x .„ôt3þ¸t "&£Cûv¨Y³úKIÇ¿q©¿Qáéé‰>hÚu’pÒ©‡ Cjj ÖEoÀ”©ÓðÕÐÁT@Ad½ý}™‹Å¹³ç1x`?œ=s±qqt²‰ aø°¡xóÍ"0™LððpGXÙ2þõWøï”ÿõå3dè0¬ŠVü¶fí: :Lš  UL‰ý8m*U®ò«`Ì·ã`6›¥cÁ!¡X¹ å*TF›ÚK¿EGo@ÝúR¢ J” Ãö;¥s®_¿žŸöAùŠUP¢T5i¡8ž\M&¸ººê¦Ëb± bâ÷¨X©*J—­ˆ¶í:âÊ•«Šx~˜2 å+VA¥Ê5°à§EŠràÅé,/Á!¡Øºm5i’¡åШqsüòËAD­‹Fƒw›rËgûŽ(Q* Á!¡+ÿºvÿ—.=ÿÛ¢(ÀÃÃM›4Æî=û¨± âÕN;wíAÕàííêÕ«b×®=Šã5jÕdž›Ñ¢åhԤƟˆ¸¸xÃÇà§…ÿC³ï£q“÷0eêtEgwûö ùêk4nòêÔk„ŽºaÿþŠø×¯ßˆFMZàÓÞŸ>gÛöø¨]GÔªÓuê5R€¥Ë"ñþíP·~c|Þo nݺm8ÍFD‘Û)*TQk" _ÏY~âãã1>b27m‰-?@Ôºõ÷03e3oþB4nòšµx+"W9L³d£GÄ’%Ë$ÁpùòŸX²dF)MýyéœôyÙòH)RÙ#‡öÁd2a欹Š8Ïœ9‹CöàûI¤ßÖoØ„Åÿ[€KÏàÇ©ßã‹~ƒ¤c_ô„ÚµkáðÁ½øõØA´jÙÃGŒÎR~, èÜ¥‡ÃõRRRÐúƒ¶ˆ§ž† H8emÛw¢iÓÆ€¦MaÛvÇÑöšµë0{æ4D­‰DŽ9 ¼³ãë¢7 páBX·6ë£WÃdrÁÏ‹—IÇG~3U«TFôºUØ´! ï¾Û'+ã¿øÇ%¬[»#†eøœ;waꓱïNŒ5#G}+‹^¿¾¾y°tÉBlÝÚµjbÄ7c §Ù(·ý"&£ÍGí1>b2ÖoØ„7o:„3r=½üLš<5kTÆèÕ˜?w6mÞª›.½¸6mÚbMSÔJ,˜7 ;UB:3Ø­E¼?ðôôÀĈq2tž8zì¸"îí;váíŠ3gNêiâ5â¥ù8ݾsñññ+[V±±±¸}ç ,˜1êü¼ ,hûQôìÕWÞñõë7bÆô)ÒÔEÛ>ÄgŸ÷G·®¬––s¤°îîÀÇí>ÄÜy ñ·oßžžžRšŒœÓ¿__æÔªUCÙYnØ„™Ó§ÀÝÝêÚæƒÖ ³4¥C‡v¨T©"?~‚ ÿÀ–-Û0qÒQ²DqŒýn4òæ 0|=½üü~ê4FŽøL&òåË‹/úöAŸ¾ý4Ó¥Wô†M?v4<<•¾)„V­ÞCÇÎÝÑ»WOiÅj­Z50uÚ \¹rE‹¾…ßm½ÐÐRÔË §¬±}Ç.ܹssæ*­5… T'QtÑmdõŽ3fÁž]ÛàêÊÏÖú ›°"rÚµý•ßy~~~ø¨]GÝÆÞÈ9¢(ê x8KóóPªTI.\­Þo›©ëéå‡1‹Å" gôó”MvóçŸW°térlÛ²Ÿ|úÂÊ–Ñ´:½G#þ|Ùvýñ&a÷Î-ðµYw._þó¥ä»H‘ üõ×(ˆS-Ê )†'OžJ‚áâ—þ¶¼”,Y%K–@»¶âܹóhÙúÃ, §ì™‹Å©øvqqÁ{-šcEä*|=l(Ö¬‰B«˜n‚ þ>dÃc&ûË^Ξ;w7wØ¿ËáÏÕÍçΗÂ^¹rEúçà w¼`Á‚xòô‰f:fÌœ™Ó§à½ÍP¦Li¤¤¤8M{VΑS¸Pa¤¥¥kw–f£¼×êCÉ÷BŽ««òäÉm×Ëéí­˜æ¹zõj–ãzë­7ñTf1üóÊÕVÑ“’’1dè0LŒ___Lœ0C†CRR2ÀÓÓ×®_ÇÇ1€Û¼uÑ둘˜ˆ¤¤$Ìž3»„?W||rbÿþHIIÁ¹sç1pЗòð~+,\ô3””ŒµQÑ K_û?Âò+‘””„¿þú ãÆEü-yiÖ¼5–.[„„À»wÖÍ—AáB…óHú®vì¾~ý¢¢¢±tñOX½ׯߎµ|¯öìÝë×oà׿á݆ ¨‡!ˆWGmôRœÃ·mÛ6mZk6ê[eNâS§ÍDLÌ#$'§`Ó¦­(­2uëoÞ¬ ¶mÛ¤¤$$''cñ’eè7àK鸷·7Ž=ŽÔÔT\ºt£¿ç4íY9GNóæMpàà!¤¤¤ %%Ñë7¢k÷ž†Ól”¶µÁð£pèЖ,LE‹¾…ŽÛã›QVGýOztGËVJÓMݺvƳgÏP«NC¼ýNu;þ+&Ožð\ÏÁ„ñßaÚŒY([®Š=º¿”Ǿ[×ÎpqqAÍÚõQ½fœ<ùþ·pžtü£Û ==5kÕGëÚ¡yó¦ºS”/*/S~˜„M›·¢rÕZ •VÙ½Lš6m„È•«‘˜˜ˆäälÙº¹rå$'§`ì¸|=l(rçÎaÿ‚±ã"œlLùùù¡ZÕ*>r4êÖ©…9¼¨Ï!ˆ×a÷îݬnݺxð×}¤¥¥Yˆ¤¬-Ÿ z³ŽþEñ[zz::u Ç¢Ÿær}}’““ѵ[O,YüêÔk„¾ŸõÆ¢ÿ-†ÉdB½ºµñIn’U©F­úºÇ-†¹ó`ÆMHJNFùòaöÕ—ðó³NAœ8q“&OÁ½û÷Q¸PAtîÜc¾§»ëuVΑÿÆÃü‹½~#Vƒõ—œQ¥YΑÃ1xèHMÿM›·"zýF\¿~iiixãÂø¨ÍûhÖ¬‰ÆÙõœå'663gÏþ}¿ÀEѽ{ü0e·<œÅX·#ˆZ 777têØÓgÌž]ÛòV½f=\¹|žžØ—@llÞkõöíÙñMãþ½;ѽg?î³`t÷z^8‹…aÖì¹Ø`Û’¡b…òèÒ¥#BŠc츔/_N᫹eëvœ<ù¾6€uñDßÏà§ù³5ýÿìÏñ?}§z‚ O«¾pssC@Þ|سgÏ‹N™ÁYƒ÷w½Î㟂3áôªnáŸbõÊe$œ^"o¿S#†ÿ5D|ü3,øicÿè¶õ„Óßɽû÷Ñ÷óX³j¹Ó瘄A¼šÂI¤b!þ.š5oí;v!55Ÿ<Áâ%ËQ·Nm*˜—ÌßOÄüù?!¬ü;hÚ¼ÒÒÒ0pÀT0™$55QQëÿö—Eñb1Q#GìÙó0nüDx{{£aƒzèÓ»'ÌK¦fÍê/í]†¯3M›·BÉ’%0yâx* ‚ áôrpfv§Ⱦ^T~§’bÃ@‚x•Ù¹}3Aü  ©:‚ ‚ ƒH'ƬAAD†.’ë#²8AADÚŽà¯ûÛ¤$gm;‚¢Åè½LÄ‹¶" ¨Í!"KBG²¼ý‡»GÆvyóY·#Èvçpêà‚ AMÄë MÕAñZ²ïNNAA$œ‚ ‚ H8AAp"‚ ‚ áDAA‰ ‚ â5@µ½s… ‚ B©‹2ôYœ‚ ‚ B‰ ‚ ‚„AA '‚ ‚ NAA$œ‚ ‚ H8AAü{0ýQµzm<|ƒ];¶ (è ˜Íf”«PIIIðððÀ©ßŽÁÅÅ7nÜDý†MàÃ÷Š;8$ðç¥s†Óc?GQP&üýýP¿~= ýr ¼¼¼¨öAÄ¿Œ„Å©TÉ’€óç/.]ºŒ¤¤$@rr2þøã’âxÉ’%^zÓÓÓqÿþ_Xºt9þ3l$Õ‚ ‚ áô7 §RVátÎ&Œ~?uÚš8Ñš¼S§ÏX…Ó…‹ ¡õ¢ùóÒ9üyé.ÿqçÏþ†¹³gvïÙC5‡ ‚ þ͉`Ìú÷² -eF6áôû)@ݺµ§íÂÉ&¬JÉ,NÑë7¢á»ÍP2´š6o…]»ø¢fåªÕ¨R­*W­‰ÅK–e*}‚ Àb± )Ùj+S¦Œt,8$Á!¡Xµj ÊW¬‚Ûw–Žmݺ7G‰RahÔ¤¶mß){·Qs‡„âòå?ó,DpH(fΚ¸rõ‚CBñn£æ€?.]BÛvQªty” «ˆÎ]ÂqûÎE:•…^Z ‚ ‚Pb×Ermô°8…–RNÕÙ-N]:waqº`³8•,eNÛwìÄ ÁCqíúu¤¥¥áÒ¥ËèÓ·ŽÿzÂáþþ11ðèÑcŒ3Q뢦Ë.4‚CBQºlEôë?*”ÔÿNtŒø7ˆ‡§—'àÀCø¼ß@\¹z ééé¸rå*ú~Þ4hP°ÿ—€ß~û]‘×ýû~4lh ×À—8qò7¤¦¦"))‡Aÿ_J×ÏTY¨ÒJA„1þ©páBðñɉ˜˜G¸rå*®^½?T«ZyòäÁ•+WqëÖmlƒ“¿Á‡mÞc 3fζ "›púå—ƒVáôûi‚€S6Ѹï«pjPßîæÍ[€ ë×JSˆ«WfXÎ2Sê´Añ ' Ãá{ÙòH0ÆVP¶Li˜ÍfD®\ (Q"Dò}²[ úø¥J—G¯>ŸÛÄÍi‡ø{õú9räÀ'=ºþüóŠÓ4ÙÊNãØ‘_лWO˜Íf®èêÖ­3<==P¨`AÀ™3g_  Ÿœøj¨Õ:tæ¬uu_XXYøûûáø¯'påê5hÓSœŽØØ8éú™) uZ ‚ ‚xÅ„Sh)«Ÿ“} ­¼M0ØÔšµQ6•án±X¸q=~üÄá·Ü¹r\\\lÿgÝÅž¾¾ø¬Ï§€˜˜‡0•+*ãg°N BÆñúõê"%%sæÌ„‡wÌ™;)))¨W·Û c¿/>ÿ åË…áî½{˜6}–$Ž2[ê´AñÊ '« Š‹‹W¦°0«#öÇ1¶pŽá!!ÅS§LÆ…s¿+,DjfÏ™‡¤¤$Ì›ÿ xñâ™J_RR2–.[ð÷÷w8îîî®ø^²„5þˆ‰“ˆˆÉ€²e3Ëí~NÑë7ÂÏÏÕªVAÞ€D¯ßhذ¾ÖÕÕ_|Þ+–/ÆŠeV‹—Úµt IDATÝ/*³e¡N+AAÆ0ýSb_YX­1eË”¶ '™Ð”§îݺ`à !è×°"LÝ:µ1oîLÅosæ.Àì9ó¥ï=ºwuš&ÞF˜Ðªes§çöï†_OœDäÊÕÒ4£(ŠèûYo)LõjUáåå…ÄÄD”/_P¡B9lݶ^^^¨VµŠöýÚâ´múÏŽ¼l2SAAdŒÅéÍ7‹ÀÓÓÃ*X‚‹"Gހܹs#(Èê îââ‚bÁÒ9ïµh† ã¿CÑ¢oÁd2!wîÜøðÃ0uÊd‡øÇŒ ?äΣG@ãÆïN› pwwGáÂ…Ð÷³^8 ŸÓs4¨‡©S&£xH\]]\³füˆªU*KaÜÜÜP«fu@¹0ëÔdÅ µjÕ€›››vÚ? v­šðôô€»»;ªW«Šï¿ÈRYA‘5„Ý»w³ºuëâþý{HKM¤¦$d)²¢ÅJáÊåóTªAAüíìß»Ý{öËÔk×丹[8nnnÈ—?{öì¡—üAA…„AA '‚ ‚ NAA$œ‚ ‚ H8AAp"‚ ‚ áDAAp"‚ ‚ áDAA‰ ‚ ‚„AAÄ+„IúÄÆ¨@‚ ‚ € ]$×Gdq"‚ ‚0ˆéuÈÄþ½;éNAÄkN­: H8eÝ{ö£EA¯)Œ1\¹|ž„Sv*AA¯ÿÁd‡|œ‚ ‚ "³81ÛAAÁÓEdq"‚ ‚0Èk/œA »LA '=¢¢¢àææ(P Fåà<¾mÛ6¼ñÆEQYò?.\ƒ BRR’BŒ©ÿ<<<ŒáÇ#==Ý!=Ë—/GõêÕáíí ///T¯^+W®T„yë­·píÚ5‡s÷íÛApèÐ!‡c7oÞDÑ¢EyªQ£<<<+W.´nÝçÏŸw“z™Í§(Šxë­·°oß>C÷ÄÍÍ QQQŠcGE5²åÞ_»v µk׆»»;*Uª„Ë—/Ó“NApÒë ;vìˆÈÈHÀÎ;±yófL˜0A®oß¾˜1cÒÒÒ¤ßcÒ_rr28‹Å‚Ï?ÿ\q®<c 8rä|}}ñå—_*Â06lîÝ»‡˜˜|ýõ×øæ›o0`À)\ýúõ±s§ãžT‹/FÉ’%ñóÏ?;Û±cêׯ˜1cæÌ™ƒ9sæ >>÷îÝÃÀÑ£G¬[·N7ýò¿Ìæ3==sçÎEÿþýuïKÛ¶m‰ÈÈH´mÛVqlðàÁ˜4iR¶Üÿ: eË–xüø1>þøctíÚ•žt‚ "[vïÞÍêÖ­‹û÷î"55–š˜¥ÈŠ+õ·,Ü¿w'º÷ì'uúnnnˆŒŒDëÖ­!c¸pá5j„›7o*,*f³Yaqâmi‹‚ âÙ³gºá 11 ÀÓ§O[·nÅW_}…C‡ÁËËË!Þ *`ÆŒhܸ1"##…+VHa’““Q¨P!ìÞ½ 4À­[·àîî.ÿøãѺuk|ôÑGð÷÷ǵk×3gNÅu._¾ŒºuëâöíÛNÓ¯¶LÍ'xyy!11ÑP|òÏQQQX¶lV­Z•-õÁÃÃOž<§§'‘;wn©nA¯W.ŸÏ’ưëƒ?/ËÒu]ݼlºÂù±gÏž×Óâ”?~”,YRñ[É’%¢ °N1ÙE“©©©ð÷÷7VÈ®®Šé®™3gbøðᢠråÊ…o¾ù3gÎÔ«W{öìQˆ•õë×£Zµj([¶,ªV­Š 6(¬A{÷î•,N¢(:Lÿ@±bÅ$Ñ”]¨óiy™%==#FŒÀøñã¹ÇíÓ{‚ ÀÇÇ5ÂÙ³guã¬W¯¶lÙ8qâªW¯N­A‘-¼–ÂiÏž=hÞ¼9¾ûî;À7Â0ÆàêêªÙlÆåË—Ñ«W/Œ=Z3œÅbÁÓ§OqòäIŒ9;v”Ž;vL×w§Aƒ8|ø0 8uê”t|ñâÅèÞ½; [·nŠéºÓ§O#00~~~€Aƒ¡G(R¤ÂÃÃ1oÞ<\¼x1ÛÊU/ŸàâââTlEEE!**J*û9sæ ^½zæžcŸÞcŒáîÝ»hÕªÚµk§{3fà믿ÆôéÓ1sæLüïÿ£' ‚ á¤EÑ¢E±eËìß¿€ÕÚôã?:ˆ€|ùò9œ+w„6™L ATT”ƒ(P;‘çÉ“ï¾û.ž>}Љ'Já=z¤k­ À“'OBj×®]€‡â·ß~CóæÍÍ›7Ço¿ý†˜˜Vß­ 2ÞÛ3tèPœ8q³fÍBPP-Z„’%KâwÞÁ­[·4ӯ垙|VKŸÙlÖ̫ݷÉ.†âââ0eÊŒ9RÓq8‡;Ë'´iÓxüø17¯­[·Fjj*RSSѺukDDD <<þþþšŽã .D§NмysDEE!::Z÷¾÷ë×%K–Ä¥K—ðé§ŸbìØ±’ 5j=ñAÄsñZ:‡«-&Œ1>|ÕªUc ‚ þü8sæŒÂ¤å ’’¤¤¤h†1b.\¸€•+W*ü¦š7oŽîÝ»ãý÷ßç¦}ùòåX²d 6mÚ$uð… Æýû÷Q£F ,Z´¥J•’Ÿ?áááØ·oqûöm£æÉ“'(X° ä¸ý<ÎáZù´[ÈÊ–-‹û÷ï;ÿÎ;¨W¯N:MÇqøý÷ßqìØ1;v [·nÅ„ ¦ åBõÎ;ðññ`užoÔ¨îÝ»‡3gÎ`Ù²eôÔA¼bsø &00üñ‡â·û÷ïK~5±±±>|¸b+=âãã fôèÑxøð!¦M›¦ø½oß¾9r¤´"OïèѣѧOé·9r L™2X´h\\\¢ J•*Æ~þùg„……)DS`` .\¸àpwwwäÍ›7[ÊV+ŸŽ#F 66Öi<ÇǰaÃàááá4l¹råгgOÌŸ?ëׯG§N4ú»»+œÔ,X€Ñ£GcĈ3f µ>AÄsñZ §#F W¯^’SxTT:wîŒ5kÖ|||лwolÞ¼Y7³ÙŒ7nà›o¾Axx¸~AŠ"~þùgLž<wïÞ•~oܸ15j„êÕ«cË–-HHH@BB6oÞŒjÕª¡AƒhÖ¬™"®úõë㫯¾B·nݸ×êÖ­† â0M7`À´iÓ7nDll,ÒÓÓqùòeôéÓÇao©,W|Ö­z÷î-Y{´8}ú4NŸ>­@<Çq([¶,fÍš…øøxVG=§þ^½zaìØ±ˆGLL fÏž¸¸8|úé§èر#NŸ>MO=AAÂINŸ>}Ð¥KÔ©SеkW¬Zµ -Z´P¹S¶¹3´§§'6lˆ|ùòaäÈ‘N¯„qãÆ9X²¾ÿþ{ 6 ß~û-€qãÆaøðá’ß•œ  99YsõØÇŒäädá4dÈ <ß}÷ . ooo´iÓµjÕÂgŸ}¦™O=çðÌä3--ÍÐù_~ù%Ư˜êS;ŽÛY¾|9"##‘/_>‚àp\͘1c;wn/^… ªU«°aÃLŸ>eË–ÅâÅ‹é©'‚ ²Ì¿ÆÇ‰‡Édâ¾…È<Œ1ˆ¢hÈwŠ ‚ 2ù8½ä]‹‚ âСC°X,T+Ÿ‹Å‚Ý»ws·w ‚ ˆ× S†À°þý›˜2e Ú¶m‹;wîxzžJd2¡@{eAÄ«Œ]1žpú7Òºuk´nÝšjÆsB¢“ ‚ø· NL¥©‚ ‚ þÍ0Õ¼þ>NAAÙÅk5U÷w¬è#‚ ‚„Ó+-ƒ'‚ ‚„“jÕi@Ö&‚ ‚ ^8äãDAA‰ ‚ ‚„AA '‚ ‚ NAA$œ‚ ‚ H8AA$œ‚ ‚ H8AAp"‚ ‚ áDAA‰ ‚ ‚„AA §WàPÝ?£lݶ#ÛÓ¦Ž33é!œß÷—y/ÿ-e—á_¶ï؉¥ÂP¢T¶ïØ©8vêÔi´mב*AüË0Ù?0ÆÀ{¥3óç¥sÏGßÏûgKÛÙ¾c'üüQ¾|9*$‚ø—ñ¯óq  EtôÔ­ß!%Ê(Lðö©õôÞÓf Rå(_± Æ|;f³YߊÈU(W¡2Ú|Ôž{=^œ þŒšµë£XñÒÜi½kò˜;ojÔª‡R¥Ë£C§®¸výºtÌb± bâ÷¨X©*J—­ˆ¶í:âÊ•«Š4nݶš´@ÉÐrhÔ¸9~ùå ¢ÖE£Á»MÊ)«ç\¿~=?íƒò« D©04jÒÂ!N­{±±qøÏ°¨ðvT®ZK—­Ð½ÏêrwV¼8Ô÷–7]%ÿÍYÔ8+95k×ÇÝ»÷¤ïW®^CpH(ŽÿzBúíîÝ{¨U§áz´6*7G…·« _ÿÁxúô©n=Ó Ï+/½2Ïl~ìÓfÁ!¡+ÿºvÿ—.]6üÜ8{Vb6›ñÔiørÐêA‚„Ó¿ƒõ6añÿàÒÅ3øqê÷ø¢ß S}^:'}^¶<EŠÁÁ_vãÈ¡}0™L˜9k®"¾3gÎâÐ=ø~Ò‡kñâ€]{ö`ÉÏ qù³Š4½¦œå+VÂßßÛ·nÄÉ_£Ñ» ñÅ3DÚ¢Ÿ‘žžŽý{wâøÑƒhذ>&}ÿƒ"ŽE‹~ÆÌéSqê·chÓæ}ôþì D¯ßˆ… æ:”SVÏù¢ÿ Ô®] ‡îůÇ¢UË>b´¡{àÿíÝyXTÕÿð÷0þ¨å–+&â‚*Šˆˆ!& (Š;I™¦¹´ü2ËÜÍüj©e™Š˜ Š"î¹€âV‰$*¦,‰{²)È2È2¿?‘a6pÞ¯çáa†{ï¹ç|î¹3î9ss¿þ®.ðǹh„ïÞ‰°°=UÆD^ÜU‰CEŠŽ­ºýKUbRÆÎÖ1c¥Ïw„îDçNeâp!æ"zØÙªÜ6‡ü† ~Æù³§Ðס76n QØ6eëWŒ—¢˜«Ûž²a³¤„xœ?{n®.˜>c¶ZçºÇS$áè±ã8zì8D"‘ô|ëmß mÛ¶á;§Ú5I•Éá_Íý­Zµ ts•¹_ÑŽÐ]puq†ŽŽtuu8qö„ï•Y'hR Ôz!]8žtýŠuPeŸå…î ƒÇ;î000€žžÆŽ Àþ}Ïß|Âv‡cÂø±044„¾¾†ùx!.î²l}ÌCûöoCGG£FA,cá‚yhݺê8©»Í¾½aå===!pâxdffª|l.\ˆ““#tttТÅ[˜3çsµú‡*q¨H“c«NÿR%&始ϧOŸâС߱vÍ÷8q" ¹¹¹€˜˜‹°{–h¨Ò¾ž;­Z¶„®®.<<!*ê¤Â¶)[¿b¼Å\Ýö#?/```€€Qþ8|0â…ž«e‰oYÒ–““ƒMÁ!øhêd…lj¨îªSsœT\öÆ®ŠääaiÝCæoB¡Pæy«V-Õ®«¢:¨²OÙõ“¡§§Wåò[·n£Y³¦Òç&&&ÈÌ|$³N»v¦ÒÇúú¥eµlÑBa4Ù&6ö¢OŸFJÊm\¹zU­¸df>’þ×]º¨sUâPQM[MbRÆÖÎÛ¶ï>röö=ѦMk88ôÁƒ‡1b¸/b.ÆbÜØÑ*÷£®]»”;†úHþ÷¦Âº*[¿b¼Å\Ýö,[ºAïˆÃÏÏZ-¸ºx¡çê@7W™ á+þ÷=ü|‡¡Q£F 'ާºu™MKõ m%%%ø'þ´µµ«\GQR£É6ªì³¼¢¢bµ÷_q®‹¼úµÛ h›Ðaذ!ãáèØM›4³‹»ZǦ¸¸Xº_‘HXí¾ lc+o{uú—*1)cÞÁ ÿ=üYYÙØº 3¦Oøùú`å÷«áîŒL´oÿ¶ÊýHÙ1®‰>QUÌÔmÏg'ìØ¸ËWu2ÑÑg››‹¡C‡¼ÐsµÌÇqäÈQØ¿çÙy'â8Õñ‚!P¬mÛ6ÈÈÈ|­÷Ù®) «\njÚ¦JŸggg¿’X.Yº;¶‡`Äp_ØÚt‡X,Vk{cccdddHŸß¸‘ Öö/"·ïÜyi1ÑÒÒ‚µ•ÂvïAzZ:zö,½ºÒ§=ÒÒÒ°mÛØØXK“UúQRR²ôñ“'9hÞ¼Y®¯(æê¶:wîÿ~X²h>~Y·³>ùü¥«ÿ[ù&O‚®®._‰˜8Q}}}ÜLIAZZºô¿ß½û——‡üü|¬ûy=ÆŽ ¬V™Ê¨»O?_œ8±X ±XŒí;vbÈ»>ÒåÃ|¼°)8¹¹¹ÈÏcOx5jôÒckbbŒèè3(((@|ü5Ìœõ©ZÛw·¶BÈ–mÈËËCjj*-^¦VÜk"e“…% n¦¤`Þ¼…/5&vv6X¹j5üü|dßaÞX³vt"µªýhþÂ%HMKC~¾ûö€£c_…ûWw}e1W§=ƒ=½±uÛéü§{÷ïË ÝÖĹZ•ë7pýF¼ž]Ý*ßÊO'"&NµJMÜ9|Ò{1ÔËO:\2aüXäää _7ØõtÀ_bðÝwKÕªWÅ2•QwŸãÇÁ?×o _7ØØõÆ‘#G±fõ*™ò„B!\ààØ±±có¦õ/ýø,]²«×þKë˜9û3¼÷ÞDµ¶ÿvÙ"ddd o¿ððô†‡Ç µeuãP6Y¸cgKMÁ˜Ñ£^jLìlmPTTo¯ Š7 ¥©UíGžƒà1Ø =íûâÌÙsøxÚ…ûWw}e1W§=«V.ÇÁCGЫw?˜™[ÈÌ1ªÎ¹ªÊëÃÒeËñɬ2ð'ŽQý ˆŒŒ”8;;ãþ½»xúô) ¸H¬Qaí;tArâ5F•ˆˆˆ^¹è“Ç11hºÆß"!•~ðIWWoµh‰¨¨(թЉ'""""&NDDDDLœˆˆˆˆ˜81qªÊß祪NJ¶yÝÚ ‰#¿«²¼ŠËÔ-«¦ÛS“±WÔî×¹ŸÖÇs“1!"&N¯ MïÿP—Lýèã*cRq™ºeÕ¦vQýöü{$$F„ˆˆˆåò¢rùQ¹âtôØqtêb3s Xuï‰ñ'!!!QN.¸ÿôyò¿7afn 1¥»ÿúõ/ýæsM/÷ï €û OØØÙcúdzñøñc™å?¬^‹½ú¢»­=æ/X,ýÖxMÚ'¯Žÿ¦¨>ŠÊ/+§ü××Èû]ñoòê"o}e±ÈÊÊÆÿ}16vöèÕÛ[·íÐ(ö‰‰Iððôª´®X,†ƒãdeeWYçòuÝ´)ŽN.èб+:u±ÂÑcÇ5:®êöCUÊVÖç*¶oç®0ôêík›^øìó9xœ•%]ž’r Aïˆî¶öèÔÅ îï ©ÔÖ•«V£»­=zôê‹ ƒ+{uú¸²ý)ëÊ–›™[`Gè.XÛô‚ïðQ*ÕQÙy§ÎëÕ Z2œžýÔFeß•”ógOÂÍÕÓgÌ–»®­ b.ÆJŸï݉Î:",lôob.Ê|Á¨&6‡ü† ~Æù³§Ðס76n ‘.Û¶=¦¦¦8{:œ;‘H„ú¥FÚ§I}•_6,—”_iØRÑ2yä­¯,s¿þ®.ðǹh„ïÞ)sœÔik‡fhذ!NŸ>+³î¾ýàÐÇ ˜¨Ô¶QQø-do\•~_™&ÇUÝ~¨JÙŠŽ±<[¶lîÐm8{:FFF˜ûÕ7ÏûÄdzàäÔçÏžDÌ_gá5t¾œû|ù®gõ’Y{ ѧO#%å6®\½*³,!!o¾ñÆóãbÑYãX¨²?eý@•~ÒªUKµê¨ì¼x•ç 1qª–ÎNرq—¯ êd4¢£Ï 77C‡©´®y3ü÷ð?deecGè.̘>àç냕߯†»»222ѾýÛÕª“@ ¨rYII þ‰¿mmío¹sIÕGÝòÕ¡h^‹ª±(..–¾¡‰DBc/ á?Â7ãÛe‹±yËVŒTãj“²7uŽ«ºýP•²cuÛº3 6#0p<û¢i“&pvq¯ÑãªÎþTéÊ–Wl¯²:*;/^äyCD¯§:u;‚Î;Á„–,š_Ö­Á¬OäéhiiÁÚÊ a»÷ =-={–þÇÙ§=ÒÒÒ°mÛØØX«ý&TQRR²ôñ“'9hÞ¼™ôyÛ¶m‘‘ùBÚ·ïÜQ«>ê–¯yu)OY,Œ‘‘‘!}~ãFBµbïïï‡ÃGŽ"))çÏÿ¡ïzÖXT縪ÛU)[Ù1®èz¹Xfee¡AƒÒçK–.ÇŽí!1ܶ6Ý!‹e?óxôè±Ü²4éãÊö§¬hÒOT©£²óâE7DÄÄé…ìé­ÛvHç†Ü»_æ²}Evv6X¹j5üü|dÞÈ|‡ycÍÚuÕžó.AjZòóÅØ·ÿûJ—ùùú`oÄ>äåå!??ë~^±ã5nŸH$ÂÑcÇ!‘Hp3%óæ-T«>ÊÊ×××ÇÍ”¤¥¥W*·â2eu©¸¾²Xt·¶BÈ–mÈËËCjj*-^V­Ø7mÒÎÎN˜:m¹„‘‘Q•å(j·<êWuú¡*e+j·< .Ajj*òóÅØŽîÝŸYš˜#:ú  3g}*³í¨‘ñ}ÇNäççãáÇX\Ḩ eûSÖ4é'Êê¨ì¼P÷u‡ˆ˜8½6V­\Žƒ‡Ž Wï~03·~Ú¥Ê7,[ÁÇ[öãéÃ|¼QXXXí‰áàé1ƒ½ÐÓ¾/Μ=‡§M‘.›0~,rrrЯ¿ìz:௠1øî»¥·¯ìÓ];["(h ÆŒ¥V}”•?齉êåWièDÞ2eu©¸¾²X|»l222зßxxzÃÃcPµb”NOJJV:)\Q»åQ÷¸ªÓU)[Y»+rwwà wáäì†àÛ¥‹¥Ë–.YˆÕk‚¥uÌœýÞ{o¢Ì¶Ãý|QTTÇ~.ðæOO™!/uc¡lÊú&ýDY•ª¼îðîåDu‹ 22RâììŒ{wïâéÓ@IqF…µïÐɉ×Uzíݽw£Æ!úäñz3s‹½+~VV6Þõ†SQÇØÁˆèµ}ò8&M×øµNK¨ ÐÕÕE‹–­ů\¡ú§  [·î€×ÐwŒj°ë逈}PPP€ôô ¬ûy=ÞäÎÀQÆÄ‰êá~\¾rNb±À^¢ IDAT0ªaåŠoñë¯aÕ½'<<½PXXˆ™3¦10DT§q#Õ;Wâ.2¨þ—W;::ÀÑÑ$¢z…Wœˆˆˆˆ˜81q""""bâDDDDÄĉˆˆˆˆ‰QýQîv@"aDˆˆˆˆ€çyQ¹üˆWœˆˆˆˆTÄĉˆˆˆˆ‰'"""¢WB:9\ò쇈ˆˆˆžçEåó#^q""""R'""""&NDDDDLœˆˆˆˆ˜81q""""bâDDDDÄĉˆˆˆˆ˜8iFô:UæÎ»pvqœ=…¦MšT»\3s @RB¼ÜçÕ)³Œ¶¶6Þ|ó Œ7ïN¨rßDDDT{½VWœ"£NJK$?YkYXXˆÿþ{ˆ¥Ë¾ÃºŸeÏ"""bâôbEE¸º;~â…ì')!¾Æ®%%Ä#ñÆUÄÆüi}ømë6ö,""¢:8I$Ï^¼¼<üù׈D"ÌûêKèèèà?þBNNŽt3s‹JCdòþ²e+zõv„}Ÿ~ع+¬Ò¾ämsäÈQ¸òD§.Vpg~?z\åº ˜˜cÒ{€ôôŒ*×½™’‚€1ãÑÕÒ-¬1ÔÛq—¯ú;„™¹îÞ½  tèÒÌÜý¸K·Øwn£³…5<<½pâD”ܶíÚµÝmí1rÔXör"""MHs#y‰Ó+vúÌ9¾WO4oÞ }zÛ£°°'OE«UNøÞÌ_°™HOÏÀs¾VºÍ™3çðÑô™Hþ÷&ŠŠŠœü/¦~ô1Μ9§b\%ÈÎ~‚_Ö—ѵlÙ¢ÊugÌüþyb±………ˆ¿†O?ûлw/ÀÙs<û}Ч·=àè±ã˜5û3ÜLIAaa!ñáÔé¸s±Ò~¾øòk˜CCCMš(w¸®¼+W®>ÿl6LLŒñùgŸ`WØ\¹ªú<(´lÑþ?nŒÂuãâ.ãÐáߥW´ŠŠŠd¤óçÿDqq1Οÿ³ôïϪþ¹øxÆ'•Ê«h„±Ð××C«–-ÙˉˆˆjÈkqÅéò•«UÎ ÊÉÉ‘&e =®´¾@ èëé˪ô·o½ÅÞMDDT§²aºó¿–&"I ñøfÞ\Ï?]§§§8~<ùùùøþ‡5•ÊêÔѰtÙwÈÏÏÇ?ý¬tÿ;u,ûö;dg?Á²eß,-»Õx[W}_ZgßaÞ¸}çîódíÙ¤|ûgó™~Xó#€çW›ÀܼàûUßáŸøKÒ8Ýø§ò']]]ön""¢º˜8E>» AëÖ­dþnjÚpâD$ ,ºt|4}&ºYÙ!tgå!¸²›O†ï@7+;„ïݧtÿeÛ„î ƒ=v…í––¦N™\ãm}£Q#À w1eêtxþI¼²DéÁƒÿ<Ÿ'ŒLÿx6:[XK?A7)èCöd""¢ú’8]»öOiâÔªBâÔ¶4qJMKC\Üe,\0–ݺB[[íLM±rÅ·•Êzçw|3o.6lˆ¦Mš`á埪su€ïW}‡ŽææÐÖÖ†™Y{ü´ö™«=5eù·‹ñv»vÐÖÖFß¾}°%d#H'¢ÛÛ÷”/ …Bôìi'ÝöÝ!ƒ±tÉB´oÿ6D"6l?¿aø~ÕwìÉDDD/ 22Râì쌻wn£   ô¯’B kß¡ ’¯1ªÕ4Ìo$ââ.£·}/ibEDDDê‰>yƒ¦k~ÓkAéÓtuõЪukDEEñK~_7999ÈËËPzõŒˆˆˆ^"†àõÒ£W_èc¤ÿpøóf@ˆˆˆ˜8QUþ‰¿Ä ½¦8TGDDDÄĉˆˆˆ¨zòóó™8©’4ÅÅÅA,3q""""RD__VVVÒo.aâDDDD¤&NDDDDrp¨ŽˆˆˆHEò†êžßÇI")ý!"""¢r¹ÑóüˆWœˆˆˆˆä(ª»Ì¡:""""eJ‡ê,ù©:""""U“§ò˜8©ˆ‰'""""&NDDDDLœˆˆˆˆ˜81q""""ª?¤_¹Rþ†âÆ…ˆˆˆê9I…߯8©Œ‰'""""&NDDDDLœˆˆˆˆ˜81q""""ª?¤÷q‚DRúðFNDDDDey‘äùœxʼnˆˆˆHE¢ºÐˆè“Çy$‰ˆˆê¸~ý]™8Õ”‰AÓÙ£ˆˆˆê(‰D‚äÄkLœj:¨DDDT·¼ SÎq""""bâDDDDÄĉˆˆˆˆ‰§ZH x1w ‡ŽŽttt.³ìÏ?ÿDß¾}kd?7oÞ„““tuuÑ£G$&&ò 1qª]FŒÐÐP„††bĈ2ËfÏžåË—×È~0tèPdffbäÈ‘?~<ƒODDTM"†àå*,,„···ôq™ððp4oÞ½{÷®‘ýÄÆÆâĉÐ××Ç|€Ï?ÿœÁ'""ª¦:{Å)11C† AÆ ¡££ƒ.]ºÈ üúë¯hÖ¬4h€ & 33S­²âããÑ­[·Jëççç£U«Vxôè‘Ju-**Âܹs±dɹˈ÷LLLàîW¯*,sÀ€8|ø0àâÅ‹ppp`o'""ª©ÄIRî§.1b<<<ðàÁ¤§§côèÑxÿý÷eÖY³f Î;‡»wïÂÄÄ|ðZeYXXàÍ7ßÄï¿ÿ.³þÖ­[áêêŠFU*K[[ááᇶ¶6àçŸÆ€`ffVåþCCC!‘Hpÿþ}xyyÁßß_aû×®]‹9sæ`Íš5øñDZyóföv"""5ÈË‹êì§ØØXLž<úúú011Á¬Y³––&³ÎÊ•+Ѿ}{cæÌ™8}ú´ÚeM™2+V¬YõêÕU&aes›Ê’¡ììl¬Zµ _}õU•Ç4h€ÜÜ\€‘‘&Ož¬ðŠSnn.¦NŠ‚‚¬Zµ 7nD›6mxUSž~îÜ9|õÕW9r$ºvíZi¹½½½ôqË–-‘žž®vYÞÞÞˆÇåË—ÑÑÑ•Ê.ÏÛÛOŸ>ÅÓ§OáííeË–!007®râø¦M›0fÌxzz"<< Û=}úttîÜ xÿý÷±hÑ"iB5oÞ<öz""" ÕÙÉáëׯNJ+0kÖ,¸»»ã­·ÞBûöíeÖ …ÒÇŠn? ¨,‘H„   üïÿCpp°Â«MÝ»waaaˆ‹‹PõÄqOOOüý÷ßøë¯¿pðàA9rOž<Áèѣ喊{÷îA$á“O>ÁÈ‘#Œ !!½žˆˆˆ‰“¬Ù³g#)) Mš4ÄÇÇWZçòå˰³³dffÊ“¤JYAAAèС>ýôSœ8q6lP©Ž_~ù%¾øâ èéé)]×ÚÚÖÖÖ Bll,lmm«Lœtuu!‹abbذa,,,pçÎ\¿~½žˆˆHCuv¨®aÆ8räÄb1bccPi?þ÷ïßG^^6nÜXå­”•õÖ[oaðàÁðó󃯯¯4aQäòå˸|ù2ÆŒ#ý›¼‰ã`ii‰Ÿ~ú Ož<ܺuKfyE|ð-Z„'Ož ==ëÖ­Cvv6Þÿ}Œ=Z:¬HDDDš&NIéO°qãFÌŸ?ÆÆÆ=z4>ùä“JëøøøÀ¦¦¦¸s炃ƒ5.kÊ”)¸víšÊÃtŸ|ò –,Y-­ç‡ âÄñ2Û·oGhh(š5k@PiyEóçÏGÆ ѱcG´jÕ »víÂþýû±fÍXZZbË–-ìùDDDÊ”åEår#Add¤ÄÙÙ·SRPP .ͦ´J4*¿}‡.HN¼öÒÛ}ò8&M‡D¤O ¨µ¾2)))prr­[·ØÑˆˆˆjPrâ5rŒ²ü )!^£ý–””^ÜÐÓÓC붦ˆŠŠâW®Ô±XŒüQf؈ˆˆê~åJ xóÍ7ѳgO:tˆÁ ""bâT÷Ôä0]ÙÍ)‰ˆˆ¨nãP'"""¢šU§†ê^Å'úˆˆˆˆ‰S­#©#÷Ÿ""""&N/T¿þ®¼ÚDDDD/ç81q""""bâDDDDÄĉˆˆˆˆ‰'"""¢úCz;ɳ""""zž•ÏxʼnˆˆˆHE"™¼Šwß&"""z–IdƒWœˆˆˆˆTÆÄ‰ˆˆˆˆ‰'""""&NDDDDLœˆˆˆˆ˜81q"""""&NDDDDLœˆˆˆˆ˜81q""""bâDDDDÄĉˆˆˆˆ‰1q""""bâDDDDÄĉˆˆˆˆ‰'""""&NDDDDÄĉˆˆˆˆ‰'""""&NDDDDLœˆˆˆˆ˜81q"""""&NDDDDLœˆˆˆˆ˜81q""""bâDDDDÄĉˆˆˆˆ‰1q""""bâDDDDÄĉˆˆˆˆ‰Ó‹ffn¡ðGUG~?Vãu«X¦:õ!åÇýeËúãÙwy^Qm ªKIJˆ¯vS?ú¸FÊyÑeã^[Ï1"¢ÚŒCuDDDDLœä33·@DÄ~8»¸Ã¼S7têb…£ÇŽK—•ý.?lðÃêµèÑ«/ºÛÚcþ‚Å(..–)oGè.XÛô‚ïðQr÷'¯ÌM›Bàèä‚»ÊÔA•}ÊóËú èÛoºt펀1ãq3%Eº¬¤¤˾]Û½ÑÕÒ#üG#9ù_™:ùýÜß‚ÎÖpä‰Ó§Ï"|o\zTŠ“¦Û¤¤ÜBÐû¢»­=:u±‚û;C*•YÕ±€¬¬lüßsacg^½±uÛ…ǹbÜ•ÅA^­¼á¤ŠCYŠÚPQuc¢IyŠê¯,Æå×Õ$ž;w…¡WoGXÛôÂgŸÏÁã¬,µÚ‘˜˜O¯Jë‹Åb88@VVvµÏY""&NìÛ[6o@Âõ+øáû˜6}€çÃI ñÒÇÛ¶‡ÂÔÔgOGâs§ ‰ðãO¿È”wåÊUœ;…Ë—VÚ—¼2àDT~ Ù„ÄWeê ê>ËÛ¾c'7nŒ£G 6æ<ܺaÚ´™Ï“´à!úäq\øó,ÜÜ\°|ÅJ™2‚ƒCðãšï÷÷_ðõõÁä)Ó±ï6mø¥Rœ4ÝfÚdzàäÔçÏžDÌ_gá5t¾œûJÇæ~ý \]àsÑß½aa{ªŒ‰¼¸«‡Š[uû—<Õ‰&å)¢NŒ5‰ç–-Û°+tÎžŽ„‘‘æ~õZíèÐÁ 6ÄéÓg+ÄèúØ£A“jŸ³DDõ&qRurøWs¿@«V­Ý\QTTTe™;BwÁÕÅ:::ÐÕÕEàÄqؾWf I000@Û¶mT®ëÂùó¤ëW¬ƒ*û,/tg<Þq‡ôôô0vLöï{þ†¶;Æ…¡¡!ôõõ0ÌÇ qq—eë³`Ú·:::0 b± ÌCëÖUÇIÝmöí CÀ(èééÁÈÈÇ#33SåcsáB œœ¡££ƒ-Þœ9Ÿ«Õ?T‰CEš[uúWuc¢IyЍcMâ9ç‹ÏѦMkbâ„qˆ‰¹¨v;ƌĆÁ2뇄lŨ‘#^è9KDÔÓÉáeoìªHNþ–Ö=dþ& ež·jÕRíº*ªƒ*û”]?zzzU.¿uë6š5k*}nbb‚ÌÌG2ë´kg*}¬¯_ZVË-¶A“mbc/!úôi¤¤ÜÆ•«WÕŠKfæ#ˆDÏ»¬E—.jÅ\•8TTÓǶ¦c¢IyЍcMâimm)}ܼy3…ëWÕŽ]±`ÑR\¿‘€NÍqáB̳²­^è9KDTç'•/³i©~¡­¤¤ÿÄ_‚¶¶v•ë(Jj4ÙF•}–WTT¬öþ+Ι’W@ vmº3 6#0p<û¢i“&pvqWëØK÷+ «Ý”ÍSvlåm¯Nÿª‰˜¨[ž²úW'ÆÕ§*í …ðᇃñí²Åؼe+F>»Úô"ÏY"¢z›8©£mÛ6ÈÈÈDóæÍ^Û}¶kgŠÂÂÂ*ß(LMÛâáÃT´hñ ;;û•ÄrÉÒåˆ<~o¼ñ 11I­í‘‘‘¦MK¯rܸ‘ Öö/"·ïÜy¥1©nyë¯NŒ5‰çõ èÖµtè<++ 4Шþþ~pq}A“qþüXºxÁ+=g‰¨]|adéëëãfJ ÒÒÒ~¾>رyyyÈÏÏǺŸ×cì¸Àj•©ŒºûôóõÁ‰Q‹Å‹Åؾc'†¼ë#]>ÌÇ ›‚C››‹ü|1ö„G Q£F/=¶&&ƈŽ>ƒ‚‚ÄÇ_ÃÌYŸªµ}wk+„lÙ†¼¼<¤¦¦bÑâejŽ&â ‰pôØqH$ÜLIÁ¼y _iLÔ-OYýÕ‰±&ñ\¸p RSS‘Ÿ/Æ®°ptïn¥Q;š6igg'L6ƒÜÂÈÈHã󇈨Þ&N5qçðIïMÄP/?é°À„ñc‘““ƒ~ýÝ`×Ó]ˆÁwß©÷IœŠe*£î>ǃ®ß@¿þn°±ë#GŽbÍêU2å …B8:¹ÀÁ±?bcÿÆæMë_úñYºd!V¯ý –Ö=0sögxijmÿí²EÈÈÈ@ß~àáé AjËêÆ¡ìSm;["(h ÆŒõJc¢nyÊê¯NŒ5‰§»»y¼ 'g7yœÁ%"¹¢OÇÄ é¿ö—ÎÛÕÓÓCÓvˆŠŠâPÕ>غu¼†¾Ë`ÑKÅÉáDTëØõìKËnذ~ƒADLœˆ¨î©Éaº+qP"z%8TGDDDÄĉˆˆˆˆ‰'ÒÌÑcÇÑ©‹:u±ÂÑc²ÍŽ‹»Œþ£_j}Êß7«ªÇжyT·>G~?Vey—©[VM·§&c¯¨Ý5Ù×ízôAqq±ÊýëE{Ñí&"&NTƒ¦MŸ…¾_!½¹ayK–.ÇçŸÍ~©õ©ÉIÀµÕÔ>®2&—©[Vmj÷‹êëçÏ‚P(|múZm:FDT=üT]PTT„n®ÒÇåÿ;oܤ1ºw·f¨Îõu"¢W¡Î\q23·ÀÎ]aèÕÛÖ6½ðÙçsð8+KfùŽÐ]°¶éßá¥_3QRR‚eß®€mÞèji‹þ£‘œü¯L¹+W­Fw[{ôèÕ6W¨XfJÊ-½ÿ!ºÛÚ£S+¸¿3DføÌÌÜG~?÷w† ³…5Üyâôé³ß×0ïÔMî›ºŠ‹‹±rÕj|2k†ÜåeCfæ°êÞã'NBBB¢Üu\pÿþéóäoÂÌÜbž$üþýè×ßUÚFMì €û OØØÙcúdzñøñc™å?¬^‹½ú¢»­=æ/XŒâââ*ËRÖ>yu¬ø7EõQT~Y9å¿îGÞWyë+‹EVV6þ°±³G¯ÞŽØºm‡F±OLL‚‡§W¥uÅb1 ++»Ê:—¯ë¦M!ptrA‡Ž]åömU«ª±Ó¤¿({ýPt^kÚn"bâôÊmÙ² »B·áìéHaîWßÈ,¿rå*ΉŠå¥ß[µ)8EEEˆ>yþ< 77,_±Rºþ®°=€sg¢°wÏN8p¨Ò>+–9íãYprê‡ógO"毳ð:_Ε­Gpp~\ó=âþþ ¾¾>˜}VfÝ}ûÀ¡=40Q©m'¢¢ð[È&$Þ¸Z©o«s\Õ‰ºýEÙ뇢óZ“v§×œ/>G›6­ahhˆ‰Æ!&Fö&yA“a`` M&Âv‡cÂø±044„¾¾†ùx!.îr¹aü¡¯¯–-[`î—_TÚgÅ2÷í CÀ(èééÁÈÈÇ#33Sf›… æ¡}û·¡££ƒÑ£ ‹±pÁ<´nÝ 0ÐÍUfÈM™²å²7óœœl ÁGS'W9qÜØØùyùŒòÇáƒU&NŸ%NOŸ>Å¡C¿cíšïqâDrss11aWÍÄéë¹sЪeKèêêÂÃc¢¢NÊ Wgèèè@WWÇaOøÞ*ËR§}šÔ§&Ê×”²X\¸''Gèèè E‹·0gÎç·uLÀHlØ,³nHÈÖJ_¬«ÈÂùó¤çGž­îq­©©ûú¡Êy­N»‰¨öªSsœ¬­-¥›7o†ÌÌG2Ë[µj)óüÖ­ÛhÖ¬©ô¹‰‰‰Ì6 ‰xó7¤Ï-,:WÚgÅ2 6ö¢OŸFJÊm\¹zµÒòvíL¥õõõ-[´Ð¸ÝÝ\qýZœôùŠÿ}?ßahÔ¨‘4™*»JR¶Þ²¥‹ôþ‡8pð0üü| %Ђ«ë¹åÛÚÙbÛö€ÃGŽÂÞ¾'Ú´i ‡>8pð0F ÷EÌÅXŒ[½OïuíÚ¥\\ô‘üïMéóääaiÝCf}¡PXeYê´O“úÔDùšR‹ÌÌGÒ+`Ñ¥‹Æm8Ð -Åõ èÔÑ.Ä<;׬T®oÙ?š´åEÅH“×eçµ:í&"&N¯e/Œª¼ —Ÿ¡hNDUe†î Æ Á GǾhÚ¤ œ]Ü•ÖC ÔH >|ˆ#GŽâÀþÒᙪ&ŽpvÂþˆÝˆ»|Q'£}¹¹¹:tH¥2Í;˜á¿‡ÿ!++;BwaÆô©?_¬ü~5ÜÝÝ‘‘‰öíß®VÝÅ ¤¤ÿÄ_‚¶¶¶Je©Ó¾ªŽµ¢ú¨[¾:”õ;UbQ\\,íg"‘PãØ …BøðÃÆÁøvÙblÞ²#Õ¸Ú¤ì¼S÷¸ªJ“rÕS•óZ“×"ª}êÔPÝõ ÒÇYYYhРÂõMMÛâáÃTéóìlÙÉ®ææðèÑc¹åWeÉÒ娱=#†ûÂÖ¦;ÄbñKÁÿVþ€É“ƒ «««tÝÎ;Á„–,š_Ö­Á¬OäéhiiÁÚÊ a»÷ =-={–þ'ß§=ÒÒÒ°mÛØØXW;ùKJJ–>~ò$Í›7“>oÛ¶ 222Õ*OÕöÀí;wÔªºå«C^]ÊS cccdddHŸßP¡ß*j«¿¿9Ф¤dœ?ÿ†¾ëYcýU“ãú¢ÊUôúñªÏk"bâôB,\¸©©©ÈÏcWX8ºwW<œ0ÌÇ ›‚C››‹ü|1ö„G Q£FÒå£FÇö;‘ŸŸ‡bñâeJë`bbŒèè3(((@|ü5ÌœõéKM¯ßH€W¹«ò&ŽÀ`OolݶC:GéÞýû2Ë+²³³ÁÊU«áçç#“PùóÆšµëª=1æ/\‚Ô´4ä狱oÿ8:ö•.óóõÁÞˆ}ÈËËC~~>Öý¼cÇVY–²ö•ÅE"‘àfJ æÍ[¨V}”•¯¯¯›))HKK¯TnÅeÊêRq}e±ènm…-Û——‡ÔÔT,R¡ß*jkÓ&Màìì„©Óf`û@UYŽ¢vË£îqU•&å*zýPv^«Ûn"bâôZpwwà wáäì†àÛ¥‹®?aüX…B8:¹ÀÁ±?bcÿÆæMë¥Ë‡ûù¢¨¨Žý\à=ÌžžJ/ý/]²«×þKë˜9û3¼÷ÞÄi›*ñ_ºl9>™5ZZÏkʼnãeV­\Žƒ‡Ž Wï~03·¨´¼Râdkƒ¢¢"øx{UH>½QXXXí‰áàé1ƒ½ÐÓ¾/Μ=‡§M‘9V999è×ß v=ð×…|÷ÝÒ*ËRÖ¾²¸tìl‰  )3z”ZõQVlíj5 ÍIDATþ¤÷&b¨—ŸÜᜊ˔եâúÊbñí²EÈÈÈ@ß~àáé AÕŠ=P:I<))Yé¤pEí®êT縪J“r½~(;¯Õm·ªç4½~‘‘‘gggÜJ¹‰‚g—Ÿ…B‰F…µïÐɉ×^ICÌÌ-^ø]„³²²ñ®×0œŠ:ÆžCõÊÝ{÷0*`¢OÖÍ{½Œ×"zù¢OÇÄ éŸßÅÅ¥SPôôôÐÆ´¢¢¢ø•+ŠØõt@ľ(((@zzÖý¼ï rg`¨^)((ÀÖ­;à5ô]ƒˆê=&N ¬\ñ-~ýu#¬º÷„‡§ 1sÆ4†êÙ?}pùÊ|89ˆÁ ¢z¯ÎÜŽàE\fwtt€££{ ÕkWâ.Öù6r˜ŽˆTÅ+NDDDDLœˆˆˆˆ˜81q""""bâDDDDÄĉˆˆˆˆ‰1q""""bâDDDDÄĉˆˆˆˆ‰'""""&NDDDDLœˆˆˆˆˆ‰'""""&NDDDDLœˆˆˆˆ˜81q"""""&NDDDDLœˆˆˆˆ˜81q""""bâDDDDÄĉˆˆˆˆ‰1q""""bâDDDDôˆjºÀè“ÇU"""b⤌@ `D‰ˆˆˆ‰“*’âQ"""ª³8ljˆˆˆˆ‰'""""&NDDDDLœˆˆˆˆ˜81q"""""&NDDDDLœˆˆˆˆ˜81q""""ªE~W]ôÉãŒÕ&MCrâ5ͧ²ˆˆˆˆHIâÔ¯¿«Â¬‹ˆˆˆ¨>á'""""&NDDDDLœˆˆˆˆ˜8½ÎD Qí`fnÁ Ô°¤„x&NDDDu•D"aj€@ Ðh;&NDDDµ oT=Õ¹Á7ç81q"""ªûÊæ=ñ·j¿«K)qvvÆ­”›(‹B!ÇO‰ˆˆ^Ç$I"‘H‡êÌÌ-ÔžÜ\ßã—”è“Ç11h:œË‹KçAééé¡i;DEEñŠQmŤéåÇ‹‰Q-¥êðÓ­;w1ûÿæaâûÓpâÔi¥ëïÙwcÞ›‚¹ –"#óQ½‹'""¢:H•+()·ncáÒ°¶êŠa>ï"bÿa>z¢Êõ7o Å…ØË0fíÛcμEÈ|ô¨ÞÄ‹‰Q¥Ê”Õë6¹¿# õðäI†yÁ‘ã‘r“§ÍÛBq#ñ_ ìŽôŒ44oÖVV]²mW½‰'""¢:J•+(=‚±‘²²²žžŽû÷ïaØÐ!8yJ&yÚ¼- É:xnÝJAvvžÀÈÐSSå–]RR‚í;vÂËg8ºtíKë?a.]Š«ñ„åeÅKÞ“ˆˆ¨–RåSu£F þCG0xÐ@¤¦>@VV´´ðyw0vG@jZ:“nâÝ!ïàÎ[ÈÍËE³¦Í! uê,fNý R¹‰3f~ŠÇcÞWsÐ¥KgˆÅ8|äwNúë~\=ìj]¼˜8ÕQª$®Îý ‹qàðïâᎴÔT˜0¶Ê¤ âãÿµÜe"‘íßn'wÙ¦à!úäq\øó,ÜÜ\°|ÅJéòiÓgá‡ïW )!çÏž„›« ¦Ï˜-]¾m{(LMMqöt$þ8w "‘?þôKÇ‹‰Q£îwWx¸¹`ÿáchÔè èéê!''9¹9000€Ž¶Â÷ÂûãÇ(Lš 77&&&j×9lw8&Œ CCCèëëa˜ââ.K—#?/```€€Qþ8|0Bº|Gè.¸º8CGGºººœ8{Â÷¾xÉM Ù툈ˆj'M® ¤¦g@_O%%%<æ   úFÐÕÑAzf¦Òr4h€Ç³Ð¸ñ›jíÿÖ­ÛhÖ¬©ô¹‰‰ 2ËÝdsÙÒEzÿC8x~~>ÐhÁÕu€tyrò¿°´î!S¦¼ášŠ'""¢:BÝO‰mÚ²Wÿ¹G‡ž¸wï.ž>-Dƒ Q\\ˆ'Ož ¸¨®ý±ïÐÀ;]ª,«[7 ü}éÜ\å¯u œTªWù9Jœ°?b7â._AÔÉhDGŸAnn.† tŽÔ?ñ— ­­ýÂã%‡êˆˆˆj)u’€ ›·ârü5ô²³Æý{w‘››CCC…BCGGYÙÙÈ|”þý¾ï Â;Œ{{ Eðæ-())©´,11 û÷»©i[<|øü¾PÙÙÙ•ÖéܹüGøaÉ¢ùøeÝÌúäsé²¶mÛ ##ó…Ç‹‰Q£êœ_ƒ·"þÚuØv·Äƒ÷J“&CB=q Ç#£ah` ]]]de=Æ£ÌL8:ôÂî}û«Lž<¿CCC|ðáG¸ví#--¿mÝŽ©Óf`ö¬r·æã…MÁ!ÈÍÍE~¾{Â#ШQ#éòÁžÞغmrss÷î߇Hô|€ÌÏ×{#ö!//ùùùX÷ózŒX£ñbâDDDT©reWø>\¹öºYt”^i200´´pòÌ9|ðÞx <Q§Î@OO::¥ÉSvvz÷°Å®ð}8ÿgL¥r~Zûlml0cÖ§°èfƒACð×…lXÿZ¶l!·>Æ…P(„£“ û#6öolÞ´^º|ÕÊå8xèzõî3s é§ìÊoŸ““ƒ~ýÝ`×Ó]ˆÁwß-­±x)#ˆŒŒ”8;;ãVÊMˆÅ¡PÂÞHDDôš13·€D"Arâ5éseÉÀèÀa×½ ò‘ŸŸcccèéà¯ØKxoll¬-Ç"Obß¡ßÑÓÖ yy¹ÈÉÉE£FoàqV6g?ÁŠÅóëDü’â}ò8&MWšL zzzhcÚQQQœNDDT[©rÅ´mk¤ed¢É !‘H ‘pîÏ‹ãï‹vm[#--H`Ý­+rrrp4ò$¬-, «£ ‰D‚G³ÑÁ¬=$ 4©É:¾NñR†‰Q-¥Ê§i“'á‹y ñ´ º::HNI@À¼mÚg¡¨°Å%%èfÑâ‚Dž:‹6­šãÞƒT@ ÀèÃ^Ûd¨¦ã¥ ç8ÕRª$M¿‰Åó¾DãÆ‘Ÿ/Ƈ“Æ£»e7E"ˆD"E"h?{¬-¡_ ÷~Ožä£ÝÛíðÍœÏJçDÕ“x)Ã+NDDDµ”*WPš4~³§OAqq1Š‹KPTTƒ"}£¸¸X: §%Ô‚H(Ä€þýàî6B¡B¡ZZZÒaºº/&NDDDu”ªI€@ &A¥ô/ q¨Žˆˆ¨–*›¤Íßêý®ÞŽ€ˆˆ¨%JåoG@šá툈ˆêÙ?½Lœˆˆˆj‘º0I»6ã'""""ñŠQ-Q[o'""""U’¦Ë—/Cüì>— õôéSF†ˆˆˆ¨}}}XZYAO¯ô+jž>}ÊĉˆˆˆHžüü|èë=ÿ^¿ÂÂBˆtutž–†ââb邲[ŒÕ»dI__:Lgeemmm¤§¥AWGZnê âââPTXÈhQ½NšÊæ4•¦{úô).]ºsó-h ž‘ÁˆQ½UqN“¾ž$ ÒÒ3  <ûTÝÏ Ú‚‚‚§¸}÷.žää ¨¨ˆÑ#""¢ú—<=KšŠŠŠ““‹Ûw¨o·k'Ê}åÊO7„@ˆ‘ÍîH2239"""ª×6lˆv¶2¿ÿ9Äøi£!dIEND®B`‚kildclient-2.11.1/doc/C/kildclient.xml0000644000175000017500000117406011570177315014452 00000000000000 KildClient Manual Version 2.11.1 Eduardo M Kalinowski 2004-2011Eduardo M Kalinowski KildClient User's Guide Introduction KildClient is a MUD Client written with the GTK+ windowing toolkit. It supports many common features of other clients, such as triggers, gags, aliases, macros, timers, and much more. But its main feature is the built-in Perl interpreter. You can at any moment execute Perl statements and functions to do things much more powerful than simply sending text the the mud. Perl statements can also be run, for example, as the action of a trigger, allowing you to do complex things. Some built-in functions of KildClient allow interaction with the world, such as sending commands to it. This manual will guide you in using KildClient. First the basic usage will be described, and then more advanced features will be explained. In the end, there is a reference of all built-in functions of KildClient, which can be called from your scripts. It is assumed that the user has some basic knowledge of MUDs and their working, and also of the specific MUDs the users connects to. This manual has no aim at explaining how to play a MUD. Even when specific examples are given of commands, these might not work on all MUDs. Running KildClient To run KildClient, type kildclient in your command prompt: kildclient [-c DIR] [World...] & The ampersand (&) at the end of the line means that the command is to be executed in background, that is, not to wait until it finishes to get another command prompt. Since KildClient is a GUI program that does not require any input from the terminal, this is the desired behaviour. You can enter the name of one or more saved Worlds in the command line, to have these Worlds opened automatically. If the World name contains spaces, you will need to quote it to prevent it from being interpreted as two or more names. The exact way depends on your shell, but generally enclosing it in quotes should work. You can also specify a host name to connect to in the command line. By default, connection in made to port 4000. You can specify a different port by using hostname:port. While not recommended, you can also specify a username and password with the following syntax: username:password@hostname:port. This host specification syntax can be prefixed with telnet:// and end with /, for example telnet://some.mud.com:4444/. This is to allow links used in Web pages to be opened by KildClient. If the -c (or --config) command line option is given, its argument is treated as the name of a directory to use to store configuration files and saved worlds. If it is not given, the default is ~/.kildclient under Linux or kildclient under the Application Data folder under Windows. Alternatively, you may start KildClient from a menu in your Windowing Environment. The exact way to launch KildClient will then vary, but it should be just a matter of finding the menu entry and clicking on it, or perhaps just cliking in an icon somewhere. Basic Usage This chapter will describe the most basic and important things you need to know in order to use KildClient. It is recommended that you read this section throughly, as it will ease understanding of the next chapters. Connecting to a MUD When you launch KildClient (see ), you'll see a screen like this one below:

When KildClient is first started, you are asked to connect to a world The screen shown when KildClient is first started.
Before anything else, be aware that World is just a synonym for MUD, and these two words will be used interchangeably in this document. The list of saved worlds may be empty, especially if this is the first time ever KildClient is run. You have two options: connect to a previously saved World, or connect to a new one. To connect to a new one, you can either connect direcly by typing the MUD's address and port in the boxes, or by creating a new World. Creating a new World is recommended because it allows you to save options for that world, such as the font size or the colors used. When you define triggers, aliases these will also be saved. However, even if you connect directly, you can still customize the World, and you have the option of saving it, so the difference between the options is not so great. To create a new World, press the button labeled New. You'll be taken to the World Editor, a dialog in which you can configure everything about the World. We'll talk about the World Editor in . For now, fill in the Name, Host and Port fields, and click OK. To connect to a saved World, just select it and click the button labeled Connect. Alternatively, you can double-click the World in the list. Sometimes you may see a little expander sign to the left of a World's name, and when you click it some options appear inside that World. This happens when there is more than one character associated with that World (see for information on auto-login and associating characters with a World). The list shown is the list of all characters defined for that World. Select the entry corresponding to the character you want to use to auto-login with that character. If you select the main entry, the first character will be used. To connect directly, fill in the Host and Port fields and click Connect. You can be connected to several Worlds simultaneously. To do that, select the option World Open from the menu. The World Selector dialog will be opened, and you can select another World. Interacting with the MUD The figure below shows a typical KildClient session:
A typical KildClient session with two open Worlds A typical KildClient session with two open Worlds.
The first thing to note is that, just like in other MUD clients, there is an area where the output of the MUD is shown, and a text box below where you can enter commands. You can edit the commands before being sent, and only after you press ENTER the line will be sent to the MUD. A feature not so universal is the support for opening several Worlds simultaneously, and using tabs to alternate between them. You just need to click the tab to change to that World. If the name is displayed in red, that means that there is new text in that MUD, text you haven't seen yet. If the KildClient windows does not have focus (that is, when you using another window and leave KildClient in the background) and new text arrives in any World, the title of the KildClient window will change to "(*) KildClient" to alert you of that. There are other ways to move to another open World. The keyboard shortcuts CTRL+Page up and CTRL+Page down move to the next or previous World, respectively. Alternatively, you can use ALT+Right arrow o ALT+Left arrow instead to achieve the same effect. To got directly to a World, press ALT+num, where num is a number from 1 to 9. This way you can move to any one of the first nine open Worlds. On the left of the command entry box there is a button with a broom. Click on it to erase the whole command line. You can recall recently typed commands with the arrow keys. Pressing the up arrow recalls the previous command, and the down arrow moves to the following command. If the input box has multiple lines, as described below, then use Alt and the arrows. On the right, there is a button with an arrow poiting downwards. Click on it to get a list of the last typed commands. Selecting one of these commands will put it in the text box for you to repeat it, possibly changing it before. On the extreme right, there are two small arrows. These arrows allow you to enlarge the input box if you type long input lines. The input box can have from one to ten lines. The arrow pointing up increases the size, the arrow pointing down decreases it. The behaviour of input boxes with one or several lines is different: if there is only one line, and more text than fits the width is entered, the text is scrolled horizontally. On multi-line input boxes, however, text that does not fit one line is wrapped to the next line. A scroll-bar may be displayed if the whole text does not fit in the number of lines selected. As mentioned briefly before, the behaviour of the up and down arrows is different. If the Alt key is held, then you will retrieve other commands in the history. If you press just the up and down arrows, it may retrieve another command or simply move the cursor: if you have just sent a command or just retrieved a command, then the arrow keys will move through other commands, but if you have moved the cursor in order to edit, the up and down arrows will move to the previous or next line. This may sound complicated, but is actually natural, the arrows do what you expect them to do. In the single-line input box (but not in the multi-line one), a feature called command auto-completion is enabled: when you start typing a command, a list of the previously typed commands that start with the same string you've typed. You can select one of them from the list to repeat it or change it. However, in both input methods, you can type the start of a command and press Alt+Shift+Up arrow to retrieve a previous command that starts with the typed text. You can then use Alt+Shift+Up arrow and Alt+Shift+Down arrow to navigate through all the saved commands with that prefix. You can enter several commands at once in the command line separating them with %;. For example, if you type unlock door %; open door, two commands will be sent to the MUD in sequence: first unlock door, and then open door. Spaces around the %; are ignore and can be used for clarity. Note: it is possible to configure the command separator to be another string instead of %;. See . Another special feature of the command line is that you can execute Perl statements from it. Starting a line with a slash (/) causes that line not to be sent to the world, but to be intepreted by the built-in Perl interpreter. To try it, type in the command box /$world->echonl("Hello, Perl World!"). You should see "Hello, Perl World!" printed in the screen. What has happened is that the command $world->echonl("Hello, Perl World!") has been run by Perl, and this command causes a string to be printed in the screen (but not to be sent to the MUD). Don't worry if you do not understand the syntax yet, we will explain it in . For now, just keep in mind that if you type a line starting with /, it will not be sent to the MUD, but what follows the slash is treated as a Perl command and executed. Should you need to send a line that starts with / to the MUD, use two slashes: entering //list will send /list to the MUD. If you are using the multi-line input bar, you can enable to built in spell checker to verify the text as you type. Misspelled words will be highlighted with a red line below them, and you can right-click on them to show a menu with possible spellings. To configure this feature, see .
Closing Worlds and Exiting KildClient When you are disconnected from a World (either because you requested it, with the quit command or something similar, or because the server has gone down), you will see a dialog box from which you can choose from four options: Reconnect will attempt to reconnect to the same World (using the same character for auto-login, if there is more than one defined, see ). Connect to another world will open the World Selection dialog (see ) for you to choose another World to connect to. Offline will keep the world open so that you still see its output or execute some things with Perl. Finally, Close will close the tab for that World. If that was the only open World, KildClient will exit when you press Close. You can force disconnection from a World with the World Disconnect menu. Note that this is not the recommended way to leave a MUD, but it might be necessary in other cases. The same dialog with the three options will be shown. If you choose World Close from the menu, the current World will be forcedly disconnected and automatically closed (just as if you had selected Close from the dialog). If this is the only open World, KildClient will be exited. To close all open Worlds and exit KildClient immediately, select World Quit from the menu. These operations can also be run with Perl. To disconnect from a World, use the $world->dc (that is, type /$world->dc in the command box). To close the World, use $world->close. And to quit KildClient closing all Worlds, use quit (type /quit, as you might imagine). The reason quit does not have $world-> in front will be explained in , but for now suffices to say that since it operates on all Worlds (and not in one specific one), it does not have that. Reviewing and Searching Text
A typical KildClient session with two open Worlds A typical KildClient session with two open Worlds.
The main box that shows the output of the MUD keeps by default the last 2000 lines received (but this number can be changed, see ). You can recall the previous lines with the scrollbar or with the page up and page down keys. You can split the main window in two parts. This way, you can use the bottom part to display text as it arrives from the MUD, and use the top one to review something that was received before. To do that, select the Display Split Window menu. To adjust the size of the windows, drag the bar that separates them. Alternatively, you can drag directly the separation bar that appears just below the tabs with the open worlds. You can search the text saved in the buffer for occurrences of a given word. To do that, use the Edit Find menu. When you select that menu, a bar appears above the command entry box. Search is done through that bar. To start searching, type the text you want to find in the entry box in the search bar. Searching in KildClient is done incrementally, that is, as soon as you type the first character, search starts (displaying the first occurrence of that character). As you continue typing, searching continues, always looking for occurrences of the text that you have typed. If you are looking for a word, often you don't even need to type the whole word, only the beginning is enough. If the window is split, then the bottom window is not changed and keeps displaying the same part, and the matches are displayed in the top part. If you've found an occurrence of the text, but it is not the one you intended, use the Find Next button beside the entry box to find the next occurrence. (You can also use the Edit Find Next menu.) Pressing the Enter key when in the input box also activates the Find Next feature. If the text you typed is not found, or if there are no more occurrences of it when you press Find Next, Not Found will be displayed in the search bar. In this case, you can erase some characters and try again (if you made a mistake), or reset the search and start again, as described below. To reset a search so that you can start again, either erase all the text in the search box, or select Edit Find from the menu again (which will also clear the entry box). When you do that, searching will start again at the top of the buffer. After you're done searching, click the small button with an X in the left of the search bar to close the search bar. You can also press Esc in the input box.
Editing a World This chapter will describe all the options found in the World Editor that let you customize the behaviour of KildClient. Only general options will be described here, some sections of the World Editor, that allow you to configure features dealing with automation (such as triggers, aliases, hooks, etc.) will be described in other chapters, along with an explanation of that feature. To access the World Editor for the currently open World, use the World Edit menu. It is also possible to edit Worlds from the World Selector dialog, just click once in the World from the list and press Edit. There are several groups of options in that dialog. The following sections will describe each one in turn. General The figure below shows the General section of the World Editor:
The General section of the World Editor The General section of the World Editor.
The first section, Connection, contains parameters that specify how to connect to the MUD: Name: this specifies the name that will be shown in the World Selector, and also in the tab in the main window. It can be anything you want, that helps you identify the MUD. Host: the host to connect to. It can be entered either as a name or as a numeric IP. Port: the port to connect to. Use SSL: if this is checked, the communication with the MUD will be encrypted and thus immune to casual eavesdropping. However, the MUD server must support this, if you try to connect using SSL to a server that does not understand it, the connection will fail. Note: you might not see this option. If it is not present, that means that you version of KildClient has been compiled without SSL support. Note: although the connection will be encrypted if the connection uses SSL, KildClient does not attempt any kind of certificate verification, so you must not assume that the connection is authenticated. You can, however, see some information on the certificate in the Statistics dialog (see ). The second second, Proxy allows you to specify a proxy server to use when connecting to the MUD. By default, Worlds use the global proxy settings configured in the Preferences dialog (see ). But you can override the default settings for individual worlds. Select No proxy if there is a default proxy setting but you want this world to connect directly to the MUD server. Or select SOCKS4 or SOCKS5 to specify a proxy server. In this case, provide the proxy server hostname or IP address and the port to connect to. If the proxy requires authentication, supply the credentials in the Username and Password fields. The third section, Auto-login, contains the parameters that you need to configure if you want KildClient to login automatically to the MUD for you. You can associate several characters with a World, and then when you can select which character you use to login to the MUD, as explained in . First, select how the login will be made in Connection Style. If this is set to "No auto-login", no attempt will be made to login automatically. This is the default. There are two other options: "Diku", for Diku-based mud servers, which prompt you for the character name and then the password; and "lp" for lp-based mud servers, in which you have to type connect followed by the character name and password. If neither of these options apply to your MUD, you should disable auto-login here, but you can still use a hook to send commands just after you connect. See . Next follows a list of all the characters that you have defined. Each character is associated with a password, however the password is not displayed for security reasons. To add a new character, press Add and enter the character's name and password in the window that appears, then press OK. The new character will be added to the list. To edit an existing character, select it and press the Edit button. To remove a character information, select it and press Delete. Finally, to control the order that the characters are displayed, use the Up and Down buttons. Note that the first character is considered the default and is the one used if you connect using the main entry for that World.
Display settings The Display category controls several aspects of the appearance of KildClient. It is divided in sub-categories, which will be described in the following sections. Main Window The figure below shows the Main Window section of the World Editor:
The Main Window section of the World Editor The Main Window section of the World Editor.
This section allows you to configure the main window where the MUD text is shown. You can set the font that is used for the text that is sent by the MUD. Click on the button with the name of the font to pop-up a dialog from where you can select another font. The change in the font is applied immediately when a new font is selected. Still with regard to fonds, another option that can be configured in this section is whether to use bold fonts or not to represent text that has the "bold" or "highlight" attribute set. By default, this text is rendered in a lighter color and with a boldface, but you can disable the use of a bold font from this dialog. You can also change the colors used for the highlighted text, see . You can also configure whether to use word wrap or not. If this option is not set, lines will be broken when they do not fit the window, even in the middle of a word. When this option is set, lines will be wrapped between words, so that a word is not broken. Regardless of that setting, you can indent wrapped lines by some amount. Just specify how many pixels to indent the lines, or leave the value as 0 not to indent them. By default, lines are wrapped when they do not fit the window. This is the behavior when Wrap lines at full screen width is selected. But it is also possible to wrap lines after a specific number of characters, even if the window is wider than that. To do that, select Maximum line width in characters and enter the maximum number of characters in each line. The next group configures whether tooltips with the time when a line was received are displayed are enabled or not. If they are enabled, when you leave the mouse for some time over a line an information window is displayed with the time when the line was received.
Colors The figure below shows the Colors section of the World Editor:
The Colors section of the World Editor The Colors section of the World Editor.
In this section you can configure the colors that will be used by KildClient. The ANSI standard defines eight colors, both in the "normal" state and in the "bold" state. These "bold" colors are by default shown with lighter colors, and, optionally, with a bold font also (see ). Additionally, there are "default" colors for the foreground and background, when no specific color is set. You can tweak the colors so that they look better in your screen, or redefine them completely. To do that, click in the button with the color, and a dialog will be shown for you to change the color. The changes are applied immediately when a new color is chosen. Should you want to revert all colors to their built-in preset values, use the Revert to default colors button.
Status Bar The figure below shows the Status Bar section of the World Editor:
The Status Bar section of the World Editor The Status Bar section of the World Editor.
The first section allows you to change the font used in the status bar. Click the button and a dialog will appear for you to select the font. The second section controls the display of some time counter that appear in the right of the status bar. You can display the total time connected to this world and/or the idle time, that is, the time elapsed since you last sent a command to the MUD. For each time, there are three options. Do not display causes that time not to be displayed. Display as hours, minutes and seconds displays the time as something like 2h45m30s, while Display as seconds would display that previous time as 9930s. The behavior of the idle time counter can also be configured with the Only reset idle time counter when a command is entered checkbox. When the checkbox is unchecked (which is the default), that time is reset whenever a command is sent to the world, no matter if this command was typed, if it ran because of a trigger, a timer, etc. When checked, the timer will only be reset when you enter something in the command entry box and press ENTER. Automatically sent commands will not cause the counter to be reset.
Input The figure below shows the Input section of the World Editor:
The Input section of the World Editor The Input section of the World Editor.
The first section, Command Entry, controls the behaviour of the command entry textbox: Keep last typed command in command entry box, causes the entry box not to be cleared when you press ENTER. The command you have just sent will be kept and can be repeated just by pressing ENTER again. It will be selected, so you can start typing another command to erase it. Echo sent commands in terminal window controls whether the commands that are sent to the MUD are also echoed to the MUD window. Store commands between sessions controls whether the commands you type are saved when you quit and restored when you load the world again. Never hide typed text is useful with a few servers that intend to do the command echoing themselves. The sympton is that all the text typed is displayed as black dots (as if it was a password). If this happens to you, enable this option and the text will be visible. Number of commands to save in history specifies the number of commands that are saved and can be recalled with the arrow keys, with the button to the right of the entry box, or with command completion. If this is set to too high a number, KildClient will consume more memory. Command separator allows you to configure the token used to separate commands. By default it is %;. Use single-line input bar and Use multi-line input bar define the size of the input bar. If set to single-line, it will have only one line, and if you type more text than fits the width, the text will scroll horizontally. If, however, you select a multi-line input bar, the bar will have two or more lines, and text will wrap and be displayed in the next line. (Scroll-bars may be displayed if there is more text than fits.) If set to multi-line, you can specify how many lines to reserve for the input bar, from two to ten. Enable auto-completion controls whether the auto-completion feature (see ) is enabled or not. However, auto-completion only works for single line input bars. When auto-completion is enabled, you can specify after how many characters have been typed it will be activated. Just enter the number in the text box Activate auto-completion only after X characters have been entered. Spell check typed text, if checked, enables the built-in spell checker. This spell checker works only with the multi-line input bar. If it is active, misspelled words are highlighted with a red line below them. Right-clicking on them pops up a menu with spelling suggestions. By default, the language used for spell checking is based on your current locale. If you want to set a specific language, enter its language code (as recognized by the aspell backend) in the box. Note that for spelling to work you need the gtkspell library. Your version might have been compiled without spelling support. The Font section allows you to configure the font that is used in the command entry box. Click the button and a dialog will appear for you to select the font. The Flood Prevention feature is also configured in this section. This feature is useful in MUDs that disconnect you if you type 20 equal commands in a row, or something like that. When you enable this feature, KildClient will count the number of repeated commands you send. When you try to send the same command for the 20th time, KildClient will send another command you specify before, thus breaking the chain of repeated commands. To use this feature, make enable the check box Do not allow the same command to be sent X times in a row. Change X for the number of equal commands that will disconnect you. The Send this command textbox specifies the command that will be sent to prevent too many equal commands to be seen by the MUD. It should be set to a harmless command, because it might be sent anytime.
Logging A useful feature of KildClient is it hability to log all the output from the MUD, as shown in the screen, so that you can retrieve it later. The output is saved in a file you specify. ANSI color codes are not saved, but otherwise the output is identical. It is possible to prefix each line with a timestamp, so you can see when each line was received. You can specify the format of this timestamp. The figure below shows the Logging section of the World Editor:
The Logging section of the World Editor The Logging section of the World Editor.
In the top, you will see if logging is currently enabled or disabled, and you can quickly start or stop it with the two buttons. When you start logging, you can include some of the lines that have already been received and are in the scrollback buffer displayed in the main window. If you want to do that, just select the corresponding check box and enter the number of lines to save. Next you specify the name of the file to store the log. New log lines are appended to that file, so it is safe so specify an existing file. It is possible to have the log file named automatically based on the date and time that logging is started. For example, if the file name is "log_%m_%d.txt" the file name will include the month and day, for example for November 25th the file will be "log_11_25.txt". This is done replacing escape sequences beginning with the % character for the values depending on the date and time. The valid escape sequences are those of the strftime() function, and can be found here. Similarly, you can use %Kw in the file name and it will be replaced by the name of the World. And the string %Kc is replaced by the name of the character used in auto-login (see ). (If auto-login was not used, then %Kc is replaced by an empty string.) If Automatically start logging when connected is selected, then all your mud sessions will be logged automatically. It is possible to prefix each line written in the log file with the date and time it was received. To do that, select Prefix lines with date and/or time, and specify the format of the date and time. This is also a string with % escape sequences like the file name. The default includes the full date and time.
Automation This section allows you to configure the features that make your MUD playing experience easier, faster and more efficient. You can define triggers, aliases, hooks, etc. here. These sections of the World Editor will be described elsewhere, along with a description of the features. Here we will deal with another section that is more generic. Scripting The figure below shows the Scripting section of the World Editor:
The Scripting section of the World Editor The Scripting section of the World Editor.
There is only one parameter to be configured in this section: Perl file to load. It allows you to specify a file that will be read by the Perl interpreter when the World is loaded. This file can contain sub-routine definitions that will be available for you to use in your triggers, aliases etc., or to be called directly. For more details, see . Enter the path to the file in the textbox, or click the button next to it to open a dialog from which you can select a file.
Protocols The figure below shows the Protocols section of the World Editor:
The Protocols section of the World Editor The Protocols section of the World Editor.
Here you can configure how KildClient uses some protocols to enhance the player's experience while playing the MUD. Currenly you can configure how KildClient behaves with regard to the MCCP protocol, which compresses data sent by the MUD so that less data needs to be sent. By default, KildClient will use this protocol if the server proposes it, but only if this proposal comes in at most one minute after the connection has been established. This is done in order to prevent bad players from trying to crash your client by sending the special sequence that enables compression. Note, however, that well-written servers prevent the user from sending such sequences to other users. However, as compression is generally negotiated just after connecting, leaving this option in its default state, Enable if server proposes after connecting is recommended. If Enable if server proposes at any time is selected, MCCP will be started whenever the start sequence is received, no matter at what time. Finally, you can disable MCCP altogether by selecting Disable. This way sequences asking for compression will be ignored, and the server will never send compressed data. Attempts by malicious players will not succeed.
Miscellaneous The figure below shows the Miscellaneous section of the World Editor:
The Miscellaneous section of the World Editor The Miscellaneous section of the World Editor.
The first category, Scrolling, which controls the behavious of the scrollback buffer. Scroll on output, when checked, will cause the buffer to always scroll the end when new text is received, thus displaying it immediately. If not checked, the buffer is only scrolled if you are at the end. Lines to save in scrollback buffer determines how many lines of output will be saved in the buffer for you to see again. Note that KildClient will get slower and will consume more memory if you set this to too high a number. The second category, Name display, controls how this world is identified in the tabs and in the window title. By default, only its name is used. But you can also display the name of the character logged in (provided auto logon was used, see section ). If none of the options suit you, you can define your own. Use %Kw to represent the world name and %Kc to represent the character.
Advanced The figure below shows the Advanced section of the World Editor:
The Advanced section of the World Editor The Advanced section of the World Editor.
In most cases, you will not need to change any of the settings of this section. The File text box specifies the file where the World is saved. It is not necessary to enter anything here, a file name will be generated automatically if you leave it blank. If you enter a file name, it will override the default name. This means that you can create a copy of a World by editing it, giving a new file name, and then saving. Note, however, that for the World to be recognized and listed in the World Selector, it must have the .wrl extension, and must be in the directory where KildClient stores its files (~/.kildclient under Linux and other UNIX-like systems). Another thing that can be configured in this section is the character set used by KildClient. If you do not know what is that, then simply ignore it and do not change anything. If you do know, just select the character set that is used by the MUD from the combo box. However, keep in mind that internally KildClient works with the UTF-8 character set. The only things that are changed by the selection you can make in this section are what is output by the MUD and what is sent to the MUD. You can configure some aspects of the editors for triggers, aliases, macros, timers and hooks (all displayed in the World Editor). You disable the confirmation dialogs that appear when you try to delete a trigger, alias, macro, etc. from one of the graphical editors. If you disable the Ask for confirmation before deleting triggers, aliases, etc. there will not be a confirmation dialog and the item will be deleted immediately. Be warned that if this is unchecked and some item is deleted, you will need to create it again if you delete it by mistake. You can also show triggers and other objects defined by plugins that are currently loaded. By default they are not shown, but you can change this cheking the Show items defined by plugins checkbox. Note, however, that while having that option checked will allow you to edit, delete and reorder the items defined by plugins, these changes will not be made in the plugin file, and the next time the plugin is loaded, the items will be as they were before. You can use the editors to make changes and tests, but you will need to alter the plugin file afterwards. Another configuration option in this screen is whether the TCP Keep Alive setting is enabled for the connection established to the World. TCP Keep Alive is a feature of the TCP protocol that causes packets to be sent to keep the connection alive if no data is transferred for a period of time. By default it is disabled, but if you need this you can enable it here. The time that the connection must be idle before a Keep Alive packet is sent is set by your operating system. KildClient only enables the "Use Keep Alive" flag in the socket used for communication, but does not try to set the parameters involved in this operation. The way to set the intervals depends on the operating system. Finally, it is possible to disable the use of the up and down arrow keys to navigate between commands saved in the command history. If the box is checked, then you will need to use Alt+up and Alt+down to navigate. The arrow keys will retain their normal behaviour. This option may be necessary when using some input methods that use the arrow keys as part of the input process.
Configuring KildClient The previous Chapter described how to configure a World. Those settings are individual for each World. There are some settings, however, that apply to KildClient as a whole, which will be described in this chapter. To access those settings, use the Preferences Preferences menu. The following sections will describe the groups in the Preferences dialog. Appearance The figure below shows the Appearance section of the Preferences dialog:
The Appearance section of the Preferences dialog The Appearance section of the Preferences dialog.
In this section you configure the colors that KildClient uses for its own purposes. (The configuration of the colors that the MUD displays is explained in .) Two colors can be configured: Informative messages is the color used by KildClient to print messages about the status of the connection, such as the ones showing that a connection is being tried or has succeeded. Command echo specifies the color in which the commands you send to the World are printed in the screen (if this feature is enabled, see ). In each case, select from the drop-down list the color you want. Note that the actual color that is displayed depends on how it was configured in the World Editor (see ). How the tabs representing the open worlds are displayed is configured here. They can be at the top, bottom, left or right. Select the one you want from the combo box. You can also select whether to show tabs if there is only open open world, or hide the whole tab bar in this case. Finally, you can enable or disable the Flash window when new text is received feature. When it is enabled, if text is received in the mud while you are at another window, KildClient's window will flash to draw your attention. If disabled, you can still know that new text has been received because the titlebar will have a (*) prepended. Note, however, that the exact behaviour of this feature might depend on your Window Manager, and that some window managers do not do anything for windows with the "Urgent" flag set.
Sending The figure below shows the Sending section of the Preferences dialog:
The Sending section of the Preferences dialog The Sending section of the Preferences dialog.
In this section you configure the default paramenters used when sending several commands at once. This setting is used in the Command History () and Multi-line Send () dialogs. You specify the number of commands or lines that are sent simultaneously, and the delay between sending each group of commands/lines (containing the specified number of commands/lines, naturally). Note, however, that the values you set here are only defaults, you can change the values in the dialogs of those features if you need so.
External Programs (Linux) This section of the Preferences dialog only appears when KildClient is run in Linux. The figure below shows the External Programs section of the Preferences dialog:
The External Programs section of the Preferences dialog The External Programs section of the Preferences dialog.
In this section you can configure the command that will be run when you right-click in a URL that appears in the MUD window and select Open Link. The command will be executed, with %s replaced with the URL's address. The ampersand (&) in the end means that the command is to be executed in the background, so that you can continue using KildClient while browsing the URL. You can also set a command used to play audio files (see ). Enter the command, with %s in the place of the file path. The default should work (it uses the SOX program, which is usually installed), but you can use other commands if you use ALSA, ARTS, ESD, JACK, etc.
Proxy The figure below shows the Proxy section of the Preferences dialog:
The Proxy section of the Preferences dialog The Proxy section of the Preferences dialog.
In this section you configure the default proxy settings that will apply to Worls that are configured to use the global proxy configuration. It is possible for individual worlds to override the settings configured here, see . The default setting is No proxy, which means connect directly to the MUD's host. Alternatively, you can use a SOCKS4 or SOCKS5 server. You must provide the proxy server hostname or IP address and the port to connect to. If the proxy requires authentication, supply the credentials in the Username and Password fields.
Menu Reference This chapter will describe all the menus and their commands in KildClient. World menu Open This menu command opens the World Selector dialog for you to connect to a World, either a saved one or a new one. You can also edit the saved worlds from the World Selector dialog. See for more information on opening Worlds. Reconnect If you are not connected to a World, but have it still open (in offline mode), use this menu to connect again to the World. If you are connected, this command closes the current connection and reopens it. Disconnect This command closes the connection to the World. Note that this is not the recommended way to exit from a MUD, you should use the proper command (generally quit). Connect to Another This command opens the World Selector (see ) for you to connect to another World using the same tab. If you are still connected to a World, the connection will be closed. Close This command closes the connection to the World (if it is open) and closes the current tab. If this is the only tab, the program is exited. Edit This command brings up the World Editor for you to configure the World. See . Save This command saves any changes made to the World to the disk so that they are made permanent. Note that whenever a World is closed, it is automatically saved before. Statistics This command opens a dialog showing some information and statistics about the currently open World. If the version you are running supports SSL and you are connected using SSL (see ), some information about the SSL session and the certificate are displayed. Previous and Next These two commands allow you to navigate between the open Worlds, going to the next or previous tabs, repectively. Quit This command exits KildClient, closing any open Worlds. If an open world has "OnCloseConnected" hooks (see ), they are executed. If there is at least one open world without such hook, you are asked for confirmation first. Edit Menu Cut This command copies the text selected in the command entry box to the clipboard and deletes the selected text. Copy This command copies text either from the MUD (that is, in the output window) or from the command entry box to the clipboard. If there is text selected in the main window, than this text is copied. Otherwise, if there is text selected in the command entry box, it is this text that is copied. Paste This command pastes the text in the clipboard to the command entry box, possibly overwriting any selected text. Delete This command deletes the text selected in the command entry box. Find and Find Next These commands are used to search for some text in the output buffer. Their use is described in . Input Menu Clear This command clears the command entry box. The same can be achieved by using the button to the left of the command entry box. Previous and Next These commands retrieve the previous or next command in the history, putting them in the command input box. They are equivalent of pressing Alt+Up or Alt+Down (or just the arrows, in some circunstances). Find Previous and Find Next These commands search the command history for a command that starts with the text that is in the input bar. To use that feature, enter the first characters of the command you want to retrieve and select Find Previous. You can navigate through other commands starting with that prefix with these menu entries. Command History This command allows you to review the commands that have been sent recently, and send one or more commands again. When you select the menu item, a dialog like this appears:
Command History Dialog The Command History Dialog.
The list on the left shows the commands which are saved. You can configure how many commands are saved, see . To send again commands to the World, select the commands you would like to send and press Send. Since most MUDs cannot handle too much user input at once and disconnect you in this case, you can add a delay after each sent command, so that the commands are not sent all at once, but with pauses. You can specify the delay and also how many commands are sent at one time. The delay is added after each group of sent commands. You can also press Send & Close to send the selected commands and close the dialog afterwards. You can also put a command in the command entry box to edit it. To do so, select a command (in this case you must select only one) and press Recall. If you press Recall & Close instead, the command is recalled and the dialog is closed. To search for commands containing a given string, used the Find and Find Next buttons. Use the former one to start a search, and the later to find more commands with the string. To start another search, use Find again.
Multi-line Send This command allows you to send several lines of output and/or a file to the World. When you select the menu item, a dialog like this appears:
Multi-Line Send The Multi-Line Send Dialog.
You can send a file to the World, and you can also send text before and after the file if you need. Naturally, you can also send only some text without sending a file. Just leave the fields you don't need blank. It is also possible to prefix all the lines with a string (such as chat), or to add a string to the end of all lines. If you want that, fill in the appropriate fields, if not, just leave them blank. Most MUDs cannot handle too much user input at once and disconnect you in this case. To avoid that, you can add a delay after each sent lines, so that the text is not sent all at once, but with pauses. You can specify the delay and also how many lines are sent at one time. The delay is added after each group of sent lines. If you select "Keep dialog open after sending", the dialog will not be closed after the text starts to be sent, so you can make further changes to the text.
Test Triggers This command brings up the Test Triggers window, which is described in .
Preferences Menu Disable Triggers, Aliases, Macros or Timers If each of these menu entries is checked, then the corresponding automation feature is disabled: lines are not matched against triggers, aliases do not replace typed commands, macros and timers do not run. Use them if you want to temporarily disable all of them, since the triggers, aliases, macros or timers are not deleted. Debug Matches If this entry is selected, whenever a trigger or alias matches, information is printed about it. The information is printed on stdout, which means you must start KildClient from a terminal. Preferences This command opens a dialog where you can configure some aspects of KildClient global to all Worlds. See . Edit Default World This command opens a dialog where you can set some default parameters used for Worlds. For example, you can define your preferred font or colors, and all new Worlds will use these default font and colors. The things that can be set are described in , but not all things described there can be set as default parameters. (There's no sense in having a default World name, for example.) Diplay Menu Split screen This option toggles displaying or hiding another window with the output from the world, so that you can see both the text as it is received and some other part of the scrollback buffer. See . Help Menu Help This commands opens a browser showing the KildClient manual (which you are reading now). About This commands shows a window with some information about the program.
Using Perl in KildClient This chapter will describe briefly how to use Perl (Practical Extration and Report Language, or, according to some, Pathologically Eclectic Rubbish Lister) in KildClient. Even though it will give a few examples of things that would certainly be known already by people who know Perl, this Chapter is not meant to be a Perl tutorial. If you want to learn Perl from the start, you should read its man pages, find a tutorial or a good book on the subject (there are plenty of these). Some knowledge of Perl will certainly help in understanding this Chapter. The Basics KildClient has a built-in Perl interpreter. To run a perl statement, just type if preceded by a slash (/) in the command entry box. The statement will be executed by the Perl interpreter instead of being sent to the MUD. The statement can be anything that Perl will accept. You can actually execute several Perl statements if you separate them with ; (no need to add / again, just once in the beginning of the line). You can call sub-routines, execute conditional or loop constructions, call a built-in function, do variable assignments, or even define a sub-routine. However, the statement must be complete. You cannot enter something like /$myVar = and then enter /"some_value";, the statement must be complete in one line. Technically, each line you enter is executed inside an eval block, so anything you want executed must be valid code inside an eval block. All built-in Perl functions are accessible for you to use, and you can load Perl modules and use their functionality. However, that is not enough, because Perl's built-in functions will not allow you to interact with the World. Because of that, KildClient defines a set of functions that you can use to interact with the World. A full list describing them detailedly is found in , but some of the most useful ones will be described in this Chapter. Many of these functions deal with creating and editing triggers, gags, aliases etc. These will be described in the corresponding chapters. It is possible to get help on all functions using the help function. It takes as argument the name of the function. Note that since help is nothing else than another Perl function, the name of the function for which you want help is just an argument to it, and must be passed as a string. That is, to get help on the echo function, type /help "echo". (Naturally, you can enclose "echo" in parenthesis, but this is not necessary.) Some functions are in a way global, that is, they do not refer to a specific world. One such example is colorize (see ), which inserts ANSI color codes in strings (useful when you want to print something in the screen). These are called like any built-in Perl function. For example, if you enter /$colorstr = colorize("&WI'm in white!"), the variable $colorstr will hold a string that would be printed in white. Many functions, however, are specific to a World, such as echo (see ), which prints something in the World window (but does not send it to the World). Because of that, they are called in a slightly different way. To print that string which has just been created, you would enter /$world->echo($colorstr). Those that know Perl will recognized this as a method call of the $world instance. Indeed, $world is an instance of the class World class. This class defines several functions that allow interaction with a World. On start-up, the $world variable is created and references the current World. It is also possible to control other worlds, if you have a variable pointing at them. You can get such a variable with the getworld function (see ). In that case, you should use the variable you got instead of $world. If all the above did not make sense to you, do not worry. Just remember that many functions have to be called by adding $world-> to the front. These functions will always be listed with that in front. When a World is opened, the Perl interpreter reads and executes a file you specify. (See for information on how to specify the file.) In this file, you can define sub-routines and variables. They will be then available for you to use during your session. If you define a sub-routine called sendGreetings, you can type /sendGreetings and the sub-routine will be executed. Or, if you define a variable, you can use it anywhere. It should be noted that each World has its own Perl interpreter, with its functions and variables. What you do in one World does not affect the others. Echoing and Sending Text As mentioned in the previous section, the $world->echo function is used to print (or echo) text to the MUD window, without sending it to the World. It works like the print built-in function: it accepts any number of arguments, and echoes all of them, sequentially. For example, $world->echo("Variable var contains ", $var, ".\n") would print the first string, followed by the contents of $var, followed by a period and a new line. Of course, you could do all that in a single string using variable interpolation. A variant of $world->echo is $world->echonl. The difference is that $world->echonl always prints automatically a newline after each argument. This is just a shorthand to make some things simpler and possibly more readable. Similar to $world->echo is the $world->send function. This function sends something to the MUD. For example, $world->send("who") will have the same effect as if you had typed who in the command entry box and pressed ENTER. Note that you do not have to add a newline to the end of the line to send, because send automatically sends a newline after each argument (since commands must be terminated by a newline for the MUD to recognize them). It is possible to pass several arguments to send. If you do so, each argument will be sent as a separate command. For example, $world->send("who", "look") will first send a who to the MUD, and then a look, just as if you had typed each of these commands in order. All the examples given above did nothing that could not be done without Perl, and using send for that was actually less efficient that typing the commands directly. However, when combined with variables and/or control flow structures, send can actually be quite useful. Paths and Speed-Walking A useful feature of some MUD clients, which KildClient implements, is the support for speed-walking. This feature allows you to define paths to go directly from one place to another without having to type a lot of movement commands. For example, suppose that to go to some place from a fixed point (such as the center of a town) you need to take the following directions: s s s e e s e e e e n nw n. This is often written in a more compact way as 3s 2e s 4e n nw n. KildClient allows you to send to the MUD all the 13 required commands in a single command. To do that, use the $world->path function. For example, if you enter /$world->path("3s2es4en{nw}n") in the command line, 13 commands will be sent to the MUD: exactly the 13 that form the path defined above. Note the syntax: the movement commands are defined one after another, optionally prefixed by a number, which determines how many times that command will be sent. So 3s means send s three times. If there is no number, the command is sent only once. Note also that the command to move to the north-west is enclosed in braces: {nw}. This is because if the $world->path function sees nw, it will think you want to move to the north than to the west. Enclosing it in braces causes $world->path to see that as a single command. Should you need to move several times to the northwest, you can add a number before: 4{nw} will send nw four times. Naturally, you can include any command that is not a single letter in braces to force $world->path to see it as a command. It is likely that some paths will need something like {open door} in the middle. Of course, simply entering paths in the command line is not that useful. But you can store the path in a variable, and then just call $world->path($stored_path). Just add a line that defines the variable to you script file (see ), and you will be able to use the variabled anywhere. Alternatively, you can define an alias (see ) or a macro (see ) to execute your path even faster. The easypath plugin does that, see section . Playing Sounds To play a sound (for example, as the action of a trigger, to call your attention), use the play function. Pass it the path to the sound file, for example: /play("/home/joe/sounds/beep.wav"). Under Windows, this function supports playing WAV files. Under Linux, you must set-up a command to play sounds, see . Saving Variables Permanently You can define variables for use in your Perl scripts. Since KildClient has a full-featured Perl interpreter, you can use all kinds of variables Perl supports (scalars, arrays, hashes, and even references to build complex data structures), and you use them just like you would in Perl. However, when you close the World, the variables and their values are lost. However, it is often desirable to keep the values of variables across sessions, and KildClient has a mechanism for that. A variable can be made permanent. All variables that are marked as permanent will be saved when you close the World, and will be reloaded from the saved values when the World is opened again later. This way, their values are saved across sessions. To make a variable permanent, open the World Editor (see ) and select the Variables section inside Automation. There you will see a list of the variables that are set to be permanent:
Permanent Variables Permanent Variables.
To add a variable, click the Add button. A window will open for you to enter the name of the variable. To make one or more variables temporary again, select them and press Delete. They will be removed from the list. Finally, if you mispell the name of a variable, select it and press Edit to correct it. You can also change the order of the variables with the Up and Down buttons. This is usefor for grouping similar variables together, but does not otherwise affect the saving of the variables. Permanent Variables in the Command Line It is possible to make a variable permanent from the command line. To do that, use the $world->makepermanent function, passing the name of the variable as the argument. Note that since you must pass the name of the variable, you must use quotes, and preferably single quotes so that the variable does not get interpolated. For example, to make the variable $kill_count permanent, run $world->makepermanent('$kill_count'). Now when you close the World, the value of $kill_count will be saved, and when you reopen it later, the value will be restored. It is possible to make more than one variable permanent at one time, just pass all their names as arguments to $world->makepermanent. If you want a variable to stop being permanent (that is, to become temporary again), use the $world->maketemporary function. It is called just like makepermanent, and has the opposite effect. To get a list of the variables that are currently permanent, use the function $world->listpermanent. This function has no arguments, and prints all the names of the variables that are permanent.
Controlling Worlds with Perl In it was explained that you can disconnect from a World with the $world->dc function. It now should be clear why there is a $world-> in front. Another function that you know already is $world->close, to disconnect and close a World. There are a few more functions that allow you to control Worlds from Perl. The $world->next and $world->prev move to the next or previous world in the list of tabs. It is also possible to pass an argument to them, specifying how many Worlds to move. So, $world->next(2) moves two Worlds forward, and $world->prev(3) moves three Worlds back. To go to a specific World, use the gotow function (which does not belong to the World class, since it does not depend on a particular World), passing as argument a string with the name of the World. Finally, you can use the quit function to disconnect and close all Worlds and then exit KildClient.
Triggers Triggers allow you to react automatically to text that comes from the MUD. This reaction can be of two forms: sending something to the MUD in reply, or doing something else with no direct interaction with the MUD, such as printing something in the screen. Sometimes the action of a trigger is to change the line that was received and that activated the trigger. You might want to match all lines that contain a certain word (such as your character's name) and print these lines (or part of these lines) in a different color to draw attention. (This feature is sometimes called highlighting.) Additionaly, sometimes you might want to omit some lines, such as everything said by some annoying player, or some messages that are not relevant for you. This kind of trigger is often called a gag. Both these features are supported by KildClient. Triggers are defined by specifying a pattern against which all lines received from the MUD are matched. If there is indeed a match, an action specified by you is executed. If the trigger is a gag, then the line that matched will not be printed in the screen, otherwise it is printed normally. (Note that printing actually happens before the action is executed, even if here things were described in another order for ease of understanding.) The above description was very brief and was meant just to give a basic idea of how triggers work. Next follows a more detailed explanation of all aspects involving triggers. Creating and Editing Triggers The easiest way to create and alter triggers is from the World Editor, the place where all settings of a World are altered (see ). Trigger are defined in the Triggers section inside the Automation section. When you open that section, you'll see a list of the defined triggers and some buttons like this:
The graphical Trigger editor The graphical Trigger editor.
The main part of the window is the list of defined triggers. The columns are as follows: Enabled specifies whether the trigger is enabled or not. Triggers that are not enabled are not active and will not be tried when a line is received, but they remain in the list so that they can later be enabled again. Name is a name that is assigned to a trigger. This helps you identify the trigger's purpose and is useful when editing a trigger via the command line (as described in ). Assigning a name to a trigger is optional. Pattern and Action are the parameters for the trigger, and they define the trigger's action, as described above. I Case (for "Ignore Case"), if set, means the case is not considered while matching the pattern, that is, a case-insensitive match is done. Gag defines if the line that matches the trigger will be printed. If this is active, the line is gaged (omitted) from the main screen. Gag Log defines if the line that matches the trigger will be written to the log file. If this is active, the line is gaged (omitted) from the log file, if logging is enabled (see ). Keep Exec defines what happens when the trigger is matched. By default, if a trigger matches further matching of that line against other triggers is stopped. If, however, this option is active and the trigger matches, the line continues being tried against other triggers. Rewriter defines if the trigger is a rewriter trigger, a special kind of trigger described in . Plugin: if this is non-empty, it means that the trigger belongs to a plugin (and the name of the plugin is displayed). However, by default plugin triggers are not displayed. See for information on how to display plugin triggers here. Adding Triggers To add a new trigger, press the Add button. This will open a window for you to edit the new trigger's parameters:
The window to edit triggers The window to edit triggers.
What can be set represents the columns described above. When you are finished, press OK and the trigger will be added. If you change your mind, press Cancel and the trigger will not be added. The next sections will describe some things that can be done with triggers.
Editing Triggers To edit a trigger, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding trigger (see ) will be opened, filled with the trigger's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the trigger will remain as it was before. Another shorter way to edit a trigger is to double click its line in the list. It is also possible to change the value of the boolean options (those represented by a check box) directly from the trigger list. Make sure that the trigger you want to change is selected, and click in the check button. The state will be toggled. To delete a trigger, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the trigger. If you want, you can disable this confirmation dialog (see ), but if you do so and click the Delete button, the only way to undo your action will be creating the trigger again. To delete several triggers at once, select them all and press Delete. The final thing that needs to be explained with regard to triggers is how to reorder them. Triggers as tried from the first one to the last, so in a few cases the order might matter. To move a trigger up or down in the list, select it and press the corresponding button.
Basic Triggers The simplest kind of trigger specifies only a pattern and an action. Below these parameters are described in detail. What exactly is pattern? It is a regular expression. In short, a regular expression is a way to specify text patterns that are looked for in the lines that the server sends. If you know Perl, you certainly know what is a regular expression. If not, it is advised that you look for some more information on it, there are plenty of tutorials on the Internet. For those who know them, you can use the full power of Perl's regular expressions in triggers, because Perl is used for the matching. What about the action? It can be anything that could be entered in the command line. It can be a simple command, that is sent to the MUD. Or you can send several commands at separating them with %; as described in . Finally, you can execute some Perl code when a trigger matches, and this allows you to do virtually anything you want. Below is an example of a very simple trigger. To create this trigger, inform the Pattern and Action parameters shown below. Leave the other parameters in their default values. A very simple trigger Pattern: has attacked you! Action: wield sword Whenever a line that contains the phrase "has attacked you!" is received, the command "wield sword" will be automatically be sent. Note that in this case the received line will probably be something like "An orc has attacked you!", but the trigger matches because that line contains the pattern. This is a feature of regular expressions. If you want to match the entire line and not only part of it, you must use the ^ and $ anchors in the beginning and end, respectively. By default, case is considered when matching: if the server sent a line saying "Has Attacked" then there would be no match. To make case be ignored when matching, check the Ignore case when matching option. It is also possible for the action to be executed to depend on what was received from the server. This is better explained by an example: A trigger which captures part of the received line and uses it in the action Pattern: ^(.*) has attacked you!$ Action: cast missile $1 There are two new things in the pattern. The first one is that is surrounded by ^ and $ which means that the entire line must match, as described previously. The other new thing (and the one that concerns us at this moment) is the (.*) part. In regular expressions, the dot means to match any character. The asterisk means zero or more of the previous element. So the combination .* means zero or more of any characters. Essentially, it matches anything. The brackets () around any part of a regular expression captures part of the string to be used afterwards. So the whole regular expression means: look for a line that contains something followed by has attacked you!. What comes before has attacked you! is stored for later use. This stored string is then used in the action by means of the $1 construct. This special placeholder is substituted by what was captured in the matched string. So if the line Orc has attacked you! is received, cast missile Orc is send. If Smaug has attacked you! is received, then cast missile Smaug is sent to the World, and so on. It is possible to have more than one captured string in the pattern. In this case, $1 is replaced by what was captured in the first group, $2 by the second group, and so on. Sending commands to the World is useful, but the real power is the fact that you can also run Perl commands in response to triggers. Just enter them as you would in the command box: prefixed by /. If the action is simple you can enter the statements there directly, if not, you can define a function in your script file and call it from the trigger. Let us rewrite to use Perl in the action: A trigger with an action in Perl Pattern: ^(.*) has attacked you!$ Action: /$world->send("cast missile $_[1]") This time, when a line consisting of some arbitrary text followed by "has attacked you!" is received, the $world->send will be called to send some text to the World. You may have noticed that here $_[1] was used instead of $1 in the action to represent the first captured bracketed group. The reason for this is complex, and if you do not want to worry about the inner workings, just use the following rule: in commands sent to the mud, use $1, $2, etc., and in actions that are Perl commands, use $_[1], $_[2] and so on. Here are the details for the different syntaxes. Feel free to skip the next two paragraphs: When a trigger matches, KildClient substitutes $1 (and the other placeholders) by the captured expressions from the received line. However, $_[1] (and the other similar tokens) are not replaced by KildClient. If the action is just a string sent to the mud, they would not be replaced, so the only possibility to use the captured groups is with the $1 syntax. But Perl commands can access the captured groups in another way: the strings are stored in the @_ array. The first position, $_[0] contains the whole matched line. Subsequent positions contain each matched grouped expression, so $_[1] is the first bracketed substring, $_[2] is the second, and so on. This way, when a Perl command is executed the values are replaced by the Perl interpreter itself. It is also possible to use $1 in commands to be passed to the Perl interpreter. Most of the time it will work, but in some specific circumstances you may get unexpected results. So it's preferable to let Perl do the substitution when commands are to be run by the Perl interpreter. If you call a sub-routine as the trigger action, the matched arguments are not automatically passed, so you need to pass them manually. Since they are in the array @_, just pass that whole array as the argument to the sub-routine. Inside the sub-routine, they will be available as the sub-routine's arguments, which incidentally means that they will be accessed in the exact same way: with $_[1], $_[2] and so on. Alternatively, you can only pass the parameters that you need instead of the whole array. Here's an example of a trigger that calls a sub-routine: A trigger that calls a sub-routine Pattern: ^(.*) has attacked you!$ Action: /myGreatAttackSequence(@_) Naturally, you need to define the myGreatAttackSequence sub-routine in your script file. It will be called as the result of the trigger. The @_ array, containing the whole matched line and the matched bracketed expressions is passed to the sub-routine as argument, and its contents will be available to the sub-routine as its parameters. Changing the Style of the Matched Text It is possible to cause a trigger to change the style of the line that matched (or of a part of it). This can be used, for example, to make some text that interests you stand out. To do that, enable the Change Style check box in the Edit Trigger dialog (see ). The Configure button then allows you to set the style to be applied. When pressed, it brings up a window like this:
The window to configure style The window to configure the style to be applied.
First you should select what is going to have the style changed. The style can be applied to the whole line that matched against the trigger, to the part of the line that matched the trigger pattern, or the the part of the line that was captured by one of the parentheses in the pattern (if they are used, naturally). Next you can configure the style to be applied. You can change the color of the text, and apply or remove italics, strike-thru and underlining. In all these options, the default is "Do not change", which means that the trigger does not affect the style as sent by the MUD. If you select some option, then your selection will override the style that the MUD sends.
Gags Now that the basic usage of triggers has been explained, let us see some more advanced features. In KildClient, gags are just a special kind of trigger with the "gag" flag activated, and they behave just like other triggers, with the exception that the line that matched the pattern does not get printed in the screen. It is possible to have a gag that executes an action when triggered, just like with non-gag triggers, or it can be a simple gag, which prevents the line from being printed but does nothing else. To specify that a trigger is a gag when it is created, just check the Omit (gag) from output checkbox when creating the trigger. Let's create a simple gag to omit all that is said by Joe, a very silly and annoying player: A simple gag Pattern: ^Joe chats Action: /$world->echonl("Joe said something silly here.") Omit (gag) from output: Checked This trigger is a gag, and whenever a line starting with "Joe chats" is received, it will not be printed. Instead, the code specified in the action will be executed, and that code will print a message that tells you that Joe said something, but does not tell what, so you do not need to worry. That is good, but can get even better. We do not need to know that Joe said something, it would be better if we could ignore him altogether. And we can. It is not necessary to specify an action for a gag trigger. In this case, nothing will be done, but the matched line will not be printed. So our example becomes: A gag with no action Pattern: ^Joe chats Omit (gag) from output: Checked The action has simply been omitted, but the check box that specifies that we are creating a gag trigger remains, naturally. Sometimes you want to change the way a line is displayed, such as rearranging the information so that it appears in another way. The way to do that is with a gag, and an action that outputs the modified line. Heres a simple example that changes the way a hypothetical chat channel is displayed: Rewriting a line with gags Pattern: ^(.*) chats, '(.*)' Action: /$world->echonl("[Chat] $_[1]: $_[2]") Omit (gag) from output: Checked The Omit (gag) from output check box only controls whether the line is displayed in the screen or not. If you have logging enabled (see ), a the line that matched a trigger with that option checked will be written in the log file normally. If you want the line to be omitted from the log file, you must set also the Omit (gag) from log file check box. If it is set, then the line will not be written to the log file. Note that the two attributes are independent: you can gag the line from the screen, from the log file, from both or from neither. Other trigger features By default, when a trigger matches, no more checking is done. So if a line would match two or more triggers, only the first would have a successful match and have its action executed. The other ones wouldn't even have a chance to try a match. If you check the Keep executing triggers after this one matches option, then even if this triggers matches it does not prevent other triggers from being tried. So, if a second trigger matches, the actions of both will be executed. Note, however, that unless this second trigger also has the same option checked, trigger matching will stop at that second trigger. If you are having trouble with triggers and want to be informed whenver a trigger matches, enable the Preferences Debug Matches menu. When this is enabled, information about each matched trigger will be printed to stderr. (This means you must start KildClient from a terminal to see the output.) Rewriter Triggers Rewriter triggers are a special kind of trigger that allows something not possible with ordinary triggers: changing the received line so that futher triggers work on this changed line. As mentioned above, the $colorline variable holds the entire line that matched the trigger, including ANSI color codes. Rewriter triggers can alter this variable, and then the other triggers will match on this changed line. Rewriter triggers run before normal triggers. Also, the Keep executing option (see ) is not considered for them: they never stop processing of other triggers, even if that option is not set. The gag options are also not significant for a rewriter trigger; they are always ignored. Let's see an example of where rewriter triggers can be useful. Suppose you do not want to see an offensive word that might appear in the MUD. A first attempt at filtering could be a trigger like this: A profanity filter that does not work Pattern: fuck Action: /$colorline =~ s/fuck/f***/; $world->echo($colorline) Omit (gag) from output: Checked This works for simple cases, but it is most likely not what you want. Suppose you have a trigger that captures messages sent from a specific channel (such as the one for telepathic communications) and does something, such as changing the presentation of the message or sending them to another window. If someone sends a message over that channel with the f-word, the channel-capture trigger will not work because the line has already been caught the the profanity-filter trigger above. You'll see the message with the bad word filtered, but it will not be captured as a channel message. You might think about setting the Keep executing option in the profanity-filter trigger, but that would not solve the problem. That trigger would match, and print in the main window the line just with the word filtered. And then the original line would match against the channel-capture trigger, thus acting upon the channel message, but with the bad word intact, because the trigger did not change the line. So you would end up seeing the message twice, but neither case in the way you want. The solution to this problem is to use a rewriter trigger to filter the bad word before other triggers have a chance to see the line. Our profanity-filter trigger should be like this: A profanity filter using a rewriter trigger Pattern: fuck Action: /$colorline =~ s/fuck/f***/ Rewriter trigger: Checked Note that the line is not printed. Rewriter triggers generally need not print anything, because if no other trigger matches the line, it will be printed (with the changed contents). If another trigger matches, let this trigger decide what to do. Now everything should work: when any line with the f-word is seen, this word is filtered out and the line is changed. If this was a channel message, the channel-capture trigger will see the line with the offensive word filtered and display the message in your special way without the bad word. Defining Triggers in the Command Line For those more used to Perl and to command lines, it is also possible to define and alter triggers from the command line. This is done with a series of Perl function. Triggers are defined with the $world->trigger function. There are many ways to use this function, and we will start describing them here. The simples way to use that function is with two arguments: $world->trigger(pattern, action). This defines a trigger that will match against pattern and execute action when a match happens. Here's how to define the trigger in in the command line: A very simple trigger defined in the command line $world->trigger('has attacked you!', 'wield sword') To specify other trigger features an extra argument is passed to the trigger function. For those that know Perl, it is a reference to a hash, and this hash can contain some attributes specifying the trigger's behaviour. For those that do not understand the previous sentence, do not worry, the examples should make the usage clear. Let's re-create a simple gag to omit all that is said by Joe (see ): A simple gag (in the command line) $world->trigger('^Joe chats', '/$world->echonl("Joe said something silly here.")', { gag => 1 }) See the difference? There is a third parameter, enclosed in curly braces {}, with the word gag, an arrow, and the number 1. What that means is that gag has the value 1, or, as usual in computer languages, is true. (False would be zero.) Often gags do not have any action: A gag with no action (in the command line) $world->trigger('^Joe chats', { gag => 1 }) The action has simply been omitted, but the argument that specifies that we are dealing with a gag remains, naturally. As a matter of fact, this kind of gag (with no action) is quite common, and there is a shorter way to do that. The command below has the exact same effect as the previous one: A shortcut function to define gags $world->gag('^Joe chats') The gag attribute only controls whether the line is displayed in the screen or not. If you have logging enabled (see ), a the line that matched a trigger with the gag attribute will be written in the log file normally. If you want the line to be omitted from the log file, you must set also the gaglog attribute. If it is set, then the line will not be written to the log file. Note that the two attributes are independent: you can gag the line from the screen, from the log file, from both or from neither. To make case be ignored when matching, use a very similar construct as the above, but using the ignorecase attribute: A case-insensitive trigger $world->trigger('^.* chats ".*joe.*"', '/callAttention()', { ignorecase => 1}) Another attribute that can be set for triggers is keepexecuting, corresponding to the Keep executing triggers after this one matches option (see ). This flag is specified just like gag. Just add the parameter { keepexecuting => 1 } to the function call. It is possible for a trigger to be both a gag and have the keepexecuting flag. In this case, include both in the last argument: { gag => 1, keepexecuting => 1 }. Note it is just one argument, with both flags separated by a comma. The order does not matter, keepexecuting could have come before gag. Similarly, rewriter triggers (see ) are created with the rewriter flag. Editing Triggers In the previous sections it was shown how to add triggers, but nothing was told about how to change them after they are defined. This and other points will be addressed in this section. Before going into editing, let us see how to get a list of all triggers that are currently defined for the World. Just use the $world->listtrigger function without arguments. You will be presented with a list of the currently defined triggers. There are several columns: Num is the number of the trigger. Triggers are numbered sequentially starting at zero. This number will be useful when we start editing triggers. Next comes gag, which tells whether the trigger is a gag (for the screen). Next is GLo, which means "Gag from Log", and shows whether the line is omitted (that is, not written) in the log file also (if logging is enabled, of course). After that, Ena tells whether the trigger is enabled. Triggers that are disabled are not matched. This is a nice way to stop a trigger, but keep it stored for later use. We will see how to enable and disable triggers later in this section. Next there is KeE, which reports the status of the keepexecuting flag for the trigger. After that, IgC specifies the case is being ignored. The final two columns list the pattern and action of the trigger. The listing produced by $world->listtrigger is compact, showing all triggers but possibly truncating the pattern and/or action. If you give a trigger number as argument to listtrigger, it will display that trigger's information detailedly. To edit a trigger, you need to know that trigger's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->gettriggernumber can be used to discover a trigger's number if its name is known.) The same function used to add triggers can also change existing ones, you just need to pass the trigger number as the first argument. Calling $world->trigger(number, new pattern) changes the pattern of the trigger with that number. If you want to change the pattern and action, include the action as a third argument: $world->trigger(number, new pattern, new action). What if you want to change only the action? Since passing only one string argument would change the pattern, this is done in a different way, using the same hash that is used to pass attributes to the trigger. In brief, this is how you would change only the action: $world->trigger(number, { action => new action }). Notice that the action is passed as an attribute inside the curly braces. It is also possible to change the pattern this way, just use the attribute pattern. Naturally, it is possible to attributes such as gag or keepexecuting. The syntax is the same, include the new value inside the curly braces. To clear one of those flags, use the value 0, which means false. The example below makes trigger number 2 stop being a gag, and at the same time sets it not to prevent matching of other triggers: Changing several attributes at once $world->trigger(2, { gag => 0, keepexecuting => 1 }) It is also possible, naturally, to change attributes such as pattern or action at the same time that gag or keepexecuting are changed. All these attributes are equal, the only difference is that since the pattern and action are used much more often, there is a shorter way of specifying them. But even when you create a trigger you can use this extended syntax. could be also entered this way, with the exact same results: A very simple trigger, in another way $world->trigger({ pattern => 'has attacked you!', action => 'wield sword'}) The final attribute for triggers is enabled. It was mentioned briefly when we described how to list triggers. It can be set just like the other attributes, and like keepexecuting or gag it is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the trigger is matched normally. When it is zero, received lines are not matched against it. This way, disabling a trigger effectively turns if off, as if it did not exist, but the trigger is still saved, and can be turned on again when necessary. Here's an example of disabling a trigger (number 3 in this case): Disabling a trigger, the long way $world->trigger(3, { enabled => 0 }) However, there is a shorter way: the $world->distrigger function disables the trigger whose number is passed as argument. So the example above can be rewritten in a shorter way as: Disabling a trigger, the short way $world->distrigger(3) The corresponding function $world->enatrigger enables the specified trigger. It is also possible to temporarily disable all triggers. Just use the menu Preferences Disable Triggers and this will prevent triggers from running. This does not change the "enabled" status of any triggers, it just prevents all triggers from running. When you select the menu again, triggers that were enabled will run again, and those that were disabled will remain disabled. There are times when you want to delete a trigger. This is easy to do, use the $world->deltrigger function. It takes as argument the number of the trigger you wish to delete. Be aware that once deleted it is not possible to recover the trigger (unless you create it again). Many times just disabling the trigger is a better idea. The second thing to note is that when you delete a trigger the numbers of the other triggers may change, so be careful when you try to delete several triggers in sequence. Assigning Names to Triggers It is possible to assign names to triggers. When a trigger has a name, you can enable, disable, or delete it using its name instead of its number. To assign a name to a trigger, specify the name attribute when creating it: Creating a trigger with a name $world->trigger('has attacked you!', 'wield sword', { name => 'attack' }) You can now disable this trigger with $world->distrigger('attack'). The name can also be used in the $world->enatrigger, $world->deltrigger and $world->listtrigger functions. It is also possible to assign a name to an existing trigger. Just edit it as described in , passing the name attribute. Use this same process to change the name of a trigger. Another feature of trigger names is that several triggers can have the same name. In this case, all these triggers will be treated as a single group. The functions above, when passed a trigger name, will act upon all triggers of the group, that is, on all triggers with that name. Reordering Triggers Triggers are tried from the first to the last, so in some cases the order of the triggers matters. It is possible to move a trigger to another position with the $world->movetrigger function. The function takes two parameters: the first is the name or number of the trigger that you want to move. The second is the new position that the trigger will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of triggers, the trigger will be moved to the end of the list. If there are several triggers with the same name, only the first one found will be moved. And when a trigger is moved, other triggers might move up or down to accomodate the change. Importing and Exporting You can export triggers, aliases, macros, timers, permanent variables and hooks to a file, and them load these objects in another World. This function is accessed via the World Editor. To export some items, select them from the list. (You can select several items by holding the Control key and clicking.) Press the Export button, and a dialog will open for you to select a file name. Select a name, press Save and the selected items will be saved to the file. The export function is accessible from the editors for all exportable objects (triggers, aliases, macros, timers, permanent variables and hooks). By default, it only exports one kind of object, the one currently displayed. But you can export more than one kind of object to the same file (for example, triggers and aliases, or aliases, macros and hooks, or even all of them). To do that, select all the items you want from all the pages in the World Editor. Then, from any page, select Export. From the dialog that opens, click Items to export. Several check boxes will appear. Mark the ones corresponding to the objects you want to export, and all corresponding selected objects will be imported. After you have exported some items, you can import them in another World, even in another machine. Just open one of the editors (it doesn't matter which one, you can import triggers even from the alias editor), and press Import. Select the file from the dialog, and all items in the file will be imported and will be included in the current World. Testing Triggers You can test your triggers to see how they would react to text coming from the MUD. To do so, select the Input Test Triggers menu item, or press the Test Triggers button from the Trigger section of the World Editor. You will see a dialog like this:
The test triggers window The test triggers window.
In the first entry box, enter some text to be matched against the triggers that are defined. This line will be matched as if it came from the MUD. Then press the Send button to try the triggers. Matching is done exactly for lines that come from the server: only enabled triggers are tried, rewriter triggers are tried first and change the line, the keep executing flag is verified, and so on. After pressing Send, the results are shown in the second half of the window. The number of triggers that matched is displayed, and also all the commands that would be processed if that line came from the mud (if any). The line that would be printed to the main window is also displayed. If any gag trigger matched, that box will be empty indicating that no line will be printed. If no gag triggers matched, the line could be different because a rewriter trigger changed it. However, in most cases the line printed will be the same as the line received. Finally, you are told if the line would be written in the log file. If any gag log trigger matched the line, then it would be omitted. You can try the triggers against other lines, just enter them and press Send. Any changes you make to the triggers are used instantly, just press Send again to try the same line against the new or changed triggers.
Aliases Aliases allow you to define shortcuts for simple commands. For example, you can define df to be an alias to drink from fountain, and then you can type only df in the command line, and drink from fountain will be sent to the mud. However, in KildClient aliases can do much more. They allow you to rewrite part of the input line. In the example above, what happened is that df was replaced by drink from fountain. Aliases such as these replace the entire short command you type by a longer command, but you can also replace part of the line. If a mob has a really long name, such as Ingeloakastimizilian, you can define an alias "ing" that is replaced by "Ingeloakastimizilian", and whenever you type ing, even in the middle of another command, it will be replaced by the full name. Aliases are implemented as a substitution, just like the "Search and Replace" option found in several programs. They consist of two parts: a pattern and a substitution. Each line you type is matched against the pattern and if it matches, the matched part is replaced by the substitution. For those who know Perl, aliases work just like Perl's s/// operator. As a matter of fact, they are implemented with s///. This is more or less how the alias processing is done: $line =~ s/$pattern/$substitution/; Supposing $line holds the entered command, $pattern the pattern and $substitution the substitution. Then $line is sent to the World, possibly having been modified. If you are having trouble with aliases and want to be informed whenver an alias matches, enable the Preferences Debug Matches menu. When this is enabled, information about each matched alias will be printed to stderr. (This means you must start KildClient from a terminal to see the output.) Creating and Editing Aliases The easiest way to create and alter aliases is from the World Editor, the place where all settings of a World are altered (see ). Aliases are defined in the Aliases section inside the Automation section. When you open that section, you'll see a list of the defined aliases and some buttons like this:
The graphical Alias editor The graphical Alias editor.
The main part of the window is the list of defined aliases. The columns are as follows: Enabled specifies whether the alias is enabled or not. Aliases that are not enabled are not active and will not be tried when a command is entered, but they remain in the list so that they can later be enabled again. Name is a name that is assigned to an alias. This helps you identify the alias' purpose and is useful when editing an alias via the command line (as described in ). Assigning a name to an alias is optional. Pattern and Substitution are the parameters for the alias, and they define the alias' action, as described above. I Case (for "Ignore Case"), if set, means the case is not considered while matching the pattern, that is, a case-insensitive match is done. Eval as Perl controls how the alias is evaluated. This option will be described later. Plugin: if this is non-empty, it means that the alias belongs to a plugin (and the name of the plugin is displayed). However, by default plugin aliases are not displayed. See for information on how to display plugin aliases here. Adding Aliases To add a new alias, press the Add button. This will open a window for you to edit the new alias' parameters:
The window to edit aliases The window to edit aliases.
What can be set represents the columns described above. The only thing that needs explanation is the Eval Substitution as Perl statement option, corresponding to the Eval as Perl column. As mentioned before, aliases are actually a substitution, using Perl's s// construct. It is also possible to have aliases that use a s//e construct, that is, whose substitution is actually composed of Perl statements evaluated when a match is found. When that option is enabled, the substitution is evaluated as a Perl statement. When you are finished, press OK and the alias will be added. If you change your mind, press Cancel and the alias will not be added.
Editing Aliases To edit an alias, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding aliases (see ) will be opened, filled with the alias' parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the alias will remain as it was before. Another shorter way to edit an alias is to double click its line in the list. It is also possible to change the value of the Enabled and Eval as Perl flags directly from the alias list. Make sure that the alias you want to change is selected, and click in the check button. The state will be toggled. To delete an alias, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the alias. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the alias again. See . To delete several aliases at once, select them all and press Delete. The final thing that needs to be explained with regard to aliases is how to reorder them. Aliases as tried from the first one to the last, so in a few cases the order might matter. To move an alias up or down in the list, select it and press the corresponding button.
Using Aliases In an alias that replaces dt with drink from fountain was described. To create this alias, enter the following parameters, leaving the other options unchanged from the default values: A simple alias Pattern: ^df$ Substitution: drink from fountain You might be wondering why we use "^df$" and not only "df". Remember that aliases are just substitutions, and the pattern is a regular expression. If the anchors (that is, ^ and $) were not present, it would match against df anywhere in the line, and substitute this df even in the middle of words. wonder would become wodrink from fountainder. At times a behaviour like this (substituting anywhere) might be desirable, but in our case we want it to substitute only the whole command df, so we use the anchors. As an example of an alias that does not match only the exact command, consider this one: A slightly more complex alias Pattern: '^gra ' (without the quotes, but note the space after the word) Substitution: 'chat CONGRATULATIONS, ' (without the quotes, but note the space after the word) Whenever you enter a command that starts with gra followed by a space, that part (gra and the space) is replaced by the given pattern. So if you enter gra Bob, what will be sent to the MUD is chat CONGRATULATIONS, Bob. Since aliases are just a substitution, you can define bracketed expressions in the pattern and then use $1, $2, and so on in the substitution. Let us increment the above example to add something to the end. We will need a bracketed expression: An alias that uses bracketed expressions Pattern: ^gra (.*)$ Substitution: chat CONGRATULATIONS, $1!!! It should be easy to understand. $1 in the substituion is replaced by what goes after gra. Advanced Features As mentioned in , aliases can use a s//e construct, that is, whose substitution is actually composed of Perl statements evaluated when a match is found. To use that feature, select the Eval substitution as Perl statement option: An alias whose substitution is evaluated: Pattern: calc\((.*)\) Substitution: eval "$1" Eval substitution as Perl statement: checked The alias allows you to write something like that: gossip 2+3 = calc(2+3) and have the result of the calculation sent to the MUD. (Or any other Perl statement to be evaluated, actually.) By default, case is considered when matching. If you want case-insensitive matching, select Ignore case when matching. Using Perl in Aliases It is possible to make an alias whose action is not to send a changed command line, but to execute an action. To do that, make the replacement start with /, which means that the rest of the line will be executed, and not sent to the mud. In the rest of the line, you can put arbitrary Perl code. However, if you want to refer to a variable, you must escape the $ prefix by writing it as \$. This way, when the substitution is run, you get the name of the variable, not the value this variable currently has. As an example, if you define an alias with pattern ^say (.*)$ and action /\$world-\>echonl("$1"), whenever you type a line that starts with say in the input box, the rest of the line will be echoed in the screen, but not sent to the mud. Defining Aliases in the Command Line For those more used to Perl and to command lines, it is also possible to define and alter aliases from the command line. This is done with a series of Perl function. Aliases are defined with the $world->alias function. This function works similarly to $world->trigger (described in ). The simplest way to call the function is with two arguments: $world->alias(pattern, substitution). This defines an alias with the given pattern and substitution. For example, the alias described in would be created as follows: A simple alias defined in the command line $world->alias('^df$', 'drink from fountain') Like the $world->trigger function (see ), you can specify extra arguments to control advanced alias features. One such argument is perleval that causes the substitution to be evaluated as a Perl statement. The alias defined in can also be created as follows: An alias whose substitution is evaluated (in the command line) $world->alias('calc\((.*)\)', 'eval "$1"', { perleval => 1}) See the difference? There is a third parameter, enclosed in curly braces {}, with the word perleval, an arrow, and the number 1. What that means is that perleval has the value 1, or, as usual in computer languages, is true. (False would be zero.) To specify a case-insensitive match, use the ignorecase attribute. Editing Aliases Before going into editing, let us see how to get a list of all aliases that are currently defined for the World. Just use the $world->listalias function without arguments. You will be presented with a list of the currently defined aliases. There are four columns: Num is the number of the alias. Aliases are numbered sequentially starting at zero. This number will be useful when we start editing aliases. After that, Ena tells whether the alias is enabled. Aliases that are disabled are not tried. This is a nice way to stop an alias from working, but keep it stored for later use. We will see how to enable and disable aliases later in this section. The final two columns list the pattern and substitution of the alias. The listing produced by $world->listalias is compact, showing all aliases but possibly truncating the pattern and/or substitution. If you give an alias number as argument to listalias, it will display that alias's information detailedly. To edit an alias, you need to know that alias's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->getaliasnumber can be used to discover an alias's number if its name is known.) The same function used to add aliases can also change existing ones, you just need to pass the alias number as the first argument. Calling $world->alias(number, new pattern) changes the pattern of the alias with that number. If you want to change the pattern and substitution, include the substitution as a third argument: $world->alias(number, new pattern, new substitution). What if you want to change only the substitution? Since passing only one string argument would change the pattern, this is done in a different way. In brief, this is how you would change only the substitution: $world->alias(number, { substitution => new substitution }). Notice that the substitution is passed as an attribute inside the curly braces. It is also possible to change the pattern this way, just use the attribute pattern. One other attribute of aliases is enabled. It was mentioned briefly when we described how to list aliases. It can be set just like the other attributes and is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the alias is tried normally. When it is zero, commands are not tried against it. This way, disabling an alias effectively turns if off, as if it did not exist, but the alias is still saved, and can be turned on again when necessary. Here's an example of disabling an alias (number 3 in this case): Disabling an alias, the long way $world->alias(3, { enabled => 0 }) However, there is a shorter way: the $world->disalias function disables the alias whose number is passed as argument. So the example above can be rewritten in a shorter way as: Disabling an alias, the short way $world->disalias(3) The corresponding function $world->enaalias enables the specified alias. It is also possible to temporarily disable all aliases. Just use the menu Preferences Disable Aliases and this will prevent aliases from being used. This does not change the "enabled" status of any aliases, it just prevents all aliases from being executed. When you select the menu again, aliases that were enabled will be matched again, and those that were disabled will remain disabled. There are times when you want to delete an alias. This is easy to do, use the $world->delalias function. It takes as argument the number of the alias you wish to delete. Be aware that once deleted it is not possible to recover the alias (unless you create it again). Many times just disabling the alias is a better idea. The second thing to note is that when you delete an alias the numbers of the other aliases may change, so be careful when you try to delete several aliases in sequence. Assigning Names to Aliases It is possible to assign names to aliases. When an alias has a name, you can enable, disable, or delete it using its name instead of its number. To assign a name to an alias, specify the name attribute when creating it: Creating an alias with a name $world->alias('^df$', 'drink from fountain', { name => 'drink' }) You can now disable this alias with $world->disalias('drink'). The name can also be used in the $world->enaalias, $world->delalias and $world->listalias functions. It is also possible to assign a name to an existing alias. Just edit it as described in , passing the name attribute. Use this same process to change the name of an alias. Another feature of alias names is that several aliases can have the same name. In this case, all these aliases will be treated as a single group. The functions above, when passed an alias name, will act upon all aliases of the group, that is, on all aliases with that name. Reordering Aliases Aliases are tried from the first to the last, so in some cases the order of the aliases matters. It is possible to move an alias to another position with the $world->movealias function. The function takes two parameters: the first is the name or number of the alias that you want to move. The second is the new position that the alias will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of aliases, the alias will be moved to the end of the list. If there are several aliases with the same name, only the first one found will be moved. And when an alias is moved, other aliases might move up or down to accomodate the change.
Macros Macros are, in a way, similar to aliases. They allow you to send commands to the MUD in an easier way. Aliases allow you to associate commands with shortcuts (typing a three-letter command to send a much more complex command, for example). Macros allow you to associate a command with a keypress. You could associate, for example, F5 with the command drink from fountain, and then you would only need to press F5 to send that command to the MUD. The commands need not be complex or big: you could associate the arrow keys with macros that send movement commands, and you would be able to move around the MUD using the arrow keys. Macros consist of a key and an action. The action represents what is sent to the MUD when the macro is run. It can be a single command to send, several commands separated by %;, or something to be executed by Perl, if it starts with /. Creating and Editing Macros The easiest way to create and alter macros is from the World Editor, the place where all settings of a World are altered (see ). Macro are defined in the Macros section inside the Automation section. When you open that section, you'll see a list of the defined macros and some buttons like this:
The graphical Macro editor The graphical Macro editor.
The main part of the window is the list of defined macros. The columns are as follows: Enabled specifies whether the macro is enabled or not. Macros that are not enabled are not active and will not be run even if their key is pressed, but they remain in the list so that they can later be enabled again. Name is a name that is assigned to a macro. This helps you identify the macro's purpose and is useful when editing a macro via the command line (as described in ). Assigning a name to a macro is optional. Key is the key that activates the macro. Action is the action that is run when the key is pressed. Plugin: if this is non-empty, it means that the macro belongs to a plugin (and the name of the plugin is displayed). However, by default plugin macros are not displayed. See for information on how to display plugin macros here. Adding Macros To add a new macro, press the Add button. This will open a window for you to edit the new macro's parameters:
The window to edit macros The window to edit macros.
What can be set represents the columns described above. To define the key, press the key combination desired in the text box for Key and the appropriate key code will be inserted. When you are finished, press OK and the macro will be added. If you change your mind, press Cancel and the macro will not be added. To see some things macros can do, read . If you want to try the macros described there, you can create them from the World Editor.
Editing Macros To edit a macro, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding macro (see ) will be opened, filled with the macro's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the macro will remain as it was before. Another shorter way to edit a macro is to double click its line in the list. It is also possible to change the value of the enabled option directly from the macro list. Make sure that the macro you want to change is selected, and click in the check button. The state will be toggled. To delete a macro, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the macro. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the macro again. See . To delete several macros at once, select them all and press Delete. The final thing that needs to be explained with regard to macros is how to reorder them. Macros as tried from the first one to the last, so in a few cases the order might matter. To move a macro up or down in the list, select it and press the corresponding button.
Defining Macros in the Command Line For those more used to Perl and to command lines, it is also possible to define and alter macros from the command line. This is done with a series of Perl function. Macros are set defining, as mentioned above, a key and an action. The key is key keycode for the key you wish to assign the macro to. The easiest way to get the keycode for a given key is with the $world->getkeycode function. This function takes no parameters. When run, it prompts you to press a key, and then prints the keycode for the key. It also returns the keycode as a string, so you can save it in a variable and use when defining the macro. Here's a way to define a macro: Defining a macro /$key = $world->getkeycode Press a key to get its keycode. Press the F5 key Key code: F5 /$world->macro($key, 'drink from fountain') The above session shows how to assign drink from fountain to the F5 key. Note that $world->getkeycode prompts you for a key and prints its keycode. Additionally, the keycode is returned, and it is stored in the $key variable. This variable is used as the first argument to the $world->macro function, that takes two arguments: the keycode and the action. We could have entered 'F5' directly, but using the keycode returned by $world->getkeycode is easier and less error-prone. That's pretty much all about defining macros. They do not take arguments, it is all about executing simple commands. Other things that could be done are executing several commands (separating them with %;) or executing a Perl statement or function. Editing Macros Before going into editing, let us see how to get a list of all macros that are currently defined for the World. Just use the $world->listmacro function without arguments. You will be presented with a list of the currently defined macros. There are four columns: Num is the number of the macro. Macros are numbered sequentially starting at zero. This number will be useful when we start editing them. After that, Ena tells whether the macro is enabled. Macros that are disabled are not executed even if the key is pressed. This is a nice way to stop a macro from working, but keep it stored for later use. We will see how to enable and disable macros later in this section. The final two columns list the keycode and action of the alias. The listing produced by $world->listmacro is compact, showing all macros but possibly truncating the keycode and/or action. If you give a macro number as argument to listmacro, it will display that macro's information detailedly. To edit a macro, you need to know that macro's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->getmacronumber can be used to discover a macro's number if its name is known.) The same function used to add macros can also change existing ones, you just need to pass the macro number as the first argument. Calling $world->macro(number, new keycode) changes the key of the macro with that number. If you want to change the key and action, include the substitution as a third argument: $world->macro(number, new key, new action). What if you want to change only the action? Since passing only one string argument would change the key, this is done in a different way. In brief, this is how you would change only the key: $world->macro(number, { action => new action }). Notice that the key is passed as an attribute inside the curly braces. It is also possible to change the key this way, just use the attribute key. The only attribute for macros, besides the key and action, is enabled. It was mentioned briefly when we described how to list macros. It can be set just like the other attributes and is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the macro is run normally. When it is zero, even if the key is pressed, the macros is not run. This way, disabling an alias effectively turns if off, as if it did not exist, but the macro is still saved, and can be turned on again when necessary. Here's an example of disabling a macro (number 3 in this case): Disabling a macro, the long way $world->macro(3, { enabled => 0 }) However, there is a shorter way: the $world->dismacro function disables the meacro whose number is passed as argument. So the example above can be rewritten in a shorter way as: Disabling a macro, the short way $world->dismacro(3) The corresponding function $world->enamacro enables the specified macro. It is also possible to temporarily disable all macros. Just use the menu Preferences Disable Macros and this will prevent macros from running. This does not change the "enabled" status of any macros, it just prevents all macros from running. When you select the menu again, macros that were enabled will run again, and those that were disabled will remain disabled. There are times when you want to delete a macro. This is easy to do, use the $world->delmacro function. It takes as argument the number of the macro you wish to delete. Be aware that once deleted it is not possible to recover the macro (unless you create it again). Many times just disabling the macro is a better idea. The second thing to note is that when you delete a macro the numbers of the other macros may change, so be careful when you try to delete several macros in sequence. Assigning Names to Macros It is possible to assign names to macros. When a macro has a name, you can enable, disable, or delete it using its name instead of its number. To assign a name to a macro, specify the name attribute when creating it: Creating a macro with a name $world->macro($key, 'drink from fountain', { name => 'drink' }) You can now disable this macro with $world->dismacro('drink'). The name can also be used in the $world->enamacro, $world->delmacro and $world->listmacro functions. It is also possible to assign a name to an existing macro. Just edit it as described in , passing the name attribute. Use this same process to change the name of a macro. Another feature of macro names is that several macros can have the same name. In this case, all these macros will be treated as a single group. The functions above, when passed a macro name, will act upon all macros of the group, that is, on all macros with that name. Reordering Macros Macros are tried from the first to the last, so in some cases the order of the macros matters. It is possible to move an macro to another position with the $world->movemacro function. The function takes two parameters: the first is the name or number of the macro that you want to move. The second is the new position that the macro will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of macros, the macro will be moved to the end of the list. If there are several macros with the same name, only the first one found will be moved. And when an macro is moved, other macros might move up or down to accomodate the change.
Timers Timers allow you to execute commands repeatedly at fixed intervals, and also to specify a command to be executed later. Timers have to mandatory attributes: an interval in seconds, that represents how often the timer is fired, and an action, that is the command that is executed. Just like in other places, the action can be a text that is sent to the MUD, or it can be something run with Perl. It is possible to define timers that execute only a fixed number of times. This is the timer's repeat count. Whenever the timer is executed, this count is decreased, and when it reaches zero, the timer is disabled, and will only execute again if reenabled manually. A timer can also be temporary: in this case, when the repeat count reaches zero, it is deleted and not only disabled. A repeat count of -1 means that the timer is executed indefinitely. A timer with a repeat count of one is executed only once. Since the first execution only happens interval seconds after it is defined, this allows you to define a command to be executed after some specified time. If it is marked as temporary, the timer will be deleted after it is run this one time. Creating and Editing Timers The easiest way to create and alter timers is from the World Editor, the place where all settings of a World are altered (see ). Timer are defined in the Timers section inside the Automation section. When you open that section, you'll see a list of the defined timers and some buttons like this:
The graphical Timer editor The graphical Timer editor.
The main part of the window is the list of defined timers. The columns are as follows: Enabled specifies whether the timer is enabled or not. Timers that are not enabled are not active and will not be run, but they remain in the list so that they can later be enabled again. Name is a name that is assigned to a timer. This helps you identify the timer's purpose and is useful when editing a timer via the command line (as described in ). Assigning a name to a timer is optional. Interval is the interval between timer activations, as described above. Count is the repeat count, as described above. Action is the action that is run when the timer fires. Temp indicates whether the timer is temporary or not. Temporary timers are deleted automatically when their repeat count reaches 0. Plugin: if this is non-empty, it means that the timer belongs to a plugin (and the name of the plugin is displayed). However, by default plugin timers are not displayed. See for information on how to display plugin timers here. Adding Timers To add a new timer, press the Add button. This will open a window for you to edit the new timer's parameters:
The window to edit timers The window to edit timers.
What can be set represents the columns described above. When you are finished, press OK and the timer will be added. If you change your mind, press Cancel and the timer will not be added. To see some things timers can do, read . If you want to try the timers described there, you can create them from the World Editor.
Editing Timers To edit a timer, select it by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding timer (see ) will be opened, filled with the timer's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the timer will remain as it was before. Another shorter way to edit a timer is to double click its line in the list. It is also possible to change the value of the binary options (those represented by a check box) directly from the timer list. Make sure that the timer you want to change is selected, and click in the check button. The state will be toggled. To delete a timer, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the timer. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the timer again. See . To delete several timers at once, select them all and press Delete. The final thing that needs to be explained with regard to timers is how to reorder them. Timers as tried from the first one to the last, so in a few cases the order might matter. To move a timer up or down in the list, select it and press the corresponding button.
Defining Timers in the Command Line For those more used to Perl and to command lines, it is also possible to define and alter timers from the command line. This is done with a series of Perl function. Timers are created with the $world->timer function. It is similar to other functions for adding triggers, aliases and macros, but the hash reference with attributes (the thing inside {}) must always be used. Let us see an example of defining a timer that sends "who" once a minute: A simple timer $world->timer({ interval => 60, action => 'who' }) Note that the interval is specified in seconds. Our second example will be of a timer that executes a specified number of times: A timer that executes only five times $count = 5; $world->timer({ interval => 10, count => 5, action => '/$world->send("chat The count is at $count"); --$count' }) In these two commands, first a variable that will be used in the timer is defined. Then the timer is created, specifying count as 5, so that it is executed only five times. The timer's action is to send commands counting down to one. When the count reaches one, the timer is disabled, because it has already executed five times. Now let us see a temporary timer: A one-shot timer $world->timer({ interval => 30, count => 1, temporary => 1, action => 'say 30 seconds have elapsed' }) This timer has a count of one, meaning it will only be executed once. Also, temporary is defined as true, which means that after it is executed (which will happen in 30 seconds), the timer will be erased. Of course, a temporary timer does not need to have a count of one. The countdown timer above could have been made temporary if it was not needed after it reached one. Editing Timers Before going into editing, let us see how to get a list of all timers that are currently defined for the World. Just use the $world->listtimer function without arguments. You will be presented with a list of the currently defined timers. There are several columns: Num is the number of the timer. Timers are numbered sequentially starting at zero. This number will be useful when we start editing timers. After that, Int is the interval (in seconds) between timer firings. Next comes Count, which is the number of times the timer will still be fired before being disabled or erased. If the value is -1, that means that it will execute indefinitely. Ena tells whether the timer is enabled. enabled. Timers that are disabled are not run. This is a nice way to stop a timer from working, but keep it stored for later use. We will see how to enable and disable timer later in this section. After that, Temp tells whether the timer is temporary or not. Temporary timers were explained in the previous section. In brief, a temporary timer is deleted (and not only disabled) after its count reaches zero. The last column shows the action associated with the timer. The listing produced by $world->listtimer is compact, showing all timers but possibly truncating the action. If you give a timer number as argument to listtimer, it will display that timer's information detailedly. To edit a timer, you need to know that timer's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->gettimernumber can be used to discover a timer's number if its name is known.) The same function used to add timers can also change existing ones, you just need to pass the timer number as the first argument. The generay way to edit a timer is like this: $world->timer(number, { new attributes }), where new attributes is a list of the attributes you want to change. For example, the code below changes the interval of timer number two: Changing the interval of a timer $world->timer(2, { interval => 30 }) As a further example, consider the one below, that edits timer number five to be temporary and to run 10 times: Changing the interval of a timer $world->timer(5, { temporary => 1, count => 10 }) It is possible to enable and disable timers with the syntax above, but there is a shorter way: the $world->distimer function disables the timer whose number is passed as argument, as shown in the example below: Disabling a timer, the short way $world->distimer(3) The corresponding function $world->enatimer enables the specified timer. It is also possible to temporarily disable all timers. Just use the menu Preferences Disable Timers and this will prevent timers from running. This does not change the "enabled" status of any timers, it just prevents all timers from running. When you select the menu again, timers that were enabled will run again, and those that were disabled will remain disabled. There are times when you want to delete a timer. This is easy to do, use the $world->deltimer function. It takes as argument the number of the timer you wish to delete. Be aware that once deleted it is not possible to recover the timer (unless you create it again). Many times just disabling it is a better idea. The second thing to note is that when you delete a timer the numbers of the other timers may change, so be careful when you try to delete several timers in sequence. Assigning Names to Timers It is possible to assign names to timers. When a timer has a name, you can enable, disable, or delete it using its name instead of its number. To assign a name to a timer, specify the name attribute when creating it: Creating a timer with a name $world->timer({ interval => 60, action => 'who', name => 'who' }) You can now disable this timer with $world->distimer('who'). The name can also be used in the $world->enatimer, $world->deltimer and $world->listtimer functions. It is also possible to assign a name to an existing timer. Just edit it as described in , passing the name attribute. Use this same process to change the name of a timer. Another feature of timer names is that several timers can have the same name. In this case, all these timers will be treated as a single group. The functions above, when passed a timer name, will act upon all timers of the group, that is, on all timers with that name. Reordering Timers It is possible to move a timer to another position with the $world->movetimer function. The function takes two parameters: the first is the name or number of the timer that you want to move. The second is the new position that the timer will take in the list. 0 means move the the first position. If you specify a negative number or a number greater than the number of timers, the timer will be moved to the end of the list. If there are several timers with the same name, only the first one found will be moved. And when a timer is moved, other timers might move up or down to accomodate the change.
Hooks Hooks allow you to specify an action to be executed automatically when some events happen. For example, you can define a hook with actions to be executed when a connection is established, and then these commands will be automatically executed when you connect to the World. You can connect hooks to seven events: OnConnect: This hook is executed when a connection to the world is made, after the auto-logon has taken place (if applicable). OnDisconnect: This hook is executed when you are disconnected from a World, after the connection has been closed. OnReceivedText: Executed when text is received from the world. The text received is available for the hook in the $hookdata variable, and can be inspectd in Perl scripts. OnSentCommand: Executed after a command is sent to the world. The command is available for the hook in the $hookdata variable, and can be inspectd in Perl scripts. OnGetFocus: Executed when the KildClient window receives the focus. OnLoseFocus: Executed when the KildClient window loses the focus. OnCloseConnected: Executed when the world is forcedly closed. This can happen using the World Close menu, the $world->close() function, or by quitting the program with the world connected. You can put in this hook, for example "quit" to always exit the MUD nicely, even if you close the world by mistake. Creating and Editing Hooks The easiest way to create and alter hooks is from the World Editor, the place where all settings of a World are altered (see ). Hook are defined in the Hooks section inside the Automation section. When you open that section, you'll see a list of the defined hooks and some buttons like this:
The graphical Hook editor The graphical Hook editor.
In the top there is a combo box for you to select one of the five events described above. When an event is selected the hooks defined for that event will be listed, and all operations will be done on hooks of that event. The main part of the window is the list of defined hooks. The columns are as follows: Enabled specifies whether the hook is enabled or not. Hooks that are not enabled are not active and will not be run, but they remain in the list so that they can later be enabled again. Name is a name that is assigned to a hook. This helps you identify the hook's purpose and is useful when editing a hook via the command line (as described in ). Assigning a name to a hook is optional. Action defines what is done when the hook is run.. Adding Hooks To add a new hook, select the desired event from the Combo Box and press the Add button. This will open a window for you to edit the new hook's parameters:
The window to edit hooks The window to edit hooks.
What can be set represents the columns described above. When you are finished, press OK and the hook will be added. If you change your mind, press Cancel and the hook will not be added. To see some things hooks can do, read . If you want to try the hooks described there, you can create them from the World Editor.
Editing Hooks To edit a hook, select the event from the combo box, then select the hook to edit in the list by clicking its line in the list (the line will be highlighted), and press the Edit button. A window like the one used for adding hook (see ) will be opened, filled with the hook's parameters. Change what you want, and press the OK to commit the changes. If, however, you change you mind, press Cancel and the changes will be not be made, the hook will remain as it was before. Another shorter way to edit a hook is to double click its line in the list. It is also possible to change the value of enabled setting directly from the hook list. Make sure that the hook you want to change is selected, and click in the check button. The state will be toggled. To delete a hook, select it and press the Delete button. You will be asked for confirmation, and can cancel the operation, but once deleted, you cannot recover the hook. If you want, you can disable this confirmation dialog, but if you do so and click the Delete button, the only way to undo your action will be creating the hook again. See . To delete several hooks at once, select them all and press Delete. The final thing that needs to be explained with regard to hooks is how to reorder them. Hooks as run from the first one to the last, so in a few cases the order might matter. To move a hook up or down in the list, select it and press the corresponding button.
Defining Hooks in the Command Line For those more used to Perl and to command lines, it is also possible to define and alter hooks from the command line. This is done with a series of Perl function. Hooks are defined with the $world->hook function. This function works similarly to $world->trigger (described in ). The simplest way to call the function is with two arguments: $world->hook(event, action). This defines a hook for the given event (see above for the valid events) that does action when the event is fired. As always, action can be some text or a Perl action. Here's an example of connecting a hook to the OnConnect event: Connecting a hook $world->hook('OnConnect', 'user Bob %; password 12345') This hook causes the lines to the sent to the MUD when a connection is established, supposedly representing a way to log in to some MUD server. Editing Hooks Before going into editing, let us see how to get a list of all hooks that are currently defined for a given event. Just use the $world->listhook function with the event name as argument. You will be presented with a list of the currently defined hooks for that event. There are three columns: Num is the number of the hook. Hooks are numbered sequentially starting at zero, but keep in mind that there is a separete numbering for each event. This number will be useful when we start editing hooks. After that, Ena tells whether the hook is enabled. Hooks that are disabled are not run. This is a nice way to stop a hook from working, but keep it stored for later use. We will see how to enable and disable hook later in this section. The last column shows the action of the hook. The listing produced by $world->listhook is compact, showing all hooks but possibly truncating the pattern and/or substitution. If you give a hook number or name as the second argument to listhook (the first argument is the event, as always), it will display that hook's information detailedly. To edit a hook, you need to know that hook's number. (And that can be discovered with the listing functions just described. Alternatively, the $world->gethooknumber can be used to discover a hook's number if its name is known.) The same function used to add hooks can also change existing ones, you just need to pass the hook number as the second argument. Calling $world->hook(event, number, new action) changes the action of the hook with that number for that event. The only attribute for hooks, besides the action is enabled. It was mentioned briefly when we described how to list hooks. It can be set just like the other attributes and is binary, that is, takes the values true (represented by anything different from 0) or false (represented by 0). When the value of this attribute is true (which is the default), the hook is tried normally. When it is zero, commands are not tried against it. This way, disabling a hook effectively turns if off, as if it did not exist, but the hook is still saved, and can be turned on again when necessary. Here's an example of disabling a hook (number 0 of event OnConnect in this case): Disabling a hook, the long way $world->hook('OnConnect', 0, { enabled => 0 }) However, there is a shorter way: the $world->dishook function. It takes two arguments: the event and the hook number, and disables the hook with the given number. So the example above can be rewritten in a shorter way as: Disabling a hook, the short way $world->dishook('OnConnect', 0) The corresponding function $world->enahook enables the specified hook. There are times when you want to delete a hook. This is easy to do, use the $world->delhook function. It takes as argument the event and the number of the hook wish to delete. Be aware that once deleted it is not possible to recover the hook (unless you create it again). Many times just disabling the hook is a better idea. The second thing to note is that when you delete a hook the numbers of the other hook may change, so be careful when you try to delete several hooks in sequence. Assigning Names to Hooks It is possible to assign names to hook. When a hook has a name, you can enable, disable, or delete it using its name instead of its number. To assign a name to a hook, specify the name attribute when creating it: Creating a hook with a name $world->hook('OnConnect', 'user Bob %; password 12345', { name => 'connection' }) You can now disable this hook with $world->dishook('OnConnect', 'connection'). The name can also be used in the $world->enahook, $world->delhook and $world->listhook functions. It is also possible to assign a name to an existing hook. Just edit it as described in , passing the name attribute. Use this same process to change the name of a hook. Another feature of hook names is that several hooks can have the same name. In this case, all these hooks will be treated as a single group. The functions above, when passed a hook name, will act upon all hooks of the group, that is, on all hooks with that name.
Plugins Plugins extend the functionality of KildClient. They add more features that make the client even more powerful. Basically, plugins can define triggers, aliases, macros and timers and/or new functions. Whenever the plugin is loaded, the new functionality is available. You can work with plugins from the World Editor (see ). Open the World Editor, and select the Plugins section inside Automation. You will see a screen like this:
The Plugin list The Plugin list.
There are two lists in the window: one lists the plugins that are currently loaded and that can be used. The other lists the plugins in the startup list, which are plugins that are loaded automatically for you whenever you connect to the World. To load a plugin, press the Load button. A dialog will be opened for you to select the file. Select the file and press Open. The plugin will be loaded and will appear in the list. Or, if there was a problem and the plugin could not be loaded, the reason will be given in a message box. While selecting the file, you have the option to specify that the plugin is to be loaded always at startup (that is, when you connect to the World). If you select that option, the plugin will also be added to the other list. You can get help for a loaded plugin by selecting its line and pressing the Help button. Some help describing how to use the plugin will be shown in the main World window. You can disable a plugin that is loaded. When a plugin is disabled, it is turned off temporarily. To disable a plugin, select its line in the list of loaded plugins and click the check box in the Enabled column. To enable it back, click in the check box again. To add a plugin that is to be loaded always at startup (without loading it now, or if it is already loaded), press the Add button after the list of the startup plugins. A dialog box will open for you to select the file, and if that file could be loaded, the plugin will be added to the list. To remove a plugin so that it is not loaded anymore at startup, select its line and press Remove. And to change the order that the plugins are loaded, select the line and use the Up and Down buttons to move the plugin. Loading Plugins from the Command Line It is also possible to load plugins directly from the command line, for those more comfortable with it and with Perl. To load a plugin, the $world->loadplugin function is used. It must be called with one argument, which can be either the full path to the file that defines the plugin, or just the plugin name. But for this to work, the file must be installed in one of the directories that KildClient looks for plugins. By default, two locations are searched for: one is the plugins directory under KildClient's directory in your HOME path (that is, ~/.kildclient/plugins in UNIX systems). The other is the plugins directory under the directory where KildClient stores some of its files (generally it is something like /usr/local/share/kildclient/plugins). For example, here is how to load the keypad plugin (which is a standard plugin distributed with KildClient): Loading a plugin $world->loadplugin('keypad') As an additional example, the code below loads a plugin specifying its full filename: Loading a plugin specifying the full filename $world->loadplugin('/home/joe/kildclient-plugins/attackplugin.pl') Either way, you should see a message saying that the plugin has been loaded. It is now already working. If the plugin was already loaded, loading will fail. To always load the plugin when you connect to the World, either use the World Editor as described above, or add the line that loads it to your script file. See . Enabling and Disabling Plugins If you want to turn off a plugin temporarily, you can disable it. Later, when you want it to work again, just reenable it. To disable a plugin, use the $world->displugin function, passing as argument the name of the plugin. What this function does is disable the plugin's triggers, aliases, macros and timers. You can still call the plugin functions directly. To enable a plugin again, use the $world->enaplugin function, passing as argument the name of the plugin. Getting Information About Plugins All plugins should contain a help function that, when called, prints information about the plugin. If you want to get help on a plugin, call its help function. The example below shows how to call the help of the keypad plugin: Getting help about a plugin keypad::help() Note that the name of the function is prefixed with the name of the plugin and ::. This is a convention so that one plugin's functions do not interfere with other plugins' ones. It is possible to get a list of all the currently loaded plugins with the $world->listplugin function. If called without arguments, it lists briefly all loaded plugins. But you can pass as argument either a plugin number or a plugin name, and it will give more detailed information about that plugin, including a listing of the triggers, aliases, macros and timers that the plugin defines (if any). Standard Plugins KildClient comes with a few plugins as part of its distribution. These plugins will be described here. You can load these plugins as described above. easypath This plugin makes the use of paths (see ) easier. When this plugin is loaded, you can type #2n3e{sw} instead of /$world->path("2n3e{sw}"). keypad This plugin allows use of the keypad for movement. Pressing the left arrow of the numeric keypad moves to the east, pressing the up arrow moves to the north, and so on. A few other keys of the keypad are also bound: - and + represent down and up, respectively. 5 sends who, 0 sends look, / sends inventory and * sends score. The Num Lock key must be off for this plugin to work. notes This plugin allows you to assign notes to World. The notes are saved with the World and are restored when it is opened again. You can write anything you want, probably it will be something you want to remember for that World. This plugin requires the gtk2-perl bindings, because it has a graphical user interface. Type /notes::edit to open a window where you can edit the notes. When you are finished, press the Close button. The notes are saved automatically. Use the notes::clear function to clear the whole contents of the notes. It is also possible to append something to the notes with notes::append('text'). This is probably more useful in scripts. kc256 This plugin demonstrates a useful extension to the 16 ansi colors that KildClient supports. This is the same 256-color extension supported by xterm (if it is complied with support for that). With this extension, you can specify any color in a 6x6x6 RGB color cube, that is, you have 216 rgb colors at your disposal, plus 24 shades of gray. (The remaining 16 colors are the standard ansi colors.) There are two functions in this plugin: kc256::showcolors: Displays all 216 available RGB colors and the 24 shades of grey in nice tables, with the values that you can use in to access them. kc256::rainbowtext($string): Just a demonstration on how (not to) use the colors. Displays $string, one character in a different color. channels Channels is a simple plugin to yank lines out of the world window and put then in other windows. It's most obvious use is chat channels, which usually have something like "[NAME]" at the beginning. Once the plugin is loaded, there is only one function to call: channels::new("name", "regex"); where "name" is the name that should appear in the title bar of the new window, and "regex" is the pattern to match for text. Use channels::list() for a list of currently defined channels. To remove a channel, use channel::del(num), where num is the number of the channel. Other Plugins The KCWin plugin allows you to create general purpose windows a terminal for output and an entry box for input. These windows do nothing by themselves, but they can be used by other plugins when they need a window for input and output. Since this plugin is just a helper for other plugins, it is not described here, but rather in . The chat plugin allows peer to peer chat with other users of KildClient and of other clients that support the MudMaster or zChat protocols. It is described in its own chapter, .
Logging the Output Logging can be configured in the World Editor, see , but there are also functions to start and stop logging from the command line. Logging is controlled with the $world->logfile function. The first argument specifies the path to the file where the output is saved. If the file already exists, new text will be appended to it. The file name is passed throught strftime(), so you can log to different files depending on the date and/or time. Also, you can use %Kw in the file name and it will be replaced by the name of the World. And the string %Kc is replaced by the name of the character used in auto-login (see ). (If auto-login was not used, then %Kc is replaced by an empty string.) The second argument, if present, controls the format of the timestamp. If you do not want a timestamp, then do not pass a second argument, pass only the file name. This timestamp argument is a string with control codes. Each control code will be substituted by a part of the time or date. This sequences are the ones of the strftime() C function, so see its man page for the list of control sequences. Here's an example that turns on logging, with a timestamp that shows the date and time: Enabling logging $world->logfile('/home/bob/mud/mudlog.txt', '%b/%d %H:%M:%S> ') To turn off logging, just call logfile with no arguments. There are functions to write arbitrary text to the log file: and . Using the Chat KildClient supports peer to peer chat (that is, you talk directly to the other person, and not via a server, be it a MUD server or a chat server), which allows you to talk to other users of KildClient or other clients that support the MudMaster or zChat protocols (both are supported by KildClient). There are several advantages of chatting directly with the other person: You can chat even if the MUD is down, since the MUD server is not involved. Since the chat is direct, it cannot be snooped by immortals or administrators. The chat is independent from the MUD, so you can chat even if you in a situation in which it would not be possible to talk through the MUD. The chat also supports other features that are not possible through a MUD, such as snooping a session, that is, seeing everything the other player sees in the screen (if they allow you to do so, of course), or sending everything you see to your chat party (if you allow that, of course), or transfering files. These features do not pose a security risk, because they can be disabled and the other person can only see your output if you allow it, and they can only send files if you allow them to. Basic Usage The chat plugin requires the Gtk2 Perl bindings, and also the Perl bindings for the vte library. If you cannot load the plugin and it complains about not finding these bindings, go to http://gtk2-perl.sourceforge.net/ and download them. To load the plugin, enter /$world->loadplugin('chat') in the command entry box. You should see Plugin loaded. If an error happened, you probably do not have the bindings mentioned in the above paragraph. If you want to have the plugin always loaded, you can put that line (without the slash in the beginning) to your script file, and the plugin will loaded whenever you open a World. Now that the plugin is loaded, you have two options: calling somebody or accepting calls from other persons. The first thing you should do is set you chat nickname. To do that, type /chat::setname("nickname"). You only need to do this once, as the chat name will be saved and restored when you open the World again. To accept calls, enter /chat::accept in the command entry box. Other people can now call you. You will need to give them your IP address. Calls are being waited on port 4050, which is the default port for the chat protocols. If you want to listen for connections in another port, just pass that port number as argument, for example, /chat::accept(5000). Be sure to inform other people the port you are using. When somebody wants to chat to you, a dialog box will appear asking if you want to accept the chat. If you want to chat with them, select Yes to establish the chat connection, otherwise click No to deny the chat request. To call somebody, use the call function: enter /chat::call("host"). host is the hostname or IP address of the person you wish to chat with. This command tries connecting to port 4050, if they are using another port, pass that port number as a second argument to the function. You can substitute call for zcall. The later tries using the zChat protocol instead of the default MudMaster protocol. Use the zcall function if you know they support the zChat protocol. If the other person accepts the chat, the connection will be established. Each chat connection has its own window where the text received is displayed, and with an entry box where you can type messages that are sent to the other person. To send something, just enter the message and press ENTER. There are some special commands that can be entered in chat windows, these will be described in the next session. Advanced Features There are other things you can do besides simply chatting. These functions are accessed by typing some commands in the chat window. These commands start with /, but do not confuse them with the usage of / in the main KildClient window to run Perl commands. Here are the commands and their actions: /emote text Sends text as an emote and not as a chat message, that is, sends a message in the form name text. /chatall text Sends text to all chat connections. /emoteall text Sends text as an emote to all chat connections. /group group name Makes this chat connection a member of the specified group. /cg text Sends text to all connections that are members of the group that this chat session belongs. /eg text Sends text as an emote to all connections that are members of the group that this chat session belongs. /name nickname Changes the chat nickname to the one given. This affects all chat sessions. /color code Changes the color used in this chat session to the one specified. code is a color code as recognized by the function. Note that this affects only chat messages and the text you send, if the chat peer sends messages in another color, they will be displayed in the color the peer chose. This affects all chat sessions. /stripansi Strips ANSI color codes in messages received in this chat. That means that colors sent by the peer will not be displayed, and that even incoming messages will be displayed in your chat color. /nostripansi Does not strip ANSI color codes in messages received in this chat. That means that colors sent by the peer will be displayed. /ping Pings the other peer. If the connection is alive, they will reply to this request. Additionally, the time for the reply to be received is displayed. /sendfile Attemps to send a file to the peer. A dialog will be displayed for you to select the file to send, and the file will be offered. If they accept, the file transfer will start. /stopfile Stops the file transfer currently in progress. /snoop Asks the peer if you can snoop them, that is, see everything they see in their MUD session. If they accept, everything they see will be sent to you and displayed. /allowsnoop Allows the peer to snoop you, that is, they can see everything you see in your MUD session. Be careful with this command. By default snooping is not allowed to protect your privacy. /noallowsnoop Disallows the peer to snoop you, that is, they cannot see what you see in your MUD session. By default snooping is disabled, and this command is used to disable it again if you had enabled it. /info Shows some information about the chat session. /hangup Stops this chat session. You will need to connect again to continue talking. As you can see, the chat offers much more than simply chatting. One of its features is file transfer. To send a file, use the /sendfile command, as descrived above. When your peer wants to send you a file, a dialog box will be displayed telling you the name and size of the file. If you want the file, select Yes and another dialog will be displayed for you to you can select where to store the file. The file transfer will then begin. Or you can refuse the file by clicking No. You can interrupt a file transfer in progress by using the /stopfile command. By default, you are prompted whenever somebody wants to talk with you. If you want to avoid this question and automatically accept all chats, set the $chat::auto_accept_calls variable to 1 (that is, enter something like /$chat::auto_accept_calls = 1). This setting will be remembered. Set it to 0 to have the prompts again. If, however, you do not want to chat with anyone, the best thing is to disable accepting connections. Just type /chat::noaccept. Use /chat::acceptcalls to accept calls again. Chat Functions You can also access the chat features via some Perl functions of the chat plugin. Here is a list of these functions: chat::call(host, [port]) Tries connection to host, on port port (or 4050, if not specified), using the MudMaster protocol. chat::zcall(host, [port]) Tries connection to host, on port port (or 4050, if not specified), using the zChat protocol. chat::accept([port]) Starts listening for chat connections on the given port (or 4050 if not specified). chat::noaccept() Stops listening for chat connections. chat::setname(nickname) Sets the nickname used in chat sessions. chat::setcolor(code) Sets the color used in chat sessions. code is a color code as recognized by the function chat::chat(name, text) Sends text to name. chat::emote(name, text) Sends text as an emote to name. chat::chatall(text) Sends text to all chat connections. chat::emoteall(text) Sends text as an emote to all chat connections. chat::group(name, group) Makes the chat connection with name a member of the group group. chat::chatgroup(group, text) Sends text to all connections that are members of the group group. chat::emotegroup(group, text) Sends text as an emote to all connections that are members of the group group. chat::ping(name) Pings the other peer. If the connection is alive, they will reply to this request. Additionally, the time for the reply to be received is displayed. chat::sendfile(name, [file]) Attemps to send a file to the peer. If you do not specify the file, a dialog will be displayed for you to select the file to send. The file will be offered. If they accept, the file transfer will start. chat::stopfile(name) Stops the file transfer currently in progress. chat::snoop(name) Asks name if you can snoop them, that is, see everything they see in their MUD session. If they accept, everything they see will be sent to you and displayed. chat::setallowsnoop(name, value) Sets whether name can snoop you, that is, wheter they can see everything you see in your MUD session, according to value. By default snooping is disabled. chat::info(name) Shows some information about the chat session. chat::setstripansi(name, value) Sets whether to trip ANSI color codes in messages received from name, according to value. If they are, colors sent by the peer will not be displayed, and that even incoming messages will be displayed in your chat color. chat::hangup(name) Stops the chat session with name. You will need to connect again to continue talking. KildClient Programmer's Reference Global Function Reference <function>colorize</function> $color = colorize str Replaces color codes (see below) in the string with ANSI escape sequences,so that the string can be echoed in the terminal, for example. Returns the colorized string. Color code table (based on colors used by the Smaug server): &0 (number zero) - Reset all attributes and colors to default Normal colors: &x - Black &r - Red &g - Green &O - Yellow &b - Blue &p - Magenta &c - Cyan &w - White &d - Default foreground Bold colors: &z - Bold Black &R - Bold Red &G - Bold Green &Y - Bold Yellow &B - Bold Blue &P - Bold Magenta &C - Bold Cyan &W - Bold White &D - Default bold foreground Background colors: ^x - Black ^r - Red ^g - Green ^O - Yellow ^b - Blue ^p - Magenta ^c - Cyan ^w - White ^d - Default background Light background colors (sometimes causes blinking): ^z - Light Black ^R - Light Red ^G - Light Green ^Y - Light Yellow ^B - Light Blue ^P - Light Magenta ^C - Light Cyan ^W - Light White ^D - Default light background Attributes: (may not work on other clients) &_ - Underline on ^_ - All underline off &= - Double underline on &| - Strikethrough on ^| - Strikethrough off &/ - Italics on ^/ - Italics off &i - Inverse video on ^i - Inverse video off &h - Hidden mode on ^h - Hidden mode off Note: if you want to set both the foreground and the background, the code for the foreground should come first. If you want to set the foreground and/or background and one or more attributes (underline, italics, etc), the attribute settings should come after the color. Note : to insert a & or ^ character, use && and ^^, respectively. You can also also use colorize() to display text in any color of a 6x6x6 RGB color cube. To do so, use &rgbX and ^rgbX to set the foreground and background, respectively. r, g, and b are integers between 0 and 5 representing the amount of red, green and blue. X is really the letter X, it is used to close the code. Finally, to select one of the 24 shades of gray available, use &nG and ^nG for the foreground and background, respectively, where n is an integer from 0 to 23, and G is really the letter G. You can use the kc256 (see ) plugin to display all the colors for you to choose from. <function>getversion</function> $version = getversion This functions returns the version number of KildClient. <function>getworld</function> $var = getworld "name" Returns a variable that points to the open world with the given name. You can then manipulate that world with the returned variable (by calling functions that operate on worlds with that variable). For example: Quitting from another world $coolmud = getworld("CoolMud"); $coolmud->send("quit"); This will send "quit" to the CoolMud world. <function>gotow</function> void gotow number void gotow name Focuses the Nth world (when called with a number) or the world with the given name (when called with a string). The first world is numbered 0. <function>help</function> void help "function" Displays help for the given function. The name of the function is passed as a string, so it must be in quotes. <function>play</function> void play file This function plays a sound file. The argument is the path to the file. <function>quit</function> void quit Disconnects and closes all Worlds and KildClient exits. <function>stripansi</function> $stripped = stripansi str Returns the string stripped of any ANSI sequences that it had. <function>stripcolorize</function> $stripped = stripcolorize str Returns the string stripped of any sequences used by to add color to it. $window Reference $windown is a variable that is always present and points to the current window. It is an object of class Window, and is opaque, that is, all interaction with it should be done via its functions, and not via its members. The sections below describe the functions available for the $window variable. <function>getsize</function> ($lines, $columns) = $window->getsize $columns = $window->getsize This functions returns the current size of the window (in characters), in terms of lines and columns. It can return both dimensions, or just the number of columns. <function>minimize</function> void $window->minimize This function minimized KildClient's main window. Called from a macro, it makes a nice boss key. :-) <function>settitle</function> void $window->settitle "new title" Sets the title of the window to the given string. <function>seturgencyhint</function> void $window->seturgencyhint boolean Sets the value of the window's "urgency" flag to true or false. This is a request for attention to the window, and usually will make the window title flash. However note that the actual behavior depends on the window manager used. $world Reference $world is a variable that is always present and points to the current World. It is an object of class World, and is opaque, that is, all interaction with it should be done via its functions, and not via its members. The sections below describe the variables and attributes available for the $world variable. <varname>$world->{SILENT}</varname> If this attribute is set to a true value (such as 1), some messages are not displayed, especifically the messages "Trigger added", "Trigger modified", "Trigger deleted", "Trigged moved", and the corresponding messages for the other objects: aliases, macros, timers, hooks, permanent variables and plugins. <function>$world->alias</function> void $world->alias pattern substitution [attributes] void $world->alias number [pattern [substitution]] [attributes] Creates a new alias, or edits the alias identified by number. Entered commands will be matched against pattern (a Perl regular expression), and if the pattern matches, the given substitution will be applied. (In a s/pattern/substitution/ structure.) Be careful that any part of the command can match. To match only the exact string, use something like '^command$'. To match only in the beginning of the line, use '^command'. Atributes is a reference to a hash defining attributes for the alias. Generally the call works like this: $world->alias("pattern", "action", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: pattern: The pattern to match. substitution: The substitution to do. ignorecase: If value evaluates to true, ignore case when matching the pattern. perleval: If true, the substitution is made passing the "e" flag (s/pattern/substitution/e), so substitution should be actually Perl statements to be evaluated when there is a match. enabled: If value evaluates to true, the alias is enabled, if false, it is disabled and commands are not matched against it. name: Assigns a name to the alias, so that it can be referenced by name. <function>$world->close</function> void $world->close Disconnects and closes the current world, immediately. <function>$world->aliasenabled</function> result = $world->aliasenabled name/number This functions checks whether the specified alias exists and whether it is enabled. You can pass either a alias number or name. If the alias does not exist, this function returns undef, so you can distinguish the case of a non-existant alias from a disabled one. If the alias exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several aliases with the same name, it returns a list with one value for each alias with that name, and each value is 0 or 1 depending on the state of the alias. <function>$world->commandecho</function> void $world->commandecho boolean $status = $world->commandecho When used with an argument, this sets the command echo option for the current world to the given value (which should be false to cause commands not to be echoed or true to cause them to be echoed). For more details of the command echo option, see If called without arguments, it doesn't change the status of that option, but returns its current value. <function>$world->connectother</function> void $world->connectother This function allows you to select another World to connect to, using the same window. If you are connected, you will be first disconnected from the current server. <function>$world->dc</function> void $world->dc Disconnects from the current world. <function>$world->delalias</function> $n = $world->delalias number/name Deletes the alias identified by the given number or name. If there are several aliases with the same name, deletes them all. Returns the number of aliases deleted. <function>$world->delhook</function> $n = $world->delhook event number/name Deletes the hook identified by the given number or name, connected to the specified event. If there are several hooks with the same name, deletes them all. Returns the number of hooks deleted. <function>$world->delmacro</function> $n = $world->delmacro number/name Deletes the macro identified by the given number or name. If there are several macros with the same name, deletes them all. Returns the number of macros deleted. <function>$world->deltimer</function> $n = $world->deltimer number/name Deletes the timer identified by the given number or name. If there are several timers with the same name, deletes them all. Returns the number of timers deleted. <function>$world->deltrigger</function> $n = $world->deltrigger number/name Deletes the trigger identified by the given number or name. If there are several triggers with the same name, deletes them all. Returns the number of triggers deleted. <function>$world->disalias</function> void $world->disalias number/name ... Disables the alias identified by number or name. If there are several aliases with the same name, disables them all. Several arguments can be passed at once. <function>$world->dishook</function> void $world->dishook event number/name ... Disables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, disables them all. Several arguments can be passed at once. <function>$world->dismacro</function> void $world->dismacro number/name ... Disables the macro identified by number or name. If there are several macros with the same name, disables them all. Several arguments can be passed at once. <function>$world->displugin</function> void $world->displugin name Disables the specified plugin. <function>$world->distimer</function> void $world->distimer number/name ... Disables the timer identified by number or name. If there are several timers with the same name, disables them all. Several arguments can be passed at once. <function>$world->distrigger</function> void $world->distrigger number/name ... Disables the trigger identified by number or name. If there are several triggers with the same name, disables them all. Several arguments can be passed at once. <function>$world->echo</function> void $world->echo str ... Prints the strings in the terminal window. They are not sent to the world. See also , . <function>$world->echonl</function> void $world->echonl str ... Prints the strings in the terminal window, each followed by a newline. They are not sent to the world. See also , . <function>$world->echonlandlog</function> void $world->echonlandlog str ... This is a convenience function that just calls and for each argument, thus writing the given line(s) to the screen and to the log file. <function>$world->enaalias</function> void $world->enaalias number/name ... Enables the alias identified by number or name. If there are several aliases with the same name, enables them all. Several arguments can be passed at once. <function>$world->enahook</function> void $world->enahook event number/name ... Enables the hook identified by number or name, connected to the given event. If there are several hooks with the same name, enables them all. Several arguments can be passed at once. <function>$world->enamacro</function> void $world->enamacro number/name ... Enables the macro identified by number or name. If there are several macros with the same name, enables them all. Several arguments can be passed at once. <function>$world->enaplugin</function> void $world->enaplugin name Enables the specified plugin. <function>$world->enatimer</function> void $world->enatimer number/name ... Enables the timer identified by number or name. If there are several timers with the same name, enables them all. Several arguments can be passed at once. <function>$world->enatrigger</function> void $world->enatrigger number/name ... Enables the trigger identified by number or name. If there are several triggers with the same name, enables them all. Several arguments can be passed at once. <function>$world->expandalias</function> $result = $world->expandalias "string" This function expands aliases in the string passed as argument. The result is what you would get if you typed "string" in the input box (except that aliases are still expanded even if Disable Aliases is selected in the Preferences menu). <function>$world->gag</function> void $world->gag pattern Adds a gag that prevents lines matching pattern from being shown. See the function for more advanced options. <function>$world->getaliasnumber</function> @list = $world->getaliasnumber name Returns a list with the number(s) of the alias(es) matching the given name. If no alias with that name is found, returns an empty list. If there are several aliases with the same name, returns the numbers of all of them. The number of an alias is necessary to edit it. However, as the user can change the order of aliases, create new ones and delete old aliases, an alias's number may change, so you should not store its number; you must fetch the number just before editing it. <function>$world->getcharacter</function> $name = $world->getcharacter If autologin was used (see ), this function returns the name of the character used to log in to the mud. If autologin is disabled, this function returns undef. <function>$world->getconntime</function> $seconds = $world->getconntime This function returns the time spent connected to the world, in seconds. <function>$world->getentryfont</function> $font = $world->getentryfont This function returns the name of the font used in the command entry box. <function>$world->gethooknumber</function> @list = $world->gethooknumber event name Returns a list with the number(s) of the hook(s) matching the given name. If no hook with that name is found, returns an empty list. If there are several hooks with the same name, returns the numbers of all of them. You must specify the event in which to search for the hook. The number of a hook is necessary to edit it. However, as the user can change the order of hooks, create new ones and delete old hooks, a hook's number may change, so you should not store its number; you must fetch the number just before editing it. <function>$world->getidletime</function> $seconds = $world->getidletime This function returns the idle time, that is, the time elapsed since the last command was sent, in seconds. See for information on how that time is calculated and how to configure it. <function>$world->getkeycode</function> $keycode = $world->getkeycode After running this function, press a key (or a combination of keys). The keycode (to be used in the function) will be returned and also printed in the screen. <function>$world->getline</function> $text = $world->getline line ($text, $time) = $world->getline line This functions allows you to retrieve a line from the scrollback buffer, and optionally the time in which it was received. line can be a positive number, representing the number of the line to fetch, or a negative number. If negative, that means that number of lines counting from the bottom. (That is, -1 is the last received line, -2 the one before the last, and so on.) If the line cannot be retrieved (because it is not stored anymore), returns undef. The time returned is represented as the number of seconds since the epoch, the same kind of value the time function would return. <function>$world->getlogfile</function> $file = $world->getlogfile This function returns the name of the file to which the output is being logged, or undef if logging is not started for the world. <function>$world->getmacronumber</function> @list = $world->getmacronumber name Returns a list with the number(s) of the macro(s) matching the given name. If no macro with that name is found, returns an empty list. If there are several macros with the same name, returns the numbers of all of them. The number of a macro is necessary to edit it. However, as the user can change the order of macros, create new ones and delete old macros, a macro's number may change, so you should not store its number; you must fetch the number just before editing it. <function>$world->getmainfont</function> $font = $world->getmainfont This function returns the name of the font used in the main MUD window, that is, where the output of the world appears. <function>$world->getname</function> $name = $world->getname This function returns the name of the world. <function>$world->getpluginversion</function> $version = $world->getpluginversion name This functions returns the version of the plugin with the given name. If no plugin with that name is loaded, it returns an empty string. <function>$world->gettimernumber</function> @list = $world->gettimernumber name Returns a list with the number(s) of the timer(s) matching the given name. If no timer with that name is found, returns an empty list. If there are several timers with the same name, returns the numbers of all of them. The number of a timer is necessary to edit it. However, as the user can change the order of timers, create new ones and delete old timers, a timer's number may change, so you should not store its number; you must fetch the number just before editing it. <function>$world->gettriggernumber</function> @list = $world->gettriggernumber name Returns a list with the number(s) of the trigger(s) matching the given name. If no trigger with that name is found, returns an empty list. If there are several triggers with the same name, returns the numbers of all of them. The number of a trigger is necessary to edit it. However, as the user can change the order of triggers, create new ones and delete old triggers, a trigger's number may change, so you should not store its number; you must fetch the number just before editing it. <function>$world->hook</function> void $world->hook event action [attributes] void $world->hook event number [action] [attributes] A hook is an action that is connected to an event, such as connecting to the World or the window receiving focus. This functions allow you to define a hook for a given event, that will execute action, or to edit the hook identifyed by number. Here are the events currently supported: OnConnect: This hook is execued when a connection to the world is made, after the auto-logon has taken place (if applicable). OnDisconnect: This hook is executed when you are disconnected from a World, after the connection has been closed. OnReceivedText: Executed when text is received from the world. OnSentCommand: Executed after a command is sent to the world. The command is available for the hook in the $hookdata variable, and can be inspectd in Perl scripts. OnGetFocus: Executed when the KildClient window receives the focus. OnLoseFocus: Executed when the KildClient window loses the focus. OnCloseConnected: Executed when the world is forcedly closed. This can happen using the World Close menu, the $world->close() function, or by quitting the program with the world connected. You can put in this hook, for example "quit" to always exit the MUD nicely, even if you close the world by mistake. atributes is a reference to a hash defining attributes for the hook. Generally the call works like this: $world->hook("event", "action", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: action: The action to be executed. enabled: If value evaluates to true, the hook is enabled. If it evaluates to false, the hook is disbled and is not executed. name: Assigns a name to the hook, so that it can be referenced by name. <function>$world->hookenabled</function> result = $world->hookenabled event name/number This functions checks whether the specified hook exists and whether it is enabled. The first argument is the name of the event. For the second, you can pass either a hook number or name. If the hook does not exist, this function returns undef, so you can distinguish the case of a non-existant hook from a disabled one. If the hook exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several hooks with the same name, it returns a list with one value for each hook with that name, and each value is 0 or 1 depending on the state of the hook. <function>$world->interpret</function> $world->interpret "string" This function interprets the string as if it were typed in the input box: commands are split, Perl code is run, aliases are expanded, etc. <function>$world->ispermanent</function> $return = $world->ispermanent var This function tests if a variable is permanent. The return value is true or false depending on the variable's status. The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation. <function>$world->listalias</function> void $world->listalias Briefly lists all defined aliases. void $world->listalias number/name ... Lists detailedly the alias with the given number or name. If there are several aliases with the same name, lists them all. Several arguments can be passed at once. <function>$world->listhook</function> void $world->listhook event This function briefly lists all hooks connected to the given event. void $world->listhook event number/name ... Lists detailedly the hook with the given number or name, connected to the specified event. If there are several hooks with the same name, lists them all. Several arguments can be passed at once. <function>$world->listmacro</function> void $world->listmacro Briefly lists all defined macros. void $world->listmacro number/name ... Lists detailedly the macro with the given number or name. If there are several macros with the same name, lists them all. Several arguments can be passed at once. <function>$world->listpermanent</function> void $world->listpermanent This function prints a list of all variables that are defined as permanent, that is, variables that will be saved when you close the world and have their values restores when the world is re-opened. <function>$world->listplugin</function> void $world->listplugin Briefly lists all loaded plugins. void $world->listplugin name/number Gives detailed information on the given plugin. <function>$world->listtimer</function> void $world->listtimer Briefly lists all defined timers. void $world->listtimer number/name ... Lists detailedly the timer with the given number or name. If there are several timers with the same name, lists them all. Several arguments can be passed at once. <function>$world->listtrigger</function> void $world->listtrigger Briefly lists all defined triggers. void $world->listtrigger number/name ... Lists detailedly the trigger with the given number or name. If there are several triggers with the same name, lists them all. Several arguments can be passed at once. <function>$world->loadplugin</function> $success = $world->loadplugin name $success = $world->loadplugin file Loads a plugin. You can either pass a full path for the file that defines the plugin, or just its name. If you provide only the name, a file with that name (and the extesion .pl, if the extension is not already provided) will be looked for in the directories specified by the @PLUGINDIRS array. By default, this array contain two directories: one where KildClient stores some of its files (generally /usr/local/share/kildclient/plugins) and one in the user's home directory (~/.kildclient/plugins), but feel free to add more directories to search plugins for. This function returns true if the plugin was successfully loaded, and false otherwise (including the case in which the plugin was already loaded). See also for a way to load a plugin unless it is already loaded. <function>$world->logfile</function> void $world->logfile file [timeformat] Starts logging to the given file. Everything output by the mud will be saved. If timeformat is specified, it is considered a string to be passed to the C strftime() function, with special tags that are replace with the current time and/or date, and the resulting string is prefixed to each line. (See the strftime manual page for the possible tags.) If this argument is not given, nothing is prefixed to the lines. It is not possible to log to more than one file at one time, if there is already a log file open, it will be closed and logging will continue to the new file. void $world->logfile With no arguments, this function stops logging output. <function>$world->macro</function> void $world->macro keycode action [attributes] void $world->macro number [keycode [action]] [attributes] Creates a new macro, or edits the macro identified by number. keycode represents a key such as "KP_Home" or "<Control>F12". The format is the one accepted by the GTK+ function gtk_accelerator_parse(), but most of the time you will want to use the function to retrieve the keycode for a given key. action is what will be executed when the key (or keys) is pressed. Atributes is a reference to a hash defining attributes for the macro. Generally the call works like this: $world->macro("keycode", "action", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: key: The key code. action: The action to be executed. enabled: If value evaluates to true, the macro is enabled, if false, it is disabled and is not run if the key is pressed. name: Assigns a name to the macro, so that it can be referenced by name. <function>$world->macroenabled</function> result = $world->macroenabled name/number This functions checks whether the specified macro exists and whether it is enabled. You can pass either a macro number or name. If the macro does not exist, this function returns undef, so you can distinguish the case of a non-existant macro from a disabled one. If the macro exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several macros with the same name, it returns a list with one value for each macro with that name, and each value is 0 or 1 depending on the state of the macro. <function>$world->movetimer</function> void $world->movetimer number/name new_pos Moves the timer with the given name or number so that it occupies the position new_pos after execution of this function. Other timers might be moved up or down in result of this. If new_pos is negative or greater than the number of timers, the timer is moved to the last position. If there are several timers with the given name, only the first one found is moved. <function>$world->makepermanent</function> void $world->makepermanent var ... This function marks one or more variables as permanent, that is, the values of these variables will be saved when the world is closed, and reloaded when the World is opened, thus keeping their values between successive uses of the World. The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation. <function>$world->maketemporary</function> void $world->maketemporary var ... This function marks one or more variables as temporary, that is, the values of these variables will not be saved when the World is closed. This is the standard behaviour for variables, so this function is only needed to undo the efects of the function. The names of the variables are passed as a string, including the $, @ or % prefix. Be careful to use single quotes (or \ inside double quotes) to avoid variable interpolation. <function>$world->mlsend</function> success = $world->mlsend attributes This functions emulates the Multi-line Send feature (see ) from perl scripts. Several lines can be sent at once, optionally prefixing and/or suffixing each line with text you specify. It's also possible to send the contents of a file to the MUD. The lines can be sent with customized intervals between them (so as not to cause buffer overflows that lead to a disconnection from the server). atributes is a reference to a hash defining attributes for the timer. Generally the call works like this: $world->mlsend({ attribute1 => value1, attribute2 => value2, ... }) Possible attributes: initialtext: Lines of text to be sent to the MUD before anything else. You can specify this argument in two ways: one is as a string composed of several lines, KildClient will split the string and send each line separately. The second option is to pass a reference to an array, where each element is a line. The following two call are thus equivalent: $world->mlsend({ initialtext => "First line\nSecond line\nLast line" }) $world->mlsend({ initialtext => [ "First line", "Second line", "Last line" ]}) file: The path to a file whose contents are to be sent, line by line, after sending the initialtext (if present), but before sending finaltext. finaltext: Lines to be sent after the file contents has been sent (if a file was specified). This is very similar to initialtext, and can be given also as a multi-line string or as a reference to an array of lines. linestart: If present, specifies a string that is prepended to each line as it is sent to the MUD. lineend: If present, specifies a string that is appended to each line as it is sent to the MUD. delay: The delay, in seconds, between each group of lines. If you are getting disconnected for sending too much text at once, increase this value. If not given, the value is taken from the Global Preferences (see ). linesatime: The number of lines to be sent at a time. If not given, the value is taken from the Global Preferences (see ). On success, returns true. If the file does not exist or cannot be open, this function does nothing and returns a false value. It returns undef if invalid parameters are specified. You might also want to see the and functions which are simpler ways of sending several lines or the contents of a file at once, respectively. <function>$world->movealias</function> void $world->movealias number/name new_pos Moves the alias with the given name or number so that it occupies the position new_pos after execution of this function. Other aliases might be moved up or down in result of this. If new_pos is negative or greater than the number of aliases, the alias is moved to the last position. If there are several aliases with the given name, only the first one found is moved. <function>$world->movehook</function> void $world->movehook event number/name new_pos Moves the hook with the given name or number, connected to the given event, so that it occupies the position new_pos after execution of this function. Other hooks might be moved up or down in result of this. If new_pos is negative or greater than the number of hooks, the hook is moved to the last position. If there are several hooks with the given name, only the first one found is moved. <function>$world->movemacro</function> void $world->movemacro number/name new_pos Moves the macro with the given name or number so that it occupies the position new_pos after execution of this function. Other macros might be moved up or down in result of this. If new_pos is negative or greater than the number of macros, the macro is moved to the last position. If there are several macros with the given name, only the first one found is moved. <function>$world->movetrigger</function> void $world->movetrigger number/name new_pos Moves the trigger with the given name or number so that it occupies the position new_pos after execution of this function. Other triggers might be moved up or down in result of this. If new_pos is negative or greater than the number of triggers, the trigger is moved to the last position. If there are several triggers with the given name, only the first one found is moved. <function>$world->next</function> void $world->next [number] If used without arguments, this function focuses the next open World. You can also give a numeric argument X, in this case it focuses the Xth World after the current one. <function>$world->path</function> void $world->path str str is a string defining a path. The following example shows the features of paths: 3n2e4n2e{ne}e{open door}3n The general syntax syntax is "<number of repetitions><command>". "<number of repetitions>" can be omitted, in this case it is considered as 1. command is the command that will be repeated. If it is not a one-letter command, it should be enclosed in braces ({}). The example above would generate these commands: n n n e e n n n n e e ne e open door n n n The commands are send using the settings in the Sending tab of the Preferences dialog (see ). <function>$world->prev</function> void $world->prev [number] If used without arguments, this function focuses the previous open world. You can also give a numeric argument X, in this case it focuses the Xth world before the current one. <function>$world->reconnect</function> void $world->reconnect When in offline mode, this function will attempt to reconnect to the mud. <function>$world->requireplugin</function> $success = $world->requireplugin name This function is similar to , but first checks if the plugin is already loaded. If it is, it returns successfully. If not, it tries loading the plugin (silently). If this succeeds, the function returns successfully, if not, it die()'s. This function is useful in plugins that require other plugins, and is meant to be called in a BEGIN block of a plugin that requires another. The argument passed must be the name of the plugin (a path to the file is not allowed, unlike with . See for information on how plugins are found. <function>$world->save</function> void $world->save Saves the current World. <function>$world->send</function> void $world->send str ... Sends any number of strings to the current world. After each string, a newline is send, so that the MUD recognizes it as a command. See also , and . <function>$world->sendecho</function> void $world->sendecho str ... Sends any number of strings to the current world. After each string, a newline is send, so that the MUD recognizes it as a command. The commands are always echoed to the window, regardless of the setting of the command echo option (see ). See also and . <function>$world->sendfile</function> success = $world->sendfile file [delay [n-lines]] Sends the contents of the given file to the world. delay is the number of seconds to wait between sending each group of lines, and n-lines is the number of lines to send a time. If these values are not specified, they are taken from the defauls set in the Preferences dialog (see ). On success, returns true. If the file does not exist or cannot be open, this function does nothing and returns a false value. It returns undef if the file name is not specified. For more options, see the function which allows adding a text before and/or after each line, and sending lines before and/or after sending the contents of the file. <function>$world->sendlines</function> success = $world->sendlines "multi-line string" [delay [n-lines]] success = $world->sendlines [ "line 1", "line 2", ... ] [delay [n-lines]] Sends several lines of text to the world. delay is the number of seconds to wait between sending each group of lines, and n-lines is the number of lines to send a time. If these values are not specified, they are taken from the defauls set in the Preferences dialog (see ). There are two ways to specify the lines to be sent: the first is passing a multi-line string, which is split into lines and each line is sent separately. The second one is passing a reference to an array where each element consists of one line. This function always returns true. For more options, see the function which allows adding a text before and/or after each line, and sending lines before and/or after sending the contents of the file. <function>$world->sendnoecho</function> void $world->sendnoecho str ... Sends any number of strings to the current world. After each string, a newline is send, so that the MUD recognizes it as a command. The commands are not echoed to the window, regardless of the setting of the command echo option (see ). See also and . <function>$world->setstatus</function> void $world->setstatus text Sets the text in the main window status bar to the given text. <function>$world->timer</function> void $world->timer attributes void $world->timer number attributes Creates a new timer, or edits the timer identified by number. atributes is a reference to a hash defining attributes for the timer. Generally the call works like this: $world->timer({ attribute1 => value1, attribute2 => value2, ... }) Possible attributes: interval: Number of seconds between each execution. Required. count: Number of times to execute the timer. After this number of executions, the timer will be automatically disabled or deleted (see temporary flag below). If count is not given or count is -1, the timer repeats until manually disabled or deleted. action: The action to execute. Required. temporary: If set to 1, the timer will be deleted (and not only disabled) after count executions have happened. enabled: If set to 1, the timer is enabled and will execute every count seconds. If set to 0, the timer does not execute until enabled again. New timers are created enabled by default. name: Assigns a name to the timer, so that it can be referenced by name. <function>$world->timerenabled</function> result = $world->timerenabled name/number This functions checks whether the specified timer exists and whether it is enabled. You can pass either a timer number or name. If the timer does not exist, this function returns undef, so you can distinguish the case of a non-existant timer from a disabled one. If the timer exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several timers with the same name, it returns a list with one value for each timer with that name, and each value is 0 or 1 depending on the state of the timer. <function>$world->trigger</function> void $world->trigger pattern action [attributes] void $world->trigger number [pattern [action]] [attributes] Creates a new trigger, or edits the trigger identified by number, matching pattern (a Perl regular expression), that will execute action when a line is matched by pattern. action is interpreted as if it were typed in the command box. Simple strings get sent to the world, Perl code can be run by prefixing it with '/', etc. atributes is a reference to a hash defining attributes for the trigger. Generally the call works like this: $world->trigger("pattern", "action", { attribute1 => value1, attribute2 => value2, ... }) Possible attributes: pattern: The pattern to match. action: The action to be executed. enabled: If value evaluates to true, the trigger is enabled. If it evaluates to false, the trigger is disbled and lines are not matched against it. name: Assigns a name to the trigger, so that it can be referenced by name. ignorecase: If value evaluates to true, ignore case when matching the pattern. gag: If value evaluates to true, the line that triggered it is not printed. gaglog: If value evaluates to true, the line that triggered it is not written to the log file. keepexecuting: If the value evaluates to true, when a line matches the trigger, the actions for the trigger are executed, and matching of the line continues against other triggers. If this is false (the default), when this trigger matches no other triggers are matched. rewriter:This trigger is a rewriter trigger. It is run before other triggers, does not prevent any other trigger from running (even if keepexecuting is false), and can alter the input line for further processing by changing the $colorline variable. For more details, see . style: Used to control the changing of styles (color, attributes, etc.) of a matched part of the line. The value of this attribute is an anonymous hash that specifies everything that is to be changed. Here's an example: Changing styles with triggers $world->trigger('Joe', { name => 'joe', style => { enabled => 1, fg => 16 } }); These are the valid attributes: enabled: Set this to 1 to enable changing the style. target: What to highlight. Possible values are: -1 - The whole matched line 0 - The whole substring that matched 1 - The first captured substring 2 - The second captured substring 3 - etc. fg: What to do with the foreground colour. -1 means not to change it. Other values change to the given color, as follows: 0 - black 9 - black (bold) 1 - red 10 - red (bold) 2 - green 11 - green (bold) 3 - yellow 12 - yellow (bold) 4 - blue 13 - blue (bold) 5 - magenta 14 - magenta (bold) 6 - cyan 15 - cyan (bold) 7 - white 16 - white (bold) 8 - the default color 17 - default bold color bg: What to do with the background color. The values are the same as for the foreground color. italics: Italics setting. -1 means do not change. 0 means to not use italics, and 1 means to use it. strike: Strike-thru setting. -1 means do not change. 0 means disable it, and 1 means enable it. underline: Underline setting. -1 means no change. 0 means no underline. 1 means single underline, and 2 means double underline. <function>$world->triggerenabled</function> result = $world->triggerenabled name/number This functions checks whether the specified trigger exists and whether it is enabled. You can pass either a trigger number or name. If the trigger does not exist, this function returns undef, so you can distinguish the case of a non-existant trigger from a disabled one. If the trigger exists, then the function returns 0 or 1 depending on whether it is enabled or not. If you pass a name, and there are several triggers with the same name, it returns a list with one value for each trigger with that name, and each value is 0 or 1 depending on the state of the trigger. <function>$world->writetolog</function> void $world->writetolog str ... Writes the given line to the log file, if any. If logging is not currently enabled, then this function does nothing. Each argument is a complete line, that is written preceded by a timestamp, if this is enabled, to the log file. If the string has ANSI codes or codes used by the function, they will be stripped and not written to the log file. See also . Using KCWin for Input/Output Windows KCWin is a standard plugin distributed with KildClient that allows you to create windows with a terminal for output and an entry box for input. These windows do nothing by themselves, but they can be used by other plugins when they need a window for input and output. The output area supports ANSI colors and thus is like a mini MUD window. This plugin requires the gtk2-perl bindings. It will fail to run if these bindings are not found. This plugin is more often used as a helper for other plugins. A plugin that uses KCWin should use $::world->requireplugin('KCWin') in a BEGIN block, as described in . Use KCWin->new to create a new window. KCWin derives from Gtk2::Window so you can use all of its methods. The widgets are accessible for customization. If $kcw is a KCWin, the following widgets are available: $kcw->{VBOX}, Gtk2::VBox, the vertical box that contains the output and input areas. $kcw->{SCROLLWIN}, Gtk2::ScrolledWindowGtk2::ScrolledWindow, this holds the TextView that is used for output. $kcw->{TEXTVIEW}, Gtk2::TextView, is the widget used for output. $kcw->{TEXTBUFFER}, Gtk2::TextBuffer, for convenience, the TextBuffer displayed in the window. $kcw->{CMDAREA}, Gtk2::HBox, a box that holds a button to clear the input area, and the input area itself. $kcw->{BTNCLEAR}, Gtk2::Button, a button that clears the input entry widget when clicked. $kcw->{ENTRY}, Gtk2::Entry, the input entry widget. Connect to the activate signal of this widget to do something when the user presses ENTER in this widget. The widgets can be used, and the window can be customized (by adding other widgets, for example). Some common actions have functions in KCWin as a shortcut. These functions will be described in the following sections. Changes from Previous Versions KCWin version 1.x used a Gnome2::Vte::Terminal for output (the same widget that was used in the main KildClient window). KCWin version 2.x (which comes with KildClient 2.x) has changed that in favour of a Gtk2::TextView (to match a change in the main KildClient program). If you never used the KCWin->{VTE} variable directly, you will not need to change anything in your plugins that use KCWin. If you did, you will probably have to change some things. The new Gtk2::TextView widget is accessible via KCWin->{TEXTVIEW}, as described above. Another feature that has been added is a Clear button just like in the MUD windows, which clears the entry widget. However, most plugins should not need to do anything to adapt themselves to that. Finally, because of the changes, some more widgets are present in the window, and accessible via elements of the hash that holds a KCWin. These widgets are responsible for the layout of the window. <function>KCWin::get_text</function> $text = KCWin::get_text Returns the text in the entry box. <function>KCWin::set_text</function> void KCWin::set_text $text Sets the text in the entry box. <function>KCWin::feed</function> void KCWin::feed $text Appends text to the output terminal widget. $text can contain ANSI color sequences. The function can be useful in conjuntion with this function. Writing Plugins This appendix will describe how you can write your own plugins for KildClient. It will describe the format of the plugin file, what it should have, and some guidelines that all plugins should follow. The first thing to decide when writing a plugin is the name. Since each plugin defines a Perl package, the name should be a valid name for a Perl package. Moreover, it is a good practice to name the plugin file with the name of the plugin (although the name of the file could be different), so stick with letters, numbers, and the underscore. It should not start with an underscore, however, because all identifiers that start with an underscore are understood to be interal of KildClient. The File Format The plugin file is just a Perl file that is read and run by KildClient when the plugin is loaded. This file can call KildClient's functions to add triggers, aliases, macros or timers, to set permanent variables, etc. It usually also defines new subroutines for use in the triggers, etc, or to be called directly by the user. However, the plugin file must with a header, which has a fixed format. If the header is not in this format, the plugin will not be recognized. The header is shown in .
The Plugin Header package NAME; #: Version: VERSION #: Description: ONE LINE DESCRIPTION #: Author: AUTHOR'S NAME (OPTIONAL)
The first line defines the plugin's name, which will be used to refer to it later. It also starts a Perl package. All plugins define a package, so that one plugin's functions do not interfere with other plugin's ones. The second line specifies the plugin's version. This is most informative, but is also used by KildClient to ensure that only one version of the plugin is loaded. Next, there comes a short one-line description of the plugin. It should be brief but descriptive, and it is shown in the output of the $world->listplugin function. Finally, it is possible to inform the author of the plugin. This line, however, is not required, but the author's name will appear in the plugin listing if it is informed. After that, comes the plugin code. This is just Perl code, executed by KildClient when the plugin is loaded (with do).
A Sample Plugin Here is a simple but complete plugin. It will be used to illustrate many things about plugins. A Sample Plugin package sample; #: Version: 1.0 #: Description: A Sample Plugin #: Author: Eduardo M Kalinowski $::world->trigger('First', 'of the plugin', { name => 'sample:misc' }); $::world->trigger('Second', 'of the plugin', { name => 'sample:misc' }); $::world->timer({ interval => 5, action => 'sample plugin', name => 'sample:misc' }); $::world->macro('F8', '/sample::stop', { name => 'sample:enadis' }); $::world->macro('F9', '/sample::start', { name => 'sample:enadis' }); sub testplugin { $::world->echonl("The plugin works."); } sub stop { $::world->distimer('sample:misc'); } sub start { $::world->enatimer('sample:misc'); } sub help { $::world->echonl("This is a sample plugin, that does nothing useful."); $::world->echonl("It outputs a short string every now and them. This"); $::world->echonl("behaviour can be stopped by pressing the F8 key, and"); $::world->echonl("re-enabled with the F9 key."); $::world->echonl("One function is defined: sample::testplugin. It"); $::world->echonl("outputs something to show that the plugin is working."); } The first thing in the file is the header, in the format described above. then comes trigger, timer, and macro definitions. All definitions of triggers, aliases, macros, timers, hook and permanent variables, if any, should be in the top-level scope (which means they will be executed when the plugin is loaded). (Alternatively, you could put them in a BEGIN block, which would have the same result, but there isn't a reason for that.) You should not create any of those objects in any function. It should be noted that the $world variable is refereed as $::world. It is just because we are inside a package, and $world does not belong to this package. Otherwise, the calls are equal. After that, some functions are defined. testplugin is meant to be called by the user. stop and start are used by the macros (but they could also be called by the user). Finally, a help is defined, that outputs some information about the plugin. All plugins should define a help describing themselves. Disposing Data When the Plugin Is Unloaded If the plugin defines a function called UNLOAD, this function will be called when the plugin is unloaded. Currently this happens only when the World that loaded the plugin is closed. If your plugin must dispose of anything it created that would be kept behind even when the World is closed, the UNLOAD function is the place to do that. Enabling and Disabling Plugins As described in , the user can enable or disable plugins. By default, disabling a plugin means disabling all its triggers, macros, aliases, hooks and timers, and enabling a plugin means enabling all the above items. Most of the times that is enough, but for some plugins this naive approach may not be appropriate. One such case is when a plugin has some triggers (or any other kind of item) that is not necessarily always enabled, and whose status is set by some other means. In these cases, you can define two functions named ENABLE and DISABLE. These will be called when the plugin is being enabled and disabled, respectively, and you can do whatever is necessary in there. If these functions are defined, then the standard behaviour (enabling or disabling all items) is not done, and you must do whatever is necessary by yourself. Also, no message is printed, so you might want to print some informative message. The functions should return a true value to indicate success. If for some reason the operation could not be done and the status should not be changed, return a false value and the status of the plugin will not be altered. But use this feature with care. If the functions are not defined, then the default behavior described above is used. So if your plugin doesn't have special needs, you do not need to define these functions. Conditional Loading of Plugins If your plugin depends on some condition to be successfully loaded, you should include a test for whatever is required in a BEGIN block, and if the conditions are not present, you should call the Perl die function passing a descriptive message telling why the plugin could not be loaded. For example, here is part of a hypothetical spell-checker plugin that uses the file /usr/share/dict/words file: Conditional loading of plugins package spellcheck; #: Version: 1.0 #: Description: Spell Checker #: Author: Somebody BEGIN { die("Word file (/usr/share/dict/words) could not be read") unless -r /usr/share/dict/words; } ... When the user tries to load that plugin, the test will be made. If the file cannot be read (because it does not exist, or the permissiosn are wrong, or for any other reason), die will be called, the plugin will not be loaded, and the given message will be printed in the screen. Plugins That Require Other Plugins If your plugin requires some other plugin, you should use the $world->requireplugin function in a BEGIN block. This function will verify if the named plugin is already loaded. If it is, it returns successfully. If it is not loaded, the function will try to load the plugin. If it could be loaded, the function exits successfully. If, however, the plugin could not be loaded (because it was not found, or because it failed some condition), $world->requireplugin will call die, which will abort the loading the plugin that required the other plugin. As an example, consider the plugin foo, which requires the bar plugin: A plugin that requires another package foo; #: Version: 1.0 #: Description: The Super Frobnicator #: Author: Somebody BEGIN { $::world->requireplugin('bar'); } ... If foo was loaded successfully, you can be sure that the bar plugin and its functionality is present. If bar could not be loaded, foo will not be loaded. Using GTK+ From Plugins With the use of the gtk2-perl bindings, it is possible to use the full power of the GTK+ library in KildClient plugins. This allows you to create dialogs, windows, message boxes, and anything else your plugin needs. Using gtk2-perl in a KildClient plugin is straightforward, there is just a couple of points to be observed. Import the Perl modules as usual, generally with a line like this: "use Gtk2 -init;". Create windows and display them as usual. The biggest difference is that you must not call Gtk2->main. Since KildClient is a GTK+ application, it already runs a main loop, and starting another one would lock KildClient and make it unresponsive. Also, you must never call Gtk2->main_quit, because that would cause KildClient to quit. Even tough the world would be saved, the user certainly wouldn't want that. All features of GTK+ are supported, as are all of gtk2-modules (this includes modules for the base libraries Glid and GDK, and also for other libraries such as the Gnome ones). Notably, Gtk2::Builder (and the older Gtk2::GladeXML) are supported, which allows you to create complex user interfaces visually and load them from the .glade file in the plugin. Note that having the gtk2-perl bindings is not necessary to run KildClient. If they are not present, however, it will not be possible to run plugins that use it, naturally. The plugins will not be loaded because an error will be generated when the modules are loaded (in the "use Gtk2 -init;" line). The example below shows a very simple (and not very useful) plugin using gtk2-perl. It should show how simple it is to use the gtk2-perl bindings in KildClient plugin. A plugin that uses gtk2-perl package gtksample; #: Version: 1.0.0 #: Description: A Plugin Using gtk2-perl #: Author: Eduardo M Kalinowski use Gtk2 -init; # Is the window being displayed? our $window_displayed = 0; # Widgets our $window; our $entry; our $button; sub help { $::world->echonl("This plugins demonstrates the use of gtk2-perl under KildClient.", "It does nothing really useful.", "", "Enter /gtksample::run to try it."); } sub run { return if $window_displayed; $window = Gtk2::Window->new(); $window->set_title("gtk2-perl test"); $window->signal_connect(delete_event => sub { $window_displayed = 0; return 0; }); my $vbox = Gtk2::VBox->new(0, 8); $entry = Gtk2::Entry->new(); $entry->set_text("Type something here"); $vbox->pack_start($entry, 0, 1, 0); $button = Gtk2::Button->new("And click me"); $button->signal_connect(clicked => \&on_button_clicked); $vbox->pack_start($button, 0, 1, 0); $window->add($vbox); $window->show_all(); $window_displayed = 1; } sub on_button_clicked { $button->set_label($entry->get_text()); } sub UNLOAD { $window->destroy if $window_displayed; } Notice how it defines a UNLOAD function that destroys the window if it is being displayed. Plugins that open windows almost always need such a function to delete the windows that are still open when the World is closed. If these windows are not closed, the program will most likely crash if the user tries to use them after the Worlds has been closed, so make sure they get deleted. For more information on gtk2-perl, see http://gtk2-perl.sourceforge.net/. Plugin Conventions The first convention about plugins has been mentioned already: all plugins should define a help describing themselves. This help can be as detailed as necessary. Another convention regards the use of triggers, aliases, macros, timers and hooks. All of them should have names (and they should always be referenced by names, because the plugin writer cannot know which number will be assigned to them), and the names should consist of the name of the plugin, a colon, and then some descriptive name for the trigger (or alias, etc). This is to avoid name clashes with other plugins. Another aspect regarding triggers, aliases, macros, timers and hooks is that they should only be created in the top-level scope, which means they are created when the plugin is loaded. They must not be created in a function that is called later, because this way they would not be recognized as belonging to the plugin, and this would create a mess for the user. So create them outside any functions.
kildclient-2.11.1/Makefile.in0000644000175000017500000006316511570177666012737 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # $Id: Makefile.am 1014 2009-02-01 12:46:52Z ekalin $ VPATH = @srcdir@ 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 = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ config.guess config.sub depcomp install-sh missing \ mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in 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 = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = kcconfig.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__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__installdirs = "$(DESTDIR)$(appsdir)" "$(DESTDIR)$(pkgdocdir)" DATA = $(apps_DATA) $(pkgdoc_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 = po src share doc DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d "$(distdir)" \ || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr "$(distdir)"; }; } am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ KILDCLIENT_PERL_CFLAGS = @KILDCLIENT_PERL_CFLAGS@ KILDCLIENT_PERL_LIBS = @KILDCLIENT_PERL_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ OBJEXT = @OBJEXT@ 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@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RES_COMPILE = @RES_COMPILE@ RES_INCDIR = @RES_INCDIR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @BUILD_DOCS_FALSE@SUBDIRS = po \ @BUILD_DOCS_FALSE@ src \ @BUILD_DOCS_FALSE@ share @BUILD_DOCS_TRUE@SUBDIRS = po \ @BUILD_DOCS_TRUE@ src \ @BUILD_DOCS_TRUE@ share \ @BUILD_DOCS_TRUE@ doc pkgdocdir = $(datadir)/doc/kildclient pkgdoc_DATA = README AUTHORS NEWS COPYING appsdir = $(datadir)/applications apps_DATA = kildclient.desktop EXTRA_DIST = getperlflags.pl \ kildclient.spec \ kildclient.desktop \ win32/kildclient.iss win32/gettext.pm win32/README.win32 all: kcconfig.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): kcconfig.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(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 kcconfig.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f kcconfig.h stamp-h1 install-appsDATA: $(apps_DATA) @$(NORMAL_INSTALL) test -z "$(appsdir)" || $(MKDIR_P) "$(DESTDIR)$(appsdir)" @list='$(apps_DATA)'; test -n "$(appsdir)" || list=; \ 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)$(appsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(appsdir)" || exit $$?; \ done uninstall-appsDATA: @$(NORMAL_UNINSTALL) @list='$(apps_DATA)'; test -n "$(appsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(appsdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(appsdir)" && rm -f $$files install-pkgdocDATA: $(pkgdoc_DATA) @$(NORMAL_INSTALL) test -z "$(pkgdocdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdocdir)" @list='$(pkgdoc_DATA)'; test -n "$(pkgdocdir)" || list=; \ 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)$(pkgdocdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdocdir)" || exit $$?; \ done uninstall-pkgdocDATA: @$(NORMAL_UNINSTALL) @list='$(pkgdoc_DATA)'; test -n "$(pkgdocdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(pkgdocdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(pkgdocdir)" && rm -f $$files # 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 \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 -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 -9 -c >$(distdir).tar.bz2 $(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 -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.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 a+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-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(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: @$(am__cd) '$(distuninstallcheck_dir)' \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { 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) kcconfig.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(appsdir)" "$(DESTDIR)$(pkgdocdir)"; 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: 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 mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-appsDATA install-pkgdocDATA 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 pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-appsDATA uninstall-pkgdocDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ ctags-recursive install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-lzma dist-shar dist-tarZ dist-xz dist-zip distcheck \ distclean distclean-generic distclean-hdr distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-appsDATA \ 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-pkgdocDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-recursive uninstall uninstall-am uninstall-appsDATA \ uninstall-pkgdocDATA # 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: kildclient-2.11.1/depcomp0000755000175000017500000004426711324777651012246 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2009-04-28.21; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 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 outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac 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 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 ' ' ' ' < "$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. ## 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" ;; 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 ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$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" ;; 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" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -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 understands `-MD -MF file'. However on # icc -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 ... \ # ... "$@" -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 "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. 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" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #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:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$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" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## 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:: \1 \\:p' >> "$depfile" echo " " >> "$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: kildclient-2.11.1/README0000644000175000017500000000546711570201315011526 00000000000000KildClient 2.11.1 ----------------- KildClient is a MUD client using the GTK toolkit. Its main feature is the support for Perl scripting, which allows you to do basically whatever you want. Other standard features of mud clients (triggers, gags, macros, etc.) are also supported. See the features page for a more detailed list of features. Installation follows the standard procedure: ./configure make make install After that, run with the `kildclient' command. Several libraries are required in order to use KildClient. Here is a list: - gtk+ 2.16.x - libperl Note that some of those have further dependencies, which need to be installed also. If you need to compile the client, you'll need the development files in addition to the runtime files (if your distribution uses packages, look for packages ending in -dev). You might want the gtkspell library also. It is not necessary, but if found you can have spell checking in the client. You also need the Locale::Gettext Perl Module. For documentation, see the KildClient manual, which should be installed in {prefix}/share/doc/kildclient. {prefix} if by default /usr/local, but it can be changed via configure. SSL Support ----------- KildClient has the hability to connect to muds securily via SSL (for servers that support it, naturally). To build a SSL-enabled KildClient, you need the gnutls library, version 2.2.0 or greater. The configure script will search for it. If the library is found, SSL support will be enabled. If it is not found, the built KildClient will not have that feature. You can always disable that feature by passing the --without-libgnutls option to the configure script. KildClient and gtk2-perl ------------------------ If you have the gtk2-perl bindings, you can use plugins that make use of the GTK+ library. It is not necessary to have gtk2-perl installed, but if you have, you'll be able to use a greater range of plugins. Some standard plugins distributed with KildClient (such as the notes plugin) use it, and so may some third-party ones. Building from CVS ----------------- If you have a copy of KildClient that comes from the CVS repository (and not a tarball that you downloaded), the building process is more complicated. You must first run the autogen.sh script, and then proceed with the configure script. However, you will need some extra tools: automake, autoconf, glib-gettextize (part of glib, which is in turn used by gtk) and intltool. You will also need the development files of the libraries used by KildClient. KildClient is Copyright 2004-2011 by Eduardo Kalinowski (eduardo@kalinowski.com.br). KildClient is free software; you can distribute this software 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. kildclient-2.11.1/src/0000755000175000017500000000000011570463457011522 500000000000000kildclient-2.11.1/src/prefs.c0000644000175000017500000004476011570202603012720 00000000000000/* $Id: prefs.c 1175 2011-05-28 14:24:01Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #include #include "kildclient.h" #include "perlscript.h" /****************** * Initialization * ******************/ Prefs globalPrefs; /************************* * File Global variables * *************************/ #define MAX_OLDSAVE_COLOR 8 /*********************** * Function prototypes * ***********************/ static GString *get_preferences_string(void); static void read_global_preferences_from(FILE *fp, int *x, int *y, int *width, int *height); static void combo_changed_cb(GtkComboBox *combo, gpointer data); static gboolean txt_cmd_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data); /* XML UI signals */ G_MODULE_EXPORT void cmd_group_size_changed_cb(GtkSpinButton *spin, gpointer data); G_MODULE_EXPORT void cmd_delay_changed_cb(GtkSpinButton *spin, gpointer data); G_MODULE_EXPORT void tab_position_changed_cb(GtkComboBox *combo, gpointer data); G_MODULE_EXPORT void chk_hide_single_tab_toggled_cb(GtkToggleButton *button, gpointer data); G_MODULE_EXPORT void chk_urgency_toggled_cb(GtkToggleButton *button, gpointer data); G_MODULE_EXPORT void cmbProxyType_changed_cb(GtkComboBox *combo, gpointer data); void show_preferences_dialog_cb(GtkWidget *widget, gpointer data) { static GtkWidget *dialog = NULL; GtkNotebook *notebook; GObject *cmbInfo; GObject *cmbCmdEcho; GtkComboBox *cmbTabPos; GtkToggleButton *chkHideSingleTab; GtkToggleButton *chkUrgency; GtkSpinButton *spnGroupSize; GtkSpinButton *spnDelay; GtkComboBox *cmbProxyType; GObject *txtProxyServer; GObject *txtProxyPort; GObject *txtProxyUser; GObject *txtProxyPassword; #ifndef __WIN32__ GObject *txtBrowserCommand; GObject *txtAudioPlayerCommand; #else GtkWidget *tabPrograms; #endif if (!dialog) { GError *error = NULL; if (!gtk_builder_add_from_file(main_builder, get_kildclient_installed_file("dlgPreferences.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return; } dialog = GTK_WIDGET(gtk_builder_get_object(main_builder, "dlgPreferences")); notebook = GTK_NOTEBOOK(gtk_builder_get_object(main_builder, "ntbkPrefs")); /* Combos with colors */ cmbInfo = gtk_builder_get_object(main_builder, "cmbInfoColor"); gtk_combo_box_set_active(GTK_COMBO_BOX(cmbInfo), globalPrefs.idxInfoMsgColor); g_signal_connect(cmbInfo, "changed", G_CALLBACK(combo_changed_cb), &globalPrefs.idxInfoMsgColor); cmbCmdEcho = gtk_builder_get_object(main_builder, "cmbCmdEchoColor"); gtk_combo_box_set_active(GTK_COMBO_BOX(cmbCmdEcho), globalPrefs.idxCmdEchoColor); g_signal_connect(cmbCmdEcho, "changed", G_CALLBACK(combo_changed_cb), &globalPrefs.idxCmdEchoColor); /* Load current tab position */ cmbTabPos = GTK_COMBO_BOX(gtk_builder_get_object(main_builder, "cmbTabPos")); gtk_combo_box_set_active(cmbTabPos, globalPrefs.tab_position); chkHideSingleTab = GTK_TOGGLE_BUTTON(gtk_builder_get_object(main_builder, "chkHideSingleTab")); gtk_toggle_button_set_active(chkHideSingleTab, globalPrefs.hide_single_tab); /* Load use of urgency hint */ chkUrgency = GTK_TOGGLE_BUTTON(gtk_builder_get_object(main_builder, "chkUrgency")); gtk_toggle_button_set_active(chkUrgency, globalPrefs.urgency_hint); /* Load delays */ spnGroupSize = GTK_SPIN_BUTTON(gtk_builder_get_object(main_builder, "spnGroupSize")); gtk_spin_button_set_value(spnGroupSize, globalPrefs.multi_cmd_group_size); spnDelay = GTK_SPIN_BUTTON(gtk_builder_get_object(main_builder, "spnPrefsDelay")); gtk_spin_button_set_value(spnDelay, globalPrefs.multi_cmd_delay); /* Load proxy settings */ txtProxyServer = gtk_builder_get_object(main_builder, "txtGProxyServer"); gtk_entry_set_text(GTK_ENTRY(txtProxyServer), globalPrefs.proxy.server); g_signal_connect(txtProxyServer, "focus_out_event", G_CALLBACK(txt_cmd_focus_out_cb), &globalPrefs.proxy.server); txtProxyPort = gtk_builder_get_object(main_builder, "txtGProxyPort"); gtk_entry_set_text(GTK_ENTRY(txtProxyPort), globalPrefs.proxy.port); g_signal_connect(txtProxyPort, "focus_out_event", G_CALLBACK(txt_cmd_focus_out_cb), &globalPrefs.proxy.port); txtProxyUser = gtk_builder_get_object(main_builder, "txtGProxyUser"); gtk_entry_set_text(GTK_ENTRY(txtProxyUser), globalPrefs.proxy.user); g_signal_connect(txtProxyUser, "focus_out_event", G_CALLBACK(txt_cmd_focus_out_cb), &globalPrefs.proxy.user); txtProxyPassword = gtk_builder_get_object(main_builder, "txtGProxyPassword"); gtk_entry_set_text(GTK_ENTRY(txtProxyPassword), globalPrefs.proxy.password); g_signal_connect(txtProxyPassword, "focus_out_event", G_CALLBACK(txt_cmd_focus_out_cb), &globalPrefs.proxy.password); /* Remove "Use Global Settings" - these are the global settings */ cmbProxyType = GTK_COMBO_BOX(gtk_builder_get_object(main_builder, "cmbGProxyType")); gtk_combo_box_remove_text(cmbProxyType, 0); gtk_combo_box_set_active(cmbProxyType, globalPrefs.proxy.type); #ifndef __WIN32__ /* Load commands */ txtBrowserCommand = gtk_builder_get_object(main_builder, "txtBrowserCommand"); gtk_entry_set_text(GTK_ENTRY(txtBrowserCommand), globalPrefs.browser_command); g_signal_connect(txtBrowserCommand, "focus_out_event", G_CALLBACK(txt_cmd_focus_out_cb), &globalPrefs.browser_command); txtAudioPlayerCommand = gtk_builder_get_object(main_builder, "txtAudioPlayerCommand"); gtk_entry_set_text(GTK_ENTRY(txtAudioPlayerCommand), globalPrefs.audio_player_command); g_signal_connect(txtAudioPlayerCommand, "focus_out_event", G_CALLBACK(txt_cmd_focus_out_cb), &globalPrefs.audio_player_command); #else /* defined __WIN32__ */ tabPrograms = GTK_WIDGET(gtk_builder_get_object(main_builder, "prefs_panel_progs")); gtk_notebook_remove_page(notebook, gtk_notebook_page_num(notebook, tabPrograms)); #endif gtk_builder_connect_signals(main_builder, NULL); /* For some reason the proxy page insists on being the default selected. */ gtk_widget_show_all(dialog); gtk_notebook_set_current_page(notebook, 0); } gtk_window_present(GTK_WINDOW(dialog)); } static void combo_changed_cb(GtkComboBox *combo, gpointer data) { int *idx = (int *) data; *idx = gtk_combo_box_get_active(combo); } void cmd_group_size_changed_cb(GtkSpinButton *spin, gpointer data) { globalPrefs.multi_cmd_group_size = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin)); } void cmd_delay_changed_cb(GtkSpinButton *spin, gpointer data) { globalPrefs.multi_cmd_delay = gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)); } void tab_position_changed_cb(GtkComboBox *combo, gpointer data) { globalPrefs.tab_position = gtk_combo_box_get_active(combo); set_notebook_tab_position(globalPrefs.tab_position); } void chk_hide_single_tab_toggled_cb(GtkToggleButton *button, gpointer data) { globalPrefs.hide_single_tab = gtk_toggle_button_get_active(button); if (globalPrefs.hide_single_tab) { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(ntbkWorlds), gtk_notebook_get_n_pages(GTK_NOTEBOOK(ntbkWorlds)) != 1); } else { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(ntbkWorlds), TRUE); } } void chk_urgency_toggled_cb(GtkToggleButton *button, gpointer data) { globalPrefs.urgency_hint = gtk_toggle_button_get_active(button); } static gboolean txt_cmd_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data) { char **command = (char **) data; const char *new_command; new_command = gtk_entry_get_text(GTK_ENTRY(widget)); if (strcmp(new_command, *command) != 0) { g_free(*command); *command = g_strdup(new_command); } return FALSE; } void cmbProxyType_changed_cb(GtkComboBox *combo, gpointer data) { globalPrefs.proxy.type = gtk_combo_box_get_active(combo); } void read_global_preferences(int *x, int *y, int *width, int *height) { const char *kilddir; char *filepath; FILE *fp; /* First, fill in defaults (for the case the file cannot be read, or some options are missing) */ globalPrefs.idxInfoMsgColor = 12; globalPrefs.idxCmdEchoColor = 2; globalPrefs.multi_cmd_group_size = 1; globalPrefs.multi_cmd_delay = 0; globalPrefs.tab_position = GTK_POS_TOP; globalPrefs.hide_single_tab = FALSE; globalPrefs.urgency_hint = TRUE; globalPrefs.proxy.type = PROXY_NONE; /* And now try to load from file the actual values */ kilddir = get_kildclient_directory_path(); filepath = g_strdup_printf("%s/kildclient.cfg", kilddir); fp = fopen(filepath, "r"); if (fp) { read_global_preferences_from(fp, x, y, width, height); fclose(fp); } /* Has the commands been set? */ if (!globalPrefs.browser_command) { globalPrefs.browser_command = g_strdup("${BROWSER} \"%s\" &"); } if (!globalPrefs.audio_player_command) { globalPrefs.audio_player_command = g_strdup("play \"%s\" &"); } /* Have the proxy settings been set? */ if (!globalPrefs.proxy.server) { globalPrefs.proxy.server = g_strdup(""); } if (!globalPrefs.proxy.port) { globalPrefs.proxy.port = g_strdup("1080"); } if (!globalPrefs.proxy.user) { globalPrefs.proxy.user = g_strdup(""); } if (!globalPrefs.proxy.password) { globalPrefs.proxy.password = g_strdup(""); } g_free(filepath); } static void read_global_preferences_from(FILE *fp, int *x, int *y, int *width, int *height) { char line[MAX_BUFFER]; char first_word[MAX_BUFFER]; int pos; fgets(line, MAX_BUFFER, fp); while (!feof(fp)) { line[strlen(line) - 1] = '\0'; /* Remove newline at end */ pos = strcspn(line, " "); memcpy(first_word, line, pos); first_word[pos] = '\0'; if (strcmp(first_word, "newinfomsgcolor") == 0) { globalPrefs.idxInfoMsgColor = atoi(line + pos + 1); } else if (strcmp(first_word, "newcmdechocolor") == 0) { globalPrefs.idxCmdEchoColor = atoi(line + pos + 1); } else if (strcmp(first_word, "infomsgcolor") == 0) { globalPrefs.idxInfoMsgColor = atoi(line + pos + 1); if (globalPrefs.idxInfoMsgColor >= MAX_OLDSAVE_COLOR) { ++globalPrefs.idxInfoMsgColor; } } else if (strcmp(first_word, "cmdechocolor") == 0) { globalPrefs.idxCmdEchoColor = atoi(line + pos + 1); if (globalPrefs.idxCmdEchoColor >= MAX_OLDSAVE_COLOR) { ++globalPrefs.idxCmdEchoColor; } } else if (strcmp(first_word, "tabposition") == 0) { globalPrefs.tab_position = atoi(line + pos + 1); } else if (strcmp(first_word, "hidesingletab") == 0) { globalPrefs.hide_single_tab = atoi(line + pos + 1); } else if (strcmp(first_word, "urgencyhint") == 0) { globalPrefs.urgency_hint = atoi(line + pos + 1); } else if (strcmp(first_word, "browsercommand") == 0) { globalPrefs.browser_command = g_strdup(line + pos + 1); } else if (strcmp(first_word, "audioplayercommand") == 0) { globalPrefs.audio_player_command = g_strdup(line + pos + 1); } else if (strcmp(first_word, "lastopenworld") == 0) { globalPrefs.last_open_world = g_strdup(line + pos + 1); } else if (strcmp(first_word, "multicmdgroupsize") == 0) { globalPrefs.multi_cmd_group_size = atoi(line + pos + 1); } else if (strcmp(first_word, "multicmddelay") == 0) { globalPrefs.multi_cmd_delay = strtod(line + pos + 1, NULL); } else if (strcmp(first_word, "window") == 0) { if (sscanf(line + pos + 1, "%d %d %d %d", x, y, width, height) != 4) { fprintf(stderr, _("Invalid window size specification in config file.\n")); *x = -1; /* It might have been changed */ } } else if (strcmp(first_word, "nopluginhelpmsg") == 0) { globalPrefs.no_plugin_help_msg = atoi(line + pos + 1); } else if (strcmp(first_word, "proxytype") == 0) { globalPrefs.proxy.type = atoi(line + pos + 1); } else if (strcmp(first_word, "proxyserver") == 0) { globalPrefs.proxy.server = g_strdup(line + pos + 1); } else if (strcmp(first_word, "proxyport") == 0) { globalPrefs.proxy.port = g_strdup(line + pos + 1); } else if (strcmp(first_word, "proxyuser") == 0) { globalPrefs.proxy.user = g_strdup(line + pos + 1); } else if (strcmp(first_word, "proxypassword") == 0) { globalPrefs.proxy.password = g_strdup(line + pos + 1); } else { fprintf(stderr, _("Unknown directive '%s' in config file.\n"), first_word); } fgets(line, MAX_BUFFER, fp); } } void save_global_preferences(void) { const char *dirpath; char *filepath; GString *file_contents; GError *error = NULL; file_contents = get_preferences_string(); dirpath = create_kildclient_directory(); filepath = g_strdup_printf("%s/kildclient.cfg", dirpath); if (!g_file_set_contents(filepath, file_contents->str, file_contents->len, &error)) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not open file '%s': %s"), filepath, error->message); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Error")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); } g_free(filepath); g_string_free(file_contents, TRUE); } static GString * get_preferences_string(void) { GString *str; int x, y, width, height; str = g_string_sized_new(512); g_string_append_printf(str, "newinfomsgcolor %d\n", globalPrefs.idxInfoMsgColor); g_string_append_printf(str, "newcmdechocolor %d\n", globalPrefs.idxCmdEchoColor); g_string_append_printf(str, "tabposition %d\n", globalPrefs.tab_position); g_string_append_printf(str, "hidesingletab %d\n", globalPrefs.hide_single_tab); g_string_append_printf(str, "urgencyhint %d\n", globalPrefs.urgency_hint); g_string_append_printf(str, "browsercommand %s\n", globalPrefs.browser_command); g_string_append_printf(str, "audioplayercommand %s\n", globalPrefs.audio_player_command); g_string_append_printf(str, "lastopenworld %s\n", globalPrefs.last_open_world); g_string_append_printf(str, "multicmdgroupsize %d\n", globalPrefs.multi_cmd_group_size); g_string_append_printf(str, "multicmddelay %f\n", globalPrefs.multi_cmd_delay); g_string_append_printf(str, "nopluginhelpmsg %d\n", globalPrefs.no_plugin_help_msg); gtk_window_get_position(GTK_WINDOW(wndMain), &x, &y); gtk_window_get_size(GTK_WINDOW(wndMain), &width, &height); g_string_append_printf(str, "window %d %d %d %d\n", x, y, width, height); g_string_append_printf(str, "proxytype %d\n", globalPrefs.proxy.type); g_string_append_printf(str, "proxyserver %s\n", globalPrefs.proxy.server); g_string_append_printf(str, "proxyport %s\n", globalPrefs.proxy.port); g_string_append_printf(str, "proxyuser %s\n", globalPrefs.proxy.user); g_string_append_printf(str, "proxypassword %s\n", globalPrefs.proxy.password); return str; } const char * create_kildclient_directory(void) { const char *kilddir; struct stat stinfo; kilddir = get_kildclient_directory_path(); if (stat(kilddir, &stinfo) == -1) { if (g_mkdir(kilddir, S_IRUSR | S_IWUSR | S_IXUSR) == -1) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not create directory '%s': %s"), kilddir, g_strerror(errno)); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Error")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); return NULL; } } return kilddir; } kildclient-2.11.1/src/net.h0000644000175000017500000000360011543467543012400 00000000000000/* $Id: net.h 1154 2011-03-26 22:57:37Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __NET_H #define __NET_H /********************** * Limits and defines * **********************/ /************** * Data types * **************/ struct resolve_data_s { World *world; gchar *host; gchar *port; int ai_family; struct addrinfo *addrinfo; gboolean (*callback)(gpointer); int ret; }; /********************************* * Function prototypes - general * *********************************/ gpointer resolve_name_thread(gpointer data); gboolean continue_connecting_cb(gpointer data); gboolean perform_tls_handshake(World *world); gboolean connected_to(World *world); /******************************* * Function prototypes - proxy * *******************************/ void proxy_info_free(proxy_settings *s); void proxy_info_copy(proxy_settings *source, proxy_settings *dest); gboolean proxy_socks4_resolved_real_host_cb(gpointer data); gboolean proxy_socks4_connected_to(World *world); gboolean proxy_socks5_connected_to(World *world); #endif kildclient-2.11.1/src/plugins.c0000644000175000017500000001175211534031336013260 00000000000000/* $Id: plugins.c 1150 2011-03-04 00:31:25Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "kildclient.h" #include "perlscript.h" #include "ansi.h" /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ static int plugin_name_comparer(const Plugin *plugin, const char *name); Plugin * get_plugin(World *world, const char *name) { GSList *pluginlst; pluginlst = g_slist_find_custom(world->plugins, name, (GCompareFunc) plugin_name_comparer); if (pluginlst) { return pluginlst->data; } else { return NULL; } } static int plugin_name_comparer(const Plugin *plugin, const char *name) { return strcmp(plugin->name, name); } void free_plugin(Plugin *plugin, World *world) { gchar *unload_command; unload_command = g_strdup_printf("%s::UNLOAD", plugin->name); eval_pv(unload_command, FALSE); g_free(unload_command); g_free(plugin->name); g_free(plugin->version); g_free(plugin->description); g_free(plugin); } gboolean load_plugin(World *world, gchar *filename, GError **error) { SV *command; SV *ret; PERL_SET_CONTEXT(world->perl_interpreter); command = newSVpvf("($_error, $_pname) = $::world->_loadplugin('%s');", filename); eval_sv(command, G_ARRAY); SvREFCNT_dec(command); ret = get_sv("_error", FALSE); if (SvOK(ret)) { g_set_error(error, G_FILE_ERROR, G_FILE_ERROR_NOENT, _("Failed loading file %s: %s"), filename, SvPV_nolen(ret)); return FALSE; } return TRUE; } /* Startup plugins support */ void load_startup_plugins(World *world) { GSList *pluginitem; PERL_SET_CONTEXT(world->perl_interpreter); pluginitem = world->startup_plugin_files; while (pluginitem) { GError *error = NULL; add_startup_plugin(world, pluginitem->data, &error); if (error) { fprintf(stderr, error->message); fputc('\n', stderr); g_error_free(error); } else { gchar *cmd = g_strdup_printf("$::world->loadplugin('%s');", (gchar *) pluginitem->data); eval_pv(cmd, TRUE); g_free(cmd); } g_free(pluginitem->data); pluginitem = pluginitem->next; } g_slist_free(world->startup_plugin_files); } gboolean add_startup_plugin(World *world, gchar *filename, GError **error) { SV *command; SV *ret; gchar *name; gchar *description; gchar *author; GtkTreeIter iter; PERL_SET_CONTEXT(world->perl_interpreter); command = newSVpvf("($_error, $_name, $_vers, $_desc, $_author) = $::world->_getplugininfo('%s');", filename); eval_sv(command, G_ARRAY); SvREFCNT_dec(command); ret = get_sv("_error", FALSE); if (SvOK(ret)) { g_set_error(error, G_FILE_ERROR, G_FILE_ERROR_NOENT, _("Failed loading file %s: %s"), filename, SvPV_nolen(ret)); return FALSE; } ret = get_sv("_name", FALSE); name = SvPV_nolen(ret); ret = get_sv("_desc", FALSE); description = SvPV_nolen(ret); ret = get_sv("_author", FALSE); author = SvPV_nolen(ret); gtk_list_store_append(GTK_LIST_STORE(world->startup_plugins), &iter); gtk_list_store_set(GTK_LIST_STORE(world->startup_plugins), &iter, SPLUGIN_FILE, filename, SPLUGIN_NAME, name, SPLUGIN_DESCRIPTION, description, SPLUGIN_AUTHOR, author, -1); return TRUE; } void make_startup_plugin_list_for_editing(World *world) { GSList *pluginitem; GtkTreeIter iter; pluginitem = world->startup_plugin_files; while (pluginitem) { gtk_list_store_append(GTK_LIST_STORE(world->startup_plugins), &iter); gtk_list_store_set(GTK_LIST_STORE(world->startup_plugins), &iter, SPLUGIN_FILE, pluginitem->data, -1); g_free(pluginitem->data); pluginitem = pluginitem->next; } g_slist_free(world->startup_plugin_files); } kildclient-2.11.1/src/dlgCmdHistory.ui0000644000175000017500000005533611405233202014545 00000000000000 100 0 1 0.10000000149 0 0 100000 1 10 1 0 1 True Command History dialog True vertical True 8 4 2 8 2 True True automatic in 450 200 True True False True vertical gtk-find True True True True True Find a command containing a given search term True False False 0 Find _next True True True True True Find the next command with the same match text True False False 1 1 2 GTK_FILL GTK_FILL True 2 2 3 GTK_FILL GTK_FILL 8 True 4 True Dela_y True False False 0 True True Specify the delay between sending the group of commands adjustment1 0.10000000149 1 False False 1 True sec_onds each True spnNCommands False False 2 True True Specify how many commands are sent at once adjustment2 1 False False 3 True commands(s) False False 4 2 3 4 GTK_FILL GTK_FILL True 0 Newest commands are on the top 1 2 2 True end _Recall True True True True True Put the selected command in the command entry box True False False 0 Rec_all & Close True True True True True Put the selected command in the command entry box and close this dialog True False False 1 _Send True True True True True Send the selected command(s) to the mud True False False 2 S_end & Close True True True True True Send the selected command(s) to the mud and close the dialog True False False 3 gtk-close True True True True True False False 4 False end 0 btnCHClose True True Find Command dialog True vertical True 8 vertical 8 True 0 _Text to find: True False False 0 True True Enter the text to search for True False False 1 True 4 True 0 0 Search direction: False False 0 True vertical _Downwards True True False True True True False False 0 _Upwards True True False True True radDownwards False False 1 1 2 2 True end gtk-cancel True True True True True False False 0 gtk-ok True True True True True False False 1 False end 0 cancelbutton3 okbutton4 kildclient-2.11.1/src/we_plugins.c0000644000175000017500000005046711526001511013752 00000000000000/* $Id: we_plugins.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "kildclient.h" #include "perlscript.h" /***************************************** * Function prototypes - Startup Plugins * *****************************************/ static void configure_startup_view(GtkTreeView *view, World *world); /* XML UI signals */ G_MODULE_EXPORT void we_splugin_add_cb(gpointer data, GtkButton *button); G_MODULE_EXPORT void we_splugin_remove_cb(gpointer data, GtkButton *button); G_MODULE_EXPORT void we_splugin_move_cb(gpointer data, GtkButton *button); G_MODULE_EXPORT gboolean we_splugin_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); /************************************************** * Function prototypes - Currently Loaded Plugins * **************************************************/ static GtkTreeModel *create_we_lplugins_model(World *world); static void configure_loaded_view(GtkTreeView *view, GtkTreeModel *model); static void we_lplugin_ena_toggled_cb(GtkCellRendererToggle *renderer, gchar *pathstr, gpointer data); /* XML UI signals */ G_MODULE_EXPORT void we_lplugin_load_cb(gpointer data, GtkButton *button); G_MODULE_EXPORT void we_lplugin_help_cb(gpointer data, GtkButton *button); /********************************* * Function prototypes - Generic * *********************************/ static GtkWidget *we_plugin_get_load_filechooser(GtkWindow *parent); GObject * get_we_plugins_tab(GtkBuilder *ui_builder, World *world) { GObject *panel; GObject *lstLoadedPlugins; GObject *btnLPluginLoad; GObject *lstStartupPlugins; GObject *btnSPluginUp; GObject *btnSPluginDown; panel = gtk_builder_get_object(ui_builder, "we_panel_plugins"); /* Currently loaded plugins part */ lstLoadedPlugins = gtk_builder_get_object(ui_builder, "lstLoadedPlugins"); g_object_set_data(lstLoadedPlugins, "forworld", world); btnLPluginLoad = gtk_builder_get_object(ui_builder, "btnLPluginLoad"); if (!world->connected) { gtk_widget_set_sensitive(GTK_WIDGET(btnLPluginLoad), FALSE); } world->plugin_model = create_we_lplugins_model(world); configure_loaded_view(GTK_TREE_VIEW(lstLoadedPlugins), world->plugin_model); /* Startup plugins part */ lstStartupPlugins = gtk_builder_get_object(ui_builder, "lstStartupPlugins"); g_object_set_data(lstStartupPlugins, "forworld", world); btnSPluginUp = gtk_builder_get_object(ui_builder, "btnSPluginUp"); g_object_set_data(btnSPluginUp, "isup", GINT_TO_POINTER(TRUE)); btnSPluginDown = gtk_builder_get_object(ui_builder, "btnSPluginDown"); g_object_set_data(btnSPluginDown, "isup", GINT_TO_POINTER(FALSE)); configure_startup_view(GTK_TREE_VIEW(lstStartupPlugins), world); return panel; } /* Startup plugins */ static void configure_startup_view(GtkTreeView *view, World *world) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; gtk_tree_view_set_model(view, world->startup_plugins); if (world->connected) { /* Column 1 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", SPLUGIN_NAME); gtk_tree_view_append_column(view, column); /* Column 2 - Description */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Description")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", SPLUGIN_DESCRIPTION); gtk_tree_view_append_column(view, column); /* Column 3 - Author */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Author")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", SPLUGIN_AUTHOR); gtk_tree_view_append_column(view, column); } /* Column 4 - File */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("File")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_add_attribute(column, renderer, "text", SPLUGIN_FILE); gtk_tree_view_append_column(view, column); gtk_tree_view_columns_autosize(view); } void we_splugin_add_cb(gpointer data, GtkButton *button) { World *world; GtkTreeView *view; GtkWidget *filechooser; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); filechooser = we_plugin_get_load_filechooser(GTK_WINDOW(world->dlgEditWorld)); if (gtk_dialog_run(GTK_DIALOG(filechooser)) == GTK_RESPONSE_YES) { gchar *filename; GError *error = NULL; gtk_widget_hide(filechooser); filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser)); if (world->connected) { add_startup_plugin(world, filename, &error); } else { GtkTreeIter iter; gtk_list_store_append(GTK_LIST_STORE(world->startup_plugins), &iter); gtk_list_store_set(GTK_LIST_STORE(world->startup_plugins), &iter, SPLUGIN_FILE, filename, -1); } g_free(filename); if (error) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, error->message); gtk_window_set_title(GTK_WINDOW(dlg), _("Error Loading Plugin")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); g_error_free(error); } } gtk_widget_destroy(filechooser); } void we_splugin_remove_cb(gpointer data, GtkButton *button) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; view = (GtkTreeView *) data; selection = gtk_tree_view_get_selection(view); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { gtk_list_store_remove(GTK_LIST_STORE(model), &iter); } } void we_splugin_move_cb(gpointer data, GtkButton *button) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; GtkTreeIter other_iter; gboolean is_up; view = (GtkTreeView *) data; selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "isup")); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { if (is_up) { GtkTreePath *path; path = gtk_tree_model_get_path(model, &iter); if (gtk_tree_path_prev(path)) { gtk_tree_model_get_iter(model, &other_iter, path); gtk_list_store_swap(GTK_LIST_STORE(model), &iter, &other_iter); } gtk_tree_path_free(path); } else { other_iter = iter; if (gtk_tree_model_iter_next(model, &other_iter)) { gtk_list_store_swap(GTK_LIST_STORE(model), &iter, &other_iter); } } } } gboolean we_splugin_view_keypress_cb(GtkWidget *widget, /* The treeview */ GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_Delete || evt->keyval == GDK_KP_Delete) { we_splugin_remove_cb(widget, NULL); return TRUE; } return FALSE; } /* Currently loaded plugins */ static GtkTreeModel * create_we_lplugins_model(World *world) { GtkListStore *store; GtkTreeIter iter; GSList *pluginptr; Plugin *plugin; store = gtk_list_store_new(WE_GUIED_N_COLS, G_TYPE_POINTER); pluginptr = world->plugins; while (pluginptr) { plugin = (Plugin *) pluginptr->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, WE_GUIED_POINTER, plugin, -1); pluginptr = pluginptr->next; } return GTK_TREE_MODEL(store); } static void configure_loaded_view(GtkTreeView *view, GtkTreeModel *model) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; gtk_tree_view_set_model(view, model); g_object_unref(model); /* Column 1 - Enabled? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_lplugin_ena_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Enabled")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(PLUGIN_ENABLED), NULL); gtk_tree_view_append_column(view, column); /* Column 2 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(PLUGIN_NAME), NULL); gtk_tree_view_append_column(view, column); /* Column 3 - Version */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Version")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(PLUGIN_VERSION), NULL); gtk_tree_view_append_column(view, column); /* Column 4 - Author */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Author")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(PLUGIN_AUTHOR), NULL); gtk_tree_view_append_column(view, column); /* Column 5 - Description */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Description")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(PLUGIN_DESCRIPTION), NULL); gtk_tree_view_append_column(view, column); gtk_tree_view_columns_autosize(view); } static void we_lplugin_ena_toggled_cb(GtkCellRendererToggle *renderer, gchar *pathstr, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; World *world; Plugin *plugin; view = (GtkTreeView *) data; model = gtk_tree_view_get_model(view); selection = gtk_tree_view_get_selection(view); world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); gtk_tree_model_get_iter_from_string(model, &iter, pathstr); if (gtk_tree_selection_iter_is_selected(selection, &iter)) { gchar *cmd; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &plugin, -1); if (plugin->enabled) { cmd = g_strdup_printf("$::world->displugin('%s');", plugin->name); } else { cmd = g_strdup_printf("$::world->enaplugin('%s');", plugin->name); } PERL_SET_CONTEXT(world->perl_interpreter); eval_pv(cmd, TRUE); g_free(cmd); } } void we_lplugin_load_cb(gpointer data, GtkButton *button) { World *world; GtkTreeView *view; GtkWidget *filechooser; GtkWidget *chkAtStartup; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); filechooser = we_plugin_get_load_filechooser(GTK_WINDOW(world->dlgEditWorld)); chkAtStartup = gtk_check_button_new_with_mnemonic(_("Always load this plugin at _startup")); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(filechooser), chkAtStartup); if (gtk_dialog_run(GTK_DIALOG(filechooser)) == GTK_RESPONSE_YES) { gchar *filename; GError *error = NULL; gtk_widget_hide(filechooser); filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser)); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chkAtStartup))) { add_startup_plugin(world, filename, &error); } if (error == NULL) { load_plugin(world, filename, &error); } if (error) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, error->message); gtk_window_set_title(GTK_WINDOW(dlg), _("Error Loading Plugin")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); g_error_free(error); } } gtk_widget_destroy(filechooser); } void we_lplugin_help_cb(gpointer data, GtkButton *button) { World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { Plugin *plugin; gchar *cmd; GtkWidget *msgdlg; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &plugin, -1); cmd = g_strdup_printf("%s::help();", plugin->name); PERL_SET_CONTEXT(world->perl_interpreter); eval_pv(cmd, FALSE); g_free(cmd); /* Show message telling where the help appears. */ if (!globalPrefs.no_plugin_help_msg) { GtkWidget *chk; msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, _("The help is displayed in main window.")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Information")); chk = gtk_check_button_new_with_mnemonic(_("_Do not display this message again")); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(msgdlg))), chk, FALSE, FALSE, 4); gtk_widget_show_all(msgdlg); gtk_dialog_run(GTK_DIALOG(msgdlg)); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(chk))) { globalPrefs.no_plugin_help_msg = TRUE; } gtk_widget_destroy(msgdlg); } } } void we_lplugin_insert_plugin(World *world, Plugin *plugin) { /* Called by the Perl functions when an plugin is inserted, so that the display is updated. */ GtkTreeIter iter; if (!world->plugin_model) { return; } gtk_list_store_append(GTK_LIST_STORE(world->plugin_model), &iter); gtk_list_store_set(GTK_LIST_STORE(world->plugin_model), &iter, WE_GUIED_POINTER, plugin, -1); } void we_lplugin_update_plugin(World *world, Plugin *plugin_arg) { /* Called by the Perl functions when an plugin is changed, so that the display is updated. */ GtkTreeIter iter; GtkTreePath *path; Plugin *plugin; gboolean success; if (!world->plugin_model) { return; } success = gtk_tree_model_get_iter_first(world->plugin_model, &iter); while (success) { gtk_tree_model_get(world->plugin_model, &iter, WE_GUIED_POINTER, &plugin, -1); if (plugin == plugin_arg) { path = gtk_tree_model_get_path(world->plugin_model, &iter); gtk_tree_model_row_changed(world->plugin_model, path, &iter); gtk_tree_path_free(path); return; } success = gtk_tree_model_iter_next(world->plugin_model, &iter); } } static GtkWidget * we_plugin_get_load_filechooser(GtkWindow *parent) { const gchar *plugindir; GtkWidget *filechooser; filechooser = gtk_file_chooser_dialog_new(_("Load plugin"), parent, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_YES, NULL); plugindir = get_kildclient_installed_file("plugins"); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(filechooser), plugindir); gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(filechooser), plugindir, NULL); #ifndef __WIN32__ plugindir = g_strdup_printf("%s/plugins", get_kildclient_directory_path()); #else plugindir = g_strdup_printf("%s\\plugins", get_kildclient_directory_path()); #endif gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(filechooser), plugindir, NULL); return filechooser; } kildclient-2.11.1/src/we_generic_guied.c0000644000175000017500000007640611526001511015063 00000000000000/* $Id: we_generic_guied.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "kildclient.h" #include "perlscript.h" /********************7 * Type definitions * ********************/ typedef void (*UpdateFunc)(); /*********************** * Function prototypes * ***********************/ static void we_guied_do_export(World *world, const gchar *file, GtkBuilder *ui_builder); static void we_guied_export_selected_hooks(GString *str, GSList *list, const gchar *name, GtkTreeModel *model, GtkBuilder *ui_builder); static void we_guied_do_import(World *world, const gchar *filename); static void we_guied_try_import(GSList **oldlist, GSList *newlist, gint *pos, UpdateFunc update_func, World *world, const gchar *evt_name); static void we_guied_try_import_vars(World *world, World *newworld); static gboolean *we_guied_get_pointer_to_bool_value(gpointer object, gint column); /* XML UI signals */ G_MODULE_EXPORT void we_guied_import_cb(GtkButton *button, gpointer data); void we_guied_export_cb(GtkButton *button, gpointer data) { World *world = (World *) data; GtkBuilder *ui_builder; gchar *objects[] = { "ExtraFilechooser", NULL }; GError *error = NULL; GtkWidget *ExtraFilechooser; GtkToggleButton *preselect; GtkWidget * filechooser; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return; } ExtraFilechooser = GTK_WIDGET(gtk_builder_get_object(ui_builder, "ExtraFilechooser")); preselect = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, g_object_get_data(G_OBJECT(button), "preselect"))); gtk_toggle_button_set_active(preselect, TRUE); filechooser = gtk_file_chooser_dialog_new(_("Export"), GTK_WINDOW(world->dlgEditWorld), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_YES, NULL); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(filechooser), ExtraFilechooser); if (gtk_dialog_run(GTK_DIALOG(filechooser)) == GTK_RESPONSE_YES) { gchar *filename; gtk_widget_hide(filechooser); filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser)); we_guied_do_export(world, filename, ui_builder); g_free(filename); } gtk_widget_destroy(filechooser); g_object_unref(ui_builder); } static void we_guied_do_export(World *world, const gchar *file, GtkBuilder *ui_builder) { GtkTreeSelection *selection; GtkTreeModel *model; GList *selected; GList *listiter; GtkTreeIter iter; GString *file_contents; GError *error = NULL; file_contents = g_string_sized_new(1024); /* Header */ g_string_append(file_contents, "\n" "\n\n" "\n"); /* Triggers */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "Trigger")))) { selection = gtk_tree_view_get_selection(world->viewTrigger); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { g_string_append(file_contents, " \n"); listiter = selected; while (listiter) { Trigger *trigger; gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &trigger, -1); save_trigger(file_contents, trigger); listiter = listiter->next; } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); g_string_append(file_contents, " \n"); } } /* Aliases */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "Alias")))) { selection = gtk_tree_view_get_selection(world->viewAlias); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { g_string_append(file_contents, " \n"); listiter = selected; while (listiter) { Alias *alias; gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &alias, -1); save_alias(file_contents, alias); listiter = listiter->next; } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); g_string_append(file_contents, " \n"); } } /* Macros */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "Macro")))) { selection = gtk_tree_view_get_selection(world->viewMacro); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { g_string_append(file_contents, " \n"); listiter = selected; while (listiter) { Macro *macro; gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, ¯o, -1); save_macro(file_contents, macro); listiter = listiter->next; } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); g_string_append(file_contents, " \n"); } } /* Timers */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "Timer")))) { selection = gtk_tree_view_get_selection(world->viewTimer); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { g_string_append(file_contents, " \n"); listiter = selected; while (listiter) { Timer *timer; gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &timer, -1); save_timer(file_contents, timer); listiter = listiter->next; } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); g_string_append(file_contents, " \n"); } } /* Permanent Variables */ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "Var")))) { selection = gtk_tree_view_get_selection(world->viewVar); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { g_string_append(file_contents, " \n"); listiter = selected; while (listiter) { gchar *name; gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &name, -1); g_string_append_printf(file_contents, " %s\n", name); listiter = listiter->next; } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); g_string_append(file_contents, " \n"); } } /* Hooks */ g_string_append(file_contents, " \n"); we_guied_export_selected_hooks(file_contents, world->selected_OnConnect_hooks, "OnConnect", GTK_TREE_MODEL(world->hooks.OnConnect_model_filter), ui_builder); we_guied_export_selected_hooks(file_contents, world->selected_OnDisconnect_hooks, "OnDisconnect", GTK_TREE_MODEL(world->hooks.OnDisconnect_model_filter), ui_builder); we_guied_export_selected_hooks(file_contents, world->selected_OnReceivedText_hooks, "OnReceivedText", GTK_TREE_MODEL(world->hooks.OnReceivedText_model_filter), ui_builder); we_guied_export_selected_hooks(file_contents, world->selected_OnSentCommand_hooks, "OnSentCommand", GTK_TREE_MODEL(world->hooks.OnSentCommand_model_filter), ui_builder); we_guied_export_selected_hooks(file_contents, world->selected_OnGetFocus_hooks, "OnGetFocus", GTK_TREE_MODEL(world->hooks.OnGetFocus_model_filter), ui_builder); we_guied_export_selected_hooks(file_contents, world->selected_OnLoseFocus_hooks, "OnLoseFocus", GTK_TREE_MODEL(world->hooks.OnLoseFocus_model_filter), ui_builder); we_guied_export_selected_hooks(file_contents, world->selected_OnCloseConnected_hooks, "OnCloseConnected", GTK_TREE_MODEL(world->hooks.OnCloseConnected_model_filter), ui_builder); g_string_append(file_contents, " \n"); g_string_append(file_contents, "\n"); if (!g_file_set_contents(file, file_contents->str, file_contents->len, &error)) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not open file '%s': %s"), file, error->message); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Error")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); } g_string_free(file_contents, TRUE); } static void we_guied_export_selected_hooks(GString *str, GSList *list, const gchar *name, GtkTreeModel *model, GtkBuilder *ui_builder) { GSList *listiter; GtkTreeIter iter; Hook *hook; if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, name)))) { return; } if (list) { GtkTreePath *path; g_string_append_printf(str, " \n", name); listiter = list; while (listiter) { if (gtk_tree_row_reference_valid(listiter->data)) { path = gtk_tree_row_reference_get_path(listiter->data); gtk_tree_model_get_iter(model, &iter, path); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &hook, -1); save_hook(str, hook); } listiter = listiter->next; } g_string_append(str, " \n"); } } void we_guied_import_cb(GtkButton *button, gpointer data) { World *world = (World *) data; GtkWidget *filechooser; filechooser = gtk_file_chooser_dialog_new(_("Import"), GTK_WINDOW(world->dlgEditWorld), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_YES, NULL); if (gtk_dialog_run(GTK_DIALOG(filechooser)) == GTK_RESPONSE_YES) { gchar *filename; gtk_widget_hide(filechooser); filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser)); we_guied_do_import(world, filename); g_free(filename); } gtk_widget_destroy(filechooser); } static void we_guied_do_import(World *world, const gchar *filename) { World *newworld; gboolean success; GError *error = NULL; newworld = create_new_world(FALSE); success = load_world_from_file(filename, newworld, FALSE, &error); if (!success) { GtkWidget *msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not import file '%s': %s"), filename, error->message); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Error")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); free_world(newworld); return; } we_guied_try_import(&world->triggers, newworld->triggers, &world->trigger_pos, we_trigger_insert_trigger, world, NULL); we_guied_try_import(&world->aliases, newworld->aliases, &world->alias_pos, (UpdateFunc) we_alias_insert_alias, world, NULL); we_guied_try_import(&world->macros, newworld->macros, &world->macro_pos, (UpdateFunc) we_macro_insert_macro, world, NULL); we_guied_try_import(&world->timers, newworld->timers, &world->timer_pos, (UpdateFunc) we_timer_insert_timer, world, NULL); we_guied_try_import_vars(world, newworld); we_guied_try_import(&world->hooks.OnConnect, newworld->hooks.OnConnect, &world->hooks.OnConnect_pos, (UpdateFunc) we_hook_insert_hook, world, "OnConnect"); we_guied_try_import(&world->hooks.OnDisconnect, newworld->hooks.OnDisconnect, &world->hooks.OnDisconnect_pos, (UpdateFunc) we_hook_insert_hook, world, "OnDisconnect"); we_guied_try_import(&world->hooks.OnReceivedText, newworld->hooks.OnReceivedText, &world->hooks.OnReceivedText_pos, (UpdateFunc) we_hook_insert_hook, world, "OnReceivedText"); we_guied_try_import(&world->hooks.OnSentCommand, newworld->hooks.OnSentCommand, &world->hooks.OnSentCommand_pos, (UpdateFunc) we_hook_insert_hook, world, "OnSentCommand"); we_guied_try_import(&world->hooks.OnGetFocus, newworld->hooks.OnGetFocus, &world->hooks.OnGetFocus_pos, (UpdateFunc) we_hook_insert_hook, world, "OnGetFocus"); we_guied_try_import(&world->hooks.OnLoseFocus, newworld->hooks.OnLoseFocus, &world->hooks.OnLoseFocus_pos, (UpdateFunc) we_hook_insert_hook, world, "OnLoseFocus"); we_guied_try_import(&world->hooks.OnCloseConnected, newworld->hooks.OnCloseConnected, &world->hooks.OnCloseConnected_pos, (UpdateFunc) we_hook_insert_hook, world, "OnCloseConnected"); /* This can only be done after the importing because it uses a Perl interpreter. The ones that have already the precomputed RE's are not changed. */ trigger_precompute_res(world); alias_precompute_res(world); /* Since we used the lists directly, we set them to NULL to avoid freeing them. */ newworld->triggers = NULL; newworld->aliases = NULL; newworld->macros = NULL; newworld->timers = NULL; newworld->permanent_variables = NULL; newworld->hooks.OnConnect = NULL; newworld->hooks.OnDisconnect = NULL; newworld->hooks.OnReceivedText = NULL; newworld->hooks.OnSentCommand = NULL; newworld->hooks.OnGetFocus = NULL; newworld->hooks.OnLoseFocus = NULL; newworld->hooks.OnCloseConnected = NULL; free_world(newworld); } static void we_guied_try_import(GSList **oldlist, GSList *newlist, gint *pos, UpdateFunc update_func, World *world, const gchar *evt_name) { if (newlist) { GSList *last; GSList *listiter; gint first_pos; gint i; if (!*oldlist) { /* No items */ *oldlist = newlist; *pos = g_slist_length(*oldlist); last = NULL; first_pos = 0; } else { if (!*pos) { /* Only plugin items */ last = *oldlist; first_pos = 0; *pos = g_slist_length(newlist); *oldlist = g_slist_concat(newlist, *oldlist); } else { /* Has normal items (and perhaps plugin ones) */ GSList *last_normal; GSList *new_last; /* We insert the new list in the middle */ last_normal = g_slist_nth(*oldlist, *pos - 1); first_pos = *pos; *pos += g_slist_length(newlist); last = last_normal->next; last_normal->next = newlist; new_last = g_slist_last(newlist); new_last->next = last; } } /* Show new items in GUI editor */ for (listiter = newlist, i = first_pos; listiter != last; listiter = listiter->next, ++i) { if (evt_name) { update_func(world, evt_name, listiter->data, i); } else { update_func(world, listiter->data, i); } } } } static void we_guied_try_import_vars(World *world, World *newworld) { GSList *listiter; listiter = newworld->permanent_variables; while (listiter) { if (!g_slist_find_custom(world->permanent_variables, listiter->data, (GCompareFunc) strcmp)) { world->permanent_variables = g_slist_append(world->permanent_variables, listiter->data); we_var_insert_var(world, listiter->data, -1); } listiter = listiter->next; } } void we_guied_bool_func(GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { gpointer object; gint op; gboolean *value; gtk_tree_model_get(model, iter, WE_GUIED_POINTER, &object, -1); op = GPOINTER_TO_INT(data); value = we_guied_get_pointer_to_bool_value(object, op); g_object_set(renderer, "active", *value, NULL); } void we_guied_text_func(GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { gpointer object; gint op; gchar *value = NULL; static gchar printed_value[100]; gchar *keycodestr; gtk_tree_model_get(model, iter, WE_GUIED_POINTER, &object, -1); op = GPOINTER_TO_INT(data); switch (op) { case PLUGIN_NAME: value = ((Plugin *) object)->name; break; case PLUGIN_VERSION: value = ((Plugin *) object)->version; break; case PLUGIN_AUTHOR: value = ((Plugin *) object)->author; break; case PLUGIN_DESCRIPTION: value = ((Plugin *) object)->description; break; case TRIGGER_PATTERN: value = ((Trigger *) object)->pattern; break; case TRIGGER_ACTION: if (((Trigger *) object)->action) { value = ((Trigger *) object)->action; } else { value = ""; } break; case TRIGGER_NAME: if (((Trigger *) object)->name) { value = ((Alias *) object)->name; } else { value = ""; } break; case ALIAS_PATTERN: value = ((Alias *) object)->pattern; break; case ALIAS_SUBSTITUTION: value = ((Alias *) object)->substitution; break; case ALIAS_NAME: if (((Alias *) object)->name) { value = ((Alias *) object)->name; } else { value = ""; } break; case TIMER_NAME: if (((Timer *) object)->name) { value = ((Timer *) object)->name; } else { value = ""; } break; case TIMER_ACTION: value = ((Timer *) object)->action; break; case TIMER_INTERVAL: g_snprintf(printed_value, 100, "%d", ((Timer *) object)->interval); value = printed_value; break; case TIMER_COUNT: g_snprintf(printed_value, 100, "%d", ((Timer *) object)->count); value = printed_value; break; case MACRO_NAME: if (((Macro *) object)->name) { value = ((Macro *) object)->name; } else { value = ""; } break; case MACRO_ACTION: value = ((Macro *) object)->action; break; case MACRO_KEY: keycodestr = gtk_accelerator_name(((Macro *) object)->keyval, ((Macro *) object)->modifiers); g_strlcpy(printed_value, keycodestr, 100); g_free(keycodestr); value = printed_value; break; case HOOK_NAME: if (((Hook *) object)->name) { value = ((Hook *) object)->name; } else { value = ""; } break; case HOOK_ACTION: value = ((Hook *) object)->action; break; case PERMVAR_NAME: value = (gchar *) object; break; case OBJECT_PLUGIN: if (((GeneralObject *) object)->owner_plugin) { value = ((GeneralObject *) object)->owner_plugin->name; } else { value = ""; } break; } g_object_set(renderer, "text", value, NULL); } gboolean we_guied_plugin_filter_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { World *world = (World *) data; gpointer object; if (world->show_plugin_items) { /* Display all objects */ return TRUE; } gtk_tree_model_get(model, iter, WE_GUIED_POINTER, &object, -1); if (!object) { return FALSE; } if (((GeneralObject *) object)->owner_plugin) { return FALSE; } return TRUE; } void we_guied_bool_col_toggled_cb(GtkCellRendererToggle *renderer, gchar *pathstr, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; GtkTreePath *path; gint column; gpointer object; gboolean *value; view = (GtkTreeView *) data; model = gtk_tree_view_get_model(view); selection = gtk_tree_view_get_selection(view); gtk_tree_model_get_iter_from_string(model, &iter, pathstr); /* Only toggle if we click in the active row, otherwise just select that row. */ if (gtk_tree_selection_iter_is_selected(selection, &iter)) { gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &object, -1); column = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(renderer), "column")); value = we_guied_get_pointer_to_bool_value(object, column); /* Update */ *value = !*value; path = gtk_tree_path_new_from_string(pathstr); gtk_tree_model_row_changed(model, path, &iter); gtk_tree_path_free(path); /* Recompute REs if Ignore Case is toggled */ if (column == TRIGGER_ICASE) { World *world = g_object_get_data(G_OBJECT(view), "forworld"); Trigger *trigger = (Trigger *) object; if (world->perl_interpreter) { PERL_SET_CONTEXT(world->perl_interpreter); if (trigger->pattern_re) { SvREFCNT_dec(trigger->pattern_re); } trigger->pattern_re = precompute_re(world->perl_interpreter, trigger->pattern, trigger->ignore_case); } } if (column == ALIAS_ICASE) { World *world = g_object_get_data(G_OBJECT(view), "forworld"); Alias *alias = (Alias *) object; if (world->perl_interpreter) { PERL_SET_CONTEXT(world->perl_interpreter); if (alias->pattern_re) { SvREFCNT_dec(alias->pattern_re); } alias->pattern_re = precompute_re(world->perl_interpreter, alias->pattern, alias->ignore_case); } } /* Turn timer on or off if necessary */ if (column == TIMER_ENABLED) { Timer *timer = (Timer *) object; if (timer->for_world->connected) { if (*value) { timer->function_id = g_timeout_add(timer->interval * 1000, run_timer, timer); } else { g_source_remove(timer->function_id); } } } } } static gboolean * we_guied_get_pointer_to_bool_value(gpointer object, gint column) { gboolean *value = NULL; switch (column) { case PLUGIN_ENABLED: value = &((Plugin *) object)->enabled; break; case TRIGGER_ENABLED: value = &((Trigger *) object)->enabled; break; case TRIGGER_GAG: value = &((Trigger *) object)->gag_output; break; case TRIGGER_GAGLOG: value = &((Trigger *) object)->gag_log; break; case TRIGGER_KEEPEXEC: value = &((Trigger *) object)->keepexecuting; break; case TRIGGER_REWRITER: value = &((Trigger *) object)->rewriter; break; case TRIGGER_ICASE: value = &((Trigger *) object)->ignore_case; break; case TRIGGER_HIGHLIGHT: value = &((Trigger *) object)->highlight; break; case ALIAS_ENABLED: value = &((Alias *) object)->enabled; break; case ALIAS_PERL_EVAL: value = &((Alias *) object)->perl_eval; break; case ALIAS_ICASE: value = &((Alias *) object)->ignore_case; break; case TIMER_ENABLED: value = &((Timer *) object)->enabled; break; case TIMER_TEMPORARY: value = &((Timer *) object)->temporary; break; case MACRO_ENABLED: value = &((Macro *) object)->enabled; break; case HOOK_ENABLED: value = &((Hook *) object)->enabled; break; } return value; } void we_guied_selection_changed_cb(GtkTreeSelection *selection, gpointer data) { GtkWidget *btnEdit; GtkWidget *btnDelete; GtkWidget *btnUp; GtkWidget *btnDown; GtkWidget *btnExport; int n; btnEdit = g_object_get_data(G_OBJECT(selection), "btnEdit"); btnDelete = g_object_get_data(G_OBJECT(selection), "btnDelete"); btnUp = g_object_get_data(G_OBJECT(selection), "btnUp"); btnDown = g_object_get_data(G_OBJECT(selection), "btnDown"); btnExport = g_object_get_data(G_OBJECT(selection), "btnExport"); n = gtk_tree_selection_count_selected_rows(selection); gtk_widget_set_sensitive(btnEdit, n == 1); gtk_widget_set_sensitive(btnUp, n == 1); gtk_widget_set_sensitive(btnDown, n == 1); gtk_widget_set_sensitive(btnDelete, n >= 1); gtk_widget_set_sensitive(btnExport, n >= 1); } GtkWidget * we_guied_confirm_delete_dialog_new(GtkWindow *parent, int n, const gchar *singular, const gchar *plural) { GtkWidget *msgdlg; GtkWidget *dlgbutton; GtkWidget *dlgbuttonimage; if (n == 1) { msgdlg = gtk_message_dialog_new(parent, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Do you really want to delete the %s?"), singular); } else { msgdlg = gtk_message_dialog_new(parent, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Do you really want to delete %d %s?"), n, plural); } gtk_window_set_title(GTK_WINDOW(msgdlg), _("Confirm deletion")); dlgbutton = gtk_button_new_with_label(_("Do not delete")); dlgbuttonimage = gtk_image_new_from_stock(GTK_STOCK_NO, GTK_ICON_SIZE_MENU); gtk_button_set_image(GTK_BUTTON(dlgbutton), dlgbuttonimage); gtk_widget_show_all(dlgbutton); gtk_dialog_add_action_widget(GTK_DIALOG(msgdlg), dlgbutton, GTK_RESPONSE_NO); dlgbutton = gtk_button_new_with_label(_("Delete")); dlgbuttonimage = gtk_image_new_from_stock(GTK_STOCK_DELETE, GTK_ICON_SIZE_MENU); gtk_button_set_image(GTK_BUTTON(dlgbutton), dlgbuttonimage); gtk_widget_show_all(dlgbutton); gtk_dialog_add_action_widget(GTK_DIALOG(msgdlg), dlgbutton, GTK_RESPONSE_YES); return msgdlg; } kildclient-2.11.1/src/perlscript.c0000644000175000017500000023436211570205043013770 00000000000000/* $Id: perlscript.c 1176 2011-05-28 14:43:45Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include /* Perl includes */ #include #include #include #include "kildclient.h" #include "ansi.h" #include "perlscript.h" /***************** * Useful macros * *****************/ #define FETCHWORLDVARS World *world #define FETCHWORLDVARSFULL HV *self; \ World *world #define FETCHWORLD if (!(world = fetch_world(items, ST(0), NULL))) { \ XSRETURN_EMPTY; \ } #define FETCHWORLDFULL if (!(world = fetch_world(items, ST(0), &self))) { \ XSRETURN_EMPTY; \ } /*********************** * Function prototypes * ***********************/ static GSList *AVtoGSList(AV *array); static SV *create_world_var(World *world); static SV *create_window_var(void); static World *fetch_world(int items, SV *self_ref, HV **self_to_store); static void xs_init(); static int world_name_comparer(const World *world, const char *name); static GSList *get_object_numbers(GSList *list, const char *name, int searchtype); static void fill_highlight(Trigger *trigger, HV *style); /* For dynamic loading of modules */ EXTERN_C void boot_DynaLoader (pTHX_ CV* cv); /****************** * Initialization * ******************/ World *world_for_perl = NULL; /************************* * File global variables * *************************/ static int my_argc_static = 4; static char *my_argv_static[] = { "kildperl", "-Mencoding=utf8", "-MData::Dumper", "-w" }; void init_perl_system(void) { PERL_SYS_INIT(&my_argc_static, &my_argv_static); } void init_perl_script(World *world) { char **my_argv; char *perl_cmds; char *system_plugin_dir; char *user_plugin_dir; int i; SV *world_ref; SV *world_var; SV *window_ref; SV *window_var; my_argv = g_malloc(sizeof(char *) * (my_argc_static + 2)); for (i = 0; i < my_argc_static; ++i) { my_argv[i] = my_argv_static[i]; } my_argv[i] = g_strdup_printf("-I%s", get_kildclient_installed_file("")); my_argv[i+1] = g_strdup(get_kildclient_installed_file("kildclient.pl")); #ifndef __WIN32__ user_plugin_dir = g_strdup_printf("%s/plugins", get_kildclient_directory_path()); #else user_plugin_dir = g_strdup_printf("%s\\plugins", get_kildclient_directory_path()); #endif system_plugin_dir = g_strdup(get_kildclient_installed_file("plugins")); perl_cmds = g_strdup_printf("$SIG{__WARN__} = sub {" "$world->echo(\"Perl Warning: $_[0]\");" "};" "__sethelpfile('%s');" "push(@PLUGINDIRS, '%s', '%s')", get_kildclient_installed_file("kildclient.hlp"), system_plugin_dir, user_plugin_dir); g_free(user_plugin_dir); g_free(system_plugin_dir); world->perl_interpreter = perl_alloc(); PERL_SET_CONTEXT(world->perl_interpreter); perl_construct(world->perl_interpreter); perl_parse(world->perl_interpreter, xs_init, my_argc_static + 2, my_argv, NULL); /* PL_exit_flags |= PERL_EXIT_DESTRUCT_END; */ eval_pv(perl_cmds, TRUE); /* Create $world variable */ world_ref = create_world_var(world); world_var = get_sv("world", TRUE); sv_setsv(world_var, world_ref); /* Create $window variable */ window_ref = create_window_var(); window_var = get_sv("window", TRUE); sv_setsv(window_var, window_ref); g_free(my_argv[i]); g_free(my_argv[i+1]); g_free(my_argv); g_free(perl_cmds); } static SV * create_world_var(World *world) { /* Currently the hash holds nothing. It's just used to indicate that the function refers to the window. */ HV *world_hash; IV worldptriv; SV *worldptrsv; SV *world_ref; HV *world_pkg_stash; world_hash = newHV(); worldptriv = PTR2IV(world); worldptrsv = newSViv(worldptriv); (void) hv_store(world_hash, "WORLDPTR", 8, worldptrsv, 0); world_ref = newRV_noinc((SV *) world_hash); world_pkg_stash = gv_stashpv("World", TRUE); world_ref = sv_bless(world_ref, world_pkg_stash); return world_ref; } static SV * create_window_var(void) { HV *window_hash; SV *window_ref; HV *window_pkg_stash; window_hash = newHV(); window_ref = newRV_noinc((SV *) window_hash); window_pkg_stash = gv_stashpv("Window", TRUE); window_ref = sv_bless(window_ref, window_pkg_stash); return window_ref; } void destruct_perl_script(PerlInterpreter *perl_interpreter) { #ifndef __MINGW32__ /* For some reason, this function crashes under Windows when a World is closed and there is another one open. I don't know how important it is to call this function, but at least the one that frees the resources is called. */ perl_destruct(perl_interpreter); #endif perl_free(perl_interpreter); } void perl_script_import_file(PerlInterpreter *interpreter, const char *file) { char *cmd = g_strdup_printf("do '%s';", file); PERL_SET_CONTEXT(interpreter); eval_pv(cmd, TRUE); g_free(cmd); } int perl_match(PerlInterpreter *interpreter, const unsigned char *line, SV *pattern_re, int *match_start, int *match_end, int substring) { SV *string; SV *re; SV *command; int retval; int start; int end; dSP; PERL_SET_CONTEXT(interpreter); /* Set the string in a variable */ string = get_sv("triggerline", TRUE); sv_setpv(string, (char *) line); SvUTF8_on(string); /* Set the regexp in a variable */ re = get_sv("_re", TRUE); sv_setsv(re, pattern_re); /* Create the command to run */ command = newSVpvf("$triggerline =~ tr/\\n\\r//d;" "my $target = %d;" "my @__M = ($triggerline =~ m\x05$_re\x05);" "my $match = scalar @__M;" "if ($match) {" " @_ = @__M;" " unshift(@_, $triggerline);" "}" "(defined($-[$target]) ? $-[$target] : 0," " defined($+[$target]) ? $+[$target] : 0," " $match);", (substring != -1 ? substring : 0)); /* Run the command */ ENTER; SAVETMPS; PUSHMARK(SP); eval_sv(command, G_ARRAY); SPAGAIN; retval = POPi; end = POPi; start = POPi; PUTBACK; FREETMPS; LEAVE; SvREFCNT_dec(command); if (match_start) { *match_start = start; } if (match_end) { *match_end = end; } return retval; } char * perl_substitute(PerlInterpreter *interpreter, const char *line, SV *pattern_re, const char *substitution, int perl_eval, int global) { SV *string; SV *re; SV *command; int retval; SV *result; dSP; PERL_SET_CONTEXT(interpreter); /* Set the string in a variable */ string = get_sv("aliascmd", TRUE); sv_setpv(string, line); SvUTF8_on(string); /* Set the regexp in a variable */ re = get_sv("_re", TRUE); sv_setsv(re, pattern_re); /* Create the command to run */ command = newSVpvf("$__aliasmatched = ($aliascmd =~ s\x05$_re\x05%s\x05%s%s);", substitution, global ? "g" : "", perl_eval ? "e" : ""); /* Run the command */ ENTER; SAVETMPS; PUSHMARK(SP); eval_sv(command, G_SCALAR); SPAGAIN; retval = POPi; PUTBACK; FREETMPS; LEAVE; SvREFCNT_dec(command); if (retval) { result = get_sv("aliascmd", FALSE); return g_strdup(SvPV_nolen(result)); } else { return NULL; } } SV * precompute_re(PerlInterpreter *interpreter, const char *re_string, int ignore_case) { PerlInterpreter *old_interpreter; SV *re_int; SV *re_new; SV *command; dSP; old_interpreter = PERL_GET_CONTEXT; PERL_SET_CONTEXT(interpreter); command = newSVpvf("$_re = qr\x05%s\x05%s;", re_string, ignore_case ? "i" : ""); ENTER; SAVETMPS; PUSHMARK(SP); eval_sv(command, G_SCALAR); SPAGAIN; re_int = POPs; re_new = newSVsv(re_int); PUTBACK; FREETMPS; LEAVE; SvREFCNT_dec(command); PERL_SET_CONTEXT(old_interpreter); return re_new; } static GSList * AVtoGSList(AV *array) { GSList *list = NULL; int i; int max; SV **element; /* max is the highest index number of the array */ max = av_len(array); for (i = 0; i <= max; ++i) { element = av_fetch(array, i, FALSE); if (element) { list = g_slist_append(list, g_strdup(SvPV_nolen(*element))); } } return list; } void menu_perl_run_cb(GtkWidget *widget, gpointer data) { char *cmd = (char *) data; int page_num; page_num = get_focused_world(); currentWorld = (World *) g_list_nth_data(open_worlds, page_num); world_for_perl = currentWorld; PERL_SET_CONTEXT(world_for_perl->perl_interpreter); eval_pv(cmd, TRUE); } static World *fetch_world(int items, SV *self_ref, HV **self_to_store) { SV *self_def; HV *self; SV **worldptrsv; World *world; if (!items || !SvROK(self_ref) || !sv_isa(self_ref, "World")) { warn(_("Invalid function call: syntax is $world->FUNCTION")); return NULL; } self_def = SvRV(self_ref); if (SvTYPE(self_def) != SVt_PVHV) { warn(_("Invalid function call: syntax is $world->FUNCTION")); return NULL; } self = (HV*) self_def; worldptrsv = hv_fetch(self, "WORLDPTR", 8, FALSE); if (!worldptrsv) { warn(_("Invalid function call: syntax is $world->FUNCTION")); return NULL; } world = INT2PTR(World *, SvIV(*worldptrsv)); if (self_to_store) { *self_to_store = self; } return world; } static void XS_getversion(pTHX_ CV *perlcv) { dMARK; dAX; XST_mPV(0, PACKAGE_VERSION); XSRETURN(1); } static void XS_quit(pTHX_ CV *perlcv) { dMARK; dAX; if (confirm_quit()) { gtk_main_quit(); } XSRETURN_EMPTY; } static void XS_dc(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* We don't call the function directly because disconnect_world can destroy the Perl interpreter if another world is loaded, and this would cause a segfault in the function that evaluates Perl commands. */ g_idle_add(disconnect_world_idle, world); XSRETURN_EMPTY; } static void XS_reconnect(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (world->connected) { g_free(close_connection(world, TRUE)); } /* We don't call the function directly because disconnect_world can destroy the Perl interpreter if another world is loaded, and this would cause a segfault in the function that evaluates Perl commands. */ g_idle_add(reconnect_world, world); XSRETURN_EMPTY; } static void XS_connectother(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (world->connected) { g_free(close_connection(world, TRUE)); } /* We don't call the function directly because disconnect_world can destroy the Perl interpreter if another world is loaded, and this would cause a segfault in the function that evaluates Perl commands. */ g_idle_add(connect_another, world); XSRETURN_EMPTY; } static void XS_window_minimize(pTHX_ CV *perlcv) { dMARK; dAX; gtk_window_iconify(GTK_WINDOW(wndMain)); XSRETURN_EMPTY; } static void XS_window_getsize(pTHX_ CV *perlcv) { guint cols = 0; guint lines = 0; dMARK; dAX; ansitextview_get_size(world_for_perl->gui, &lines, &cols); XST_mIV(1, cols); XST_mIV(0, lines); XSRETURN(2); } static void XS_window_settitle(pTHX_ CV *perlcv) { dXSARGS; if (items == 1) { warn(_("%s: Too few arguments"), "settitle"); XSRETURN_EMPTY; } gtk_window_set_title(GTK_WINDOW(wndMain), SvPV_nolen(ST(1))); XSRETURN_EMPTY; } static void XS_window_seturgencyhint(pTHX_ CV *perlcv) { dXSARGS; if (items == 1) { warn(_("%s: Too few arguments"), "seturgencyhint"); XSRETURN_EMPTY; } if (globalPrefs.urgency_hint) { gtk_window_set_urgency_hint(GTK_WINDOW(wndMain), SvIV(ST(1))); } XSRETURN_EMPTY; } static void XS_next(pTHX_ CV *perlcv) { int num; int howmany; int n_worlds; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items < 2) { howmany = 1; } else { if (!SvIOK(ST(1))) { warn(_("%s: Argument must be numeric"), "next"); XSRETURN_EMPTY; } else { howmany = SvIV(ST(1)); } } num = g_list_index(open_worlds, world); num += howmany; n_worlds = g_list_length(open_worlds); if (num >= 0) { num %= n_worlds; } else { while (num < 0) { num += n_worlds; } } set_focused_world(num); XSRETURN_EMPTY; } static void XS_gotow(pTHX_ CV *perlcv) { int num; GList *worldpos; dXSARGS; if (items < 1) { warn(_("%s: Too few arguments"), "gotow"); XSRETURN_EMPTY; } else { if (SvIOK(ST(0))) { num = SvIV(ST(0)); } else { worldpos = g_list_find_custom(open_worlds, SvPV_nolen(ST(0)), (GCompareFunc) world_name_comparer); num = g_list_position(open_worlds, worldpos); } } if (num < 0 || num >= g_list_length(open_worlds)) { warn(_("%s: No such world"), "gotow"); XSRETURN_EMPTY; } set_focused_world(num); XSRETURN_EMPTY; } static void XS_getworld(pTHX_ CV *perlcv) { GList *worldpos; SV *world_ref; dXSARGS; if (items < 1) { warn(_("%s: Too few arguments"), "getworld"); XSRETURN_UNDEF; } else { if (SvIOK(ST(0))) { worldpos = g_list_nth(open_worlds, SvIV(ST(0))); } else { worldpos = g_list_find_custom(open_worlds, SvPV_nolen(ST(0)), (GCompareFunc) world_name_comparer); } } if (!worldpos) { warn(_("%s: No such world"), "getworld"); XSRETURN_UNDEF; } world_ref = create_world_var((World *) worldpos->data); ST(0) = world_ref; XSRETURN(1); } static int world_name_comparer(const World *world, const char *name) { return strcmp(world->name, name); } static void XS_save(pTHX_ CV *perlcv) { gboolean dummy; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (!world->file) { if (!edit_world(&world, GTK_WINDOW(wndMain), &dummy, TRUE)) XSRETURN_EMPTY; } save_world_to_file(world); save_permanent_variables(world); ansitextview_append_string_nl(world->gui, _("World saved.")); XSRETURN_EMPTY; } static void XS_close(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* We don't call the function directly because remove_world can destroy the Perl interpreter if another world is loaded, and this would cause a segfault in the function that evaluates Perl commands. */ g_idle_add((GSourceFunc) remove_world_timer, world); XSRETURN_EMPTY; } static void XS_getname(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* And now return the current value */ XST_mPV(0, world->name); XSRETURN(1); } static void XS_getcharacter(pTHX_ CV *perlcv) { GtkTreePath *path; GtkTreeIter iter; gchar *character = NULL; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (world->character_used == NULL || world->connection_style == NONE) { XSRETURN_UNDEF; } path = gtk_tree_row_reference_get_path(world->character_used); if (!path) { gtk_tree_row_reference_free(world->character_used); world->character_used = NULL; XSRETURN_UNDEF; } gtk_tree_model_get_iter(world->logon_characters, &iter, path); gtk_tree_model_get(world->logon_characters, &iter, LOGON_CHAR, &character, -1); XST_mPV(0, character); g_free(character); gtk_tree_path_free(path); XSRETURN(1); } static void XS_getmainfont(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* And now return the current value */ XST_mPV(0, world->terminalfont); XSRETURN(1); } static void XS_getentryfont(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* And now return the current value */ XST_mPV(0, world->entryfont); XSRETURN(1); } static void XS_commandecho(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* If there is an argument, set the option */ if (items == 2) { world->cmd_echo = SvIV(ST(1)); } /* And now return the current value */ XST_mIV(0, world->cmd_echo); XSRETURN(1); } static void XS_getconntime(pTHX_ CV *perlcv) { time_t now; FETCHWORLDVARS; dXSARGS; FETCHWORLD; now = time(NULL); XST_mNV(0, difftime(now, world->connected_time)); XSRETURN(1); } static void XS_getidletime(pTHX_ CV *perlcv) { time_t now; FETCHWORLDVARS; dXSARGS; FETCHWORLD; now = time(NULL); XST_mNV(0, difftime(now, world->last_command_time)); XSRETURN(1); } static void XS_echo(pTHX_ CV *perlcv) { int i; char *word; STRLEN len; FETCHWORLDVARS; dXSARGS; FETCHWORLD; for (i = 1; i < items; ++i) { word = SvPV(ST(i), len); if (world && world->gui->txtView) { ansitextview_append_echoed_string(world->gui, word, len); } else { printf(word); } } XSRETURN_EMPTY; } static void XS_send(pTHX_ CV *perlcv) { int i; char *word; STRLEN len; FETCHWORLDVARS; dXSARGS; FETCHWORLD; for (i = 1; i < items; ++i) { word = SvPV(ST(i), len); send_to_world(world, word, len); } XSRETURN_EMPTY; } static void XS__mlsend(pTHX_ CV *perlcv) { HV *attributes; SV **value; AV *AVinitialtext = NULL; AV *AVfinaltext = NULL; char *file = NULL; gdouble delay; MLSendData *mlcontext; FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* Check argument */ if (items < 2) { warn(_("%s: This is an internal function, do not call directly."), "_mlsend"); XSRETURN_UNDEF; } if (!SvROK(ST(1)) || SvTYPE(SvRV(ST(1))) != SVt_PVHV) { warn(_("%s: Wrong argument type"), "_mlsend"); XSRETURN_EMPTY; } /* Fetch attributes */ attributes = (HV *) SvRV(ST(1)); /* See if everthing is alright before starting to allocate memory */ value = hv_fetch(attributes, "initialtext", 11, FALSE); if (value) { if (!SvROK(*value) || SvTYPE(SvRV(*value)) != SVt_PVAV) { warn(_("%s: This is an internal function, do not call directly."), "_mlsend"); XSRETURN_EMPTY; } else { AVinitialtext = (AV *) SvRV(*value); } } value = hv_fetch(attributes, "finaltext", 9, FALSE); if (value) { if (!SvROK(*value) || SvTYPE(SvRV(*value)) != SVt_PVAV) { warn(_("%s: This is an internal function, do not call directly."), "_mlsend"); XSRETURN_EMPTY; } else { AVfinaltext = (AV *) SvRV(*value); } } value = hv_fetch(attributes, "file", 4, FALSE); if (value) { FILE *fp; file = SvPV_nolen(*value); /* See if file can be read */ if ((fp = fopen(file, "r")) == NULL) { XSRETURN_NO; } fclose(fp); } /* No problems - let's prepare the structure for ML Send. */ mlcontext = calloc(1, sizeof(MLSendData)); mlcontext->state = ML_TRY_INITIALLINES; mlcontext->world = world; if (AVinitialtext) { mlcontext->linesInitial = AVtoGSList(AVinitialtext); } if (AVfinaltext) { mlcontext->linesFinal = AVtoGSList(AVfinaltext); } if (file) { mlcontext->file = g_strdup(file); } /* Fetch other attributes */ value = hv_fetch(attributes, "linestart", 9, FALSE); if (value) { mlcontext->textStart = g_strdup(SvPV_nolen(*value)); } else { mlcontext->textStart = g_strdup(""); } value = hv_fetch(attributes, "lineend", 7, FALSE); if (value) { mlcontext->textEnd = g_strdup(SvPV_nolen(*value)); } else { mlcontext->textEnd = g_strdup(""); } value = hv_fetch(attributes, "delay", 5, FALSE); if (value) { delay = SvNV(*value); } else { delay = globalPrefs.multi_cmd_delay; } value = hv_fetch(attributes, "linesatime", 10, FALSE); if (value) { mlcontext->linesatime = SvIV(*value); } else { mlcontext->linesatime = globalPrefs.multi_cmd_group_size; } do_multi_line_send(mlcontext, delay); XSRETURN_YES; } static void XS_interpret(pTHX_ CV *perlcv) { char *line; STRLEN len; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { warn(_("%s: Too few arguments"), "interpret"); XSRETURN_EMPTY; } line = SvPV(ST(1), len); parse_commands(world, line, len); XSRETURN_EMPTY; } static void XS_getline(pTHX_ CV *perlcv) { int line; int last_line; GtkTextIter start_iter; GtkTextIter end_iter; gchar *text; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { warn(_("%s: Too few arguments"), "getline"); XSRETURN_EMPTY; } line = SvIV(ST(1)); last_line = gtk_text_buffer_get_line_count(world->gui->txtBuffer); if (line < 0) { /* Negative: nth line from the bottom */ line = last_line - (-line) - 1; } else { /* Positive: line number */ line = line - world->deleted_lines - 1; if (line > last_line) { XSRETURN_EMPTY; } } if (line < 0) { XSRETURN_EMPTY; } gtk_text_buffer_get_iter_at_line(world->gui->txtBuffer, &start_iter, line); end_iter = start_iter; gtk_text_iter_forward_to_line_end(&end_iter); text = gtk_text_buffer_get_text(world->gui->txtBuffer, &start_iter, &end_iter, FALSE); XST_mPV(0, text); g_free(text); if (GIMME_V == G_ARRAY) { XST_mIV(1, k_circular_queue_nth(world->gui->line_times, time_t, line)); XSRETURN(2); } else { XSRETURN(1); } } static void XS_play(pTHX_ CV *perlcv) { dXSARGS; if (items == 0) { warn(_("%s: Too few arguments"), "play"); XSRETURN_EMPTY; } play_sound(SvPV_nolen(ST(0))); XSRETURN_EMPTY; } static void XS_stripansi(pTHX_ CV *perlcv) { unsigned char *original; STRLEN len; unsigned char *stripped; dXSARGS; if (items == 0) { warn(_("%s: Too few arguments"), "stripansi"); XSRETURN_EMPTY; } original = (unsigned char *) SvPV(ST(0), len); stripped = strip_ansi(original, len); XST_mPV(0, (char *) stripped); g_free(stripped); XSRETURN(1); } static void XS_setstatus(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { warn(_("%s: Too few arguments"), "setstatus"); XSRETURN_EMPTY; } gtk_label_set_text(world->gui->lblStatus, SvPV_nolen(ST(1))); XSRETURN_EMPTY; } static void XS_trigger(pTHX_ CV *perlcv) { int i = -1; int argpos = 1; int have_pattern = 0; int have_action = 0; int need_recompute = 0; HV *attributes; Trigger *trigger; SV **is_silent; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 2) { warn(_("%s: Too few arguments"), "trigger"); XSRETURN_EMPTY; } /* See if first argument is an integer */ if (SvIOK(ST(1))) { i = SvIV(ST(1)); argpos = 2; if (items < 3) { warn(_("%s: Too few arguments"), "trigger"); XSRETURN_EMPTY; } } if (i == -1) { trigger = new_trigger(); trigger->enabled = 1; /* Starts enabled by default */ if (world->plugins_being_defined) { trigger->owner_plugin = world->plugins_being_defined->data; } } else { trigger = (Trigger *) g_slist_nth_data(world->triggers, i); if (!trigger) { ansitextview_append_string_nl(world->gui, _("No such trigger")); XSRETURN_EMPTY; } } while (argpos < items) { switch (SvTYPE(ST(argpos))) { case SVt_PV: if (!have_pattern) { g_free(trigger->pattern); trigger->pattern = g_strdup(SvPV_nolen(ST(argpos))); need_recompute = TRUE; have_pattern = 1; } else if (!have_action) { g_free(trigger->action); trigger->action = g_strdup(SvPV_nolen(ST(argpos))); have_action = 1; } else { warn(_("%s: Too many string arguments"), "trigger"); if (i == -1) { g_free(trigger); } XSRETURN_EMPTY; } break; case SVt_RV: if (SvTYPE(SvRV(ST(argpos))) == SVt_PVHV) { SV **value; attributes = (HV *) SvRV(ST(argpos)); value = hv_fetch(attributes, "name", 4, FALSE); if (value) { g_free(trigger->name); trigger->name = g_strdup(SvPV_nolen(*value)); } value = hv_fetch(attributes, "pattern", 7, FALSE); if (value) { if (have_pattern) { warn(_("%s: pattern given twice, using the named attribute one"), "trigger"); } g_free(trigger->pattern); trigger->pattern = g_strdup(SvPV_nolen(*value)); need_recompute = TRUE; have_pattern = 1; } value = hv_fetch(attributes, "action", 6, FALSE); if (value) { if (have_action) { warn(_("%s: action given twice, using the named attribute one"), "trigger"); } g_free(trigger->action); trigger->action = g_strdup(SvPV_nolen(*value)); have_action = 1; } value = hv_fetch(attributes, "ignorecase", 10, FALSE); if (value) { int newval = SvIV(*value); need_recompute |= (newval != trigger->ignore_case); trigger->ignore_case = newval; } value = hv_fetch(attributes, "gag", 3, FALSE); if (value) { trigger->gag_output = SvIV(*value); } value = hv_fetch(attributes, "gaglog", 6, FALSE); if (value) { trigger->gag_log = SvIV(*value); } value = hv_fetch(attributes, "enabled", 7, FALSE); if (value) { trigger->enabled = SvIV(*value); } value = hv_fetch(attributes, "keepexecuting", 13, FALSE); if (value) { trigger->keepexecuting = SvIV(*value); } value = hv_fetch(attributes, "rewriter", 8, FALSE); if (value) { trigger->rewriter = SvIV(*value); } value = hv_fetch(attributes, "style", 5, FALSE); if (value) { fill_highlight(trigger, (HV *) SvRV(*value)); } } else { warn(_("%s: Wrong type of reference"), "trigger"); if (i == -1) { g_free(trigger); } XSRETURN_EMPTY; } break; default: warn(_("%s: Wrong argument type"), "trigger"); if (i == -1) { g_free(trigger); } XSRETURN_EMPTY; } ++argpos; } if (i == -1) { if (!have_pattern) { warn(_("%s: pattern not specified, not creating"), "trigger"); if (i == -1) { g_free(trigger); } XSRETURN_EMPTY; } if (!have_action && !trigger->gag_output && !trigger->gag_log) { warn(_("%s: action not specified, and isn't gag, not creating"), "trigger"); if (i == -1) { g_free(trigger); } XSRETURN_EMPTY; } } if (need_recompute) { if (trigger->pattern_re) { SvREFCNT_dec(trigger->pattern_re); } trigger->pattern_re = precompute_re(world->perl_interpreter, trigger->pattern, trigger->ignore_case); } is_silent = hv_fetch(self, "SILENT", 6, FALSE); if (i == -1) { if (trigger->owner_plugin) { world->triggers = g_slist_append(world->triggers, trigger); we_trigger_insert_trigger(world, trigger, g_slist_length(world->triggers) - 1); } else { world->triggers = g_slist_insert(world->triggers, trigger, world->trigger_pos); we_trigger_insert_trigger(world, trigger, world->trigger_pos++); if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Trigger added.")); } } } else { if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Trigger modified.")); } we_trigger_update_trigger(world, trigger); } XSRETURN_EMPTY; } static void fill_highlight(Trigger *trigger, HV *style) { SV **value; int ival; value = hv_fetch(style, "enabled", 7, FALSE); if (value) { trigger->highlight = SvIV(*value); } value = hv_fetch(style, "target", 6, FALSE); if (value) { ival = SvIV(*value); if (ival < -1) { warn(_("%s: invalid target"), "trigger"); } else { trigger->high_target = ival; } } value = hv_fetch(style, "fg", 2, FALSE); if (value) { ival = SvIV(*value); if (ival < -1 || ival > ANSI_N_COLORS_HIGHLIGHT) { warn(_("%s: invalid fg color"), "trigger"); } else { trigger->high_fg_color = ival; } } value = hv_fetch(style, "bg", 2, FALSE); if (value) { ival = SvIV(*value); if (ival < -1 || ival > ANSI_N_COLORS_HIGHLIGHT) { warn(_("%s: invalid bg color"), "trigger"); } else { trigger->high_bg_color = ival; } } value = hv_fetch(style, "underline", 9, FALSE); if (value) { ival = SvIV(*value); if (ival < -1 || ival > 2) { warn(_("%s: invalid underline style"), "trigger"); } else { trigger->high_underline = ival; } } value = hv_fetch(style, "italics", 7, FALSE); if (value) { ival = SvIV(*value); if (ival < 0) { trigger->high_italic = -1; } else { /* So that it becomes 0 or 1 */ trigger->high_italic = !!ival; } } value = hv_fetch(style, "strike", 6, FALSE); if (value) { ival = SvIV(*value); if (ival < 0) { trigger->high_strike = -1; } else { /* So that it becomes 0 or 1 */ trigger->high_strike = !!ival; } } } static void XS__listtrigger(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; Trigger *trigger; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { ansitextview_append_string(world->gui, "\n"); list_triggers(world, NULL); XSRETURN_EMPTY; } i = SvIV(ST(1)); trigger = (Trigger *) g_slist_nth_data(world->triggers, i); if (!trigger) { ansitextview_append_string_nl(world->gui, _("No such trigger")); XSRETURN_NO; } ansitextview_append_stringf(world->gui, _("Trigger number %d\n" " Name: %s\n" " Pattern: %s\n" " Action: %s\n" " Enabled: %s\n" " Ignore case: %s\n" " Gag output: %s\n" " Gag in log: %s\n" " Keep executing: %s\n" " Rewriter: %s\n" " Change style: %s\n"), i, trigger->name ? trigger->name : _("Not set"), trigger->pattern, trigger->action ? trigger->action : "", trigger->ignore_case ? _("yes") : _("no"), trigger->gag_output ? _("yes") : _("no"), trigger->gag_log ? _("yes") : _("no"), trigger->enabled ? _("yes") : _("no"), trigger->keepexecuting ? _("yes") : _("no"), trigger->rewriter ? _("yes") : _("no"), trigger->highlight ? _("yes") : _("no")); if (trigger->highlight) { ansitextview_append_stringf(world->gui, _(" Target: %d\n" " Foreground: %d\n" " Background: %d\n" " Italics: %d\n" " Striked-thru: %d\n" " Underline: %d\n"), trigger->high_target, trigger->high_fg_color, trigger->high_bg_color, trigger->high_italic, trigger->high_strike, trigger->high_underline); } XSRETURN_YES; } static void XS__deltrigger(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; GSList *triggeritem; FETCHWORLDVARS; dXSARGS; FETCHWORLD; i = SvIV(ST(1)); triggeritem = g_slist_nth(world->triggers, i); if (!triggeritem) { XSRETURN_NO; } remove_trigger(world, triggeritem); XSRETURN_YES; } static void XS__movetrigger(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int old_pos; int new_pos; FETCHWORLDVARS; dXSARGS; FETCHWORLD; old_pos = SvIV(ST(1)); new_pos = SvIV(ST(2)); if (new_pos < 0 || new_pos >= world->trigger_pos) { new_pos = world->trigger_pos - 1; } if (move_trigger(world, old_pos, new_pos)) { XSRETURN_YES; } else { XSRETURN_NO; } } static void XS__getobjectnumber(pTHX_ CV *perlcv) { /* Not to be called by user. Arguments: name to match object type (0: trigger, 1: alias, 2: macro, 3: timer, 4:hook) search type (0: by name, 1: by owner plugin) [optional] hook event name, if we are dealing with a hook */ GSList *tofind = NULL; GSList *found; GSList *iter; int i; int searchtype; FETCHWORLDVARS; dXSARGS; searchtype = SvIV(ST(3)); FETCHWORLD; switch (SvIV(ST(2))) { case 0: tofind = world->triggers; break; case 1: tofind = world->aliases; break; case 2: tofind = world->macros; break; case 3: tofind = world->timers; break; case 4: tofind = get_hook_list_for_reading(world, SvPV_nolen(ST(4)), NULL); if (!tofind) { XSRETURN(0); } break; } found = get_object_numbers(tofind, SvPV_nolen(ST(1)), searchtype); i = 0; iter = found; while (iter) { XST_mIV(i++, GPOINTER_TO_INT(iter->data)); iter = iter->next; } g_slist_free(found); XSRETURN(i); } static void XS__objectenabled(pTHX_ CV *perlcv) { /* Not to be called by user. Arguments: name to match object type (0: trigger, 1: alias, 2: macro, 3: timer, 4:hook) name of object [optional] hook event name, if we are dealing with a hook Returns: TRUE/FALSE if object is enabled. If there are several with the same name, returns a list. */ GSList *tofind = NULL; GeneralObject *obj; int i; int j; int num_to_find; char *name_to_find = NULL; FETCHWORLDVARS; dXSARGS; FETCHWORLD; switch (SvIV(ST(2))) { case 0: tofind = world->triggers; break; case 1: tofind = world->aliases; break; case 2: tofind = world->macros; break; case 3: tofind = world->timers; break; case 4: tofind = get_hook_list_for_reading(world, SvPV_nolen(ST(4)), NULL); if (!tofind) { XSRETURN(0); } break; } if (SvIOK(ST(1))) { num_to_find = SvIV(ST(1)); if (num_to_find < 0) { XSRETURN_EMPTY; } } else { num_to_find = -1; name_to_find = SvPV_nolen(ST(1)); } i = 0; j = 0; while (tofind) { obj = (GeneralObject *) tofind->data; if (num_to_find != -1 && num_to_find == i) { XST_mIV(0, obj->enabled); XSRETURN(1); } if (num_to_find == -1 && obj->name && strcmp(name_to_find, obj->name) == 0) { XST_mIV(j, obj->enabled); ++j; } ++i; tofind = tofind->next; } XSRETURN(j); } static void XS_alias(pTHX_ CV *perlcv) { int i = -1; int argpos = 1; int have_pattern = 0; int have_substitution = 0; int need_recompute = 0; HV *attributes; Alias *alias; SV **is_silent; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 2) { warn(_("%s: Too few arguments"), "alias"); XSRETURN_EMPTY; } /* See if first argument is an integer */ if (SvIOK(ST(1))) { i = SvIV(ST(1)); argpos = 2; if (items < 3) { warn(_("%s: Too few arguments"), "alias"); XSRETURN_EMPTY; } } if (i == -1) { alias = g_new0(Alias, 1); alias->enabled = 1; /* Starts enabled by default */ if (world->plugins_being_defined) { alias->owner_plugin = world->plugins_being_defined->data; } } else { alias = (Alias *) g_slist_nth_data(world->aliases, i); if (!alias) { ansitextview_append_string_nl(world->gui, _("No such alias")); XSRETURN_EMPTY; } } while (argpos < items) { switch (SvTYPE(ST(argpos))) { case SVt_PV: if (!have_pattern) { g_free(alias->pattern); alias->pattern = g_strdup(SvPV_nolen(ST(argpos))); need_recompute = 1; have_pattern = 1; } else if (!have_substitution) { g_free(alias->substitution); alias->substitution = g_strdup(SvPV_nolen(ST(argpos))); have_substitution = 1; } else { warn(_("%s: Too many string arguments"), "alias"); if (i == -1) { g_free(alias); } XSRETURN_EMPTY; } break; case SVt_RV: if (SvTYPE(SvRV(ST(argpos))) == SVt_PVHV) { SV** value; attributes = (HV *) SvRV(ST(argpos)); value = hv_fetch(attributes, "name", 4, FALSE); if (value) { g_free(alias->name); alias->name = g_strdup(SvPV_nolen(*value)); } value = hv_fetch(attributes, "pattern", 7, FALSE); if (value) { if (have_pattern) { warn(_("%s: pattern given twice, using the named attribute one"), "alias"); } g_free(alias->pattern); alias->pattern = g_strdup(SvPV_nolen(*value)); need_recompute = 1; have_pattern = 1; } value = hv_fetch(attributes, "substitution", 12, FALSE); if (value) { if (have_substitution) { warn(_("%s: substitution given twice, using the named attribute one"), "alias"); } g_free(alias->substitution); alias->substitution = g_strdup(SvPV_nolen(*value)); have_substitution = 1; } value = hv_fetch(attributes, "ignorecase", 10, FALSE); if (value) { int newval = SvIV(*value); need_recompute |= (newval != alias->ignore_case); alias->ignore_case = newval; } value = hv_fetch(attributes, "perleval", 8, FALSE); if (value) { alias->perl_eval = SvIV(*value); } value = hv_fetch(attributes, "enabled", 7, FALSE); if (value) { alias->enabled = SvIV(*value); } } else { warn(_("%s: Wrong type of reference"), "alias"); if (i == -1) { g_free(alias); } XSRETURN_EMPTY; } break; default: warn(_("%s: Wrong argument type"), "alias"); if (i == -1) { g_free(alias); } XSRETURN_EMPTY; } ++argpos; } if (i == -1) { if (!have_pattern) { warn(_("alias: not creating alias without pattern")); if (i == -1) { g_free(alias); } XSRETURN_EMPTY; } if (!have_substitution) { warn(_("alias: not creating alias without substitution")); if (i == -1) { g_free(alias); } XSRETURN_EMPTY; } } if (need_recompute) { if (alias->pattern_re) { SvREFCNT_dec(alias->pattern_re); } alias->pattern_re = precompute_re(world->perl_interpreter, alias->pattern, alias->ignore_case); } is_silent = hv_fetch(self, "SILENT", 6, FALSE); if (i == -1) { if (alias->owner_plugin) { world->aliases = g_slist_append(world->aliases, alias); we_alias_insert_alias(world, alias, g_slist_length(world->aliases) - 1); } else { world->aliases = g_slist_insert(world->aliases, alias, world->alias_pos); we_alias_insert_alias(world, alias, world->alias_pos++); if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Alias added.")); } } } else { if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Alias modified.")); } we_alias_update_alias(world, alias); } XSRETURN_EMPTY; } static void XS_expandalias(pTHX_ CV *perlcv) { GSList *aliasptr; Alias *alias; char *line; char *resultline; SV *re; SV *tmp; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { warn(_("%s: Too few arguments"), "expandalias"); XSRETURN_EMPTY; } line = SvPV_nolen(ST(1)); tmp = get_sv("_tmpexpalias", TRUE); sv_setpv(tmp, line); aliasptr = world->aliases; while (aliasptr) { gchar *subcmd; alias = (Alias *) aliasptr->data; if (!alias->enabled) { break; } /* Set the regexp in a variable */ re = get_sv("_re", TRUE); sv_setsv(re, alias->pattern_re); subcmd = g_strdup_printf("$_tmpexpalias =~ s\x05$_re\x05%s\x05%s;", alias->substitution, alias->perl_eval ? "e" : ""); eval_pv(subcmd, TRUE); g_free(subcmd); aliasptr = aliasptr->next; } resultline = SvPV_nolen(tmp); XST_mPV(0, resultline); XSRETURN(1); } static void XS__listalias(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; Alias *alias; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { ansitextview_append_string(world->gui, "\n"); list_aliases(world, NULL); XSRETURN_EMPTY; } i = SvIV(ST(1)); alias = (Alias *) g_slist_nth_data(world->aliases, i); if (!alias) { ansitextview_append_string_nl(world->gui, _("No such alias")); XSRETURN_NO; } ansitextview_append_stringf(world->gui, _("Alias number %d\n" " Name: %s\n" " Pattern: %s\n" " Substitution: %s\n" " Ignore case: %s\n" " Eval as Perl: %s\n" " Enabled: %s\n"), i, alias->name ? alias->name : _("Not set"), alias->pattern, alias->substitution, alias->ignore_case ? _("yes") : _("no"), alias->perl_eval ? _("yes") : _("no"), alias->enabled ? _("yes") : _("no")); XSRETURN_YES; } static void XS__delalias(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; GSList *aliasitem; FETCHWORLDVARS; dXSARGS; FETCHWORLD; i = SvIV(ST(1)); aliasitem = g_slist_nth(world->aliases, i); if (!aliasitem) { XSRETURN_NO; } remove_alias(world, aliasitem); XSRETURN_YES; } static void XS__movealias(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int old_pos; int new_pos; FETCHWORLDVARS; dXSARGS; FETCHWORLD; old_pos = SvIV(ST(1)); new_pos = SvIV(ST(2)); if (new_pos < 0 || new_pos >= world->alias_pos) { new_pos = world->alias_pos - 1; } if (move_alias(world, old_pos, new_pos)) { XSRETURN_YES; } else { XSRETURN_NO; } } static void XS_getkeycode(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; ansitextview_append_string_nl(world->gui, _("Press a key to get its keycode.")); world->print_next_keycode = TRUE; gtk_main(); /* After gtk_main_quit() is called in the event handler... */ XST_mPV(0, world->keycode_to_print); g_free(world->keycode_to_print); XSRETURN(1); } static void XS_macro(pTHX_ CV *perlcv) { int i = -1; int have_key = 0; int have_action = 0; int argpos = 1; HV *attributes; Macro *macro; SV **is_silent; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 1) { warn(_("%s: Too few arguments"), "macro"); XSRETURN_EMPTY; } /* See if first argument is an integer */ if (SvIOK(ST(1))) { i = SvIV(ST(1)); argpos = 2; if (items < 3) { warn(_("%s: Too few arguments"), "macro"); XSRETURN_EMPTY; } } if (i == -1) { macro = g_new0(Macro, 1); macro->enabled = 1; if (world->plugins_being_defined) { macro->owner_plugin = world->plugins_being_defined->data; } } else { macro = (Macro *) g_slist_nth_data(world->macros, i); if (!macro) { ansitextview_append_string_nl(world->gui, _("macro: No such macro")); XSRETURN_EMPTY; } } while (argpos < items) { switch (SvTYPE(ST(argpos))) { case SVt_PV: if (!have_key) { guint keyval; GdkModifierType modifiers; gtk_accelerator_parse(SvPV_nolen(ST(argpos)), &keyval, &modifiers); if (keyval) { macro->keyval = keyval; macro->modifiers = modifiers; have_key = 1; } else { warn(_("%s: Invalid key code"), "macro"); if (i == -1) { g_free(macro); } XSRETURN_EMPTY; } } else if (!have_action) { g_free(macro->action); macro->action = g_strdup(SvPV_nolen(ST(argpos))); have_action = 1; } else { warn(_("%s: Too many string arguments"), "macro"); if (i == -1) { g_free(macro); } XSRETURN_EMPTY; } break; case SVt_RV: if (SvTYPE(SvRV(ST(argpos))) == SVt_PVHV) { SV** value; attributes = (HV *) SvRV(ST(argpos)); value = hv_fetch(attributes, "name", 4, FALSE); if (value) { g_free(macro->name); macro->name = g_strdup(SvPV_nolen(*value)); } value = hv_fetch(attributes, "key", 3, FALSE); if (value) { guint keyval; GdkModifierType modifiers; if (have_key) { warn(_("%s: keycode given twice, using the named attribute one"), "macro"); } gtk_accelerator_parse(SvPV_nolen(*value), &keyval, &modifiers); if (keyval) { macro->keyval = keyval; macro->modifiers = modifiers; have_key = 1; } else { warn(_("%s: Invalid key code"), "macro"); if (i == -1) { g_free(macro); } XSRETURN_EMPTY; } have_key = 1; } value = hv_fetch(attributes, "action", 6, FALSE); if (value) { if (have_action) { warn(_("%s: action given twice, using the named attribute one"), "macro"); } g_free(macro->action); macro->action = g_strdup(SvPV_nolen(*value)); have_action = 1; } value = hv_fetch(attributes, "enabled", 7, FALSE); if (value) { macro->enabled = SvIV(*value); } } else { warn(_("%s: Wrong type of reference"), "macro"); if (i == -1) { g_free(macro); } XSRETURN_EMPTY; } break; default: warn(_("%s: Wrong argument type"), "macro"); if (i == -1) { g_free(macro); } XSRETURN_EMPTY; } ++argpos; } /* Verification of required arguments */ if (i == -1 && !have_key) { warn(_("%s: keycode not specified, not creating"), "macro"); if (i == -1) { g_free(macro); } XSRETURN_EMPTY; } if (i == -1 && !have_action) { warn(_("%s: action not specified, not creating"), "macro"); if (i == -1) { g_free(macro); } XSRETURN_EMPTY; } is_silent = hv_fetch(self, "SILENT", 6, FALSE); if (i == -1) { if (macro->owner_plugin) { world->macros = g_slist_append(world->macros, macro); we_macro_insert_macro(world, macro, g_slist_length(world->macros) - 1); } else { world->macros = g_slist_insert(world->macros, macro, world->macro_pos); we_macro_insert_macro(world, macro, world->macro_pos++); if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Macro added.")); } } } else { if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Macro modified.")); } we_macro_update_macro(world, macro); } XSRETURN_EMPTY; } static void XS__listmacro(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; Macro *macro; char *keycodestr; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { ansitextview_append_string(world->gui, "\n"); list_macros(world, NULL); XSRETURN_EMPTY; } i = SvIV(ST(1)); macro = (Macro *) g_slist_nth_data(world->macros, i); if (!macro) { ansitextview_append_string_nl(world->gui, _("No such macro")); XSRETURN_NO; } keycodestr = gtk_accelerator_name(macro->keyval, macro->modifiers); ansitextview_append_stringf(world->gui, _("Macro number %d\n" " Name: %s\n" " Key Code: %s\n" " Action: %s\n" " Enabled: %s\n"), i, macro->name ? macro->name : _("Not set"), keycodestr, macro->action, macro->enabled ? _("yes") : _("no")); g_free(keycodestr); XSRETURN_YES; } static void XS__delmacro(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; GSList *macroitem; FETCHWORLDVARS; dXSARGS; FETCHWORLD; i = SvIV(ST(1)); macroitem = g_slist_nth(world->macros, i); if (!macroitem) { XSRETURN_NO; } remove_macro(world, macroitem); XSRETURN_YES; } static void XS__movemacro(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int old_pos; int new_pos; FETCHWORLDVARS; dXSARGS; FETCHWORLD; old_pos = SvIV(ST(1)); new_pos = SvIV(ST(2)); if (new_pos < 0 || new_pos >= world->macro_pos) { new_pos = world->macro_pos - 1; } if (move_macro(world, old_pos, new_pos)) { XSRETURN_YES; } else { XSRETURN_NO; } } static void XS_timer(pTHX_ CV *perlcv) { int i = -1; int argpos = 1; int new_interval = 0; int new_enabled = -999; HV *attributes; SV **value; Timer *timer; SV **is_silent; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 2) { warn(_("%s: Too few arguments"), "timer"); XSRETURN_EMPTY; } /* See if first argument is an integer */ if (SvIOK(ST(1))) { i = SvIV(ST(1)); argpos = 2; if (items < 3) { warn(_("%s: Too few arguments"), "timer"); XSRETURN_EMPTY; } } if (i == -1) { timer = g_new0(Timer, 1); timer->for_world = world; timer->count = -1; if (world->plugins_being_defined) { timer->owner_plugin = world->plugins_being_defined->data; } } else { timer = (Timer *) g_slist_nth_data(world->timers, i); if (!timer) { ansitextview_append_string_nl(world->gui, _("timer: No such timer")); XSRETURN_EMPTY; } } if (!SvROK(ST(argpos)) || SvTYPE(SvRV(ST(argpos))) != SVt_PVHV) { warn(_("%s: Wrong argument type"), "timer"); if (i == -1) { g_free(timer); } XSRETURN_EMPTY; } /* Fetch attributes */ attributes = (HV *) SvRV(ST(argpos)); value = hv_fetch(attributes, "name", 4, FALSE); if (value) { g_free(timer->name); timer->name = g_strdup(SvPV_nolen(*value)); } value = hv_fetch(attributes, "interval", 8, FALSE); if (value) { if (!SvIOK(*value)) { warn(_("%s: interval must be numeric"), "timer"); if (i == -1) { g_free(timer); } XSRETURN_EMPTY; } new_interval = SvIV(*value); } value = hv_fetch(attributes, "count", 5, FALSE); if (value) { if (!SvIOK(*value)) { warn(_("%s: count must be numeric"), "timer"); if (i == -1) { g_free(timer); } XSRETURN_EMPTY; } timer->count = SvIV(*value); if (timer->count < 0) { timer->count = -1; } } value = hv_fetch(attributes, "action", 6, FALSE); if (value) { g_free(timer->action); timer->action = g_strdup(SvPV_nolen(*value)); } value = hv_fetch(attributes, "temporary", 9, FALSE); if (value) { timer->temporary = SvIV(*value); } value = hv_fetch(attributes, "enabled", 7, FALSE); if (value) { new_enabled = SvIV(*value); } /* Verification of required arguments */ if (new_interval == 0 && i == -1) { warn(_("%s: interval not specified, not creating"), "timer"); if (i == -1) { g_free(timer); } XSRETURN_EMPTY; } /* Recreate timer function if interval is changed */ if (i != -1 && new_enabled == -999 && new_interval && new_interval != timer->interval) { g_source_remove(timer->function_id); timer->function_id = g_timeout_add(new_interval * 1000, run_timer, timer); } if (new_interval) { timer->interval = new_interval; } if (!timer->action) { warn(_("%s: action not specified, not creating"), "timer"); if (i == -1) { g_free(timer); } XSRETURN_EMPTY; } /* See if we are enabling or disabling */ if (i == -1 && new_enabled == -999) { /* New timers enabled */ new_enabled = 1; /* by default */ } if (new_enabled != -999) { if (timer->enabled && !new_enabled) { g_source_remove(timer->function_id); } else if (!timer->enabled && new_enabled) { timer->function_id = g_timeout_add(timer->interval * 1000, run_timer, timer); } } timer->enabled = new_enabled; /* A little bonus :-) */ if (timer->enabled && timer->count == 0) { timer->count = 1; } is_silent = hv_fetch(self, "SILENT", 6, FALSE); if (i == -1) { if (timer->owner_plugin) { world->timers = g_slist_append(world->timers, timer); we_timer_insert_timer(world, timer, g_slist_length(world->timers) - 1); } else { world->timers = g_slist_insert(world->timers, timer, world->timer_pos); we_timer_insert_timer(world, timer, world->timer_pos++); if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Timer added.")); } } } else { if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Timer modified.")); } we_timer_update_timer(world, timer); } XSRETURN_EMPTY; } static void XS__listtimer(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; Timer *timer; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { ansitextview_append_string(world->gui, "\n"); list_timers(world, NULL); XSRETURN_EMPTY; } i = SvIV(ST(1)); timer = (Timer *) g_slist_nth_data(world->timers, i); if (!timer) { ansitextview_append_string_nl(world->gui, _("No such timer")); XSRETURN_NO; } ansitextview_append_stringf(world->gui, _("Timer number %d\n" " Name: %s\n" " Interval: %d\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n"), i, timer->name ? timer->name : _("Not set"), timer->interval, timer->count, timer->action, timer->enabled ? _("yes") : _("no"), timer->temporary ? _("yes") : _("no")); XSRETURN_YES; } static void XS__deltimer(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; GSList *timeritem; FETCHWORLDVARS; dXSARGS; FETCHWORLD; i = SvIV(ST(1)); timeritem = g_slist_nth(world->timers, i); if (!timeritem) { XSRETURN_NO; } remove_timer(world, timeritem); XSRETURN_YES; } static void XS__movetimer(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int old_pos; int new_pos; FETCHWORLDVARS; dXSARGS; FETCHWORLD; old_pos = SvIV(ST(1)); new_pos = SvIV(ST(2)); if (new_pos < 0 || new_pos >= world->timer_pos) { new_pos = world->timer_pos - 1; } if (move_timer(world, old_pos, new_pos)) { XSRETURN_YES; } else { XSRETURN_NO; } } static void XS_makepermanent(pTHX_ CV *perlcv) { char *var; int i; SV **is_silent; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 2) { warn(_("%s: Too few arguments"), "makepermanent"); XSRETURN_EMPTY; } is_silent = hv_fetch(self, "SILENT", 6, FALSE); for (i = 1; i < items; ++i) { var = SvPV_nolen(ST(i)); if (var[0] != '$' && var[0] != '@' && var[0] != '%') { warn(_("%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent"), "makepermanent"); continue; } if (g_slist_find_custom(world->permanent_variables, var, (GCompareFunc) strcmp)) { if (!world->plugins_being_defined) { warn(_("%s: %s is already permanent"), "makepermanent", var); } continue; } var = g_strdup(var); world->permanent_variables = g_slist_append(world->permanent_variables, var); we_var_insert_var(world, var, -1); if (!world->plugins_being_defined && (!is_silent || !SvIV(*is_silent))) { ansitextview_append_stringf(world->gui, _("%s: Variable '%s' made permanent.\n"), "makepermanent", var); } } XSRETURN_EMPTY; } static void XS_maketemporary(pTHX_ CV *perlcv) { char *var; int i; GSList *list; SV **is_silent; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 2) { warn(_("%s: Too few arguments"), "maketemporary"); XSRETURN_EMPTY; } is_silent = hv_fetch(self, "SILENT", 6, FALSE); for (i = 1; i < items; ++i) { var = SvPV_nolen(ST(i)); list = g_slist_find_custom(world->permanent_variables, var, (GCompareFunc) strcmp); if (list) { we_var_delete_var(world, (const gchar *) list->data); g_free(list->data); world->permanent_variables = g_slist_delete_link(world->permanent_variables, list); if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_stringf(world->gui, _("%s: Variable '%s' made temporary.\n"), "maketemporary", var); } } else { warn(_("%s: %s is not permanent"), "maketemporary", var); continue; } } XSRETURN_EMPTY; } static void XS_ispermanent(pTHX_ CV *perlcv) { char *var; GSList *list; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 2) { warn(_("%s: Too few arguments"), "ispermanent"); XSRETURN_EMPTY; } var = SvPV_nolen(ST(1)); list = g_slist_find_custom(world->permanent_variables, var, (GCompareFunc) strcmp); if (list) { XST_mIV(0, TRUE); } else { XST_mIV(0, FALSE); } XSRETURN(1); } static void XS_listpermanent(pTHX_ CV *perlcv) { GSList *var; FETCHWORLDVARS; dXSARGS; FETCHWORLD; ansitextview_append_string(world->gui, "\n"); ansitextview_append_string_nl(world->gui, _("Permanent variables")); ansitextview_append_string_nl(world->gui, "-------------------"); var = world->permanent_variables; while (var) { ansitextview_append_string(world->gui, " "); ansitextview_append_string_nl(world->gui, (char *) var->data); var = var->next; } XSRETURN_EMPTY; } static void XS_hook(pTHX_ CV *perlcv) { int i = -1; char *hook = NULL; int argpos = 2; int have_action = 0; char *action = NULL; char *name = NULL; int enabled = 1; HV *attributes; SV **is_silent; FETCHWORLDVARSFULL; dXSARGS; FETCHWORLDFULL; if (items < 3) { warn(_("%s: Too few arguments"), "hook"); XSRETURN_EMPTY; } hook = SvPV_nolen(ST(1)); /* See if first argument is an integer */ if (SvIOK(ST(2))) { i = SvIV(ST(2)); argpos = 3; if (items < 4) { warn(_("%s: Too few arguments"), "hook"); XSRETURN_EMPTY; } } while (argpos < items) { switch (SvTYPE(ST(argpos))) { case SVt_PV: if (!have_action) { action = g_strdup(SvPV_nolen(ST(argpos))); have_action = 1; } else { warn(_("%s: Too many string arguments"), "hook"); g_free(action); XSRETURN_EMPTY; } break; case SVt_RV: if (SvTYPE(SvRV(ST(argpos))) == SVt_PVHV) { SV** value; attributes = (HV *) SvRV(ST(argpos)); value = hv_fetch(attributes, "name", 4, FALSE); if (value) { name = g_strdup(SvPV_nolen(*value)); } value = hv_fetch(attributes, "action", 6, FALSE); if (value) { if (have_action) { warn(_("%s: action given twice, using the named attribute one"), "hook"); g_free(action); } action = g_strdup(SvPV_nolen(*value)); have_action = 1; } value = hv_fetch(attributes, "enabled", 7, FALSE); if (value) { enabled = SvIV(*value); } } else { warn(_("%s: Wrong type of reference"), "hook"); g_free(action); g_free(name); XSRETURN_EMPTY; } break; default: warn(_("%s: Wrong argument type"), "hook"); g_free(action); g_free(name); XSRETURN_EMPTY; } ++argpos; } is_silent = hv_fetch(self, "SILENT", 6, FALSE); if (connect_hook(world, hook, i, action, name, enabled)) { if (i == -1) { if (!world->plugins_being_defined && (!is_silent || !SvIV(*is_silent))) { ansitextview_append_string_nl(world->gui, _("Hook defined.")); } } else { if (!is_silent || !SvIV(*is_silent)) { ansitextview_append_string_nl(world->gui, _("Hook modified.")); } } } XSRETURN_EMPTY; } static void XS__listhook(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items < 2) { warn(_("%s: Too few arguments"), "listhook"); XSRETURN_EMPTY; } if (items == 2) { ansitextview_append_string(world->gui, "\n"); list_hooks(world, SvPV_nolen(ST(1)), NULL); XSRETURN_EMPTY; } i = SvIV(ST(2)); list_hook(world, SvPV_nolen(ST(1)), i); XSRETURN_EMPTY; } static void XS__delhook(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ int i; char *hookname; FETCHWORLDVARS; dXSARGS; FETCHWORLD; hookname = SvPV_nolen(ST(1)); i = SvIV(ST(2)); if (delete_hook(world, hookname, i, NULL)) { XSRETURN_YES; } else { XSRETURN_NO; } } static void XS__movehook(pTHX_ CV *perlcv) { /* Only accepts numbers. For internal use only. */ char *hookname; int old_pos; int new_pos; FETCHWORLDVARS; dXSARGS; FETCHWORLD; hookname = SvPV_nolen(ST(1)); old_pos = SvIV(ST(2)); new_pos = SvIV(ST(3)); if (move_hook(world, hookname, old_pos, new_pos)) { XSRETURN_YES; } else { XSRETURN_NO; } } static void XS_logfile(pTHX_ CV *perlcv) { char *tmp; char *errmsg = NULL; FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* This will be overwritten if there are two arguments. */ world->log_add_time = FALSE; /* If logging is started, it must be finished to start again in the new file and/or with the new format. */ if (world->log_file) { stop_log(world); } switch (items) { case 1: ansitextview_append_string_nl(world->gui, _("Logging stopped.")); break; case 3: world->log_add_time = TRUE; tmp = SvPV_nolen(ST(2)); g_free(world->log_timeformat); world->log_timeformat = g_strdup(tmp); /* FALL THROUGH */ case 2: tmp = SvPV_nolen(ST(1)); g_free(world->log_file_name); world->log_file_name = g_strdup(tmp); if (start_log(world, 0, &errmsg)) { ansitextview_append_stringf(world->gui, _("Logging to file %s.\n"), world->log_actual_file); } else { ansitextview_append_string_nl(world->gui, errmsg); g_free(errmsg); } break; } fill_we_logging_tab(world, NULL); XSRETURN_EMPTY; } static void XS_getlogfile(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (world->log_file) { XST_mPV(0, world->log_actual_file); XSRETURN(1); } else { XSRETURN_UNDEF; } } static void XS__writetolog(pTHX_ CV *perlcv) { /* This function simply writes the line, with color codes and ANSI codes, if present. It is not meant to be called by the user. */ char *line; int i; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (!world->log_file) { XSRETURN_EMPTY; } for (i = 1; i < items; ++i) { line = SvPV_nolen(ST(i)); write_log_line(world, line, NULL); } XSRETURN_EMPTY; } static GSList * get_object_numbers(GSList *list, const char *name, int searchtype) { /* To avoid the need of four virtually equal functions, for triggers, aliases, macros and timers, this function is a hack that works for all of them. It exploits the fact that the four structures have the name as the first member and owner plugin as second, and uses some casting to retrieve it. */ GSList *found = NULL; GeneralObject *obj; char *tried_name = NULL; int i = 0; while (list) { obj = (GeneralObject *) list->data; if (searchtype == 0) { tried_name = obj->name; } else if (searchtype == 1) { if (obj->owner_plugin) { tried_name = obj->owner_plugin->name; } else { tried_name = NULL; } } if (tried_name && strcmp(name, tried_name) == 0) { found = g_slist_append(found, GINT_TO_POINTER(i)); } ++i; list = list->next; } return found; } static void XS_listplugin(pTHX_ CV *perlcv) { guint i; guint total_width; guint field1_width; guint field2_width; GSList *pluginptr; Plugin *plugin; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { /* The rows argument is not used. */ ansitextview_get_size(world->gui, &field1_width, &total_width); /* If the screen is really narrow, we can do nothing. */ if (total_width < 35) { total_width = 35; } field1_width = (total_width - 17)*.3; field2_width = (total_width - 17)*.7; ansitextview_append_stringf(world->gui, _("Num Ena %-*.*s Version %-*.*s\n"), field1_width, field1_width, _("Name"), field2_width, field2_width, _("Description")); ansitextview_append_string(world->gui, "--- --- "); for (i = 0; i < field1_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, " ------- "); for (i = 0; i < field2_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, "\n"); i = 0; pluginptr = world->plugins; while (pluginptr) { plugin = (Plugin *) pluginptr->data; ansitextview_append_stringf(world->gui, "%3d %-3.3s %-*.*s %-7.7s %-*.*s\n", i, plugin->enabled ? _("y") : _("n"), field1_width, field1_width, plugin->name, plugin->version, field2_width, field2_width, plugin->description); ++i; pluginptr = pluginptr->next; } XSRETURN_EMPTY; } if (SvIOK(ST(1))) { i = SvIV(ST(1)); plugin = (Plugin *) g_slist_nth_data(world->plugins, i); } else { plugin = get_plugin(world, SvPV_nolen(ST(1))); i = g_slist_index(world->plugins, plugin); } if (!plugin) { ansitextview_append_string_nl(world->gui, _("No such plugin")); XSRETURN_NO; } ansitextview_append_stringf(world->gui, _("Plugin number %d\n" " Name: %s\n" " Version: %s\n" " Description: %s\n" " Author: %s\n" " Enabled: %s\n"), i, plugin->name, plugin->version, plugin->description, plugin->author, plugin->enabled ? _("yes") : _("no")); ansitextview_append_string_nl(world->gui, "\nPlugin triggers:"); list_triggers(world, plugin); ansitextview_append_string_nl(world->gui, "\nPlugin aliases:"); list_aliases(world, plugin); ansitextview_append_string_nl(world->gui, "\nPlugin macros:"); list_macros(world, plugin); ansitextview_append_string_nl(world->gui, "\nPlugin timers:"); list_timers(world, plugin); ansitextview_append_string_nl(world->gui, "\nPlugin hooks:"); list_hooks(world, "OnConnect", plugin); ansitextview_append_string(world->gui, "\n"); list_hooks(world, "OnDisconnect", plugin); ansitextview_append_string(world->gui, "\n"); list_hooks(world, "OnReceivedText", plugin); ansitextview_append_string(world->gui, "\n"); list_hooks(world, "OnSentCommand", plugin); ansitextview_append_string(world->gui, "\n"); list_hooks(world, "OnGetFocus", plugin); ansitextview_append_string(world->gui, "\n"); list_hooks(world, "OnLoseFocus", plugin); ansitextview_append_string(world->gui, "\n"); list_hooks(world, "OnCloseConnected", plugin); XSRETURN_YES; } static void XS_getpluginversion(pTHX_ CV *perlcv) { /* Argument: Plugin name. Returns: Plugin version, or empty string. */ Plugin *plugin; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items != 2) { warn(_("%s: Too few arguments"), "getpluginversion"); } plugin = get_plugin(world, SvPV_nolen(ST(1))); if (!plugin) { XST_mPV(0, ""); } else { XST_mPV(0, plugin->version); } XSRETURN(1); } static void XS__startplugin(pTHX_ CV *perlcv) { /* Not meant to be called by user. Arguments: name, version, description, author. */ Plugin *plugin; FETCHWORLDVARS; dXSARGS; FETCHWORLD; plugin = g_new(Plugin, 1); plugin->name = g_strdup(SvPV_nolen(ST(1))); plugin->version = g_strdup(SvPV_nolen(ST(2))); plugin->description = g_strdup(SvPV_nolen(ST(3))); plugin->author = g_strdup(SvPV_nolen(ST(4))); plugin->enabled = TRUE; world->plugins_being_defined = g_slist_prepend(world->plugins_being_defined, plugin); XSRETURN_EMPTY; } static void XS__stopplugin(pTHX_ CV *perlcv) { /* Not meant to be called by user. Argument: 0 to cancel, the plugin was not loaded 1 to add it to list, the plugin was loaded */ Plugin *plugin; FETCHWORLDVARS; dXSARGS; FETCHWORLD; plugin = (Plugin *) world->plugins_being_defined->data; world->plugins_being_defined = g_slist_remove(world->plugins_being_defined, plugin); if (SvTRUE(ST(1))) { world->plugins = g_slist_append(world->plugins, plugin); we_lplugin_insert_plugin(world, plugin); } else { remove_plugin_objects(world, plugin); g_free(plugin); } XSRETURN_EMPTY; } static void XS__markpluginenadis(pTHX_ CV *perlcv) { /* Not meant to be called by user. Arguments: plugin name, new value. */ Plugin *plugin; FETCHWORLDVARS; dXSARGS; FETCHWORLD; plugin = get_plugin(world, SvPV_nolen(ST(1))); plugin->enabled = SvIV(ST(2)); we_lplugin_update_plugin(world, plugin); XSRETURN_EMPTY; } static void xs_init() { /* This is for dynamic loading of modules */ char *file = __FILE__; dXSUB_SYS; /* DynaLoader is a special case */ newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); /* Our subroutines */ newXS("getversion", XS_getversion, ""); newXS("quit", XS_quit, ""); newXS("Window::minimize", XS_window_minimize, "Window"); newXS("Window::getsize", XS_window_getsize, "Window"); newXS("Window::settitle", XS_window_settitle, "Window"); newXS("Window::seturgencyhint", XS_window_seturgencyhint, "Window"); newXS("World::dc", XS_dc, "World"); newXS("World::reconnect", XS_reconnect, "World"); newXS("World::connectother", XS_connectother, "World"); newXS("World::save", XS_save, "World"); newXS("World::close", XS_close, "World"); newXS("World::next", XS_next, "World"); newXS("gotow", XS_gotow, ""); newXS("getworld", XS_getworld, ""); newXS("World::getname", XS_getname, "World"); newXS("World::getcharacter", XS_getcharacter, "World"); newXS("World::getmainfont", XS_getmainfont, "World"); newXS("World::getentryfont", XS_getentryfont, "World"); newXS("World::commandecho", XS_commandecho, "World"); newXS("World::getconntime", XS_getconntime, "World"); newXS("World::getidletime", XS_getidletime, "World"); newXS("World::echo", XS_echo, "World"); newXS("World::send", XS_send, "World"); newXS("World::_mlsend", XS__mlsend, "World"); newXS("World::interpret", XS_interpret, "World"); newXS("World::getline", XS_getline, "World"); newXS("play", XS_play, ""); newXS("stripansi", XS_stripansi, ""); newXS("World::setstatus", XS_setstatus, "World"); newXS("World::trigger", XS_trigger, "World"); newXS("World::_listtrigger", XS__listtrigger, "World"); newXS("World::_deltrigger", XS__deltrigger, "World"); newXS("World::_movetrigger", XS__movetrigger, "World"); newXS("World::_getobjectnumber", XS__getobjectnumber, "World"); newXS("World::_objectenabled", XS__objectenabled, "World"); newXS("World::alias", XS_alias, "World"); newXS("World::expandalias", XS_expandalias, "World"); newXS("World::_listalias", XS__listalias, "World"); newXS("World::_delalias", XS__delalias, "World"); newXS("World::_movealias", XS__movealias, "World"); newXS("World::getkeycode", XS_getkeycode, "World"); newXS("World::macro", XS_macro, "World"); newXS("World::_listmacro", XS__listmacro, "World"); newXS("World::_delmacro", XS__delmacro, "World"); newXS("World::_movemacro", XS__movemacro, "World"); newXS("World::timer", XS_timer, "World"); newXS("World::_listtimer", XS__listtimer, "World"); newXS("World::_deltimer", XS__deltimer, "World"); newXS("World::_movetimer", XS__movetimer, "World"); newXS("World::makepermanent", XS_makepermanent, "World"); newXS("World::maketemporary", XS_maketemporary, "World"); newXS("World::ispermanent", XS_ispermanent, "World"); newXS("World::listpermanent", XS_listpermanent, "World"); newXS("World::hook", XS_hook, "World"); newXS("World::_listhook", XS__listhook, "World"); newXS("World::_delhook", XS__delhook, "World"); newXS("World::_movehook", XS__movehook, "World"); newXS("World::logfile", XS_logfile, "World"); newXS("World::getlogfile", XS_getlogfile, "World"); newXS("World::_writetolog", XS__writetolog, "World"); newXS("World::listplugin", XS_listplugin, "World"); newXS("World::getpluginversion", XS_getpluginversion, "World"); newXS("World::_startplugin", XS__startplugin, "World"); newXS("World::_stopplugin", XS__stopplugin, "World"); newXS("World::_markpluginenadis", XS__markpluginenadis, "World"); /* KCWin subroutines */ newXS("KCWin::_new", XS_KCWin__new, "KCWin"); newXS("KCWin::feed", XS_KCWin_feed, "KCWin"); newXS("KCWin::_destroy", XS_KCWin__destroy, "KCWin"); } kildclient-2.11.1/src/dlgMLSend.glade0000644000175000017500000003663211405233112014237 00000000000000 8 Multi-line send dialog True vertical 4 True 0 1 Send this text _initially: True txtInitial False False 2 True True automatic automatic in True True True Enter some text to be sent to the World 3 True 0 1 Then send the _contents of this file: True txtFile False False 4 True 6 True False 0 _Clear True True True True False False 1 False False 5 True 0 1 _Finally, send this text: True txtFinal False False 6 True True automatic automatic in True True True Enter some text to be sent to the World 7 True False False 8 True 0 1 Add this to the _beginning of each line: True txtStart False False 2 9 True True Specify some text to be prepended to each sent line False False 10 True 0 1 Add this to the _end of each line: True txtEnd False False 2 11 True True Specify some text to be appended to each sent line False False 12 True 4 True _Delay True spnMLSDelay False False 0 True True Specify the delay between sending the group of lines 0 0 100 0.10000000149 1 0 0.10000000149 1 False False 1 True seconds e_ach True spnLinesATime False False 2 True True Specify how many lines are sent at once 1 1 100000 1 10 0 1 False False 3 True line(s) False False 4 False False 4 13 _Keep dialog open after sending True True False True True False False 14 True end gtk-cancel -6 True True True True True False False 0 _Send -5 True True True True True True False False 1 False 2 end 0 kildclient-2.11.1/src/dlgMLSend.ui0000644000175000017500000004014511405233202013572 00000000000000 100 0 1 0.10000000149 0 0 100000 1 10 1 0 1 8 Multi-line send dialog True vertical 4 True 0 1 Send this text _initially: True txtInitial False False 2 True True automatic automatic in True True True Enter some text to be sent to the World 3 True 0 1 Then send the _contents of this file: True txtFile False False 4 True 6 True False 0 _Clear True True True True False False 1 False False 5 True 0 1 _Finally, send this text: True txtFinal False False 6 True True automatic automatic in True True True Enter some text to be sent to the World 7 True False False 8 True 0 1 Add this to the _beginning of each line: True txtStart False False 2 9 True True Specify some text to be prepended to each sent line False False 10 True 0 1 Add this to the _end of each line: True txtEnd False False 2 11 True True Specify some text to be appended to each sent line False False 12 True 4 True _Delay True spnMLSDelay False False 0 True True Specify the delay between sending the group of lines adjustment1 0.10000000149 1 False False 1 True seconds e_ach True spnLinesATime False False 2 True True Specify how many lines are sent at once adjustment2 1 False False 3 True line(s) False False 4 False False 4 13 _Keep dialog open after sending True True False True True False False 14 True end gtk-cancel True True True True True False False 0 _Send True True True True True True False False 1 False 2 end 0 btnMLCancel btnMLSend kildclient-2.11.1/src/permanentvariables.c0000644000175000017500000001130011526001511015437 00000000000000/* $Id: permanentvariables.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include /* Perl includes */ #include #include #include #include "kildclient.h" #include "perlscript.h" /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ void load_permanent_variables(World *world) { gchar *variables_file; if (world->file) { variables_file = g_strdup_printf("%s.var", world->file); perl_script_import_file(world->perl_interpreter, variables_file); g_free(variables_file); } } void save_permanent_variables(World *world) { PerlInterpreter *old_interpreter; gchar *variables_file; GSList *iter; gchar *varname; gchar *command; SV *retval; GString *file_contents; GError *error = NULL; if (!world->file) { return; } variables_file = g_strdup_printf("%s.var", world->file); if (!world->permanent_variables) { /* We don't care if it doesn't exist */ unlink(variables_file); g_free(variables_file); return; } file_contents = g_string_sized_new(512); old_interpreter = PERL_GET_CONTEXT; PERL_SET_CONTEXT(world->perl_interpreter); iter = world->permanent_variables; while (iter) { varname = (char *) iter->data; /* Not really sure why, but turning off the utf8 flag actually makes the dumping output UTF-8 strings, which later are read correctly. */ if (varname[0] == '$') { command = g_strdup_printf("Encode::_utf8_off(%s);" "$__serialized = Data::Dumper->Dump([%s], ['%s']);" "Encode::_utf8_on(%s)", varname, varname, varname+1, varname); } else { command = g_strdup_printf("map { Encode::_utf8_off($_) } %s;" "$__serialized = Data::Dumper->Dump([\\%s], ['*%s']);" "map { Encode::_utf8_on($_) } %s;", varname, varname, varname+1, varname); } eval_pv(command, TRUE); retval = get_sv("__serialized", FALSE); g_string_append(file_contents, SvPV_nolen(retval)); g_free(command); iter = iter->next; } if (!g_file_set_contents(variables_file, file_contents->str, file_contents->len, &error)) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not open file '%s': %s\n" "Variables were not saved."), variables_file, error->message); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); } g_free(variables_file); g_string_free(file_contents, TRUE); PERL_SET_CONTEXT(old_interpreter); } gboolean move_var(World *world, gint old_pos, gint new_pos) { GSList *varitem; gpointer var; varitem = g_slist_nth(world->permanent_variables, old_pos); if (!varitem) { return FALSE; } var = varitem->data; world->permanent_variables = g_slist_delete_link(world->permanent_variables, varitem); world->permanent_variables = g_slist_insert(world->permanent_variables, var, new_pos); we_var_delete_var(world, var); we_var_insert_var(world, var, new_pos); return TRUE; } void free_permanent_variable(gchar *variable, gpointer data) { g_free(variable); } kildclient-2.11.1/src/wndmain.glade0000644000175000017500000006262311405233112014062 00000000000000 KildClient True vertical True True _World True gtk-open True True True True _Reconnect True True _Disconnect True True Connect to _Another True gtk-close True True True True True _Edit... True gtk-save True True True True S_tatistics... True True _Previous True True False True gtk-go-back _Next True True False True gtk-go-forward True gtk-quit True True True True _Edit True gtk-cut True True True gtk-copy True True True gtk-paste True True True gtk-delete True True True True gtk-find True True True True Find Ne_xt True True _Input True gtk-clear True True True True _Previous True True _Next True True Find Previous True True Find N_ext True True Command _History... True True True _Multi-line Send... True True True _Test Triggers... True True _Preferences True True Disable _Triggers True True Disable _Aliases True True Disable _Macros True True Disable T_imers True True True _Debug Matches True True gtk-preferences True True True True True Edit Default _World... True True _Display True True True _Split Window True True _Help True _Manual True True False True gtk-help True _About True False False 0 True True 1 kildclient-2.11.1/src/kcircularqueue.c0000644000175000017500000000715011526001511014611 00000000000000/* $Id: kcircularqueue.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #include #include #include "kcircularqueue.h" KCircularQueue * k_circular_queue_new(size_t el_size, unsigned int how_many) { KCircularQueue *q; q = (KCircularQueue *) calloc(sizeof(KCircularQueue), 1); q->data = malloc(el_size * how_many); q->el_size = el_size; q->allocated_size = how_many; q->free_until_end = how_many; return q; } void k_circular_queue_free(KCircularQueue *q) { free(q->data); free(q); } /** Frees memory used by a KCircularQueue. @param q The KCircularQueue. The pointer will be invalid after the call to this function. */ void k_circular_queue_push_copies(KCircularQueue *q, const void *val, unsigned int n) { /* Make sure there is enough space. */ if ((q->allocated_size - q->size) < n) { _k_circular_queue_realloc(q, q->size + n); } /* Elements that are added after the last one until the end of the array. */ while (q->free_until_end && n) { memcpy(q->data + q->first_free*q->el_size, val, q->el_size); ++q->size; if (--q->free_until_end == 0) { q->first_free = 0; } else { ++q->first_free; } --n; } /* Elements added starting at the first position of the array. */ while (n) { memcpy(q->data + q->first_free*q->el_size, val, q->el_size); ++q->size; ++q->first_free; --n; } } void k_circular_queue_pop(KCircularQueue *q, unsigned int n) { q->size -= n; if (q->first + n >= q->allocated_size) { unsigned int in_end = q->allocated_size - q->first; q->first = n - in_end; q->free_until_end = q->allocated_size - q->size - q->first; } else { q->first += n; } } /************************************************************* * Private functions * *************************************************************/ void _k_circular_queue_realloc(KCircularQueue *q, unsigned int new_size) { char *newdata; unsigned int till_end; newdata = malloc(q->el_size * new_size); till_end = q->allocated_size - q->first; memcpy(newdata, q->data + q->first*q->el_size, till_end*q->el_size); if (till_end < q->size) { memcpy(newdata + till_end*q->el_size, q->data, (q->size - till_end)*q->el_size); } q->allocated_size = new_size; q->first = 0; q->first_free = q->size; q->free_until_end = q->allocated_size - q->size; free(q->data); q->data = newdata; } const void * _k_circular_queue_nth(KCircularQueue *q, unsigned int i) { unsigned int pos; pos = q->first + i; if (pos >= q->allocated_size) { unsigned int in_end = q->allocated_size - q->first; pos = i - in_end; } return q->data + pos*q->el_size; } kildclient-2.11.1/src/we_triggers.c0000644000175000017500000010645411526001511014115 00000000000000/* $Id: we_triggers.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static GtkTreeModel *create_we_triggers_model(World *world); static void we_trigger_configure_view(GtkTreeView *view, GtkTreeModel *model); static void we_trigger_add_cb(GtkButton *button, gpointer data); static void we_trigger_edit_cb(GtkButton *button, gpointer data); static void we_trigger_delete_cb(GtkButton *button, gpointer data); static void we_trigger_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data); static gboolean edit_trigger(World *world, Trigger *trigger); static gboolean we_trigger_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static void we_trigger_move_cb(GtkButton *button, gpointer data); /* XML UI signals */ G_MODULE_EXPORT void we_trigger_chkhighlight_toggled_cb(gpointer data, GtkWidget *widget); G_MODULE_EXPORT void we_trigger_btnconfigh_cb(GtkWidget *widget, gpointer data); GObject * get_we_triggers_tab(World *world) { GtkBuilder *ui_builder; gchar *objects[] = { "we_panel_generic_graphical_editor", NULL }; GError *error = NULL; GObject *panel; GtkLabel *lblType; GObject *btnAdd; GObject *btnEdit; GObject *btnDelete; GObject *btnUp; GObject *btnDown; GObject *btnExport; GtkBox *vbox; GtkWidget *btnTest; GtkTreeSelection *selection; /* Create the dialog */ ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } panel = gtk_builder_get_object(ui_builder, "we_panel_generic_graphical_editor"); /* So it's not destroyed when the builder is destroyed */ g_object_ref(panel); world->viewTrigger = GTK_TREE_VIEW(gtk_builder_get_object(ui_builder, "viewObjects")); g_object_set_data(G_OBJECT(world->viewTrigger), "forworld", world); g_signal_connect(G_OBJECT(world->viewTrigger), "row-activated", G_CALLBACK(we_trigger_view_row_dblclick_cb), world); g_signal_connect(G_OBJECT(world->viewTrigger), "key-press-event", G_CALLBACK(we_trigger_view_keypress_cb), world); lblType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblGEType")); gtk_label_set_markup(lblType, "Triggers"); btnAdd = gtk_builder_get_object(ui_builder, "btnGEAdd"); g_signal_connect(btnAdd, "clicked", G_CALLBACK(we_trigger_add_cb), world->viewTrigger); btnEdit = gtk_builder_get_object(ui_builder, "btnGEEdit"); g_signal_connect(btnEdit, "clicked", G_CALLBACK(we_trigger_edit_cb), world->viewTrigger); btnDelete = gtk_builder_get_object(ui_builder, "btnGEDelete"); g_signal_connect(btnDelete, "clicked", G_CALLBACK(we_trigger_delete_cb), world->viewTrigger); btnUp = gtk_builder_get_object(ui_builder, "btnGEUp"); g_object_set_data(btnUp, "isup", GINT_TO_POINTER(TRUE)); g_signal_connect(btnUp, "clicked", G_CALLBACK(we_trigger_move_cb), world->viewTrigger); btnDown = gtk_builder_get_object(ui_builder, "btnGEDown"); g_object_set_data(btnDown, "isup", GINT_TO_POINTER(FALSE)); g_signal_connect(btnDown, "clicked", G_CALLBACK(we_trigger_move_cb), world->viewTrigger); btnExport = gtk_builder_get_object(ui_builder, "btnGEExport"); g_object_set_data(btnExport, "preselect", "Trigger"); /* Add an extra button for "Test Triggers" */ vbox = GTK_BOX(gtk_builder_get_object(ui_builder, "vbox_int_generic_graphical_editor")); btnTest = gtk_button_new_with_label(_("Test Triggers")); g_signal_connect_swapped(G_OBJECT(btnTest), "clicked", G_CALLBACK(open_test_triggers_dialog), world); /* Only enable it if connected */ if (!world->connected) { gtk_widget_set_sensitive(btnTest, FALSE); } gtk_box_pack_start(vbox, btnTest, FALSE, FALSE, 0); world->trigger_model = create_we_triggers_model(world); world->trigger_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->trigger_model, NULL)); g_object_unref(G_OBJECT(world->trigger_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->trigger_model_filter), we_guied_plugin_filter_func, world, NULL); we_trigger_configure_view(world->viewTrigger, GTK_TREE_MODEL(world->trigger_model_filter)); selection = gtk_tree_view_get_selection(world->viewTrigger); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); g_object_set_data(G_OBJECT(selection), "btnEdit", btnEdit); g_object_set_data(G_OBJECT(selection), "btnDelete", btnDelete); g_object_set_data(G_OBJECT(selection), "btnUp", btnUp); g_object_set_data(G_OBJECT(selection), "btnDown", btnDown); g_object_set_data(G_OBJECT(selection), "btnExport", btnExport); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(we_guied_selection_changed_cb), NULL); gtk_builder_connect_signals(ui_builder, world); g_object_unref(ui_builder); return panel; } static GtkTreeModel * create_we_triggers_model(World *world) { GtkListStore *store; GtkTreeIter iter; GSList *triggerptr; Trigger *trigger; store = gtk_list_store_new(WE_GUIED_N_COLS, G_TYPE_POINTER); triggerptr = world->triggers; while (triggerptr) { trigger = (Trigger *) triggerptr->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, WE_GUIED_POINTER, trigger, -1); triggerptr = triggerptr->next; } return GTK_TREE_MODEL(store); } static void we_trigger_configure_view(GtkTreeView *view, GtkTreeModel *model) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; gtk_tree_view_set_model(view, model); g_object_unref(model); /* Column 1 - Enabled? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TRIGGER_ENABLED)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Enabled")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TRIGGER_ENABLED), NULL); gtk_tree_view_append_column(view, column); /* Column 2 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(TRIGGER_NAME), NULL); gtk_tree_view_append_column(view, column); /* Column 3 - Pattern */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Pattern")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(TRIGGER_PATTERN), NULL); gtk_tree_view_append_column(view, column); /* Column 4 - Ignore Case? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TRIGGER_ICASE)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("I. Case")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TRIGGER_ICASE), NULL); gtk_tree_view_append_column(view, column); /* Column 5 - Action */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Action")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(TRIGGER_ACTION), NULL); gtk_tree_view_append_column(view, column); /* Column 6 - Gag? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TRIGGER_GAG)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Gag")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TRIGGER_GAG), NULL); gtk_tree_view_append_column(view, column); /* Column 7 - Gag Log? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TRIGGER_GAGLOG)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Gag Log")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TRIGGER_GAGLOG), NULL); gtk_tree_view_append_column(view, column); /* Column 8 - Keep Exec? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TRIGGER_KEEPEXEC)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Keep Exec")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TRIGGER_KEEPEXEC), NULL); gtk_tree_view_append_column(view, column); /* Column 9 - Rewriter? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TRIGGER_REWRITER)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Rewriter")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TRIGGER_REWRITER), NULL); gtk_tree_view_append_column(view, column); /* Column 10 - Change Style? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TRIGGER_HIGHLIGHT)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Style")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TRIGGER_HIGHLIGHT), NULL); gtk_tree_view_append_column(view, column); /* Column 11 - Plugin */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Plugin")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(OBJECT_PLUGIN), NULL); gtk_tree_view_append_column(view, column); gtk_tree_view_columns_autosize(view); } static void we_trigger_add_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; Trigger *trigger; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); trigger = new_trigger(); trigger->enabled = 1; if (edit_trigger(world, trigger)) { world->triggers = g_slist_insert(world->triggers, trigger, world->trigger_pos); we_trigger_insert_trigger(world, trigger, world->trigger_pos++); } else { g_free(trigger); } } static void we_trigger_edit_cb(GtkButton *button, gpointer data) { /* Note that the Edit button is only active when exactly one row is selected. */ World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Trigger *trigger; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &trigger, -1); if (edit_trigger(world, trigger)) { we_trigger_update_trigger(world, trigger); } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_trigger_delete_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Trigger *trigger; GSList *triggeritem; GtkWidget *msgdlg; gint n; n = gtk_tree_selection_count_selected_rows(selection); msgdlg = we_guied_confirm_delete_dialog_new(GTK_WINDOW(world->dlgEditWorld), n, _("trigger"), _("triggers")); if (!world->confirm_delete || gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { GList *listiter = g_list_last(selected); while (listiter) { gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &trigger, -1); triggeritem = g_slist_find(world->triggers, trigger); remove_trigger(world, triggeritem); listiter = listiter->prev; } } gtk_widget_destroy(msgdlg); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_trigger_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { World *world; GtkTreeModel *model; GtkTreeIter iter; world = (World *) data; model = gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model, &iter, path)) { Trigger *trigger; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &trigger, -1); if (edit_trigger(world, trigger)) { we_trigger_update_trigger(world, trigger); } } } static gboolean edit_trigger(World *world, Trigger *trigger) { GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditTrigger", NULL }; GError *error = NULL; GtkWidget *dlgEditTrigger; GtkEntry *txtName; GtkEntry *txtPattern; GtkEntry *txtAction; GtkToggleButton *chkICase; GtkToggleButton *chkGag; GtkToggleButton *chkGagLog; GtkToggleButton *chkKeepExec; GtkToggleButton *chkRewriter; GtkToggleButton *chkHighlight; GObject *btnConfigH; GtkToggleButton *chkEnabled; const gchar *newname; const gchar *newpattern; const gchar *newaction; gboolean newgag; gboolean newgaglog; gboolean newhighlight; gboolean newicase; gboolean need_recompute = FALSE; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return FALSE; } gtk_builder_connect_signals(ui_builder, NULL); dlgEditTrigger = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditTrigger")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditTrigger), GTK_RESPONSE_OK); txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtTriggerName")); txtPattern = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtTriggerPattern")); txtAction = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtTriggerAction")); chkICase = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTriggerICase")); chkGag = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTriggerGag")); chkGagLog = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTriggerGagLog")); chkKeepExec = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTriggerKeepExec")); chkRewriter = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTriggerRewriter")); chkHighlight = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTriggerHighlight")); btnConfigH = gtk_builder_get_object(ui_builder, "btnTriggerConfigHighlight"); chkEnabled = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTriggerEnabled")); g_object_set_data(btnConfigH, "trigger", trigger); /* Only display note when editing a plugin's trigger */ if (!trigger->owner_plugin) { GObject *label; label = gtk_builder_get_object(ui_builder, "lblNotePlugin"); gtk_widget_destroy(GTK_WIDGET(label)); label = gtk_builder_get_object(ui_builder, "lblNoteTextPlugin"); gtk_widget_destroy(GTK_WIDGET(label)); } /* We don't need it anymore */ g_object_unref(ui_builder); /* Fill-in values */ if (trigger->name) { gtk_entry_set_text(txtName, trigger->name); } if (trigger->pattern) { gtk_entry_set_text(txtPattern, trigger->pattern); } if (trigger->action) { gtk_entry_set_text(txtAction, trigger->action); } gtk_toggle_button_set_active(chkICase, trigger->ignore_case); gtk_toggle_button_set_active(chkGag, trigger->gag_output); gtk_toggle_button_set_active(chkGagLog, trigger->gag_log); gtk_toggle_button_set_active(chkKeepExec, trigger->keepexecuting); gtk_toggle_button_set_active(chkRewriter, trigger->rewriter); gtk_toggle_button_set_active(chkHighlight, trigger->highlight); gtk_toggle_button_set_active(chkEnabled, trigger->enabled); /* Run the dialog until the input is valid or cancelled */ gtk_widget_show_all(dlgEditTrigger); while (1) { if (gtk_dialog_run(GTK_DIALOG(dlgEditTrigger)) == GTK_RESPONSE_OK) { /* Validate */ newicase = gtk_toggle_button_get_active(chkICase); newgag = gtk_toggle_button_get_active(chkGag); newgaglog = gtk_toggle_button_get_active(chkGagLog); newhighlight = gtk_toggle_button_get_active(chkHighlight); newpattern = gtk_entry_get_text(txtPattern); if (strcmp(newpattern, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditTrigger), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the pattern.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } newaction = gtk_entry_get_text(txtAction); if (strcmp(newaction, "") == 0 && !newgag && !newgaglog && !newhighlight) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditTrigger), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the action, unless the trigger is a gag or changes the style.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* Update values */ newname = gtk_entry_get_text(txtName); if (!trigger->name || strcmp(newname, trigger->name) != 0) { g_free(trigger->name); if (strcmp(newname, "") != 0) { trigger->name = g_strdup(newname); } else { trigger->name = NULL; } } if (!trigger->pattern || strcmp(newpattern, trigger->pattern) != 0) { g_free(trigger->pattern); trigger->pattern = g_strdup(newpattern); need_recompute = TRUE; } if (!trigger->action || strcmp(newaction, trigger->action) != 0) { g_free(trigger->action); if (strcmp(newaction, "") != 0) { trigger->action = g_strdup(newaction); } else { trigger->action = NULL; } } if (trigger->ignore_case != newicase) { need_recompute = TRUE; } trigger->ignore_case = newicase; trigger->gag_output = newgag; trigger->gag_log = newgaglog; trigger->keepexecuting = gtk_toggle_button_get_active(chkKeepExec); trigger->rewriter = gtk_toggle_button_get_active(chkRewriter); trigger->highlight = newhighlight; trigger->enabled = gtk_toggle_button_get_active(chkEnabled); if (need_recompute && world->perl_interpreter) { PERL_SET_CONTEXT(world->perl_interpreter); if (trigger->pattern_re) { SvREFCNT_dec(trigger->pattern_re); } trigger->pattern_re = precompute_re(world->perl_interpreter, trigger->pattern, trigger->ignore_case); } /* We've finished successfully */ gtk_widget_destroy(dlgEditTrigger); return TRUE; } else { /* Cancel pressed */ gtk_widget_destroy(dlgEditTrigger); return FALSE; } } } void we_trigger_chkhighlight_toggled_cb(gpointer data, GtkWidget *widget) { GtkWidget *btnConfigH = GTK_WIDGET(data); gtk_widget_set_sensitive(btnConfigH, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); } void we_trigger_btnconfigh_cb(GtkWidget *widget, gpointer data) { Trigger *trigger; GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditTriggerHighlight", "model1", "model2", "model3", "model4", "model5", "adjustment3", NULL }; GError *error = NULL; GtkWidget *dlgEditHighlight; GtkToggleButton *radTargetLine; GtkToggleButton *radTargetMatch; GtkToggleButton *radTargetSubstring; GtkSpinButton *spnTarget; GtkComboBox *cmbFgColor; GtkComboBox *cmbBgColor; GtkComboBox *cmbItalic; GtkComboBox *cmbStrike; GtkComboBox *cmbUnderline; trigger = g_object_get_data(G_OBJECT(widget), "trigger"); ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return; } dlgEditHighlight = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditTriggerHighlight")); cmbFgColor = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbFgColor")); cmbBgColor = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbBgColor")); radTargetLine = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radTargetLine")); radTargetMatch = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radTargetMatch")); radTargetSubstring = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radTargetSubstring")); spnTarget = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnTarget")); cmbItalic = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbHighlightItalic")); cmbStrike = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbHighlightStrike")); cmbUnderline = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbHighlightUnderline")); /* Fill in values. */ if (trigger->high_target == -1) { gtk_toggle_button_set_active(radTargetLine, TRUE); } else if (trigger->high_target == 0) { gtk_toggle_button_set_active(radTargetMatch, TRUE); } else { gtk_toggle_button_set_active(radTargetSubstring, TRUE); gtk_spin_button_set_value(spnTarget, trigger->high_target); } /* +1 is because -1 corresponds to "No change" */ gtk_combo_box_set_active(cmbFgColor, trigger->high_fg_color + 1); gtk_combo_box_set_active(cmbBgColor, trigger->high_bg_color + 1); gtk_combo_box_set_active(cmbItalic, trigger->high_italic + 1); gtk_combo_box_set_active(cmbStrike, trigger->high_strike + 1); gtk_combo_box_set_active(cmbUnderline, trigger->high_underline + 1); /* Run the dialog */ gtk_widget_show_all(dlgEditHighlight); if (gtk_dialog_run(GTK_DIALOG(dlgEditHighlight)) == GTK_RESPONSE_OK) { /* Update values */ if (gtk_toggle_button_get_active(radTargetLine)) { trigger->high_target = -1; } else if (gtk_toggle_button_get_active(radTargetMatch)) { trigger->high_target = 0; } else { trigger->high_target = gtk_spin_button_get_value_as_int(spnTarget); } trigger->high_fg_color = gtk_combo_box_get_active(cmbFgColor) - 1; trigger->high_bg_color = gtk_combo_box_get_active(cmbBgColor) - 1; trigger->high_italic = gtk_combo_box_get_active(cmbItalic) - 1; trigger->high_strike = gtk_combo_box_get_active(cmbStrike) - 1; trigger->high_underline = gtk_combo_box_get_active(cmbUnderline) - 1; } gtk_widget_destroy(dlgEditHighlight); g_object_unref(ui_builder); } static gboolean we_trigger_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_Delete || evt->keyval == GDK_KP_Delete) { we_trigger_delete_cb(NULL, widget); return TRUE; } return FALSE; } static void we_trigger_move_cb(GtkButton *button, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; World *world; gboolean is_up; gint new_pos; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "isup")); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Trigger *trigger; gint pos; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &trigger, -1); pos = g_slist_index(world->triggers, trigger); new_pos = pos; if (is_up) { if (pos != 0) { new_pos = pos - 1; move_trigger(world, pos, new_pos); } } else { if (pos != world->trigger_pos - 1) { new_pos = pos + 1; move_trigger(world, pos, new_pos); } } /* Reselect the moved item */ gtk_tree_model_iter_nth_child(model, &iter, NULL, new_pos); gtk_tree_selection_select_iter(selection, &iter); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } void we_trigger_update_trigger(World *world, Trigger *trigger_arg) { /* Called by the Perl functions when an trigger is changed, so that the display is updated. */ GtkTreeIter iter; GtkTreePath *path; Trigger *trigger; gboolean success; if (!world->trigger_model) { return; } success = gtk_tree_model_get_iter_first(world->trigger_model, &iter); while (success) { gtk_tree_model_get(world->trigger_model, &iter, WE_GUIED_POINTER, &trigger, -1); if (trigger == trigger_arg) { path = gtk_tree_model_get_path(world->trigger_model, &iter); gtk_tree_model_row_changed(world->trigger_model, path, &iter); gtk_tree_path_free(path); return; } success = gtk_tree_model_iter_next(world->trigger_model, &iter); } } void we_trigger_insert_trigger(World *world, Trigger *trigger, gint pos) { /* Called by the Perl functions when an trigger is inserted, so that the display is updated. */ GtkTreeIter iter; if (!world->trigger_model) { return; } gtk_list_store_insert(GTK_LIST_STORE(world->trigger_model), &iter, pos); gtk_list_store_set(GTK_LIST_STORE(world->trigger_model), &iter, WE_GUIED_POINTER, trigger, -1); } void we_trigger_delete_trigger(World *world, Trigger *trigger_arg) { /* Called by the Perl functions when an trigger is deleted, so that the display is updated. */ GtkTreeIter iter; Trigger *trigger; gboolean success; if (!world->trigger_model) { return; } success = gtk_tree_model_get_iter_first(world->trigger_model, &iter); while (success) { gtk_tree_model_get(world->trigger_model, &iter, WE_GUIED_POINTER, &trigger, -1); if (trigger == trigger_arg) { gtk_list_store_remove(GTK_LIST_STORE(world->trigger_model), &iter); return; } success = gtk_tree_model_iter_next(world->trigger_model, &iter); } } kildclient-2.11.1/src/mnuPopupURL.ui0000644000175000017500000000236411405233202014170 00000000000000 gtk-jump-to mnuURLOpen Open Link gtk-copy mnuURLCopy Copy Link Address kildclient-2.11.1/src/kildclient.h0000644000175000017500000011624511570205043013727 00000000000000/* $Id: kildclient.h 1176 2011-05-28 14:43:45Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __KILDCLIENT_H #define __KILDCLIENT_H #include "kcircularqueue.h" #include "simocombobox.h" #include #include #include #include #include #ifdef HAVE_LIBGNUTLS # include #endif #ifdef __MINGW32__ # include #endif /********************** * Limits and defines * **********************/ #define MAX_BUFFER 4096 #define MAX_TIME_STR 150 #define VTE_ENC "UTF-8" #define DEFAULT_TERMINAL_FONT "Monospace 10" #define DEFAULT_LOGTIME_FORMAT "%c> " /************** * Data types * **************/ enum ConnStyle_s { NONE, DIKU, LPMUD, }; typedef enum ConnStyle_s ConnStyle; enum TimeType_s { HMS, SEC, NO, }; typedef enum TimeType_s TimeType; /* States for the Telnet IAC processing State Machine */ enum TelnetState_e { TELNETFSM_DATA, TELNETFSM_DATA_NL, TELNETFSM_DATA_CR, TELNETFSM_IAC, TELNETFSM_DO, TELNETFSM_DONT, TELNETFSM_WILL, TELNETFSM_WONT, TELNETFSM_SB, TELNETFSM_SB_IAC, TELNETFSM_SB_IAC_TERMTYPE, TELNETFSM_SB_IAC_COMPRESS, TELNETFSM_SB_IAC_COMPRESS2, TELNETFSM_SB_IAC_COMPRESS_WILL, /* Also serves for SB_IAC_COMPRESS2_IAC */ }; typedef enum TelnetState_e TelnetState; enum proxy_type_e { PROXY_USE_GLOBAL = -1, PROXY_NONE, PROXY_SOCKS4, PROXY_SOCKS5, }; typedef enum proxy_type_e proxy_type; enum proxy_socks5_state_e { SOCKS5_STATE_INITIAL, SOCKS5_STATE_AUTH, SOCKS5_STATE_CONNECTION, }; typedef enum proxy_socks5_state_e proxy_socks5_state; struct proxy_settings_s { proxy_type type; char *server; char *port; char *user; char *password; proxy_socks5_state state; }; typedef struct proxy_settings_s proxy_settings; enum NameDisplayStyle_e { NAME_DISPLAY_WORLD, NAME_DISPLAY_WORLD_CHAR, NAME_DISPLAY_CHAR_WORLD, NAME_DISPLAY_CUSTOM, }; typedef enum NameDisplayStyle_e NameDisplayStyle; struct plugin_s { char *name; char *version; char *description; char *author; gboolean enabled; }; typedef struct plugin_s Plugin; struct HookList_s { GSList *OnConnect; gint OnConnect_pos; GtkTreeModel *OnConnect_model; GtkTreeModelFilter *OnConnect_model_filter; GSList *OnDisconnect; gint OnDisconnect_pos; GtkTreeModel *OnDisconnect_model; GtkTreeModelFilter *OnDisconnect_model_filter; GSList *OnReceivedText; gint OnReceivedText_pos; GtkTreeModel *OnReceivedText_model; GtkTreeModelFilter *OnReceivedText_model_filter; GSList *OnSentCommand; gint OnSentCommand_pos; GtkTreeModel *OnSentCommand_model; GtkTreeModelFilter *OnSentCommand_model_filter; GSList *OnGetFocus; gint OnGetFocus_pos; GtkTreeModel *OnGetFocus_model; GtkTreeModelFilter *OnGetFocus_model_filter; GSList *OnLoseFocus; gint OnLoseFocus_pos; GtkTreeModel *OnLoseFocus_model; GtkTreeModelFilter *OnLoseFocus_model_filter; GSList *OnCloseConnected; gint OnCloseConnected_pos; GtkTreeModel *OnCloseConnected_model; GtkTreeModelFilter *OnCloseConnected_model_filter; }; typedef struct HookList_s HookList; struct Hook_s { char *name; Plugin *owner_plugin; gboolean enabled; gchar *action; }; typedef struct Hook_s Hook; /* For ANSI parsing - FSM */ enum ANSIFSMState_e { ANSIFSM_DATA, ANSIFSM_ESC, ANSIFSM_ANSISEQ, ANSIFSM_ESCLEFTPAR, }; typedef enum ANSIFSMState_e ANSIFSMState; struct TAState_s { guint fg_color; guint fg_base_idx; guint bg_color; guint bg_base_idx; PangoUnderline underline; gboolean strike; gboolean italics; gboolean reverse; gboolean hidden; /* Pointers to the tags used for foreground and background colors. It they are set, the tag is used, otherwise the color is determined from the ANSI state. */ GtkTextTag *foreground_color_tag; GtkTextTag *background_color_tag; gboolean linedraw; }; typedef struct TAState_s TAState; enum MCCPBehavior_s { MCCP_AFTER_CONNECT, MCCP_ALWAYS, MCCP_DISABLE, }; typedef enum MCCPBehavior_s MCCPBehavior; struct TextAppearance_s { /* The tags for ansi colors are stored here. Each array contains 20 elements: 0-7 Basic colors, from black to white 8 Default color 9-16 Bold basic colors 17 Default bold color 18 Default color for reverse video 19 Bold default color for reverse video The last two entries are used for reverse video. For the foreground array, they contain tags that set the foreground to the default background and bold background colors, respectively. For the background array, they contain tags that set the background to the default foreground and bold foreground colors, respectively. */ GtkTextTag **ansi_fore_tags; GtkTextTag **ansi_back_tags; /* Tags for other foreground/background colors, specified as RGB values. The hash is indexed by ints (converted to pointers with Glib macros). Each color component is one byte (256 values, thus), and the index it is formed with ((R << 16) | (G << 8) || B). Colors are allocated as needed. */ GHashTable *rgb_fore_tags; GHashTable *rgb_back_tags; /* Tags for text attributes */ GtkTextTag *underline_tag; GtkTextTag *dblunderline_tag; GtkTextTag *strike_tag; GtkTextTag *italics_tag; /* The current color and attributes is determined from these variables */ TAState state; /* A place to store the state at the end of the last complete line, so that it can be restored when an incomplete line is erased. */ TAState saved_state; /* For ANSI parsing */ ANSIFSMState ansifsm_state; guchar ansiseq_buffer[MAX_BUFFER]; /* Holds incomplete ansi seqs. */ gint ansiseq_pos; /* Character groups supported. -1: unknown. 0: not supported. 1: supported If a group is not supported, replacement ASCII characters (not necessarily good) are used when in vt100 line drawing mode. */ gint sup_geom_shapes; gint sup_block; gint sup_control; gint sup_l1_supplement; gint sup_box_drawing; gint sup_misc_tech; gint sup_math; gint sup_greek; }; typedef struct TextAppearance_s TextAppearance; struct WorldGUI_s { struct world_s *world; GtkWidget *vbox; GtkPaned *split_pane; gint last_split_position; GtkScrolledWindow *scrolled_win; GtkTextView *txtView; GtkScrolledWindow *scrwinScroll; GtkTextView *txtViewScroll; GtkTextBuffer *txtBuffer; gdouble last_scroll_info; /* For scrolled_win_size_allocate_cb() */ GtkBox *hboxTab; GtkLabel *lblNotebook; GtkWidget *search_box; GtkWidget *txtSearchTerm; GtkWidget *btnFindNext; GtkLabel *lblSearchInfo; GtkTextMark *txtmark_search_start; GtkTextMark *txtmark_next_search_start; GtkWidget *commandArea; GtkWidget *btnClear; union { SimoComboBox *cmbEntry; /* For MUD windows */ GtkEntry *txtEntry; /* For KCWin's */ }; GtkBox *statusbar_box; GtkLabel *lblStatus; GtkLabel *lblLines; GtkLabel *lblTime; GtkTextMark *txtmark_end; GtkTextMark *txtmark_linestart; GtkTextTag *txttag_url; gboolean execute_changed_signal; guint prune_timeout_id; /* Line times for tooltips */ KCircularQueue *line_times; /* Determines the appearance of the text */ TextAppearance ta; }; typedef struct WorldGUI_s WorldGUI; struct world_s { /* Basic information */ gchar *name; /* World name */ gchar *display_name; /* Name displayed in tab & window title */ gchar *new_text_name; /* Red version of the above */ gchar *file; gchar *charset; gint charset_index; gchar *host; gchar *host_ip; gchar *port; proxy_settings proxy; proxy_settings proxy_used; gboolean keep_alive; /* Auto-login data */ ConnStyle connection_style; GtkTreeModel *logon_characters; GtkTreeRowReference *character_used; /* Display settings */ char *terminalfont; char *entryfont; char *statusfont; gboolean usebold; gboolean wrap; gint wrap_indent; gboolean use_wrap_column; gint wrap_column; GdkColor *deffore; GdkColor *defbold; GdkColor *defback; GdkColor *defboldback; GdkColor *ansicolors; NameDisplayStyle name_display_style; char *name_display_pattern; gboolean use_tooltips; /* Scripting support */ gchar *scriptfile; GSList *triggers; gint trigger_pos; gboolean disable_triggers; SV *trigger_action_re; /* Pattern to replace $n in action */ GSList *aliases; gint alias_pos; gboolean disable_aliases; GSList *macros; gint macro_pos; gboolean disable_macros; GSList *timers; gint timer_pos; gboolean disable_timers; GSList *permanent_variables; GSList *plugins; GSList *plugins_being_defined; GSList *startup_plugin_files; GtkTreeModel *startup_plugins; /* Plugins loaded at startup */ HookList hooks; /* Scrolling settings */ gboolean scrollOutput; glong buffer_lines; /* Input settings */ gboolean repeat_commands; gboolean cmd_echo; gboolean never_hide_input; gboolean store_commands; gint commands_to_save; gint input_n_lines; gint input_n_lines_saved; gboolean spell; gchar *spell_language; gboolean autocompletion; gint autocompl_minprefix; gchar command_separator[10]; gboolean updating_controls; /* To prevent infinite loop */ gboolean ignore_up_down_keys; /* Command history support */ GtkTreeModel *cmd_list; GtkTreeIter current_cmd; gint cmd_list_size; gboolean cmd_has_been_edited; gboolean cmd_position_changed; gboolean combo_is_poped; gboolean cmd_just_selected_from_combo; gchar *saved_command_find_search; /* Flood prevention */ gboolean flood_prevention; gint max_equal_commands; gchar *flood_prevention_command; gchar *last_command; int repeat_count; /* Protocols configuration */ MCCPBehavior mccp_behavior; /* Logging */ gchar *log_file_name; gchar *log_actual_file; FILE *log_file; gchar *log_timeformat; gboolean log_add_time; gboolean log_autostart; /* Basic connection information */ gboolean connected; gboolean connecting; gboolean connected_at_least_once; gchar *errmsg; /* Error message to display */ GIOChannel *iochan; #ifndef __MINGW32__ int sock; #else SOCKET sock; #endif guint io_watch_id; guint timeout_id; glong deleted_lines; glong rawbytes; /* Bytes received from network */ glong bytes; /* Bytes seen after decompression */ struct addrinfo *addrinfo; /* addrinfo for real connection */ guint32 real_ip_for_socks4; /* IP of actual host, for SOCKS4 */ /* Buffers and state */ TelnetState telnet_state; /* State of Telnet IAC FSM */ gint telnet_state_ncrs; /* Last # of \r seen in a row */ guchar inbuffer[MAX_BUFFER]; /* Input buffer from network */ guchar dbuffer[MAX_BUFFER]; /* Buffer for decompressed data */ guchar *pbuffer; /* Buffer to process */ guint pbuf_alloc_size; /* Current size of pbuffer */ guint pbuf_size; /* Buffer size */ /* For MCCP handling */ z_stream *zstream; /* Used for decompression */ gint mccp_ver; /* Version of MCCP supported */ /* Time counts */ guint printed_until; GTimer *last_data_written; /* For connection and idle time display */ TimeType ctime_type; TimeType itime_type; gboolean itime_reset_activate; /* When to reset idle timer */ time_t connected_time; /* Time of connection */ time_t last_command_time; /* Time of last sent command */ /* For the getkeycode() function */ gboolean print_next_keycode; gchar *keycode_to_print; /* Miscellaneous data */ gboolean noecho; gboolean use_naws; GdkRectangle last_naws_size; gboolean dont_flush; gboolean has_focus; gboolean is_current_tab; gboolean has_unread_text; gint selection_start; gint selection_end; /* GUI structure */ WorldGUI *gui; /* UI Builder for the dialogs */ GtkBuilder *ui_builder; /* World Editor dialog and related objects */ GtkWidget *dlgEditWorld; GtkTreeModel *plugin_model; GtkTreeView *viewTrigger; GtkTreeModel *trigger_model; GtkTreeModelFilter *trigger_model_filter; GtkTreeView *viewAlias; GtkTreeModel *alias_model; GtkTreeModelFilter *alias_model_filter; GtkTreeView *viewMacro; GtkTreeModel *macro_model; GtkTreeModelFilter *macro_model_filter; GtkTreeView *viewTimer; GtkTreeModel *timer_model; GtkTreeModelFilter *timer_model_filter; GtkTreeView *viewVar; GtkTreeModel *permvars_model; GSList *selected_OnConnect_hooks; GSList *selected_OnDisconnect_hooks; GSList *selected_OnReceivedText_hooks; GSList *selected_OnSentCommand_hooks; GSList *selected_OnGetFocus_hooks; GSList *selected_OnLoseFocus_hooks; GSList *selected_OnCloseConnected_hooks; gboolean confirm_delete; gboolean show_plugin_items; /* Multi-line send dialog */ GtkWidget *dlgMLSend; /* Command history dialog */ GtkWidget *dlgCmdHistory; gboolean cmdfind_upwards; gchar *cmdfind_string; GtkTreeRowReference *cmdfind_row; GtkWidget *dlgCmdHistoryFind; /* Test Triggers dialog */ GtkWidget *dlgTestTriggers; /* Perl interpreter */ PerlInterpreter *perl_interpreter; /* TLS/SSL support */ gboolean use_tls; #ifdef HAVE_LIBGNUTLS gnutls_session tls_session; int tls_handshake_dir; #endif }; typedef struct world_s World; enum { RESP_RECONNECT = 10, RESP_OTHER, RESP_OFFLINE, }; /* For recent command list */ enum { CMDLIST_COL_COMMAND, CMDLIST_COL_TENTATIVE, N_CMDLIST_COLUMNS, }; /* Columns of model for auto-logon characters */ enum { LOGON_CHAR, LOGON_PASS, N_LOGON_COLUMNS, }; /* Columns of model for plugins loaded on startup */ enum { SPLUGIN_FILE, SPLUGIN_NAME, SPLUGIN_AUTHOR, SPLUGIN_DESCRIPTION, N_SPLUGIN_COLUMNS, }; struct prefs_s { int idxInfoMsgColor; int idxCmdEchoColor; gdouble multi_cmd_delay; gint multi_cmd_group_size; GtkPositionType tab_position; gboolean hide_single_tab; gboolean urgency_hint; char *browser_command; char *audio_player_command; char *last_open_world; gboolean no_plugin_help_msg; proxy_settings proxy; }; typedef struct prefs_s Prefs; struct general_object_s { char *name; Plugin *owner_plugin; gboolean enabled; }; typedef struct general_object_s GeneralObject; struct trigger_s { char *name; Plugin *owner_plugin; gboolean enabled; char *pattern; SV *pattern_re; char *action; gboolean ignore_case; gboolean gag_output; gboolean gag_log; gboolean keepexecuting; gboolean rewriter; gboolean highlight; /* Style to apply / -1 means no change*/ gint high_target; gint high_fg_color; gint high_bg_color; gint high_italic; gint high_strike; gint high_underline; /* These are not really part of the trigger, but here is a perfect place to store them. They are only valid immediately after a match, and serve only for that. */ gint match_start; gint match_end; }; typedef struct trigger_s Trigger; struct alias_s { char *name; Plugin *owner_plugin; gboolean enabled; char *pattern; SV *pattern_re; char *substitution; gboolean ignore_case; gboolean perl_eval; }; typedef struct alias_s Alias; struct macro_s { char *name; Plugin *owner_plugin; gboolean enabled; guint keyval; GdkModifierType modifiers; char *action; }; typedef struct macro_s Macro; struct timer_s { char *name; Plugin *owner_plugin; gboolean enabled; World *for_world; guint interval; gint count; char *action; gboolean temporary; guint function_id; }; typedef struct timer_s Timer; /* For multi-line send */ enum MLSendState_e { ML_TRY_INITIALBUFFER, ML_INITIALBUFFER, ML_TRY_INITIALLINES, ML_INITIALLINES, ML_TRY_FILE, ML_FILECONTENTS, ML_TRY_FINALBUFFER, ML_FINALBUFFER, ML_TRY_FINALLINES, ML_FINALLINES, ML_FINISH, }; typedef enum MLSendState_e MLSendState; struct MLSendData_s { World *world; MLSendState state; GtkTextBuffer *textInitial; GtkTextBuffer *textFinal; GSList *linesInitial; GSList *linesFinal; gchar *file; FILE *fp; gchar *textStart; gchar *textEnd; int nlines; int linesatime; int currline; GSList *list_iterator; gboolean dont_close; }; typedef struct MLSendData_s MLSendData; /************************************************** * Model Columns in GUI Editors for Triggers, etc * **************************************************/ enum { WE_GUIED_POINTER, WE_GUIED_N_COLS, }; /************************************************************** * Values used by the cell data functions for the GUI Editors * **************************************************************/ enum { PLUGIN_ENABLED, PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR, PLUGIN_DESCRIPTION, TRIGGER_ENABLED, TRIGGER_NAME, TRIGGER_PATTERN, TRIGGER_ACTION, TRIGGER_GAG, TRIGGER_GAGLOG, TRIGGER_KEEPEXEC, TRIGGER_REWRITER, TRIGGER_ICASE, TRIGGER_HIGHLIGHT, ALIAS_ENABLED, ALIAS_PERL_EVAL, ALIAS_NAME, ALIAS_PATTERN, ALIAS_SUBSTITUTION, ALIAS_ICASE, MACRO_ENABLED, MACRO_NAME, MACRO_KEY, MACRO_ACTION, TIMER_ENABLED, TIMER_NAME, TIMER_INTERVAL, TIMER_COUNT, TIMER_ACTION, TIMER_TEMPORARY, HOOK_ENABLED, HOOK_NAME, HOOK_ACTION, PERMVAR_NAME, OBJECT_PLUGIN, }; /******************** * Global variables * ********************/ extern GtkWidget *wndMain; /* The main window widget */ extern GtkBuilder *main_builder; /* Created main window & others */ extern GtkWidget *ntbkWorlds; /* Notebook with the worlds */ extern GList *open_worlds; /* List of open worlds */ extern World *currentWorld; /* The current world */ extern World *world_for_perl; /* The world for Perl to use */ extern World *default_world; /* World with default settings */ extern gboolean window_has_focus; /* Whether the main window has focus */ extern gint worlds_with_new_text; /* # of worlds with unread text */ extern gboolean debug_matches; /* Show when a trigger/alias matches */ extern Prefs globalPrefs; /* Holds the global preferences */ extern FILE *dumpFile; /* File to dump decompr. data*/ extern FILE *rdumpFile; /* File to dump raw received data */ extern GdkColor deffore; /* Default foreground color */ extern GdkColor defbold; /* Default bold foreground color */ extern GdkColor defback; /* Default background color */ extern GdkColor defboldback; /* Default bold background color */ extern GdkColor defansi[]; /* Default ansi colors */ #ifdef HAVE_LIBGNUTLS /* gnutls certificate credentials */ extern gnutls_certificate_credentials tls_certif_cred; #endif /********************************* * Function prototypes - Main UI * *********************************/ GtkWidget* create_main_window(WorldGUI *gui); World* get_world_to_connect(); void remove_world(World *world, gboolean remove_gui); gboolean remove_world_timer(World *world); void set_focused_world(gint page); gint get_focused_world(void); void set_notebook_tab_position(GtkPositionType pos); void adjust_window_title(void); gboolean open_new_world(WorldGUI *gui, const gchar *cmdline, gboolean can_offline, gboolean *offline_selected); gboolean update_times_cb(gpointer data); gboolean confirm_quit(void); void worldgui_destroy_tooltip_window(WorldGUI *gui); G_MODULE_EXPORT void menu_findnext_activate_cb(GtkWidget *widget, gpointer data); /********************* * Handling of paths * *********************/ const char *get_kildclient_directory_path(void); const char *get_kildclient_installed_file(const char *file); /********************************** * Function prototypes - World UI * **********************************/ WorldGUI *world_gui_new(gboolean is_for_mud); void world_gui_size_textview(WorldGUI *gui); void worldgui_determine_supported_chars(WorldGUI *gui); void free_world_gui(WorldGUI *gui); void configure_gui(WorldGUI *gui, World *world); void worldgui_configure_spell(WorldGUI *gui); void clear_button_cb(GtkButton *button, gpointer data); void send_naws_size(World *world); void completion_cell_data_function(GtkCellLayout *cell_layout, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer data); void find_next_cb(GtkButton *button, gpointer data); G_MODULE_EXPORT void menu_url_open(GtkAction *action, gchar *url); /*************************************************** * Function prototypes - ANSI support for TextView * ***************************************************/ void ansitextview_append_string(WorldGUI *gui, const gchar *str); void ansitextview_append_string_nl(WorldGUI *gui, const gchar *str); void ansitextview_append_stringf(WorldGUI *gui, const gchar *format, ...); void ansitextview_append_string_with_fgcolor(WorldGUI *gui, const gchar *str, gint fg_color); void ansitextview_append_ansi_string(WorldGUI *gui, const gchar *str, gsize len); void ansitextview_append_echoed_string(WorldGUI *gui, const gchar *str, gsize len); void ansitextview_get_char_size(WorldGUI *gui, gint *char_height, gint *char_width); void ansitextview_get_size(WorldGUI *gui, guint *lines, guint *cols); void ansitextview_update_color_tags(WorldGUI *gui, World *world); gboolean ansitextview_prune_extra_lines(gpointer data); guchar *strip_ansi(const guchar *original, int len); /******************************** * Function prototypes - Worlds * ********************************/ void set_default_colors(World *world); World *create_new_world(gboolean load_defaults); void free_world(World *world); void remove_plugin_objects(World *world, Plugin *plugin); gboolean load_world_from_file(const char *file, World *world, gboolean forWorldSelector, GError **error); void create_world_from_parameters(World *world, gchar *host, gchar *port, gchar *user, gchar *password); void load_command_history(World *world); World *get_world_from_cmdline(const gchar *cmdline); void save_world_to_file(World *world); void save_command_history(World *world); gboolean edit_world(World **world, GtkWindow *parent, gboolean *newworld, gboolean modal); void kc_g_string_append_escaped(GString *str, const char *template, ...); gint disconnected_msgbox(gchar *msg, gboolean can_offline); void mark_as_offline(World *world); void prepare_display_name(World *world); gchar *replace_kc_escapes(const gchar *pattern, const gchar *name, const gchar *character); /********************************************* * Function prototypes - World Editor Dialog * *********************************************/ GObject *get_we_general_tab(World *world, GtkBuilder *ui_builder); void fill_we_general_tab(World *world, GtkBuilder *ui_builder); void update_we_general_parameters(World *world, GtkBuilder *ui_builder); GObject *get_we_mainwindow_tab(GtkBuilder *ui_builder); void fill_we_mainwindow_tab(World *world, GtkBuilder *ui_builder); GObject *get_we_colors_tab(World *world, GtkBuilder *ui_builder); GObject *get_we_statusbar_tab(GtkBuilder *ui_builder); void fill_we_statusbar_tab(World *world, GtkBuilder *ui_builder); GObject *get_we_input_tab(GtkBuilder *ui_builder); void fill_we_input_tab(World *world, GtkBuilder *ui_builder); void update_we_input_parameters(World *world, GtkBuilder *ui_builder); GObject *get_we_logging_tab(GtkBuilder *ui_builder, World *world); void fill_we_logging_tab(World *world, GtkBuilder *ui_builder); void update_we_logging_parameters(World *world, GtkBuilder *ui_builder); void set_input_line_controls(World *world, GObject *radSingleLine, GObject *radMultiLine, GtkSpinButton *spnNLines); GObject *get_we_scripting_tab(GtkBuilder *ui_builder); void fill_we_scripting_tab(World *world, GtkBuilder *ui_builder); void update_we_scripting_parameters(World *world, GtkBuilder *ui_builder); GObject *get_we_plugins_tab(GtkBuilder *ui_builder, World *world); GObject *get_we_triggers_tab(World *world); GObject *get_we_aliases_tab(World *world); GObject *get_we_macros_tab(World *world); GObject *get_we_timers_tab(World *world); GObject *get_we_hooks_tab(World *world); GObject *get_we_vars_tab(World *world); GObject *get_we_protocols_tab(GtkBuilder *ui_builder); void fill_we_protocols_tab(World *world, GtkBuilder *ui_builder); void update_we_protocols_parameters(World *world, GtkBuilder *ui_builder); GObject *get_we_misc_tab(GtkBuilder *ui_builder); void fill_we_misc_tab(World *world, GtkBuilder *ui_builder); void update_we_misc_parameters(World *world, GtkBuilder *ui_builder); GObject *get_we_advanced_tab(World *world, GtkBuilder *ui_builder); void fill_we_advanced_tab(World *world, GtkBuilder *ui_builder); void update_we_advanced_parameters(World *world, gboolean *newworld, GtkBuilder *ui_builder); G_MODULE_EXPORT void we_guied_export_cb(GtkButton *button, gpointer data); void we_guied_bool_func(GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer data); void we_guied_text_func(GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer data); gboolean we_guied_plugin_filter_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer data); void we_guied_bool_col_toggled_cb(GtkCellRendererToggle *renderer, gchar *pathstr, gpointer data); void we_guied_selection_changed_cb(GtkTreeSelection *selection, gpointer data); GtkWidget *we_guied_confirm_delete_dialog_new(GtkWindow *parent, int n, const gchar *singular, const gchar *plural); void we_lplugin_insert_plugin(World *world, Plugin *plugin); void we_lplugin_update_plugin(World *world, Plugin *plugin); void we_trigger_update_trigger(World *world, Trigger *trigger); void we_trigger_insert_trigger(World *world, Trigger *trigger, gint pos); void we_trigger_delete_trigger(World *world, Trigger *trigger); void we_alias_update_alias(World *world, Alias *alias); void we_alias_insert_alias(World *world, Alias *alias, gint pos); void we_alias_delete_alias(World *world, Alias *alias); void we_macro_update_macro(World *world, Macro *macro); void we_macro_insert_macro(World *world, Macro *macro, gint pos); void we_macro_delete_macro(World *world, Macro *macro); void we_timer_update_timer(World *world, Timer *timer); void we_timer_insert_timer(World *world, Timer *timer, gint pos); void we_timer_delete_timer(World *world, Timer *timer); void we_hook_update_hook(World *world, const gchar *event, Hook *hook); void we_hook_insert_hook(World *world, const gchar *event, Hook *hook, gint pos); void we_hook_delete_hook(World *world, const gchar *event, Hook *hook); void we_var_update_var(World *world, const gchar *old_var, const gchar *new_var); void we_var_insert_var(World *world, const gchar *var, gint pos); void we_var_delete_var(World *world, const gchar *var); /***************************************** * Function prototypes - Command History * *****************************************/ void prev_or_next_command(World *world, gboolean next); void find_prev_or_next_command(World *world, gboolean next); gchar *cmdhistory_get_command(GtkTreeModel *model, GtkTreeIter *iter); void add_recent_command(World *world, const gchar *command); void insert_recent_command(World *world, const gchar *command); /***************************************** * Function prototypes - Multi-line send * *****************************************/ void do_multi_line_send(MLSendData *mlcontext, gdouble delay); /********************************* * Function prototypes - Network * *********************************/ gboolean connect_to(World *world, gchar **errmsg); gboolean disconnect_world_idle(gpointer data); void disconnect_world(gpointer data, gboolean run_hook); gboolean reconnect_world(gpointer data); gboolean connect_another(gpointer data); gchar *close_connection(World *world, gboolean run_hook); gboolean flush_buffer_timeout_cb(gpointer data); void perform_auto_logon(World *world); /************************************* * Function prototypes - Preferences * *************************************/ void read_global_preferences(int *x, int *y, int *width, int *height); void save_global_preferences(void); const char *create_kildclient_directory(void); G_MODULE_EXPORT void show_preferences_dialog_cb(GtkWidget *widget, gpointer data); /******************************** * Function Prototypes - Parser * ********************************/ void parse_commands(World *world, const char *cmdline, gint len); void send_to_world(World *world, const char *cmd, gint len); void send_to_world_no_check(World *world, const char *utf8_command, int utf8_len, char *locale_command, gsize locale_len, gboolean add_newline, gboolean has_incomplete_line); /********************************** * Function Prototypes - Triggers * **********************************/ Trigger *new_trigger(void); void match_triggers(World *world, guchar **line, guchar **color_line, gsize *output_len, gboolean *gag_output, gboolean *gag_log, gint *n_matches, GSList **trigger_response); void remove_trigger(World *world, GSList *triggeritem); gboolean move_trigger(World *world, gint old_pos, gint new_pos); void free_trigger(Trigger *trigger, gpointer data); void list_triggers(World *world, Plugin *plugin); void trigger_precompute_res(World *world); void save_trigger(GString *str, Trigger *trigger); void open_test_triggers_dialog(World *world); /********************************* * Function Prototypes - Aliases * *********************************/ char *substitute_aliases(World *world, const char *cmd); void remove_alias(World *world, GSList *aliasitem); gboolean move_alias(World *world, gint old_pos, gint new_pos); void free_alias(Alias *alias, gpointer data); void list_aliases(World *world, Plugin *plugin); void alias_precompute_res(World *world); void save_alias(GString *str, Alias *alias); /******************************** * Function Prototypes - Macros * ********************************/ gboolean check_macros(World *world, guint keyval, GdkModifierType modifiers); void remove_macro(World *world, GSList *macroitem); gboolean move_macro(World *world, gint old_pos, gint new_pos); void free_macro(Macro *macro, gpointer data); void list_macros(World *world, Plugin *plugin); void save_macro(GString *str, Macro *macro); /******************************** * Function Prototypes - Timers * ********************************/ gboolean run_timer(gpointer data); void start_timers(World *world); void remove_timer(World *world, GSList *timeritem); gboolean move_timer(World *world, gint old_pos, gint new_pos); void free_timer(Timer *timer, gpointer data); void list_timers(World *world, Plugin *plugin); void save_timer(GString *str, Timer *timer); /********************************************* * Function Prototypes - Permanent Variables * *********************************************/ void load_permanent_variables(World *world); void save_permanent_variables(World *world); gboolean move_var(World *world, gint old_pos, gint new_pos); void free_permanent_variable(gchar *variable, gpointer data); /******************************* * Function Prototypes - Hooks * *******************************/ gboolean connect_hook(World *world, const gchar *hookname, int pos, gchar *action, gchar *name, gboolean enabled); gboolean execute_hook(World *world, const gchar *hook, const gchar *hookdata); void list_hooks(World *world, const gchar *hookname, Plugin *plugin); void list_hook(World *world, const gchar *hookname, int pos); gboolean delete_hook(World *world, const gchar *hookname, int pos, GSList *hook); gboolean move_hook(World *world, const gchar *hookname, gint old_pos, gint new_pos); void free_hook(Hook *hook, gpointer data); void save_hooks(GString *str, World *world); void save_hook(GString *str, Hook *hook); GSList **get_hook_list_for_writing(World *world, const gchar *hookname, gint **poscounter); GSList *get_hook_list_for_reading(World *world, const gchar *hookname, gint *pos); GtkTreeModel *get_hook_model(World *world, const gchar *hookname); /********************************* * Function Prototypes - Logging * *********************************/ void write_log_line(World *world, const gchar *line, time_t *line_time); gboolean start_log(World *world, gint lines, gchar **errormsg); void stop_log(World *world); /********************************* * Function prototypes - Plugins * *********************************/ Plugin *get_plugin(World *world, const char *name); void free_plugin(Plugin *plugin, World *world); gboolean load_plugin(World *world, gchar *filename, GError **error); void load_startup_plugins(World *world); gboolean add_startup_plugin(World *world, gchar *filename, GError **error); void make_startup_plugin_list_for_editing(World *world); /******************************* * Function prototypes - Sound * *******************************/ void play_sound(const gchar *file); #endif kildclient-2.11.1/src/macros.c0000644000175000017500000001171111570205043013054 00000000000000/* $Id: macros.c 1176 2011-05-28 14:43:45Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "kildclient.h" #include "perlscript.h" #ifdef HAVE_CONFIG_H # include #endif /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ gboolean check_macros(World *world, guint keyval, GdkModifierType modifiers) { GSList *macroptr; Macro *macro; if (world->disable_macros) { return FALSE; } macroptr = world->macros; while (macroptr) { macro = (Macro *) macroptr->data; if (macro->enabled && macro->keyval == keyval && macro->modifiers == (modifiers & GDK_MODIFIER_MASK)) { parse_commands(world, macro->action, strlen(macro->action)); return TRUE; } macroptr = macroptr->next; } return FALSE; } void remove_macro(World *world, GSList *macroitem) { Macro *macro = (Macro *) macroitem->data; we_macro_delete_macro(world, macro); world->macros = g_slist_remove_link(world->macros, macroitem); if (!macro->owner_plugin) { --world->macro_pos; } free_macro(macro, NULL); g_slist_free(macroitem); } gboolean move_macro(World *world, gint old_pos, gint new_pos) { GSList *macroitem; gpointer macro; macroitem = g_slist_nth(world->macros, old_pos); if (!macroitem) { return FALSE; } macro = macroitem->data; world->macros = g_slist_delete_link(world->macros, macroitem); world->macros = g_slist_insert(world->macros, macro, new_pos); we_macro_delete_macro(world, macro); we_macro_insert_macro(world, macro, new_pos); return TRUE; } void free_macro(Macro *macro, gpointer data) { g_free(macro->name); g_free(macro->action); g_free(macro); } void list_macros(World *world, Plugin *plugin) { guint i; guint total_width; guint field1_width; guint field2_width; GSList *macroptr; Macro *macro; char *keycodestr; /* The rows argument is not used. */ ansitextview_get_size(world->gui, &field1_width, &total_width); /* If the screen is really narrow, we can do nothing. */ if (total_width < 15) { total_width = 15; } field1_width = (total_width - 9) * .3; field2_width = (total_width - 9) * .7; ansitextview_append_stringf(world->gui, _("Num Ena %-*.*s %-*.*s\n"), field1_width, field1_width, _("Key"), field2_width, field2_width, _("Action")); ansitextview_append_string(world->gui, "--- --- "); for (i = 0; i < field1_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, " "); for (i = 0; i < field2_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, "\n"); i = 0; macroptr = world->macros; while (macroptr) { macro = (Macro *) macroptr->data; if (macro->owner_plugin == plugin) { keycodestr = gtk_accelerator_name(macro->keyval, macro->modifiers); ansitextview_append_stringf(world->gui, "%3d %-3.3s %-*.*s %-*.*s\n", i, macro->enabled ? _("y") : _("n"), field1_width, field1_width, keycodestr, field2_width, field2_width, macro->action); g_free(keycodestr); } ++i; macroptr = macroptr->next; } } void save_macro(GString *str, Macro *macro) { char *keycodestr; keycodestr = gtk_accelerator_name(macro->keyval, macro->modifiers); g_string_append(str, " name) { kc_g_string_append_escaped(str, "name=\"%s\" ", macro->name); } g_string_append_printf(str, "enabled=\"%d\">\n", macro->enabled); kc_g_string_append_escaped(str, " %s\n" " %s\n" " \n", keycodestr, macro->action); g_free(keycodestr); } kildclient-2.11.1/src/perlscript.h0000644000175000017500000000714511570450170013775 00000000000000/* $Id: perlscript.h 1178 2011-05-29 13:21:14Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __PERLSCRIPT_H #define __PERLSCRIPT_H #include #include /* Conflicts with C library function */ #undef gethostbyname #undef ctime /* Conflits with gettext */ #undef _ #define _(string) gettext(string) #define N_(string) (string) #ifdef __MINGW32__ /* Why the hell does Perl (under Mingw32) does all that? */ #undef FILE #undef clearerr #undef fclose #undef fdopen #undef feof #undef ferror #undef fflush #undef fgetc #undef fgetpos #undef fgets #undef fileno #undef flockfile #undef fopen #undef fprintf #undef fputc #undef fputs #undef fread #undef freopen #undef fscanf #undef fseek #undef fsetpos #undef ftell #undef ftrylockfile #undef funlockfile #undef fwrite #undef getc #undef getc_unlocked #undef getw #undef pclose #undef popen #undef putc #undef putc_unlocked #undef putw #undef rewind #undef setbuf #undef setvbuf #undef tmpfile #undef ungetc #undef vfprintf #undef printf #undef mkdir #undef stat #undef unlink #undef stdin #define stdin (&_iob[0]) #undef stdout #define stdout (&_iob[1]) #undef stderr #define stderr (&_iob[2]) #undef htons #undef gethostbyname #undef socket #undef connect #undef write #undef read #undef send #undef recv #undef close #undef getsockopt #undef setsockopt #undef gettimeofday #undef malloc #undef free #undef calloc #undef realloc #undef exit #undef __attribute__ #endif /* __MINGW32 */ /*********************** * Forward declaration * ***********************/ struct world_s; /*********************** * Function prototypes * ***********************/ void init_perl_system(void); void init_perl_script(struct world_s *world); void destruct_perl_script(PerlInterpreter *perl_interpreter); void perl_script_import_file(PerlInterpreter *interpreter, const char *file); int perl_match(PerlInterpreter *interpreter, const unsigned char *line, SV *pattern_re, int *match_start, int *match_end, int substring); char *perl_substitute(PerlInterpreter *interpreter, const char *line, SV *pattern_re, const char *substitution, int perl_eval, int global); SV *precompute_re(PerlInterpreter *interpreter, const char *re_string, int ignore_case); void menu_perl_run_cb(GtkWidget *widget, gpointer data); void run_perl_command(char *cmd); /*********************************** * KCWin XS subroutines prototypes * ***********************************/ void XS_KCWin__new(pTHX_ CV *perlcv); void XS_KCWin_feed(pTHX_ CV *perlcv); void XS_KCWin__destroy(pTHX_ CV *perlcv); #endif kildclient-2.11.1/src/triggers.c0000644000175000017500000005061611570205043013425 00000000000000/* $Id: triggers.c 1176 2011-05-28 14:43:45Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include "kildclient.h" #include "ansi.h" #include "perlscript.h" /*********************************************** * Function prototypes - Test trigger function * ***********************************************/ static void apply_highlight(World *world, Trigger *trigger, GtkTextIter *end_iter); static GtkWidget *create_test_triggers_dialog(GtkWindow *parent, World *world); /* XML UI signals */ G_MODULE_EXPORT void test_triggers_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void test_trigger_send_cb(GtkWidget *widget, gpointer data); Trigger * new_trigger(void) { Trigger *trigger; trigger = g_new0(Trigger, 1); trigger->high_fg_color = -1; trigger->high_bg_color = -1; trigger->high_italic = -1; trigger->high_strike = -1; trigger->high_underline = -1; return trigger; } void match_triggers(World *world, guchar **line, guchar **colorline, gsize *output_len, gboolean *gag_output, gboolean *gag_log, gint *n_matches, GSList **trigger_response) { /* This function matches triggers against the line. If trigger_response is NULL, then it executes triggers, and also writes the line to the screen and/or log file if appropriate. If trigger_response points to a GSList, then this function does not do anything really, but stores the commands that would be executed in the list, for use in the Test Triggers function. */ GSList *trigptr; Trigger *trigger; SV *Pcolorline = NULL; int i; gchar *tmp; GSList *highlights = NULL; gboolean dont_flush = world->dont_flush; GtkTextIter line_end; *n_matches = 0; if (world->disable_triggers) { if (!trigger_response) { ansitextview_append_ansi_string(world->gui, (gchar *) *colorline, *output_len); if (world->log_file) { write_log_line(world, (gchar *) *line, NULL); } } return; } PERL_SET_CONTEXT(world->perl_interpreter); /* * First pass: rewriter triggers */ trigptr = world->triggers; i = 0; while (trigptr) { trigger = (Trigger *) trigptr->data; if (trigger->rewriter && trigger->enabled && perl_match(world->perl_interpreter, *line, trigger->pattern_re, NULL, NULL, 0)) { ++(*n_matches); if (!Pcolorline) { Pcolorline = get_sv("colorline", TRUE); sv_setpv(Pcolorline, (char *) *colorline); } if (debug_matches) { fprintf(stderr, "**Trigger %d '%s' (rewriter) matched for world %s\n" " Line: %s" " Pattern: %s\n" " Action: %s\n", i, trigger->name ? trigger->name : "", world->name, *line, trigger->pattern, trigger->action); } if (trigger->action) { parse_commands(world, trigger->action, strlen(trigger->action)); } g_free(*colorline); tmp = SvPV(Pcolorline, *output_len); *colorline = (guchar *) g_strdup(tmp); g_free(*line); *line = strip_ansi(*colorline, *output_len); } trigptr = trigptr->next; ++i; } /* * Second pass: see if one of the triggers is a gag */ trigptr = world->triggers; while (trigptr) { trigger = (Trigger *) trigptr->data; if (!trigger->rewriter && trigger->enabled && perl_match(world->perl_interpreter, *line, trigger->pattern_re, &trigger->match_start, &trigger->match_end, trigger->high_target)) { *gag_output |= trigger->gag_output; *gag_log |= trigger->gag_log; if (*gag_output && *gag_log) { break; } if (trigger->highlight) { highlights = g_slist_append(highlights, trigger); } if (!trigger->keepexecuting) { break; } } trigptr = trigptr->next; } if (!trigger_response) { if (!*gag_output) { GSList *cur_highlight; ansitextview_append_ansi_string(world->gui, (gchar *) *colorline, *output_len); gtk_text_buffer_get_iter_at_offset(world->gui->txtBuffer, &line_end, -1); /* Highlights */ for (cur_highlight = highlights; cur_highlight; cur_highlight = cur_highlight->next) { apply_highlight(world, cur_highlight->data, &line_end); } g_slist_free(highlights); /* Move mark */ gtk_text_buffer_move_mark(world->gui->txtBuffer, world->gui->txtmark_linestart, &line_end); /* Save color at end of line */ world->gui->ta.saved_state = world->gui->ta.state; } if (world->log_file && !*gag_log) { write_log_line(world, (gchar *) *line, NULL); } } /* * Third pass: run normal triggers */ world->dont_flush = TRUE; world_for_perl = world; trigptr = world->triggers; i = 0; while (trigptr) { trigger = (Trigger *) trigptr->data; if (!trigger->rewriter && trigger->enabled && perl_match(world->perl_interpreter, *line, trigger->pattern_re, NULL, NULL, 0)) { ++(*n_matches); if (!Pcolorline) { Pcolorline = get_sv("colorline", TRUE); sv_setpv(Pcolorline, (char *) *colorline); } if (debug_matches) { fprintf(stderr, "**Trigger %d '%s' matched for world %s\n" " Line: %s" " Pattern: %s\n" " Action: %s\n", i, trigger->name ? trigger->name : "", world->name, *line, trigger->pattern, trigger->action ? trigger->action : ""); } if (trigger->action) { /* Substitute $1, $2, etc. for matched parts. */ gchar *action = perl_substitute(world->perl_interpreter, trigger->action, world->trigger_action_re, "$_[$1]", FALSE, TRUE); if (!trigger_response) { if (action) { parse_commands(world, action, strlen(action)); g_free(action); } else { parse_commands(world, trigger->action, strlen(trigger->action)); } } else { if (action) { *trigger_response = g_slist_append(*trigger_response, action); } else { *trigger_response = g_slist_append(*trigger_response, g_strdup(trigger->action)); } } } if (!trigger->keepexecuting) { break; } } trigptr = trigptr->next; ++i; } world_for_perl = currentWorld; world->dont_flush = dont_flush; } static void apply_highlight(World *world, Trigger *trigger, GtkTextIter *end_iter) { GtkTextIter start; GtkTextIter end; int i; start = *end_iter; gtk_text_iter_backward_line(&start); end = start; if (trigger->high_target != -1) { gtk_text_iter_set_line_offset(&start, trigger->match_start); gtk_text_iter_set_line_offset(&end, trigger->match_end); } else { /* The whole line */ gtk_text_iter_forward_to_line_end(&end); } if (trigger->high_fg_color != -1) { /* Remove previous tags */ for (i = 0; i < ANSI_TABLE_SIZE; ++i) { gtk_text_buffer_remove_tag(world->gui->txtBuffer, world->gui->ta.ansi_fore_tags[i], &start, &end); } gtk_text_buffer_apply_tag(world->gui->txtBuffer, world->gui->ta.ansi_fore_tags[trigger->high_fg_color], &start, &end); } if (trigger->high_bg_color != -1) { /* Remove previous tags */ for (i = 0; i < ANSI_TABLE_SIZE; ++i) { gtk_text_buffer_remove_tag(world->gui->txtBuffer, world->gui->ta.ansi_back_tags[i], &start, &end); } gtk_text_buffer_apply_tag(world->gui->txtBuffer, world->gui->ta.ansi_back_tags[trigger->high_bg_color], &start, &end); } if (trigger->high_italic != -1) { gtk_text_buffer_remove_tag(world->gui->txtBuffer, world->gui->ta.italics_tag, &start, &end); if (trigger->high_italic) { gtk_text_buffer_apply_tag(world->gui->txtBuffer, world->gui->ta.italics_tag, &start, &end); } } if (trigger->high_strike != -1) { gtk_text_buffer_remove_tag(world->gui->txtBuffer, world->gui->ta.strike_tag, &start, &end); if (trigger->high_strike) { gtk_text_buffer_apply_tag(world->gui->txtBuffer, world->gui->ta.strike_tag, &start, &end); } } if (trigger->high_underline != -1) { gtk_text_buffer_remove_tag(world->gui->txtBuffer, world->gui->ta.underline_tag, &start, &end); gtk_text_buffer_remove_tag(world->gui->txtBuffer, world->gui->ta.dblunderline_tag, &start, &end); if (trigger->high_underline == 1) { gtk_text_buffer_apply_tag(world->gui->txtBuffer, world->gui->ta.underline_tag, &start, &end); } if (trigger->high_underline == 2) { gtk_text_buffer_apply_tag(world->gui->txtBuffer, world->gui->ta.dblunderline_tag, &start, &end); } } } void remove_trigger(World *world, GSList *triggeritem) { Trigger *trigger = (Trigger *) triggeritem->data; /* Necessary when free_trigger dereferences trigger->pattern_re */ if (world->perl_interpreter) { PERL_SET_CONTEXT(world->perl_interpreter); } we_trigger_delete_trigger(world, trigger); world->triggers = g_slist_remove_link(world->triggers, triggeritem); if (!trigger->owner_plugin) { --world->trigger_pos; } free_trigger(trigger, NULL); g_slist_free(triggeritem); } gboolean move_trigger(World *world, gint old_pos, gint new_pos) { GSList *triggeritem; gpointer trigger; triggeritem = g_slist_nth(world->triggers, old_pos); if (!triggeritem) { return FALSE; } trigger = triggeritem->data; world->triggers = g_slist_delete_link(world->triggers, triggeritem); world->triggers = g_slist_insert(world->triggers, trigger, new_pos); we_trigger_delete_trigger(world, trigger); we_trigger_insert_trigger(world, trigger, new_pos); return TRUE; } void free_trigger(Trigger *trigger, gpointer data) { g_free(trigger->name); g_free(trigger->pattern); g_free(trigger->action); SvREFCNT_dec(trigger->pattern_re); g_free(trigger); } void list_triggers(World *world, Plugin *plugin) { guint i; guint total_width; guint field_width; GSList *trigptr; Trigger *trigger; /* The rows argument is not used. */ ansitextview_get_size(world->gui, &field_width, &total_width); /* If the screen is really narrow, we can do nothing. */ if (total_width < 49) { total_width = 49; } field_width = (total_width - 34)/2; ansitextview_append_stringf(world->gui, _("Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n"), field_width, field_width, _("Pattern"), field_width, field_width, _("Action")); ansitextview_append_string(world->gui, "--- --- --- --- --- --- --- --- "); for (i = 0; i < field_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, " "); for (i = 0; i < field_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, "\n"); i = 0; trigptr = world->triggers; while (trigptr) { trigger = (Trigger *) trigptr->data; if (trigger->owner_plugin == plugin) { ansitextview_append_stringf(world->gui, "%3d %-3.3s %-3.3s %-3.3s %-3.3s %-3.3s %-3.3s %-3.3s %-*.*s %-*.*s\n", i, trigger->gag_output ? _("y") : _("n"), trigger->gag_log ? _("y") : _("n"), trigger->enabled ? _("y") : _("n"), trigger->keepexecuting ? _("y") : _("n"), trigger->rewriter ? _("y") : _("n"), trigger->ignore_case ? _("y") : _("n"), trigger->highlight ? _("y") : _("n"), field_width, field_width, trigger->pattern, field_width, field_width, trigger->action ? trigger->action : ""); } ++i; trigptr = trigptr->next; } } void trigger_precompute_res(World *world) { GSList *triggerptr = world->triggers; Trigger *trigger; while (triggerptr) { trigger = (Trigger *) triggerptr->data; /* Plugins loaded from a script file already have the precomputed RE */ if (!trigger->pattern_re) { trigger->pattern_re = precompute_re(world->perl_interpreter, trigger->pattern, trigger->ignore_case); } triggerptr = triggerptr->next; } /* Precompute a special pattern to substitute $1, $2, etc in trigger actions. */ if (!world->trigger_action_re) { world->trigger_action_re = precompute_re(world->perl_interpreter, "\\$([0-9]+)", FALSE); } } void save_trigger(GString *str, Trigger *trigger) { g_string_append(str, " name) { kc_g_string_append_escaped(str, "name=\"%s\" ", trigger->name); } g_string_append_printf(str, "enabled=\"%d\" keepexecuting=\"%d\" rewriter=\"%d\" ignorecase=\"%d\"%s%s>\n", trigger->enabled, trigger->keepexecuting, trigger->rewriter, trigger->ignore_case, trigger->gag_output ? " gag=\"1\"" : "", trigger->gag_log ? " gaglog=\"1\"": ""); kc_g_string_append_escaped(str, " %s\n", trigger->pattern); if (trigger->action) { kc_g_string_append_escaped(str, " %s\n", trigger->action); } g_string_append_printf(str, " \n", trigger->highlight, trigger->high_target, trigger->high_fg_color, trigger->high_bg_color, trigger->high_italic, trigger->high_strike, trigger->high_underline); g_string_append(str, " \n"); } /* * Test trigger function. */ void test_triggers_cb(GtkWidget *widget, gpointer data) { if (currentWorld) { open_test_triggers_dialog(currentWorld); } } void open_test_triggers_dialog(World *world) { if (!world->dlgTestTriggers) { world->dlgTestTriggers = create_test_triggers_dialog(GTK_WINDOW(wndMain), world); } gtk_widget_show_all(world->dlgTestTriggers); gtk_window_present(GTK_WINDOW(world->dlgTestTriggers)); } static GtkWidget * create_test_triggers_dialog(GtkWindow *parent, World *world) { GError *error = NULL; GObject *dlg; /* Create the dialog */ if (!world->ui_builder) { world->ui_builder = gtk_builder_new(); } if (!gtk_builder_add_from_file(world->ui_builder, get_kildclient_installed_file("dlgTestTriggers.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } dlg = gtk_builder_get_object(world->ui_builder, "dlgTestTriggers"); /* Signals */ gtk_builder_connect_signals(world->ui_builder, world); return GTK_WIDGET(dlg); } void test_trigger_send_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkEntry *txtLine; GtkLabel *lblMatches; GtkTextView *txtCommands; GtkEntry *txtOutput; GtkLabel *lblGagLog; GtkTextBuffer *bufCommands; gboolean disable_triggers; guchar *line; guchar *stripped; gint n_matches; GSList *trigger_response = NULL; gsize output_len; gboolean gag_output = FALSE; gboolean gag_log = FALSE; gchar *n_matches_str; GSList *cmdptr; GtkTextIter iter; txtLine = GTK_ENTRY(gtk_builder_get_object(world->ui_builder, "txtLine")); lblMatches = GTK_LABEL(gtk_builder_get_object(world->ui_builder, "lblMatches")); txtOutput = GTK_ENTRY(gtk_builder_get_object(world->ui_builder, "txtOutput")); txtCommands = GTK_TEXT_VIEW(gtk_builder_get_object(world->ui_builder, "txtCommands")); lblGagLog = GTK_LABEL(gtk_builder_get_object(world->ui_builder, "lblGagLog")); bufCommands = gtk_text_view_get_buffer(txtCommands); line = (guchar *) g_strdup(gtk_entry_get_text(txtLine)); stripped = strip_ansi(line, strlen((gchar *) line)); /* We need the triggers to be tried. */ disable_triggers = world->disable_triggers; world->disable_triggers = FALSE; match_triggers(world, &stripped, &line, &output_len, &gag_output, &gag_log, &n_matches, &trigger_response); world->disable_triggers = disable_triggers; /* Show output */ n_matches_str = g_strdup_printf("%d", n_matches); gtk_label_set_text(lblMatches, n_matches_str); g_free(n_matches_str); gtk_text_buffer_set_text(bufCommands, "", 0); gtk_text_buffer_get_end_iter(bufCommands, &iter); cmdptr = trigger_response; while (cmdptr) { gtk_text_buffer_insert(bufCommands, &iter, (gchar *) cmdptr->data, -1); gtk_text_buffer_insert(bufCommands, &iter, "\n", 1); cmdptr = cmdptr->next; } g_slist_foreach(trigger_response, (GFunc) g_free, NULL); g_slist_free(trigger_response); if (!gag_output) { gtk_entry_set_text(txtOutput, (gchar *) line); } else { gtk_entry_set_text(txtOutput, ""); } gtk_label_set_text(lblGagLog, gag_log ? _("No") : _("Yes")); g_free(line); g_free(stripped); } kildclient-2.11.1/src/worldselector.c0000644000175000017500000006147011526001511014462 00000000000000/* $Id: worldselector.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #ifndef __WIN32__ # include #else # include #endif #include #include #include "kildclient.h" #include "perlscript.h" /******************** * Type definitions * ********************/ enum { COLUMN_NAME, COLUMN_FILE, COLUMN_INDEX, N_COLUMNS, }; /************************* * File global variables * *************************/ GtkWidget *dlgSelectWorld; GtkToggleButton *radManually; GtkEntry *txtHost; GtkEntry *txtPort; GtkTreeView *lstWorlds; /*********************** * Function prototypes * ***********************/ static GtkWidget *create_world_selector_dlg(GtkWindow* parent); static GtkTreeStore *create_saved_worlds_model(GtkTreeIter **last_open_iter); static void fill_saved_worlds_model(GtkTreeStore *model, GtkTreeIter **last_open_iter); static void add_saved_worlds_model_entry_from_file(GtkTreeStore *model, const gchar *file, GtkTreeIter **last_open_iter); static void add_saved_worlds_model_entries(GtkTreeStore *model, World *world, GtkTreeIter *worlditer); static gint sort_by_name(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data); static char *try_find_world_from_name(const gchar *name); static char *compare_world_from_name(const gchar *file, const gchar *name); static void list_selection_changed_cb(GtkTreeSelection *selection, gpointer data); static void add_edit_buttons_cb(GtkButton *btn, gpointer data); /* XML UI signals */ G_MODULE_EXPORT void set_manually_cb(GtkEditable *widget, gpointer user); G_MODULE_EXPORT void list_row_activated_cb(gpointer data, GtkTreeView *treeview, GtkTreePath *treepath, GtkTreeViewColumn *column); G_MODULE_EXPORT void delete_button_cb(GtkButton *btn, gpointer data); World * get_world_to_connect() { GtkWidget *dlgWorldSelector; World *world = NULL; gboolean success; dlgWorldSelector = create_world_selector_dlg(GTK_WINDOW(wndMain)); gtk_widget_show_all(dlgWorldSelector); success = FALSE; while (!success) { if (gtk_dialog_run(GTK_DIALOG(dlgWorldSelector)) == GTK_RESPONSE_OK) { world = create_new_world(TRUE); world->connected = FALSE; if (gtk_toggle_button_get_active(radManually)) { create_world_from_parameters(world, g_strdup(gtk_entry_get_text(txtHost)), g_strdup(gtk_entry_get_text(txtPort)), NULL, NULL); success = TRUE; } else { GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; selection = gtk_tree_view_get_selection(lstWorlds); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { char *file; gint charidx; GError *error = NULL; gtk_tree_model_get(model, &iter, COLUMN_FILE, &file, COLUMN_INDEX, &charidx, -1); success = load_world_from_file(file, world, FALSE, &error); if (!success) { GtkWidget *msgdlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not load world from file '%s': %s"), file, error->message); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Error")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); free_world(world); world = NULL; } else { if (charidx == -1) { world->character_used = NULL; } else { GtkTreePath *path; GtkTreeRowReference *ref; path = gtk_tree_path_new_from_indices(charidx, -1); ref = gtk_tree_row_reference_new(world->logon_characters, path); world->character_used = ref; gtk_tree_path_free(path); } } } } } else { /* Response was not OK */ /* Considered successful, returns NULL and the application quits */ success = TRUE; } } gtk_widget_destroy(dlgWorldSelector); return world; } static GtkWidget* create_world_selector_dlg(GtkWindow* parent) { GtkBuilder *ui_builder; GError *error = NULL; GObject *radFromList; GObject *btnNew; GObject *btnEdit; GtkTreeStore *model; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkTreeSelection *selection; GtkTreeIter *last_open_iter = NULL; ui_builder = gtk_builder_new(); if (!gtk_builder_add_from_file(ui_builder, get_kildclient_installed_file("dlgSelectWorld.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); exit(1); /* No point in continuing */ } dlgSelectWorld = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgSelectWorld")); gtk_window_set_transient_for(GTK_WINDOW(dlgSelectWorld), parent); gtk_dialog_set_default_response(GTK_DIALOG(dlgSelectWorld), GTK_RESPONSE_OK); /* Set global variables pointing to widgets */ radFromList = gtk_builder_get_object(ui_builder, "radFromList"); radManually = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radManually")); txtHost = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtHost")); txtPort = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtPort")); /* Prepare TreeView with the Worlds */ model = create_saved_worlds_model(&last_open_iter); lstWorlds = GTK_TREE_VIEW(gtk_builder_get_object(ui_builder, "lstWorlds")); gtk_tree_view_set_model(lstWorlds, GTK_TREE_MODEL(model)); g_object_unref(G_OBJECT(model)); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(NULL, renderer, "text", COLUMN_NAME, NULL); gtk_tree_view_append_column(lstWorlds, column); /* Pre select last used world */ selection = gtk_tree_view_get_selection(lstWorlds); if (last_open_iter) { GtkTreePath *path; gtk_tree_selection_select_iter(selection, last_open_iter); path = gtk_tree_model_get_path(GTK_TREE_MODEL(model), last_open_iter); gtk_tree_view_scroll_to_cell(lstWorlds, path, NULL, FALSE, 0, 0); gtk_tree_path_free(path); } /* Connect signals that can't be specified in the XML UI file */ g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(list_selection_changed_cb), radFromList); btnNew = gtk_builder_get_object(ui_builder, "btnNew"); g_signal_connect(btnNew, "clicked", G_CALLBACK(add_edit_buttons_cb), GINT_TO_POINTER(0)); btnEdit = gtk_builder_get_object(ui_builder, "btnEdit"); g_signal_connect(btnEdit, "clicked", G_CALLBACK(add_edit_buttons_cb), GINT_TO_POINTER(1)); gtk_builder_connect_signals(ui_builder, NULL); g_object_unref(ui_builder); return dlgSelectWorld; } static GtkTreeStore * create_saved_worlds_model(GtkTreeIter **last_open_iter) { GtkTreeStore *model; GtkTreeSortable *sortable; model = gtk_tree_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT); fill_saved_worlds_model(model, last_open_iter); /* Sort the list */ sortable = GTK_TREE_SORTABLE(model); gtk_tree_sortable_set_sort_func(sortable, COLUMN_NAME, sort_by_name, NULL, NULL); gtk_tree_sortable_set_sort_column_id(sortable, COLUMN_NAME, GTK_SORT_ASCENDING); return model; } #ifndef __WIN32__ static void fill_saved_worlds_model(GtkTreeStore *model, GtkTreeIter **last_open_iter) { const char *kilddir; char *globstr; glob_t globbuf; kilddir = get_kildclient_directory_path();; globstr = g_strdup_printf("%s/*.wrl", kilddir); if (glob(globstr, GLOB_ERR | GLOB_NOSORT, 0, &globbuf) == 0 && globbuf.gl_pathc) { char *file; while ((file = *globbuf.gl_pathv++)) { add_saved_worlds_model_entry_from_file(model, file, last_open_iter); } } g_free(globstr); /* globfree(&globbuf); */ } #else static void fill_saved_worlds_model(GtkTreeStore *model, GtkTreeIter **last_open_iter) { const char *kilddir; char *globstr; char *file; WIN32_FIND_DATA FindFileData; HANDLE hFind = INVALID_HANDLE_VALUE; /* Mental note: Find{First,Next}File only return the file name, without path. Windows sucks. */ kilddir = get_kildclient_directory_path(); globstr = g_strdup_printf("%s\\*.wrl", kilddir); hFind = FindFirstFile(globstr, &FindFileData); if (hFind != INVALID_HANDLE_VALUE) { file = g_strdup_printf("%s\\%s", kilddir, FindFileData.cFileName); add_saved_worlds_model_entry_from_file(model, file, last_open_iter); g_free(file); while (FindNextFile(hFind, &FindFileData)) { file = g_strdup_printf("%s\\%s", kilddir, FindFileData.cFileName); add_saved_worlds_model_entry_from_file(model, file, last_open_iter); g_free(file); } FindClose(hFind); } g_free(globstr); } #endif static void add_saved_worlds_model_entry_from_file(GtkTreeStore *model, const gchar *file, GtkTreeIter **last_open_iter) { GtkTreeIter worlditer; World *world; GError *error = NULL; /* We do not call create_new_world because we don't care about the default parameters, we only want the name and file */ world = g_new0(World, 1); world->logon_characters = GTK_TREE_MODEL(gtk_list_store_new(N_LOGON_COLUMNS, G_TYPE_STRING, G_TYPE_STRING)); if (!load_world_from_file(file, world, TRUE, &error)) { fprintf(stderr, "Error loading %s: %s\n", file, error->message); return; } add_saved_worlds_model_entries(model, world, &worlditer); /* See if this was the last opened world */ if (!(*last_open_iter) && globalPrefs.last_open_world && strcmp(world->name, globalPrefs.last_open_world) == 0) { *last_open_iter = g_new(GtkTreeIter, 1); **last_open_iter = worlditer; } g_free(world->name); g_free(world->file); g_object_unref(world->logon_characters); g_free(world); } static void add_saved_worlds_model_entries(GtkTreeStore *model, World *world, GtkTreeIter *worlditer) { /* Fills worlditer with the iter pointing to the world. */ gint n_chars; n_chars = gtk_tree_model_iter_n_children(world->logon_characters, NULL); /* Add world main entry */ gtk_tree_store_append(model, worlditer, NULL); gtk_tree_store_set(model, worlditer, COLUMN_NAME, world->name, COLUMN_FILE, world->file, COLUMN_INDEX, n_chars ? 0 : -1, -1); /* Add sub-entries for each of the characters */ if (n_chars > 0) { GtkTreeIter chariter; GtkTreeIter subworlditer; gint idx; gtk_tree_model_get_iter_first(world->logon_characters, &chariter); idx = 0; do { gchar *character; gtk_tree_model_get(world->logon_characters, &chariter, LOGON_CHAR, &character, -1); gtk_tree_store_append(model, &subworlditer, worlditer); gtk_tree_store_set(model, &subworlditer, COLUMN_NAME, character, COLUMN_FILE, world->file, COLUMN_INDEX, idx, -1); g_free(character); ++idx; } while (gtk_tree_model_iter_next(world->logon_characters, &chariter)); /* Add an entry for logging without Auto-logon */ gtk_tree_store_append(model, &subworlditer, worlditer); gtk_tree_store_set(model, &subworlditer, COLUMN_NAME, "No auto-login", COLUMN_FILE, world->file, COLUMN_INDEX, -1, -1); } } static gint sort_by_name(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data) { GtkTreePath *path_a; GtkTreePath *path_b; gchar *name_a; gchar *name_b; gint ret; path_a = gtk_tree_model_get_path(model, a); path_b = gtk_tree_model_get_path(model, b); /* The check to see if path_a and path_b are not NULL is done to avoid a Gtk Warning that appears when we add something to a model already sorted. This might be a Gtk bug. */ /* Only top-level entries are sorted */ if (path_a && path_b && gtk_tree_path_get_depth(path_a) > 1) { ret = gtk_tree_path_compare(path_a, path_b); } else { gtk_tree_model_get(model, a, COLUMN_NAME, &name_a, -1); gtk_tree_model_get(model, b, COLUMN_NAME, &name_b, -1); ret = g_utf8_collate(name_a, name_b); g_free(name_a); g_free(name_b); } gtk_tree_path_free(path_a); gtk_tree_path_free(path_b); return ret; } World * get_world_from_cmdline(const gchar *cmdline) { gchar *world_file; World *world = NULL; static GRegex *parameters_regex = NULL; world_file = try_find_world_from_name(cmdline); if (world_file) { GError *error = NULL; world = create_new_world(TRUE); if (load_world_from_file(world_file, world, FALSE, &error)) { g_free(world_file); } else { g_free(world_file); fprintf(stderr, _("Could not open world '%s': %s\n"), cmdline, error->message); free_world(world); } } else { GMatchInfo *matchinfo; gchar *host; gchar *port; gchar *user; gchar *password; GError *error; if (parameters_regex == NULL) { parameters_regex = g_regex_new( "^(telnet://)?" "((?[a-zA-Z0-9_.+$!*'()\"-]+)" ":(?[a-zA-Z0-9_.+$!*'()\"-]+)" "@)?" "(?[a-zA-Z0-9.-]+)" "(:(?\\d+))?" "/?$", G_REGEX_NO_AUTO_CAPTURE, 0, &error); if (error) fprintf(stderr, error->message); } if (g_regex_match(parameters_regex, cmdline, 0, &matchinfo)) { host = g_match_info_fetch_named(matchinfo, "host"); port = g_match_info_fetch_named(matchinfo, "port"); user = g_match_info_fetch_named(matchinfo, "user"); password = g_match_info_fetch_named(matchinfo, "password"); g_match_info_free(matchinfo); world = create_new_world(TRUE); create_world_from_parameters(world, host, port, user, password); } else { g_match_info_free(matchinfo); fprintf(stderr, _("Invalid argument '%s'\n"), cmdline); } } return world; } #ifndef __WIN32__ static char * try_find_world_from_name(const gchar *name) { const gchar *kilddir; gchar *globstr; glob_t globbuf; char *result = NULL; kilddir = get_kildclient_directory_path(); globstr = g_strdup_printf("%s/*.wrl", kilddir); if (glob(globstr, GLOB_ERR | GLOB_NOSORT, 0, &globbuf) == 0 && globbuf.gl_pathc) { char *file; while (!result && (file = *globbuf.gl_pathv++)) { result = compare_world_from_name(file, name); } } g_free(globstr); /* globfree(&globbuf); */ return result; } #else static char * try_find_world_from_name(const gchar *name) { const gchar *kilddir; gchar *globstr; gchar *file; WIN32_FIND_DATA FindFileData; HANDLE hFind = INVALID_HANDLE_VALUE; char *result = NULL; kilddir = get_kildclient_directory_path(); globstr = g_strdup_printf("%s\\*.wrl", kilddir); hFind = FindFirstFile(globstr, &FindFileData); if (hFind != INVALID_HANDLE_VALUE) { file = g_strdup_printf("%s\\%s", kilddir, FindFileData.cFileName); result = compare_world_from_name(file, name); g_free(file); while (!result && FindNextFile(hFind, &FindFileData)) { file = g_strdup_printf("%s\\%s", kilddir, FindFileData.cFileName); result = compare_world_from_name(file, name); g_free(file); } FindClose(hFind); } g_free(globstr); return result; } #endif static char * compare_world_from_name(const gchar *file, const gchar *name) { /* We do not call create_new_world because we don't care about the default parameters, we only want the name and file */ World *world = g_new0(World, 1); char *result = NULL; if (load_world_from_file(file, world, TRUE, NULL)) { if (strcmp(world->name, name) == 0) { result = world->file; } else { g_free(world->file); } g_free(world->name); g_free(world); } return result; } void set_manually_cb(GtkEditable *widget, gpointer user) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radManually), TRUE); } static void list_selection_changed_cb(GtkTreeSelection *selection, gpointer data) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data), TRUE); } void list_row_activated_cb(gpointer data, GtkTreeView *treeview, GtkTreePath *treepath, GtkTreeViewColumn *column) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(data), TRUE); gtk_dialog_response(GTK_DIALOG(dlgSelectWorld), GTK_RESPONSE_OK); } static void add_edit_buttons_cb(GtkButton *btn, gpointer data) { World *world = NULL; GtkTreeIter iter; GtkTreeModel *model; gboolean newworld; if (GPOINTER_TO_INT(data)) { GtkTreeSelection *selection; char *file; GError *error = NULL; selection = gtk_tree_view_get_selection(lstWorlds); if (!gtk_tree_selection_get_selected(selection, &model, &iter)) return; gtk_tree_model_get(model, &iter, COLUMN_FILE, &file, -1); world = create_new_world(FALSE); if (!load_world_from_file(file, world, FALSE, &error)) { GtkWidget *msgdlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not load world from file '%s': %s"), file, error->message); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Error")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); g_free(world); return; } make_startup_plugin_list_for_editing(world); } else { model = gtk_tree_view_get_model(lstWorlds); } if (edit_world(&world, GTK_WINDOW(dlgSelectWorld), &newworld, TRUE)) { GtkTreeIter worlditer; save_world_to_file(world); /* Remove entry, because it will be added again. */ if (!newworld) { GtkTreeIter parent; GtkTreeIter child; if (!gtk_tree_model_iter_parent(model, &parent, &iter)) { parent = iter; } /* Remove the children */ if (gtk_tree_model_iter_children(model, &child, &parent)) { while (gtk_tree_store_remove(GTK_TREE_STORE(model), &child)) ; } gtk_tree_store_remove(GTK_TREE_STORE(model), &parent); } add_saved_worlds_model_entries(GTK_TREE_STORE(model), world, &worlditer); } free_world(world); } void delete_button_cb(GtkButton *btn, gpointer data) { GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; GtkTreeIter parent; char *name; char *file; GtkWidget *msgdlg; gchar *msg; selection = gtk_tree_view_get_selection(lstWorlds); if (!gtk_tree_selection_get_selected(selection, &model, &iter)) return; /* Make sure we point to the parent */ if (!gtk_tree_model_iter_parent(model, &parent, &iter)) { parent = iter; } gtk_tree_model_get(model, &parent, COLUMN_NAME, &name, COLUMN_FILE, &file, -1); msg = g_strdup_printf("world '%s'", name); msgdlg = we_guied_confirm_delete_dialog_new(GTK_WINDOW(wndMain), 1, msg, ""); g_free(msg); if (gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { GtkTreeIter child; char *otherfile; unlink(file); /* four characters for the dot and extension, 1 for null terminator */ otherfile = malloc(strlen(file) + 5); strcpy(otherfile, file); strcat(otherfile, ".hst"); unlink(otherfile); strcpy(otherfile, file); strcat(otherfile, ".var"); unlink(otherfile); g_free(otherfile); /* Remove the children */ if (gtk_tree_model_iter_children(model, &child, &parent)) { while (gtk_tree_store_remove(GTK_TREE_STORE(model), &child)) ; } gtk_tree_store_remove(GTK_TREE_STORE(model), &parent); } gtk_widget_destroy(msgdlg); g_free(file); } gint disconnected_msgbox(gchar *msg, gboolean can_offline) { gint resp; GtkWidget *dlg; dlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, msg); gtk_window_set_title(GTK_WINDOW(dlg), _("Disconnected")); if (can_offline) { gtk_dialog_add_buttons(GTK_DIALOG(dlg), _("Reconnect"), RESP_RECONNECT, _("Connect to another world"), RESP_OTHER, _("Offline"), RESP_OFFLINE, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); } else { gtk_dialog_add_buttons(GTK_DIALOG(dlg), _("Reconnect"), RESP_RECONNECT, _("Connect to another world"), RESP_OTHER, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); } gtk_widget_show_all(dlg); resp = gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); return resp; } kildclient-2.11.1/src/dlgEditWorld.ui0000644000175000017500000115470611407661372014376 00000000000000 5000 0 10 1 0 0 1000 40 10 1 0 40 10000 1 10 1 0 50 9999 1 10 1 0 3 10 2 3 1 0 2 1000000 0 10 1 0 1 100 0 10 1 0 0 100000 0 10 1 0 4 Use global settings No proxy SOCKS4 SOCKS5 No auto-login diku (char, pass) lp (CONNECT char pass) 8 Edit World dialog False True vertical True True True never automatic in 150 400 True True False False 0 True 8 False 12 vertical 18 vertical 6 True 0 0 <b>Connection</b> True False False 0 True True False False 0 True 4 2 True 1 _Name: True txtName GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 True 1 _Host: True txtHost 1 2 GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 True 1 _Port: True txtPort 2 3 GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 True True Enter a descriptive name for the World True 50 1 2 GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 True True Enter the host to connect to True 50 1 2 1 2 GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 True True Enter the port used when connecting True 50 1 2 2 3 GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 Use _SSL True True False True True 1 2 3 4 GTK_FILL 4 4 1 1 False False 0 True vertical 6 True 0 0 <b>Proxy</b> True False False 0 True True False False 0 True vertical 12 True 4 True Proxy _type: True False False 0 True model1 0 False 1 False 0 True 2 4 4 4 True True False 3 4 1 2 True True 3 4 True True 1 2 1 2 True True 1 2 True 1 Pass_word: True 2 3 1 2 GTK_FILL GTK_FILL True 1 Server _port: True 2 3 GTK_FILL GTK_FILL True 1 _Username: True 1 2 GTK_FILL GTK_FILL True 1 Server _address: True GTK_FILL GTK_FILL False False 1 1 1 False 1 vertical 6 True 0 0 <b>Auto-login</b> True False False 0 True True False False 0 True vertical 6 True 4 True 1 Connection _Style: True cmbConnStyle False False 0 True model2 0 1 False 0 True 0 Ch_aracters in this mud: True ntbkWEPanel False False 1 True True automatic automatic in True True 2 True gtk-add True True True True True False False 0 gtk-edit True True True True True False False 1 gtk-delete True True True True True False False 2 gtk-go-up True True True True True False False 3 gtk-go-down True True True True True False False 4 False False 3 1 1 2 True General False 12 vertical 18 vertical 6 True 0 0 <b>Font</b> True False False 0 True True False False 0 True vertical 6 True True 0 Select the font used in the _main screen: True terminalfont_btn False False 0 True True True True Select the font used in the main output screen False False 1 Use _bold font for highlighted colors (instead of just highlighting) True True False True Check if you want the highlighted ANSI colors to be displayed in bold also True True False False 2 1 1 False False 0 vertical 6 True 0 0 <b>Word Wrap</b> True False False 0 True True False False 0 True vertical 6 _Wrap lines at word boundaries True True False True Check if you want lines to be wrapped at word boundaries True True False False 0 True 4 True 0 _Indent wrapped lines by True 0 False False 0 True True adjustment1 True False False 1 True 0 pixels 0 False False 2 False False 1 Wrap lines at full _screen width True True False True True True 2 True 4 Maximum line width in _characters: True True False True True radWrapFullWidth False False 0 True True adjustment2 True False False 1 False False 3 1 1 False 1 vertical 6 True 0 0 <b>Tooltips</b> True False False 0 True True False False 0 True vertical 6 True Display _tooltips with the time when the line was received True True False True Check if you want tooltips to be displayed showing the time when a line was received if you leave the mouse over the line for a short while True True False False 0 1 1 False False 2 True Output Window 1 False 12 vertical 18 vertical 6 True 0 0 <b>Ansi Colors</b> True False False 0 True True False False 0 True 8 5 True True True #000000000000 4 4 True True True #000000000000 1 2 4 4 True True True #000000000000 2 3 4 4 True True True #000000000000 3 4 4 4 True True True #000000000000 4 5 4 4 True True True #000000000000 5 6 4 4 True True True #000000000000 6 7 4 4 True True True #000000000000 7 8 4 4 True True True #000000000000 3 4 4 4 True True True #000000000000 3 4 1 2 4 4 True True True #000000000000 3 4 2 3 4 4 True True True #000000000000 3 4 3 4 4 4 True True True #000000000000 3 4 4 5 4 4 True True True #000000000000 3 4 5 6 4 4 True True True #000000000000 3 4 6 7 4 4 True True True #000000000000 3 4 7 8 4 4 True 0 _Black True colorBtnAnsi[0] 1 2 GTK_FILL GTK_FILL 4 4 True 0 R_ed True colorBtnAnsi[1] 1 2 1 2 GTK_FILL GTK_FILL 4 4 True 0 _Green True colorBtnAnsi[2] 1 2 2 3 GTK_FILL GTK_FILL 4 4 True 0 _Yellow True colorBtnAnsi[3] 1 2 3 4 GTK_FILL GTK_FILL 4 4 True 0 B_lue True colorBtnAnsi[4] 1 2 4 5 GTK_FILL GTK_FILL 4 4 True 0 _Magenta True colorBtnAnsi[5] 1 2 5 6 GTK_FILL GTK_FILL 4 4 True 0 C_yan True colorBtnAnsi[6] 1 2 6 7 GTK_FILL GTK_FILL 4 4 True 0 _White True colorBtnAnsi[7] 1 2 7 8 GTK_FILL GTK_FILL 4 4 True 0 Bl_ack (Bold) True colorBtnAnsi[8] 4 5 GTK_FILL GTK_FILL 4 4 True 0 Re_d (Bold) True colorBtnAnsi[9] 4 5 1 2 GTK_FILL GTK_FILL 4 4 True 0 G_reen (Bold) True colorBtnAnsi[10] 4 5 2 3 GTK_FILL GTK_FILL 4 4 True 0 Yell_ow (Bold) True colorBtnAnsi[11] 4 5 3 4 GTK_FILL GTK_FILL 4 4 True 0 Bl_ue (Bold) True colorBtnAnsi[12] 4 5 4 5 GTK_FILL GTK_FILL 4 4 True 0 Magen_ta (Bold) True colorBtnAnsi[13] 4 5 5 6 GTK_FILL GTK_FILL 4 4 True 0 Cya_n (Bold) True colorBtnAnsi[14] 4 5 6 7 GTK_FILL GTK_FILL 4 4 True 0 W_hite (Bold) True colorBtnAnsi[15] 4 5 7 8 GTK_FILL GTK_FILL 4 4 1 1 False False 0 vertical 6 True 0 0 <b>Default Colors</b> True False False 0 True True False False 0 True 2 5 True True True #000000000000 4 4 True 0 _Foreground True colorBtnDeffore 1 2 GTK_FILL GTK_FILL 4 4 True True True #000000000000 3 4 4 4 True 0 Bac_kground True colorBtnDefback 4 5 GTK_FILL GTK_FILL 4 4 True True True #000000000000 1 2 4 4 True 0 Bold Foreground True colorBtnDefbold 1 2 1 2 GTK_FILL GTK_FILL 4 4 True True True #000000000000 3 4 1 2 GTK_FILL 4 4 True 0 Bold Background 4 5 1 2 GTK_FILL 1 1 False False 1 vertical 5 True 0 0 <b>Revert to default colors</b> True False False 0 True True False False 0 True vertical 6 True Re_vert to default colors True True True True Click to revert all colors to their built-in defaults True False False 0 1 1 False False 2 True Colors 2 False 12 vertical 18 vertical 6 True 0 0 <b>Font</b> True False False 0 True True False False 0 True vertical 6 True True 0 Select the font used in the _status bar: True ntbkWEPanel False False 0 True True True True Select the font used in the status bar False False 1 1 1 False False 0 vertical 6 True 0 0 <b>Time Display</b> True False False 0 True True False False 0 True vertical 2 True 0 C_onnected time: True radCTime_no False False 4 0 True True False False 0 True vertical Do not display True True False True Select if you do not want the connection time to be displayed True True True False False 0 Display as hours, minutes and seconds True True False True Select if you want the connection time to be displayed in hours, minutes and seconds True True radCTime_no False False 1 Display as seconds True True False True Select if you want the connection time to be displayed in seconds True True radCTime_no False False 2 1 False 1 True 0 _Idle time: True radITime_no False False 2 True True False False 0 True vertical Do not display True True False True Select if you do not want the idle time to be displayed True True True False False 0 Display as hours, minutes and seconds True True False True Select if you want the idle time to be displayed in hours, minutes and seconds True True radITime_no False False 1 Display as seconds True True False True Select if you want the idle time to be displayed in seconds True True radITime_no False False 2 Only _reset idle time counter when a command is entered directly True True False True Check to make the idle time counter reset only when a command is entered directly by typing it in the command entry box. If not checked, if a command is sent because of a timer, of a hook, etc, the idle timer is also reset. True True False False 3 1 3 1 False 1 False False 1 True Status Bar 3 False 12 vertical 18 vertical 5 True 0 0 <b>Command Entry</b> True False False 0 True True False False 0 True vertical 6 _Keep last typed command in command entry box True True False True Check to have the last command kept in the command entry box, so that you can repeat commands only by pressing ENTER True True False False 0 _Echo sent commands in main window True True False True Check to have the sent commands echoed in the main output window True True False False 1 _Store commands between sessions True True False True Check to have the command history saved in a file between sessions True True False False 2 Never _hide the typed text True True False True Check this if the text you type is displayed as black dots in the input box. True True 3 True 4 True 0 _Number of commands to save in history: True spnCommandsToSave False False 0 True True Specify the number of commands that are saved and can be later recalled adjustment3 1 False False 1 4 True 4 True C_ommand separator: True txtCommandSeparator False False 0 True True Specify the separator for commands typed in the command entry box 9 True 8 False 1 5 Use single-_line input bar True True False True True True False False 6 True True False False 0 True vertical 2 Enable _auto-completion True True False True Check to enable command auto-completion (based on previous commands) True True False False 0 True 4 True 0 Acti_vate auto-completion only after True spnMinPrefix False False 0 True True Specify the number of characters that must be typed for command completion to start adjustment4 1 False False 1 True characters have been entered False False 2 1 1 7 Use _multi-line input bar True True False True True radSingleLine False False 8 True True False False 0 True vertical 4 True 4 True N_umber of lines: True spnNLines False False 0 True True adjustment5 1 False False 1 0 True S_pell check typed text True True False True True False False 1 True 4 True False False 0 True Language code: False False 1 True True True 7 False 2 True (Leave blank for default based on locale) False False 3 2 1 9 1 1 False False 0 vertical 6 True 0 0 <b>Font</b> True False False 0 True True False False 0 True vertical 6 True True 0 Select the font used in the command _entry box: True entryfont_btn False False 0 True True True True Select the font used in the command entry box False False 1 1 1 False 1 vertical 6 True 0 0 <b>Flood prevention</b> True False False 0 True True False False 0 True vertical 6 True True 4 Do not allow the _same command to be sent True True False True Check to prevent more than a given number of equal commands to be sent in a row (which can disconnect your character in some muds) True True False False 0 True True Specify the maximum number of equal commands that can be sent in a row adjustment6 1 False False 1 True _times in a row True spnMaxCommands False False 2 False False 0 True 4 True Se_nd this command: True txtPreventionCommand False False 0 True True Enter a command to be sent whenever the specified maximum number of equal commands would be sent True False False 1 1 1 1 False False 2 True Input 4 False 12 vertical 18 vertical 6 True 0 0 <b>Logging Status</b> True False False 0 True True False False 0 True vertical 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 <Filled by the program> False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 8 St_art True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 gtk-media-stop True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False 1 1 True 4 _Include the last True True False True Select to include lines from the main window in the log file. True True False False 0 True True Inform number of lines to include in the log. 6 adjustment7 True False False 1 True lines of the scrollback buffer in the log False False 2 2 1 1 False False 0 vertical 6 True 0 0 <b>File</b> True False False 0 True True False False 0 True vertical 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 4 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Name: True False 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 ... True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False 2 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0.10000000149011612 Note: You can use strftime() escapes to create different files based on the date and time that logging starts. Also, %Kw represents the World name and %Kc the character name used in auto-logon. True 1 1 1 False False 1 vertical 6 True 0 0 <b>Options</b> True False False 0 True True False False 0 True vertical 6 A_utomatically start logging when connected True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True If this is selected, logging will be automatically started whenever you connect to the world. True True 0 Prefix lines with _date and/or time True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True Select this if you want to prefix each line in the log file with the date and/or time it was received. True True 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 True False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Format: True False 1 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK The default is to prefix lines with the date and time, but you can configure the format with strftime() escape sequences. See the manual for a description of those. 2 Revert to _default True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True 3 2 False False 1 1 False 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Logging 10 False 12 vertical 18 vertical 6 True 0 0 <b>Scripting</b> True False False 0 True True False False 0 True vertical 6 True True 4 True _Perl file to load: True txtScriptFile False False 2 0 True False 2 1 _Clear True True True True False False 2 False False 0 1 1 False False 0 True Scripting 5 False 12 vertical 18 vertical 16 True 0 0 <b>Plugins Currently Loaded</b> True False False 0 True False False 0 True vertical 4 True True automatic automatic in True True True 0 True True True True True True 0 0 True 2 True gtk-open False False 0 True _Load True False False 1 False False 0 gtk-help True True True True True False False 1 False 24 1 1 1 0 vertical 16 True 0 0 <b>Plugins Loaded on Startup</b> True False False 0 True False False 0 True vertical 4 True True automatic automatic in True True True 0 True gtk-add True True True True True False False 0 gtk-remove True True True True True False False 1 gtk-go-up True True True True True False False 2 gtk-go-down True True True True True False False 3 False 24 1 1 1 1 True Plugins 6 False 12 vertical 18 vertical 6 True 0 0 <b>MCCP (for compression)</b> True False False 0 True True False False 0 True vertical 4 _Enable if server proposes after connecting True True False True True True False False 0 Enable if server proposes at _any time True True False True True radMCCPAfterConnect False False 1 _Disable True True False True True radMCCPAfterConnect False False 2 1 1 False False 0 True Protocols 7 False 12 vertical 18 vertical 6 True 0 0 <b>Scrolling</b> True False False 0 True True False False 0 True vertical 6 True Scroll on _output True True False True Check to have the main window scroll to the end whenever new output comes True True 0 True 8 True _Lines to save in scrollback buffer: True txtBufferLines False False 0 True True Specify the number of lines of output that can be seen with by scrolling the window adjustment8 1 False False 1 1 1 1 False False 0 vertical 6 True 0 0 <b>Name display</b> True False False 0 True True False False 0 True vertical 6 Identify as 'World name' True True False True True 0 Identify as 'World name - Character' True True False True radNameDisplayWorld 1 Identify as 'Character - World name' True True False True radNameDisplayWorld 2 True 4 Custom: True True False True radNameDisplayWorld False False 0 True True False False 1 3 True Use %Kw to represent the World's name, and %Kc to represent the auto-logon character name True 4 1 1 False False 1 True Miscellaneous 8 False 12 vertical 18 vertical 6 True 0 0 <b>File</b> True False False 0 True True False False 0 True vertical 4 True True _File: True False False 2 0 True True True 50 2 1 0 True You can leave this field blank, and a file name will be automatically generated. Only edit this field if you know what you are doing. True 1 1 1 False False 0 vertical 6 True 0 0 <b>Character Set</b> True False False 0 True True False False 0 True True Character _set: True cmbCharset False False 2 0 True 1 1 1 False False 1 vertical 6 True 0 0 <b>Graphical Editors</b> True False False 0 True True False False 0 True vertical 6 _Ask for confirmation before deleting triggers, aliases, etc. True True False True If not checked, objects such as triggers, aliases, etc. will be deleted directly without asking for confirmation when you press the Delete button. True True False False 0 _Show items defined by plugins True True False True If checked, triggers, aliases, macros and timers defined in plugins will appear in the corresponding World Editor sections. True True False False 1 False False 1 1 False 2 vertical 6 True 0 0 <b>TCP Keep Alive</b> True False False 0 True True False False 0 True vertical 6 Enable TCP _Keep Alive packets True True False True If not checked, objects such as triggers, aliases, etc. will be deleted directly without asking for confirmation when you press the Delete button. True True False False 0 True 0 (You must reconnect for changes in this setting to take effect) 1 False False 1 1 False 3 vertical 6 True 0 0 <b>Input</b> True False False 0 True True False False 0 True vertical 6 _Disable up and down arrow keys for history navigation True True False True If checked, the up and down arrow keys are not used for navigating between saved commands. (You'll have to use Alt+up and Alt+down.) True True False False 0 False False 1 1 False 4 True Advanced 9 False 1 1 True end gtk-cancel True True True True True False False 0 gtk-ok True True True True True True False False 1 False end 0 cancelbutton1 okbutton2 kildclient-2.11.1/src/kcircularqueue.h0000644000175000017500000000740611405233112014622 00000000000000/* $Id: kcircularqueue.h 1014 2009-02-01 12:46:52Z ekalin $ */ /* * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __KCIRCULARARRAY_H #define __KCIRCULARARRAY_H /** A queue in which you can push elements in one end and pop them off the other end. Elements can be of any size, but must be all of the same type (and size). It grows as necessary when new elements are added. Internally, it is represented as a circular array for efficiency. */ typedef struct _KCircularQueue { char *data; size_t el_size; unsigned int allocated_size; unsigned int size; unsigned int first; unsigned int first_free; unsigned int free_until_end; } KCircularQueue; /** Creates a new KCircularQueue. @param el_size The size of the elements of the queue. @param how_many Number of elements to allocate. @return The newly created KCircularQueue. */ KCircularQueue *k_circular_queue_new (size_t el_size, unsigned int how_many); /** Frees memory used by a KCircularQueue. @param q The KCircularQueue. The pointer will be invalid after the call to this function. */ void k_circular_queue_free (KCircularQueue *q); /** Pushes several copies of an element in the end of a KCircularQueue. @param q The KCircularQueue to push elements into. @param val A pointer to the element to push. @param n The number of copies of the element to push. */ void k_circular_queue_push_copies(KCircularQueue *q, const void *val, unsigned int n); /** Removes elements from the front of the KCircularQueue.. @param q The KCircularQueue to remove elements from. @param n The number of elements to remove. */ void k_circular_queue_pop (KCircularQueue *q, unsigned int n); /** Returns the number of elements in a KCircularQueue. @param q The KCircularQueue. @return The number of elements.. */ #define k_circular_queue_size(q) (q->size) /** Pushes an element in the end of a KCircularQueue. @param q The KCircularQueue to push elements into. @param val The element to push. */ #define k_circular_queue_push(q, v) k_circular_queue_push_copies(q, &(v), 1) /** Retrieves a given element from a KCircularQueue. @param q The KCircularQueue. @param t The type of the element (int, double, etc.) @param i The index of the element to retrieve. @return The element, cast to the given type. */ #define k_circular_queue_nth(q, t, i) *((t *) _k_circular_queue_nth(q, i)) /************************************************************* * Private functions * *************************************************************/ void _k_circular_queue_realloc(KCircularQueue *q, unsigned int new_size); const void *_k_circular_queue_nth (KCircularQueue *q, unsigned int i); #endif /* __KCIRCULARARRAY_H */ kildclient-2.11.1/src/dlgCmdHistory.glade0000644000175000017500000005372411405233112015203 00000000000000 True Command History dialog True vertical True 8 4 2 8 2 True True automatic in 450 200 True True False True vertical gtk-find True True True True True Find a command containing a given search term True False False 0 Find _next True True True True True Find the next command with the same match text True False False 1 1 2 GTK_FILL GTK_FILL True 2 2 3 GTK_FILL GTK_FILL 8 True 4 True Dela_y True False False 0 True True Specify the delay between sending the group of commands 0 0 100 0.10000000149 1 0 0.10000000149 1 False False 1 True sec_onds each True spnNCommands False False 2 True True Specify how many commands are sent at once 1 1 100000 1 10 0 1 False False 3 True commands(s) False False 4 2 3 4 GTK_FILL GTK_FILL True 0 Newest commands are on the top 1 2 2 True end _Recall True True True True True Put the selected command in the command entry box True False False 0 Rec_all & Close True True True True True Put the selected command in the command entry box and close this dialog True False False 1 _Send True True True True True Send the selected command(s) to the mud True False False 2 S_end & Close True True True True True Send the selected command(s) to the mud and close the dialog True False False 3 gtk-close -7 True True True True True False False 4 False end 0 True True Find Command dialog True vertical True 8 vertical 8 True 0 _Text to find: True False False 0 True True Enter the text to search for True False False 1 True 4 True 0 0 Search direction: False False 0 True vertical _Downwards True True False True True True False False 0 _Upwards True True False True True radDownwards False False 1 1 2 2 True end gtk-cancel -6 True True True True True False False 0 gtk-ok -5 True True True True True False False 1 False end 0 kildclient-2.11.1/src/wndmain.ui0000644000175000017500000004137111405233201013417 00000000000000 menuWorld _World gtk-open mnuOpen mnuReconnect _Reconnect mnuDisconnect _Disconnect mnuConnectAnother Connect to _Another gtk-close mnuClose mnuEdit _Edit... gtk-save mnuSave mnuStatistics S_tatistics... gtk-go-back mnuPrevious _Previous gtk-go-forward mnuNext _Next gtk-quit mnuQuit menuEdit _Edit gtk-cut mnuCut gtk-copy mnuCopy gtk-paste mnuPaste gtk-delete mnuDelete gtk-find mnuFind mnuFindNext Find Ne_xt menuInput _Input gtk-clear mnuInputClear mnuInputPrev _Previous mnuInputNext _Next mnuInputFindPrev Find Previous mnuInputFindNext Find N_ext mnuCommandHistory Command _History... mnuMLSend _Multi-line Send... mnuTestTrigger _Test Triggers... menuPreferences _Preferences mnuDisTriggers Disable _Triggers mnuDisAliases Disable _Aliases mnuDisMacros Disable _Macros mnuDisTimers Disable T_imers mnuDebugMatches _Debug Matches gtk-preferences mnuPreferences mnuEditDefaultWorld Edit Default _World... menuDisplay _Display mnuSplitWindow _Split Window menuHelp _Help gtk-help mnuManual _Manual mnuAbout _About KildClient True vertical True False False 0 True True 1 kildclient-2.11.1/src/we_aliases.c0000644000175000017500000006074211526001511013707 00000000000000/* $Id: we_aliases.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static GtkTreeModel *create_we_aliases_model(World *world); static void we_alias_configure_view(GtkTreeView *view, GtkTreeModel *model); static void we_alias_add_cb(GtkButton *button, gpointer data); static void we_alias_edit_cb(GtkButton *button, gpointer data); static void we_alias_delete_cb(GtkButton *button, gpointer data); static void we_alias_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data); static gboolean edit_alias(World *world, Alias *alias); static gboolean we_alias_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static void we_alias_move_cb(GtkButton *button, gpointer data); GObject * get_we_aliases_tab(World *world) { GtkBuilder *ui_builder; gchar *objects[] = { "we_panel_generic_graphical_editor", NULL }; GError *error = NULL; GObject *panel; GtkLabel *lblType; GObject *btnAdd; GObject *btnEdit; GObject *btnDelete; GObject *btnUp; GObject *btnDown; GObject *btnExport; GtkTreeSelection *selection; /* Create the dialog */ ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } panel = gtk_builder_get_object(ui_builder, "we_panel_generic_graphical_editor"); /* So it's not destroyed when the builder is destroyed */ g_object_ref(panel); world->viewAlias = GTK_TREE_VIEW(gtk_builder_get_object(ui_builder, "viewObjects")); g_object_set_data(G_OBJECT(world->viewAlias), "forworld", world); g_signal_connect(G_OBJECT(world->viewAlias), "row-activated", G_CALLBACK(we_alias_view_row_dblclick_cb), world); g_signal_connect(G_OBJECT(world->viewAlias), "key-press-event", G_CALLBACK(we_alias_view_keypress_cb), world); lblType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblGEType")); gtk_label_set_markup(lblType, "Aliases"); btnAdd = gtk_builder_get_object(ui_builder, "btnGEAdd"); g_signal_connect(btnAdd, "clicked", G_CALLBACK(we_alias_add_cb), world->viewAlias); btnEdit = gtk_builder_get_object(ui_builder, "btnGEEdit"); g_signal_connect(btnEdit, "clicked", G_CALLBACK(we_alias_edit_cb), world->viewAlias); btnDelete = gtk_builder_get_object(ui_builder, "btnGEDelete"); g_signal_connect(btnDelete, "clicked", G_CALLBACK(we_alias_delete_cb), world->viewAlias); btnUp = gtk_builder_get_object(ui_builder, "btnGEUp"); g_object_set_data(btnUp, "isup", GINT_TO_POINTER(TRUE)); g_signal_connect(btnUp, "clicked", G_CALLBACK(we_alias_move_cb), world->viewAlias); btnDown = gtk_builder_get_object(ui_builder, "btnGEDown"); g_object_set_data(btnDown, "isup", GINT_TO_POINTER(FALSE)); g_signal_connect(btnDown, "clicked", G_CALLBACK(we_alias_move_cb), world->viewAlias); btnExport = gtk_builder_get_object(ui_builder, "btnGEExport"); g_object_set_data(btnExport, "preselect", "Alias"); world->alias_model = create_we_aliases_model(world); world->alias_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->alias_model, NULL)); g_object_unref(G_OBJECT(world->alias_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->alias_model_filter), we_guied_plugin_filter_func, world, NULL); we_alias_configure_view(world->viewAlias, GTK_TREE_MODEL(world->alias_model_filter)); selection = gtk_tree_view_get_selection(world->viewAlias); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); g_object_set_data(G_OBJECT(selection), "btnEdit", btnEdit); g_object_set_data(G_OBJECT(selection), "btnDelete", btnDelete); g_object_set_data(G_OBJECT(selection), "btnUp", btnUp); g_object_set_data(G_OBJECT(selection), "btnDown", btnDown); g_object_set_data(G_OBJECT(selection), "btnExport", btnExport); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(we_guied_selection_changed_cb), NULL); gtk_builder_connect_signals(ui_builder, world); g_object_unref(ui_builder); return panel; } static GtkTreeModel * create_we_aliases_model(World *world) { GtkListStore *store; GtkTreeIter iter; GSList *aliasptr; Alias *alias; store = gtk_list_store_new(WE_GUIED_N_COLS, G_TYPE_POINTER); aliasptr = world->aliases; while (aliasptr) { alias = (Alias *) aliasptr->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, WE_GUIED_POINTER, alias, -1); aliasptr = aliasptr->next; } return GTK_TREE_MODEL(store); } static void we_alias_configure_view(GtkTreeView *view, GtkTreeModel *model) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; gtk_tree_view_set_model(view, model); g_object_unref(model); /* Column 1 - Enabled? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(ALIAS_ENABLED)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Enabled")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(ALIAS_ENABLED), NULL); gtk_tree_view_append_column(view, column); /* Column 2 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(ALIAS_NAME), NULL); gtk_tree_view_append_column(view, column); /* Column 3 - Pattern */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Pattern")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(ALIAS_PATTERN), NULL); gtk_tree_view_append_column(view, column); /* Column 4 - Ignore Case? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(ALIAS_ICASE)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("I. Case")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(ALIAS_ICASE), NULL); gtk_tree_view_append_column(view, column); /* Column 5 - Substitution */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Substitution")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(ALIAS_SUBSTITUTION), NULL); gtk_tree_view_append_column(view, column); /* Column 6 - Perl Eval? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(ALIAS_PERL_EVAL)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Eval as Perl")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(ALIAS_PERL_EVAL), NULL); gtk_tree_view_append_column(view, column); /* Column 7 - Plugin */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Plugin")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(OBJECT_PLUGIN), NULL); gtk_tree_view_append_column(view, column); gtk_tree_view_columns_autosize(view); } static void we_alias_add_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; Alias *alias; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); alias = g_new0(Alias, 1); alias->enabled = 1; if (edit_alias(world, alias)) { world->aliases = g_slist_insert(world->aliases, alias, world->alias_pos); we_alias_insert_alias(world, alias, world->alias_pos++); } else { g_free(alias); } } static void we_alias_edit_cb(GtkButton *button, gpointer data) { /* Note that the Edit button is only active when exactly one row is selected. */ World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Alias *alias; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &alias, -1); if (edit_alias(world, alias)) { we_alias_update_alias(world, alias); } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_alias_delete_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Alias *alias; GSList *aliasitem; GtkWidget *msgdlg; gint n; n = gtk_tree_selection_count_selected_rows(selection); msgdlg = we_guied_confirm_delete_dialog_new(GTK_WINDOW(world->dlgEditWorld), n, _("alias"), _("aliases")); if (!world->confirm_delete || gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { GList *listiter = g_list_last(selected); while (listiter) { gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &alias, -1); aliasitem = g_slist_find(world->aliases, alias); remove_alias(world, aliasitem); listiter = listiter->prev; } } gtk_widget_destroy(msgdlg); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_alias_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { World *world; GtkTreeModel *model; GtkTreeIter iter; world = (World *) data; model = gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model, &iter, path)) { Alias *alias; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &alias, -1); if (edit_alias(world, alias)) { we_alias_update_alias(world, alias); } } } static gboolean edit_alias(World *world, Alias *alias) { GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditAlias", NULL }; GError *error = NULL; GtkWidget *dlgEditAlias; GtkEntry *txtName; GtkEntry *txtPattern; GtkEntry *txtSubstitution; GtkToggleButton *chkICase; GtkToggleButton *chkPerlEval; GtkToggleButton *chkEnabled; const gchar *newname; const gchar *newpattern; const gchar *newsubstitution; gboolean newicase; gboolean need_recompute = FALSE; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return FALSE; } dlgEditAlias = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditAlias")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditAlias), GTK_RESPONSE_OK); txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtAliasName")); txtPattern = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtAliasPattern")); txtSubstitution = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtAliasSubstitution")); chkICase = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkAliasICase")); chkPerlEval = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkAliasPerlEval")); chkEnabled = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkAliasEnabled")); /* Only display note when editing a plugin's alias */ if (!alias->owner_plugin) { GObject *label; label = gtk_builder_get_object(ui_builder, "lblNoteAlias"); gtk_widget_destroy(GTK_WIDGET(label)); label = gtk_builder_get_object(ui_builder, "lblNoteTextAlias"); gtk_widget_destroy(GTK_WIDGET(label)); } /* We don't need it anymore */ g_object_unref(ui_builder); /* Fill-in values */ if (alias->name) { gtk_entry_set_text(txtName, alias->name); } if (alias->pattern) { gtk_entry_set_text(txtPattern, alias->pattern); } if (alias->substitution) { gtk_entry_set_text(txtSubstitution, alias->substitution); } gtk_toggle_button_set_active(chkICase, alias->ignore_case); gtk_toggle_button_set_active(chkPerlEval, alias->perl_eval); gtk_toggle_button_set_active(chkEnabled, alias->enabled); /* Run the dialog until the input is valid or cancelled */ gtk_widget_show_all(dlgEditAlias); while (1) { if (gtk_dialog_run(GTK_DIALOG(dlgEditAlias)) == GTK_RESPONSE_OK) { /* Validate */ newicase = gtk_toggle_button_get_active(chkICase); newpattern = gtk_entry_get_text(txtPattern); if (strcmp(newpattern, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditAlias), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the pattern.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } newsubstitution = gtk_entry_get_text(txtSubstitution); if (strcmp(newsubstitution, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditAlias), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the substitution.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* Update values */ newname = gtk_entry_get_text(txtName); if (!alias->name || strcmp(newname, alias->name) != 0) { g_free(alias->name); if (strcmp(newname, "") != 0) { alias->name = g_strdup(newname); } else { alias->name = NULL; } } if (!alias->pattern || strcmp(newpattern, alias->pattern) != 0) { g_free(alias->pattern); alias->pattern = g_strdup(newpattern); need_recompute = TRUE; } if (!alias->substitution || strcmp(newsubstitution, alias->substitution) != 0) { g_free(alias->substitution); alias->substitution = g_strdup(newsubstitution); } if (alias->ignore_case != newicase) { need_recompute = TRUE; } alias->ignore_case = newicase; alias->perl_eval = gtk_toggle_button_get_active(chkPerlEval); alias->enabled = gtk_toggle_button_get_active(chkEnabled); if (need_recompute && world->perl_interpreter) { PERL_SET_CONTEXT(world->perl_interpreter); if (alias->pattern_re) { SvREFCNT_dec(alias->pattern_re); } alias->pattern_re = precompute_re(world->perl_interpreter, alias->pattern, FALSE); } /* We've finished successfully */ gtk_widget_destroy(dlgEditAlias); return TRUE; } else { /* Cancel pressed */ gtk_widget_destroy(dlgEditAlias); return FALSE; } } } static gboolean we_alias_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_Delete || evt->keyval == GDK_KP_Delete) { we_alias_delete_cb(NULL, widget); return TRUE; } return FALSE; } static void we_alias_move_cb(GtkButton *button, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; World *world; gboolean is_up; gint new_pos; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "isup")); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Alias *alias; gint pos; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &alias, -1); pos = g_slist_index(world->aliases, alias); new_pos = pos; if (is_up) { if (pos != 0) { new_pos = pos - 1; move_alias(world, pos, new_pos); } } else { if (pos != world->alias_pos - 1) { new_pos = pos + 1; move_alias(world, pos, new_pos); } } /* Reselect the moved item */ gtk_tree_model_iter_nth_child(model, &iter, NULL, new_pos); gtk_tree_selection_select_iter(selection, &iter); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } void we_alias_update_alias(World *world, Alias *alias_arg) { /* Called by the Perl functions when an alias is changed, so that the display is updated. */ GtkTreeIter iter; GtkTreePath *path; Alias *alias; gboolean success; if (!world->alias_model) { return; } success = gtk_tree_model_get_iter_first(world->alias_model, &iter); while (success) { gtk_tree_model_get(world->alias_model, &iter, WE_GUIED_POINTER, &alias, -1); if (alias == alias_arg) { path = gtk_tree_model_get_path(world->alias_model, &iter); gtk_tree_model_row_changed(world->alias_model, path, &iter); gtk_tree_path_free(path); return; } success = gtk_tree_model_iter_next(world->alias_model, &iter); } } void we_alias_insert_alias(World *world, Alias *alias, gint pos) { /* Called by the Perl functions when an alias is inserted, so that the display is updated. */ GtkTreeIter iter; if (!world->alias_model) { return; } gtk_list_store_insert(GTK_LIST_STORE(world->alias_model), &iter, pos); gtk_list_store_set(GTK_LIST_STORE(world->alias_model), &iter, WE_GUIED_POINTER, alias, -1); } void we_alias_delete_alias(World *world, Alias *alias_arg) { /* Called by the Perl functions when an alias is deleted, so that the display is updated. */ GtkTreeIter iter; Alias *alias; gboolean success; if (!world->alias_model) { return; } success = gtk_tree_model_get_iter_first(world->alias_model, &iter); while (success) { gtk_tree_model_get(world->alias_model, &iter, WE_GUIED_POINTER, &alias, -1); if (alias == alias_arg) { gtk_list_store_remove(GTK_LIST_STORE(world->alias_model), &iter); return; } success = gtk_tree_model_iter_next(world->alias_model, &iter); } } kildclient-2.11.1/src/worldeditor.c0000644000175000017500000003744411526001511014134 00000000000000/* $Id: worldeditor.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include "kildclient.h" #include "perlscript.h" /******************** * Type definitions * ********************/ enum { COLUMN_NAME, COLUMN_WIDGET, N_COLUMNS, }; /*********************** * Function prototypes * ***********************/ static GtkWidget *create_edit_world_dialog(World *world, GtkWindow *parent); static GtkTreeStore *create_model(GtkNotebook *notebook, World *world, GtkBuilder *ui_builder); static void list_selection_changed_cb(GtkTreeSelection *selection, gpointer data); static GtkWidget *new_descriptive_panel(const char *title, const char *message); /* XML UI signals */ G_MODULE_EXPORT void world_editor_response_cb(GtkWidget *dialog, gint response, gpointer data); /************************* * File global variables * *************************/ gboolean edit_world(World **world, GtkWindow *parent, gboolean *newworld, gboolean modal) { int response; *newworld = FALSE; if (!*world) { *world = create_new_world(TRUE); } if (!((*world)->dlgEditWorld)) { (*world)->dlgEditWorld = create_edit_world_dialog(*world, parent); gtk_widget_show_all((*world)->dlgEditWorld); } g_object_set_data(G_OBJECT((*world)->dlgEditWorld), "newworldptr", newworld); gtk_window_present(GTK_WINDOW((*world)->dlgEditWorld)); if (modal) { response = gtk_dialog_run(GTK_DIALOG((*world)->dlgEditWorld)); gtk_widget_destroy((*world)->dlgEditWorld); (*world)->dlgEditWorld = NULL; g_object_unref((*world)->ui_builder); (*world)->ui_builder = NULL; return (response == GTK_RESPONSE_OK); } return TRUE; } void world_editor_response_cb(GtkWidget *dialog, gint response, gpointer data) { World *world = (World *) data; GtkBuilder *ui_builder; gboolean *newworld; ui_builder = world->ui_builder; if (response == GTK_RESPONSE_OK) { if (world != default_world) { update_we_general_parameters(world, ui_builder); } update_we_input_parameters(world, ui_builder); update_we_logging_parameters(world, ui_builder); if (world != default_world) { update_we_scripting_parameters(world, ui_builder); } update_we_protocols_parameters(world, ui_builder); update_we_misc_parameters(world, ui_builder); newworld = g_object_get_data(G_OBJECT(dialog), "newworldptr"); update_we_advanced_parameters(world, newworld, ui_builder); /* In case the name or display name was changed, we must update the tab */ if (world->gui) { prepare_display_name(world); if (world->has_unread_text) { gtk_label_set_text(world->gui->lblNotebook, world->new_text_name); } else { gtk_label_set_text(world->gui->lblNotebook, world->display_name); } /* The window title gets update automatically because when the world editor is closed, the main window gets focus. */ } } else { /* Revert parameters that might have been changed */ if (world != default_world) { fill_we_general_tab(world, ui_builder); } fill_we_input_tab(world, ui_builder); fill_we_logging_tab(world, ui_builder); if (world != default_world) { fill_we_scripting_tab(world, ui_builder); } fill_we_protocols_tab(world, ui_builder); fill_we_misc_tab(world, ui_builder); fill_we_advanced_tab(world, ui_builder); } gtk_widget_hide(dialog); } static GtkWidget * create_edit_world_dialog(World *world, GtkWindow *parent) { GError *error = NULL; GtkWidget *dlgEditWorld; GtkTreeView *treeView; GtkNotebook *notebook; GtkTreeStore *model; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkTreeSelection *selection; GtkTreeIter iter; /* Create the dialog */ if (!world->ui_builder) { world->ui_builder = gtk_builder_new(); } if (!gtk_builder_add_from_file(world->ui_builder, get_kildclient_installed_file("dlgEditWorld.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } dlgEditWorld = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "dlgEditWorld")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditWorld), GTK_RESPONSE_OK); notebook = GTK_NOTEBOOK(gtk_builder_get_object(world->ui_builder, "ntbkWEPanel")); gtk_notebook_set_show_tabs(notebook, FALSE); model = create_model(notebook, world, world->ui_builder); g_object_set_data(G_OBJECT(model), "notebookptr", notebook); treeView = GTK_TREE_VIEW(gtk_builder_get_object(world->ui_builder, "treeViewWE")); gtk_tree_view_set_model(treeView, GTK_TREE_MODEL(model)); g_object_unref(G_OBJECT(model)); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(NULL, renderer, "text", COLUMN_NAME, NULL); gtk_tree_view_append_column(treeView, column); gtk_tree_view_set_headers_visible(treeView, FALSE); selection = gtk_tree_view_get_selection(treeView); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(list_selection_changed_cb), treeView); gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model), &iter); gtk_tree_selection_select_iter(selection, &iter); gtk_builder_connect_signals(world->ui_builder, world); return dlgEditWorld; } static GtkTreeStore * create_model(GtkNotebook *notebook, World *world, GtkBuilder *ui_builder) { GtkTreeStore *model; GObject *panel; GtkWidget *display_panel; GtkTreeIter iter; GtkTreeIter iterDisplay; GtkTreeIter iterAutomation; model = gtk_tree_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_POINTER); panel = get_we_general_tab(world, ui_builder); if (world != default_world) { gtk_tree_store_append(model, &iter, NULL); fill_we_general_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("General"), COLUMN_WIDGET, panel, -1); } else { gtk_widget_destroy(GTK_WIDGET(panel)); } gtk_tree_store_append(model, &iterDisplay, NULL); display_panel = new_descriptive_panel(_("Display"), _("Here you can set options to configure the appearance of KildClient.")); gtk_notebook_append_page(notebook, display_panel, NULL); gtk_tree_store_set(model, &iterDisplay, COLUMN_NAME, _("Display"), COLUMN_WIDGET, display_panel, -1); gtk_tree_store_append(model, &iter, &iterDisplay); panel = get_we_mainwindow_tab(ui_builder); fill_we_mainwindow_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Main Window"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterDisplay); panel = get_we_colors_tab(world, ui_builder); /* Colors is filled in automatically */ gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Colors"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterDisplay); panel = get_we_statusbar_tab(ui_builder); fill_we_statusbar_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Status Bar"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, NULL); panel = get_we_input_tab(ui_builder); fill_we_input_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Input"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, NULL); panel = get_we_logging_tab(ui_builder, world); fill_we_logging_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Logging"), COLUMN_WIDGET, panel, -1); if (world != default_world) { gtk_tree_store_append(model, &iterAutomation, NULL); display_panel = new_descriptive_panel(_("Automation"), _("Here you can set options to configure the automation features of KildClient, such as triggers, aliases, plugins, etc.")); gtk_notebook_append_page(notebook, display_panel, NULL); gtk_tree_store_set(model, &iterAutomation, COLUMN_NAME, _("Automation"), COLUMN_WIDGET, display_panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_scripting_tab(ui_builder); fill_we_scripting_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Scripting"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_plugins_tab(ui_builder, world); fill_we_scripting_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Plugins"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_triggers_tab(world); gtk_notebook_append_page(notebook, GTK_WIDGET(panel), NULL); /* Let the notebook own the panel, removing the ref added when it was created. */ g_object_unref(panel); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Triggers"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_aliases_tab(world); gtk_notebook_append_page(notebook, GTK_WIDGET(panel), NULL); /* Let the notebook own the panel, removing the ref added when it was created. */ g_object_unref(panel); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Aliases"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_macros_tab(world); gtk_notebook_append_page(notebook, GTK_WIDGET(panel), NULL); /* Let the notebook own the panel, removing the ref added when it was created. */ g_object_unref(panel); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Macros"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_timers_tab(world); gtk_notebook_append_page(notebook, GTK_WIDGET(panel), NULL); /* Let the notebook own the panel, removing the ref added when it was created. */ g_object_unref(panel); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Timers"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_hooks_tab(world); gtk_notebook_append_page(notebook, GTK_WIDGET(panel), NULL); /* Let the notebook own the panel, removing the ref added when it was created. */ g_object_unref(panel); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Hooks"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, &iterAutomation); panel = get_we_vars_tab(world); gtk_notebook_append_page(notebook, GTK_WIDGET(panel), NULL); /* Let the notebook own the panel, removing the ref added when it was created. */ g_object_unref(panel); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Variables"), COLUMN_WIDGET, panel, -1); } gtk_tree_store_append(model, &iter, NULL); panel = get_we_protocols_tab(ui_builder); fill_we_protocols_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Protocols"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, NULL); panel = get_we_misc_tab(ui_builder); fill_we_misc_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Miscellaneous"), COLUMN_WIDGET, panel, -1); gtk_tree_store_append(model, &iter, NULL); panel = get_we_advanced_tab(world, ui_builder); fill_we_advanced_tab(world, ui_builder); gtk_tree_store_set(model, &iter, COLUMN_NAME, _("Advanced"), COLUMN_WIDGET, panel, -1); return model; } static void list_selection_changed_cb(GtkTreeSelection *selection, gpointer data) { GtkTreeModel *model; GtkTreeIter iter; GtkWidget *notebook; if (gtk_tree_selection_get_selected(selection, &model, &iter)) { GtkTreePath *path; GtkWidget *panel; int pageNum; notebook = g_object_get_data(G_OBJECT(model), "notebookptr"); path = gtk_tree_model_get_path(model, &iter); gtk_tree_view_expand_row(GTK_TREE_VIEW(data), path, FALSE); gtk_tree_path_free(path); gtk_tree_model_get(model, &iter, COLUMN_WIDGET, &panel, -1); pageNum = gtk_notebook_page_num(GTK_NOTEBOOK(notebook), panel); gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), pageNum); } } static GtkWidget * new_descriptive_panel(const char *title, const char *message) { GtkWidget *vbox; GtkWidget *label; gchar *temp; vbox = gtk_vbox_new(FALSE, 6); temp = g_strdup_printf("%s", title); label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), temp); g_free(temp); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 8); label = gtk_label_new(message); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); return vbox; } kildclient-2.11.1/src/we_statusbar.c0000644000175000017500000001325711526001511014275 00000000000000/* $Id: we_statusbar.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ /* XML UI signals */ G_MODULE_EXPORT void statusfont_set_cb(GtkFontButton *font_btn, gpointer data); G_MODULE_EXPORT void time_type_changed_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void reset_activate_toggled_cb(GtkWidget *widget, gpointer data); /************************* * File global variables * *************************/ GObject * get_we_statusbar_tab(GtkBuilder *ui_builder) { GObject *panel; panel = gtk_builder_get_object(ui_builder, "we_panel_statusbar"); return panel; } void fill_we_statusbar_tab(World *world, GtkBuilder *ui_builder) { GtkFontButton *statusfont_btn; GtkToggleButton *radCTime_no; GtkToggleButton *radCTime_hms; GtkToggleButton *radCTime_sec; GtkToggleButton *radITime_no; GtkToggleButton *radITime_hms; GtkToggleButton *radITime_sec; GtkToggleButton *chkResetActivate; statusfont_btn = GTK_FONT_BUTTON(gtk_builder_get_object(ui_builder, "statusfont_btn")); gtk_font_button_set_font_name(statusfont_btn, world->statusfont); radCTime_no = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radCTime_no")); radCTime_hms = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radCTime_hms")); radCTime_sec = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radCTime_sec")); if (world->ctime_type == NO) { gtk_toggle_button_set_active(radCTime_no, TRUE); } else if (world->ctime_type == HMS) { gtk_toggle_button_set_active(radCTime_hms, TRUE); } else { gtk_toggle_button_set_active(radCTime_sec, TRUE); } radITime_no = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radITime_no")); radITime_hms = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radITime_hms")); radITime_sec = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radITime_sec")); if (world->itime_type == NO) { gtk_toggle_button_set_active(radITime_no, TRUE); } else if (world->itime_type == HMS) { gtk_toggle_button_set_active(radITime_hms, TRUE); } else { gtk_toggle_button_set_active(radITime_sec, TRUE); } chkResetActivate = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkResetActivate")); gtk_toggle_button_set_active(chkResetActivate, world->itime_reset_activate); } void statusfont_set_cb(GtkFontButton *font_btn, gpointer data) { PangoFontDescription *fontDesc; World *world = (World *) data; WorldGUI *gui = world->gui; free(world->statusfont); world->statusfont = g_strdup(gtk_font_button_get_font_name(font_btn)); if (gui) { GtkWidget *widget = GTK_WIDGET(world->gui->lblStatus); fontDesc = pango_font_description_from_string(world->statusfont); gtk_widget_modify_font(widget, fontDesc); pango_font_description_free(fontDesc); } } void time_type_changed_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkToggleButton *radCTime_no; GtkToggleButton *radCTime_hms; GtkToggleButton *radITime_no; GtkToggleButton *radITime_hms; radCTime_no = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radCTime_no")); radCTime_hms = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radCTime_hms")); radITime_no = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radITime_no")); radITime_hms = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radITime_hms")); if (gtk_toggle_button_get_active(radCTime_no)) { world->ctime_type = NO; } else if (gtk_toggle_button_get_active(radCTime_hms)) { world->ctime_type = HMS; } else { world->ctime_type = SEC; } if (gtk_toggle_button_get_active(radITime_no)) { world->itime_type = NO; } else if (gtk_toggle_button_get_active(radITime_hms)) { world->itime_type = HMS; } else { world->itime_type = SEC; } } void reset_activate_toggled_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; world->itime_reset_activate = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); } kildclient-2.11.1/src/mnuPopupURL.glade0000644000175000017500000000265111405233112014626 00000000000000 Open Link True False True gtk-jump-to 1 Copy Link Address True False True gtk-copy 1 kildclient-2.11.1/src/we_vars.c0000644000175000017500000004635011526001511013240 00000000000000/* $Id: we_vars.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static GtkTreeModel *create_we_vars_model(World *world); static void we_var_configure_view(GtkTreeView *view, GtkTreeModel *model); static void we_var_add_cb(GtkButton *button, gpointer data); static void we_var_edit_cb(GtkButton *button, gpointer data); static void we_var_delete_cb(GtkButton *button, gpointer data); static void we_var_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data); static gchar *edit_var(World *world, const gchar *var); static gboolean we_var_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static void we_var_move_cb(GtkButton *button, gpointer data); GObject * get_we_vars_tab(World *world) { GtkBuilder *ui_builder; gchar *objects[] = { "we_panel_generic_graphical_editor", NULL }; GError *error = NULL; GObject *panel; GtkLabel *lblType; GObject *btnAdd; GObject *btnEdit; GObject *btnDelete; GObject *btnUp; GObject *btnDown; GObject *btnExport; GtkTreeSelection *selection; /* Create the dialog */ ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } panel = gtk_builder_get_object(ui_builder, "we_panel_generic_graphical_editor"); /* So it's not destroyed when the builder is destroyed */ g_object_ref(panel); world->viewVar = GTK_TREE_VIEW(gtk_builder_get_object(ui_builder, "viewObjects")); g_object_set_data(G_OBJECT(world->viewVar), "forworld", world); g_signal_connect(G_OBJECT(world->viewVar), "row-activated", G_CALLBACK(we_var_view_row_dblclick_cb), world); g_signal_connect(G_OBJECT(world->viewVar), "key-press-event", G_CALLBACK(we_var_view_keypress_cb), world); lblType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblGEType")); gtk_label_set_markup(lblType, "Permanent Variables"); btnAdd = gtk_builder_get_object(ui_builder, "btnGEAdd"); g_signal_connect(btnAdd, "clicked", G_CALLBACK(we_var_add_cb), world->viewVar); btnEdit = gtk_builder_get_object(ui_builder, "btnGEEdit"); g_signal_connect(btnEdit, "clicked", G_CALLBACK(we_var_edit_cb), world->viewVar); btnDelete = gtk_builder_get_object(ui_builder, "btnGEDelete"); g_signal_connect(btnDelete, "clicked", G_CALLBACK(we_var_delete_cb), world->viewVar); btnUp = gtk_builder_get_object(ui_builder, "btnGEUp"); g_object_set_data(btnUp, "isup", GINT_TO_POINTER(TRUE)); g_signal_connect(btnUp, "clicked", G_CALLBACK(we_var_move_cb), world->viewVar); btnDown = gtk_builder_get_object(ui_builder, "btnGEDown"); g_object_set_data(btnDown, "isup", GINT_TO_POINTER(FALSE)); g_signal_connect(btnDown, "clicked", G_CALLBACK(we_var_move_cb), world->viewVar); btnExport = gtk_builder_get_object(ui_builder, "btnGEExport"); g_object_set_data(btnExport, "preselect", "Var"); world->permvars_model = create_we_vars_model(world); we_var_configure_view(world->viewVar, world->permvars_model); selection = gtk_tree_view_get_selection(world->viewVar); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); g_object_set_data(G_OBJECT(selection), "btnEdit", btnEdit); g_object_set_data(G_OBJECT(selection), "btnDelete", btnDelete); g_object_set_data(G_OBJECT(selection), "btnUp", btnUp); g_object_set_data(G_OBJECT(selection), "btnDown", btnDown); g_object_set_data(G_OBJECT(selection), "btnExport", btnExport); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(we_guied_selection_changed_cb), NULL); gtk_builder_connect_signals(ui_builder, world); g_object_unref(ui_builder); return panel; } static GtkTreeModel * create_we_vars_model(World *world) { GtkListStore *store; GtkTreeIter iter; GSList *varptr; gchar *var; store = gtk_list_store_new(WE_GUIED_N_COLS, G_TYPE_POINTER); varptr = world->permanent_variables; while (varptr) { var = (gchar *) varptr->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, WE_GUIED_POINTER, var, -1); varptr = varptr->next; } return GTK_TREE_MODEL(store); } static void we_var_configure_view(GtkTreeView *view, GtkTreeModel *model) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; gtk_tree_view_set_model(view, model); gtk_tree_view_set_headers_visible(view, FALSE); g_object_unref(model); /* Column 1 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(PERMVAR_NAME), NULL); gtk_tree_view_append_column(view, column); gtk_tree_view_columns_autosize(view); } static void we_var_add_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; gchar *var; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); var = edit_var(world, NULL); if (var) { world->permanent_variables = g_slist_append(world->permanent_variables, var); we_var_insert_var(world, var, -1); } } static void we_var_edit_cb(GtkButton *button, gpointer data) { /* Note that the Edit button is only active when exactly one row is selected. */ World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { gchar *var; gchar *newvar; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &var, -1); newvar = edit_var(world, var); if (newvar) { GSList *item; we_var_update_var(world, var, newvar); item = g_slist_find(world->permanent_variables, var); g_free(var); item->data = newvar; } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_var_delete_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { gchar *var; GtkWidget *msgdlg; GtkWidget *dlgbutton; GtkWidget *dlgbuttonimage; gint n; n = gtk_tree_selection_count_selected_rows(selection); if (n == 1) { msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Do you really want to make the variable temporary?")); } else { msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Do you really want to make %d variables temporary?"), n); } gtk_window_set_title(GTK_WINDOW(msgdlg), _("Confirm deletion")); dlgbutton = gtk_button_new_with_label(_("Keep permanent")); dlgbuttonimage = gtk_image_new_from_stock(GTK_STOCK_NO, GTK_ICON_SIZE_MENU); gtk_button_set_image(GTK_BUTTON(dlgbutton), dlgbuttonimage); gtk_widget_show_all(dlgbutton); gtk_dialog_add_action_widget(GTK_DIALOG(msgdlg), dlgbutton, GTK_RESPONSE_NO); dlgbutton = gtk_button_new_with_label(_("Make temporary")); gtk_widget_show_all(dlgbutton); gtk_dialog_add_action_widget(GTK_DIALOG(msgdlg), dlgbutton, GTK_RESPONSE_YES); if (!world->confirm_delete || gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { GList *listiter = g_list_last(selected); while (listiter) { gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &var, -1); we_var_delete_var(world, var); world->permanent_variables = g_slist_remove(world->permanent_variables, var); g_free(var); listiter = listiter->prev; } } gtk_widget_destroy(msgdlg); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_var_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { World *world; GtkTreeModel *model; GtkTreeIter iter; world = (World *) data; model = gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model, &iter, path)) { gchar *var; gchar *newvar; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &var, -1); newvar = edit_var(world, var); if (newvar) { GSList *item; we_var_update_var(world, var, newvar); item = g_slist_find(world->permanent_variables, var); g_free(var); item->data = newvar; } } } static gchar * edit_var(World *world, const gchar *var) { GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditVar", NULL }; GError *error = NULL; GtkWidget *dlgEditVar; GtkEntry *txtName; const gchar *givenname; gchar *newname; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; } dlgEditVar = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditVar")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditVar), GTK_RESPONSE_OK); txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtVarName")); /* We don't need it anymore */ g_object_unref(ui_builder); /* Fill-in values */ if (var) { gtk_entry_set_text(txtName, var); } /* Run the dialog until the input is valid or cancelled */ gtk_widget_show_all(dlgEditVar); while (1) { if (gtk_dialog_run(GTK_DIALOG(dlgEditVar)) == GTK_RESPONSE_OK) { /* Validate */ givenname = gtk_entry_get_text(txtName); if (strcmp(givenname, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditVar), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify a variable name.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } if (givenname[0] != '$' && givenname[0] != '@' && givenname[0] != '%') { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditVar), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Only scalar ($), array (@) and hash (%%) variables can be made permanent.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* If we are adding (var == NULL) a new variable, or when editing but a different name is typed, verify if there's already a variable with that name. If we are editing and just press OK, ignore this check for the user convenience. */ if ((!var || strcmp(var, givenname) != 0) && g_slist_find_custom(world->permanent_variables, givenname, (GCompareFunc) strcmp)) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditVar), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("%s is already permanent."), givenname); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* We must make the copy before gtk_widget_destroy is called */ newname = g_strdup(givenname); gtk_widget_destroy(dlgEditVar); return newname; } else { /* Cancel pressed */ gtk_widget_destroy(dlgEditVar); return NULL; } } } static gboolean we_var_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_Delete || evt->keyval == GDK_KP_Delete) { we_var_delete_cb(NULL, widget); return TRUE; } return FALSE; } static void we_var_move_cb(GtkButton *button, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; World *world; gboolean is_up; gint new_pos; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "isup")); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { gchar *var; gint pos; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &var, -1); pos = g_slist_index(world->permanent_variables, var); new_pos = pos; if (is_up) { if (pos != 0) { new_pos = pos - 1; move_var(world, pos, new_pos); } } else { if (pos != g_slist_length(world->permanent_variables) - 1) { new_pos = pos + 1; move_var(world, pos, new_pos); } } /* Reselect the moved item */ gtk_tree_model_iter_nth_child(model, &iter, NULL, new_pos); gtk_tree_selection_select_iter(selection, &iter); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } void we_var_update_var(World *world, const gchar *old_var, const gchar *new_var) { /* Called by the Perl functions when an var is changed, so that the display is updated. */ GtkTreeIter iter; gchar *var; gboolean success; if (!world->permvars_model) { return; } success = gtk_tree_model_get_iter_first(world->permvars_model, &iter); while (success) { gtk_tree_model_get(world->permvars_model, &iter, WE_GUIED_POINTER, &var, -1); if (var == old_var) { gtk_list_store_set(GTK_LIST_STORE(world->permvars_model), &iter, WE_GUIED_POINTER, new_var, -1); return; } success = gtk_tree_model_iter_next(world->permvars_model, &iter); } } void we_var_insert_var(World *world, const gchar *var, gint pos) { /* Called by the Perl functions when an var is inserted, so that the display is updated. */ GtkTreeIter iter; if (!world->permvars_model) { return; } if (pos < 0) { gtk_list_store_append(GTK_LIST_STORE(world->permvars_model), &iter); } else { gtk_list_store_insert(GTK_LIST_STORE(world->permvars_model), &iter, pos); } gtk_list_store_set(GTK_LIST_STORE(world->permvars_model), &iter, WE_GUIED_POINTER, var, -1); } void we_var_delete_var(World *world, const gchar *var_arg) { /* Called by the Perl functions when an var is deleted, so that the display is updated. */ GtkTreeIter iter; gchar *var; gboolean success; if (!world->permvars_model) { return; } success = gtk_tree_model_get_iter_first(world->permvars_model, &iter); while (success) { gtk_tree_model_get(world->permvars_model, &iter, WE_GUIED_POINTER, &var, -1); if (var == var_arg) { gtk_list_store_remove(GTK_LIST_STORE(world->permvars_model), &iter); return; } success = gtk_tree_model_iter_next(world->permvars_model, &iter); } } kildclient-2.11.1/src/we_mainwindow.c0000644000175000017500000001613011526001511014432 00000000000000/* $Id: we_mainwindow.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include "kildclient.h" #include "ansi.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ /* XML UI signals */ G_MODULE_EXPORT void terminalfont_set_cb(GtkFontButton *font_btn, gpointer data); G_MODULE_EXPORT void use_bold_changed_cb(GtkToggleButton *chkbox, gpointer data); G_MODULE_EXPORT void wrap_changed_cb(GtkToggleButton *widget, gpointer data); G_MODULE_EXPORT void wrap_indent_changed_cb(GtkSpinButton *widget, gpointer data); G_MODULE_EXPORT void wrap_column_changed_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void use_tooltips_changed_cb(GtkToggleButton *widget, gpointer data); /************************* * File global variables * *************************/ GObject * get_we_mainwindow_tab(GtkBuilder *ui_builder) { GObject *panel; panel = gtk_builder_get_object(ui_builder, "we_panel_mainwindow"); return panel; } void fill_we_mainwindow_tab(World *world, GtkBuilder *ui_builder) { GtkFontButton *terminalfont_btn; GtkToggleButton *chkUseBold; GtkToggleButton *chkUseWrap; GtkSpinButton *spnWrapIndent; GtkToggleButton *radWrapFullWidth; GtkToggleButton *radWrapColumn; GtkSpinButton *spnWrapColumn; GtkToggleButton *chkUseTooltips; terminalfont_btn = GTK_FONT_BUTTON(gtk_builder_get_object(ui_builder, "terminalfont_btn")); chkUseBold = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkUseBold")); chkUseWrap = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkUseWrap")); spnWrapIndent = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnWrapIndent")); radWrapFullWidth = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radWrapFullWidth")); radWrapColumn = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radWrapColumn")); spnWrapColumn = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnWrapColumn")); chkUseTooltips = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkUseTooltips")); gtk_font_button_set_font_name(terminalfont_btn, world->terminalfont); gtk_toggle_button_set_active(chkUseBold, world->usebold); gtk_toggle_button_set_active(chkUseWrap, world->wrap); gtk_spin_button_set_value(spnWrapIndent, world->wrap_indent); if (world->use_wrap_column) { gtk_toggle_button_set_active(radWrapColumn, TRUE); } else { gtk_toggle_button_set_active(radWrapFullWidth, TRUE); } gtk_spin_button_set_value(spnWrapColumn, world->wrap_column); gtk_toggle_button_set_active(chkUseTooltips, world->use_tooltips); } void terminalfont_set_cb(GtkFontButton *font_btn, gpointer data) { PangoFontDescription *fontDesc; World *world = (World *) data; WorldGUI *gui = world->gui; free(world->terminalfont); world->terminalfont = g_strdup(gtk_font_button_get_font_name(font_btn)); if (gui) { fontDesc = pango_font_description_from_string(world->terminalfont); gtk_widget_modify_font(GTK_WIDGET(world->gui->txtView), fontDesc); gtk_widget_modify_font(GTK_WIDGET(world->gui->txtViewScroll), fontDesc); pango_font_description_free(fontDesc); /* If the font has changed, we don't know what the new font supports. */ gui->ta.sup_geom_shapes = -1; gui->ta.sup_block = -1; gui->ta.sup_control = -1; gui->ta.sup_l1_supplement = -1; gui->ta.sup_box_drawing = -1; gui->ta.sup_misc_tech = -1; gui->ta.sup_math = -1; gui->ta.sup_greek = -1; } } void use_bold_changed_cb(GtkToggleButton *chkbox, gpointer data) { World *world = (World *) data; WorldGUI *gui = world->gui; world->usebold = gtk_toggle_button_get_active(chkbox); if (gui) { ansitextview_update_color_tags(gui, gui->world); } } void wrap_changed_cb(GtkToggleButton *button, gpointer data) { World *world = (World *) data; WorldGUI *gui = world->gui; world->wrap = gtk_toggle_button_get_active(button); if (gui) { gtk_text_view_set_wrap_mode(gui->txtView, world->wrap ? GTK_WRAP_WORD_CHAR : GTK_WRAP_CHAR); gtk_text_view_set_wrap_mode(gui->txtViewScroll, world->wrap ? GTK_WRAP_WORD_CHAR : GTK_WRAP_CHAR); } } void wrap_indent_changed_cb(GtkSpinButton *widget, gpointer data) { World *world = (World *) data; WorldGUI *gui = world->gui; world->wrap_indent = gtk_spin_button_get_value_as_int(widget); if (gui) { gtk_text_view_set_indent(gui->txtView, -world->wrap_indent); gtk_text_view_set_indent(gui->txtViewScroll, -world->wrap_indent); } } void wrap_column_changed_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkToggleButton *radWrapFullWidth; GtkSpinButton *spnWrapColumn; radWrapFullWidth = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radWrapFullWidth")); spnWrapColumn = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnWrapColumn")); if (gtk_toggle_button_get_active(radWrapFullWidth)) { world->use_wrap_column = FALSE; } else { world->use_wrap_column = TRUE; } world->wrap_column = gtk_spin_button_get_value(spnWrapColumn); if (world->gui) { gtk_widget_queue_resize(GTK_WIDGET(world->gui->txtView)); } } void use_tooltips_changed_cb(GtkToggleButton *button, gpointer data) { World *world = (World *) data; world->use_tooltips = gtk_toggle_button_get_active(button); if (world->gui) { gtk_widget_set_has_tooltip(GTK_WIDGET(world->gui->txtView), world->use_tooltips); gtk_widget_set_has_tooltip(GTK_WIDGET(world->gui->txtViewScroll), world->use_tooltips); } } kildclient-2.11.1/src/we_advanced.c0000644000175000017500000002614611526001511014033 00000000000000/* $Id: we_advanced.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static GtkTreeModel *get_charsets_model(void); static char *get_file_name_for_world(const char *name); /* XML UI signals */ G_MODULE_EXPORT void confirm_delete_changed_cb(GtkToggleButton *chkbox, gpointer data); G_MODULE_EXPORT void show_plugin_toggled_cb(GtkToggleButton *button, gpointer data); /************************* * File global variables * *************************/ static const gchar *charsets[] = { "ISO-8859-1", "UTF-8", "ANSI_X3.110-1983", "ANSI_X3.4-1968", "ASMO_449", "BIG5", "BIG5HKSCS", "BS_4730", "CP1250", "CP1251", "CP1252", "CP1253", "CP1254", "CP1255", "CP1256", "CP1257", "CP1258", "CP737", "CP775", "CP949", "CSA_Z243.4-1985-1", "CSA_Z243.4-1985-2", "CSN_369103", "CWI", "DEC-MCS", "DIN_66003", "DS_2089", "EBCDIC-AT-DE", "EBCDIC-AT-DE-A", "EBCDIC-CA-FR", "EBCDIC-DK-NO", "EBCDIC-DK-NO-A", "EBCDIC-ES", "EBCDIC-ES-A", "EBCDIC-ES-S", "EBCDIC-FI-SE", "EBCDIC-FI-SE-A", "EBCDIC-FR", "EBCDIC-IS-FRISS", "EBCDIC-IT", "EBCDIC-PT", "EBCDIC-UK", "EBCDIC-US", "ECMA-CYRILLIC", "ES", "ES2", "EUC-JP", "EUC-KR", "EUC-TW", "GB18030", "GB2312", "GBK", "GB_1988-80", "GOST_19768-74", "GREEK-CCITT", "GREEK7", "GREEK7-OLD", "HP-ROMAN8", "IBM037", "IBM038", "IBM1004", "IBM1026", "IBM1047", "IBM256", "IBM273", "IBM274", "IBM275", "IBM277", "IBM278", "IBM280", "IBM281", "IBM284", "IBM285", "IBM290", "IBM297", "IBM420", "IBM423", "IBM424", "IBM437", "IBM500", "IBM850", "IBM851", "IBM852", "IBM855", "IBM857", "IBM860", "IBM861", "IBM862", "IBM863", "IBM864", "IBM865", "IBM866", "IBM868", "IBM869", "IBM870", "IBM871", "IBM874", "IBM875", "IBM880", "IBM891", "IBM903", "IBM904", "IBM905", "IBM918", "IEC_P27-1", "INIS", "INIS-8", "INIS-CYRILLIC", "ISIRI-3342", "ISO-8859-10", "ISO-8859-13", "ISO-8859-14", "ISO-8859-15", "ISO-8859-16", "ISO-8859-2", "ISO-8859-3", "ISO-8859-4", "ISO-8859-5", "ISO-8859-6", "ISO-8859-7", "ISO-8859-8", "ISO-8859-9", "ISO-IR-197", "ISO-IR-90", "ISO_10367-BOX", "ISO_2033-1983", "ISO_5427", "ISO_5427-EXT", "ISO_5428", "ISO_6937", "IT", "JIS_C6220-1969-RO", "JIS_C6229-1984-B", "JOHAB", "JUS_I.B1.002", "KOI-8", "KOI8-R", "KOI8-U", "KSC5636", "LATIN-GREEK", "LATIN-GREEK-1", "MAC-IS", "MAC-UK", "MACINTOSH", "MSZ_7795.3", "NATS-DANO", "NATS-SEFI", "NC_NC00-10", "NF_Z_62-010", "NF_Z_62-010_(1973)", "NF_Z_62-010_1973", "NS_4551-1", "NS_4551-2", "PT", "PT2", "SEN_850200_B", "SEN_850200_C", "SJIS", "T.61-8BIT", "TIS-620", "VISCII", "WIN-SAMI-2", NULL, }; GObject * get_we_advanced_tab(World *world, GtkBuilder *ui_builder) { GObject *panel; GtkCellRenderer *renderer; GtkComboBox *cmbCharset; GtkWidget *vbox_file; panel = gtk_builder_get_object(ui_builder, "we_panel_advanced"); if (world == default_world) { vbox_file = GTK_WIDGET(gtk_builder_get_object(ui_builder, "vbox_file")); gtk_widget_destroy(vbox_file); } cmbCharset = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbCharset")); gtk_combo_box_set_model(cmbCharset, get_charsets_model()); renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(cmbCharset), renderer, TRUE); gtk_combo_box_set_active(cmbCharset, 0); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(cmbCharset), renderer, "text", 0, NULL); return panel; } void fill_we_advanced_tab(World *world, GtkBuilder *ui_builder) { GtkEntry *txtWorldFile; GtkComboBox *cmbCharset; GtkToggleButton *chkConfirmDelete; GtkToggleButton *chkShowPlugin; GtkToggleButton *chkKeepAlive; GtkToggleButton *chkIgnoreUpDown; if (!world) { return; } cmbCharset = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbCharset")); chkConfirmDelete = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkConfirmDelete")); chkShowPlugin = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkShowPlugin")); chkKeepAlive = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkKeepAlive")); chkIgnoreUpDown = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkIgnoreUpDown")); if (world != default_world) { txtWorldFile = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtWorldFile")); if (world->file) gtk_entry_set_text(txtWorldFile, world->file); } if (world->charset_index != -1) { gtk_combo_box_set_active(cmbCharset, world->charset_index); } else { GtkTreeIter iter; GtkTreeModel *model; gchar *charset; model = get_charsets_model(); gtk_tree_model_get_iter_first(model, &iter); do { gtk_tree_model_get(model, &iter, 0, &charset, -1); if (strcmp(charset, world->charset) == 0) { gtk_combo_box_set_active_iter(cmbCharset, &iter); world->charset_index = gtk_combo_box_get_active(cmbCharset); break; } } while (gtk_tree_model_iter_next(model, &iter)); } gtk_toggle_button_set_active(chkConfirmDelete, world->confirm_delete); gtk_toggle_button_set_active(chkShowPlugin, world->show_plugin_items); gtk_toggle_button_set_active(chkKeepAlive, world->keep_alive); gtk_toggle_button_set_active(chkIgnoreUpDown, world->ignore_up_down_keys); } void update_we_advanced_parameters(World *world, gboolean *newworld, GtkBuilder *ui_builder) { GtkEntry *txtWorldFile; GtkComboBox *cmbCharset; GtkToggleButton *chkKeepAlive; const gchar *newval; gchar *newfile; gchar *newcharset; GtkTreeIter iter; GtkToggleButton *chkIgnoreUpDown; cmbCharset = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbCharset")); chkKeepAlive = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkKeepAlive")); chkIgnoreUpDown = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkIgnoreUpDown")); if (world != default_world) { txtWorldFile = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtWorldFile")); newval = gtk_entry_get_text(txtWorldFile); if (strcmp(newval, "") == 0) { newfile = get_file_name_for_world(world->name); } else { newfile = g_strdup(newval); } if (!world->file || strcmp(world->file, newval) != 0) { g_free(world->file); world->file = newfile; *newworld = TRUE; } else { g_free(newfile); } } gtk_combo_box_get_active_iter(cmbCharset, &iter); gtk_tree_model_get(get_charsets_model(), &iter, 0, &newcharset, -1); if (!world->charset || strcmp(world->charset, newcharset) != 0) { g_free(world->charset); world->charset = newcharset; } else { g_free(newcharset); } world->charset_index = gtk_combo_box_get_active(cmbCharset); world->keep_alive = gtk_toggle_button_get_active(chkKeepAlive); world->ignore_up_down_keys = gtk_toggle_button_get_active(chkIgnoreUpDown); } void confirm_delete_changed_cb(GtkToggleButton *chkbox, gpointer data) { World *world = (World *) data; world->confirm_delete = gtk_toggle_button_get_active(chkbox); } void show_plugin_toggled_cb(GtkToggleButton *button, gpointer data) { World *world = (World *) data; world->show_plugin_items = gtk_toggle_button_get_active(button); gtk_tree_model_filter_refilter(world->trigger_model_filter); gtk_tree_model_filter_refilter(world->alias_model_filter); gtk_tree_model_filter_refilter(world->macro_model_filter); gtk_tree_model_filter_refilter(world->timer_model_filter); gtk_tree_model_filter_refilter(world->hooks.OnConnect_model_filter); gtk_tree_model_filter_refilter(world->hooks.OnDisconnect_model_filter); gtk_tree_model_filter_refilter(world->hooks.OnReceivedText_model_filter); gtk_tree_model_filter_refilter(world->hooks.OnSentCommand_model_filter); gtk_tree_model_filter_refilter(world->hooks.OnGetFocus_model_filter); gtk_tree_model_filter_refilter(world->hooks.OnLoseFocus_model_filter); gtk_tree_model_filter_refilter(world->hooks.OnCloseConnected_model_filter); } static GtkTreeModel * get_charsets_model(void) { static GtkListStore *model = NULL; if (!model) { GtkTreeIter iter; int i; model = gtk_list_store_new(1, G_TYPE_STRING); i = 0; while (charsets[i]) { gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, 0, charsets[i], -1); ++i; } } return GTK_TREE_MODEL(model); } static char * get_file_name_for_world(const char *name) { const char *kilddir; char file[PATH_MAX]; int i; int pos; int startpos; struct stat stinfo; kilddir = get_kildclient_directory_path(); /* +1 to start after the / that will be added later */ startpos = strlen(kilddir) + 1; i = 0; while (1) { sprintf(file, "%s/%s_%d.wrl", kilddir, name, i); /* Convert the name into something allowed in file names */ pos = startpos; while (file[pos]) { if (!isalnum(file[pos]) && file[pos] != '.' && file[pos] != '_') file[pos] = '_'; ++pos; } if (stat(file, &stinfo) == -1) break; ++i; } return (g_strdup(file)); } kildclient-2.11.1/src/we_scripting.c0000644000175000017500000000444511526001511014266 00000000000000/* $Id: we_scripting.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ /************************* * File global variables * *************************/ GObject * get_we_scripting_tab(GtkBuilder *ui_builder) { GObject *panel; panel = gtk_builder_get_object(ui_builder, "we_panel_scripting"); return panel; } void fill_we_scripting_tab(World *world, GtkBuilder *ui_builder) { GtkFileChooser *txtScriptFile; if (!world) { return; } txtScriptFile = GTK_FILE_CHOOSER(gtk_builder_get_object(ui_builder, "txtScriptFile")); if (world->scriptfile) { gtk_file_chooser_set_filename(txtScriptFile, world->scriptfile); } } void update_we_scripting_parameters(World *world, GtkBuilder *ui_builder) { GtkFileChooser *txtScriptFile; gchar *newval; txtScriptFile = GTK_FILE_CHOOSER(gtk_builder_get_object(ui_builder, "txtScriptFile")); newval = gtk_file_chooser_get_filename(txtScriptFile); if (!newval) { g_free(world->scriptfile); world->scriptfile = NULL; } else if (!world->scriptfile || strcmp(world->scriptfile, newval) != 0) { g_free(world->scriptfile); world->scriptfile = g_strdup(newval); } g_free(newval); } kildclient-2.11.1/src/we_macros.c0000644000175000017500000005617211526001511013554 00000000000000/* $Id: we_macros.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static GtkTreeModel *create_we_macros_model(World *world); static void we_macro_configure_view(GtkTreeView *view, GtkTreeModel *model); static void we_macro_add_cb(GtkButton *button, gpointer data); static void we_macro_edit_cb(GtkButton *button, gpointer data); static void we_macro_delete_cb(GtkButton *button, gpointer data); static void we_macro_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data); static gboolean edit_macro(World *world, Macro *macro); static gboolean we_macro_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static void we_macro_move_cb(GtkButton *button, gpointer data); /* XML UI signals */ G_MODULE_EXPORT gboolean we_macro_txtname_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); GObject * get_we_macros_tab(World *world) { GtkBuilder *ui_builder; gchar *objects[] = { "we_panel_generic_graphical_editor", NULL }; GError *error = NULL; GObject *panel; GtkLabel *lblType; GObject *btnAdd; GObject *btnEdit; GObject *btnDelete; GObject *btnUp; GObject *btnDown; GObject *btnExport; GtkTreeSelection *selection; /* Create the dialog */ ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } panel = gtk_builder_get_object(ui_builder, "we_panel_generic_graphical_editor"); /* So it's not destroyed when the builder is destroyed */ g_object_ref(panel); world->viewMacro = GTK_TREE_VIEW(gtk_builder_get_object(ui_builder, "viewObjects")); g_object_set_data(G_OBJECT(world->viewMacro), "forworld", world); g_signal_connect(G_OBJECT(world->viewMacro), "row-activated", G_CALLBACK(we_macro_view_row_dblclick_cb), world); g_signal_connect(G_OBJECT(world->viewMacro), "key-press-event", G_CALLBACK(we_macro_view_keypress_cb), world); lblType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblGEType")); gtk_label_set_markup(lblType, "Macros"); btnAdd = gtk_builder_get_object(ui_builder, "btnGEAdd"); g_signal_connect(btnAdd, "clicked", G_CALLBACK(we_macro_add_cb), world->viewMacro); btnEdit = gtk_builder_get_object(ui_builder, "btnGEEdit"); g_signal_connect(btnEdit, "clicked", G_CALLBACK(we_macro_edit_cb), world->viewMacro); btnDelete = gtk_builder_get_object(ui_builder, "btnGEDelete"); g_signal_connect(btnDelete, "clicked", G_CALLBACK(we_macro_delete_cb), world->viewMacro); btnUp = gtk_builder_get_object(ui_builder, "btnGEUp"); g_object_set_data(btnUp, "isup", GINT_TO_POINTER(TRUE)); g_signal_connect(btnUp, "clicked", G_CALLBACK(we_macro_move_cb), world->viewMacro); btnDown = gtk_builder_get_object(ui_builder, "btnGEDown"); g_object_set_data(btnDown, "isup", GINT_TO_POINTER(FALSE)); g_signal_connect(btnDown, "clicked", G_CALLBACK(we_macro_move_cb), world->viewMacro); btnExport = gtk_builder_get_object(ui_builder, "btnGEExport"); g_object_set_data(btnExport, "preselect", "Macro"); world->macro_model = create_we_macros_model(world); world->macro_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->macro_model, NULL)); g_object_unref(G_OBJECT(world->macro_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->macro_model_filter), we_guied_plugin_filter_func, world, NULL); we_macro_configure_view(world->viewMacro, GTK_TREE_MODEL(world->macro_model_filter)); selection = gtk_tree_view_get_selection(world->viewMacro); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); g_object_set_data(G_OBJECT(selection), "btnEdit", btnEdit); g_object_set_data(G_OBJECT(selection), "btnDelete", btnDelete); g_object_set_data(G_OBJECT(selection), "btnUp", btnUp); g_object_set_data(G_OBJECT(selection), "btnDown", btnDown); g_object_set_data(G_OBJECT(selection), "btnExport", btnExport); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(we_guied_selection_changed_cb), NULL); gtk_builder_connect_signals(ui_builder, world); g_object_unref(ui_builder); return panel; } static GtkTreeModel * create_we_macros_model(World *world) { GtkListStore *store; GtkTreeIter iter; GSList *macroptr; Macro *macro; store = gtk_list_store_new(WE_GUIED_N_COLS, G_TYPE_POINTER); macroptr = world->macros; while (macroptr) { macro = (Macro *) macroptr->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, WE_GUIED_POINTER, macro, -1); macroptr = macroptr->next; } return GTK_TREE_MODEL(store); } static void we_macro_configure_view(GtkTreeView *view, GtkTreeModel *model) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; gtk_tree_view_set_model(view, model); g_object_unref(model); /* Column 1 - Enabled? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(MACRO_ENABLED)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Enabled")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(MACRO_ENABLED), NULL); gtk_tree_view_append_column(view, column); /* Column 2 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(MACRO_NAME), NULL); gtk_tree_view_append_column(view, column); /* Column 3 - Key */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Key")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(MACRO_KEY), NULL); gtk_tree_view_append_column(view, column); /* Column 4 - Action */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Action")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(MACRO_ACTION), NULL); gtk_tree_view_append_column(view, column); /* Column 5 - Plugin */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Plugin")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(OBJECT_PLUGIN), NULL); gtk_tree_view_append_column(view, column); gtk_tree_view_columns_autosize(view); } static void we_macro_add_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; Macro *macro; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); macro = g_new0(Macro, 1); macro->enabled = 1; if (edit_macro(world, macro)) { world->macros = g_slist_insert(world->macros, macro, world->macro_pos); we_macro_insert_macro(world, macro, world->macro_pos++); } else { g_free(macro); } } static void we_macro_edit_cb(GtkButton *button, gpointer data) { /* Note that the Edit button is only active when exactly one row is selected. */ World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Macro *macro; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, ¯o, -1); if (edit_macro(world, macro)) { we_macro_update_macro(world, macro); } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_macro_delete_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Macro *macro; GSList *macroitem; GtkWidget *msgdlg; gint n; n = gtk_tree_selection_count_selected_rows(selection); msgdlg = we_guied_confirm_delete_dialog_new(GTK_WINDOW(world->dlgEditWorld), n, _("macro"), _("macros")); if (!world->confirm_delete || gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { GList *listiter = g_list_last(selected); while (listiter) { gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, ¯o, -1); macroitem = g_slist_find(world->macros, macro); remove_macro(world, macroitem); listiter = listiter->prev; } } gtk_widget_destroy(msgdlg); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_macro_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { World *world; GtkTreeModel *model; GtkTreeIter iter; world = (World *) data; model = gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model, &iter, path)) { Macro *macro; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, ¯o, -1); if (edit_macro(world, macro)) { we_macro_update_macro(world, macro); } } } static gboolean edit_macro(World *world, Macro *macro) { GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditMacro", NULL }; GError *error = NULL; GtkWidget *dlgEditMacro; GtkEntry *txtName; GtkEntry *txtKey; GtkEntry *txtAction; GtkToggleButton *chkEnabled; const gchar *newname; const gchar *newkey; guint newkeyval; GdkModifierType newmodifiers; const gchar *newaction; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return FALSE; } gtk_builder_connect_signals(ui_builder, NULL); dlgEditMacro = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditMacro")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditMacro), GTK_RESPONSE_OK); txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtMacroName")); txtKey = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtMacroKey")); txtAction = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtMacroAction")); chkEnabled = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkMacroEnabled")); /* Only display note when editing a plugin's macro */ if (!macro->owner_plugin) { GObject *label; label = gtk_builder_get_object(ui_builder, "lblNoteMacro"); gtk_widget_destroy(GTK_WIDGET(label)); label = gtk_builder_get_object(ui_builder, "lblNoteTextMacro"); gtk_widget_destroy(GTK_WIDGET(label)); } /* We don't need it anymore */ g_object_unref(ui_builder); /* Fill-in values */ if (macro->name) { gtk_entry_set_text(txtName, macro->name); } if (macro->keyval) { gchar *keycodestr = gtk_accelerator_name(macro->keyval, macro->modifiers); gtk_entry_set_text(txtKey, keycodestr); g_free(keycodestr); } if (macro->action) { gtk_entry_set_text(txtAction, macro->action); } gtk_toggle_button_set_active(chkEnabled, macro->enabled); /* Run the dialog until the input is valid or cancelled */ gtk_widget_show_all(dlgEditMacro); while (1) { if (gtk_dialog_run(GTK_DIALOG(dlgEditMacro)) == GTK_RESPONSE_OK) { /* Validate */ newkey = gtk_entry_get_text(txtKey); if (strcmp(newkey, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditMacro), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the key.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } gtk_accelerator_parse(newkey, &newkeyval, &newmodifiers); /* Shouldn't really happen if key codes are gotten from key press evt. */ if (!newkeyval) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditMacro), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Invalid key code.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } newaction = gtk_entry_get_text(txtAction); if (strcmp(newaction, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditMacro), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the action.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* Update values */ newname = gtk_entry_get_text(txtName); if (!macro->name || strcmp(newname, macro->name) != 0) { g_free(macro->name); if (strcmp(newname, "") != 0) { macro->name = g_strdup(newname); } else { macro->name = NULL; } } if (!macro->action || strcmp(newaction, macro->action) != 0) { g_free(macro->action); macro->action = g_strdup(newaction); } macro->keyval = newkeyval; macro->modifiers = newmodifiers; macro->enabled = gtk_toggle_button_get_active(chkEnabled); /* We've finished successfully */ gtk_widget_destroy(dlgEditMacro); return TRUE; } else { /* Cancel pressed */ gtk_widget_destroy(dlgEditMacro); return FALSE; } } } static gboolean we_macro_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_Delete || evt->keyval == GDK_KP_Delete) { we_macro_delete_cb(NULL, widget); return TRUE; } return FALSE; } static void we_macro_move_cb(GtkButton *button, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; World *world; gboolean is_up; gint new_pos; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "isup")); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Macro *macro; gint pos; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, ¯o, -1); pos = g_slist_index(world->macros, macro); new_pos = pos; if (is_up) { if (pos != 0) { new_pos = pos - 1; move_macro(world, pos, new_pos); } } else { if (pos != world->macro_pos - 1) { new_pos = pos + 1; move_macro(world, pos, new_pos); } } /* Reselect the moved item */ gtk_tree_model_iter_nth_child(model, &iter, NULL, new_pos); gtk_tree_selection_select_iter(selection, &iter); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } void we_macro_update_macro(World *world, Macro *macro_arg) { /* Called by the Perl functions when an macro is changed, so that the display is updated. */ GtkTreeIter iter; GtkTreePath *path; Macro *macro; gboolean success; if (!world->macro_model) { return; } success = gtk_tree_model_get_iter_first(world->macro_model, &iter); while (success) { gtk_tree_model_get(world->macro_model, &iter, WE_GUIED_POINTER, ¯o, -1); if (macro == macro_arg) { path = gtk_tree_model_get_path(world->macro_model, &iter); gtk_tree_model_row_changed(world->macro_model, path, &iter); gtk_tree_path_free(path); return; } success = gtk_tree_model_iter_next(world->macro_model, &iter); } } void we_macro_insert_macro(World *world, Macro *macro, gint pos) { /* Called by the Perl functions when an macro is inserted, so that the display is updated. */ GtkTreeIter iter; if (!world->macro_model) { return; } gtk_list_store_insert(GTK_LIST_STORE(world->macro_model), &iter, pos); gtk_list_store_set(GTK_LIST_STORE(world->macro_model), &iter, WE_GUIED_POINTER, macro, -1); } void we_macro_delete_macro(World *world, Macro *macro_arg) { /* Called by the Perl functions when an macro is deleted, so that the display is updated. */ GtkTreeIter iter; Macro *macro; gboolean success; if (!world->macro_model) { return; } success = gtk_tree_model_get_iter_first(world->macro_model, &iter); while (success) { gtk_tree_model_get(world->macro_model, &iter, WE_GUIED_POINTER, ¯o, -1); if (macro == macro_arg) { gtk_list_store_remove(GTK_LIST_STORE(world->macro_model), &iter); return; } success = gtk_tree_model_iter_next(world->macro_model, &iter); } } gboolean we_macro_txtname_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { gchar *keycode; if (gtk_accelerator_valid(evt->keyval, evt->state)) { keycode = gtk_accelerator_name(evt->keyval, evt->state); gtk_entry_set_text(GTK_ENTRY(widget), keycode); g_free(keycode); } return TRUE; } kildclient-2.11.1/src/dlgAbout.glade0000644000175000017500000000436411405233112014164 00000000000000 True 5 normal False KildClient Copyright © Eduardo M Kalinowski A mud client with powerful features and support for Perl Scripting http://kildclient.sf.net Visit http://kildclient.sf.net 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. Eduardo M Kalinowski <eduardo@kalinowski.com.br> Brazilian Portuguese: Eduardo M Kalinowski <eduardo@kalinowski.com.br> Esperanto: Eduardo M Kalinowski <eduardo@kalinowski.com.br> German: René Küttner <rkulpz@users.sourceforge.net> Swedish: Niklas Grahn <terra.unknown@yahoo.com> True vertical False end 0 kildclient-2.11.1/src/we_misc.c0000644000175000017500000001202311526001511013206 00000000000000/* $Id: we_misc.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "simocombobox.h" #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ GObject * get_we_misc_tab(GtkBuilder *ui_builder) { GObject *panel; panel = gtk_builder_get_object(ui_builder, "we_panel_misc"); return panel; } void fill_we_misc_tab(World *world, GtkBuilder *ui_builder) { GtkToggleButton *chkScrollOutput; GtkSpinButton *txtBufferLines; GtkToggleButton *radNameDisplayWorld; GtkToggleButton *radNameDisplayWorldChar; GtkToggleButton *radNameDisplayCharWorld; GtkToggleButton *radNameDisplayCustom; GtkEntry *txtNameDisplayCustom; if (!world) { return; } /* Get widgets */ chkScrollOutput = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkScrollOutput")); txtBufferLines = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "txtBufferLines")); radNameDisplayWorld = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayWorld")); radNameDisplayWorldChar = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayWorldChar")); radNameDisplayCharWorld = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayCharWorld")); radNameDisplayCustom = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayCustom")); txtNameDisplayCustom = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtNameDisplayCustom")); gtk_toggle_button_set_active(chkScrollOutput, world->scrollOutput); gtk_spin_button_set_value(txtBufferLines, world->buffer_lines); switch (world->name_display_style) { case NAME_DISPLAY_WORLD: gtk_toggle_button_set_active(radNameDisplayWorld, TRUE); break; case NAME_DISPLAY_WORLD_CHAR: gtk_toggle_button_set_active(radNameDisplayWorldChar, TRUE); break; case NAME_DISPLAY_CHAR_WORLD: gtk_toggle_button_set_active(radNameDisplayCharWorld, TRUE); break; case NAME_DISPLAY_CUSTOM: gtk_toggle_button_set_active(radNameDisplayCustom, TRUE); break; } gtk_entry_set_text(txtNameDisplayCustom, world->name_display_pattern); } void update_we_misc_parameters(World *world, GtkBuilder *ui_builder) { GtkToggleButton *chkScrollOutput; GtkSpinButton *txtBufferLines; GtkToggleButton *radNameDisplayWorld; GtkToggleButton *radNameDisplayWorldChar; GtkToggleButton *radNameDisplayCharWorld; GtkToggleButton *radNameDisplayCustom; GtkEntry *txtNameDisplayCustom; const gchar *newval; /* Get widgets */ chkScrollOutput = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkScrollOutput")); txtBufferLines = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "txtBufferLines")); radNameDisplayWorld = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayWorld")); radNameDisplayWorldChar = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayWorldChar")); radNameDisplayCharWorld = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayCharWorld")); radNameDisplayCustom = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radNameDisplayCustom")); txtNameDisplayCustom = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtNameDisplayCustom")); world->scrollOutput = gtk_toggle_button_get_active(chkScrollOutput); world->buffer_lines = gtk_spin_button_get_value_as_int(txtBufferLines); if (gtk_toggle_button_get_active(radNameDisplayWorld)) { world->name_display_style = NAME_DISPLAY_WORLD; } else if (gtk_toggle_button_get_active(radNameDisplayWorldChar)) { world->name_display_style = NAME_DISPLAY_WORLD_CHAR; } else if (gtk_toggle_button_get_active(radNameDisplayCharWorld)) { world->name_display_style = NAME_DISPLAY_CHAR_WORLD; } else if (gtk_toggle_button_get_active(radNameDisplayCustom)) { world->name_display_style = NAME_DISPLAY_CUSTOM; } newval = gtk_entry_get_text(txtNameDisplayCustom); if (!world->name_display_pattern || strcmp(world->name_display_pattern, newval) != 0) { g_free(world->name_display_pattern); world->name_display_pattern = g_strdup(newval); } } kildclient-2.11.1/src/we_general.c0000644000175000017500000004115311526001511013676 00000000000000/* $Id: we_general.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static gboolean edit_char(World *world, GtkTreeModel *model, GtkTreeIter *iter); /* XML UI signals */ G_MODULE_EXPORT void we_general_add_edit_char_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void we_general_delete_char_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void we_general_move_char_cb(gpointer data, GtkWidget *widget); G_MODULE_EXPORT void we_general_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data); G_MODULE_EXPORT gboolean we_general_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); GObject * get_we_general_tab(World *world, GtkBuilder *ui_builder) { GObject *panel; GtkTreeView *viewCharacters; GtkCellRenderer *renderer; GtkTreeViewColumn *column; panel = gtk_builder_get_object(ui_builder, "we_panel_general"); /* Configure view */ viewCharacters = GTK_TREE_VIEW(gtk_builder_get_object(ui_builder, "viewCharacters")); gtk_tree_view_set_model(viewCharacters, world->logon_characters); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_attributes(viewCharacters, 0, _("Character"), renderer, "text", LOGON_CHAR, NULL); renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "text", "******", NULL); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("Password")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_append_column(viewCharacters, column); return panel; } void fill_we_general_tab(World *world, GtkBuilder *ui_builder) { GtkEntry *txtName; GtkEntry *txtHost; GtkEntry *txtPort; GtkWidget *chkTLS; GtkComboBox *cmbProxyType; GtkEntry *txtProxyServer; GtkEntry *txtProxyPort; GtkEntry *txtProxyUser; GtkEntry *txtProxyPassword; GtkComboBox *cmbConnStyle; GObject *btnAdd; GObject *btnEdit; GObject *btnUp; GObject *btnDown; if (!world) { return; } txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtName")); txtHost = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtHost")); txtPort = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtPort")); chkTLS = GTK_WIDGET(gtk_builder_get_object(ui_builder, "chkTLS")); cmbProxyType = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbProxyType")); txtProxyServer = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyServer")); txtProxyPort = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyPort")); txtProxyUser = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyUser")); txtProxyPassword = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyPassword")); cmbConnStyle = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbConnStyle")); btnAdd = gtk_builder_get_object(ui_builder, "btnCharAdd"); btnEdit = gtk_builder_get_object(ui_builder, "btnCharEdit"); btnUp = gtk_builder_get_object(ui_builder, "btnCharUp"); btnDown = gtk_builder_get_object(ui_builder, "btnCharDown"); /* General connection settings */ if (world->name) { gtk_entry_set_text(txtName, world->name); } if (world->host) { gtk_entry_set_text(txtHost, world->host); } if (world->port) { gtk_entry_set_text(txtPort, world->port); } #ifdef HAVE_LIBGNUTLS gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chkTLS), world->use_tls); #else gtk_widget_destroy(chkTLS); #endif /* Proxy */ /* -1 is "global settings in enumeration */ gtk_combo_box_set_active(cmbProxyType, world->proxy.type + 1); if (world->proxy.server) { gtk_entry_set_text(txtProxyServer, world->proxy.server); } else { gtk_entry_set_text(txtProxyServer, ""); } if (world->proxy.port) { gtk_entry_set_text(txtProxyPort, world->proxy.port); } else { gtk_entry_set_text(txtProxyPort, ""); } if (world->proxy.user) { gtk_entry_set_text(txtProxyUser, world->proxy.user); } else { gtk_entry_set_text(txtProxyUser, ""); } if (world->proxy.password) { gtk_entry_set_text(txtProxyPassword, world->proxy.password); } else { gtk_entry_set_text(txtProxyPassword, ""); } /* Auto-login*/ gtk_combo_box_set_active(cmbConnStyle, world->connection_style); /* Information used in the callbacks */ g_object_set_data(btnAdd, "isnew", GINT_TO_POINTER(TRUE)); g_object_set_data(btnEdit, "isnew", GINT_TO_POINTER(FALSE)); g_object_set_data(btnUp, "isup", GINT_TO_POINTER(TRUE)); g_object_set_data(btnDown, "isup", GINT_TO_POINTER(FALSE)); } void update_we_general_parameters(World *world, GtkBuilder *ui_builder) { const gchar *newval; GtkEntry *txtName; GtkEntry *txtHost; GtkEntry *txtPort; GtkComboBox *cmbProxyType; GtkEntry *txtProxyServer; GtkEntry *txtProxyPort; GtkEntry *txtProxyUser; GtkEntry *txtProxyPassword; GtkComboBox *cmbConnStyle; #ifdef HAVE_LIBGNUTLS GtkToggleButton *chkTLS; #endif txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtName")); txtHost = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtHost")); txtPort = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtPort")); cmbProxyType = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbProxyType")); txtProxyServer = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyServer")); txtProxyPort = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyPort")); txtProxyUser = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyUser")); txtProxyPassword = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtProxyPassword")); cmbConnStyle = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbConnStyle")); /* General settings */ newval = gtk_entry_get_text(txtName); if (!world->name || strcmp(world->name, newval) != 0) { g_free(world->name); world->name = g_strdup(newval); } newval = gtk_entry_get_text(txtHost); if (!world->host || strcmp(world->host, newval) != 0) { g_free(world->host); world->host = g_strdup(newval); } newval = gtk_entry_get_text(txtPort); if (!world->port || strcmp(world->port, newval) != 0) { g_free(world->port); world->port = g_strdup(newval); } /* Proxy */ /* -1 is "global settings" in enumeration */ world->proxy.type = gtk_combo_box_get_active(cmbProxyType) - 1; newval = gtk_entry_get_text(txtProxyServer); if (!world->proxy.server || strcmp(world->proxy.server, newval) != 0) { g_free(world->proxy.server); world->proxy.server = g_strdup(newval); } newval = gtk_entry_get_text(txtProxyPort); if (!world->proxy.port || strcmp(world->proxy.port, newval) != 0) { g_free(world->proxy.port); world->proxy.port = g_strdup(newval); } newval = gtk_entry_get_text(txtProxyUser); if (!world->proxy.user || strcmp(world->proxy.user, newval) != 0) { g_free(world->proxy.user); world->proxy.user = g_strdup(newval); } newval = gtk_entry_get_text(txtProxyPassword); if (!world->proxy.password || strcmp(world->proxy.password, newval) != 0) { g_free(world->proxy.password); world->proxy.password = g_strdup(newval); } /* Auto-logon */ world->connection_style = gtk_combo_box_get_active(cmbConnStyle); #ifdef HAVE_LIBGNUTLS chkTLS = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTLS")); world->use_tls = gtk_toggle_button_get_active(chkTLS); #endif } void we_general_add_edit_char_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; gboolean is_new; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; view = GTK_TREE_VIEW(gtk_builder_get_object(world->ui_builder, "viewCharacters")); model = gtk_tree_view_get_model(view); is_new = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "isnew")); if (is_new) { gtk_list_store_append(GTK_LIST_STORE(model), &iter); } else { selection = gtk_tree_view_get_selection(view); if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) { return; } } if (!edit_char(world, model, &iter) && is_new) { gtk_list_store_remove(GTK_LIST_STORE(model), &iter); } } void we_general_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { World *world; GtkTreeModel *model; GtkTreeIter iter; world = (World *) data; model = gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model, &iter, path)) { edit_char(world, model, &iter); } } static gboolean edit_char(World *world, GtkTreeModel *model, GtkTreeIter *iter) { GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditChar", NULL }; GError *error = NULL; GtkWidget *dlgEditChar; GtkEntry *txtName; GtkEntry *txtPassword; gchar *name = NULL; gchar *password = NULL; const gchar *newname; const gchar *newpassword; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return FALSE; } dlgEditChar = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditChar")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditChar), GTK_RESPONSE_OK); txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtCharName")); txtPassword = GTK_ENTRY( gtk_builder_get_object(ui_builder, "txtCharPassword")); /* We don't need it anymore */ g_object_unref(ui_builder); /* Fill-in values */ gtk_tree_model_get(model, iter, LOGON_CHAR, &name, LOGON_PASS, &password, -1); if (name) { gtk_entry_set_text(txtName, name); g_free(name); } if (password) { gtk_entry_set_text(txtPassword, password); g_free(password); } /* Run the dialog until the input is valid or cancelled */ gtk_widget_show_all(dlgEditChar); while (1) { if (gtk_dialog_run(GTK_DIALOG(dlgEditChar)) == GTK_RESPONSE_OK) { /* Validate */ newname = gtk_entry_get_text(txtName); if (strcmp(newname, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditChar), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the name.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } newpassword = gtk_entry_get_text(txtPassword); if (strcmp(newpassword, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditChar), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the password.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* Update values */ gtk_list_store_set(GTK_LIST_STORE(model), iter, LOGON_CHAR, newname, LOGON_PASS, newpassword, -1); /* We've finished successfully */ gtk_widget_destroy(dlgEditChar); return TRUE; } else { /* Cancel pressed */ gtk_widget_destroy(dlgEditChar); return FALSE; } } } void we_general_delete_char_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; view = GTK_TREE_VIEW(gtk_builder_get_object(world->ui_builder, "viewCharacters")); selection = gtk_tree_view_get_selection(view); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { GtkWidget *msgdlg; msgdlg = we_guied_confirm_delete_dialog_new(GTK_WINDOW(world->dlgEditWorld), 1, _("character"), ""); if (!world->confirm_delete || gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { gtk_list_store_remove(GTK_LIST_STORE(model), &iter); } gtk_widget_destroy(msgdlg); } } gboolean we_general_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_Delete || evt->keyval == GDK_KP_Delete) { we_general_delete_char_cb(widget, data); return TRUE; } return FALSE; } void we_general_move_char_cb(gpointer data, GtkWidget *widget) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreeIter iter; GtkTreeIter other_iter; gboolean is_up; view = (GtkTreeView *) data; selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "isup")); if (gtk_tree_selection_get_selected(selection, &model, &iter)) { if (is_up) { GtkTreePath *path; path = gtk_tree_model_get_path(model, &iter); if (gtk_tree_path_prev(path)) { gtk_tree_model_get_iter(model, &other_iter, path); gtk_list_store_swap(GTK_LIST_STORE(model), &iter, &other_iter); } gtk_tree_path_free(path); } else { other_iter = iter; if (gtk_tree_model_iter_next(model, &other_iter)) { gtk_list_store_swap(GTK_LIST_STORE(model), &iter, &other_iter); } } } } kildclient-2.11.1/src/we_protocols.c0000644000175000017500000000507211526001511014305 00000000000000/* $Id: we_protocols.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "simocombobox.h" #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ GObject * get_we_protocols_tab(GtkBuilder *ui_builder) { GObject *panel; panel = gtk_builder_get_object(ui_builder, "we_panel_protocols"); return panel; } void fill_we_protocols_tab(World *world, GtkBuilder *ui_builder) { GObject *rad; if (!world) { return; } if (world->mccp_behavior == MCCP_DISABLE) { rad = gtk_builder_get_object(ui_builder, "radMCCPDisable"); } else if (world->mccp_behavior == MCCP_ALWAYS) { rad = gtk_builder_get_object(ui_builder, "radMCCPAlways"); } else { rad = gtk_builder_get_object(ui_builder, "radMCCPAfterConnect"); } gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rad), TRUE); } void update_we_protocols_parameters(World *world, GtkBuilder *ui_builder) { GtkToggleButton *radMCCPAfterConnect; GtkToggleButton *radMCCPAlways; GtkToggleButton *radMCCPDisable; radMCCPAfterConnect = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radMCCPAfterConnect")); radMCCPAlways = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radMCCPAlways")); radMCCPDisable = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "radMCCPDisable")); if (gtk_toggle_button_get_active(radMCCPAfterConnect)) { world->mccp_behavior = MCCP_AFTER_CONNECT; } else if (gtk_toggle_button_get_active(radMCCPAlways)) { world->mccp_behavior = MCCP_ALWAYS; } else if (gtk_toggle_button_get_active(radMCCPDisable)) { world->mccp_behavior = MCCP_DISABLE; } } kildclient-2.11.1/src/we_colors.c0000644000175000017500000001272111526001511013561 00000000000000/* $Id: we_colors.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ /* XML UI signals */ G_MODULE_EXPORT void color_changed_cb(GtkColorButton *btn, gpointer data); G_MODULE_EXPORT void set_default_colors_cb(GtkButton *btn, gpointer data); GObject * get_we_colors_tab(World *world, GtkBuilder *ui_builder) { GObject *panel; GtkTable *table; GObject *colorBtnAnsi; GObject *colorBtnDeffore; GObject *colorBtnDefbold; GObject *colorBtnDefback; GObject *colorBtnDefboldback; gchar btnname[18]; /* 18 is enough to hold the button names */ int i; panel = gtk_builder_get_object(ui_builder, "we_panel_colors"); /* Ansi colors category */ table = GTK_TABLE(gtk_builder_get_object(ui_builder, "table_ansi_colors")); gtk_table_set_col_spacing(table, 2, 32); for (i = 0; i < 16; ++i) { sprintf(btnname, "colorBtnAnsi[%d]", i); colorBtnAnsi = gtk_builder_get_object(ui_builder, btnname); gtk_color_button_set_color(GTK_COLOR_BUTTON(colorBtnAnsi), &world->ansicolors[i]); g_object_set_data(colorBtnAnsi, "colorptr", &world->ansicolors[i]); } /* Default colors category */ table = GTK_TABLE(gtk_builder_get_object(ui_builder, "table_default_colors")); gtk_table_set_col_spacing(table, 2, 32); colorBtnDeffore = gtk_builder_get_object(ui_builder, "colorBtnDeffore"); gtk_color_button_set_color(GTK_COLOR_BUTTON(colorBtnDeffore), world->deffore); g_object_set_data(colorBtnDeffore, "colorptr", world->deffore); colorBtnDefbold = gtk_builder_get_object(ui_builder, "colorBtnDefbold"); gtk_color_button_set_color(GTK_COLOR_BUTTON(colorBtnDefbold), world->defbold); g_object_set_data(colorBtnDefbold, "colorptr", world->defbold); colorBtnDefback = gtk_builder_get_object(ui_builder, "colorBtnDefback"); gtk_color_button_set_color(GTK_COLOR_BUTTON(colorBtnDefback), world->defback); g_object_set_data(colorBtnDefback, "colorptr", world->defback); colorBtnDefboldback = gtk_builder_get_object(ui_builder, "colorBtnDefboldback"); gtk_color_button_set_color(GTK_COLOR_BUTTON(colorBtnDefboldback), world->defboldback); g_object_set_data(colorBtnDefboldback, "colorptr", world->defboldback); return panel; } void color_changed_cb(GtkColorButton *btn, gpointer data) { World *world = (World *) data; WorldGUI *gui = world->gui; GdkColor *color = (GdkColor *) g_object_get_data(G_OBJECT(btn), "colorptr"); gtk_color_button_get_color(btn, color); if (gui) { ansitextview_update_color_tags(gui, gui->world); } } void set_default_colors_cb(GtkButton *btn, gpointer data) { World *world = (World *) data; WorldGUI *gui = world->gui; GtkBuilder *ui_builder; GtkColorButton *colorBtnAnsi; GtkColorButton *colorBtnDeffore; GtkColorButton *colorBtnDefbold; GtkColorButton *colorBtnDefback; GtkColorButton *colorBtnDefboldback; gchar btnname[18]; /* 18 is enough to hold the button names */ int i; ui_builder = world->ui_builder; colorBtnDeffore = GTK_COLOR_BUTTON(gtk_builder_get_object(ui_builder, "colorBtnDeffore")); colorBtnDefbold = GTK_COLOR_BUTTON(gtk_builder_get_object(ui_builder, "colorBtnDefbold")); colorBtnDefback = GTK_COLOR_BUTTON(gtk_builder_get_object(ui_builder, "colorBtnDefback")); colorBtnDefboldback = GTK_COLOR_BUTTON(gtk_builder_get_object(ui_builder, "colorBtnDefboldback")); memcpy(world->deffore, &deffore, sizeof(GdkColor)); gtk_color_button_set_color(colorBtnDeffore, world->deffore); memcpy(world->defbold, &defbold, sizeof(GdkColor)); gtk_color_button_set_color(colorBtnDefbold, world->defbold); memcpy(world->defback, &defback, sizeof(GdkColor)); gtk_color_button_set_color(colorBtnDefback, world->defback); memcpy(world->defboldback, &defboldback, sizeof(GdkColor)); gtk_color_button_set_color(colorBtnDefboldback, world->defboldback); memcpy(world->ansicolors, &defansi, 16*sizeof(GdkColor)); for (i = 0; i < 16; ++i) { sprintf(btnname, "colorBtnAnsi[%d]", i); colorBtnAnsi = GTK_COLOR_BUTTON(gtk_builder_get_object(ui_builder, btnname)); gtk_color_button_set_color(colorBtnAnsi, &world->ansicolors[i]); } if (gui) { ansitextview_update_color_tags(gui, gui->world); } } kildclient-2.11.1/src/kcwin.c0000644000175000017500000000566511526001511012711 00000000000000/* $Id: kcwin.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include /* Perl includes */ #include #include #include #include "kildclient.h" #include "perlscript.h" /***************** * Useful macros * *****************/ #define FETCHGUIVARS SV *self_ref; \ HV *self; \ SV **guiptrsv; \ WorldGUI *gui #define FETCHGUI self_ref = ST(0); \ self = (HV*) SvRV(self_ref); \ guiptrsv = hv_fetch(self, "_GUIPTR", 7, FALSE); \ gui = INT2PTR(WorldGUI *, SvIV(*guiptrsv)) /*********************** * Function prototypes * ***********************/ void XS_KCWin__new(pTHX_ CV *perlcv) { /* For internal use only. Returns C pointers to a window and some widgets, later these are converted to Gtk-Perl objects. */ GtkWidget *window; WorldGUI *gui; dMARK; dAX; window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(window), 450, 170); gui = world_gui_new(FALSE); configure_gui(gui, world_for_perl); ansitextview_update_color_tags(gui, world_for_perl); gtk_container_add(GTK_CONTAINER(window), gui->vbox); XST_mIV(0, PTR2IV(window)); XST_mIV(1, PTR2IV(gui->vbox)); XST_mIV(2, PTR2IV(gui->scrolled_win)); XST_mIV(3, PTR2IV(gui->txtView)); XST_mIV(4, PTR2IV(gui->txtBuffer)); XST_mIV(5, PTR2IV(gui->commandArea)); XST_mIV(6, PTR2IV(gui->btnClear)); XST_mIV(7, PTR2IV(gui->txtEntry)); XST_mIV(8, PTR2IV(gui)); XSRETURN(9); } void XS_KCWin_feed(pTHX_ CV *perlcv) { STRLEN len; gchar *str; FETCHGUIVARS; dXSARGS; if (items < 2) { warn(_("%s: Too few arguments"), "KCWin::feed"); XSRETURN_EMPTY; } FETCHGUI; str = SvPV(ST(1), len); ansitextview_append_ansi_string(gui, str, len); XSRETURN_EMPTY; } void XS_KCWin__destroy(pTHX_ CV *perlcv) { FETCHGUIVARS; dMARK; dAX; FETCHGUI; free_world_gui(gui); XSRETURN_EMPTY; } kildclient-2.11.1/src/proxy.c0000644000175000017500000004746211543467543013004 00000000000000/* $Id: proxy.c 1154 2011-03-26 22:57:37Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #include #ifndef __MINGW32__ # include # include # include # include # include #else /* defined __MINGW32__ */ /* This is so we can use getaddrinfo() et al. The code will only run in Windows XP. */ # define _WIN32_WINNT 0x0501 # include # include #endif #include "kildclient.h" #include "perlscript.h" #include "net.h" /************************* * File global variables * *************************/ static const char* proxy_socks5_rejection_reasons[] = { NULL, /* success */ N_("general failure"), N_("connection not allowed by ruleset"), N_("network unreachable"), N_("host unreachable"), N_("connection refused by destination host"), N_("TTL expired"), N_("command not supported / protocol error"), N_("address type not supported"), }; /************** * Data types * **************/ /*********************** * SOCKS proxy defines * ***********************/ #define SOCKS_CONNECT 0x01 #define SOCKS4_VER 0x04 #define SOCKS4_REP_OK 0x5a #define SOCKS4_REP_FAIL 0x5b #define SOCKS4_REP_FAIL_NO_IDENTD 0x5c #define SOCKS4_REP_FAIL_UNCONF 0x5d /* SOCKS4 request: 1 byte ver, 1 byte command, 2 bytes port, 4 bytes IP, user name (variable), 1 byte terminating NULL */ #define SOCKS4_REQUEST_SIZE (1+1+2+4+1) /* SOCKS4 reply: 1 byte null, 1 byte status, 2 bytes arbitrary, 4 bytes arbitrary */ #define SOCKS4_REPLY_SIZE (1+1+2+4) #define SOCKS5_VER 0x05 #define SOCKS5_AUTH_NONE 0x00 #define SOCKS5_AUTH_USERNAME 0x02 #define SOCKS5_AUTH_REJECTED 0xFF #define SOCKS5_AUTH_REP_SUCCESS 0x00 #define SOCKS5_AUTH_USERNAME_VER 0x01 #define SOCKS5_ADDR_IP4 0x01 #define SOCKS5_ADDR_NAME 0x03 #define SOCKS5_ADDR_IP6 0x04 #define SOCKS5_CONN_REP_SUCCESS 0x00 #define SOCKS5_CONN_MAX_FAILED_REASON 0x08 /* SOCKS5 initial request: 1 byte version, 1 byte number of auth methods, 1 byte for each method. Since we support at most two methods, that's two bytes. */ #define SOCKS5_AUTH_METHOD_REQUEST_SIZE (1+1+2) /* SOCKS5 initial reply: 1 byte version, 1 byte method */ #define SOCKS5_AUTH_METHOD_REPLY_SIZE (1+1) /* SOCKS5 auth reply: 1 byte version, 1 byte status */ #define SOCKS5_AUTH_REPLY_SIZE (1+1) /* SOCKS5 connection request: 1 byte version, 1 byte command, 1 byte null, 1 byte address type, 1 byte domain length, domain (variable), 2 bytes port */ #define SOCKS5_CONNECTION_REQUEST_SIZE (1+1+1+1+1+2) /* Start of SOCKS5 connection request: 1 byte version, 1 byte status, 1 byte null, 1 byte address type, and the first byte of the address */ #define SOCKS5_PARTIAL_CONNECTION_REPLY_SIZE (1+1+1+1+1) /*********************** * Function prototypes * ***********************/ static gboolean proxy_socks4_data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data); static gboolean proxy_socks5_data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data); static gboolean proxy_socks5_data_ready_initial(World *world); static gboolean proxy_socks5_data_ready_auth(World *world); static gboolean proxy_socks5_data_ready_connection(World *world); static void proxy_socks5_send_auth(World *world); static void proxy_socks5_send_connection_request(World *world); /*************************** * General proxy functions * ***************************/ void proxy_info_free(proxy_settings *s) { /* Frees the contents of the structure, but not the structure itself. */ if (s == NULL) { return; } g_free(s->server); g_free(s->port); g_free(s->user); g_free(s->password); } void proxy_info_copy(proxy_settings *source, proxy_settings *dest) { dest->type = source->type; dest->server = g_strdup(source->server ? source->server : ""); dest->port = g_strdup(source->port ? source->port : ""); dest->user = g_strdup(source->user ? source->user : ""); dest->password = g_strdup(source->password ? source->password : ""); } /********** * SOCKS4 * **********/ gboolean proxy_socks4_resolved_real_host_cb(gpointer data) { struct resolve_data_s *resolve_data = (struct resolve_data_s *) data; World *world = resolve_data->world; gchar *msg; g_free(resolve_data->host); g_free(resolve_data->port); if (resolve_data->ret != 0) { /* It could happen that the world has been closed */ if (g_list_index(open_worlds, world) != -1) { gchar *msg; gsize len; msg = g_locale_to_utf8(gai_strerror(resolve_data->ret), -1, NULL, &len, NULL); world->errmsg = g_strdup_printf(_("Could not resolve host %s: %s"), world->host, msg); g_free(msg); disconnect_world(world, FALSE); } g_free(resolve_data); /* Only run once */ return FALSE; } /* FIXME: There must be a better way to get the IP address as a number. */ memcpy(&(world->real_ip_for_socks4), resolve_data->addrinfo->ai_addr->sa_data+2, 4); g_free(resolve_data); msg = g_strdup_printf(_("Resolving proxy host %s..."), world->proxy_used.server); ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, msg); g_free(msg); while (gtk_events_pending()) gtk_main_iteration(); resolve_data = g_new(struct resolve_data_s, 1); resolve_data->world = world; resolve_data->host = g_strdup(world->proxy_used.server); resolve_data->port = g_strdup(world->proxy_used.port); resolve_data->ai_family = AF_UNSPEC; resolve_data->callback = continue_connecting_cb; if (!g_thread_create(resolve_name_thread, resolve_data, FALSE, NULL)) { world->errmsg = g_strdup(_("Could not start name-resolution thread.")); disconnect_world(world, FALSE); return FALSE; } return FALSE; } gboolean proxy_socks4_connected_to(World *world) { gchar *msg; guchar *request; size_t request_size; uint16_t port; msg = g_strdup_printf(_("Connected to proxy server %s port %s, sending request..."), world->proxy_used.server, world->proxy_used.port); ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, msg); g_free(msg); /* Create SOCKS4 request */ request_size = SOCKS4_REQUEST_SIZE + strlen(world->proxy_used.user); request = g_malloc(request_size); request[0] = SOCKS4_VER; request[1] = SOCKS_CONNECT; port = htons((uint16_t) atoi(world->port)); memcpy(request + 2, &port, 2); memcpy(request + 4, &world->real_ip_for_socks4, 4); strcpy((gchar *) request + 8, world->proxy_used.user); /* We do not use kc_send because TLS is never used at this point */ send(world->sock, request, request_size, 0); g_free(request); /* Set a callback to read the response */ world->pbuf_size = 0; /* This counter will hold the number of bytes read. So far, nothing has been read yet. */ g_source_remove(world->io_watch_id); world->io_watch_id = g_io_add_watch_full(world->iochan, G_PRIORITY_HIGH, G_IO_IN | G_IO_HUP | G_IO_ERR, proxy_socks4_data_ready_cb, world, NULL); return TRUE; } static gboolean proxy_socks4_data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data) { World *world; ssize_t nread; gchar *msg = NULL; world = (World *) data; /* We borrow world->inbuffer to hold the bytes, and world->pbuf_size to store to number of bytes that have been read. */ nread = recv(world->sock, world->inbuffer + world->pbuf_size, SOCKS4_REPLY_SIZE - world->pbuf_size, 0); if (nread == -1) { world->errmsg = g_strdup(_("Error while reading from proxy host.")); world->pbuf_size = 0; /* disconnect_world() flushes the buffer. */ disconnect_world(world, FALSE); return FALSE; } world->pbuf_size += nread; if (world->pbuf_size < SOCKS4_REPLY_SIZE) { /* Continue reading... */ return TRUE; } /* OK, so we have the whole 8-byte reply */ world->pbuf_size = 0; switch (world->inbuffer[1]) { case SOCKS4_REP_OK: world->pbuf_size = 0; perform_tls_handshake(world); return FALSE; /* Not to be called again. */ case SOCKS4_REP_FAIL: msg = _("request rejected or failed"); break; case SOCKS4_REP_FAIL_NO_IDENTD: msg = _("request failed because identd could not be reached"); break; case SOCKS4_REP_FAIL_UNCONF: msg = _("request failed because client's identd could not confirm the user ID string in the request"); break; } world->errmsg = g_strdup_printf(_("Proxy request failed: %s."), msg); disconnect_world(world, FALSE); return FALSE; } /********** * SOCKS5 * **********/ gboolean proxy_socks5_connected_to(World *world) { gchar *msg; gboolean can_use_auth; size_t request_size; guchar request[SOCKS5_AUTH_METHOD_REQUEST_SIZE]; msg = g_strdup_printf(_("Connected to proxy server %s port %s, negotiating authentication..."), world->proxy_used.server, world->proxy_used.port); ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, msg); g_free(msg); /* Send supported authentication methods */ can_use_auth = (strcmp(world->proxy_used.user, "") != 0); request[0] = SOCKS5_VER; if (can_use_auth) { request[1] = 2; request_size = SOCKS5_AUTH_METHOD_REQUEST_SIZE; } else { request[1] = 1; request_size = SOCKS5_AUTH_METHOD_REQUEST_SIZE - 1; } request[2] = SOCKS5_AUTH_NONE; if (can_use_auth) { request[3] = SOCKS5_AUTH_USERNAME; } /* We do not use kc_send because TLS is never used at this point */ send(world->sock, request, request_size, 0); /* Set a callback to read the response */ world->pbuf_size = 0; /* This counter will hold the number of bytes read. So far, nothing has been read yet. */ world->proxy_used.state = SOCKS5_STATE_INITIAL; g_source_remove(world->io_watch_id); world->io_watch_id = g_io_add_watch_full(world->iochan, G_PRIORITY_HIGH, G_IO_IN | G_IO_HUP | G_IO_ERR, proxy_socks5_data_ready_cb, world, NULL); return TRUE; } static gboolean proxy_socks5_data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data) { World *world; world = (World *) data; switch (world->proxy_used.state) { case SOCKS5_STATE_INITIAL: return proxy_socks5_data_ready_initial(world); case SOCKS5_STATE_AUTH: return proxy_socks5_data_ready_auth(world); case SOCKS5_STATE_CONNECTION: return proxy_socks5_data_ready_connection(world); } return FALSE; } static gboolean proxy_socks5_data_ready_initial(World *world) { ssize_t nread; /* We borrow world->inbuffer to hold the bytes, and world->pbuf_size to store to number of bytes that have been read. */ nread = recv(world->sock, world->inbuffer + world->pbuf_size, SOCKS5_AUTH_METHOD_REPLY_SIZE - world->pbuf_size, 0); if (nread == -1) { world->errmsg = g_strdup(_("Error while reading from proxy host.")); world->pbuf_size = 0; /* disconnect_world() flushes the buffer. */ disconnect_world(world, FALSE); return FALSE; } world->pbuf_size += nread; if (world->pbuf_size < SOCKS5_AUTH_METHOD_REPLY_SIZE) { /* Continue reading... */ return TRUE; } /* See what was selected. */ switch (world->inbuffer[1]) { case SOCKS5_AUTH_REJECTED: world->errmsg = _("No acceptable proxy authentication methods."); world->pbuf_size = 0; /* disconnect_world() flushes the buffer. */ disconnect_world(world, FALSE); return FALSE; case SOCKS5_AUTH_NONE: proxy_socks5_send_connection_request(world); return TRUE; case SOCKS5_AUTH_USERNAME: proxy_socks5_send_auth(world); return TRUE; } return FALSE; } static gboolean proxy_socks5_data_ready_auth(World *world) { ssize_t nread; /* We borrow world->inbuffer to hold the bytes, and world->pbuf_size to store to number of bytes that have been read. */ nread = recv(world->sock, world->inbuffer + world->pbuf_size, SOCKS5_AUTH_REPLY_SIZE - world->pbuf_size, 0); if (nread == -1) { world->errmsg = g_strdup(_("Error while reading from proxy host.")); world->pbuf_size = 0; /* disconnect_world() flushes the buffer. */ disconnect_world(world, FALSE); return FALSE; } world->pbuf_size += nread; if (world->pbuf_size < SOCKS5_AUTH_REPLY_SIZE) { /* Continue reading... */ return TRUE; } /* See what was selected. */ if (world->inbuffer[1] == SOCKS5_AUTH_REP_SUCCESS) { proxy_socks5_send_connection_request(world); return TRUE; } world->errmsg = g_strdup(_("Proxy authentication failed.")); world->pbuf_size = 0; /* disconnect_world() flushes the buffer. */ disconnect_world(world, FALSE); return FALSE; } static gboolean proxy_socks5_data_ready_connection(World *world) { ssize_t size_to_read; ssize_t nread; gchar *msg; /* Things are more complicated here because the reply is variable in length, depending on the address type and its length. First, we read the address type and the first byte of the address, which will be the length of the domain name, or the first byte of an IP address. Then we calculate how many more bytes need to be read. */ /* size_to_read will hold the total number of bytes that must be read */ if (world->pbuf_size < SOCKS5_PARTIAL_CONNECTION_REPLY_SIZE) { size_to_read = SOCKS5_PARTIAL_CONNECTION_REPLY_SIZE; } else { int addr_type = world->inbuffer[3]; switch (addr_type) { case SOCKS5_ADDR_IP4: size_to_read = SOCKS5_PARTIAL_CONNECTION_REPLY_SIZE - 1 + 4 + 2; break; case SOCKS5_ADDR_IP6: size_to_read = SOCKS5_PARTIAL_CONNECTION_REPLY_SIZE - 1 + 16 + 2; break; case SOCKS5_ADDR_NAME: size_to_read = SOCKS5_PARTIAL_CONNECTION_REPLY_SIZE + world->inbuffer[4] + 2; break; default: /* Should never happen */ world->errmsg = g_strdup(_("Unrecognized response from proxy host.")); world->pbuf_size = 0; /* disconnect_world() flushes the buffer. */ disconnect_world(world, FALSE); return FALSE; } } /* We borrow world->inbuffer to hold the bytes, and world->pbuf_size to store to number of bytes that have been read. */ nread = recv(world->sock, world->inbuffer + world->pbuf_size, size_to_read - world->pbuf_size, 0); if (nread == -1) { world->errmsg = g_strdup(_("Error while reading from proxy host.")); world->pbuf_size = 0; /* disconnect_world() flushes the buffer. */ disconnect_world(world, FALSE); return FALSE; } world->pbuf_size += nread; if (world->pbuf_size < size_to_read || size_to_read <= SOCKS5_PARTIAL_CONNECTION_REPLY_SIZE) { /* Continue reading... */ return TRUE; } /* Determine the reply. */ world->pbuf_size = 0; if (world->inbuffer[1] == SOCKS5_CONN_REP_SUCCESS) { perform_tls_handshake(world); return FALSE; /* Not to be called again. */ } if (world->inbuffer[1] > SOCKS5_CONN_MAX_FAILED_REASON) { msg = _("unknown reason code"); } else { msg = _(proxy_socks5_rejection_reasons[world->inbuffer[1]]); } world->errmsg = g_strdup_printf(_("Proxy request failed: %s."), msg); disconnect_world(world, FALSE); return FALSE; } static void proxy_socks5_send_auth(World *world) { gchar *msg; guchar *request; size_t request_size; size_t user_len; size_t pass_len; msg = g_strdup_printf(_("Sending proxy authentication credentials...")); ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, msg); g_free(msg); /* We could warn the user if the values are too big, but this is so unlikely to happen that we ignore it, just clamp the value to avoid a buffer overflow. */ user_len = MIN(strlen(world->proxy_used.user), 255); pass_len = MIN(strlen(world->proxy_used.password), 255); request_size = 3 + user_len + pass_len; request = g_malloc(request_size); request[0] = SOCKS5_AUTH_USERNAME_VER; request[1] = (guint8) user_len; memcpy(request + 2, world->proxy_used.user, user_len); request[2 + user_len] = (guint8) pass_len; memcpy(request + 2 + user_len + 1, world->proxy_used.password, pass_len); /* We do not use kc_send because TLS is never used at this point */ send(world->sock, request, request_size, 0); g_free(request); world->proxy_used.state = SOCKS5_STATE_AUTH; world->pbuf_size = 0; } static void proxy_socks5_send_connection_request(World *world) { gchar *msg; guchar *request; size_t request_size; size_t host_name_len; uint16_t port; msg = g_strdup_printf(_("Sending connection request...")); ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, msg); g_free(msg); /* Create SOCKS5 connection request */ host_name_len = MIN(strlen(world->host), 255); request_size = SOCKS5_CONNECTION_REQUEST_SIZE + host_name_len; request = g_malloc(request_size); request[0] = SOCKS5_VER; request[1] = SOCKS_CONNECT; request[2] = 0; request[3] = SOCKS5_ADDR_NAME; request[4] = (guint8) host_name_len; memcpy(request + 5, world->host, host_name_len); port = htons((uint16_t) atoi(world->port)); memcpy(request + 5 + host_name_len, &port, 2); /* We do not use kc_send because TLS is never used at this point */ send(world->sock, request, request_size, 0); g_free(request); world->proxy_used.state = SOCKS5_STATE_CONNECTION; world->pbuf_size = 0; } kildclient-2.11.1/src/worlds.c0000644000175000017500000023363111566026520013117 00000000000000/* $Id: worlds.c 1170 2011-05-21 21:23:27Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include "kildclient.h" #include "perlscript.h" #include "net.h" /******************** * Type definitions * ********************/ typedef enum { KC_START, KC_KCWORLD, KC_NAME, KC_HOST, KC_PORT, KC_CHARSET, KC_PROXY, KC_AUTO_LOGON, KC_CHARACTER, KC_PASSWORD, KC_DISPLAY, KC_TERMINALFONT, KC_ENTRYFONT, KC_USEBOLD, KC_WRAP, KC_WRAP_COLUMN, KC_TOOLTIPS, KC_STATUSFONT, KC_STATUSBAR, KC_DEFFORECOLOR, KC_DEFBACKCOLOR, KC_DEFBOLDCOLOR, KC_DEFBOLDBACKCOLOR, KC_ANSICOLOR, KC_BACKGROUND, KC_SCROLL, KC_NAMEDISPLAY, KC_LOG, KC_LOGFILE, KC_LOGTIMEFORMAT, KC_FLOOD_PREVENTION, KC_REPEAT_COMMANDS, KC_COMMAND_ECHO, KC_NEVER_HIDE_INPUT, KC_STORE_COMMANDS, KC_COMMAND_HISTORY, KC_AUTO_COMPLETION, KC_COMMAND_SEPARATOR, KC_INPUT_LINES, KC_INPUT_SPELL, KC_CONFIRM_DELETE, KC_PLUGIN_ITEMS, KC_SCRIPTFILE, KC_PLUGINS, KC_PLUGIN, KC_TRIGGERS, KC_TRIGGER, KC_PATTERN, KC_ACTION, KC_HIGHLIGHT, KC_ALIASES, KC_ALIAS, KC_SUBSTITUTION, KC_MACROS, KC_MACRO, KC_KEY, KC_TIMERS, KC_TIMER, KC_VARIABLES, KC_VARIABLE, KC_HOOKSV1, KC_HOOKV1, KC_HOOKSV2, KC_HOOKLISTV2, KC_HOOKV2, KC_PROTOCOLS, KC_MCCP, KC_KEEP_ALIVE, } ParserState; struct WorldParser_s { ParserState state; ParserState previous_state; World *world; gboolean forWorldSelector; char *currHookTrigger; char *currHookName; gboolean currHookEnabled; union { Trigger *currTrigger; Alias *currAlias; Macro *currMacro; Timer *currTimer; char *currVar; char *currPluginFile; char *currHookAction; }; union { gchar **currText; GdkColor *currColor; GtkTreeIter curr_logon_iter; }; }; typedef struct WorldParser_s WorldParser; /*********************** * Function prototypes * ***********************/ static void create_default_world(void); static void world_allocate_space_for_colors(World *world); static void xml_start_element(GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error); static void xml_end_element(GMarkupParseContext *context, const gchar *element_name, gpointer user_data, GError **error); static void xml_text(GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error); static void xml_error_invalid_inside(GError **error, GMarkupParseContext *context); static void xml_error_unknown_attribute(GError **error, const gchar *attribute_name, GMarkupParseContext *context); static void copy_text(char **dest, const char *orig, gsize len); static void read_color(GdkColor *color, const char *text, gsize text_len, GError **error); static void write_color(GString *str, char *name, int idx, GdkColor *color); /******************** * Global variables * ********************/ World *default_world = NULL; GdkColor deffore = { 0, 0xbebe, 0xbebe, 0xbebe }; GdkColor defbold = { 0, 0xffff, 0xffff, 0xffff }; GdkColor defback = { 0, 0, 0, 0 }; GdkColor defboldback = { 0, 0x5f5f, 0x5f5f, 0x5f5f }; GdkColor defansi[] = { { 0, 0, 0, 0 }, /* Black */ { 0, 0x8b8b, 0, 0 }, /* Red */ { 0, 0, 0x7373, 0 }, /* Green */ { 0, 0x8b8b, 0x6969, 0x1414 }, /* Yellow */ { 0, 0, 0, 0x8b8b }, /* Blue */ { 0, 0x8b8b, 0, 0x8b8b }, /* Magenta */ { 0, 0, 0x8b8b, 0x8b8b }, /* Cyan */ { 0, 0xbebe, 0xbebe, 0xbebe }, /* White */ { 0, 0x5f5f, 0x5f5f, 0x5f5f }, /* Bold Black */ { 0, 0xffff, 0, 0 }, /* Bold Red */ { 0, 0, 0xffff, 0 }, /* Bold Green */ { 0, 0xffff, 0xffff, 0 }, /* Bold Yellow */ { 0, 0, 0, 0xffff }, /* Bold Blue */ { 0, 0xffff, 0, 0xffff }, /* Bold Magenta */ { 0, 0, 0xffff, 0xffff }, /* Bold Cyan */ { 0, 0xffff, 0xffff, 0xffff }, /* Bold White */ }; /************************* * File global variables * *************************/ static const GMarkupParser xmlWorldParser = { xml_start_element, xml_end_element, xml_text, NULL, /* passthrough */ NULL /* error */ }; World * create_new_world(gboolean load_defaults) { World *world; world = g_new0(World, 1); world_allocate_space_for_colors(world); world->startup_plugins = GTK_TREE_MODEL(gtk_list_store_new(N_SPLUGIN_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING)); world->logon_characters = GTK_TREE_MODEL(gtk_list_store_new(N_LOGON_COLUMNS, G_TYPE_STRING, G_TYPE_STRING)); world->proxy.type = PROXY_USE_GLOBAL; if (!load_defaults) { return world; } if (!default_world) { create_default_world(); } /* Create pbuffer */ world->pbuffer = (guchar *) g_malloc(MAX_BUFFER); world->pbuf_alloc_size = MAX_BUFFER; /* Copy defaults */ world->charset = g_strdup(default_world->charset); world->charset_index = default_world->charset_index; world->terminalfont = g_strdup(default_world->terminalfont); world->entryfont = g_strdup(default_world->entryfont); world->statusfont = g_strdup(default_world->statusfont); world->usebold = default_world->usebold; world->wrap = default_world->wrap; world->wrap_indent = default_world->wrap_indent; world->use_wrap_column = default_world->use_wrap_column; world->wrap_column = default_world->wrap_column; world->use_tooltips = default_world->use_tooltips; memcpy(world->deffore, default_world->deffore, sizeof(GdkColor)); memcpy(world->defbold, default_world->defbold, sizeof(GdkColor)); memcpy(world->defback, default_world->defback, sizeof(GdkColor)); memcpy(world->defboldback, default_world->defboldback, sizeof(GdkColor)); memcpy(world->ansicolors, default_world->ansicolors, 16*sizeof(GdkColor)); world->name_display_style = default_world->name_display_style; world->name_display_pattern = g_strdup(default_world->name_display_pattern); world->scrollOutput = default_world->scrollOutput; world->buffer_lines = default_world->buffer_lines; world->repeat_commands = default_world->repeat_commands; world->cmd_echo = default_world->cmd_echo; world->never_hide_input = default_world->never_hide_input; world->store_commands = default_world->store_commands; world->commands_to_save = default_world->commands_to_save; world->input_n_lines = default_world->input_n_lines; world->input_n_lines_saved = default_world->input_n_lines_saved; world->spell = default_world->spell; if (default_world->spell_language) world->spell_language = g_strdup(default_world->spell_language); world->autocompletion = default_world->autocompletion; world->autocompl_minprefix = default_world->autocompl_minprefix; strcpy(world->command_separator, default_world->command_separator); world->confirm_delete = default_world->confirm_delete; world->flood_prevention = default_world->flood_prevention; world->max_equal_commands = default_world->max_equal_commands; world->flood_prevention_command = g_strdup(default_world->flood_prevention_command); world->repeat_count = 1; world->log_timeformat = g_strdup(default_world->log_timeformat); world->log_add_time = default_world->log_add_time; world->log_autostart = default_world->log_autostart; world->keep_alive = default_world->keep_alive; /* Initialize command history list. */ world->cmd_list = GTK_TREE_MODEL(gtk_list_store_new(N_CMDLIST_COLUMNS, G_TYPE_STRING, G_TYPE_STRING)); gtk_list_store_append(GTK_LIST_STORE(world->cmd_list), &world->current_cmd); gtk_list_store_set(GTK_LIST_STORE(world->cmd_list), &world->current_cmd, CMDLIST_COL_COMMAND, NULL, CMDLIST_COL_TENTATIVE, "", -1); world->cmd_has_been_edited = 1; /* Create timer to hold the time since last writing of data */ world->last_data_written = g_timer_new(); return world; } static void create_default_world(void) { const gchar *kilddir; gchar *default_world_file; default_world = g_new0(World, 1); world_allocate_space_for_colors(default_world); /* Built-in defaults */ default_world->charset = g_strdup("ISO-8859-1"); default_world->charset_index = -1; default_world->terminalfont = g_strdup(DEFAULT_TERMINAL_FONT); default_world->entryfont = g_strdup(DEFAULT_TERMINAL_FONT); default_world->statusfont = g_strdup("Sans 8"); default_world->usebold = TRUE; default_world->wrap = TRUE; default_world->wrap_indent = 0; default_world->wrap_column = 40; default_world->use_wrap_column = FALSE; default_world->use_tooltips = TRUE; memcpy(default_world->deffore, &deffore, sizeof(GdkColor)); memcpy(default_world->defbold, &defbold, sizeof(GdkColor)); memcpy(default_world->defback, &defback, sizeof(GdkColor)); memcpy(default_world->defboldback, &defboldback, sizeof(GdkColor)); memcpy(default_world->ansicolors, &defansi, 16*sizeof(GdkColor)); default_world->name_display_style = NAME_DISPLAY_WORLD; default_world->name_display_pattern = g_strdup("%Kw [%Kc]"); default_world->scrollOutput = FALSE; default_world->buffer_lines = 2000; default_world->repeat_commands = FALSE; default_world->cmd_echo = TRUE; default_world->never_hide_input = FALSE; default_world->store_commands = TRUE; default_world->commands_to_save = 50; default_world->input_n_lines = 1; default_world->input_n_lines_saved = 2; default_world->spell = 1; default_world->autocompletion = TRUE; default_world->autocompl_minprefix = 3; strcpy(default_world->command_separator, "%;"); default_world->confirm_delete = TRUE; default_world->flood_prevention = 1; default_world->max_equal_commands = 20; default_world->flood_prevention_command = g_strdup("look"); default_world->log_timeformat = g_strdup(DEFAULT_LOGTIME_FORMAT); default_world->log_add_time = TRUE; default_world->log_autostart = FALSE; default_world->keep_alive = FALSE; /* Now load everything from the file */ kilddir = get_kildclient_directory_path(); default_world_file = g_build_filename(kilddir, "defworld.cfg", NULL); if (!load_world_from_file(default_world_file, default_world, FALSE, NULL)) { default_world->file = default_world_file; } else { g_free(default_world_file); } } static void world_allocate_space_for_colors(World *world) { world->deffore = g_new0(GdkColor, 1); world->defbold = g_new0(GdkColor, 1); world->defback = g_new0(GdkColor, 1); world->defboldback = g_new0(GdkColor, 1); world->ansicolors = g_new0(GdkColor, 16); } void free_world(World *world) { if (world->has_unread_text) { --worlds_with_new_text; adjust_window_title(); } g_free(world->name); g_free(world->display_name); g_free(world->new_text_name); g_free(world->file); g_free(world->charset); g_free(world->host); g_free(world->port); g_free(world->host_ip); g_free(world->pbuffer); if (world->character_used) { gtk_tree_row_reference_free(world->character_used); } g_object_unref(world->logon_characters); g_free(world->terminalfont); g_free(world->entryfont); g_free(world->statusfont); g_free(world->deffore); g_free(world->defbold); g_free(world->defback); g_free(world->defboldback); g_free(world->ansicolors); g_free(world->name_display_pattern); proxy_info_free(&world->proxy); proxy_info_free(&world->proxy_used); g_free(world->scriptfile); if (world->perl_interpreter) { PERL_SET_CONTEXT(world->perl_interpreter); } g_slist_foreach(world->plugins, (GFunc) free_plugin, world); g_slist_free(world->plugins); g_slist_foreach(world->triggers, (GFunc) free_trigger, NULL); g_slist_free(world->triggers); if (world->trigger_action_re) { SvREFCNT_dec(world->trigger_action_re); } g_slist_foreach(world->aliases, (GFunc) free_alias, NULL); g_slist_free(world->aliases); g_slist_foreach(world->macros, (GFunc) free_macro, NULL); g_slist_free(world->macros); g_slist_foreach(world->timers, (GFunc) free_timer, NULL); g_slist_free(world->timers); g_slist_foreach(world->hooks.OnConnect, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnConnect); g_slist_foreach(world->hooks.OnDisconnect, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnDisconnect); g_slist_foreach(world->hooks.OnReceivedText, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnReceivedText); g_slist_foreach(world->hooks.OnSentCommand, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnSentCommand); g_slist_foreach(world->hooks.OnGetFocus, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnGetFocus); g_slist_foreach(world->hooks.OnLoseFocus, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnLoseFocus); g_slist_foreach(world->hooks.OnCloseConnected, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnCloseConnected); g_slist_foreach(world->permanent_variables, (GFunc) free_permanent_variable, NULL); g_slist_free(world->permanent_variables); g_free(world->flood_prevention_command); g_free(world->last_command); if (world->cmd_list) { g_object_unref(world->cmd_list); } stop_log(world); g_free(world->log_file_name); g_free(world->log_timeformat); g_free(world->log_actual_file); if (world->connected_at_least_once) { destruct_perl_script(world->perl_interpreter); } if (world->dlgEditWorld) { gtk_widget_destroy(world->dlgEditWorld); g_object_unref(world->hooks.OnConnect_model_filter); g_object_unref(world->hooks.OnDisconnect_model_filter); g_object_unref(world->hooks.OnReceivedText_model_filter); g_object_unref(world->hooks.OnSentCommand_model_filter); g_object_unref(world->hooks.OnGetFocus_model_filter); g_object_unref(world->hooks.OnLoseFocus_model_filter); g_object_unref(world->hooks.OnCloseConnected_model_filter); g_slist_foreach(world->selected_OnConnect_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnConnect_hooks); g_slist_foreach(world->selected_OnDisconnect_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnDisconnect_hooks); g_slist_foreach(world->selected_OnReceivedText_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnReceivedText_hooks); g_slist_foreach(world->selected_OnSentCommand_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnSentCommand_hooks); g_slist_foreach(world->selected_OnGetFocus_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnGetFocus_hooks); g_slist_foreach(world->selected_OnLoseFocus_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnLoseFocus_hooks); g_slist_foreach(world->selected_OnCloseConnected_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnCloseConnected_hooks); } if (world->dlgMLSend) { gtk_widget_destroy(world->dlgMLSend); } if (world->dlgCmdHistoryFind) { gtk_widget_destroy(world->dlgCmdHistoryFind); } if (world->dlgCmdHistory) { gtk_widget_destroy(world->dlgCmdHistory); } g_free(world->cmdfind_string); if (world->cmdfind_row) { gtk_tree_row_reference_free(world->cmdfind_row); } if (world->dlgTestTriggers) { gtk_widget_destroy(world->dlgTestTriggers); } if (world->ui_builder) { g_object_unref(world->ui_builder); } g_object_unref(world->startup_plugins); if (world->last_data_written) { g_timer_destroy(world->last_data_written); } g_free(world); } void remove_plugin_objects(World *world, Plugin *plugin) { GSList *iter; GSList *next; for (iter = world->triggers; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Trigger *trigger = (Trigger *) iter->data; if (trigger->owner_plugin == plugin) { remove_trigger(world, iter); } } for (iter = world->aliases; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Alias *alias = (Alias *) iter->data; if (alias->owner_plugin == plugin) { remove_alias(world, iter); } } for (iter = world->macros; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Macro *macro = (Macro *) iter->data; if (macro->owner_plugin == plugin) { remove_macro(world, iter); } } for (iter = world->timers; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Timer *timer = (Timer *) iter->data; if (timer->owner_plugin == plugin) { remove_timer(world, iter); } } for (iter = world->hooks.OnConnect; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Hook *hook = (Hook *) iter->data; if (hook->owner_plugin == plugin) { delete_hook(world, "OnConnect", 0, iter); } } for (iter = world->hooks.OnDisconnect; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Hook *hook = (Hook *) iter->data; if (hook->owner_plugin == plugin) { delete_hook(world, "OnDisconnect", 0, iter); } } for (iter = world->hooks.OnReceivedText; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Hook *hook = (Hook *) iter->data; if (hook->owner_plugin == plugin) { delete_hook(world, "OnReceivedText", 0, iter); } } for (iter = world->hooks.OnSentCommand; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Hook *hook = (Hook *) iter->data; if (hook->owner_plugin == plugin) { delete_hook(world, "OnSentCommand", 0, iter); } } for (iter = world->hooks.OnGetFocus; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Hook *hook = (Hook *) iter->data; if (hook->owner_plugin == plugin) { delete_hook(world, "OnGetFocus", 0, iter); } } for (iter = world->hooks.OnLoseFocus; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Hook *hook = (Hook *) iter->data; if (hook->owner_plugin == plugin) { delete_hook(world, "OnLoseFocus", 0, iter); } } for (iter = world->hooks.OnCloseConnected; iter; iter = next) { /* Must do this here, since the list item may be deleted. */ next = iter->next; Hook *hook = (Hook *) iter->data; if (hook->owner_plugin == plugin) { delete_hook(world, "OnCloseConnected", 0, iter); } } } void create_world_from_parameters(World *world, gchar *host, gchar *port, gchar *user, gchar *password) { world->name = g_strdup(_("Unnamed world")); world->host = host; if (port && strcmp(port, "") != 0) { world->port = port; } else { world->port = g_strdup("4000"); g_free(port); } if (user && strcmp(user, "") != 0) { GtkTreePath *treepath; GtkTreeIter iter; /* Currently there is no way of selecting another connection style */ world->connection_style = DIKU; gtk_list_store_append(GTK_LIST_STORE(world->logon_characters), &iter); gtk_list_store_set(GTK_LIST_STORE(world->logon_characters), &iter, LOGON_CHAR, user, LOGON_PASS, password, -1); treepath = gtk_tree_model_get_path(world->logon_characters, &iter); world->character_used = gtk_tree_row_reference_new(world->logon_characters, treepath); gtk_tree_path_free(treepath); prepare_display_name(world); } else { world->character_used = NULL; /* No auto-logon */ /* Since there is never a character in this case, it makes no sense to use the default world settings for display name. */ world->display_name = g_strdup(world->name); world->new_text_name = g_strdup_printf("%s", world->display_name); } g_free(user); g_free(password); } gboolean load_world_from_file(const char *file, World *world, gboolean forWorldSelector, GError **error) { FILE *fp; char buffer[MAX_BUFFER]; gboolean success; WorldParser *parser; GMarkupParseContext *parseContext; fp = fopen(file, "r"); if (!fp) { g_set_error(error, G_FILE_ERROR, G_FILE_ERROR_NOENT, _("Could not open file: %s"), g_strerror(errno)); return FALSE; } world->file = strdup(file); world->charset_index = -1; parser = g_new0(WorldParser, 1); parser->state = KC_START; parser->world = world; parser->forWorldSelector = forWorldSelector; parseContext = g_markup_parse_context_new(&xmlWorldParser, 0, parser, NULL); success = FALSE; while (1) { if (fgets(buffer, MAX_BUFFER, fp)) { success = g_markup_parse_context_parse(parseContext, buffer, strlen(buffer), error); } if (feof(fp)) { success &= g_markup_parse_context_end_parse(parseContext, error); break; } if (!success) break; } fclose(fp); g_markup_parse_context_free(parseContext); g_free(parser); return success; } static void xml_start_element(GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error) { WorldParser *parser = (WorldParser *)user_data; switch (parser->state) { case KC_START: if (strcmp(element_name, "kcworld") == 0 || strcmp(element_name, "kcworld-export") == 0) { parser->state = KC_KCWORLD; } else { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, _("Invalid top-level element '%s'"), element_name); } break; case KC_KCWORLD: if (strcmp(element_name, "name") == 0) { parser->currText = &parser->world->name; parser->state = KC_NAME; } else if (strcmp(element_name, "host") == 0) { parser->currText = &parser->world->host; parser->state = KC_HOST; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "tls") == 0) { parser->world->use_tls = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "port") == 0) { parser->currText = &parser->world->port; parser->state = KC_PORT; } else if (strcmp(element_name, "charset") == 0) { parser->currText = &parser->world->charset; parser->state = KC_CHARSET; g_free(parser->world->charset); } else if (strcmp(element_name, "proxy") == 0) { parser->state = KC_PROXY; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "type") == 0) { parser->world->proxy.type = atoi(*attribute_values); } else if (strcmp(*attribute_names, "server") == 0) { parser->world->proxy.server = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "port") == 0) { parser->world->proxy.port = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "user") == 0) { parser->world->proxy.user = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "password") == 0) { parser->world->proxy.password = g_strdup(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "display") == 0) { parser->state = KC_DISPLAY; } else if (strcmp(element_name, "scroll") == 0) { parser->state = KC_SCROLL; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "on-output") == 0) { parser->world->scrollOutput = atoi(*attribute_values); } else if (strcmp(*attribute_names, "lines") == 0) { parser->world->buffer_lines = atol(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "name-display") == 0) { parser->state = KC_NAMEDISPLAY; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "style") == 0) { parser->world->name_display_style = atoi(*attribute_values); } else if (strcmp(*attribute_names, "pattern") == 0) { parser->world->name_display_pattern = g_strdup(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "log") == 0) { parser->state = KC_LOG; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "autostart") == 0) { parser->world->log_autostart = atoi(*attribute_values); } else if (strcmp(*attribute_names, "addtime") == 0) { parser->world->log_add_time = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "auto-logon") == 0) { parser->state = KC_AUTO_LOGON; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "style") == 0) { parser->world->connection_style = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "flood-prevention") == 0) { parser->currText = &parser->world->flood_prevention_command; parser->state = KC_FLOOD_PREVENTION; if (parser->forWorldSelector) { break; } g_free(parser->world->flood_prevention_command); while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->flood_prevention = atoi(*attribute_values); } else if (strcmp(*attribute_names, "max-repeat") == 0) { parser->world->max_equal_commands = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "repeat-commands") == 0) { parser->state = KC_REPEAT_COMMANDS; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->repeat_commands = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "command-echo") == 0) { parser->state = KC_COMMAND_ECHO; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->cmd_echo = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "never-hide-input") == 0) { parser->state = KC_NEVER_HIDE_INPUT; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->never_hide_input = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "store-commands") == 0) { parser->state = KC_STORE_COMMANDS; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->store_commands = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "command-history") == 0) { parser->state = KC_COMMAND_HISTORY; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "size") == 0) { parser->world->commands_to_save = atoi(*attribute_values); } else if (strcmp(*attribute_names, "ignore-up-down-keys") == 0) { parser->world->ignore_up_down_keys = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "auto-completion") == 0) { parser->state = KC_AUTO_COMPLETION; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->autocompletion = atoi(*attribute_values); } else if (strcmp(*attribute_names, "minprefix") == 0) { parser->world->autocompl_minprefix = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "command-separator") == 0) { parser->state = KC_COMMAND_SEPARATOR; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "separator") == 0) { strcpy(parser->world->command_separator, *attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "input-lines") == 0) { parser->state = KC_INPUT_LINES; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "size") == 0) { parser->world->input_n_lines = atoi(*attribute_values); } else if (strcmp(*attribute_names, "save") == 0) { parser->world->input_n_lines_saved = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "input-spell") == 0) { parser->state = KC_INPUT_SPELL; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "active") == 0) { parser->world->spell = atoi(*attribute_values); } else if (strcmp(*attribute_names, "language") == 0) { if (strcmp(*attribute_values, "") != 0) { parser->world->spell_language = g_strdup(*attribute_values); } } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "confirm-delete") == 0) { parser->state = KC_CONFIRM_DELETE; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "confirm") == 0) { parser->world->confirm_delete = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "plugin-items") == 0) { parser->state = KC_PLUGIN_ITEMS; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "show") == 0) { parser->world->show_plugin_items = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "keep-alive") == 0) { parser->state = KC_KEEP_ALIVE; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->keep_alive = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "scriptfile") == 0) { parser->currText = &parser->world->scriptfile; parser->state = KC_SCRIPTFILE; } else if (strcmp(element_name, "plugins") == 0) { parser->state = KC_PLUGINS; } else if (strcmp(element_name, "triggers") == 0) { parser->state = KC_TRIGGERS; } else if (strcmp(element_name, "aliases") == 0) { parser->state = KC_ALIASES; } else if (strcmp(element_name, "macros") == 0) { parser->state = KC_MACROS; } else if (strcmp(element_name, "timers") == 0) { parser->state = KC_TIMERS; } else if (strcmp(element_name, "variables") == 0) { parser->state = KC_VARIABLES; } else if (strcmp(element_name, "hooks") == 0) { parser->state = KC_HOOKSV1; } else if (strcmp(element_name, "hooksv2") == 0) { parser->state = KC_HOOKSV2; } else if (strcmp(element_name, "protocols") == 0) { parser->state = KC_PROTOCOLS; } else { xml_error_invalid_inside(error, context); } break; case KC_DISPLAY: if (strcmp(element_name, "terminalfont") == 0) { parser->currText = &parser->world->terminalfont; parser->state = KC_TERMINALFONT; g_free(parser->world->terminalfont); } else if (strcmp(element_name, "entryfont") == 0) { parser->currText = &parser->world->entryfont; parser->state = KC_ENTRYFONT; g_free(parser->world->entryfont); } else if (strcmp(element_name, "usebold") == 0) { parser->state = KC_USEBOLD; } else if (strcmp(element_name, "wrap") == 0) { parser->state = KC_WRAP; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->wrap = atoi(*attribute_values); } else if (strcmp(*attribute_names, "indent") == 0) { parser->world->wrap_indent = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "tooltips") == 0) { parser->state = KC_TOOLTIPS; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->use_tooltips = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "statusfont") == 0) { parser->currText = &parser->world->statusfont; parser->state = KC_STATUSFONT; g_free(parser->world->statusfont); } else if (strcmp(element_name, "statusbar") == 0) { parser->state = KC_STATUSBAR; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "ctime") == 0) { parser->world->ctime_type = atoi(*attribute_values); } else if (strcmp(*attribute_names, "itime") == 0) { parser->world->itime_type = atoi(*attribute_values); } else if (strcmp(*attribute_names, "itime-behavior") == 0) { parser->world->itime_reset_activate = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else if (strcmp(element_name, "defforecolor") == 0) { parser->currColor = parser->world->deffore; parser->state = KC_DEFFORECOLOR; } else if (strcmp(element_name, "defbackcolor") == 0) { parser->currColor = parser->world->defback; parser->state = KC_DEFBACKCOLOR; } else if (strcmp(element_name, "defboldcolor") == 0) { parser->currColor = parser->world->defbold; parser->state = KC_DEFBOLDCOLOR; } else if (strcmp(element_name, "defboldbackcolor") == 0) { parser->currColor = parser->world->defboldback; parser->state = KC_DEFBOLDBACKCOLOR; } else if (strcmp(element_name, "ansicolor") == 0) { parser->currColor = parser->world->ansicolors; parser->state = KC_ANSICOLOR; } else if (strcmp(element_name, "background") == 0) { parser->state = KC_BACKGROUND; /* Ignored, but kept for backwards compatibility. */ } else { xml_error_invalid_inside(error, context); } break; case KC_WRAP: if (strcmp(element_name, "wrap-column") == 0) { parser->state = KC_WRAP_COLUMN; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->world->use_wrap_column = atoi(*attribute_values); } else if (strcmp(*attribute_names, "column") == 0) { parser->world->wrap_column = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_AUTO_LOGON: if (strcmp(element_name, "character") == 0) { parser->state = KC_CHARACTER; } else if (strcmp(element_name, "password") == 0) { parser->state = KC_PASSWORD; } else { xml_error_invalid_inside(error, context); } break; case KC_LOG: if (strcmp(element_name, "logfile") == 0) { parser->currText = &parser->world->log_file_name; parser->state = KC_LOGFILE; } else if (strcmp(element_name, "logtimeformat") == 0) { g_free(parser->world->log_timeformat); parser->currText = &parser->world->log_timeformat; parser->state = KC_LOGTIMEFORMAT; } else { xml_error_invalid_inside(error, context); } break; case KC_PLUGINS: if (strcmp(element_name, "plugin") == 0) { parser->currText = &parser->currPluginFile; parser->state = KC_PLUGIN; } else { xml_error_invalid_inside(error, context); } break; case KC_TRIGGERS: if (strcmp(element_name, "trigger") == 0) { parser->state = KC_TRIGGER; if (parser->forWorldSelector) { break; } parser->currTrigger = new_trigger(); while (*attribute_names) { if (strcmp(*attribute_names, "name") == 0) { parser->currTrigger->name = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "gag") == 0) { parser->currTrigger->gag_output = atoi(*attribute_values); } else if (strcmp(*attribute_names, "gaglog") == 0) { parser->currTrigger->gag_log = atoi(*attribute_values); } else if (strcmp(*attribute_names, "enabled") == 0) { parser->currTrigger->enabled = atoi(*attribute_values); } else if (strcmp(*attribute_names, "keepexecuting") == 0) { parser->currTrigger->keepexecuting = atoi(*attribute_values); } else if (strcmp(*attribute_names, "rewriter") == 0) { parser->currTrigger->rewriter = atoi(*attribute_values); } else if (strcmp(*attribute_names, "ignorecase") == 0) { parser->currTrigger->ignore_case = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_ALIASES: if (strcmp(element_name, "alias") == 0) { parser->state = KC_ALIAS; if (parser->forWorldSelector) { break; } parser->currAlias = g_new0(Alias, 1); while (*attribute_names) { if (strcmp(*attribute_names, "name") == 0) { parser->currAlias->name = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "perleval") == 0) { parser->currAlias->perl_eval = atoi(*attribute_values); } else if (strcmp(*attribute_names, "enabled") == 0) { parser->currAlias->enabled = atoi(*attribute_values); } else if (strcmp(*attribute_names, "ignorecase") == 0) { parser->currAlias->ignore_case = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_TIMERS: if (strcmp(element_name, "timer") == 0) { parser->state = KC_TIMER; if (parser->forWorldSelector) { break; } parser->currTimer = g_new0(Timer, 1); parser->currTimer->for_world = parser->world; parser->currText = &parser->currTimer->action; while (*attribute_names) { if (strcmp(*attribute_names, "name") == 0) { parser->currTimer->name = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "interval") == 0) { parser->currTimer->interval = atoi(*attribute_values); } else if (strcmp(*attribute_names, "count") == 0) { parser->currTimer->count = atoi(*attribute_values); } else if (strcmp(*attribute_names, "enabled") == 0) { parser->currTimer->enabled = atoi(*attribute_values); } else if (strcmp(*attribute_names, "temporary") == 0) { parser->currTimer->temporary = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_MACROS: if (strcmp(element_name, "macro") == 0) { parser->state = KC_MACRO; if (parser->forWorldSelector) { break; } parser->currMacro = g_new0(Macro, 1); while (*attribute_names) { if (strcmp(*attribute_names, "name") == 0) { parser->currMacro->name = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "enabled") == 0) { parser->currMacro->enabled = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_VARIABLES: if (strcmp(element_name, "variable") == 0) { parser->state = KC_VARIABLE; parser->currText = &parser->currVar; } else { xml_error_invalid_inside(error, context); } break; case KC_HOOKSV1: // Kept for backward compatibility if (strcmp(element_name, "hook") == 0) { parser->state = KC_HOOKV1; parser->previous_state = KC_HOOKSV1; if (parser->forWorldSelector) { break; } parser->currText = &parser->currHookAction; while (*attribute_names) { if (strcmp(*attribute_names, "for") == 0) { parser->currHookTrigger = g_strdup(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_HOOKSV2: if (strcmp(element_name, "hooklistv2") == 0) { parser->state = KC_HOOKLISTV2; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "for") == 0) { parser->currHookTrigger = g_strdup(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_HOOKLISTV2: if (strcmp(element_name, "hookv2") == 0) { parser->state = KC_HOOKV2; parser->previous_state = KC_HOOKLISTV2; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "name") == 0) { parser->currHookName = g_strdup(*attribute_values); } else if (strcmp(*attribute_names, "enabled") == 0) { parser->currHookEnabled = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } parser->currText = &parser->currHookAction; } else { xml_error_invalid_inside(error, context); } break; case KC_TRIGGER: if (strcmp(element_name, "pattern") == 0) { parser->currText = &parser->currTrigger->pattern; parser->state = KC_PATTERN; parser->previous_state = KC_TRIGGER; } else if (strcmp(element_name, "action") == 0) { parser->currText = &parser->currTrigger->action; parser->state = KC_ACTION; } else if (strcmp(element_name, "highlight") == 0) { parser->state = KC_HIGHLIGHT; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "enabled") == 0) { parser->currTrigger->highlight = atoi(*attribute_values); } else if (strcmp(*attribute_names, "target") == 0) { parser->currTrigger->high_target = atoi(*attribute_values); } else if (strcmp(*attribute_names, "fg") == 0) { parser->currTrigger->high_fg_color = atoi(*attribute_values); } else if (strcmp(*attribute_names, "bg") == 0) { parser->currTrigger->high_bg_color = atoi(*attribute_values); } else if (strcmp(*attribute_names, "italics") == 0) { parser->currTrigger->high_italic = atoi(*attribute_values); } else if (strcmp(*attribute_names, "strike") == 0) { parser->currTrigger->high_strike = atoi(*attribute_values); } else if (strcmp(*attribute_names, "underline") == 0) { parser->currTrigger->high_underline = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; case KC_ALIAS: if (strcmp(element_name, "pattern") == 0) { parser->currText = &parser->currAlias->pattern; parser->state = KC_PATTERN; parser->previous_state = KC_ALIAS; } else if (strcmp(element_name, "substitution") == 0) { parser->currText = &parser->currAlias->substitution; parser->state = KC_SUBSTITUTION; } else { xml_error_invalid_inside(error, context); } break; case KC_MACRO: if (strcmp(element_name, "key") == 0) { parser->state = KC_KEY; } else if (strcmp(element_name, "action") == 0) { parser->currText = &parser->currMacro->action; parser->state = KC_ACTION; parser->previous_state = KC_MACRO; } else { xml_error_invalid_inside(error, context); } break; case KC_PROTOCOLS: if (strcmp(element_name, "mccp") == 0) { parser->state = KC_MCCP; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "behavior") == 0) { parser->world->mccp_behavior = atoi(*attribute_values); } else { xml_error_unknown_attribute(error, *attribute_names, context); } ++attribute_names; ++attribute_values; } } else { xml_error_invalid_inside(error, context); } break; default: xml_error_invalid_inside(error, context); break; } } static void xml_end_element(GMarkupParseContext *context, const gchar *element_name, gpointer user_data, GError **error) { WorldParser *parser = (WorldParser *)user_data; switch (parser->state) { case KC_START: g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("Internal error: element '%s' ends when in START mode"), element_name); break; case KC_NAME: case KC_HOST: case KC_PORT: case KC_CHARSET: case KC_PROXY: case KC_AUTO_LOGON: case KC_DISPLAY: case KC_SCROLL: case KC_FLOOD_PREVENTION: case KC_REPEAT_COMMANDS: case KC_COMMAND_ECHO: case KC_NEVER_HIDE_INPUT: case KC_STORE_COMMANDS: case KC_COMMAND_HISTORY: case KC_AUTO_COMPLETION: case KC_COMMAND_SEPARATOR: case KC_INPUT_LINES: case KC_INPUT_SPELL: case KC_CONFIRM_DELETE: case KC_NAMEDISPLAY: case KC_LOG: case KC_PLUGIN_ITEMS: case KC_SCRIPTFILE: case KC_PLUGINS: case KC_TRIGGERS: case KC_ALIASES: case KC_MACROS: case KC_TIMERS: case KC_VARIABLES: case KC_HOOKSV1: case KC_HOOKSV2: case KC_PROTOCOLS: case KC_KEEP_ALIVE: parser->state = KC_KCWORLD; break; case KC_CHARACTER: case KC_PASSWORD: parser->state = KC_AUTO_LOGON; break; case KC_TERMINALFONT: case KC_ENTRYFONT: case KC_USEBOLD: case KC_WRAP: case KC_TOOLTIPS: case KC_STATUSFONT: case KC_STATUSBAR: case KC_DEFFORECOLOR: case KC_DEFBACKCOLOR: case KC_DEFBOLDCOLOR: case KC_DEFBOLDBACKCOLOR: case KC_ANSICOLOR: case KC_BACKGROUND: parser->state = KC_DISPLAY; break; case KC_WRAP_COLUMN: parser->state = KC_WRAP; break; case KC_LOGFILE: case KC_LOGTIMEFORMAT: parser->state = KC_LOG; break; case KC_PLUGIN: if (!parser->forWorldSelector) { parser->world->startup_plugin_files = g_slist_append(parser->world->startup_plugin_files, parser->currPluginFile); parser->currPluginFile = NULL; } parser->state = KC_PLUGINS; break; case KC_TRIGGER: if (!parser->forWorldSelector) { parser->world->triggers = g_slist_append(parser->world->triggers, parser->currTrigger); parser->currTrigger = NULL; ++parser->world->trigger_pos; } parser->state = KC_TRIGGERS; break; case KC_ALIAS: if (!parser->forWorldSelector) { parser->world->aliases = g_slist_append(parser->world->aliases, parser->currAlias); parser->currAlias = NULL; ++parser->world->alias_pos; } parser->state = KC_ALIASES; break; case KC_MACRO: if (!parser->forWorldSelector) { parser->world->macros = g_slist_append(parser->world->macros, parser->currMacro); parser->currMacro = NULL; ++parser->world->macro_pos; } parser->state = KC_MACROS; break; case KC_TIMER: if (!parser->forWorldSelector) { parser->world->timers = g_slist_append(parser->world->timers, parser->currTimer); parser->currTimer = NULL; ++parser->world->timer_pos; } parser->state = KC_TIMERS; break; case KC_VARIABLE: if (!parser->forWorldSelector) { parser->world->permanent_variables = g_slist_append(parser->world->permanent_variables, parser->currVar); parser->currVar = NULL; } parser->state = KC_VARIABLES; break; case KC_HOOKV1: case KC_HOOKV2: if (!parser->forWorldSelector) { connect_hook(parser->world, parser->currHookTrigger, -1, parser->currHookAction, parser->currHookName, parser->currHookEnabled); if (parser->state == KC_HOOKV1) { g_free(parser->currHookTrigger); } parser->currHookName = NULL; } parser->state = parser->previous_state; break; case KC_HOOKLISTV2: if (!parser->forWorldSelector) { g_free(parser->currHookTrigger); } parser->state = KC_HOOKSV2; break; case KC_PATTERN: case KC_ACTION: parser->state = parser->previous_state; break; case KC_HIGHLIGHT: parser->state = KC_TRIGGER; break; case KC_SUBSTITUTION: parser->state = KC_ALIAS; break; case KC_KEY: parser->state = KC_MACRO; break; case KC_MCCP: parser->state = KC_PROTOCOLS; break; case KC_KCWORLD: parser->state = KC_START; break; } } static void xml_text(GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **error) { WorldParser *parser = (WorldParser *)user_data; gchar *tmp; if (parser->forWorldSelector && parser->state != KC_NAME && parser->state != KC_CHARACTER && parser->state != KC_PASSWORD) { return; } switch (parser->state) { case KC_NAME: case KC_HOST: case KC_PORT: case KC_CHARSET: case KC_TERMINALFONT: case KC_ENTRYFONT: case KC_STATUSFONT: case KC_FLOOD_PREVENTION: case KC_LOGFILE: case KC_LOGTIMEFORMAT: case KC_SCRIPTFILE: case KC_PLUGIN: case KC_PATTERN: case KC_ACTION: case KC_SUBSTITUTION: case KC_TIMER: case KC_VARIABLE: case KC_HOOKV1: case KC_HOOKV2: copy_text(parser->currText, text, text_len); break; case KC_CHARACTER: /* When loading to get the names to compare against passed command-line options, characters need not be loaded. */ if (parser->world->logon_characters) { copy_text(&tmp, text, text_len); gtk_list_store_append(GTK_LIST_STORE(parser->world->logon_characters), &parser->curr_logon_iter); gtk_list_store_set(GTK_LIST_STORE(parser->world->logon_characters), &parser->curr_logon_iter, LOGON_CHAR, tmp, -1); g_free(tmp); } break; case KC_PASSWORD: if (parser->world->logon_characters) { copy_text(&tmp, text, text_len); gtk_list_store_set(GTK_LIST_STORE(parser->world->logon_characters), &parser->curr_logon_iter, LOGON_PASS, tmp, -1); g_free(tmp); } break; case KC_USEBOLD: parser->world->usebold = text[0] - '0'; break; case KC_DEFFORECOLOR: case KC_DEFBACKCOLOR: case KC_DEFBOLDCOLOR: case KC_DEFBOLDBACKCOLOR: case KC_ANSICOLOR: read_color(parser->currColor, text, text_len, error); break; case KC_KEY: { guint keyval; GdkModifierType modifiers; gchar *key; copy_text(&key, text, text_len); gtk_accelerator_parse(key, &keyval, &modifiers); if (keyval) { parser->currMacro->keyval = keyval; parser->currMacro->modifiers = modifiers; } else { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Invalid key code '%s'"), key); } g_free(key); break; } default: /* Lets ignore text here */ break; } } static void xml_error_invalid_inside(GError **error, GMarkupParseContext *context) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, _("Element '%s' not allowed inside element '%s'"), (const gchar *) g_markup_parse_context_get_element_stack(context)->data, (const gchar *) g_markup_parse_context_get_element_stack(context)->next->data); } static void xml_error_unknown_attribute(GError **error, const gchar *attribute_name, GMarkupParseContext *context) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT, _("Invalid attribute '%s' for element '%s'"), attribute_name, g_markup_parse_context_get_element(context)); } static void copy_text(char **dest, const char *orig, gsize len) { *dest = g_malloc(len + 1); memcpy(*dest, orig, len); (*dest)[len] = '\0'; } void save_world_to_file(World *world) { int i; GtkTreeIter iter; GString *file_contents; GError *error = NULL; if (!world->file) { fprintf(stderr, "Error: null filename\n"); return; } file_contents = g_string_sized_new(4096); /* Header */ g_string_append(file_contents, "\n" "\n\n" "\n"); /* General data */ if (world != default_world) { kc_g_string_append_escaped(file_contents, " %s\n" " %s\n" " %s\n", world->name, world->use_tls, world->host, world->port); } kc_g_string_append_escaped(file_contents, " %s\n", world->charset); /* Proxy */ g_string_append_printf(file_contents, " proxy.type); if (world->proxy.server && strcmp(world->proxy.server, "") != 0) { kc_g_string_append_escaped(file_contents, "server=\"%s\" ", world->proxy.server); } if (world->proxy.port && strcmp(world->proxy.port, "") != 0) { kc_g_string_append_escaped(file_contents, "port=\"%s\" ", world->proxy.port); } if (world->proxy.user && strcmp(world->proxy.user, "") != 0) { kc_g_string_append_escaped(file_contents, "user=\"%s\" ", world->proxy.user); } if (world->proxy.password && strcmp(world->proxy.password, "") != 0) { kc_g_string_append_escaped(file_contents, "password=\"%s\" ", world->proxy.password); } g_string_append(file_contents, "/>\n"); /* Auto-logon */ if (world != default_world) { g_string_append_printf(file_contents, " \n", world->connection_style); if (gtk_tree_model_get_iter_first(world->logon_characters, &iter)) { do { gchar *character; gchar *password; gtk_tree_model_get(world->logon_characters, &iter, LOGON_CHAR, &character, LOGON_PASS, &password, -1); kc_g_string_append_escaped(file_contents, " %s\n", character); kc_g_string_append_escaped(file_contents, " %s\n", password); g_free(character); g_free(password); } while (gtk_tree_model_iter_next(world->logon_characters, &iter)); } g_string_append(file_contents, " \n"); } /* Fonts, Colors, Status Bar and background */ g_string_append(file_contents, " \n"); kc_g_string_append_escaped(file_contents, " %s\n" " %s\n" " %d\n" " \n" " \n" " \n" " \n" " %s\n" " \n", world->terminalfont, world->entryfont, world->usebold, world->wrap, world->wrap_indent, world->use_wrap_column, world->wrap_column, world->use_tooltips, world->statusfont, world->ctime_type, world->itime_type, world->itime_reset_activate); write_color(file_contents, "defforecolor", 0, world->deffore); write_color(file_contents, "defbackcolor", 0, world->defback); write_color(file_contents, "defboldcolor", 0, world->defbold); write_color(file_contents, "defboldbackcolor", 0, world->defboldback); for (i = 0; i < 16; ++i) { write_color(file_contents, "ansicolor", i, world->ansicolors); } g_string_append(file_contents, " \n"); /* Command entry */ kc_g_string_append_escaped(file_contents, " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n", world->repeat_commands, world->cmd_echo, world->never_hide_input, world->store_commands, world->commands_to_save, world->ignore_up_down_keys, world->autocompletion, world->autocompl_minprefix, world->command_separator, world->input_n_lines, world->input_n_lines_saved); g_string_append_printf(file_contents, " spell); if (world->spell_language) { kc_g_string_append_escaped(file_contents, " language=\"%s\"", world->spell_language); } g_string_append(file_contents, " />\n"); /* Anti flood */ g_string_append_printf(file_contents, " ", world->flood_prevention, world->max_equal_commands); kc_g_string_append_escaped(file_contents, "%s\n", world->flood_prevention_command); /* Scrolling */ g_string_append_printf(file_contents, " \n", world->scrollOutput, world->buffer_lines); /* Name display */ g_string_append_printf(file_contents, " \n", world->name_display_style, world->name_display_pattern); /* Logging */ g_string_append_printf(file_contents, " \n", world->log_autostart, world->log_add_time); if (world->log_file_name) { kc_g_string_append_escaped(file_contents, " %s\n", world->log_file_name); } if (world->log_timeformat) { kc_g_string_append_escaped(file_contents, " %s\n", world->log_timeformat); } g_string_append(file_contents, " \n"); /* Delete confirmation in GUI Editors */ g_string_append_printf(file_contents, " \n", world->confirm_delete); /* Plugin items in GUI Editors */ g_string_append_printf(file_contents, " \n", world->show_plugin_items); /* Script file */ if (world->scriptfile && strcmp(world->scriptfile, "") != 0) { kc_g_string_append_escaped(file_contents, " %s\n", world->scriptfile); } /* Startup plugins */ if (world != default_world && gtk_tree_model_iter_n_children(world->startup_plugins, NULL)) { GtkTreeIter iter; gchar *file; g_string_append(file_contents, " \n"); gtk_tree_model_get_iter_first(world->startup_plugins, &iter); do { gtk_tree_model_get(world->startup_plugins, &iter, SPLUGIN_FILE, &file, -1); kc_g_string_append_escaped(file_contents, " %s\n", file); g_free(file); } while (gtk_tree_model_iter_next(world->startup_plugins, &iter)); g_string_append(file_contents, " \n"); } /* Triggers */ if (world->triggers) { GSList *trigptr = world->triggers; Trigger *trigger; g_string_append(file_contents, " \n"); while (trigptr) { trigger = (Trigger *) trigptr->data; trigptr = trigptr->next; if (trigger->owner_plugin) { continue; } save_trigger(file_contents, trigger); } g_string_append(file_contents, " \n"); } /* Aliases */ if (world->aliases) { GSList *aliasptr = world->aliases; Alias *alias; g_string_append(file_contents, " \n"); while (aliasptr) { alias = (Alias *) aliasptr->data; aliasptr = aliasptr->next; if (alias->owner_plugin) { continue; } save_alias(file_contents, alias); } g_string_append(file_contents, " \n"); } /* Macros */ if (world->macros) { GSList *macroptr = world->macros; Macro *macro; g_string_append(file_contents, " \n"); while (macroptr) { macro = (Macro *) macroptr->data; macroptr = macroptr->next; if (macro->owner_plugin) { continue; } save_macro(file_contents, macro); } g_string_append(file_contents, " \n"); } /* Timers */ if (world->timers) { GSList *timerptr = world->timers; Timer *timer; g_string_append(file_contents, " \n"); while (timerptr) { timer = (Timer *) timerptr->data; timerptr = timerptr->next; if (timer->owner_plugin) { continue; } save_timer(file_contents, timer); } g_string_append(file_contents, " \n"); } /* Permanent variables */ if (world->permanent_variables) { GSList *varptr = world->permanent_variables; g_string_append(file_contents, " \n"); while (varptr) { g_string_append_printf(file_contents, " %s\n", (char *) varptr->data); varptr = varptr->next; } g_string_append(file_contents, " \n"); } /* Hooks */ save_hooks(file_contents, world); /* Protocols */ g_string_append(file_contents, " \n"); g_string_append_printf(file_contents, " \n", world->mccp_behavior); g_string_append(file_contents, " \n"); /* Keepalive */ g_string_append_printf(file_contents, " \n", world->keep_alive); g_string_append(file_contents, "\n"); create_kildclient_directory(); if (!g_file_set_contents(world->file, file_contents->str, file_contents->len, &error)) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Could not open file '%s': %s"), world->file, error->message); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Error")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); } g_string_free(file_contents, TRUE); } void load_command_history(World *world) { FILE *fp; gchar *path; gchar command[MAX_BUFFER]; GtkListStore *liststore; GtkTreeIter iter; if (!world->store_commands) return; if (!world->file) { return; } path = g_strdup_printf("%s.hst", world->file); fp = fopen(path, "r"); g_free(path); if (!fp) { return; } liststore = GTK_LIST_STORE(world->cmd_list); fgets(command, MAX_BUFFER, fp); while (!feof(fp)) { command[strlen(command) - 1] = '\0'; /* Strip final newline */ gtk_list_store_append(liststore, &iter); gtk_list_store_set(liststore, &iter, CMDLIST_COL_COMMAND, command, CMDLIST_COL_TENTATIVE, NULL, -1); ++world->cmd_list_size; fgets(command, MAX_BUFFER, fp); } fclose(fp); } void save_command_history(World *world) { gchar *path; GtkTreeIter iter; gchar *command; int start_pos; GString *file_contents; if (!world->store_commands) return; if (!world->file) { fprintf(stderr, "Error: null filename\n"); return; } file_contents = g_string_sized_new(1024); /* Define start position. Most of the times saving starts at the second (pos 1) command because the first represents the command currently being entered, unless under some circunstances when using the Repeat Commands feature, in this case there is not this "being typed" command. */ if (!world->repeat_commands || world->cmd_has_been_edited) { start_pos = 1; } else { start_pos = 0; } if (gtk_tree_model_iter_nth_child(world->cmd_list, &iter, NULL, start_pos)) { do { command = cmdhistory_get_command(world->cmd_list, &iter); g_string_append(file_contents, command); g_string_append_c(file_contents, '\n'); g_free(command); } while (gtk_tree_model_iter_next(world->cmd_list, &iter)); } path = g_strdup_printf("%s.hst", world->file); g_file_set_contents(path, file_contents->str, file_contents->len, NULL); g_free(path); g_string_free(file_contents, TRUE); } void kc_g_string_append_escaped(GString *gstr, const char *template, ...) { va_list ap; char *str; va_start(ap, template); str = g_markup_vprintf_escaped(template, ap); g_string_append(gstr, str); g_free(str); } static void read_color(GdkColor *color, const char *text, gsize text_len, GError **error) { gchar *colordesc; int idx; GdkColor temp; copy_text(&colordesc, text, text_len); if (sscanf(colordesc, "%d %hu %hu %hu", &idx, &temp.red, &temp.green, &temp.blue) != 4) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, "Invalid color specification in config file."); } color[idx].red = temp.red; color[idx].green = temp.green; color[idx].blue = temp.blue; g_free(colordesc); } static void write_color(GString *str, char *name, int idx, GdkColor *color) { g_string_append_printf(str, " <%s>%d %d %d %d\n", name, idx, color[idx].red, color[idx].green, color[idx].blue, name); } void mark_as_offline(World *world) { gchar *str; str = g_strdup_printf("%s", world->display_name); gtk_label_set_markup(world->gui->lblNotebook, str); g_free(str); str = g_strdup_printf(_("Disconnected from world %s"), world->name); gtk_label_set_text(world->gui->lblStatus, str); g_free(str); currentWorld = world; } void prepare_display_name(World *world) { gchar *character; g_free(world->display_name); g_free(world->new_text_name); if (world->character_used == NULL || world->connection_style == NONE) { character = g_strdup(""); } else { GtkTreePath *path; GtkTreeIter iter; path = gtk_tree_row_reference_get_path(world->character_used); if (!path) { gtk_tree_row_reference_free(world->character_used); world->character_used = NULL; character = g_strdup(""); } gtk_tree_model_get_iter(world->logon_characters, &iter, path); gtk_tree_model_get(world->logon_characters, &iter, LOGON_CHAR, &character, -1); } switch (world->name_display_style) { case NAME_DISPLAY_WORLD: world->display_name = g_strdup(world->name); break; case NAME_DISPLAY_WORLD_CHAR: world->display_name = g_strdup_printf("%s - %s", world->name, character); break; case NAME_DISPLAY_CHAR_WORLD: world->display_name = g_strdup_printf("%s - %s", character, world->name); break; case NAME_DISPLAY_CUSTOM: world->display_name = replace_kc_escapes(world->name_display_pattern, world->name, character); break; } world->new_text_name = g_strdup_printf("%s", world->display_name); g_free(character); } gchar * replace_kc_escapes(const gchar *pattern, const gchar *name, const gchar *character) { static GRegex *reKw = NULL; static GRegex *reKc = NULL; gchar *tmp1; gchar *tmp2; /* If this is the first run, create the GRegex structure */ if (!reKw) { reKw = g_regex_new("%Kw", 0, 0, NULL); } if (!reKc) { reKc = g_regex_new("%Kc", 0, 0, NULL); } /* Substitute KC specific strings: %Kw - World name %Kc - Character name */ tmp1 = g_regex_replace_literal(reKw, pattern, -1, 0, name, 0, NULL); tmp2 = g_regex_replace_literal(reKc, tmp1, -1, 0, character, 0, NULL); g_free(tmp1); return tmp2; } kildclient-2.11.1/src/ansitextview.c0000644000175000017500000012051111570205043014321 00000000000000/* $Id: ansitextview.c 1176 2011-05-28 14:43:45Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include "kcircularqueue.h" #include "ansi.h" #include "kildclient.h" #include "perlscript.h" /************************* * File global variables * *************************/ /* Values used to get the 6x6x6 color cube of xterm 256 color mode */ static guint8 xterm256color[] = { 0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff }; /* Values used for greyscales in xterm 256 color mode */ static guint8 xterm256gray[] = { 0x08, 0x12, 0x1c, 0x26, 0x30, 0x3a, 0x44, 0x4e, 0x58, 0x62, 0x6c, 0x76, 0x80, 0x8a, 0x94, 0x9e, 0xa8, 0xb2, 0xbc, 0xc6, 0xd0, 0xda, 0xe4, 0xee }; /* UTF-8 codes for the characters used in line-drawing mode */ static gchar *linedrawingchars[] = { "\342\227\206", /* ` */ "\342\226\222", /* a */ "\342\220\211", /* b */ "\342\220\214", /* c */ "\342\220\215", /* d */ "\342\220\212", /* e */ "\302\260", /* f */ "\302\261", /* g */ "\342\220\244", /* h */ "\342\220\213", /* i */ "\342\224\230", /* j */ "\342\224\220", /* k */ "\342\224\214", /* l */ "\342\224\224", /* m */ "\342\224\274", /* n */ "\342\216\272", /* o */ "\342\216\273", /* p */ "\342\224\200", /* q */ "\342\216\274", /* r */ "\342\216\275", /* s */ "\342\224\234", /* t */ "\342\224\244", /* u */ "\342\224\264", /* v */ "\342\224\254", /* w */ "\342\224\202", /* x */ "\342\211\244", /* y */ "\342\211\245", /* z */ "\317\200", /* { */ "\342\211\240", /* | */ "\302\243", /* } */ "\302\267", /* ~ */ }; /* ASCII characters replacing those of line-drawing mode when they are not available. */ static gchar *replacingchars[] = { "?", /* ` */ "#", /* a */ "?", /* b */ "?", /* c */ "?", /* d */ "?", /* e */ "o", /* f */ "?", /* g */ "?", /* h */ "?", /* i */ "+", /* j */ "+", /* k */ "+", /* l */ "+", /* m */ "+", /* n */ "-", /* o */ "-", /* p */ "-", /* q */ "_", /* r */ "_", /* s */ "|", /* t */ "|", /* u */ "-", /* v */ "-", /* w */ "|", /* x */ "<", /* y */ ">", /* z */ "p", /* { */ "?", /* | */ "L", /* } */ ".", /* ~ */ }; /*********************** * Function prototypes * ***********************/ static void ansitextview_append_string_internal(WorldGUI *gui, const gchar *str, gboolean add_nl); static void ansitextview_insert_ansi_string(WorldGUI *gui, GtkTextIter *pos, const gchar *str, gsize len); static void ansitextview_text_added(WorldGUI *gui); static void parse_ansi_string(WorldGUI *gui); static void reset_ansi_state(TAState *state); static void ansitextview_verify_urls_and_add(WorldGUI *gui, GtkTextIter *pos, const guchar *text, gsize len); static void ansitextview_insert_vt100linedraw_string(WorldGUI *gui, GtkTextIter *pos, const guchar *text, gsize len); static void ansitextview_append_formatted(GtkTextBuffer *buffer, GtkTextIter *iter, const gchar *text, gsize len, TextAppearance *ta, GtkTextTag *extra_tag); static GtkTextTag *get_tag_for_color(WorldGUI *gui, guint8 r, guint8 g, guint8 b, gboolean is_back); static GtkTextTag *get_tag_for_xterm256_color(WorldGUI *gui, gint x256idx, gint code_used); void ansitextview_append_string(WorldGUI *gui, const gchar *str) { /* * Append str (a null-terminated string) to the Buffer, in the default * color. */ ansitextview_append_string_internal(gui, str, FALSE); } void ansitextview_append_string_nl(WorldGUI *gui, const gchar *str) { /* * Append str (a null-terminated string) to the Buffer, in the default * color, and a newline. */ ansitextview_append_string_internal(gui, str, TRUE); } void ansitextview_append_stringf(WorldGUI *gui, const gchar *format, ...) { /* * Formats a string using printf syntax and outputs it. */ va_list ap; gchar *str; va_start(ap, format); str = g_strdup_vprintf(format, ap); ansitextview_append_string_internal(gui, str, FALSE); g_free(str); } static void ansitextview_append_string_internal(WorldGUI *gui, const gchar *str, gboolean add_nl) { /* * Does the bulk work of ansitextview_append_string() and * ansitextview_append_string_nl(): Those functions just call this one * specifying whether a newline is to be added or not. */ GtkTextIter end_iter; gtk_text_buffer_get_iter_at_mark(gui->txtBuffer, &end_iter, gui->txtmark_linestart); gtk_text_buffer_insert(gui->txtBuffer, &end_iter, str, -1); if (add_nl) { gtk_text_buffer_insert(gui->txtBuffer, &end_iter, "\n", 1); } gtk_text_buffer_move_mark(gui->txtBuffer, gui->txtmark_linestart, &end_iter); ansitextview_text_added(gui); } void ansitextview_append_string_with_fgcolor(WorldGUI *gui, const gchar *str, gint fg_color) { /* * Append str (a null-terminated string) to the Buffer, using the * specified foreground color. */ GtkTextIter end_iter; GtkTextIter line_end; gtk_text_buffer_get_iter_at_offset(gui->txtBuffer, &end_iter, -1); gtk_text_buffer_insert_with_tags(gui->txtBuffer, &end_iter, str, -1, gui->ta.ansi_fore_tags[fg_color], NULL); gtk_text_buffer_get_iter_at_offset(gui->txtBuffer, &line_end, -1); gtk_text_buffer_move_mark(gui->txtBuffer, gui->txtmark_linestart, &line_end); ansitextview_text_added(gui); } void ansitextview_append_ansi_string(WorldGUI *gui, const gchar *str, gsize len) { GtkTextIter end_iter; gtk_text_buffer_get_end_iter(gui->txtBuffer, &end_iter); ansitextview_insert_ansi_string(gui, &end_iter, str, len); } static void ansitextview_insert_ansi_string(WorldGUI *gui, GtkTextIter *pos, const gchar *str, gsize len) { /* * Append str (a null-terminated string) possibly with ANSI color * codes to the Buffer. */ static guchar text_buffer[MAX_BUFFER]; gint text_buffer_pos; guint original_pos; text_buffer_pos = 0; original_pos = 0; while (str[original_pos] && original_pos < len) { switch (gui->ta.ansifsm_state) { case ANSIFSM_DATA: if (str[original_pos] == ANSI_ESC) { gui->ta.ansifsm_state = ANSIFSM_ESC; } else { text_buffer[text_buffer_pos++] = str[original_pos]; } break; case ANSIFSM_ESC: if (str[original_pos] == '[') { gui->ta.ansifsm_state = ANSIFSM_ANSISEQ; if (text_buffer_pos) { ansitextview_verify_urls_and_add(gui, pos, text_buffer, text_buffer_pos); text_buffer_pos = 0; } } else if (str[original_pos] == '(') { gui->ta.ansifsm_state = ANSIFSM_ESCLEFTPAR; } else { /* Put the ESC back */ text_buffer[text_buffer_pos++] = ANSI_ESC; text_buffer[text_buffer_pos++] = str[original_pos]; gui->ta.ansifsm_state = ANSIFSM_DATA; } break; case ANSIFSM_ANSISEQ: /* Since there is no reason for a valid ANSI sequence that is longer than MAX_BUFFER, we simply cut it if it is too long. */ if ((isdigit(str[original_pos]) || str[original_pos] == ';') && gui->ta.ansiseq_pos < MAX_BUFFER) { gui->ta.ansiseq_buffer[gui->ta.ansiseq_pos++] = str[original_pos]; } else { gui->ta.ansifsm_state = ANSIFSM_DATA; if (str[original_pos] == 'm') { parse_ansi_string(gui); } else { /* Not recognized, ignored and cleared. */ /* FIXME: Copy it back, being careful with buffer size. */ gui->ta.ansiseq_pos = 0; } } break; case ANSIFSM_ESCLEFTPAR: if (str[original_pos] == '0' || str[original_pos] == 'B') { gui->ta.ansifsm_state = ANSIFSM_DATA; if (text_buffer_pos) { ansitextview_verify_urls_and_add(gui, pos, text_buffer, text_buffer_pos); text_buffer_pos = 0; } gui->ta.state.linedraw = (str[original_pos] == '0'); } else { /* Put unrecognized sequence back */ text_buffer[text_buffer_pos++] = ANSI_ESC; text_buffer[text_buffer_pos++] = '('; text_buffer[text_buffer_pos++] = str[original_pos]; gui->ta.ansifsm_state = ANSIFSM_DATA; } break; } ++original_pos; } /* Add any remaining text */ if (text_buffer_pos) { ansitextview_verify_urls_and_add(gui, pos, text_buffer, text_buffer_pos); text_buffer_pos = 0; } ansitextview_text_added(gui); } void ansitextview_append_echoed_string(WorldGUI *gui, const gchar *str, gsize len) { /* * Append str (a null-terminated string) possibly with ANSI color * codes to the Buffer, which does not come from the MUD, but was * echoed. The state of the ANSI parser is saved in case an * incomplete ANSI sequence was pending. The line is printed above * any incomplete line (prompt). */ static guchar saved_buffer[MAX_BUFFER]; TAState saved_state; gint saved_pos; ANSIFSMState saved_fsmstate; GtkTextIter end_iter; guint printed; guint to_print; memcpy(saved_buffer, gui->ta.ansiseq_buffer, gui->ta.ansiseq_pos); saved_pos = gui->ta.ansiseq_pos; saved_fsmstate = gui->ta.ansifsm_state; saved_state = gui->ta.state; gui->ta.ansifsm_state = ANSIFSM_DATA; gui->ta.ansiseq_pos = 0; /* Due to static buffers, only MAX_BUFFER chars can be printed at a time. */ printed = 0; gtk_text_buffer_get_iter_at_mark(gui->txtBuffer, &end_iter, gui->txtmark_linestart); while (printed < len) { to_print = (len - printed) > MAX_BUFFER ? MAX_BUFFER : (len - printed); ansitextview_insert_ansi_string(gui, &end_iter, str + printed, to_print); printed += to_print; } gtk_text_buffer_move_mark(gui->txtBuffer, gui->txtmark_linestart, &end_iter); memcpy(gui->ta.ansiseq_buffer, saved_buffer, saved_pos); gui->ta.ansiseq_pos = saved_pos; gui->ta.ansifsm_state = saved_fsmstate; gui->ta.state = saved_state; } static void ansitextview_text_added(WorldGUI *gui) { GtkAdjustment *adjustment; gint lines; static gchar msg[MAX_BUFFER]; int n; /* Update count of lines */ lines = gtk_text_buffer_get_line_count(gui->txtBuffer); if (gui->lblLines) { gint totallines = gui->world->deleted_lines + lines; if (totallines == 1) { gtk_label_set_text(gui->lblLines, _("1 line")); } else { sprintf(msg, _("%d lines"), totallines); gtk_label_set_text(gui->lblLines, msg); } } /* Add time that these lines were processed */ if (gui->line_times) { int existing; time_t now; existing = k_circular_queue_size(gui->line_times); now = time(NULL); if (existing) { /* This last line that existed probably had something added. Update its time, unless this is the first line ever. */ k_circular_queue_nth(gui->line_times, time_t, existing - 1) = now; } /* Add new times */ n = lines - existing; if (n > 0) { k_circular_queue_push_copies(gui->line_times, &now, n); } } /* Scroll to end if appropriate */ adjustment = gtk_scrolled_window_get_vadjustment(gui->scrolled_win); if (gtk_adjustment_get_value(adjustment) != gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment) && !(gui->world && gui->world->scrollOutput)) { return; } gtk_text_view_scroll_to_mark(gui->txtView, gui->txtmark_end, 0, TRUE, 0.5, 1); } static void parse_ansi_string(WorldGUI *gui) { gchar **sequences; gchar **curr_seq; int val; /* xterm256 state: used to parse xterm's 256 color cube. xterm sequences: ESC[38;5;Xm and ESC[48;5;Xm, fore and back resp. When this variable is 0, no xterm sequence parsing is being done. When 38 or 48 is seen, the variable is set to -38 or -48, respectively. When it is negative, and -5 is seen, its sign is changed. When it is positive, the color value is read and parsed. */ gint xterm256_state = 0; /* ESC[m, this means reset to default. */ if (gui->ta.ansiseq_pos == 0) { reset_ansi_state(&gui->ta.state); return; } /* Add NULL terminator. */ gui->ta.ansiseq_buffer[gui->ta.ansiseq_pos] = 0; sequences = g_strsplit_set((gchar *) gui->ta.ansiseq_buffer, ";", -1); curr_seq = sequences; while (*curr_seq) { val = atoi(*curr_seq); if (xterm256_state < 0) { if (val == XTERM256_SECOND_CODE) { xterm256_state = -xterm256_state; } else { /* Ignore the strange sequence. */ xterm256_state = 0; } ++curr_seq; continue; } else if (xterm256_state > 0) { if (xterm256_state == XTERM256_SET_FORE) { gui->ta.state.foreground_color_tag = get_tag_for_xterm256_color(gui, val, xterm256_state); } else if (xterm256_state == XTERM256_SET_BACK) { gui->ta.state.background_color_tag = get_tag_for_xterm256_color(gui, val, xterm256_state); } xterm256_state = 0; ++curr_seq; continue; } if (val == 0) { reset_ansi_state(&gui->ta.state); } else if (val >= ANSI_FIRST_FG_COLOR && val <= ANSI_LAST_FG_COLOR) { gui->ta.state.fg_color = val - ANSI_FIRST_FG_COLOR; gui->ta.state.foreground_color_tag = NULL; } else if (val == ANSI_FG_DEFAULT) { gui->ta.state.fg_color = ANSI_DEFAULT_COLOR_IDX; gui->ta.state.foreground_color_tag = NULL; } else if (val == ANSI_SET_FG_BOLD) { gui->ta.state.fg_base_idx = ANSI_BOLD_BASE_IDX; } else if (val == ANSI_BOLD_OFF) { gui->ta.state.fg_base_idx = ANSI_NORMAL_BASE_IDX; } else if (val >= ANSI_FIRST_BG_COLOR && val <= ANSI_LAST_BG_COLOR) { gui->ta.state.bg_color = val - ANSI_FIRST_BG_COLOR; gui->ta.state.background_color_tag = NULL; } else if (val == ANSI_BG_DEFAULT) { gui->ta.state.bg_color = ANSI_DEFAULT_COLOR_IDX; gui->ta.state.background_color_tag = NULL; } else if (val == ANSI_SET_BG_LIGHT) { gui->ta.state.bg_base_idx = ANSI_BOLD_BASE_IDX; } else if (val == ANSI_BOLD_BG_OFF) { gui->ta.state.bg_base_idx = ANSI_NORMAL_BASE_IDX; } else if (val == ANSI_SET_UNDERLINE) { gui->ta.state.underline = PANGO_UNDERLINE_SINGLE; } else if (val == ANSI_SET_DBLUNDERLINE) { gui->ta.state.underline = PANGO_UNDERLINE_DOUBLE; } else if (val == ANSI_UNDERLINE_OFF) { gui->ta.state.underline = PANGO_UNDERLINE_NONE; } else if (val == ANSI_SET_STRIKE) { gui->ta.state.strike = TRUE; } else if (val == ANSI_STRIKE_OFF) { gui->ta.state.strike = FALSE; } else if (val == ANSI_SET_ITALICS) { gui->ta.state.italics = TRUE; } else if (val == ANSI_ITALICS_OFF) { gui->ta.state.italics = FALSE; } else if (val == ANSI_SET_REVERSE) { gui->ta.state.reverse = TRUE; } else if (val == ANSI_REVERSE_OFF) { gui->ta.state.reverse = FALSE; } else if (val == ANSI_SET_HIDDEN) { gui->ta.state.hidden = TRUE; } else if (val == ANSI_HIDDEN_OFF) { gui->ta.state.hidden = FALSE; } else if (val == XTERM256_SET_FORE || val == XTERM256_SET_BACK) { xterm256_state = -val; } /* else ignored */ ++curr_seq; } g_strfreev(sequences); gui->ta.ansiseq_pos = 0; } static void reset_ansi_state(TAState *state) { /* Resets state to defaults, when ESC[0m or ESC[m is seen. */ state->fg_color = state->bg_color = ANSI_DEFAULT_COLOR_IDX; state->fg_base_idx = state->bg_base_idx = ANSI_NORMAL_BASE_IDX; state->foreground_color_tag = state->background_color_tag = NULL; state->underline = PANGO_UNDERLINE_NONE; state->strike = FALSE; state->italics = FALSE; state->reverse = FALSE; state->hidden = FALSE; } static void ansitextview_verify_urls_and_add(WorldGUI *gui, GtkTextIter *pos, const guchar *text, gsize len) { static regex_t regex; static gboolean re_compiled = FALSE; static guchar ctext[MAX_BUFFER + 1]; static regmatch_t match; guint search_start; if (gui->ta.state.linedraw) { ansitextview_insert_vt100linedraw_string(gui, pos, text, len); return; } if (!re_compiled) { regcomp(®ex, "(((https?|ftp)://)|www\\.)[-A-Za-z0-9\\./?=&+%:#_~@,]*[-A-Za-z0-9\\/?=&+%:#_~]", REG_EXTENDED | REG_ICASE); re_compiled = TRUE; } /* We need a NULL-terminated string */ memcpy(ctext, text, len); ctext[len] = '\0'; search_start = 0; while (search_start < len) { if (regexec(®ex, (char *) (ctext + search_start), 1, &match, 0) == 0) { /* Text before the URL */ ansitextview_append_formatted(gui->txtBuffer, pos, (gchar *) (text + search_start), match.rm_so, &gui->ta, NULL); /* The URL */ ansitextview_append_formatted(gui->txtBuffer, pos, (gchar *) (text + search_start + match.rm_so), match.rm_eo - match.rm_so, &gui->ta, gui->txttag_url); /* Continue looking */ search_start += match.rm_eo; } else { /* Text after the URL */ ansitextview_append_formatted(gui->txtBuffer, pos, (gchar *) (text + search_start), len - search_start, &gui->ta, NULL); break; } } } static void ansitextview_insert_vt100linedraw_string(WorldGUI *gui, GtkTextIter *pos, const guchar *text, gsize len) { guint i; worldgui_determine_supported_chars(gui); for (i = 0; i < len; ++i) { if (text[i] < '_' || text[i] > '~') { ansitextview_append_formatted(gui->txtBuffer, pos, (const gchar *) text + i, 1, &gui->ta, NULL); } else { switch (text[i]) { case '_': /* A blank */ ansitextview_append_formatted(gui->txtBuffer, pos, " ", 1, &gui->ta, NULL); break; /* Geometric Shapes */ case '`': ansitextview_append_formatted(gui->txtBuffer, pos, gui->ta.sup_geom_shapes ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1], -1, &gui->ta, NULL); break; /* Block elements */ case 'a': ansitextview_append_formatted(gui->txtBuffer, pos, gui->ta.sup_block ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1], -1, &gui->ta, NULL); break; /* Control Pictures */ case 'b': case 'c': case 'd': case 'e': case 'h': case 'i': ansitextview_append_formatted(gui->txtBuffer, pos, gui->ta.sup_control ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1], -1, &gui->ta, NULL); break; /* Latin-1 Supplement */ case 'f': case 'g': case '}': case '~': ansitextview_append_formatted(gui->txtBuffer, pos, gui->ta.sup_l1_supplement ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1], -1, &gui->ta, NULL); break; /* Box drawing */ case 'j': case 'k': case 'l': case 'm': case 'n': case 'q': case 't': case 'u': case 'v': case 'w': case 'x': ansitextview_append_formatted(gui->txtBuffer, pos, gui->ta.sup_box_drawing ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1], -1, &gui->ta, NULL); break; /* Miscellaneous Technical */ case 'o': case 'p': case 'r': case 's': ansitextview_append_formatted(gui->txtBuffer, pos, gui->ta.sup_misc_tech ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1], -1, &gui->ta, NULL); break; /* Mathematical Operators */ case 'y': case 'z': case '|': ansitextview_append_formatted(gui->txtBuffer, pos, gui->ta.sup_math ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1], -1, &gui->ta, NULL); break; /* Greek and Coptic */ case '{': ansitextview_append_formatted(gui->txtBuffer, pos, gui->ta.sup_greek ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1], -1, &gui->ta, NULL); break; } } } } static void ansitextview_append_formatted(GtkTextBuffer *buffer, GtkTextIter *iter, const gchar *text, gsize len, TextAppearance *ta, GtkTextTag *extra_tag) { gint start_offset; GtkTextIter start_iter; gint fg_color_idx; gint bg_color_idx; start_offset = gtk_text_iter_get_offset(iter); gtk_text_buffer_insert(buffer, iter, text, len); gtk_text_buffer_get_iter_at_offset(buffer, &start_iter, start_offset); /* Foreground & background */ fg_color_idx = ta->state.fg_base_idx + ta->state.fg_color; bg_color_idx = ta->state.bg_base_idx + ta->state.bg_color; if (ta->state.foreground_color_tag) { gtk_text_buffer_apply_tag(buffer, ta->state.foreground_color_tag, &start_iter, iter); } else { gint idx_to_use; if (ta->state.reverse ^ ta->state.hidden) { if (bg_color_idx == ANSI_DEFAULT_COLOR_IDX) { idx_to_use = ANSI_REVERSE_DEFAULT_IDX; } else if (bg_color_idx == ANSI_DEFAULT_BOLD_COLOR_IDX) { idx_to_use = ANSI_REVERSE_BOLD_DEFAULT_IDX; } else { idx_to_use = bg_color_idx; } } else { idx_to_use = fg_color_idx; } gtk_text_buffer_apply_tag(buffer, ta->ansi_fore_tags[idx_to_use], &start_iter, iter); } if (ta->state.background_color_tag) { gtk_text_buffer_apply_tag(buffer, ta->state.background_color_tag, &start_iter, iter); } else { gint idx_to_use; if (!ta->state.reverse) { idx_to_use = bg_color_idx; } else { if (fg_color_idx == ANSI_DEFAULT_COLOR_IDX) { idx_to_use = ANSI_REVERSE_DEFAULT_IDX; } else if (fg_color_idx == ANSI_DEFAULT_BOLD_COLOR_IDX) { idx_to_use = ANSI_REVERSE_BOLD_DEFAULT_IDX; } else { idx_to_use = fg_color_idx; } } gtk_text_buffer_apply_tag(buffer, ta->ansi_back_tags[idx_to_use], &start_iter, iter); } /* Special attributes */ if (ta->state.underline == PANGO_UNDERLINE_SINGLE) { gtk_text_buffer_apply_tag(buffer, ta->underline_tag, &start_iter, iter); } else if (ta->state.underline == PANGO_UNDERLINE_DOUBLE) { gtk_text_buffer_apply_tag(buffer, ta->dblunderline_tag, &start_iter, iter); } if (ta->state.strike) { gtk_text_buffer_apply_tag(buffer, ta->strike_tag, &start_iter, iter); } if (ta->state.italics) { gtk_text_buffer_apply_tag(buffer, ta->italics_tag, &start_iter, iter); } /* Any extra tag passed. */ if (extra_tag) { gtk_text_buffer_apply_tag(buffer, extra_tag, &start_iter, iter); } } void ansitextview_get_char_size(WorldGUI *gui, gint *char_height, gint *char_width) { PangoLayout *layout; PangoRectangle logical_rect; layout = gtk_widget_create_pango_layout(GTK_WIDGET(gui->txtView), "W"); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); *char_height = logical_rect.height; *char_width = logical_rect.width; g_object_unref(layout); } void ansitextview_get_size(WorldGUI *gui, guint *lines, guint *cols) { GdkRectangle rect; gint char_height; gint char_width; /* Get the size of the text view */ gtk_text_view_get_visible_rect(gui->txtView, &rect); ansitextview_get_char_size(gui, &char_height, &char_width); *lines = rect.height / char_height; *cols = rect.width / char_width; } void ansitextview_update_color_tags(WorldGUI *gui, World *world) { int i; if (!world) { fprintf(stderr, "BUG: update_color_tag without world.\n"); return; } /* First time called, the tags have not been created yet. */ if (!gui->ta.ansi_fore_tags) { /* Allocate space for colors */ gui->ta.ansi_fore_tags = g_new0(GtkTextTag *, ANSI_TABLE_SIZE); gui->ta.ansi_back_tags = g_new0(GtkTextTag *, ANSI_TABLE_SIZE); for (i = 0; i < ANSI_TABLE_SIZE; ++i) { gui->ta.ansi_fore_tags[i] = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, NULL); gui->ta.ansi_back_tags[i] = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, NULL); } } /* Update normal foreground/background colors */ for (i = 0; i < ANSI_N_COLORS; ++i) { g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[i]), "foreground-gdk", &world->ansicolors[i], NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[i]), "background-gdk", &world->ansicolors[i], NULL); } for (i = ANSI_BOLD_BASE_IDX; i < (ANSI_BOLD_BASE_IDX + ANSI_N_COLORS); ++i) { g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[i]), "foreground-gdk", &world->ansicolors[i - ANSI_TABLE_OFFSET], NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[i]), "background-gdk", &world->ansicolors[i - ANSI_TABLE_OFFSET], NULL); } /* Update default colors */ g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[ANSI_DEFAULT_COLOR_IDX]), "foreground-gdk", world->deffore, NULL); g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[ANSI_BOLD_BASE_IDX + ANSI_DEFAULT_COLOR_IDX]), "foreground-gdk", world->defbold, NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[ANSI_DEFAULT_COLOR_IDX]), "background-gdk", world->defback, NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[ANSI_BOLD_BASE_IDX + ANSI_DEFAULT_COLOR_IDX]), "background-gdk", world->defboldback, NULL); /* Update default colors for reverse video */ g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[ANSI_REVERSE_DEFAULT_IDX]), "foreground-gdk", world->defback, NULL); g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[ANSI_REVERSE_BOLD_DEFAULT_IDX]), "foreground-gdk", world->defboldback, NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[ANSI_REVERSE_DEFAULT_IDX]), "background-gdk", world->deffore, NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[ANSI_REVERSE_BOLD_DEFAULT_IDX]), "background-gdk", world->defbold, NULL); /* Update use bold state */ for (i = ANSI_BOLD_BASE_IDX; i < (ANSI_BOLD_BASE_IDX + ANSI_N_COLORS + 1); ++i) { g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[i]), "weight", (world->usebold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL), NULL); } g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[ANSI_REVERSE_BOLD_DEFAULT_IDX]), "weight", (world->usebold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL), NULL); /* Update default colors in the TextView */ gtk_widget_modify_base(GTK_WIDGET(gui->txtView), GTK_STATE_NORMAL, world->defback); gtk_widget_modify_base(GTK_WIDGET(gui->txtViewScroll), GTK_STATE_NORMAL, world->defback); gtk_widget_modify_text(GTK_WIDGET(gui->txtViewScroll), GTK_STATE_NORMAL, world->deffore); gtk_widget_modify_text(GTK_WIDGET(gui->txtView), GTK_STATE_NORMAL, world->deffore); } gboolean ansitextview_prune_extra_lines(gpointer data) { WorldGUI *gui = (WorldGUI *) data; gint lines; if (!gui->world) { return TRUE; } lines = gtk_text_buffer_get_line_count(gui->txtBuffer); if (lines > gui->world->buffer_lines) { GtkTextIter start; GtkTextIter end; int to_del; to_del = lines - gui->world->buffer_lines; gtk_text_buffer_get_start_iter(gui->txtBuffer, &start); gtk_text_buffer_get_iter_at_line(gui->txtBuffer, &end, to_del); gtk_text_buffer_delete(gui->txtBuffer, &start, &end); /* Remove times of the deleted lines */ if (gui->line_times) { k_circular_queue_pop(gui->line_times, to_del); gui->world->deleted_lines += to_del; } } return TRUE; } guchar * strip_ansi(const guchar *original, int len) { /* This is to be called on complete strings, so parsing always starts in DATA mode */ ANSIFSMState state = ANSIFSM_DATA; guchar *stripped; int original_pos; int stripped_pos; /* In the worst case, the result after processing will have the same size + a null string terminator. */ stripped = g_malloc(len + 1); original_pos = 0; stripped_pos = 0; while (original_pos < len) { switch (state) { case ANSIFSM_DATA: if (original[original_pos] == ANSI_ESC) { state = ANSIFSM_ESC; } else { stripped[stripped_pos++] = original[original_pos]; } break; case ANSIFSM_ESC: if (original[original_pos] == '[') { state = ANSIFSM_ANSISEQ; } else { stripped[stripped_pos++] = ANSI_ESC; /* Add ESC again */ stripped[stripped_pos++] = original[original_pos]; state = ANSIFSM_DATA; } break; case ANSIFSM_ANSISEQ: if (isalpha(original[original_pos])) { state = ANSIFSM_DATA; } break; default: break; } ++original_pos; } stripped[stripped_pos] = '\0'; return stripped; } static GtkTextTag * get_tag_for_color(WorldGUI *gui, guint8 r, guint8 g, guint8 b, gboolean is_back) { gint rgb; GtkTextTag *tag; GHashTable *hash; GdkColor color; hash = is_back ? gui->ta.rgb_back_tags : gui->ta.rgb_fore_tags; rgb = (r << 16) | (g << 8) | b; tag = g_hash_table_lookup(hash, GINT_TO_POINTER(rgb)); if (tag) { return tag; } /* Create if it does not exist */ color.red = (r << 8) | r; color.green = (g << 8) | g; color.blue = (b << 8) | b; if (!is_back) { tag = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "foreground-gdk", &color, NULL); } else { tag = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "background-gdk", &color, NULL); } gtk_text_tag_set_priority(tag, 0); g_hash_table_insert(hash, GINT_TO_POINTER(rgb), tag); return tag; } static GtkTextTag * get_tag_for_xterm256_color(WorldGUI *gui, gint x256idx, gint code_used) { guint8 r, g, b; if (x256idx <= 7) { /* Normal ANSI colors */ if (code_used == XTERM256_SET_FORE) { return gui->ta.ansi_fore_tags[x256idx]; } else if (code_used == XTERM256_SET_BACK) { return gui->ta.ansi_back_tags[x256idx]; } } if (x256idx <= 15) { /* Highlighted ANSI colors */ if (code_used == XTERM256_SET_FORE) { return gui->ta.ansi_fore_tags[x256idx - ANSI_N_COLORS + ANSI_BOLD_BASE_IDX]; } else if (code_used == XTERM256_SET_BACK) { return gui->ta.ansi_back_tags[x256idx - ANSI_N_COLORS + ANSI_BOLD_BASE_IDX]; } } if (x256idx <= 231) { /* 6x6x6 rgb color cube */ guint8 ri, gi, bi; x256idx -= 16; ri = x256idx / 36; x256idx %= 36; gi = x256idx / 6; x256idx %= 6; bi = x256idx; r = xterm256color[ri]; g = xterm256color[gi]; b = xterm256color[bi]; } else { x256idx -= 232; r = xterm256gray[x256idx]; g = b = r; } return get_tag_for_color(gui, r, g, b, code_used == XTERM256_SET_BACK); } kildclient-2.11.1/src/dlgEditWorld.glade0000644000175000017500000115035311407661313015022 00000000000000 8 Edit World dialog False True vertical True True True never automatic in 150 400 True True False False 0 True 8 False 12 vertical 18 vertical 6 True 0 0 <b>Connection</b> True False False 0 True True False False 0 True 4 2 True 1 _Name: True txtName GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 True 1 _Host: True txtHost 1 2 GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 True 1 _Port: True txtPort 2 3 GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 True True Enter a descriptive name for the World True 50 1 2 GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 True True Enter the host to connect to True 50 1 2 1 2 GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 True True Enter the port used when connecting True 50 1 2 2 3 GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 Use _SSL True True False True True 1 2 3 4 GTK_FILL 4 4 1 1 False False 0 True vertical 6 True 0 0 <b>Proxy</b> True False False 0 True True False False 0 True vertical 12 True 4 True Proxy _type: True False False 0 True Use global settings No proxy SOCKS4 SOCKS5 False 1 False 0 True 2 4 4 4 True True False 3 4 1 2 True True 3 4 True True 1 2 1 2 True True 1 2 True 1 Pass_word: True 2 3 1 2 GTK_FILL GTK_FILL True 1 Server _port: True 2 3 GTK_FILL GTK_FILL True 1 _Username: True 1 2 GTK_FILL GTK_FILL True 1 Server _address: True GTK_FILL GTK_FILL False False 1 1 1 False 1 vertical 6 True 0 0 <b>Auto-login</b> True False False 0 True True False False 0 True vertical 6 True 4 True 1 Connection _Style: True cmbConnStyle False False 0 True No auto-login diku (char, pass) lp (CONNECT char pass) 1 False 0 True 0 Ch_aracters in this mud: True ntbkWEPanel False False 1 True True automatic automatic in True True 2 True gtk-add True True True True True False False 0 gtk-edit True True True True True False False 1 gtk-delete True True True True True False False 2 gtk-go-up True True True True True False False 3 gtk-go-down True True True True True False False 4 False False 3 1 1 2 True General False tab 12 vertical 18 vertical 6 True 0 0 <b>Font</b> True False False 0 True True False False 0 True vertical 6 True True 0 Select the font used in the _main screen: True terminalfont_btn False False 0 True True True True Select the font used in the main output screen False False 1 Use _bold font for highlighted colors (instead of just highlighting) True True False True Check if you want the highlighted ANSI colors to be displayed in bold also True True False False 2 1 1 False False 0 vertical 6 True 0 0 <b>Word Wrap</b> True False False 0 True True False False 0 True vertical 6 _Wrap lines at word boundaries True True False True Check if you want lines to be wrapped at word boundaries True True False False 0 True 4 True 0 _Indent wrapped lines by True 0 False False 0 True True 0 0 5000 1 10 0 True False False 1 True 0 pixels 0 False False 2 False False 1 Wrap lines at full _screen width True True False True True True 2 True 4 Maximum line width in _characters: True True False True True radWrapFullWidth False False 0 True True 40 40 1000 1 10 0 True False False 1 False False 3 1 1 False 1 vertical 6 True 0 0 <b>Tooltips</b> True False False 0 True True False False 0 True vertical 6 True Display _tooltips with the time when the line was received True True False True Check if you want tooltips to be displayed showing the time when a line was received if you leave the mouse over the line for a short while True True False False 0 1 1 False False 2 1 True Output Window 1 False tab 12 vertical 18 vertical 6 True 0 0 <b>Ansi Colors</b> True False False 0 True True False False 0 True 8 5 True True True #000000000000 4 4 True True True #000000000000 1 2 4 4 True True True #000000000000 2 3 4 4 True True True #000000000000 3 4 4 4 True True True #000000000000 4 5 4 4 True True True #000000000000 5 6 4 4 True True True #000000000000 6 7 4 4 True True True #000000000000 7 8 4 4 True True True #000000000000 3 4 4 4 True True True #000000000000 3 4 1 2 4 4 True True True #000000000000 3 4 2 3 4 4 True True True #000000000000 3 4 3 4 4 4 True True True #000000000000 3 4 4 5 4 4 True True True #000000000000 3 4 5 6 4 4 True True True #000000000000 3 4 6 7 4 4 True True True #000000000000 3 4 7 8 4 4 True 0 _Black True colorBtnAnsi[0] 1 2 GTK_FILL GTK_FILL 4 4 True 0 R_ed True colorBtnAnsi[1] 1 2 1 2 GTK_FILL GTK_FILL 4 4 True 0 _Green True colorBtnAnsi[2] 1 2 2 3 GTK_FILL GTK_FILL 4 4 True 0 _Yellow True colorBtnAnsi[3] 1 2 3 4 GTK_FILL GTK_FILL 4 4 True 0 B_lue True colorBtnAnsi[4] 1 2 4 5 GTK_FILL GTK_FILL 4 4 True 0 _Magenta True colorBtnAnsi[5] 1 2 5 6 GTK_FILL GTK_FILL 4 4 True 0 C_yan True colorBtnAnsi[6] 1 2 6 7 GTK_FILL GTK_FILL 4 4 True 0 _White True colorBtnAnsi[7] 1 2 7 8 GTK_FILL GTK_FILL 4 4 True 0 Bl_ack (Bold) True colorBtnAnsi[8] 4 5 GTK_FILL GTK_FILL 4 4 True 0 Re_d (Bold) True colorBtnAnsi[9] 4 5 1 2 GTK_FILL GTK_FILL 4 4 True 0 G_reen (Bold) True colorBtnAnsi[10] 4 5 2 3 GTK_FILL GTK_FILL 4 4 True 0 Yell_ow (Bold) True colorBtnAnsi[11] 4 5 3 4 GTK_FILL GTK_FILL 4 4 True 0 Bl_ue (Bold) True colorBtnAnsi[12] 4 5 4 5 GTK_FILL GTK_FILL 4 4 True 0 Magen_ta (Bold) True colorBtnAnsi[13] 4 5 5 6 GTK_FILL GTK_FILL 4 4 True 0 Cya_n (Bold) True colorBtnAnsi[14] 4 5 6 7 GTK_FILL GTK_FILL 4 4 True 0 W_hite (Bold) True colorBtnAnsi[15] 4 5 7 8 GTK_FILL GTK_FILL 4 4 1 1 False False 0 vertical 6 True 0 0 <b>Default Colors</b> True False False 0 True True False False 0 True 2 5 True True True #000000000000 4 4 True 0 _Foreground True colorBtnDeffore 1 2 GTK_FILL GTK_FILL 4 4 True True True #000000000000 3 4 4 4 True 0 Bac_kground True colorBtnDefback 4 5 GTK_FILL GTK_FILL 4 4 True True True #000000000000 1 2 4 4 True 0 Bold Foreground True colorBtnDefbold 1 2 1 2 GTK_FILL GTK_FILL 4 4 True True True #000000000000 3 4 1 2 GTK_FILL 4 4 True 0 Bold Background 4 5 1 2 GTK_FILL 1 1 False False 1 vertical 5 True 0 0 <b>Revert to default colors</b> True False False 0 True True False False 0 True vertical 6 True Re_vert to default colors True True True True Click to revert all colors to their built-in defaults True False False 0 1 1 False False 2 2 True Colors 2 False tab 12 vertical 18 vertical 6 True 0 0 <b>Font</b> True False False 0 True True False False 0 True vertical 6 True True 0 Select the font used in the _status bar: True ntbkWEPanel False False 0 True True True True Select the font used in the status bar False False 1 1 1 False False 0 vertical 6 True 0 0 <b>Time Display</b> True False False 0 True True False False 0 True vertical 2 True 0 C_onnected time: True radCTime_no False False 4 0 True True False False 0 True vertical Do not display True True False True Select if you do not want the connection time to be displayed True True True False False 0 Display as hours, minutes and seconds True True False True Select if you want the connection time to be displayed in hours, minutes and seconds True True radCTime_no False False 1 Display as seconds True True False True Select if you want the connection time to be displayed in seconds True True radCTime_no False False 2 1 False 1 True 0 _Idle time: True radITime_no False False 2 True True False False 0 True vertical Do not display True True False True Select if you do not want the idle time to be displayed True True True False False 0 Display as hours, minutes and seconds True True False True Select if you want the idle time to be displayed in hours, minutes and seconds True True radITime_no False False 1 Display as seconds True True False True Select if you want the idle time to be displayed in seconds True True radITime_no False False 2 Only _reset idle time counter when a command is entered directly True True False True Check to make the idle time counter reset only when a command is entered directly by typing it in the command entry box. If not checked, if a command is sent because of a timer, of a hook, etc, the idle timer is also reset. True True False False 3 1 3 1 False 1 False False 1 3 True Status Bar 3 False tab 12 vertical 18 vertical 5 True 0 0 <b>Command Entry</b> True False False 0 True True False False 0 True vertical 6 _Keep last typed command in command entry box True True False True Check to have the last command kept in the command entry box, so that you can repeat commands only by pressing ENTER True True False False 0 _Echo sent commands in main window True True False True Check to have the sent commands echoed in the main output window True True False False 1 _Store commands between sessions True True False True Check to have the command history saved in a file between sessions True True False False 2 Never _hide the typed text True True False True Check this if the text you type is displayed as black dots in the input box. True True 3 True 4 True 0 _Number of commands to save in history: True spnCommandsToSave False False 0 True True Specify the number of commands that are saved and can be later recalled 50 1 10000 1 10 0 1 False False 1 4 True 4 True C_ommand separator: True txtCommandSeparator False False 0 True True Specify the separator for commands typed in the command entry box 9 True 8 False 1 5 Use single-_line input bar True True False True True True False False 6 True True False False 0 True vertical 2 Enable _auto-completion True True False True Check to enable command auto-completion (based on previous commands) True True False False 0 True 4 True 0 Acti_vate auto-completion only after True spnMinPrefix False False 0 True True Specify the number of characters that must be typed for command completion to start 3 1 9999 1 10 0 1 False False 1 True characters have been entered False False 2 1 1 7 Use _multi-line input bar True True False True True radSingleLine False False 8 True True False False 0 True vertical 4 True 4 True N_umber of lines: True spnNLines False False 0 True True 2 2 10 1 3 0 1 False False 1 0 True S_pell check typed text True True False True True False False 1 True 4 True False False 0 True Language code: False False 1 True True True 7 False 2 True (Leave blank for default based on locale) False False 3 2 1 9 1 1 False False 0 vertical 6 True 0 0 <b>Font</b> True False False 0 True True False False 0 True vertical 6 True True 0 Select the font used in the command _entry box: True entryfont_btn False False 0 True True True True Select the font used in the command entry box False False 1 1 1 False 1 vertical 6 True 0 0 <b>Flood prevention</b> True False False 0 True True False False 0 True vertical 6 True True 4 Do not allow the _same command to be sent True True False True Check to prevent more than a given number of equal commands to be sent in a row (which can disconnect your character in some muds) True True False False 0 True True Specify the maximum number of equal commands that can be sent in a row 1 0 1000000 1 10 0 1 False False 1 True _times in a row True spnMaxCommands False False 2 False False 0 True 4 True Se_nd this command: True txtPreventionCommand False False 0 True True Enter a command to be sent whenever the specified maximum number of equal commands would be sent True False False 1 1 1 1 False False 2 4 True Input 4 False tab 12 vertical 18 vertical 6 True 0 0 <b>Logging Status</b> True False False 0 True True False False 0 True vertical 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0 <Filled by the program> False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 8 St_art True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 gtk-media-stop True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False 1 1 True 4 _Include the last True True False True Select to include lines from the main window in the log file. True True False False 0 True True Inform number of lines to include in the log. 6 0 0 100 1 10 0 True False False 1 True lines of the scrollback buffer in the log False False 2 2 1 1 False False 0 vertical 6 True 0 0 <b>File</b> True False False 0 True True False False 0 True vertical 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 4 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Name: True False 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 ... True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False 2 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 0.10000000149011612 Note: You can use strftime() escapes to create different files based on the date and time that logging starts. Also, %Kw represents the World name and %Kc the character name used in auto-logon. True 1 1 1 False False 1 vertical 6 True 0 0 <b>Options</b> True False False 0 True True False False 0 True vertical 6 A_utomatically start logging when connected True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True If this is selected, logging will be automatically started whenever you connect to the world. True True 0 Prefix lines with _date and/or time True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True Select this if you want to prefix each line in the log file with the date and/or time it was received. True True 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 6 True False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Format: True False 1 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK The default is to prefix lines with the date and time, but you can configure the format with strftime() escape sequences. See the manual for a description of those. 2 Revert to _default True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True 3 2 False False 1 1 False 2 10 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Logging 10 False tab 12 vertical 18 vertical 6 True 0 0 <b>Scripting</b> True False False 0 True True False False 0 True vertical 6 True True 4 True _Perl file to load: True txtScriptFile False False 2 0 True False 2 1 _Clear True True True True False False 2 False False 0 1 1 False False 0 5 True Scripting 5 False tab 12 vertical 18 vertical 16 True 0 0 <b>Plugins Currently Loaded</b> True False False 0 True False False 0 True vertical 4 True True automatic automatic in True True True 0 True True True True True True 0 0 True 2 True gtk-open False False 0 True _Load True False False 1 False False 0 gtk-help True True True True True False False 1 False 24 1 1 1 0 vertical 16 True 0 0 <b>Plugins Loaded on Startup</b> True False False 0 True False False 0 True vertical 4 True True automatic automatic in True True True 0 True gtk-add True True True True True False False 0 gtk-remove True True True True True False False 1 gtk-go-up True True True True True False False 2 gtk-go-down True True True True True False False 3 False 24 1 1 1 1 6 True Plugins 6 False tab 12 vertical 18 vertical 6 True 0 0 <b>MCCP (for compression)</b> True False False 0 True True False False 0 True vertical 4 _Enable if server proposes after connecting True True False True True True False False 0 Enable if server proposes at _any time True True False True True radMCCPAfterConnect False False 1 _Disable True True False True True radMCCPAfterConnect False False 2 1 1 False False 0 7 True Protocols 7 False tab 12 vertical 18 vertical 6 True 0 0 <b>Scrolling</b> True False False 0 True True False False 0 True vertical 6 True Scroll on _output True True False True Check to have the main window scroll to the end whenever new output comes True True 0 True 8 True _Lines to save in scrollback buffer: True txtBufferLines False False 0 True True Specify the number of lines of output that can be seen with by scrolling the window 4 0 100000 1 10 0 1 False False 1 1 1 1 False False 0 vertical 6 True 0 0 <b>Name display</b> True False False 0 True True False False 0 True vertical 6 Identify as 'World name' True True False True True 0 Identify as 'World name - Character' True True False True radNameDisplayWorld 1 Identify as 'Character - World name' True True False True radNameDisplayWorld 2 True 4 Custom: True True False True radNameDisplayWorld False False 0 True True False False 1 3 True Use %Kw to represent the World's name, and %Kc to represent the auto-logon character name True 4 1 1 False False 1 8 True Miscellaneous 8 False tab 12 vertical 18 vertical 6 True 0 0 <b>File</b> True False False 0 True True False False 0 True vertical 4 True True _File: True False False 2 0 True True True 50 2 1 0 True You can leave this field blank, and a file name will be automatically generated. Only edit this field if you know what you are doing. True 1 1 1 False False 0 vertical 6 True 0 0 <b>Character Set</b> True False False 0 True True False False 0 True True Character _set: True cmbCharset False False 2 0 True 1 1 1 False False 1 vertical 6 True 0 0 <b>Graphical Editors</b> True False False 0 True True False False 0 True vertical 6 _Ask for confirmation before deleting triggers, aliases, etc. True True False True If not checked, objects such as triggers, aliases, etc. will be deleted directly without asking for confirmation when you press the Delete button. True True False False 0 _Show items defined by plugins True True False True If checked, triggers, aliases, macros and timers defined in plugins will appear in the corresponding World Editor sections. True True False False 1 False False 1 1 False 2 vertical 6 True 0 0 <b>TCP Keep Alive</b> True False False 0 True True False False 0 True vertical 6 Enable TCP _Keep Alive packets True True False True If not checked, objects such as triggers, aliases, etc. will be deleted directly without asking for confirmation when you press the Delete button. True True False False 0 True 0 (You must reconnect for changes in this setting to take effect) 1 False False 1 1 False 3 vertical 6 True 0 0 <b>Input</b> True False False 0 True True False False 0 True vertical 6 _Disable up and down arrow keys for history navigation True True False True If checked, the up and down arrow keys are not used for navigating between saved commands. (You'll have to use Alt+up and Alt+down.) True True False False 0 False False 1 1 False 4 9 True Advanced 9 False tab 1 1 True end gtk-cancel -6 True True True True True False False 0 gtk-ok -5 True True True True True True False False 1 False end 0 kildclient-2.11.1/src/we_hooks.c0000644000175000017500000007504611541420100013410 00000000000000/* $Id: we_hooks.c 1153 2011-03-20 15:41:50Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static void create_we_hooks_models(World *world); static GtkTreeModel *create_we_hooks_model(GSList *hookptr); static void we_hook_configure_view(GtkTreeView *view); static void we_hook_combo_changed_cb(GtkComboBox *combo, gpointer data); static void we_hook_save_currently_selected(GtkTreeModel *model, GtkTreeSelection *selection); static void we_hook_add_cb(GtkButton *button, gpointer data); static void we_hook_edit_cb(GtkButton *button, gpointer data); static void we_hook_delete_cb(GtkButton *button, gpointer data); static void we_hook_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data); static gboolean edit_hook(World *world, const gchar *event, Hook *hook); static gboolean we_hook_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static void we_hook_move_cb(GtkButton *button, gpointer data); static void we_hook_export_cb(GtkButton *button, gpointer data); GObject * get_we_hooks_tab(World *world) { GtkBuilder *ui_builder; gchar *objects[] = { "we_panel_generic_graphical_editor", NULL }; GError *error = NULL; GObject *panel; GObject *viewObjects; GtkLabel *lblType; GObject *btnAdd; GObject *btnEdit; GObject *btnDelete; GObject *btnUp; GObject *btnDown; GObject *btnExport; GtkTreeSelection *selection; GtkWidget *label; GtkComboBox *cmbWhichHook; GtkWidget *hboxWhich; GtkBox *vbox_int; /* Create the dialog */ ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } panel = gtk_builder_get_object(ui_builder, "we_panel_generic_graphical_editor"); /* So it's not destroyed when the builder is destroyed */ g_object_ref(panel); viewObjects = gtk_builder_get_object(ui_builder, "viewObjects"); g_object_set_data(viewObjects, "forworld", world); g_signal_connect(viewObjects, "row-activated", G_CALLBACK(we_hook_view_row_dblclick_cb), world); g_signal_connect(viewObjects, "key-press-event", G_CALLBACK(we_hook_view_keypress_cb), world); lblType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblGEType")); gtk_label_set_markup(lblType, "Hooks"); btnAdd = gtk_builder_get_object(ui_builder, "btnGEAdd"); g_signal_connect(btnAdd, "clicked", G_CALLBACK(we_hook_add_cb), viewObjects); btnEdit = gtk_builder_get_object(ui_builder, "btnGEEdit"); g_signal_connect(btnEdit, "clicked", G_CALLBACK(we_hook_edit_cb), viewObjects); btnDelete = gtk_builder_get_object(ui_builder, "btnGEDelete"); g_signal_connect(btnDelete, "clicked", G_CALLBACK(we_hook_delete_cb), viewObjects); btnUp = gtk_builder_get_object(ui_builder, "btnGEUp"); g_object_set_data(btnUp, "isup", GINT_TO_POINTER(TRUE)); g_signal_connect(btnUp, "clicked", G_CALLBACK(we_hook_move_cb), viewObjects); btnDown = gtk_builder_get_object(ui_builder, "btnGEDown"); g_object_set_data(btnDown, "isup", GINT_TO_POINTER(FALSE)); g_signal_connect(btnDown, "clicked", G_CALLBACK(we_hook_move_cb), viewObjects); btnExport = gtk_builder_get_object(ui_builder, "btnGEExport"); /* The manually added combo for selecting which hook */ label = gtk_label_new_with_mnemonic(_("_Event:")); cmbWhichHook = GTK_COMBO_BOX(gtk_combo_box_new_text()); g_signal_connect(G_OBJECT(cmbWhichHook), "changed", G_CALLBACK(we_hook_combo_changed_cb), viewObjects); gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_WIDGET(cmbWhichHook)); hboxWhich = gtk_hbox_new(FALSE, 8); gtk_box_pack_start(GTK_BOX(hboxWhich), label, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hboxWhich), GTK_WIDGET(cmbWhichHook), FALSE, FALSE, 0); gtk_combo_box_append_text(cmbWhichHook, "OnConnect"); gtk_combo_box_append_text(cmbWhichHook, "OnDisconnect"); gtk_combo_box_append_text(cmbWhichHook, "OnReceivedText"); gtk_combo_box_append_text(cmbWhichHook, "OnSentCommand"); gtk_combo_box_append_text(cmbWhichHook, "OnGetFocus"); gtk_combo_box_append_text(cmbWhichHook, "OnLoseFocus"); gtk_combo_box_append_text(cmbWhichHook, "OnCloseConnected"); vbox_int = GTK_BOX(gtk_builder_get_object(ui_builder, "vbox_int_generic_graphical_editor")); gtk_box_pack_start(vbox_int, hboxWhich, FALSE, FALSE, 0); gtk_box_reorder_child(vbox_int, hboxWhich, 0); create_we_hooks_models(world); we_hook_configure_view(GTK_TREE_VIEW(viewObjects)); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(viewObjects)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); g_object_set_data(G_OBJECT(selection), "btnEdit", btnEdit); g_object_set_data(G_OBJECT(selection), "btnDelete", btnDelete); g_object_set_data(G_OBJECT(selection), "btnUp", btnUp); g_object_set_data(G_OBJECT(selection), "btnDown", btnDown); g_object_set_data(G_OBJECT(selection), "btnExport", btnExport); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(we_guied_selection_changed_cb), NULL); /* Select first, will cause a model to be associated with the view */ gtk_combo_box_set_active(cmbWhichHook, 0); gtk_builder_connect_signals(ui_builder, world); /* The callback for the Export buttons in the Hooks tab is a different one - so we disconnect the handler from the XML UI file and connect the correct one. */ g_signal_handlers_disconnect_by_func(btnExport, we_guied_export_cb, world); g_signal_connect(btnExport, "clicked", G_CALLBACK(we_hook_export_cb), viewObjects); g_object_unref(ui_builder); return panel; } static void create_we_hooks_models(World *world) { world->hooks.OnConnect_model = create_we_hooks_model(world->hooks.OnConnect); g_object_set_data(G_OBJECT(world->hooks.OnConnect_model), "forevent", "OnConnect"); g_object_set_data(G_OBJECT(world->hooks.OnConnect_model), "selected_list", &world->selected_OnConnect_hooks); world->hooks.OnConnect_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnConnect_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnConnect_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnConnect_model_filter), we_guied_plugin_filter_func, world, NULL); world->hooks.OnDisconnect_model = create_we_hooks_model(world->hooks.OnDisconnect); g_object_set_data(G_OBJECT(world->hooks.OnDisconnect_model), "forevent", "OnDisconnect"); g_object_set_data(G_OBJECT(world->hooks.OnDisconnect_model), "selected_list", &world->selected_OnDisconnect_hooks); world->hooks.OnDisconnect_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnDisconnect_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnDisconnect_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnDisconnect_model_filter), we_guied_plugin_filter_func, world, NULL); world->hooks.OnReceivedText_model = create_we_hooks_model(world->hooks.OnReceivedText); g_object_set_data(G_OBJECT(world->hooks.OnReceivedText_model), "forevent", "OnReceivedText"); g_object_set_data(G_OBJECT(world->hooks.OnReceivedText_model), "selected_list", &world->selected_OnReceivedText_hooks); world->hooks.OnReceivedText_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnReceivedText_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnReceivedText_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnReceivedText_model_filter), we_guied_plugin_filter_func, world, NULL); world->hooks.OnSentCommand_model = create_we_hooks_model(world->hooks.OnSentCommand); g_object_set_data(G_OBJECT(world->hooks.OnSentCommand_model), "forevent", "OnSentCommand"); g_object_set_data(G_OBJECT(world->hooks.OnSentCommand_model), "selected_list", &world->selected_OnSentCommand_hooks); world->hooks.OnSentCommand_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnSentCommand_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnSentCommand_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnSentCommand_model_filter), we_guied_plugin_filter_func, world, NULL); world->hooks.OnGetFocus_model = create_we_hooks_model(world->hooks.OnGetFocus); g_object_set_data(G_OBJECT(world->hooks.OnGetFocus_model), "forevent", "OnGetFocus"); g_object_set_data(G_OBJECT(world->hooks.OnGetFocus_model), "selected_list", &world->selected_OnGetFocus_hooks); world->hooks.OnGetFocus_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnGetFocus_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnGetFocus_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnGetFocus_model_filter), we_guied_plugin_filter_func, world, NULL); world->hooks.OnLoseFocus_model = create_we_hooks_model(world->hooks.OnLoseFocus); g_object_set_data(G_OBJECT(world->hooks.OnLoseFocus_model), "forevent", "OnLoseFocus"); g_object_set_data(G_OBJECT(world->hooks.OnLoseFocus_model), "selected_list", &world->selected_OnLoseFocus_hooks); world->hooks.OnLoseFocus_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnLoseFocus_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnLoseFocus_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnLoseFocus_model_filter), we_guied_plugin_filter_func, world, NULL); world->hooks.OnCloseConnected_model = create_we_hooks_model(world->hooks.OnCloseConnected); g_object_set_data(G_OBJECT(world->hooks.OnCloseConnected_model), "forevent", "OnCloseConnected"); g_object_set_data(G_OBJECT(world->hooks.OnCloseConnected_model), "selected_list", &world->selected_OnCloseConnected_hooks); world->hooks.OnCloseConnected_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnCloseConnected_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnCloseConnected_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnCloseConnected_model_filter), we_guied_plugin_filter_func, world, NULL); } static GtkTreeModel * create_we_hooks_model(GSList *hookptr) { GtkListStore *store; GtkTreeIter iter; Hook *hook; store = gtk_list_store_new(WE_GUIED_N_COLS, G_TYPE_POINTER); while (hookptr) { hook = (Hook *) hookptr->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, WE_GUIED_POINTER, hook, -1); hookptr = hookptr->next; } return GTK_TREE_MODEL(store); } static void we_hook_configure_view(GtkTreeView *view) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; /* Column 1 - Enabled? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(HOOK_ENABLED)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Enabled")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(HOOK_ENABLED), NULL); gtk_tree_view_append_column(view, column); /* Column 2 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(HOOK_NAME), NULL); gtk_tree_view_append_column(view, column); /* Column 3 - Action */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Action")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(HOOK_ACTION), NULL); gtk_tree_view_append_column(view, column); /* Column 4 - Plugin */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Plugin")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(OBJECT_PLUGIN), NULL); gtk_tree_view_append_column(view, column); } static void we_hook_combo_changed_cb(GtkComboBox *combo, gpointer data) { GtkTreeView *view; World *world; gchar *newevent; GtkTreeModel *oldmodel; GtkTreeModel *newmodel; GSList **selected_list; GtkTreeSelection *selection; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); oldmodel = gtk_tree_view_get_model(view); if (oldmodel) { /* Save selected rows */ we_hook_save_currently_selected(oldmodel, gtk_tree_view_get_selection(view)); } newevent = gtk_combo_box_get_active_text(combo); newmodel = get_hook_model(world, newevent); gtk_tree_view_set_model(view, newmodel); selected_list = g_object_get_data(G_OBJECT(newmodel), "selected_list"); if (*selected_list) { /* Restore selected rows */ GSList *listiter; selection = gtk_tree_view_get_selection(view); listiter = *selected_list; while (listiter) { GtkTreePath *path = gtk_tree_row_reference_get_path(listiter->data); gtk_tree_selection_select_path(selection, path); listiter = listiter->next; } } gtk_tree_view_columns_autosize(view); g_free(newevent); } static void we_hook_save_currently_selected(GtkTreeModel *model, GtkTreeSelection *selection) { GSList **selected_list; GList *curr_selected; selected_list = g_object_get_data(G_OBJECT(model), "selected_list"); g_slist_foreach(*selected_list, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(*selected_list); *selected_list = NULL; curr_selected = gtk_tree_selection_get_selected_rows(selection, NULL); if (curr_selected) { GList *listiter; listiter = curr_selected; while (listiter) { *selected_list = g_slist_append(*selected_list, gtk_tree_row_reference_new(model, listiter->data)); listiter = listiter->next; } g_list_foreach(curr_selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(curr_selected); } } static void we_hook_add_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; GtkTreeModel *model; gchar *event; GSList **hook_list; gint *hookpos; Hook *hook; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); model = gtk_tree_view_get_model(view); event = g_object_get_data(G_OBJECT(model), "forevent"); hook = g_new0(Hook, 1); hook->enabled = 1; if (edit_hook(world, event, hook)) { hook_list = get_hook_list_for_writing(world, event, &hookpos); *hook_list = g_slist_insert(*hook_list, hook, *hookpos); we_hook_insert_hook(world, event, hook, (*hookpos)++); } else { g_free(hook); } } static void we_hook_edit_cb(GtkButton *button, gpointer data) { /* Note that the Edit button is only active when exactly one row is selected. */ World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Hook *hook; gchar *event; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &hook, -1); event = g_object_get_data(G_OBJECT(model), "forevent"); if (edit_hook(world, event, hook)) { we_hook_update_hook(world, event, hook); } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_hook_delete_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Hook *hook; GSList *hooklist; gint pos; gchar *event; GtkWidget *msgdlg; gint n; n = gtk_tree_selection_count_selected_rows(selection); msgdlg = we_guied_confirm_delete_dialog_new(GTK_WINDOW(world->dlgEditWorld), n, _("hook"), _("hooks")); if (!world->confirm_delete || gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { GList *listiter = g_list_last(selected); event = g_object_get_data(G_OBJECT(model), "forevent"); hooklist = get_hook_list_for_reading(world, event, NULL); while (listiter) { gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &hook, -1); pos = g_slist_index(hooklist, hook); delete_hook(world, event, pos, NULL); listiter = listiter->prev; } } gtk_widget_destroy(msgdlg); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_hook_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { World *world; GtkTreeModel *model; GtkTreeIter iter; world = (World *) data; model = gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model, &iter, path)) { Hook *hook; gchar *event; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &hook, -1); event = g_object_get_data(G_OBJECT(model), "forevent"); if (edit_hook(world, event, hook)) { we_hook_update_hook(world, event, hook); } } } static gboolean edit_hook(World *world, const gchar *event, Hook *hook) { GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditHook", NULL }; GError *error = NULL; GtkWidget *dlgEditHook; GtkLabel *lblEvent; GtkEntry *txtName; GtkEntry *txtAction; GtkToggleButton *chkEnabled; const gchar *newname; const gchar *newaction; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return FALSE; } dlgEditHook = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditHook")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditHook), GTK_RESPONSE_OK); lblEvent = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblHookEvent")); txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtHookName")); txtAction = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtHookAction")); chkEnabled = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkHookEnabled")); /* Only display note when editing a plugin's trigger */ if (!hook->owner_plugin) { GObject *label; label = gtk_builder_get_object(ui_builder, "lblNoteHook"); gtk_widget_destroy(GTK_WIDGET(label)); label = gtk_builder_get_object(ui_builder, "lblNoteTextHook"); gtk_widget_destroy(GTK_WIDGET(label)); } /* We don't need it anymore */ g_object_unref(ui_builder); /* Fill-in values */ gtk_label_set_text(lblEvent, event); if (hook->name) { gtk_entry_set_text(txtName, hook->name); } if (hook->action) { gtk_entry_set_text(txtAction, hook->action); } gtk_toggle_button_set_active(chkEnabled, hook->enabled); /* Run the dialog until the input is valid or cancelled */ gtk_widget_show_all(dlgEditHook); while (1) { if (gtk_dialog_run(GTK_DIALOG(dlgEditHook)) == GTK_RESPONSE_OK) { /* Validate */ newaction = gtk_entry_get_text(txtAction); if (strcmp(newaction, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditHook), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the action.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* Update values */ newname = gtk_entry_get_text(txtName); if (!hook->name || strcmp(newname, hook->name) != 0) { g_free(hook->name); if (strcmp(newname, "") != 0) { hook->name = g_strdup(newname); } else { hook->name = NULL; } } if (!hook->action || strcmp(newaction, hook->action) != 0) { g_free(hook->action); hook->action = g_strdup(newaction); } hook->enabled = gtk_toggle_button_get_active(chkEnabled); /* We've finished successfully */ gtk_widget_destroy(dlgEditHook); return TRUE; } else { /* Cancel pressed */ gtk_widget_destroy(dlgEditHook); return FALSE; } } } static gboolean we_hook_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_Delete || evt->keyval == GDK_KP_Delete) { we_hook_delete_cb(NULL, widget); return TRUE; } return FALSE; } static void we_hook_move_cb(GtkButton *button, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; World *world; gboolean is_up; gint new_pos; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "isup")); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { GSList *hooklist; gint hook_pos; Hook *hook; gchar *event; gint pos; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &hook, -1); event = g_object_get_data(G_OBJECT(model), "forevent"); hooklist = get_hook_list_for_reading(world, event, &hook_pos); pos = g_slist_index(hooklist, hook); new_pos = pos; if (is_up) { if (pos != 0) { new_pos = pos - 1; move_hook(world, event, pos, new_pos); } } else { if (pos != hook_pos - 1) { new_pos = pos + 1; move_hook(world, event, pos, new_pos); } } /* Reselect the moved item */ gtk_tree_model_iter_nth_child(model, &iter, NULL, new_pos); gtk_tree_selection_select_iter(selection, &iter); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_hook_export_cb(GtkButton *button, gpointer data) { GtkTreeView *view; GtkTreeModel *model; World *world; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); model = gtk_tree_view_get_model(view); we_hook_save_currently_selected(model, gtk_tree_view_get_selection(view)); g_object_set_data(G_OBJECT(button), "preselect", g_object_get_data(G_OBJECT(model), "forevent")); we_guied_export_cb(button, world); } void we_hook_update_hook(World *world, const gchar *event, Hook *hook_arg) { /* Called by the Perl functions when an hook is changed, so that the display is updated. */ GtkTreeIter iter; GtkTreePath *path; GtkTreeModel *model; Hook *hook; gboolean success; model = get_hook_model(world, event); if (!model) { return; } success = gtk_tree_model_get_iter_first(model, &iter); while (success) { gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &hook, -1); if (hook == hook_arg) { path = gtk_tree_model_get_path(model, &iter); gtk_tree_model_row_changed(model, path, &iter); gtk_tree_path_free(path); return; } success = gtk_tree_model_iter_next(model, &iter); } } void we_hook_insert_hook(World *world, const gchar *event, Hook *hook, gint pos) { /* Called by the Perl functions when an hook is inserted, so that the display is updated. */ GtkTreeModel *model; GtkTreeIter iter; model = get_hook_model(world, event); if (!model) { return; } gtk_list_store_insert(GTK_LIST_STORE(model), &iter, pos); gtk_list_store_set(GTK_LIST_STORE(model), &iter, WE_GUIED_POINTER, hook, -1); } void we_hook_delete_hook(World *world, const gchar *event, Hook *hook_arg) { /* Called by the Perl functions when an hook is deleted, so that the display is updated. */ GtkTreeIter iter; GtkTreeModel *model; Hook *hook; gboolean success; model = get_hook_model(world, event); if (!model) { return; } success = gtk_tree_model_get_iter_first(model, &iter); while (success) { gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &hook, -1); if (hook == hook_arg) { gtk_list_store_remove(GTK_LIST_STORE(model), &iter); return; } success = gtk_tree_model_iter_next(model, &iter); } } kildclient-2.11.1/src/ansi.h0000644000175000017500000001426611526001511012532 00000000000000/* $Id: ansi.h 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifndef __ANSI_H #define __ANSI_H /************************************ * ANSI Escape Sequences - Integers * ************************************/ #define ANSI_FIRST_FG_COLOR 30 #define ANSI_LAST_FG_COLOR 37 #define ANSI_FIRST_BG_COLOR 40 #define ANSI_LAST_BG_COLOR 47 #define ANSI_FG_DEFAULT 39 #define ANSI_BG_DEFAULT 49 #define ANSI_RESET 0 #define ANSI_SET_FG_BOLD 1 #define ANSI_BOLD_OFF 22 #define ANSI_SET_BG_LIGHT 5 #define ANSI_BOLD_BG_OFF 25 #define ANSI_SET_UNDERLINE 4 #define ANSI_SET_DBLUNDERLINE 21 #define ANSI_UNDERLINE_OFF 24 #define ANSI_SET_STRIKE 9 #define ANSI_STRIKE_OFF 29 #define ANSI_SET_ITALICS 3 #define ANSI_ITALICS_OFF 23 #define ANSI_SET_REVERSE 7 #define ANSI_REVERSE_OFF 27 #define ANSI_SET_HIDDEN 8 #define ANSI_HIDDEN_OFF 28 /* Support for xterm's 256 color cube */ #define XTERM256_SET_FORE 38 #define XTERM256_SET_BACK 48 #define XTERM256_SECOND_CODE 5 /******************** * For ANSI parsing * ********************/ #define ANSI_ESC 0x1b /* 033, 27 dec */ #define ANSI_TABLE_SIZE 20 #define ANSI_N_COLORS_HIGHLIGHT 17 #define ANSI_N_COLORS 8 #define ANSI_NORMAL_BASE_IDX 0 #define ANSI_BOLD_BASE_IDX 9 #define ANSI_DEFAULT_COLOR_IDX 8 #define ANSI_DEFAULT_BOLD_COLOR_IDX 17 #define ANSI_BLACK_IDX 0 #define ANSI_REVERSE_DEFAULT_IDX 18 #define ANSI_REVERSE_BOLD_DEFAULT_IDX 19 /* This offset represents the difference in the way the tags and the ansi colors are stored. For the tags, 0-7 hold the basic colors, 8 the default color, 9-16 the bold colors and 17 the default bold; for colors ansicolors have the basic and bold colors in sequence in 0-15, and defaults are stored separatedly. */ #define ANSI_TABLE_OFFSET 1 /*********************************** * ANSI Escape Sequences - Strings * ***********************************/ /* Basic building blocks for colors */ #define ANSI_START "\033[" #define ANSI_COLOR_END "m" #define ANSI_SEP ";" #define ANSI_ATTRIBS_OFF "0" #define ANSI_BOLD_ON "1" #define ANSI_BLINK_ON "5" /* Actually causes light background */ #define ANSI_FG_BLACK "30" #define ANSI_FG_RED "31" #define ANSI_FG_GREEN "32" #define ANSI_FG_YELLOW "33" #define ANSI_FG_BLUE "34" #define ANSI_FG_MAGENTA "35" #define ANSI_FG_CYAN "36" #define ANSI_FG_WHITE "37" #define ANSI_BG_BLACK "40" #define ANSI_BG_RED "41" #define ANSI_BG_GREEN "42" #define ANSI_BG_YELLOW "43" #define ANSI_BG_BLUE "44" #define ANSI_BG_MAGENTA "45" #define ANSI_BG_CYAN "46" #define ANSI_BG_WHITE "47" /* Codes to set colors */ #define ANSI_RESET_DEFAULT ANSI_START ANSI_ATTRIBS_OFF ANSI_COLOR_END #define ANSI_SET_FG_BLACK ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_BLACK ANSI_COLOR_END #define ANSI_SET_FG_RED ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_RED ANSI_COLOR_END #define ANSI_SET_FG_GREEN ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_GREEN ANSI_COLOR_END #define ANSI_SET_FG_BLUE ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_BLUE ANSI_COLOR_END #define ANSI_SET_FG_YELLOW ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_YELLOW ANSI_COLOR_END #define ANSI_SET_FG_MAGENTA ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_MAGENTA ANSI_COLOR_END #define ANSI_SET_FG_CYAN ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_CYAN ANSI_COLOR_END #define ANSI_SET_FG_WHITE ANSI_START ANSI_ATTRIBS_OFF ANSI_SEP \ ANSI_FG_WHITE ANSI_COLOR_END #define ANSI_SET_BG_BLACK ANSI_START ANSI_BG_BLACK ANSI_COLOR_END #define ANSI_SET_BG_RED ANSI_START ANSI_BG_RED ANSI_COLOR_END #define ANSI_SET_BG_GREEN ANSI_START ANSI_BG_GREEN ANSI_COLOR_END #define ANSI_SET_BG_BLUE ANSI_START ANSI_BG_BLUE ANSI_COLOR_END #define ANSI_SET_BG_YELLOW ANSI_START ANSI_BG_YELLOW ANSI_COLOR_END #define ANSI_SET_BG_MAGENTA ANSI_START ANSI_BG_MAGENTA ANSI_COLOR_END #define ANSI_SET_BG_CYAN ANSI_START ANSI_BG_CYAN ANSI_COLOR_END #define ANSI_SET_BG_WHITE ANSI_START ANSI_BG_WHITE ANSI_COLOR_END #define ANSI_SET_FG_BLACK_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_BLACK ANSI_COLOR_END #define ANSI_SET_FG_RED_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_RED ANSI_COLOR_END #define ANSI_SET_FG_GREEN_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_GREEN ANSI_COLOR_END #define ANSI_SET_FG_BLUE_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_BLUE ANSI_COLOR_END #define ANSI_SET_FG_YELLOW_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_YELLOW ANSI_COLOR_END #define ANSI_SET_FG_MAGENTA_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_MAGENTA ANSI_COLOR_END #define ANSI_SET_FG_CYAN_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_CYAN ANSI_COLOR_END #define ANSI_SET_FG_WHITE_BOLD ANSI_START ANSI_BOLD_ON ANSI_SEP \ ANSI_FG_BOLD ANSI_COLOR_END #endif kildclient-2.11.1/src/util_cursor.h0000644000175000017500000000467411405233112014154 00000000000000#ifndef SIMO_UTIL_CURSOR_H #define SIMO_UTIL_CURSOR_H #define SIMO_WAIT GDK_WATCH #define SIMO_HAND GDK_HAND2 #define SIMO_ARROW GDK_ARROW typedef GdkCursor * SimoCursor; #define simo_cursor_new( t ) gdk_cursor_new( t ) #define simo_cursor_free( c ) gdk_cursor_unref( (GdkCursor*)c ) #define simo_cursor_set_delay( win, cursor )gdk_window_set_cursor( win, (GdkCursor*)cursor ) #ifdef GDK_WINDOWING_X11 #define simo_cursor_set( win, cursor ) \ gdk_window_set_cursor( win, cursor ); #elif defined( GDK_WINDOWING_WIN32 ) typedef struct _GdkCursorPrivate GdkCursorPrivate; struct _GdkCursorPrivate { GdkCursor cursor; HCURSOR hcursor; }; #define simo_cursor_set( win, cursor ) \ if( cursor ){ \ GdkCursorPrivate *priv = (GdkCursorPrivate*)cursor; \ gdk_window_set_cursor( win, (GdkCursor*)cursor ); \ SetCursor( priv->hcursor ); \ }else{ \ gdk_window_set_cursor( win, NULL ); \ SetCursor( NULL ); \ } #endif /* //#define SIMO_WAIT GDK_WATCH //#define SIMO_HAND GDK_HAND1 //#define SIMO_ARROW GDK_ARROW #if 0 // as defined in gdkcursor-win32.h // for getting access to the internals of GdkCursor typedef struct _GdkCursorPrivate GdkCursorPrivate; struct _GdkCursorPrivate { GdkCursor cursor; HCURSOR hcursor; }; //#define SIMO_WAIT IDC_WAIT //#define SIMO_HAND IDC_HAND typedef gpointer SimoCursor; #define simo_cursor_set( win, cursor )\ if( cursor ){ \ GdkCursorPrivate *priv = (GdkCursorPrivate*)cursor; \ gdk_window_set_cursor( win, (GdkCursor*)cursor ); \ SetCursor( priv->hcursor ); \ }else{ \ gdk_window_set_cursor( win, (GdkCursor*)default_cursor ); \ SetCursor( NULL ); \ } #endif #ifdef __cplusplus extern "C"{ #endif typedef enum _SimoCursorType{ SIMO_ARROW, SIMO_HAND, SIMO_WAIT }SimoCursorType; struct _SimoCursor{ GdkCursor *cursor; SimoCursorType type; }; typedef struct _SimoCursor * SimoCursor; extern __declspec( dllexport ) SimoCursor simo_cursor_new( SimoCursorType type ); extern __declspec( dllexport ) void simo_cursor_free( SimoCursor c ); extern __declspec( dllexport ) SimoCursor simo_cursor_set( GdkWindow *win, SimoCursor cursor ); //#define simo_cursor_new( t ) gdk_cursor_new( t ) //#define simo_cursor_free( c )gdk_cursor_unref( (GdkCursor*)c ) #ifdef __cplusplus } #endif #endif */ #endif kildclient-2.11.1/src/simocombobox.h0000644000175000017500000002224111405233112014270 00000000000000/* * SimoComboBox is meant to be an alternative combobox to the * standard GtkComboBox. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: * Todd A. Fisher (toddf@simosoftware.com) * */ #ifndef SIMO_COMBO_BOX_H #define SIMO_COMBO_BOX_H #include G_BEGIN_DECLS #define SIMO_TYPE_COMBO_BOX (simo_combo_box_get_type ()) #define SIMO_COMBO_BOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),\ SIMO_TYPE_COMBO_BOX, SimoComboBox)) #define SIMO_COMBO_BOX_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), \ SIMO_TYPE_COMBO_BOX,\ SimoComboBoxClass)) #define SIMO_IS_COMBO_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),\ SIMO_TYPE_COMBO_BOX)) #define SIMO_IS_COMBO_BOX_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable),\ SIMO_TYPE_COMBO_BOX)) #define SIMO_COMBO_BOX_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst),\ SIMO_TYPE_COMBO_BOX,\ SimoComboBoxClass)) typedef struct _SimoComboBox SimoComboBox; typedef struct _SimoComboBoxClass SimoComboBoxClass; typedef struct _SimoComboBoxPrivate SimoComboBoxPrivate; struct _SimoComboBox { GtkHBox parent_instance; /* basic interfaces are here */ GtkTreeModel *model; GtkTreeView *treeview; /* you should avoid setting headers and other such strangness here but if you'd like to feel free */ GtkTreeViewColumn *column; GtkWidget *button; GtkWidget *entry; GtkWidget *txtview; GtkTextBuffer *txtbuffer; GtkWidget *label; /* this label is placed in the button and visible if the combobox is not editable */ gboolean editable; guint max_popup_height;/* this is an absolute value of the max the popup window can grow to before a scroll bar appears */ guint max_popup_width; /* this value represents how much larger then the combo box width can the popup window appear */ gint visible_column; /*< private >*/ SimoComboBoxPrivate *priv; }; struct _SimoComboBoxClass { GtkHBoxClass parent_class; /* signals */ void (* clicked) (SimoComboBox *combo_box); void (* popup_displayed) (SimoComboBox *combo_box); void (* popup_closed) (SimoComboBox *combo_box); void (* changed) (SimoComboBox *combo_box); void (* activate) (SimoComboBox *combo_box); void (* size_changed) (SimoComboBox *combo_box); /* Padding for future expansion */ void (*_simo_reserved0) (void); void (*_simo_reserved1) (void); void (*_simo_reserved2) (void); void (*_simo_reserved3) (void); }; /* construction */ GType simo_combo_box_get_type(void); GtkWidget *simo_combo_box_new(void); /* NOTE: if you construct your own model you can only use insert_seperator if column index 0 is GDK_TYPE_PIXBUF and index 1 is of G_TYPE_INT when index 1 is 1 the seperator is displayed and the text is hidden when index 1 is 0 the seperator is hidden and the text is displayed */ GtkWidget *simo_combo_box_new_with_model(GtkTreeModel *model); /* * exported function for creating simocombobox from libglade as a custom widget */ GtkWidget *create_simo_combo_box(gchar *widget_name, gchar *button_name, gchar *entry_name, gint editable, gint entry_alloc_width); /* getters and setters */ void simo_combo_box_set_model(SimoComboBox *combo_box, GtkTreeModel *model); void simo_combo_box_set_combo_column(SimoComboBox *combo_box, GtkTreeViewColumn *column); GtkEntryCompletion *simo_combo_box_get_completion(SimoComboBox *combo_box); /* text access */ const gchar *simo_combo_box_get_text(SimoComboBox *combo_box); void simo_combo_box_set_text(SimoComboBox *combo_box, const gchar *text); void simo_combo_box_set_visibility(SimoComboBox *combo_box, gboolean visible); void simo_combo_box_clear_text(SimoComboBox *combo_box); void simo_combo_box_set_position(SimoComboBox *combo_box, gint position); gboolean simo_combo_box_get_selection_bounds(SimoComboBox *combo_box, gint *start, gint *end); void simo_combo_box_select_region(SimoComboBox *combo_box, gint start, gint end); void simo_combo_box_delete_selection(SimoComboBox *combo_box); void simo_combo_box_cut_clipboard(SimoComboBox *combo_box); void simo_combo_box_copy_clipboard(SimoComboBox *combo_box); void simo_combo_box_paste_clipboard(SimoComboBox *combo_box); void simo_combo_box_set_entry_font(SimoComboBox *combo_box, PangoFontDescription *fontDesc); /* Spell checking */ gboolean simo_combo_box_set_spell(SimoComboBox *combo_box, gboolean use_spell, gchar *language, GError **error); /* For completion: Either set_visible_column to get an automatic renderer, or set_completion_renderer to create your own. */ void simo_combo_box_set_visible_column(SimoComboBox *combo_box, int col_id); void simo_combo_box_set_completion_renderer(SimoComboBox *combo_box, GtkCellRenderer *renderer); void simo_combo_box_set_completion_cell_func(SimoComboBox *combo_box, GtkCellRenderer *renderer, GtkCellLayoutDataFunc func, gpointer user_data, GDestroyNotify destroy); /* FIXME: Add wrapper for function to set attribute. */ GtkTreeModel *simo_combo_box_get_model(SimoComboBox *combo_box); void simo_combo_box_set_active_iter(SimoComboBox *combo_box, GtkTreeIter *iter); gboolean simo_combo_box_get_active_iter(SimoComboBox *combo_box, GtkTreeIter *iter); void simo_combo_box_insert_seperator(SimoComboBox *combo_box, GtkTreeIter *iter); void simo_combo_box_set_editable(SimoComboBox *combo_box, gboolean editable_state); gboolean simo_combo_box_get_editable(SimoComboBox *combo_box); /* programmatic control */ void simo_combo_box_popup(SimoComboBox *combo_box); /* when implementing a costum model for the combobox you should connect the visible column to this method with gtk_tree_view_column_set_cell_data_func(column, cell, simo_combo_box_pixbuf_column_render, NULL, NULL ) */ void simo_combo_box_pixbuf_column_render(GtkTreeViewColumn *col, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer null); void simo_combo_box_visible_column_render(GtkTreeViewColumn *col, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer null); gboolean simo_combo_box_get_n_lines(SimoComboBox *combo_box); void simo_combo_box_set_n_lines(SimoComboBox *combo_box, gint n_lines); G_END_DECLS #endif /* __simo_COMBO_BOX_H__ */ kildclient-2.11.1/src/timers.c0000644000175000017500000001454611570205043013104 00000000000000/* $Id: timers.c 1176 2011-05-28 14:43:45Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "kildclient.h" #include "perlscript.h" #include "ansi.h" /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ gboolean run_timer(gpointer data) { Timer *timer = (Timer *) data; World *world = timer->for_world; if (world->disable_timers) { return TRUE; } world_for_perl = world; parse_commands(world, timer->action, strlen(timer->action)); we_timer_update_timer(world, timer); world_for_perl = currentWorld; if (timer->count != -1 && --timer->count <= 0) { if (timer->temporary) { we_timer_delete_timer(world, timer); world->timers = g_slist_remove(world->timers, timer); if (!timer->owner_plugin) { --world->timer_pos; } free_timer(timer, NULL); } else { timer->enabled = FALSE; } return FALSE; } return TRUE; } void start_timers(World *world) { GSList *timerptr = world->timers; Timer *timer; while (timerptr) { timer = (Timer *) timerptr->data; /* Timers of plugins loaded from the script file have already been started. */ if (timer->enabled && !timer->function_id) { timer->function_id = g_timeout_add(timer->interval * 1000, run_timer, timer); } timerptr = timerptr->next; } } void remove_timer(World *world, GSList *timeritem) { Timer *timer = (Timer *) timeritem->data; we_timer_delete_timer(world, timer); world->timers = g_slist_remove_link(world->timers, timeritem); if (!timer->owner_plugin) { --world->timer_pos; } free_timer(timer, NULL); g_slist_free(timeritem); } gboolean move_timer(World *world, gint old_pos, gint new_pos) { GSList *timeritem; gpointer timer; timeritem = g_slist_nth(world->timers, old_pos); if (!timeritem) { return FALSE; } timer = timeritem->data; world->timers = g_slist_delete_link(world->timers, timeritem); world->timers = g_slist_insert(world->timers, timer, new_pos); we_timer_delete_timer(world, timer); we_timer_insert_timer(world, timer, new_pos); return TRUE; } void free_timer(Timer *timer, gpointer data) { if (timer->enabled) { g_source_remove(timer->function_id); } g_free(timer->action); g_free(timer); } void list_timers(World *world, Plugin *plugin) { guint i; guint interval_width; guint repeat_width; guint total_width; guint field_width; GSList *timerptr; Timer *timer; /* The rows argument is not used. */ ansitextview_get_size(world->gui, &field_width, &total_width); /* If the screen is really narrow, we can do nothing. */ if (total_width < 29) { total_width = 29; } /* Calculate maximum size necessary for the interval and repeat count fields */ interval_width = 3; repeat_width = 5; timerptr = world->timers; while (timerptr) { guint this_int_width; guint this_rep_width; timer = (Timer *) timerptr->data; this_int_width = (guint) log10(timer->interval) + 1; if (this_int_width > interval_width) { interval_width = this_int_width; } this_rep_width = (guint) log10(timer->count) + 1; if (this_rep_width > repeat_width) { repeat_width = this_rep_width; } timerptr = timerptr->next; } field_width = total_width - 13 - interval_width - 1 - repeat_width - 1; ansitextview_append_string(world->gui, _("Num Ena Temp Int ")); for (i = 0; i < interval_width - 3; ++i) { ansitextview_append_string(world->gui, " "); } ansitextview_append_string(world->gui, _("Count ")); for (i = 0; i < repeat_width - 5; ++i) { ansitextview_append_string(world->gui, " "); } ansitextview_append_string_nl(world->gui, _("Action")); ansitextview_append_string(world->gui, "--- --- ---- "); for (i = 0; i < interval_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, " "); for (i = 0; i < repeat_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, " "); for (i = 0; i < field_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, "\n"); i = 0; timerptr = world->timers; while (timerptr) { timer = (Timer *) timerptr->data; if (timer->owner_plugin == plugin) { ansitextview_append_stringf(world->gui,"%3d %3.3s %4.4s %*u %*d %-*.*s\n", i, timer->enabled ? _("y") : _("n"), timer->temporary ? _("y") : _("n"), interval_width, timer->interval, repeat_width, timer->count, field_width, field_width, timer->action); } ++i; timerptr = timerptr->next; } } void save_timer(GString *str, Timer *timer) { g_string_append(str, " name) { g_string_append_printf(str, "name=\"%s\" ", timer->name); } g_string_append_printf(str, "interval=\"%d\" count=\"%d\" enabled=\"%d\" temporary=\"%d\">", timer->interval, timer->count, timer->enabled, timer->temporary); kc_g_string_append_escaped(str, "%s\n", timer->action); } kildclient-2.11.1/src/dlgSelectWorld.glade0000644000175000017500000002617511405233112015345 00000000000000 8 Connect to True True normal False True vertical 2 _Select a saved world: True True False True True True False False 4 1 True True never automatic in 200 175 True True True False 4 2 True 8 True gtk-new True True True True 0 gtk-edit True True True True 1 gtk-delete True True True True 2 3 True 8 4 Or connect d_irectly: True True False True True True radFromList False False 4 5 True 2 2 True 1 _Host: True txtHost 4 4 True 1 _Port: True txtPort 1 2 GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 True True True 1 2 GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 True True True 1 2 1 2 4 4 4 6 True end gtk-cancel -6 True True True True False False 0 gtk-connect -5 True True True True True False False 1 False end 0 kildclient-2.11.1/src/worldgui.c0000644000175000017500000015345511570205043013440 00000000000000/* $Id: worldgui.c 1176 2011-05-28 14:43:45Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #ifdef __WIN32__ # include # include #endif #include "kcircularqueue.h" #include "simocombobox.h" #include "kildclient.h" #include "ansi.h" #include "perlscript.h" /****************** * File variables * ******************/ static gboolean hovering_over_link = FALSE; static GdkCursor *hand_cursor = NULL; static GdkCursor *regular_cursor = NULL; /*********************** * Function prototypes * ***********************/ static void combo_changed_cb(SimoComboBox *combo, gpointer data); static void combo_poped_cb(SimoComboBox *combo, gpointer data); static void combo_closed_cb(SimoComboBox *combo, gpointer data); static void n_lines_changed_cb(SimoComboBox *combo, gpointer data); static void activate_cb(SimoComboBox *cmb, gpointer data); static gboolean keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static void text_changed_cb(SimoComboBox *cmb, gpointer data); static void cursor_moved_cb(GtkTextBuffer *buffer, GtkTextIter *iter, GtkTextMark *mark, gpointer data); static gboolean completion_function(GtkEntryCompletion *completion, const gchar *key, GtkTreeIter *iter, gpointer user_data); static gboolean completion_match_selected_cb(GtkEntryCompletion *widget, GtkTreeModel *model, GtkTreeIter *iter, gpointer data); static void tab_close_cb(GtkWidget *widget, gpointer data); static gboolean textview_button_press_cb(GtkWidget *text_view, GdkEventButton *event, gpointer data); static gboolean act_if_link(WorldGUI *gui, GtkTextIter *iter, GdkEventButton *event); static gboolean textview_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data); static gboolean textview_visibility_notify_event(GtkWidget *widget, GdkEventVisibility *event, gpointer data); static void set_cursor_if_appropriate(GtkTextView *text_view, WorldGUI *gui, gint x, gint y); static gboolean worldgui_query_tooltip_cb(GtkWidget *widget, gint x, gint y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer data); static gchar *worldgui_get_tooltip_text(WorldGUI *gui, GtkTextView *text_view, gint win_x, gint win_y); static void textview_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data); static void find_incremental_cb(GtkEditable *widget, gpointer data); static void do_find(WorldGUI *gui); static void close_search_box_cb(GtkButton *widget, gpointer data); static gboolean search_box_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static void scrolled_win_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data); static void scrolled_win_value_changed_cb(GtkAdjustment *adjustment, gpointer data); static gboolean set_split_to_zero(gpointer data); /* XML UI Signals */ G_MODULE_EXPORT void menu_popup_url_copy(GtkAction *action, gchar *url); WorldGUI * world_gui_new(gboolean is_for_mud) { /* is_for_mud determines the kind of GUI we're creating. If TRUE, it is used for really displaying MUD output, and it will be included in the notebook. If FALSE, it is a KCWin gui, and it has less features. */ WorldGUI *gui; GtkWidget *iconClearWidget; GtkWidget *frame; GtkAdjustment *verticalAdjust; GtkTreeViewColumn *column; GtkCellRenderer *renderer; PangoFontDescription *fontDesc; GtkTextIter end_iter; GdkColor black = { 0, 0, 0, 0 }; /* First, create the cursors if this is the first run */ if (!hand_cursor) { hand_cursor = gdk_cursor_new (GDK_HAND2); regular_cursor = gdk_cursor_new (GDK_XTERM); } gui = g_new0(WorldGUI, 1); gui->vbox = gtk_vbox_new(FALSE, 0); g_object_set_data(G_OBJECT(gui->vbox), "gui", gui); gui->scrolled_win = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); gtk_scrolled_window_set_policy(gui->scrolled_win, GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gui->txtView = GTK_TEXT_VIEW(gtk_text_view_new()); gtk_text_view_set_editable(gui->txtView, FALSE); gui->txtBuffer = gtk_text_view_get_buffer(gui->txtView); /* Store a mark at the end, to allow scrolling to it */ gtk_text_buffer_get_iter_at_offset(gui->txtBuffer, &end_iter, -1); gui->txtmark_end = gtk_text_buffer_create_mark(gui->txtBuffer, "end", &end_iter, FALSE); gtk_container_add(GTK_CONTAINER(gui->scrolled_win), GTK_WIDGET(gui->txtView)); if (is_for_mud) { g_signal_connect(G_OBJECT(gui->scrolled_win), "size-allocate", G_CALLBACK(scrolled_win_size_allocate_cb), gui); verticalAdjust = gtk_scrolled_window_get_vadjustment(gui->scrolled_win); g_signal_connect(G_OBJECT(verticalAdjust), "value-changed", G_CALLBACK(scrolled_win_value_changed_cb), gui); /* Second TextView for split screen */ gui->scrwinScroll = GTK_SCROLLED_WINDOW(gtk_scrolled_window_new(NULL, NULL)); gtk_scrolled_window_set_policy(gui->scrwinScroll, GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gui->txtViewScroll = GTK_TEXT_VIEW(gtk_text_view_new_with_buffer(gui->txtBuffer)); gtk_text_view_set_editable(gui->txtViewScroll, FALSE); gtk_container_add(GTK_CONTAINER(gui->scrwinScroll), GTK_WIDGET(gui->txtViewScroll)); /* Create split pane */ gui->split_pane = GTK_PANED(gtk_vpaned_new()); gtk_paned_pack1(gui->split_pane, GTK_WIDGET(gui->scrwinScroll), FALSE, TRUE); gtk_paned_pack2(gui->split_pane, GTK_WIDGET(gui->scrolled_win), TRUE, TRUE); /* For some reason, we cannot set to 0 directly. */ g_idle_add(set_split_to_zero, gui); gtk_box_pack_start(GTK_BOX(gui->vbox), GTK_WIDGET(gui->split_pane), TRUE, TRUE, 0); } else { /* No split screen. However, we create the text view so that the functions that configure it do not fail. */ gui->txtViewScroll = GTK_TEXT_VIEW(gtk_text_view_new_with_buffer(gui->txtBuffer)); gtk_box_pack_start(GTK_BOX(gui->vbox), GTK_WIDGET(gui->scrolled_win), TRUE, TRUE, 0); } if (is_for_mud) { /* Search box */ GtkWidget *iconCloseWidget; GtkWidget *btnClose; GtkWidget *label; gui->search_box = gtk_hbox_new(FALSE, 6); gtk_container_set_border_width(GTK_CONTAINER(gui->search_box), 2); g_object_set(G_OBJECT(gui->search_box), "no-show-all", TRUE, NULL); btnClose = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(btnClose), GTK_RELIEF_NONE); iconCloseWidget = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); gtk_container_add(GTK_CONTAINER(btnClose), iconCloseWidget); g_signal_connect(G_OBJECT(btnClose), "clicked", G_CALLBACK(close_search_box_cb), gui); gtk_box_pack_start(GTK_BOX(gui->search_box), btnClose, FALSE, FALSE, 0); label = gtk_label_new_with_mnemonic(_("_Find:")); gtk_box_pack_start(GTK_BOX(gui->search_box), label, FALSE, FALSE, 0); gui->txtSearchTerm = gtk_entry_new(); gtk_label_set_mnemonic_widget(GTK_LABEL(label), gui->txtSearchTerm); g_signal_connect(G_OBJECT(gui->txtSearchTerm), "changed", G_CALLBACK(find_incremental_cb), gui); g_signal_connect(G_OBJECT(gui->txtSearchTerm), "activate", G_CALLBACK(menu_findnext_activate_cb), NULL); g_signal_connect(G_OBJECT(gui->txtSearchTerm), "key-press-event", G_CALLBACK(search_box_keypress_cb), gui); gtk_box_pack_start(GTK_BOX(gui->search_box), gui->txtSearchTerm, FALSE, FALSE, 0); gui->btnFindNext = gtk_button_new_with_label(_("Find Next")); gtk_button_set_image(GTK_BUTTON(gui->btnFindNext), gtk_image_new_from_stock(GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_MENU)); gtk_button_set_relief(GTK_BUTTON(gui->btnFindNext), GTK_RELIEF_NONE); g_signal_connect(G_OBJECT(gui->btnFindNext), "clicked", G_CALLBACK(find_next_cb), gui); gtk_box_pack_start(GTK_BOX(gui->search_box), gui->btnFindNext, FALSE, FALSE, 0); gui->lblSearchInfo = GTK_LABEL(gtk_label_new(NULL)); gtk_box_pack_start(GTK_BOX(gui->search_box), GTK_WIDGET(gui->lblSearchInfo), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(gui->vbox), gui->search_box, FALSE, FALSE, 0); } /* Command area */ gui->commandArea = gtk_hbox_new(FALSE, 4); gtk_container_set_border_width(GTK_CONTAINER(gui->commandArea), 2); gui->btnClear = gtk_button_new(); iconClearWidget = gtk_image_new_from_stock(GTK_STOCK_CLEAR, GTK_ICON_SIZE_MENU); g_signal_connect(G_OBJECT(gui->btnClear), "clicked", G_CALLBACK(clear_button_cb), gui); gtk_container_add(GTK_CONTAINER(gui->btnClear), iconClearWidget); gtk_box_pack_start(GTK_BOX(gui->commandArea), gui->btnClear, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(gui->btnClear, _("Click to clear the command input area.")); if (is_for_mud) { /* The full-featured SimoComboBox */ gui->cmbEntry = SIMO_COMBO_BOX(simo_combo_box_new()); g_signal_connect(G_OBJECT(gui->cmbEntry), "size-changed", G_CALLBACK(n_lines_changed_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry), "clicked", G_CALLBACK(combo_changed_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry), "popup-displayed", G_CALLBACK(combo_poped_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry), "popup-closed", G_CALLBACK(combo_closed_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry), "activate", G_CALLBACK(activate_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry->txtview), "key-press-event", G_CALLBACK(keypress_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry->entry), "key-press-event", G_CALLBACK(keypress_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry), "changed", G_CALLBACK(text_changed_cb), gui); g_signal_connect(G_OBJECT(gui->cmbEntry->txtbuffer), "mark-set", G_CALLBACK(cursor_moved_cb), gui); gtk_box_pack_start(GTK_BOX(gui->commandArea), GTK_WIDGET(gui->cmbEntry), TRUE, TRUE, 0); /* Configure renderer for combo column */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, (GtkTreeCellDataFunc) completion_cell_data_function, NULL, NULL); simo_combo_box_set_combo_column(gui->cmbEntry, column); } else { /* Just a GtkEntry */ gui->txtEntry = GTK_ENTRY(gtk_entry_new()); gtk_box_pack_start(GTK_BOX(gui->commandArea), GTK_WIDGET(gui->txtEntry), TRUE, TRUE, 0); } gtk_box_pack_start(GTK_BOX(gui->vbox), gui->commandArea, FALSE, FALSE, 0); /* Keep the focus always in the entry box */ g_signal_connect_swapped(G_OBJECT(gui->txtView), "focus-in-event", G_CALLBACK(gtk_widget_grab_focus), gui->cmbEntry); if (is_for_mud) { g_signal_connect_swapped(G_OBJECT(gui->txtViewScroll), "focus-in-event", G_CALLBACK(gtk_widget_grab_focus), gui->cmbEntry); } /* Set initial colors and state */ gui->ta.state.fg_color = gui->ta.saved_state.fg_color = ANSI_DEFAULT_COLOR_IDX; gui->ta.state.bg_color = gui->ta.saved_state.bg_color = ANSI_DEFAULT_COLOR_IDX; gui->ta.state.underline = PANGO_UNDERLINE_NONE; /* Create tag for text with attributes */ gui->ta.underline_tag = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "underline", PANGO_UNDERLINE_SINGLE, NULL); gui->ta.dblunderline_tag = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "underline", PANGO_UNDERLINE_DOUBLE, NULL); gui->ta.strike_tag = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "strikethrough", TRUE, NULL); gui->ta.italics_tag = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "style", PANGO_STYLE_ITALIC, NULL); /* Initialize structures in TextAppearance */ gui->ta.rgb_fore_tags = g_hash_table_new(NULL, NULL); gui->ta.rgb_back_tags = g_hash_table_new(NULL, NULL); /* We don't know yet which characters are supported. */ gui->ta.sup_geom_shapes = -1; gui->ta.sup_block = -1; gui->ta.sup_control = -1; gui->ta.sup_l1_supplement = -1; gui->ta.sup_box_drawing = -1; gui->ta.sup_misc_tech = -1; gui->ta.sup_math = -1; gui->ta.sup_greek = -1; if (is_for_mud) { /* Special features */ GtkWidget *btnClose; GtkRcStyle *rcstyle; GtkWidget *iconCloseWidget; /* Notebook tab */ gui->hboxTab = GTK_BOX(gtk_hbox_new(FALSE, 4)); gui->lblNotebook = GTK_LABEL(gtk_label_new(_("No world"))); gtk_box_pack_start(gui->hboxTab, GTK_WIDGET(gui->lblNotebook), FALSE, FALSE, 0); btnClose = gtk_button_new(); /* Make the button smaller. (Taken from gedit code) */ gtk_button_set_focus_on_click(GTK_BUTTON(btnClose), FALSE); gtk_button_set_relief(GTK_BUTTON(btnClose), GTK_RELIEF_NONE); rcstyle = gtk_rc_style_new(); rcstyle->xthickness = rcstyle->ythickness = 0; gtk_widget_modify_style(btnClose, rcstyle); g_object_unref(rcstyle); iconCloseWidget = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); g_signal_connect(G_OBJECT(btnClose), "clicked", G_CALLBACK(tab_close_cb), gui); gtk_container_add(GTK_CONTAINER(btnClose), iconCloseWidget); gtk_box_pack_start(GTK_BOX(gui->hboxTab), btnClose, FALSE, FALSE, 0); /* The color and font will be changed later to the colors and font of the opened world, but we set the background to black so that is appears black while the world is being selected, and the font to a default font so that the size can be calculated correctly. */ fontDesc = pango_font_description_from_string(DEFAULT_TERMINAL_FONT); gtk_widget_modify_font(GTK_WIDGET(gui->txtView), fontDesc); gtk_widget_modify_font(GTK_WIDGET(gui->txtViewScroll), fontDesc); pango_font_description_free(fontDesc); gtk_widget_modify_base(GTK_WIDGET(gui->txtView), GTK_STATE_NORMAL, &black); gtk_widget_modify_base(GTK_WIDGET(gui->txtViewScroll), GTK_STATE_NORMAL, &black); /* Detect resizes */ g_signal_connect(G_OBJECT(gui->txtView), "size-allocate", G_CALLBACK(textview_size_allocate_cb), gui); /* Create a mark to hold the start of the current line */ gui->txtmark_linestart = gtk_text_buffer_create_mark(gui->txtBuffer, "linestart", &end_iter, TRUE); /* Create tag for URLs */ gui->txttag_url = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "underline", PANGO_UNDERLINE_SINGLE, NULL); /* URLs support */ g_signal_connect(gui->txtView, "button-press-event", G_CALLBACK(textview_button_press_cb), gui); g_signal_connect(gui->txtViewScroll, "button-press-event", G_CALLBACK(textview_button_press_cb), gui); g_signal_connect(gui->txtView, "motion-notify-event", G_CALLBACK(textview_motion_notify_event), gui); g_signal_connect(gui->txtViewScroll, "motion-notify-event", G_CALLBACK(textview_motion_notify_event), gui); g_signal_connect(gui->txtView, "visibility-notify-event", G_CALLBACK(textview_visibility_notify_event), gui); g_signal_connect(gui->txtViewScroll, "visibility-notify-event", G_CALLBACK(textview_visibility_notify_event), gui); /* Tooltips */ g_signal_connect(G_OBJECT(gui->txtView), "query-tooltip", G_CALLBACK(worldgui_query_tooltip_cb), gui); g_signal_connect(G_OBJECT(gui->txtViewScroll), "query-tooltip", G_CALLBACK(worldgui_query_tooltip_cb), gui); /* Status bar */ gui->statusbar_box = GTK_BOX(gtk_hbox_new(FALSE, 4)); gui->lblStatus = GTK_LABEL(gtk_label_new(_("KildClient ready"))); gtk_misc_set_alignment(GTK_MISC(gui->lblStatus), 0, 0.5); gtk_label_set_single_line_mode(gui->lblStatus, TRUE); gtk_label_set_ellipsize(gui->lblStatus, PANGO_ELLIPSIZE_END); gtk_box_pack_start(gui->statusbar_box, GTK_WIDGET(gui->lblStatus), TRUE, TRUE, 0); gui->lblLines = GTK_LABEL(gtk_label_new(_("0 lines"))); gtk_misc_set_alignment(GTK_MISC(gui->lblLines), 0, 0.5); gtk_label_set_single_line_mode(gui->lblLines, TRUE); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(frame), GTK_WIDGET(gui->lblLines)); gtk_box_pack_start(gui->statusbar_box, frame, FALSE, FALSE, 0); gui->lblTime = GTK_LABEL(gtk_label_new(NULL)); gtk_misc_set_alignment(GTK_MISC(gui->lblTime), 0, 0.5); gtk_label_set_single_line_mode(gui->lblTime, TRUE); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(frame), GTK_WIDGET(gui->lblTime)); gtk_box_pack_start(gui->statusbar_box, frame, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(gui->vbox), GTK_WIDGET(gui->statusbar_box), FALSE, FALSE, 0); /* Clear lines at the beginning of the buffer to keep it to a reasonable size. */ gui->prune_timeout_id = g_timeout_add(1000, ansitextview_prune_extra_lines, gui); } return gui; } void world_gui_size_textview(WorldGUI *gui) { gint char_height; gint char_width; ansitextview_get_char_size(gui, &char_height, &char_width); gtk_widget_set_size_request(GTK_WIDGET(gui->txtView), 80 * char_width, 24 * char_height); } void worldgui_determine_supported_chars(WorldGUI *gui) { PangoContext *context; PangoFontDescription *fontdesc; PangoFont *font; PangoCoverage *coverage; if (gui->ta.sup_geom_shapes != -1) { return; /* There are cached values */ } context = gtk_widget_get_pango_context(GTK_WIDGET(gui->txtView)); fontdesc = pango_font_description_from_string(gui->world->terminalfont); font = pango_context_load_font(context, fontdesc); coverage = pango_font_get_coverage(font, pango_context_get_language(context)); /* U+25C6 BLACK DIAMOND */ gui->ta.sup_geom_shapes = pango_coverage_get(coverage, 0x25C6); /* U+2592 MEDIUM SHADE */ gui->ta.sup_block = pango_coverage_get(coverage, 0x2592); /* U+2409 SYMBOL FOR HORIZONTAL TABULATION */ gui->ta.sup_control = pango_coverage_get(coverage, 0x2409); /* U+00B0 DEGREE SIGN */ gui->ta.sup_l1_supplement = pango_coverage_get(coverage, 0x00B0); /* U+2518 BOX DRAWINGS LIGHT UP AND LEFT */ gui->ta.sup_box_drawing = pango_coverage_get(coverage, 0x2518); /* U+23BA HORIZONTAL SCAN LINE-1 */ gui->ta.sup_misc_tech = pango_coverage_get(coverage, 0x23BA); /* U+2264 LESS-THAN OR EQUAL TO */ gui->ta.sup_math = pango_coverage_get(coverage, 0x2264); /* U+03C0 GREEK SMALL LETTER PI */ gui->ta.sup_greek = pango_coverage_get(coverage, 0x03C0); pango_font_description_free(fontdesc); pango_coverage_unref(coverage); } void free_world_gui(WorldGUI *gui) { if (gui->prune_timeout_id) { g_source_remove(gui->prune_timeout_id); } /* The tags themselves are supposed to be destroyed when the TextBuffer is destroyed, which happens when the widget is destroyed. */ g_free(gui->ta.ansi_fore_tags); g_free(gui->ta.ansi_back_tags); g_hash_table_destroy(gui->ta.rgb_fore_tags); g_hash_table_destroy(gui->ta.rgb_back_tags); if (gui->line_times) { k_circular_queue_free(gui->line_times); } g_free(gui); } static void combo_changed_cb(SimoComboBox *combo, gpointer data) { GtkTreeIter current; World *world; gchar *command; world = ((WorldGUI *) data)->world; if (simo_combo_box_get_active_iter(combo, ¤t)) { world->current_cmd = current; command = cmdhistory_get_command(world->cmd_list, ¤t); simo_combo_box_set_text(combo, command); world->cmd_just_selected_from_combo = TRUE; g_free(command); } } static void combo_poped_cb(SimoComboBox *combo, gpointer data) { World *world = ((WorldGUI *) data)->world; gtk_list_store_set(GTK_LIST_STORE(world->cmd_list), &world->current_cmd, CMDLIST_COL_TENTATIVE, simo_combo_box_get_text(combo), -1); world->combo_is_poped = TRUE; } static void combo_closed_cb(SimoComboBox *combo, gpointer data) { World *world = ((WorldGUI *) data)->world; world->combo_is_poped = FALSE; } static void n_lines_changed_cb(SimoComboBox *combo, gpointer data) { World *world = ((WorldGUI *) data)->world; world->input_n_lines = simo_combo_box_get_n_lines(combo); set_input_line_controls(world, NULL, NULL, NULL); } static void activate_cb(SimoComboBox *cmb, gpointer data) { World *world = ((WorldGUI *) data)->world; if (world) { const gchar *str; str = simo_combo_box_get_text(cmb); parse_commands(world, str, strlen(str)); /* Ignore empty commands and passwords */ if (strcmp(str, "") != 0 && !world->noecho) { add_recent_command(world, str); } } if (world->noecho || !world->repeat_commands) simo_combo_box_set_text(cmb, ""); else simo_combo_box_select_region(cmb, 0, -1); if (world->itime_reset_activate) { world->last_command_time = time(NULL); } world->cmd_position_changed = FALSE; } static gboolean keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { WorldGUI *gui = (WorldGUI *) data; World *world = gui->world; GtkAdjustment *adjustment; int direction = 1; gdouble newval; if (world->print_next_keycode) { if (gtk_accelerator_valid(evt->keyval, evt->state)) { world->keycode_to_print = gtk_accelerator_name(evt->keyval, evt->state); ansitextview_append_stringf(world->gui, "Key code: %s\n", world->keycode_to_print); world->print_next_keycode = FALSE; gtk_main_quit(); } return TRUE; } switch (evt->keyval) { case GDK_Left: case GDK_KP_Left: if (evt->state & GDK_MOD1_MASK) { /* Alt+left */ menu_perl_run_cb(NULL, "$world->prev"); return TRUE; } break; case GDK_Right: case GDK_KP_Right: if (evt->state & GDK_MOD1_MASK) { /* Alt+right */ menu_perl_run_cb(NULL, "$world->next"); return TRUE; } break; case GDK_Tab: case GDK_ISO_Left_Tab: if (evt->state & GDK_CONTROL_MASK) { if (evt->state & GDK_SHIFT_MASK) { /* Ctrl+Shift+Tab */ menu_perl_run_cb(NULL, "$world->prev"); } else { /* Ctrl+Tab */ menu_perl_run_cb(NULL, "$world->next"); } return TRUE; } break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (evt->state & GDK_MOD1_MASK) { /* Alt+digit */ guint newpage = evt->keyval - '1'; if (newpage < g_list_length(open_worlds)) { set_focused_world(newpage); } return TRUE; } break; case GDK_Up: case GDK_KP_Up: direction = 0; /* Fall through */ case GDK_Down: case GDK_KP_Down: /* Do nothing if option to ignore these keys is active. */ if (world->ignore_up_down_keys) { return FALSE; } /* Do nothing if arrows have been used to move around the multi-line input bar */ if (world->input_n_lines > 1 && world->cmd_position_changed) { return FALSE; } prev_or_next_command(world, direction); return TRUE; case GDK_Page_Up: case GDK_KP_Page_Up: direction = -1; /* Fall through */ case GDK_Page_Down: case GDK_KP_Page_Down: /* If the scrollback window is visible, move that */ if (gtk_paned_get_position(gui->split_pane) > 0) { adjustment = gtk_scrolled_window_get_vadjustment(gui->scrwinScroll); } else { adjustment = gtk_scrolled_window_get_vadjustment(gui->scrolled_win); } newval = gtk_adjustment_get_value(adjustment) + direction*gtk_adjustment_get_page_increment(adjustment)/2; if (newval > (gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment))) { newval = gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment); } gtk_adjustment_set_value(adjustment, newval); gtk_adjustment_changed(adjustment); return TRUE; case GDK_End: case GDK_KP_End: if (evt->state & GDK_CONTROL_MASK) { adjustment = gtk_scrolled_window_get_vadjustment(gui->scrolled_win); gtk_adjustment_set_value(adjustment, gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment)); gtk_adjustment_changed(adjustment); return TRUE; } break; } return check_macros(world, evt->keyval, evt->state); } static void text_changed_cb(SimoComboBox *cmb, gpointer data) { World *world = ((WorldGUI *) data)->world; const gchar *command; if (world->gui->execute_changed_signal && !world->combo_is_poped) { if (!world->cmd_just_selected_from_combo) { command = simo_combo_box_get_text(cmb); insert_recent_command(world, command); /* Set the pointer to point to the new command */ gtk_tree_model_get_iter_first(world->cmd_list, &world->current_cmd); } else { insert_recent_command(world, ""); } world->gui->execute_changed_signal = FALSE; world->cmd_has_been_edited = TRUE; world->cmd_just_selected_from_combo = FALSE; if (world->saved_command_find_search) { g_free(world->saved_command_find_search); world->saved_command_find_search = NULL; } } } static void cursor_moved_cb(GtkTextBuffer *buffer, GtkTextIter *iter, GtkTextMark *mark, gpointer data) { WorldGUI *gui = (WorldGUI *) data; const gchar *name; name = gtk_text_mark_get_name(mark); if (!name || strcmp(name, "insert") != 0) { return; } if (gui->world) { gui->world->cmd_position_changed = TRUE; } } void completion_cell_data_function(GtkCellLayout *cell_layout, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { /* Used in the combo box and completion display. If there is a tentative command, displays it, otherwise displays the normal text. */ gchar *command; command = cmdhistory_get_command(model, iter); g_object_set(renderer, "text", command, NULL); g_free(command); } static gboolean completion_function(GtkEntryCompletion *completion, const gchar *key, GtkTreeIter *iter, gpointer user_data) { GtkTreeModel *model; gchar *command; gchar *normalized_command; gchar *case_normalized_command; gboolean ret = FALSE; model = (GtkTreeModel *) user_data; command = cmdhistory_get_command(model, iter); if (!command) { return FALSE; } normalized_command = g_utf8_normalize(command, -1, G_NORMALIZE_ALL); case_normalized_command = g_utf8_casefold(normalized_command, -1); if (strncmp(key, case_normalized_command, strlen(key)) == 0) { ret = TRUE; } g_free(case_normalized_command); g_free(normalized_command); g_free(command); return ret; } static gboolean completion_match_selected_cb(GtkEntryCompletion *widget, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { World *world = (World *) user_data; gchar *command; command = cmdhistory_get_command(model, iter); simo_combo_box_set_text(world->gui->cmbEntry, command); simo_combo_box_set_position(world->gui->cmbEntry, -1); g_free(command); return TRUE; } static void tab_close_cb(GtkWidget *widget, gpointer data) { WorldGUI *gui = (WorldGUI *) data; World *world = gui->world; if (world->connected) { GtkWidget *msgdlg; GtkWidget *dlgbutton; GtkWidget *dlgbuttonimage; gint response; msgdlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Are you sure you want to close this world?")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("Really close?")); /* Keep Open is RESPONSE_NO because of NO close. But we use STOCK_YES to pass a positive image. */ dlgbutton = gtk_button_new_with_mnemonic(_("Keep _open")); dlgbuttonimage = gtk_image_new_from_stock(GTK_STOCK_YES, GTK_ICON_SIZE_BUTTON); gtk_button_set_image(GTK_BUTTON(dlgbutton), dlgbuttonimage); gtk_dialog_add_action_widget(GTK_DIALOG(msgdlg), dlgbutton, GTK_RESPONSE_NO); /* dlgbutton = gtk_button_new_with_label(_("Close")); dlgbuttonimage = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_BUTTON); gtk_button_set_image(GTK_BUTTON(dlgbutton), dlgbuttonimage); gtk_widget_show_all(dlgbutton);*/ dlgbutton = gtk_button_new_from_stock(GTK_STOCK_CLOSE); gtk_dialog_add_action_widget(GTK_DIALOG(msgdlg), dlgbutton, GTK_RESPONSE_YES); gtk_widget_show_all(msgdlg); response = gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); if (response != GTK_RESPONSE_YES) { return; } } remove_world(world, TRUE); } void clear_button_cb(GtkButton *button, gpointer data) { gchar *last_path; WorldGUI *gui = (WorldGUI *) data; World *world = gui->world; if (world) { simo_combo_box_clear_text(gui->cmbEntry); /* So that up key recalls the previous command */ last_path = g_strdup_printf("%d", world->cmd_list_size - 1); gtk_tree_model_get_iter_from_string(world->cmd_list, &world->current_cmd, last_path); } else { gtk_entry_set_text(gui->txtEntry, ""); } gtk_widget_grab_focus(GTK_WIDGET(gui->cmbEntry)); } void configure_gui(WorldGUI *gui, World *world) { PangoFontDescription *fontDesc; GtkEntryCompletion *completion; GtkCellRenderer *renderer; fontDesc = pango_font_description_from_string(world->terminalfont); gtk_widget_modify_font(GTK_WIDGET(gui->txtView), fontDesc); gtk_widget_modify_font(GTK_WIDGET(gui->txtViewScroll), fontDesc); pango_font_description_free(fontDesc); fontDesc = pango_font_description_from_string(world->entryfont); if (gui->world) { simo_combo_box_set_entry_font(gui->cmbEntry, fontDesc); } else { gtk_widget_modify_font(GTK_WIDGET(gui->txtEntry), fontDesc); } pango_font_description_free(fontDesc); if (gui->lblStatus) { fontDesc = pango_font_description_from_string(world->statusfont); gtk_widget_modify_font(GTK_WIDGET(gui->lblStatus), fontDesc); pango_font_description_free(fontDesc); } gtk_text_view_set_wrap_mode(gui->txtView, world->wrap ? GTK_WRAP_WORD_CHAR : GTK_WRAP_CHAR); gtk_text_view_set_indent(gui->txtView, -world->wrap_indent); gtk_text_view_set_wrap_mode(gui->txtViewScroll, world->wrap ? GTK_WRAP_WORD_CHAR : GTK_WRAP_CHAR); gtk_text_view_set_indent(gui->txtViewScroll, -world->wrap_indent); /* If this GUI is for a MUD, and not for a KCWin */ if (gui->world) { simo_combo_box_set_model(gui->cmbEntry, world->cmd_list); completion = simo_combo_box_get_completion(gui->cmbEntry); if (world->autocompletion) { gtk_entry_completion_set_minimum_key_length(completion, world->autocompl_minprefix); } else { gtk_entry_completion_set_minimum_key_length(completion, 9999); } /* Configure rendererer for completion */ renderer = gtk_cell_renderer_text_new(); simo_combo_box_set_completion_renderer(gui->cmbEntry, renderer); simo_combo_box_set_completion_cell_func(gui->cmbEntry, renderer, completion_cell_data_function, NULL, NULL); gtk_entry_completion_set_match_func(completion, completion_function, world->cmd_list, NULL); /* Correct behaviour when a completion is selected */ g_signal_connect(G_OBJECT(completion), "match-selected", G_CALLBACK(completion_match_selected_cb), world); /* Set up structure to hold time of each line's arrival */ gui->line_times = k_circular_queue_new(sizeof(time_t), world->buffer_lines); /* Size of input box */ simo_combo_box_set_n_lines(gui->cmbEntry, world->input_n_lines); /* Spell checking. */ worldgui_configure_spell(gui); /* Tooltips */ gtk_widget_set_has_tooltip(GTK_WIDGET(gui->txtView), gui->world->use_tooltips); gtk_widget_set_has_tooltip(GTK_WIDGET(gui->txtViewScroll), gui->world->use_tooltips); } } void worldgui_configure_spell(WorldGUI *gui) { GError *error = NULL; #ifdef HAVE_GTKSPELL simo_combo_box_set_spell(gui->cmbEntry, gui->world->spell, gui->world->spell_language, &error); if (error) { ansitextview_append_stringf(gui,_("Error setting spell checker: %s\n"), error->message); g_error_free(error); } #else ansitextview_append_string_nl(gui, _("Spell checking support not included in this build.")); #endif } static gboolean textview_button_press_cb(GtkWidget *text_view, GdkEventButton *event, gpointer data) { WorldGUI *gui; GtkTextIter iter; gint x, y; gui = (WorldGUI *) data; if (event->button != 1 && event->button != 3) { return FALSE; } gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(text_view), GTK_TEXT_WINDOW_WIDGET, event->x, event->y, &x, &y); gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(text_view), &iter, x, y); return act_if_link(gui, &iter, event); } static gboolean act_if_link(WorldGUI *gui, GtkTextIter *iter, GdkEventButton *event) { GtkTextIter start; GtkTextIter end; gchar *matched_url; if (!gtk_text_iter_has_tag(iter, gui->txttag_url)) { return FALSE; } start = end = *iter; if (!gtk_text_iter_backward_to_tag_toggle(&start, gui->txttag_url)) { /* Not found must mean we are at the tag boundary */ start = *iter; } if (!gtk_text_iter_forward_to_tag_toggle(&end, gui->txttag_url)) { /* Not found must mean we are at the tag boundary */ end = *iter; } matched_url = gtk_text_buffer_get_text(gui->txtBuffer, &start, &end, FALSE); if (event->button == 1) { menu_url_open(NULL, matched_url); } else { GtkBuilder *ui_builder; GError *error = NULL; GtkMenu *mnuPopupURL; ui_builder = gtk_builder_new(); if (!gtk_builder_add_from_file(ui_builder, get_kildclient_installed_file("mnuPopupURL.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return TRUE; } mnuPopupURL = GTK_MENU(gtk_builder_get_object(ui_builder, "mnuPopupURL")); gtk_builder_connect_signals(ui_builder, matched_url); gtk_menu_popup(mnuPopupURL, NULL, NULL, NULL, NULL, event->button, event->time); g_object_unref(ui_builder); } return TRUE; } #ifndef __WIN32__ void menu_url_open(GtkAction *action, char *url) { char *to_run; to_run = g_strdup_printf(globalPrefs.browser_command, url); system(to_run); g_free(to_run); g_free(url); } #else /* defined __WIN32__ */ void menu_url_open(GtkAction *action, char *url) { ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL); g_free(url); } #endif void menu_popup_url_copy(GtkAction *action, char *url) { GtkWidget *widget; GdkDisplay *display; GtkClipboard *clipboard; widget = GTK_WIDGET(gtk_action_get_proxies(action)->data); display = gtk_widget_get_display(GTK_WIDGET(widget)); clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_PRIMARY); gtk_clipboard_set_text(clipboard, url, -1); clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD); gtk_clipboard_set_text(clipboard, url, -1); g_free(url); } static gboolean textview_motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data) { WorldGUI *gui = (WorldGUI *) data; GtkTextView *text_view = GTK_TEXT_VIEW(widget); gint x, y; /* * Update the cursor image if the pointer moved. */ gtk_text_view_window_to_buffer_coords(text_view, GTK_TEXT_WINDOW_WIDGET, event->x, event->y, &x, &y); set_cursor_if_appropriate(text_view, gui, x, y); /* I don't know why this call is here, but I copied this from the gtk-demo, and it is necessary. */ gdk_window_get_pointer(gtk_widget_get_window(widget), NULL, NULL, NULL); return FALSE; } /* Also update the cursor image if the window becomes visible * (e.g. when a window covering it got iconified). */ static gboolean textview_visibility_notify_event(GtkWidget *widget, GdkEventVisibility *event, gpointer data) { /* Also update the cursor image if the window becomes visible * (e.g. when a window covering it got iconified). */ WorldGUI *gui = (WorldGUI *) data; GtkTextView *text_view = GTK_TEXT_VIEW(widget); gint wx, wy, bx, by; gdk_window_get_pointer(gtk_widget_get_window(widget), &wx, &wy, NULL); gtk_text_view_window_to_buffer_coords(text_view, GTK_TEXT_WINDOW_WIDGET, wx, wy, &bx, &by); set_cursor_if_appropriate(text_view, gui, bx, by); return FALSE; } static void set_cursor_if_appropriate(GtkTextView *text_view, WorldGUI *gui, gint x, gint y) { GtkTextIter iter; gboolean hovering = FALSE; gtk_text_view_get_iter_at_location(text_view, &iter, x, y); hovering = gtk_text_iter_has_tag(&iter, gui->txttag_url); if (hovering != hovering_over_link) { hovering_over_link = hovering; if (hovering_over_link) { gdk_window_set_cursor(gtk_text_view_get_window(text_view, GTK_TEXT_WINDOW_TEXT), hand_cursor); } else { gdk_window_set_cursor(gtk_text_view_get_window(text_view, GTK_TEXT_WINDOW_TEXT), regular_cursor); } } } static gboolean worldgui_query_tooltip_cb(GtkWidget *widget, gint win_x, gint win_y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer data) { WorldGUI *gui = (WorldGUI *) data; GtkTextView *text_view = GTK_TEXT_VIEW(widget); GtkTextIter iter; gint tooltip_line_top_y; gint x, y; GtkAllocation alloc; GdkRectangle rect; gchar *text; /* No world yet? */ if (!gui->world) { return FALSE; } if (keyboard_mode) { return FALSE; } /* Determine are for which the tooltip is valid - this corresponds to the area of the buffer line. */ gtk_text_view_window_to_buffer_coords(text_view, GTK_TEXT_WINDOW_WIDGET, win_x, win_y, &x, &y); gtk_text_view_get_line_at_y(text_view, &iter, y, NULL); gtk_text_view_get_line_yrange(text_view, &iter, &tooltip_line_top_y, &rect.height); gtk_text_view_buffer_to_window_coords(text_view, GTK_TEXT_WINDOW_WIDGET, 0, tooltip_line_top_y, &rect.x, &rect.y); #if GTK_MINOR_VERSION < 18 alloc = widget->allocation; #else gtk_widget_get_allocation(widget, &alloc); #endif rect.width = alloc.width; gtk_tooltip_set_tip_area(tooltip, &rect); /* Get the tooltip text */ text = worldgui_get_tooltip_text(gui, text_view, x, y); gtk_tooltip_set_text(tooltip, text); g_free(text); return TRUE; } static gchar * worldgui_get_tooltip_text(WorldGUI *gui, GtkTextView *text_view, gint x, gint y) { GtkTextIter iter; gchar *tip; gtk_text_view_get_iter_at_location(text_view, &iter, x, y); if (gtk_text_iter_has_tag(&iter, gui->txttag_url)) { tip = g_strdup(_("Click to open link; right-click for more options.")); } else { gint tooltip_line_number; size_t len; #ifdef HAVE_LOCALTIME_R struct tm time_tm; #endif struct tm *time_tmp; tip = g_malloc(MAX_BUFFER * sizeof(gchar)); tooltip_line_number = gtk_text_iter_get_line(&iter); g_snprintf(tip, MAX_BUFFER, "Line %ld, ", tooltip_line_number + gui->world->deleted_lines + 1); len = strlen(tip); #ifdef HAVE_LOCALTIME_R localtime_r(&k_circular_queue_nth(gui->line_times, time_t, tooltip_line_number), &time_tm); time_tmp = &time_tm; #else time_tmp = localtime(&k_circular_queue_nth(gui->line_times, time_t, tooltip_line_number)); #endif strftime(tip + len, MAX_BUFFER - len, "%c", time_tmp); } return tip; } static void textview_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data) { WorldGUI *gui = (WorldGUI *) data; World *world = gui->world; GdkRectangle rect; gtk_text_view_get_visible_rect(gui->txtView, &rect); /* Some checks to prevent send_naws_size() from being called when world is invalid. */ if (world && world->gui && world->gui == gui && world->connected && world->use_naws == TRUE) { /* See if the size has changed. */ if (rect.height != world->last_naws_size.height || rect.width != world->last_naws_size.width) { send_naws_size(world); world->last_naws_size = rect; } } /* Dealing with the wrap column: If the user shrinks the window so that the view is too narrow to show wrap_column columns, then we wrap normally. If it's wider, we want to keep the wrap at wrap_column, and show blank white space for the rest. To do thath, we pad the view's right-margin with whatever space is left over. */ if (world) { if (!world->use_wrap_column || world->wrap_column < 40) { /* No wrap column set */ gtk_text_view_set_right_margin(gui->txtView, 0); gtk_text_view_set_right_margin(gui->txtViewScroll, 0); } else { gint char_width, char_height; gint wrap_width; gint margin; ansitextview_get_char_size(gui, &char_height, &char_width); wrap_width = char_width * (world->wrap_column + 1); margin = rect.width > wrap_width ? (rect.width - wrap_width) : 0; gtk_text_view_set_right_margin(gui->txtView, margin); gtk_text_view_set_right_margin(gui->txtViewScroll, margin); } } } static void find_incremental_cb(GtkEditable *widget, gpointer data) { WorldGUI *gui = (WorldGUI *) data; do_find(gui); } void find_next_cb(GtkButton *button, gpointer data) { WorldGUI *gui = (WorldGUI *) data; GtkTextIter search_start; gtk_text_buffer_get_iter_at_mark(gui->txtBuffer, &search_start, gui->txtmark_next_search_start); gtk_text_buffer_move_mark(gui->txtBuffer, gui->txtmark_search_start, &search_start); do_find(gui); } static void do_find(WorldGUI *gui) { const gchar *text; GtkTextIter search_start; GtkTextIter match_start; GtkTextIter match_end; gtk_label_set_text(gui->lblSearchInfo, NULL); text = gtk_entry_get_text(GTK_ENTRY(gui->txtSearchTerm)); if (strcmp(text, "") == 0) { /* Reset search when the text is blanked. Either if the user clears everything, or when the Find menu is used. */ gtk_text_buffer_get_start_iter(gui->txtBuffer, &search_start); gtk_text_buffer_move_mark(gui->txtBuffer, gui->txtmark_search_start, &search_start); gtk_text_buffer_select_range(gui->txtBuffer, &search_start, &search_start); return; } gtk_text_buffer_get_iter_at_mark(gui->txtBuffer, &search_start, gui->txtmark_search_start); if (gtk_text_iter_forward_search(&search_start, text, 0, &match_start, &match_end, NULL)) { gtk_text_buffer_select_range(gui->txtBuffer, &match_start, &match_end); /* If split pane is active, scroll that plane */ if (gtk_paned_get_position(gui->split_pane) > 0) { gtk_text_view_scroll_to_iter(gui->txtViewScroll, &match_start, 0, FALSE, 0, 0); } else { gtk_text_view_scroll_to_iter(gui->txtView, &match_start, 0, FALSE, 0, 0); } /* Mark point at which Find Next will start */ gtk_text_iter_forward_char(&match_start); gtk_text_buffer_move_mark(gui->txtBuffer, gui->txtmark_next_search_start, &match_start); } else { gtk_label_set_text(gui->lblSearchInfo, _("Not found")); } } static void close_search_box_cb(GtkButton *widget, gpointer data) { WorldGUI *gui = (WorldGUI *) data; g_object_set(G_OBJECT(gui->search_box), "no-show-all", TRUE, NULL); gtk_widget_hide(GTK_WIDGET(gui->search_box)); gtk_widget_grab_focus(GTK_WIDGET(gui->cmbEntry)); } static gboolean search_box_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_Escape) { close_search_box_cb(NULL, data); return TRUE; } return FALSE; } static void scrolled_win_size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data) { /* When the bottom TextView (the main one) is resized, we want its top part to shrink/grow and the bottom part to remain displaying what it was displaying before. To do that, the value of (upper - (value + page_size)) of the ScrolledWindow's Adjustment must remain the same. This value corresponds to the size of the part of the TextView that is not displayed and is below the displayed part. upper never changes while scrolling, so we only need to make sure that (value + page_size) remains constant. To do that, so we store this value at the end of the function so that in the next call the previous value is know so that the new position of value is calculated. Whenever value changes, this stored value is also updated. */ WorldGUI *gui = (WorldGUI *) data; GtkAdjustment *verticalAdjust; double page_size, upper; double newValue; verticalAdjust = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(widget)); upper = gtk_adjustment_get_upper(verticalAdjust); page_size = gtk_adjustment_get_page_size(verticalAdjust); /* First call */ //if (gui->last_scroll_info == -1) { // gui->last_scroll_info = page_size; // return; //} newValue = gui->last_scroll_info - page_size; if (newValue < 0) { newValue = 0; } if (newValue > (upper - page_size)) { newValue = upper - page_size; } gtk_adjustment_set_value(verticalAdjust, newValue); gui->last_scroll_info = newValue + page_size; } static void scrolled_win_value_changed_cb(GtkAdjustment *adjustment, gpointer data) { WorldGUI *gui = (WorldGUI *) data; gui->last_scroll_info = gtk_adjustment_get_value(adjustment) + gtk_adjustment_get_page_size(adjustment); } static gboolean set_split_to_zero(gpointer data) { WorldGUI *gui = (WorldGUI *) data; gtk_paned_set_position(gui->split_pane, 0); return FALSE; } kildclient-2.11.1/src/wresources.rc0000644000175000017500000000005411405233112014144 00000000000000kildclient ICON "../share/kildclient.ico" kildclient-2.11.1/src/dlgPreferences.ui0000644000175000017500000015077411407661372014742 00000000000000 100000 0 10 1 0 1 100 0 1 0.10000000149 0 0 Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) Left Right Top Bottom Use global settings No proxy SOCKS4 SOCKS5 Preferences dialog True vertical True 12 12 vertical 18 True vertical 6 True 0 0 <b>Colors used by KildClient</b> True False False 0 True True False False 0 True vertical 6 True 0 _Informative messages: True False False 0 True model1 0 1 True 0 _Command echo: True False False 2 True model2 0 3 1 1 False False 0 True vertical 6 True 0 0 <b>Window configuration</b> True False False 0 True True False False 0 True vertical 6 True 0 _Tab position: True False False 0 True model3 0 False False 1 _Hide tabs if only one world is open True True False True If this is checked, when there is only one open world no tabs will be shown True True 2 _Flash window when new text is received True True False True True False False 3 1 False False 1 False False 1 True Appearance False 12 vertical 18 True vertical 6 True 0 0 <b>Sending Delays</b> True False False 0 True True False False 0 8 vertical 8 True 0 Enter the default parameters for sending multiple lines or commands: False False 0 True 4 True _Number of lines/commands to send at once: True spnGroupSize False False 0 True True adjustment1 1 1 False False 1 True 4 True _Delay between each group of lines/commands: True spnPrefsDelay False False 0 True True adjustment2 0.10000000149 1 1 False False 2 1 1 False False 0 True Sending 1 False 12 vertical 18 True vertical 6 True 0 0 <b>Web Browser</b> True False False 0 True True False False 0 True vertical 6 True True True Specify the command used to launch a web browser True False False 0 True 0 Enter the command to run a web browser. %s will be substituted by the web page address. True False False 1 1 1 False False 0 True vertical 6 True 0 0 <b>Audio Player</b> True False False 0 True True False False 0 True vertical 6 True True True Specify the command used to play sound files. True False False 0 True 0 Enter the command to run an audio player program. %s will be substituted by the file path. True False False 1 1 1 1 True External Programs 2 False True 12 vertical 18 True vertical 6 True 0 0 <b>Proxy</b> True False False 0 True True False False 0 True vertical 12 True 4 True Proxy _type: True False False 0 True model4 0 False 1 False 0 True 2 4 4 4 True True False 3 4 1 2 True True 3 4 True True 1 2 1 2 True True 1 2 True 1 Pass_word: True 2 3 1 2 GTK_FILL GTK_FILL True 1 Server _port: True 2 3 GTK_FILL GTK_FILL True 1 _Username: True 1 2 GTK_FILL GTK_FILL True 1 Server _address: True GTK_FILL GTK_FILL False False 1 1 1 0 True Proxy 3 False 2 True end gtk-close True True True True True True False False 0 False end 0 closebutton1 kildclient-2.11.1/src/log.c0000644000175000017500000001330611526001511012346 00000000000000/* $Id: log.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include "kildclient.h" #include "perlscript.h" /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ static void get_log_filename(World *world, gchar *actualfile, time_t *curr_time); void write_log_line(World *world, const char *line, time_t *line_time) { int len; static char timestr[MAX_TIME_STR]; if (world->log_add_time) { time_t currtime; struct tm *brokentime; if (line_time) { brokentime = localtime(line_time); } else { currtime = time(NULL); brokentime = localtime(&currtime); } strftime(timestr, MAX_TIME_STR, world->log_timeformat, brokentime); fprintf(world->log_file, "%s", timestr); } len = strlen(line); if (!len) { return; } fputs(line, world->log_file); /* Finish always with a NL character */ if (line[len - 1] != '\n') { fputc('\n', world->log_file); } } gboolean start_log(World *world, gint lines, gchar **errmsg) { time_t curr_time; static char actualfile[PATH_MAX+1]; static char timestr[MAX_TIME_STR]; if (!world->log_file_name) { *errmsg = g_strdup(_("File name not specified.")); return FALSE; } /* Get file name after substitutions */ time(&curr_time); get_log_filename(world, actualfile, &curr_time); if ((world->log_file = fopen(actualfile, "a")) != NULL) { world->log_actual_file = g_strdup(actualfile); /* Use unbuffered output */ setbuf(world->log_file, NULL); strcpy(timestr, ctime(&curr_time)); /* Remove final nl */ timestr[strlen(timestr) - 1] = '\0'; fprintf(world->log_file, "*** LOG STARTED AT %s ***\n", timestr); /* Copy lines from the buffer, in case it was asked */ if (lines) { gint first_line; gint last_line; gint line; GtkTextIter start_iter; GtkTextIter end_iter; gchar *text; gboolean stop; last_line = gtk_text_buffer_get_line_count(world->gui->txtBuffer); first_line = last_line - lines - 1; if (first_line < 0) { first_line = 0; } line = first_line; stop = FALSE; gtk_text_buffer_get_iter_at_line(world->gui->txtBuffer, &start_iter, first_line); while (1) { end_iter = start_iter; if (!gtk_text_iter_forward_line(&end_iter)) { stop = TRUE; } text = gtk_text_buffer_get_text(world->gui->txtBuffer, &start_iter, &end_iter, FALSE); write_log_line(world, text, &k_circular_queue_nth(world->gui->line_times, time_t, line)); g_free(text); if (stop) { break; } else { start_iter = end_iter; ++line; } } } return TRUE; } else { *errmsg = g_strdup(_("Could not open log file.")); return FALSE; } } void stop_log(World *world) { time_t curr_time; static char timestr[MAX_TIME_STR]; if (world->log_file) { time(&curr_time); strcpy(timestr, ctime(&curr_time)); /* Remove final nl */ timestr[strlen(timestr) - 1] = '\0'; fprintf(world->log_file, "*** LOG ENDED AT %s ***\n\n", timestr); fclose(world->log_file); world->log_file = NULL; g_free(world->log_actual_file); world->log_actual_file = NULL; } } static void get_log_filename(World *world, gchar *actualfile, time_t *curr_time) { gchar *character; gchar *tmp; struct tm *brokentime; /* Get character name used */ if (world->character_used == NULL || world->connection_style == NONE) { character = g_strdup(""); } else { GtkTreePath *path; GtkTreeIter iter; path = gtk_tree_row_reference_get_path(world->character_used); if (!path) { gtk_tree_row_reference_free(world->character_used); world->character_used = NULL; character = g_strdup(""); } gtk_tree_model_get_iter(world->logon_characters, &iter, path); gtk_tree_model_get(world->logon_characters, &iter, LOGON_CHAR, &character, -1); } /* Substitute KC-specific escapes */ tmp = replace_kc_escapes(world->log_file_name, world->name, character); g_free(character); /* Substitute date/time values. */ brokentime = localtime(curr_time); strftime(actualfile, PATH_MAX, tmp, brokentime); g_free(tmp); } kildclient-2.11.1/src/net.c0000644000175000017500000015011611555357665012406 00000000000000/* $Id: net.c 1161 2011-04-25 20:29:35Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #ifndef __MINGW32__ # include # include # include # include # include #else /* defined __MINGW32__ */ /* This is so we can use getaddrinfo() et al. The code will only run in Windows XP. */ # define _WIN32_WINNT 0x0501 # include # include #endif #include "kildclient.h" #include "perlscript.h" #include "net.h" #include "ansi.h" /************************* * File global variables * *************************/ #define MAX_US 250000 static char *terminal_type = "KildClient"; /************** * Data types * **************/ /*************************** * Telnet protocol defines * ***************************/ #define TELNET_IAC 255 /* 0xFF, 0377 */ #define TELNET_WILL 251 /* 0xFB, 0373 */ #define TELNET_WONT 252 /* 0xFC, 0374 */ #define TELNET_DO 253 /* 0xFD, 0375 */ #define TELNET_DONT 254 /* 0xFE, 0376 */ #define TELNET_SB 250 /* 0xFA, 0372 */ #define TELNET_SE 240 /* 0xF0, 0360 */ #define TELNET_GA 249 /* 0xF9, 0371 */ #define TELNET_OPT_ECHO 1 /* D'oh */ #define TELNET_OPT_NAWS 31 /* 0x1f, 0037 */ #define TELNET_OPT_TERMINAL_TYPE 24 /* 0x18, 0030 */ #define TELNET_TERMTYPE_IS 0 #define TELNET_TERMTYPE_SEND 1 #define TELNET_OPT_COMPRESS 85 /* 0x55, 0125, "U" */ #define TELNET_OPT_COMPRESS2 86 /* 0x56, 0126, "V" */ /*********************** * Function prototypes * ***********************/ static gboolean connect_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data); static gboolean connected_to_dispatcher(World *world); #ifdef HAVE_LIBGNUTLS static gboolean tls_handshake_cb(GIOChannel *iochan, GIOCondition cond, gpointer data); static gboolean tls_handshake_timeout_cb(gpointer data); #endif static void disconnected_decide_action(World *world, gint action); static gboolean data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data); static gboolean flush_buffer(World *world, int action); static void process_recv_line(World *world, int start, int end, gboolean incomplete); static void process_telnet_iac(World *world, int pos, int end); static void start_mccp(World *world, int pos, int end); static void end_mccp(World *world); static ssize_t write_escaped(World *world, const void *buf, size_t count); /* Send and receive data */ #ifdef HAVE_LIBGNUTLS static ssize_t kc_recv(World *world, void *buf, size_t s); static ssize_t kc_send(World *world, const void *buf, size_t s); #else #define kc_recv(w, b, s) (recv((w)->sock, (b), (s), 0)) #define kc_send(w, b, s) (send((w)->sock, (b), (s), 0)) #endif #ifndef __MINGW32__ # define socket_valid(a) ((a) != -1) #else # define socket_valid(a) ((a) != INVALID_SOCKET) #endif gboolean connect_to(World *world, gchar **errmsg) { gchar *msg; struct resolve_data_s *resolve_data; #ifndef HAVE_LIBGNUTLS /* Oops, we cannot do that */ if (world->use_tls) { GtkWidget *msgdlg; GtkWidget *dlgbutton; GtkWidget *dlgbuttonimage; msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("You're attempting to connect to a world that uses SSL, but this version of KildClient has been built without SSL support. Try to connect without SSL?")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Question")); gtk_dialog_add_button(GTK_DIALOG(msgdlg), _("Connect without SSL"), GTK_RESPONSE_YES); dlgbutton = gtk_button_new_with_label(_("Do not connect")); dlgbuttonimage = gtk_image_new_from_stock(GTK_STOCK_CANCEL, GTK_ICON_SIZE_MENU); gtk_button_set_image(GTK_BUTTON(dlgbutton), dlgbuttonimage); gtk_widget_show_all(dlgbutton); gtk_dialog_add_action_widget(GTK_DIALOG(msgdlg), dlgbutton, GTK_RESPONSE_NO); GTK_WIDGET_SET_FLAGS(dlgbutton, GTK_CAN_DEFAULT); gtk_dialog_set_default_response(GTK_DIALOG(msgdlg), GTK_RESPONSE_NO); //gtk_widget_grab_default(dlgbutton); if (gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { world->use_tls = FALSE; gtk_widget_destroy(msgdlg); } else { *errmsg = g_strdup(_("This version of KildClient does not have SSL support.")); gtk_widget_destroy(msgdlg); return FALSE; } } #else /* defined HAVE_LIBGNUTLS */ if (world->use_tls) { gnutls_init(&world->tls_session, GNUTLS_CLIENT); gnutls_priority_set_direct(world->tls_session, "NORMAL", NULL); gnutls_credentials_set(world->tls_session, GNUTLS_CRD_CERTIFICATE, tls_certif_cred); } #endif /* Set up gui */ if (!world->connected_at_least_once) { configure_gui(world->gui, world); prepare_display_name(world); } gtk_label_set_text(world->gui->lblNotebook, world->display_name); if (g_list_index(open_worlds, world) == -1) { open_worlds = g_list_append(open_worlds, world); } world->rawbytes = world->bytes = 0; /* Set it as the last opened one */ g_free(globalPrefs.last_open_world); globalPrefs.last_open_world = g_strdup(world->name); currentWorld = world; world_for_perl = world; if (!world->connected_at_least_once) { init_perl_script(world); load_permanent_variables(world); load_startup_plugins(world); if (world->scriptfile) { perl_script_import_file(world->perl_interpreter, world->scriptfile); } load_command_history(world); } else { if (world->has_unread_text) { world->has_unread_text = 0; --worlds_with_new_text; adjust_window_title(); } } if (!world->connected_at_least_once) { trigger_precompute_res(world); alias_precompute_res(world); } if (!world->connected_at_least_once) { start_timers(world); } world->connected_at_least_once = TRUE; proxy_info_free(&world->proxy_used); if (world->proxy.type == PROXY_USE_GLOBAL) { proxy_info_copy(&globalPrefs.proxy, &world->proxy_used); } else if (world->proxy.type == PROXY_NONE) { world->proxy_used.type = PROXY_NONE; } else { proxy_info_copy(&world->proxy, &world->proxy_used); } if (world->proxy_used.type == PROXY_SOCKS5) { msg = g_strdup_printf(_("Resolving proxy host %s..."), world->proxy_used.server); } else { msg = g_strdup_printf(_("Resolving host %s..."), world->host); } gtk_label_set_text(world->gui->lblStatus, msg); ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); g_free(msg); world->connecting = TRUE; /* Spawn a thread to resolve the host name */ resolve_data = g_new(struct resolve_data_s, 1); resolve_data->world = world; if (world->proxy_used.type == PROXY_SOCKS4) { resolve_data->host = g_strdup(world->host); resolve_data->port = g_strdup(world->port); resolve_data->callback = proxy_socks4_resolved_real_host_cb; resolve_data->ai_family = AF_INET; } else if (world->proxy_used.type == PROXY_SOCKS5) { resolve_data->host = g_strdup(world->proxy_used.server); resolve_data->port = g_strdup(world->proxy_used.port); resolve_data->callback = continue_connecting_cb; resolve_data->ai_family = AF_UNSPEC; } else { resolve_data->host = g_strdup(world->host); resolve_data->port = g_strdup(world->port); resolve_data->callback = continue_connecting_cb; resolve_data->ai_family = AF_UNSPEC; } if (!g_thread_create(resolve_name_thread, resolve_data, FALSE, NULL)) { *errmsg = g_strdup(_("Could not start name-resolution thread.")); return FALSE; } return TRUE; } gpointer resolve_name_thread(gpointer data) { struct resolve_data_s *resolve_data = (struct resolve_data_s *) data; struct addrinfo hints; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = resolve_data->ai_family; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = 0; hints.ai_flags = 0; resolve_data->ret = getaddrinfo(resolve_data->host, resolve_data->port, &hints, &resolve_data->addrinfo); g_idle_add(resolve_data->callback, resolve_data); return NULL; } gboolean continue_connecting_cb(gpointer data) { struct resolve_data_s *resolve_data = (struct resolve_data_s *) data; World *world = resolve_data->world; gchar *msg; int ret; #ifndef __MINGW32__ int flags; #else /* defined __MINGW32__ */ u_long flags; #endif g_free(resolve_data->port); if (resolve_data->ret != 0) { /* It could happen that the world has been closed */ if (g_list_index(open_worlds, world) != -1) { gchar *msg; gsize len; msg = g_locale_to_utf8(gai_strerror(resolve_data->ret), -1, NULL, &len, NULL); world->errmsg = g_strdup_printf(_("Could not resolve host %s: %s"), resolve_data->host, msg); g_free(msg); disconnect_world(world, FALSE); } g_free(resolve_data->host); g_free(resolve_data); /* Only run once */ return FALSE; } world->addrinfo = resolve_data->addrinfo; g_free(resolve_data->host); g_free(resolve_data); /* Create IP address representation */ if (!world->host_ip) { world->host_ip = g_malloc(INET6_ADDRSTRLEN); /* Just in case it fails... */ strcpy(world->host_ip, "?"); getnameinfo(world->addrinfo->ai_addr, world->addrinfo->ai_addrlen, world->host_ip, INET6_ADDRSTRLEN, NULL, 0, NI_NUMERICHOST); } if (world->proxy_used.type == PROXY_NONE) { msg = g_strdup_printf(_("Attempting to connect to host %s (%s) port %s..."), world->host, world->host_ip, world->port); } else { msg = g_strdup_printf(_("Attempting to connect to proxy host %s (%s) port %s..."), world->proxy_used.server, world->host_ip, world->proxy_used.port); } ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, msg); g_free(msg); while (gtk_events_pending()) gtk_main_iteration(); world->sock = socket(world->addrinfo->ai_family, world->addrinfo->ai_socktype, world->addrinfo->ai_protocol); if (!socket_valid(world->sock)) { #ifndef __MINGW32__ world->errmsg = g_strdup_printf(_("Could not create socket: %s"), g_strerror(errno)); #else /* defined __MINGW32__ */ world->errmsg = g_strdup_printf(_("Could not create socket: error #%d"), WSAGetLastError()); #endif disconnect_world(world, FALSE); return FALSE; } #ifndef __MINGW32__ flags = fcntl(world->sock, F_GETFL); flags |= O_NONBLOCK; fcntl(world->sock, F_SETFL, flags); #else /* defined __MINGW32__ */ flags = 1; ioctlsocket(world->sock, FIONBIO, &flags); #endif ret = connect(world->sock, world->addrinfo->ai_addr, world->addrinfo->ai_addrlen); if (ret < 0) { #ifndef __MINGW32__ if (errno != EINPROGRESS && errno != EALREADY) { world->errmsg = g_strdup_printf(_("Could not connect to host %s port %s: %s"), world->host, world->port, g_strerror(errno)); return FALSE; } #else /* defined __MINGW32__ */ int error; error = WSAGetLastError(); if (error != WSAEWOULDBLOCK) { world->errmsg = g_strdup_printf(_("Could not connect to host %s port %s: Error #%d"), world->host, world->port, error); return FALSE; } #endif } /* Enable TCP Keep Alive if selected */ if (world->keep_alive) { int optval = 1; setsockopt(world->sock, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)); } world->noecho = FALSE; #ifndef __MINGW32__ world->iochan = g_io_channel_unix_new(world->sock); #else /* defined __MINGW32__ */ world->iochan = g_io_channel_win32_new_socket(world->sock); #endif world->io_watch_id = g_io_add_watch(world->iochan, G_IO_OUT | G_IO_ERR, connect_ready_cb, world); /* We'll do character code handling later */ g_io_channel_set_encoding(world->iochan, NULL, NULL); if (!world->connecting) { connected_to_dispatcher(world); } /* This is only called once. */ return FALSE; } #ifndef __MINGW32__ static gboolean connect_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data) { World *world; int ret; world = (World *) data; ret = connect(world->sock, world->addrinfo->ai_addr, world->addrinfo->ai_addrlen); if (ret < 0 && errno != EISCONN) { if (errno == EALREADY || errno == EINPROGRESS) { return TRUE; /* Still connecting. */ } if (world->proxy_used.type == PROXY_NONE) { world->errmsg = g_strdup_printf(_("Unable to connect to host %s: %s."), world->host, g_strerror(errno)); } else { world->errmsg = g_strdup_printf(_("Unable to connect to proxy host %s: %s."), world->proxy_used.server, g_strerror(errno)); } disconnect_world(world, FALSE); return FALSE; } else { connected_to_dispatcher(world); return FALSE; } } #else /* defined __MINGW32__ */ gboolean connect_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data) { World *world; int ret; int error; int sockerror = 0; int optlen = sizeof(sockerror); world = (World *) data; /* Apparently, under Windows it always fails */ ret = connect(world->sock, world->addrinfo->ai_addr, world->addrinfo->ai_addrlen); error = WSAGetLastError(); if (error == WSAEISCONN) { /* Connection succeeded */ connected_to_dispatcher(world); return FALSE; } ret = getsockopt(world->sock, SOL_SOCKET, SO_ERROR, (char *) &sockerror, &optlen); if (ret != 0) { sockerror = WSAGetLastError(); } if (sockerror) { if (world->proxy_used.type == PROXY_NONE) { world->errmsg = g_strdup_printf(_("Unable to connect to host %s: Error #%d."), world->host, sockerror); } else { world->errmsg = g_strdup_printf(_("Unable to connect to proxy host %s: Error #%d."), world->proxy_used.server, sockerror); } disconnect_world(world, FALSE); return FALSE; } if (error == WSAEALREADY || error == WSAEINVAL || error == WSAEWOULDBLOCK) { return TRUE; /* Still connecting. */ } /* This should never be reached. But under Windows, it is better to be safe. */ g_warning("Unreachable code in connect_read_cb."); if (world->proxy_used.type == PROXY_NONE) { world->errmsg = g_strdup_printf(_("Unable to connect to host %s: Error #%d."), world->host, sockerror); } else { world->errmsg = g_strdup_printf(_("Unable to connect to proxy host %s: Error #%d."), world->proxy_used.server, sockerror); } disconnect_world(world, FALSE); return FALSE; } #endif static gboolean connected_to_dispatcher(World *world) { /* When this function is called, a connection to the proxy host or the real host (if no proxy is being used) has been established. This function then calls the appropriate action if a proxy is being used. */ if (world->proxy_used.type == PROXY_SOCKS4) { return proxy_socks4_connected_to(world); } else if (world->proxy_used.type == PROXY_SOCKS5) { return proxy_socks5_connected_to(world); } else { return perform_tls_handshake(world); } } #ifdef HAVE_LIBGNUTLS gboolean perform_tls_handshake(World *world) { gchar *status_text; if (world->use_tls) { status_text = g_strdup_printf(_("Performing SSL handshake...")); ansitextview_append_string_with_fgcolor(world->gui, status_text, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, status_text); g_free(status_text); #ifndef __x86_64 /* This is to remove a warning about pointer sizes */ gnutls_transport_set_ptr(world->tls_session, (gnutls_transport_ptr) world->sock); #else gnutls_transport_set_ptr(world->tls_session, (gnutls_transport_ptr) (long) world->sock); #endif /* Register callback to perform the TLS handshake * The first action is we sending data (ClientHello) */ world->tls_handshake_dir = 1; world->io_watch_id = g_io_add_watch(world->iochan, G_IO_OUT | G_IO_HUP | G_IO_ERR, tls_handshake_cb, world); g_timeout_add_seconds(60, tls_handshake_timeout_cb, world); return TRUE; } else { return connected_to(world); } } static gboolean tls_handshake_cb(GIOChannel *iochan, GIOCondition cond, gpointer data) { World *world = (World *) data; int ret; ret = gnutls_handshake(world->tls_session); if (ret == GNUTLS_E_SUCCESS) { /* Sucess */ connected_to(world); /* Do not call the function again */ return FALSE; } if (gnutls_error_is_fatal(ret) != 0) { /* Fatal error */ gnutls_deinit(world->tls_session); world->errmsg = g_strdup_printf(_("SSL Handshake failed: %s"), gnutls_strerror(ret)); disconnect_world(world, FALSE); /* Do not call the function again */ return FALSE; } /* Continue when more data is available, watching the direction. */ int dir = gnutls_record_get_direction(world->tls_session); if (dir != world->tls_handshake_dir) { GIOCondition cond = G_IO_HUP | G_IO_ERR; if (dir == 0) { cond |= G_IO_IN; } else { cond |= G_IO_OUT; } world->io_watch_id = g_io_add_watch(world->iochan, cond, tls_handshake_cb, world); world->tls_handshake_dir = dir; /* A new callback has been set up for the new direction, remove this one */ return FALSE; } else { /* Continue */ return TRUE; } } static gboolean tls_handshake_timeout_cb(gpointer data) { /* Called 60 seconds after a TLS handshake has started. If the connection * has not completed, aborts it. */ World *world = (World *) data; // The world might have been closed if (g_list_index(open_worlds, world) != -1 && world->connecting) { gnutls_deinit(world->tls_session); world->errmsg = g_strdup_printf(_("SSL Handshake took too long.")); disconnect_world(world, FALSE); } /* Never called again */ return FALSE; } #else gboolean perform_tls_handshake(World *world) { return connected_to(world); } #endif gboolean connected_to(World *world) { /* A connection has been established to the real mud host, via proxy or indirectly. */ gchar *status_text; world->connected = TRUE; world->connecting = FALSE; world->connected_time = time(NULL); world->last_command_time = time(NULL); if (world->proxy_used.type == PROXY_NONE) { status_text = g_strdup_printf(_("Connected to host %s (%s) port %s."), world->host, world->host_ip, world->port); } else { status_text = g_strdup_printf(_("Connected to host %s port %s, via proxy %s (%s) port %s."), world->host, world->port, world->proxy_used.server, world->host_ip, world->proxy_used.port); } if (world->use_tls) { gchar *tmp = status_text; status_text = g_strconcat(tmp, _(" SSL enabled."), NULL); g_free(tmp); } ansitextview_append_string_with_fgcolor(world->gui, status_text, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); gtk_label_set_text(world->gui->lblStatus, status_text); g_free(status_text); adjust_window_title(); perform_auto_logon(world); execute_hook(world, "OnConnect", NULL); if (world->log_autostart) { gchar *errmsg = NULL; stop_log(world); if (start_log(world, 0, &errmsg)) { ansitextview_append_stringf(world->gui, _("Logging to file %s.\n"), world->log_actual_file); } else { ansitextview_append_string_nl(world->gui, errmsg); g_free(errmsg); } } /* We now read the socket */ g_source_remove(world->io_watch_id); world->io_watch_id = g_io_add_watch_full(world->iochan, G_PRIORITY_HIGH, G_IO_IN | G_IO_HUP | G_IO_ERR, data_ready_cb, world, NULL); /* No longer needed */ freeaddrinfo(world->addrinfo); world->addrinfo = NULL; return TRUE; } gboolean disconnect_world_idle(gpointer data) { disconnect_world(data, TRUE); return FALSE; } void disconnect_world(gpointer data, gboolean run_hook) { /* This function is called as an idle function, so it must return FALSE. */ World *world; char *msg; gint action; world = (World *) data; if (!world->connected && !world->connecting) { return; } /* In case we are still connecting and it has not been free'd */ if (world->addrinfo) { freeaddrinfo(world->addrinfo); world->addrinfo = NULL; } msg = close_connection(world, run_hook); execute_hook(world, "OnDisconnect", NULL); currentWorld = NULL; /* Here we decide what to do */ action = disconnected_msgbox(msg, TRUE); g_free(msg); disconnected_decide_action(world, action); } gboolean reconnect_world(gpointer data) { World *world = (World *) data; if (world->connected || world->connecting) g_free(close_connection(world, TRUE)); /* This function is called as an idle function, so it must return FALSE. */ disconnected_decide_action((World *) data, RESP_RECONNECT); return FALSE; } gboolean connect_another(gpointer data) { /* This function is called as an idle function, so it must return FALSE. */ disconnected_decide_action((World *) data, RESP_OTHER); return FALSE; } static void disconnected_decide_action(World *world, gint action) { gchar *errmsg; while (action != GTK_RESPONSE_CLOSE) { if (action == RESP_OTHER) { gboolean offline_selected = FALSE; save_world_to_file(world); save_command_history(world); save_permanent_variables(world); open_new_world(world->gui, NULL, TRUE, &offline_selected); if (offline_selected) { mark_as_offline(world); return; } break; } if (action == RESP_OFFLINE) { mark_as_offline(world); return; } /* Else, which means reconnect */ if (connect_to(world, &errmsg)) { return; } action = disconnected_msgbox(errmsg, TRUE); g_free(errmsg); } /* If we have gotten here, it means the current world must be closed, because either we selected close or connected to another one. */ remove_world(world, action == GTK_RESPONSE_CLOSE); } gchar * close_connection(World *world, gboolean run_hook) { /* Note: this function should only be called if the world is connected or connecting. */ gchar *msg; if (run_hook) { execute_hook(world, "OnCloseConnected", NULL); } flush_buffer(world, 2); if (world->errmsg) { msg = world->errmsg; world->errmsg = NULL; } else { msg = g_strdup_printf(_("Disconnected from host %s."), world->host); } ansitextview_append_string_with_fgcolor(world->gui, msg, globalPrefs.idxInfoMsgColor); ansitextview_append_string(world->gui, "\n"); #ifdef USE_LIBGNUTLS if (world->use_tls) { gnutls_bye(world->tls_session); } #endif #ifndef __MINGW32__ close(world->sock); #else /* defined __MINGW32__ */ closesocket(world->sock); #endif world->connected = FALSE; world->connecting = FALSE; #ifdef USE_LIBGNUTLS if (world->use_tls) { gnutls_deinit(world->tls_session); } #endif if (world->iochan) { g_io_channel_unref(world->iochan); g_source_remove(world->io_watch_id); } if (world->timeout_id) { g_source_remove(world->timeout_id); world->timeout_id = 0; } if (world->zstream) { end_mccp(world); } return msg; } static gboolean data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data) { World *world; ssize_t nread; unsigned char *nlptr; int start; int nlpos; world = (World *) data; /* What if we have read a very long line and the buffer is full? It does happen in some muds. */ if (world->pbuf_size == MAX_BUFFER) { flush_buffer(world, 1); } nread = kc_recv(world, world->inbuffer, MAX_BUFFER - world->pbuf_size); if (nread <= 0) { /* Connection closed */ if (nread != 0) { /* Error */ #ifdef HAVE_LIBGNUTLS if (world->use_tls) { if (gnutls_error_is_fatal(nread) == 0) { return TRUE; } world->errmsg = g_strdup_printf(_("Disconnected from host %s: %s."), world->host, gnutls_strerror(nread)); } else { #endif #ifndef __MINGW32__ if (errno == EAGAIN || errno == EWOULDBLOCK) { return TRUE; } world->errmsg = g_strdup_printf(_("Disconnected from host %s: %s."), world->host, g_strerror(errno)); #else /* defined __MINGW32__ */ int errcode = WSAGetLastError(); if (errcode == WSAEINTR || errcode == WSAEINPROGRESS || errcode == WSAEWOULDBLOCK) { return TRUE; } world->errmsg = g_strdup_printf(_("Disconnected from host %s: error #%d."), world->host, errcode); #endif #ifdef HAVE_LIBGNUTLS } #endif } disconnect_world(world, FALSE); return FALSE; } world->rawbytes += nread; if (rdumpFile) { fwrite(world->inbuffer, nread, 1, rdumpFile); } /* Prepare data to be uncompressed */ if (world->zstream) { world->zstream->next_in = world->inbuffer; world->zstream->avail_in = nread; } do { if (world->zstream) { if (world->zstream->avail_in) { gint status; /* What if we have read a very long line and buffer is full? It does happen in some muds. */ if (world->pbuf_size == MAX_BUFFER) { flush_buffer(world, 1); } world->zstream->next_out = world->dbuffer; world->zstream->avail_out = MAX_BUFFER - world->pbuf_size; status = inflate(world->zstream, Z_SYNC_FLUSH); if (status == Z_OK || status == Z_STREAM_END) { nread = MAX_BUFFER - world->pbuf_size - world->zstream->avail_out; if (status == Z_STREAM_END) { end_mccp(world); } /* If there was an error, we're in trouble. Let's simply ignore it. */ } } else { break; } } else { memcpy(world->dbuffer, world->inbuffer, nread); } world->bytes += nread; if (dumpFile) { fwrite(world->dbuffer, nread, 1, dumpFile); } process_telnet_iac(world, 0, nread); start = 0; nlpos = -1; nlptr = (unsigned char *) memchr(world->pbuffer, '\n', world->pbuf_size); while (nlptr) { nlpos = nlptr - world->pbuffer; process_recv_line(world, start, nlpos + 1, FALSE); /* We set printed_until to zero to indicate that a full line has been printed and there is no more pending text. */ world->printed_until = 0; start = nlpos + 1; nlptr = (unsigned char *) memchr(world->pbuffer + start, '\n', world->pbuf_size - start); } memmove(world->pbuffer, world->pbuffer + nlpos + 1, world->pbuf_size - nlpos - 1); world->pbuf_size = world->pbuf_size - nlpos - 1; } while (world->zstream); /* When data is not compressed, the end condition will be always false and the loop will execute only once. When data is compressed, the end condition will be always true, and the loop will run forever, until stopped by the break condition above. */ /* Let other things happen before more data comes, including drawing the just received lines. */ while (gtk_events_pending()) gtk_main_iteration(); /* Set up a timeout to print incomplete lines if no more data arrives. */ if (world->pbuf_size && !world->timeout_id) { world->timeout_id = g_timeout_add_full(G_PRIORITY_LOW, 150, flush_buffer_timeout_cb, world, NULL); } return TRUE; } gboolean flush_buffer_timeout_cb(gpointer data) { gboolean return_value; return_value = flush_buffer((World *) data, 0); if (!return_value) { ((World *) data)->timeout_id = 0; } return return_value; } static gboolean flush_buffer(World *world, int action) { /* * If action != 0, flush it anyway. * If action = 0, only flush if last data written was more than * 200ms ago. * If action = 2, stop this callback aditionally. */ gulong us_diff; /* Called when a command is sent, the line must be marked as new, even if there is nothing new. */ if (action && world->pbuf_size) { process_recv_line(world, 0, world->pbuf_size, FALSE); world->printed_until = 0; world->pbuf_size = 0; } /* If action is != 0, this will always be true */ if (world->pbuf_size == world->printed_until) { return (action != 2); } /* This part below only executes if action == 0 */ g_timer_elapsed(world->last_data_written, &us_diff); if (us_diff < MAX_US) { return TRUE; } /* action = 1 is when flushing because a command is sent. We should consider lines as finished in this case. */ process_recv_line(world, world->printed_until, world->pbuf_size, TRUE); world->printed_until = world->pbuf_size; return FALSE; } static void process_recv_line(World *world, int start, int end, gboolean incomplete) { guchar *converted; gsize output_len; guchar *stripped = NULL; GError *error = NULL; gboolean gag_output = FALSE; gboolean gag_log = FALSE; gint dummy; GtkTextIter line_start; GtkTextIter line_end; /* Clear pending line if it gets completed */ if (!incomplete && world->printed_until) { gtk_text_buffer_get_iter_at_mark(world->gui->txtBuffer, &line_start, world->gui->txtmark_linestart); gtk_text_buffer_get_iter_at_mark(world->gui->txtBuffer, &line_end, world->gui->txtmark_end); gtk_text_buffer_delete(world->gui->txtBuffer, &line_start, &line_end); /* Since an ANSI sequence cannot be incomplete at the end of one line and continue at another (because \n is not valid inside ANSI strings), ANSI parsing at a line always starts in DATA mode. */ world->gui->ta.ansifsm_state = ANSIFSM_DATA; world->gui->ta.ansiseq_pos = 0; /* Furthermore, colors are restored to what they were in the end of the last complete line. */ world->gui->ta.state = world->gui->ta.saved_state; } converted = (guchar *) g_convert((gchar *) (world->pbuffer + start), end - start, VTE_ENC, world->charset, NULL, &output_len, &error); if (converted) { if (!incomplete) { stripped = strip_ansi(converted, output_len); match_triggers(world, &stripped, &converted, &output_len, &gag_output, &gag_log, &dummy, NULL); /* The line is written to the log file in match_triggers. */ } else { ansitextview_append_ansi_string(world->gui, (gchar *) converted, output_len); } if (!gag_output) { /* The actual printing of the line is done in match_triggers. */ if (!world->has_focus) { if (!world->has_unread_text) { world->has_unread_text = TRUE; gtk_label_set_markup(world->gui->lblNotebook, world->new_text_name); if (worlds_with_new_text != -1) { ++worlds_with_new_text; if (!window_has_focus) { adjust_window_title(); } } } } if (!incomplete) { execute_hook(world, "OnReceivedText", (gchar *) converted); } } g_free(converted); } else { fprintf(stderr, "Error in charset conversion: %s\n", error->message); } g_timer_start(world->last_data_written); } static void process_telnet_iac(World *world, int pos, int end) { /* This function processes Telnet IAC sequences and converts the newlines to the canonical \n. */ unsigned char iac_response[4]; time_t now; while (pos < end) { switch (world->telnet_state) { case TELNETFSM_DATA: switch (world->dbuffer[pos]) { case TELNET_IAC: world->telnet_state = TELNETFSM_IAC; break; case '\n': world->pbuffer[world->pbuf_size++] = world->dbuffer[pos]; world->telnet_state = TELNETFSM_DATA_NL; break; case '\r': world->telnet_state_ncrs = 1; world->telnet_state = TELNETFSM_DATA_CR; break; case '\b': /* Backspace */ if (world->pbuf_size > 0 && world->pbuffer[world->pbuf_size - 1] != '\n') { --world->pbuf_size; } break; default: world->pbuffer[world->pbuf_size++] = world->dbuffer[pos]; } break; case TELNETFSM_DATA_NL: if (world->dbuffer[pos] != '\r' && world->dbuffer[pos] != '\b') { world->pbuffer[world->pbuf_size++] = world->dbuffer[pos]; if (world->dbuffer[pos] != '\n') { world->telnet_state = TELNETFSM_DATA; } } else { world->telnet_state = TELNETFSM_DATA; } break; case TELNETFSM_DATA_CR: if (world->dbuffer[pos] == '\n') { world->pbuffer[world->pbuf_size++] = world->dbuffer[pos]; world->telnet_state = TELNETFSM_DATA; } else if (world->dbuffer[pos] == '\r') { ++world->telnet_state_ncrs; } else { int i; /* Add the newlines. But check if there is space before. */ if (world->pbuf_size + world->telnet_state_ncrs >= world->pbuf_alloc_size) { world->pbuf_alloc_size += world->telnet_state_ncrs; world->pbuffer = g_realloc(world->pbuffer, world->pbuf_alloc_size); } for (i = 0; i < world->telnet_state_ncrs; ++i) { world->pbuffer[world->pbuf_size++] = '\n'; } world->pbuffer[world->pbuf_size++] = world->dbuffer[pos]; world->telnet_state = TELNETFSM_DATA; } break; case TELNETFSM_IAC: switch (world->dbuffer[pos]) { case TELNET_IAC: world->pbuffer[world->pbuf_size++] = TELNET_IAC; world->telnet_state = TELNETFSM_DATA; break; case TELNET_DO: world->telnet_state = TELNETFSM_DO; break; case TELNET_DONT: world->telnet_state = TELNETFSM_DONT; break; case TELNET_WILL: world->telnet_state = TELNETFSM_WILL; break; case TELNET_WONT: world->telnet_state = TELNETFSM_WONT; break; case TELNET_SB: world->telnet_state = TELNETFSM_SB; break; default: world->telnet_state = TELNETFSM_DATA; break; } break; case TELNETFSM_DO: switch (world->dbuffer[pos]) { case TELNET_OPT_TERMINAL_TYPE: iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_WILL; iac_response[2] = TELNET_OPT_TERMINAL_TYPE; kc_send(world, iac_response, 3); break; case TELNET_OPT_NAWS: iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_WILL; iac_response[2] = TELNET_OPT_NAWS; kc_send(world, iac_response, 3); world->use_naws = TRUE; send_naws_size(world); } world->telnet_state = TELNETFSM_DATA; break; case TELNETFSM_DONT: switch (world->dbuffer[pos]) { case TELNET_OPT_NAWS: world->use_naws = FALSE; break; } world->telnet_state = TELNETFSM_DATA; break; case TELNETFSM_WILL: switch (world->dbuffer[pos]) { case TELNET_OPT_ECHO: world->noecho = TRUE; if (!world->never_hide_input) { simo_combo_box_set_visibility(world->gui->cmbEntry, FALSE); } iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DO; iac_response[2] = TELNET_OPT_ECHO; kc_send(world, iac_response, 3); break; case TELNET_OPT_COMPRESS2: now = time(NULL); if (world->mccp_behavior == MCCP_ALWAYS || (world->mccp_behavior == MCCP_AFTER_CONNECT && difftime(now, world->connected_time) <= 60)) { world->mccp_ver = 2; iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DO; iac_response[2] = TELNET_OPT_COMPRESS2; kc_send(world, iac_response, 3); } break; case TELNET_OPT_COMPRESS: /* Do nothing if version 2 is supported */ now = time(NULL); if (world->mccp_ver <= 1 && (world->mccp_behavior == MCCP_ALWAYS || (world->mccp_behavior == MCCP_AFTER_CONNECT && difftime(now, world->connected_time) <= 60))) { world->mccp_ver = 1; iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DO; iac_response[2] = TELNET_OPT_COMPRESS; kc_send(world, iac_response, 3); } break; } world->telnet_state = TELNETFSM_DATA; break; case TELNETFSM_WONT: if (world->dbuffer[pos] == TELNET_OPT_ECHO) { world->noecho = FALSE; simo_combo_box_set_visibility(world->gui->cmbEntry, TRUE); iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DONT; iac_response[2] = TELNET_OPT_ECHO; kc_send(world, iac_response, 3); } world->telnet_state = TELNETFSM_DATA; break; case TELNETFSM_SB: if (world->dbuffer[pos] == TELNET_IAC) { world->telnet_state = TELNETFSM_SB_IAC; } else if (world->dbuffer[pos] == TELNET_OPT_TERMINAL_TYPE) { world->telnet_state = TELNETFSM_SB_IAC_TERMTYPE; } else if (world->dbuffer[pos] == TELNET_OPT_COMPRESS) { world->telnet_state = TELNETFSM_SB_IAC_COMPRESS; } else if (world->dbuffer[pos] == TELNET_OPT_COMPRESS2) { world->telnet_state = TELNETFSM_SB_IAC_COMPRESS2; } break; case TELNETFSM_SB_IAC: if (world->dbuffer[pos] == TELNET_SE) { world->telnet_state = TELNETFSM_DATA; } else { world->telnet_state = TELNETFSM_SB; } break; case TELNETFSM_SB_IAC_TERMTYPE: if (world->dbuffer[pos] == TELNET_TERMTYPE_SEND) { char *tmp; tmp = g_strdup_printf("%c%c%c%c%s%c%c", TELNET_IAC, TELNET_SB, TELNET_OPT_TERMINAL_TYPE, TELNET_TERMTYPE_IS, terminal_type, TELNET_IAC, TELNET_SE); kc_send(world, tmp, strlen(terminal_type) + 7); g_free(tmp); } world->telnet_state = TELNETFSM_SB; break; case TELNETFSM_SB_IAC_COMPRESS: if (world->dbuffer[pos] == TELNET_WILL) { world->telnet_state = TELNETFSM_SB_IAC_COMPRESS_WILL; } else { /* This shouldn't happen, and if it does, it will probably mess up everything. But let's hope for the best and wait for an SE */ world->telnet_state = TELNETFSM_SB_IAC; } break; case TELNETFSM_SB_IAC_COMPRESS2: if (world->dbuffer[pos] == TELNET_IAC) { world->telnet_state = TELNETFSM_SB_IAC_COMPRESS_WILL; } else { /* This shouldn't happen, and if it does, it will probably mess up everything. But let's hope for the best and wait for an SE */ world->telnet_state = TELNETFSM_SB_IAC; } break; case TELNETFSM_SB_IAC_COMPRESS_WILL: if (world->dbuffer[pos] == TELNET_SE) { start_mccp(world, pos, end); world->telnet_state = TELNETFSM_DATA; return; } else { /* This shouldn't happen, and if it does, it will probably mess up everything. But let's hope for the best and wait for an SE */ world->telnet_state = TELNETFSM_SB_IAC; } } ++pos; } } static void start_mccp(World *world, int pos, int end) { if (world->mccp_ver > 0 && !world->zstream) { world->zstream = g_new0(z_stream, 1); if (inflateInit(world->zstream) == Z_OK) { gchar *status_text; memcpy(world->inbuffer, world->dbuffer + pos + 1, end - pos - 1); world->zstream->next_in = world->inbuffer; world->zstream->avail_in = end - pos - 1; world->zstream->next_out = world->dbuffer; world->zstream->avail_out = MAX_BUFFER; if (world->proxy_used.type == PROXY_NONE) { status_text = g_strdup_printf(_("Connected to host %s (%s) port %s, MCCP version %d enabled."), world->host, world->host_ip, world->port, world->mccp_ver); } else { status_text = g_strdup_printf(_("Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d enabled."), world->host, world->port, world->proxy_used.server, world->host_ip, world->proxy_used.port, world->mccp_ver); } if (world->use_tls) { gchar *tmp = status_text; status_text = g_strconcat(tmp, _(" SSL enabled."), NULL); g_free(tmp); } gtk_label_set_text(world->gui->lblStatus, status_text); g_free(status_text); } else { /* We're in trouble, but this shouldn't happen */ g_free(world->zstream); world->zstream = NULL; } } } static void end_mccp(World *world) { gchar *status_text; inflateEnd(world->zstream); g_free(world->zstream); world->zstream = NULL; if (world->proxy_used.type == PROXY_NONE) { status_text = g_strdup_printf(_("Connected to host %s (%s) port %s."), world->host, world->host_ip, world->port); } else { status_text = g_strdup_printf(_("Connected to host %s port %s, via proxy %s (%s) port %s."), world->host, world->port, world->proxy_used.server, world->host_ip, world->proxy_used.port); } if (world->use_tls) { gchar *tmp = status_text; status_text = g_strconcat(tmp, _(" SSL enabled."), NULL); g_free(tmp); } gtk_label_set_text(world->gui->lblStatus, status_text); g_free(status_text); } void send_to_world(World *world, const char *cmd, gint len) { /* cmd should be in UTF-8 */ gchar *locale_cmd; gsize locale_len; GError *error = NULL; gboolean has_incomplete_line; has_incomplete_line = world->printed_until; if (!world->dont_flush) { flush_buffer(world, 1); } locale_cmd = g_convert(cmd, len, world->charset, VTE_ENC, NULL, &locale_len, &error); if (error) { fprintf(stderr, "%s\n", error->message); return; } /* Flooding prevention */ if (!world->last_command) { world->last_command = locale_cmd; } else { if (world->flood_prevention) { if (strcmp(world->last_command, locale_cmd) == 0) { if (++world->repeat_count == world->max_equal_commands) { send_to_world_no_check(world, world->flood_prevention_command, strlen(world->flood_prevention_command), NULL, 0, TRUE, has_incomplete_line); world->repeat_count = 1; } } else { world->repeat_count = 1; } } g_free(world->last_command); world->last_command = locale_cmd; } send_to_world_no_check(world, cmd, len, locale_cmd, locale_len, TRUE, has_incomplete_line); } void send_to_world_no_check(World *world, const char *utf8_command, int utf8_len, char *locale_command, gsize locale_len, gboolean add_newline, gboolean has_incomplete_line) { GError *error = NULL; gboolean needs_freeing = FALSE; if (!world->connected) { ansitextview_append_string_nl(world->gui, _("Not connected.")); return; } if (!locale_command) { locale_command = g_convert(utf8_command, utf8_len, world->charset, VTE_ENC, NULL, &locale_len, &error); if (error) { fprintf(stderr, "%s\n", error->message); return; } needs_freeing = TRUE; } write_escaped(world, locale_command, locale_len); if (add_newline) { kc_send(world, "\r\n", 2); } if (!world->itime_reset_activate) { world->last_command_time = time(NULL); } if (!world->noecho && world->cmd_echo) { ansitextview_append_string_with_fgcolor(world->gui, utf8_command, globalPrefs.idxCmdEchoColor); if (add_newline) { ansitextview_append_string(world->gui, "\n"); } } else { /* When commands are not echoed, add a newline if there is an incomplete line --- most likely a prompt --- so that the output of the command appears in the next line. */ if (has_incomplete_line) { ansitextview_append_string(world->gui, "\n"); } } execute_hook(world, "OnSentCommand", utf8_command); if (needs_freeing) { g_free(locale_command); } } void perform_auto_logon(World *world) { gchar *character = NULL; gchar *password; gchar *command = NULL; GtkTreePath *path; GtkTreeIter iter; if (world->character_used == NULL || world->connection_style == NONE) { return; } path = gtk_tree_row_reference_get_path(world->character_used); if (!path) { gtk_tree_row_reference_free(world->character_used); world->character_used = NULL; return; } gtk_tree_model_get_iter(world->logon_characters, &iter, path); gtk_tree_model_get(world->logon_characters, &iter, LOGON_CHAR, &character, LOGON_PASS, &password, -1); switch (world->connection_style) { case DIKU: command = g_strdup_printf("%s\r\n%s\r\n", character, password); break; case LPMUD: command = g_strdup_printf("connect %s %s\r\n", character, password); break; case NONE: /* Should never reach here. */ break; } write_escaped(world, command, strlen(command)); g_free(command); g_free(character); g_free(password); gtk_tree_path_free(path); } static ssize_t write_escaped(World *world, const void *buf, size_t count) { /* * Similar to write(), but escapes any IAC character sending * IAC IAC instead, as the specification tells us to do. */ ssize_t written = 0; size_t size; void *iac_pos; guchar iac = TELNET_IAC; iac_pos = memchr(buf, TELNET_IAC, count); while (iac_pos) { size = iac_pos - buf; written += kc_send(world, buf, size + 1); kc_send(world, &iac, 1); count = count - size - 1; if (count == 0) { /* Force exiting of loop */ iac_pos = NULL; break; } else { buf = iac_pos + 1; iac_pos = memchr(buf, TELNET_IAC, count); } } if (count != 0) { written += kc_send(world, buf, count); } return written; } void send_naws_size(World *world) { /* 3 for start, 2 for end. Each value is 2 bytes, but may be 4 if it happens to be 0xFFFF and must be IAC escaped. Thus 8 for both values. */ guchar buffer[3 + 8 + 2]; int bsize; guint16 size; guint cols; guint rows; ansitextview_get_size(world->gui, &rows, &cols); buffer[0] = TELNET_IAC; buffer[1] = TELNET_SB; buffer[2] = TELNET_OPT_NAWS; bsize = 3; size = htons((guint16) cols); memcpy(buffer + bsize, &size, sizeof(size)); /* Escape IAC */ if (buffer[bsize] == TELNET_IAC) { buffer[bsize+2] = buffer[bsize+1]; buffer[bsize+1] = TELNET_IAC; ++bsize; } ++bsize; if (buffer[bsize] == TELNET_IAC) { buffer[bsize+2] = buffer[bsize+1]; buffer[bsize+1] = TELNET_IAC; ++bsize; } ++bsize; size = htons((guint16) rows); memcpy(buffer + bsize, &size, sizeof(size)); /* Escape IAC */ if (buffer[bsize] == TELNET_IAC) { buffer[bsize+2] = buffer[bsize+1]; buffer[bsize+1] = TELNET_IAC; ++bsize; } ++bsize; if (buffer[bsize] == TELNET_IAC) { buffer[bsize+2] = buffer[bsize+1]; buffer[bsize+1] = TELNET_IAC; ++bsize; } ++bsize; buffer[bsize++] = TELNET_IAC; buffer[bsize++] = TELNET_SE; kc_send(world, buffer, bsize); } #ifdef HAVE_LIBGNUTLS static ssize_t kc_recv(World *world, void *buf, size_t s) { if (world->use_tls) { return gnutls_record_recv(world->tls_session, buf, s); } else { return recv(world->sock, buf, s, 0); } } static ssize_t kc_send(World *world, const void *buf, size_t s) { if (world->use_tls) { return gnutls_record_send(world->tls_session, buf, s); } else { return send(world->sock, buf, s, 0); } } #endif kildclient-2.11.1/src/we_timers.c0000644000175000017500000006203311526001511013564 00000000000000/* $Id: we_timers.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static GtkTreeModel *create_we_timers_model(World *world); static void we_timer_configure_view(GtkTreeView *view, GtkTreeModel *model); static void we_timer_add_cb(GtkButton *button, gpointer data); static void we_timer_edit_cb(GtkButton *button, gpointer data); static void we_timer_delete_cb(GtkButton *button, gpointer data); static void we_timer_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data); static gboolean edit_timer(World *world, Timer *timer, gboolean editing); static void we_timer_move_cb(GtkButton *button, gpointer data); static gboolean we_timer_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); GObject * get_we_timers_tab(World *world) { GtkBuilder *ui_builder; gchar *objects[] = { "we_panel_generic_graphical_editor", NULL }; GError *error = NULL; GObject *panel; GtkLabel *lblType; GObject *btnAdd; GObject *btnEdit; GObject *btnDelete; GObject *btnUp; GObject *btnDown; GObject *btnExport; GtkTreeSelection *selection; /* Create the dialog */ ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } panel = gtk_builder_get_object(ui_builder, "we_panel_generic_graphical_editor"); /* So it's not destroyed when the builder is destroyed */ g_object_ref(panel); world->viewTimer = GTK_TREE_VIEW(gtk_builder_get_object(ui_builder, "viewObjects")); g_object_set_data(G_OBJECT(world->viewTimer), "forworld", world); g_signal_connect(G_OBJECT(world->viewTimer), "row-activated", G_CALLBACK(we_timer_view_row_dblclick_cb), world); g_signal_connect(G_OBJECT(world->viewTimer), "key-press-event", G_CALLBACK(we_timer_view_keypress_cb), world); lblType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblGEType")); gtk_label_set_markup(lblType, "Timers"); btnAdd = gtk_builder_get_object(ui_builder, "btnGEAdd"); g_signal_connect(btnAdd, "clicked", G_CALLBACK(we_timer_add_cb), world->viewTimer); btnEdit = gtk_builder_get_object(ui_builder, "btnGEEdit"); g_signal_connect(btnEdit, "clicked", G_CALLBACK(we_timer_edit_cb), world->viewTimer); btnDelete = gtk_builder_get_object(ui_builder, "btnGEDelete"); g_signal_connect(btnDelete, "clicked", G_CALLBACK(we_timer_delete_cb), world->viewTimer); btnUp = gtk_builder_get_object(ui_builder, "btnGEUp"); g_object_set_data(btnUp, "isup", GINT_TO_POINTER(TRUE)); g_signal_connect(btnUp, "clicked", G_CALLBACK(we_timer_move_cb), world->viewTimer); btnDown = gtk_builder_get_object(ui_builder, "btnGEDown"); g_object_set_data(btnDown, "isup", GINT_TO_POINTER(FALSE)); g_signal_connect(btnDown, "clicked", G_CALLBACK(we_timer_move_cb), world->viewTimer); btnExport = gtk_builder_get_object(ui_builder, "btnGEExport"); g_object_set_data(btnExport, "preselect", "Timer"); world->timer_model = create_we_timers_model(world); world->timer_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->timer_model, NULL)); g_object_unref(G_OBJECT(world->timer_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->timer_model_filter), we_guied_plugin_filter_func, world, NULL); we_timer_configure_view(world->viewTimer, GTK_TREE_MODEL(world->timer_model_filter)); selection = gtk_tree_view_get_selection(world->viewTimer); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); g_object_set_data(G_OBJECT(selection), "btnEdit", btnEdit); g_object_set_data(G_OBJECT(selection), "btnDelete", btnDelete); g_object_set_data(G_OBJECT(selection), "btnUp", btnUp); g_object_set_data(G_OBJECT(selection), "btnDown", btnDown); g_object_set_data(G_OBJECT(selection), "btnExport", btnExport); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(we_guied_selection_changed_cb), NULL); gtk_builder_connect_signals(ui_builder, world); g_object_unref(ui_builder); return panel; } static GtkTreeModel * create_we_timers_model(World *world) { GtkListStore *store; GtkTreeIter iter; GSList *timerptr; Timer *timer; store = gtk_list_store_new(WE_GUIED_N_COLS, G_TYPE_POINTER); timerptr = world->timers; while (timerptr) { timer = (Timer *) timerptr->data; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, WE_GUIED_POINTER, timer, -1); timerptr = timerptr->next; } return GTK_TREE_MODEL(store); } static void we_timer_configure_view(GtkTreeView *view, GtkTreeModel *model) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; gtk_tree_view_set_model(view, model); g_object_unref(model); /* Column 1 - Enabled? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TIMER_ENABLED)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Enabled")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TIMER_ENABLED), NULL); gtk_tree_view_append_column(view, column); /* Column 2 - Name */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(TIMER_NAME), NULL); gtk_tree_view_append_column(view, column); /* Column 3 - Interval */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Interval")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(TIMER_INTERVAL), NULL); gtk_tree_view_append_column(view, column); /* Column 4 - Count */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Count")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(TIMER_COUNT), NULL); gtk_tree_view_append_column(view, column); /* Column 5 - Action */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Action")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(TIMER_ACTION), NULL); gtk_tree_view_append_column(view, column); /* Column 6 - Temporary? */ renderer = gtk_cell_renderer_toggle_new(); g_object_set(G_OBJECT(renderer), "activatable", TRUE, NULL); g_object_set_data(G_OBJECT(renderer), "column", GINT_TO_POINTER(TIMER_TEMPORARY)); g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(we_guied_bool_col_toggled_cb), view); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_title(column, _("Temp")); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_bool_func, GINT_TO_POINTER(TIMER_TEMPORARY), NULL); gtk_tree_view_append_column(view, column); /* Column 7 - Plugin */ renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_title(column, _("Plugin")); gtk_tree_view_column_pack_start(column, renderer, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, we_guied_text_func, GINT_TO_POINTER(OBJECT_PLUGIN), NULL); gtk_tree_view_append_column(view, column); gtk_tree_view_columns_autosize(view); } static void we_timer_add_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; Timer *timer; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); timer = g_new0(Timer, 1); timer->enabled = 1; timer->count = -1; timer->for_world = world; if (edit_timer(world, timer, FALSE)) { world->timers = g_slist_insert(world->timers, timer, world->timer_pos); we_timer_insert_timer(world, timer, world->timer_pos++); if (world->connected && timer->enabled) { timer->function_id = g_timeout_add(timer->interval * 1000, run_timer, timer); } } else { g_free(timer); } } static void we_timer_edit_cb(GtkButton *button, gpointer data) { /* Note that the Edit button is only active when exactly one row is selected. */ World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Timer *timer; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &timer, -1); if (edit_timer(world, timer, TRUE)) { we_timer_update_timer(world, timer); } g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_timer_delete_cb(GtkButton *button, gpointer data) { World *world; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Timer *timer; GSList *timeritem; GtkWidget *msgdlg; gint n; n = gtk_tree_selection_count_selected_rows(selection); msgdlg = we_guied_confirm_delete_dialog_new(GTK_WINDOW(world->dlgEditWorld), n, _("timer"), _("timers")); if (!world->confirm_delete || gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { GList *listiter = g_list_last(selected); while (listiter) { gtk_tree_model_get_iter(model, &iter, listiter->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &timer, -1); timeritem = g_slist_find(world->timers, timer); remove_timer(world, timeritem); listiter = listiter->prev; } } gtk_widget_destroy(msgdlg); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } static void we_timer_view_row_dblclick_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) { World *world; GtkTreeModel *model; GtkTreeIter iter; world = (World *) data; model = gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model, &iter, path)) { Timer *timer; gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &timer, -1); if (edit_timer(world, timer, TRUE)) { we_timer_update_timer(world, timer); } } } static gboolean edit_timer(World *world, Timer *timer, gboolean editing) { GtkBuilder *ui_builder; gchar *objects[] = { "dlgEditTimer", "adjustment1", "adjustment2", NULL }; GError *error = NULL; GtkWidget *dlgEditTimer; GtkEntry *txtName; GtkSpinButton *spnInterval; GtkSpinButton *spnCount; GtkEntry *txtAction; GtkToggleButton *chkTemporary; GtkToggleButton *chkEnabled; const gchar *newname; const gchar *newaction; gboolean newenabled; gint newinterval; ui_builder = gtk_builder_new(); if (!gtk_builder_add_objects_from_file(ui_builder, get_kildclient_installed_file("kildclient.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return FALSE; } dlgEditTimer = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgEditTimer")); gtk_dialog_set_default_response(GTK_DIALOG(dlgEditTimer), GTK_RESPONSE_OK); txtName = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtTimerName")); txtAction = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtTimerAction")); spnInterval = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnTimerInterval")); spnCount = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnTimerCount")); chkTemporary = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTimerTemporary")); chkEnabled = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTimerEnabled")); /* Only display note when editing a plugin's timer */ if (!timer->owner_plugin) { GObject *label; label = gtk_builder_get_object(ui_builder, "lblNoteTimer"); gtk_widget_destroy(GTK_WIDGET(label)); label = gtk_builder_get_object(ui_builder, "lblNoteTextTimer"); gtk_widget_destroy(GTK_WIDGET(label)); } /* We don't need it anymore */ g_object_unref(ui_builder); /* Fill-in values */ if (timer->name) { gtk_entry_set_text(txtName, timer->name); } if (timer->action) { gtk_entry_set_text(txtAction, timer->action); } gtk_spin_button_set_value(spnInterval, timer->interval); gtk_spin_button_set_value(spnCount, timer->count); gtk_toggle_button_set_active(chkTemporary, timer->temporary); gtk_toggle_button_set_active(chkEnabled, timer->enabled); /* Run the dialog until the input is valid or cancelled */ gtk_widget_show_all(dlgEditTimer); while (1) { if (gtk_dialog_run(GTK_DIALOG(dlgEditTimer)) == GTK_RESPONSE_OK) { /* Validate */ newenabled = gtk_toggle_button_get_active(chkEnabled); newinterval = gtk_spin_button_get_value_as_int(spnInterval); if (newinterval <= 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditTimer), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("The interval must be positive.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } newaction = gtk_entry_get_text(txtAction); if (strcmp(newaction, "") == 0) { GtkWidget *dlg = gtk_message_dialog_new(GTK_WINDOW(dlgEditTimer), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must specify the action.")); gtk_window_set_title(GTK_WINDOW(dlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); continue; } /* Update values */ newname = gtk_entry_get_text(txtName); if (!timer->name || strcmp(newname, timer->name) != 0) { g_free(timer->name); if (strcmp(newname, "") != 0) { timer->name = g_strdup(newname); } else { timer->name = NULL; } } if (!timer->action || strcmp(newaction, timer->action) != 0) { g_free(timer->action); timer->action = g_strdup(newaction); } timer->count = gtk_spin_button_get_value_as_int(spnCount); timer->temporary = gtk_toggle_button_get_active(chkTemporary); if (world->connected && editing) { /* Recreate timeout if interval is changed */ if (timer->interval != newinterval && timer->enabled && newenabled) { g_source_remove(timer->function_id); timer->function_id = g_timeout_add(newinterval * 1000, run_timer, timer); } /* Turn on or off if necessary. Never called if the above condition was executed, because the above happens when enabled was not changed, and the below happens when it changed. */ if (timer->enabled && !newenabled) { g_source_remove(timer->function_id); } else if (!timer->enabled && newenabled) { timer->function_id = g_timeout_add(timer->interval * 1000, run_timer, timer); } } timer->interval = newinterval; timer->enabled = newenabled; /* We've finished successfully */ gtk_widget_destroy(dlgEditTimer); return TRUE; } else { /* Cancel pressed */ gtk_widget_destroy(dlgEditTimer); return FALSE; } } } static gboolean we_timer_view_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if (evt->keyval == GDK_Delete || evt->keyval == GDK_KP_Delete) { we_timer_delete_cb(NULL, widget); return TRUE; } return FALSE; } static void we_timer_move_cb(GtkButton *button, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected; GtkTreeIter iter; World *world; gboolean is_up; gint new_pos; view = (GtkTreeView *) data; world = (World *) g_object_get_data(G_OBJECT(view), "forworld"); selection = gtk_tree_view_get_selection(view); is_up = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(button), "isup")); selected = gtk_tree_selection_get_selected_rows(selection, &model); if (selected) { Timer *timer; gint pos; gtk_tree_model_get_iter(model, &iter, selected->data); gtk_tree_model_get(model, &iter, WE_GUIED_POINTER, &timer, -1); pos = g_slist_index(world->timers, timer); new_pos = pos; if (is_up) { if (pos != 0) { new_pos = pos - 1; move_timer(world, pos, new_pos); } } else { if (pos != world->timer_pos - 1) { new_pos = pos + 1; move_timer(world, pos, new_pos); } } /* Reselect the moved item */ gtk_tree_model_iter_nth_child(model, &iter, NULL, new_pos); gtk_tree_selection_select_iter(selection, &iter); g_list_foreach(selected, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected); } } void we_timer_update_timer(World *world, Timer *timer_arg) { /* Called by the Perl functions when an timer is changed, so that the display is updated. */ GtkTreeIter iter; GtkTreePath *path; Timer *timer; gboolean success; if (!world->timer_model) { return; } success = gtk_tree_model_get_iter_first(world->timer_model, &iter); while (success) { gtk_tree_model_get(world->timer_model, &iter, WE_GUIED_POINTER, &timer, -1); if (timer == timer_arg) { path = gtk_tree_model_get_path(world->timer_model, &iter); gtk_tree_model_row_changed(world->timer_model, path, &iter); gtk_tree_path_free(path); return; } success = gtk_tree_model_iter_next(world->timer_model, &iter); } } void we_timer_insert_timer(World *world, Timer *timer, gint pos) { /* Called by the Perl functions when an timer is inserted, so that the display is updated. */ GtkTreeIter iter; if (!world->timer_model) { return; } gtk_list_store_insert(GTK_LIST_STORE(world->timer_model), &iter, pos); gtk_list_store_set(GTK_LIST_STORE(world->timer_model), &iter, WE_GUIED_POINTER, timer, -1); } void we_timer_delete_timer(World *world, Timer *timer_arg) { /* Called by the Perl functions when an timer is deleted, so that the display is updated. */ GtkTreeIter iter; Timer *timer; gboolean success; if (!world->timer_model) { return; } success = gtk_tree_model_get_iter_first(world->timer_model, &iter); while (success) { gtk_tree_model_get(world->timer_model, &iter, WE_GUIED_POINTER, &timer, -1); if (timer == timer_arg) { gtk_list_store_remove(GTK_LIST_STORE(world->timer_model), &iter); return; } success = gtk_tree_model_iter_next(world->timer_model, &iter); } } kildclient-2.11.1/src/dlgAbout.ui0000644000175000017500000000435011405233201013517 00000000000000 True 5 normal False KildClient Copyright © Eduardo M Kalinowski A mud client with powerful features and support for Perl Scripting http://kildclient.sf.net Visit http://kildclient.sf.net 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. Eduardo M Kalinowski <eduardo@kalinowski.com.br> Brazilian Portuguese: Eduardo M Kalinowski <eduardo@kalinowski.com.br> Esperanto: Eduardo M Kalinowski <eduardo@kalinowski.com.br> German: René Küttner <rkulpz@users.sourceforge.net> Swedish: Niklas Grahn <terra.unknown@yahoo.com> True vertical False end 0 kildclient-2.11.1/src/kildclient.glade0000644000175000017500000034100511405233112014541 00000000000000 True window3 12 vertical 18 vertical 16 True 0 0 <Set by the program> False False 0 True False False 0 True vertical 33 True True automatic automatic in True True True 0 True 2 4 True gtk-add True True True False True gtk-edit True False True True False True 1 2 gtk-delete True False True True False True 1 2 1 2 gtk-go-up True False True True False True 3 4 gtk-go-down True False True True False True 3 4 1 2 True True False True 0 0 True 2 True gtk-open False False 0 True _Import True False False 1 2 3 True False True False True 0 0 True 2 True gtk-save-as False False 0 True E_xport True False False 1 2 3 1 2 False 1 1 1 0 Edit Alias True dialog True vertical True 8 7 2 4 8 True 0 _Name: True txtAliasName GTK_FILL True 0 _Pattern: True txtAliasPattern 1 2 GTK_FILL True 0 _Substitution: True txtAliasSubstitution 3 4 GTK_FILL True True Enter optionally a descriptive name for the alias True 50 1 2 True True Enter the pattern to match against typed commands True 1 2 1 2 True True Enter the substitution to be executed True 1 2 3 4 E_val substitution as Perl statement True True False Check to have the substitution be executed in a s///e construction True True 2 4 5 GTK_FILL _Enabled True True False Check to make the alias enabled; only enabled aliases are tried True True 2 5 6 GTK_FILL True 0 <b>Note:</b> True 6 7 GTK_FILL True 0 This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 1 2 6 7 GTK_FILL _Ignore case when matching True True False True True 1 2 2 3 GTK_FILL 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False end 0 Enter optionally a descriptive name for the trigger Edit Trigger True dialog True vertical True 8 11 2 4 8 True 0 _Name: True txtTriggerName GTK_FILL True 0 _Pattern: True txtTriggerPattern 1 2 GTK_FILL True 0 _Action: True txtTriggerAction 3 4 GTK_FILL True True True 50 1 2 True True Enter the pattern to match against received lines True 1 2 1 2 True True Enter the action that will be run when a match happens True 1 2 3 4 Omit (_gag) from output True True False Check to make the matched line not be printed in the main output window True True 2 4 5 GTK_FILL _Enabled True True False Check to make the trigger enabled; only enabled triggers are tried True True 2 9 10 GTK_FILL Omit (gag) from _log file True True False Check to make the matched line not be printed in the log file True True 2 5 6 GTK_FILL _Keep executing other triggers after this this one matches True True False Check to make this trigger not prevent further triggers from being tried, if it matches True True 2 6 7 GTK_FILL _Rewriter trigger True True False Check to make this trigger a rewriter trigger True True 2 7 8 GTK_FILL True 0 <b>Note:</b> True 10 11 GTK_FILL True 0 This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 1 2 10 11 GTK_FILL _Ignore case when matching True True False True True 1 2 2 3 GTK_FILL True 8 C_hange style True True False True True False False 0 C_onfigure... True False True False True False False 1 2 8 9 GTK_FILL 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False end 0 Edit Timer True dialog True vertical True 8 7 2 4 8 True 0 _Name: True txtTimerName GTK_FILL True 0 _Interval: True spnTimerInterval 1 2 GTK_FILL True True Enter optionally a descriptive name for the timer True 50 1 2 True True Enter the action to be executed whenever the timer fires True 1 2 3 4 True 0 _Action: True txtTimerAction 3 4 GTK_FILL True 0 _Repeat count: True spnTimerCount 2 3 GTK_FILL _Temporary (will be deleted automatically when its repeat count reaches 0) True True False Check to have the timer deleted after its repeat count has reached 0 True True 2 4 5 GTK_FILL _Enabled True True False Check to make the timer enabled; only enabled timers are run True True 2 5 6 GTK_FILL True 6 True True Specify the interval, in seconds, between timer activations 1 1 1000000 1 10 0 1 False 0 True 0 seconds 1 1 2 1 2 GTK_FILL GTK_FILL True 6 True True Specify how many times this timer should run before being disabled or deleted 1 -1 1000000 1 10 0 1 False 0 True 0 (-1 to repeat indefinitely) 1 1 2 2 3 GTK_FILL GTK_FILL True 0 <b>Note:</b> True 6 7 GTK_FILL True 0 This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 1 2 6 7 GTK_FILL 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False end 0 Edit Macro True dialog True vertical True 8 6 2 4 8 True 0 _Name: True txtMacroName GTK_FILL True 0 _Key: True txtMacroKey 1 2 GTK_FILL True True Enter optionally a descriptive name for the macro True 50 1 2 True True Press the key that will be used to run the macro True 1 2 1 2 _Enabled True True False Check to make the macro enabled; only enabled macros are run True True 2 4 5 GTK_FILL True 0 _Action: True txtMacroAction 3 4 GTK_FILL True True Enter the action to be run when the key is pressed True 1 2 3 4 True 0 Press the key that will be used to activate the macro while the cursor is in the text box. True 1 2 2 3 GTK_FILL True 0 <b>Note:</b> True 5 6 GTK_FILL True 0 This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 1 2 5 6 GTK_FILL 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False end 0 Edit Hook True dialog True vertical True 8 5 2 4 8 True 0 _Action: True txtHookAction 2 3 GTK_FILL True True Enter the action to be run when the event happens True 1 2 2 3 _Enabled True True False Check to make the hook enabled; only enabled hooks are run True True 2 3 4 GTK_FILL True 0 _Name: True txtHookName 1 2 GTK_FILL True True Enter optionally a descriptive name for the hook True 50 1 2 1 2 True 0 Event: GTK_FILL True 0 <Set by the program> 1 2 GTK_FILL True 0 <b>Note:</b> True 4 5 GTK_FILL True 0 This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 1 2 4 5 GTK_FILL 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False end 0 Permenent variable True dialog True vertical True 8 vertical 8 True 0 _Name of variable to make permanent: True txtVarName False False 0 True True Enter the name of a scalar ($), array (@) or hash (%) variable whose contents are to be saved between sessions of the World True 50 False False 1 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False end 0 Edit Character Information True dialog True vertical True 8 2 2 4 8 True 1 _Name: True txtCharName GTK_FILL True True Enter the character's name for automatic login True 35 1 2 True 0 _Password: True txtCharPassword 1 2 GTK_FILL True True Enter the character's password for automatic login False True 1 2 1 2 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False end 0 True window2 True True True 8 7 2 8 Triggers True True False True True GTK_FILL Aliases True True False True True 1 2 GTK_FILL Macros True True False True True 2 3 GTK_FILL Timers True True False True True 3 4 GTK_FILL Permanent Variables True True False True True 4 5 GTK_FILL OnConnect Hooks True True False True True 1 2 GTK_FILL OnDisconnect Hooks True True False True True 1 2 1 2 GTK_FILL OnReceivedText Hooks True True False True True 1 2 2 3 GTK_FILL OnSentCommand Hooks True True False True True 1 2 3 4 GTK_FILL OnGetFocus Hooks True True False True True 1 2 4 5 GTK_FILL OnLoseFocus Hooks True True False True True 1 2 5 6 GTK_FILL OnCloseConnected Hooks True True False True True 1 2 6 7 GTK_FILL True _Items to export True label_item Enter optionally a descriptive name for the trigger Change Style True dialog True vertical True 8 6 2 8 8 True 0 _Background: True 2 3 GTK_FILL True 0 _Italic: True 3 4 GTK_FILL True Do not change No Yes 1 2 3 4 GTK_FILL True 0 _Underline: True 5 6 GTK_FILL True Do not change None Single Double 1 2 5 6 GTK_FILL GTK_FILL True Do not change No Yes 1 2 4 5 GTK_FILL True 0 _Striked-thru: True 4 5 GTK_FILL True 0 _Foreground: True 1 2 GTK_FILL True 0 _Apply to: True GTK_FILL True vertical The whole line True True False True True False False 0 The whole matched text True True False True True radTargetLine False False 1 True 4 The matched substring number True True False True True radTargetLine False False 0 True True 1 1 100 1 10 0 1 1 False False 2 1 2 GTK_FILL GTK_FILL True Do not change Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) 1 2 1 2 True Do not change Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) 1 2 2 3 False 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False end 0 kildclient-2.11.1/src/sound.c0000644000175000017500000000304011526001511012707 00000000000000/* $Id: sound.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #ifdef __WIN32__ # include #endif #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ #ifndef __WIN32__ void play_sound(const gchar *file) { char *to_run; to_run = g_strdup_printf(globalPrefs.audio_player_command, file); system(to_run); g_free(to_run); } #else /* defined __WIN32__ */ void play_sound(const gchar *file) { PlaySound(file, NULL, SND_FILENAME | SND_ASYNC); } #endif /* defined __WIN32__ */ kildclient-2.11.1/src/Makefile.in0000644000175000017500000005652611570177666013531 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # $Id: Makefile.am 1098 2009-10-31 13:03:22Z ekalin $ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = kildclient$(EXEEXT) subdir = src DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)" PROGRAMS = $(bin_PROGRAMS) am_kildclient_OBJECTS = main.$(OBJEXT) net.$(OBJEXT) proxy.$(OBJEXT) \ mainwindow.$(OBJEXT) worldgui.$(OBJEXT) ansitextview.$(OBJEXT) \ worldselector.$(OBJEXT) worlds.$(OBJEXT) worldeditor.$(OBJEXT) \ we_general.$(OBJEXT) we_mainwindow.$(OBJEXT) \ we_colors.$(OBJEXT) we_statusbar.$(OBJEXT) we_input.$(OBJEXT) \ we_logging.$(OBJEXT) we_scripting.$(OBJEXT) \ we_plugins.$(OBJEXT) we_generic_guied.$(OBJEXT) \ we_triggers.$(OBJEXT) we_aliases.$(OBJEXT) we_macros.$(OBJEXT) \ we_timers.$(OBJEXT) we_hooks.$(OBJEXT) we_vars.$(OBJEXT) \ we_protocols.$(OBJEXT) we_misc.$(OBJEXT) we_advanced.$(OBJEXT) \ prefs.$(OBJEXT) parser.$(OBJEXT) triggers.$(OBJEXT) \ aliases.$(OBJEXT) macros.$(OBJEXT) timers.$(OBJEXT) \ permanentvariables.$(OBJEXT) hooks.$(OBJEXT) log.$(OBJEXT) \ plugins.$(OBJEXT) multilinesend.$(OBJEXT) cmdhistory.$(OBJEXT) \ sound.$(OBJEXT) perlscript.$(OBJEXT) kcwin.$(OBJEXT) \ simocombobox.$(OBJEXT) kcircularqueue.$(OBJEXT) \ wresources.$(OBJEXT) kildclient_OBJECTS = $(am_kildclient_OBJECTS) am__DEPENDENCIES_1 = kildclient_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(kildclient_SOURCES) DIST_SOURCES = $(kildclient_SOURCES) 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' DATA = $(pkgdata_DATA) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GREP = @GREP@ GTKSPELL_CFLAGS = @GTKSPELL_CFLAGS@ GTKSPELL_LIBS = @GTKSPELL_LIBS@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ KILDCLIENT_PERL_CFLAGS = @KILDCLIENT_PERL_CFLAGS@ KILDCLIENT_PERL_LIBS = @KILDCLIENT_PERL_LIBS@ LDFLAGS = @LDFLAGS@ LIBGNUTLS_CFLAGS = @LIBGNUTLS_CFLAGS@ LIBGNUTLS_LIBS = @LIBGNUTLS_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ OBJEXT = @OBJEXT@ 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@ PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RES_COMPILE = @RES_COMPILE@ RES_INCDIR = @RES_INCDIR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ WINDRES = @WINDRES@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = $(datadir)/locale localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ kildclient_SOURCES = main.c \ net.c \ proxy.c \ mainwindow.c \ worldgui.c \ ansitextview.c \ worldselector.c \ worlds.c \ worldeditor.c \ we_general.c \ we_mainwindow.c \ we_colors.c \ we_statusbar.c \ we_input.c \ we_logging.c \ we_scripting.c \ we_plugins.c \ we_generic_guied.c \ we_triggers.c \ we_aliases.c \ we_macros.c \ we_timers.c \ we_hooks.c \ we_vars.c \ we_protocols.c \ we_misc.c \ we_advanced.c \ prefs.c \ parser.c \ triggers.c \ aliases.c \ macros.c \ timers.c \ permanentvariables.c \ hooks.c \ log.c \ plugins.c \ multilinesend.c \ cmdhistory.c \ sound.c \ perlscript.c \ kcwin.c \ simocombobox.c \ kcircularqueue.c \ wresources.rc noinst_HEADERS = kildclient.h \ net.h \ ansi.h \ perlscript.h \ simocombobox.h \ util_cursor.h \ kcircularqueue.h pkgdata_DATA = kildclient.ui \ wndmain.ui \ dlgSelectWorld.ui \ dlgPreferences.ui \ dlgStatistics.ui \ dlgAbout.ui \ dlgEditWorld.ui \ dlgTestTriggers.ui \ dlgMLSend.ui \ dlgCmdHistory.ui \ mnuPopupURL.ui gladefiles = kildclient.glade \ wndmain.glade \ dlgSelectWorld.glade \ dlgPreferences.glade \ dlgStatistics.glade \ dlgAbout.glade \ dlgEditWorld.glade \ dlgTestTriggers.glade \ dlgMLSend.glade \ dlgCmdHistory.glade \ mnuPopupURL.glade EXTRA_DIST = $(pkgdata_DATA) $(gladefiles) pkgdocdir = $(datadir)/doc/kildclient manualdir = $(pkgdocdir)/html kildclient_LDADD = $(GTK_LIBS) $(KILDCLIENT_PERL_LIBS) $(GTKSPELL_LIBS) $(LIBGNUTLS_LIBS) $(INTLLIBS) -lz INCLUDES = -DLOCALEDIR=\"$(localedir)\" \ -DPKGDATADIR=\"$(pkgdatadir)\" \ -DSYSDATADIR=\"$(datadir)\" \ -DMANUALDIR=\"$(manualdir)\" \ -DG_LOG_DOMAIN=\"kildclient\" \ $(GTK_CFLAGS) $(KILDCLIENT_PERL_CFLAGS) $(GTKSPELL_CFLAGS) $(LIBGNUTLS_CFLAGS) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj .rc $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ 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) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) kildclient$(EXEEXT): $(kildclient_OBJECTS) $(kildclient_DEPENDENCIES) @rm -f kildclient$(EXEEXT) $(LINK) $(kildclient_OBJECTS) $(kildclient_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aliases.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ansitextview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmdhistory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hooks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kcircularqueue.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kcwin.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/macros.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mainwindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multilinesend.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/perlscript.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/permanentvariables.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/plugins.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prefs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proxy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simocombobox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/triggers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_advanced.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_aliases.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_colors.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_general.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_generic_guied.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_hooks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_input.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_logging.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_macros.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_mainwindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_misc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_plugins.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_protocols.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_scripting.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_statusbar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_timers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_triggers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/we_vars.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/worldeditor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/worldgui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/worlds.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/worldselector.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) '$<'` install-pkgdataDATA: $(pkgdata_DATA) @$(NORMAL_INSTALL) test -z "$(pkgdatadir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ 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)$(pkgdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgdatadir)" || exit $$?; \ done uninstall-pkgdataDATA: @$(NORMAL_UNINSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(pkgdatadir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(pkgdatadir)" && rm -f $$files 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) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgdatadir)"; 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic 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-pkgdataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-pkgdataDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-pkgdataDATA install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-pkgdataDATA .rc.o: @RES_COMPILE@ # Temporary rule to convert Glade XML files to GtkBuilder XML files using # gtk-builder-convert while Glade saving of GtkBuilder files is deficient. %.ui: %.glade gtk-builder-convert $< $@ # 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: kildclient-2.11.1/src/hooks.c0000644000175000017500000002705311570205043012721 00000000000000/* $Id: hooks.c 1176 2011-05-28 14:43:45Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "kildclient.h" #include "perlscript.h" /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ static void save_hook_list(GString *str, GSList *hookptr); gboolean connect_hook(World *world, const gchar *hookname, int pos, gchar *action, gchar *name, gboolean enabled) { GSList **hook_list; Hook *hook; gint *hook_pos; hook_list = get_hook_list_for_writing(world, hookname, &hook_pos); if (!hook_list) { ansitextview_append_stringf(world->gui, _("hook: hook '%s' not found\n"), hookname); return FALSE; } if (pos == -1) { hook = g_new0(Hook, 1); if (world->plugins_being_defined) { hook->owner_plugin = world->plugins_being_defined->data; *hook_list = g_slist_append(*hook_list, hook); } else { *hook_list = g_slist_insert(*hook_list, hook, *hook_pos); } } else { hook = (Hook *) g_slist_nth_data(*hook_list, pos); if (!hook) { ansitextview_append_string_nl(world->gui, _("No such hook")); return FALSE; } } if (action) { g_free(hook->action); hook->action = action; } if (name) { g_free(hook->name); hook->name = name; } hook->enabled = enabled; if (pos == -1) { if (!world->plugins_being_defined) { we_hook_insert_hook(world, hookname, hook, (*hook_pos)++); } else { we_hook_insert_hook(world, hookname, hook, g_slist_length(*hook_list)); } } else { we_hook_update_hook(world, hookname, hook); } return TRUE; } gboolean execute_hook(World *world, const gchar *hookname, const char *hookdata) { PerlInterpreter *old_interpreter; GSList *hookptr = NULL; Hook *hook; SV *Phookdata; hookptr = get_hook_list_for_reading(world, hookname, NULL); if (hookptr) { gboolean dont_flush; old_interpreter = PERL_GET_CONTEXT; PERL_SET_CONTEXT(world->perl_interpreter); dont_flush = world->dont_flush; world->dont_flush = TRUE; world_for_perl = world; if (hookdata) { Phookdata = get_sv("hookdata", TRUE); SvUTF8_on(Phookdata); sv_setpv(Phookdata, hookdata); } while (hookptr) { hook = (Hook *) hookptr->data; if (hook->enabled) { parse_commands(world, hook->action, strlen(hook->action)); } hookptr = hookptr->next; } world_for_perl = currentWorld; world->dont_flush = dont_flush; PERL_SET_CONTEXT(old_interpreter); } return TRUE; } void list_hooks(World *world, const gchar *hookname, Plugin *plugin) { GSList *hooklist; Hook *hook; guint total_width; guint field_width; guint i; hooklist = get_hook_list_for_reading(world, hookname, NULL); if (!hooklist) { ansitextview_append_string_nl(world->gui, _("Hook not found")); return; } /* The rows argument is not used. */ ansitextview_get_size(world->gui, &field_width, &total_width); /* If the screen is really narrow, we can do nothing. */ if (total_width < 14) { total_width = 14; } field_width = total_width - 9; ansitextview_append_stringf(world->gui, _("Hooks for '%s':\n"), hookname); ansitextview_append_string_nl(world->gui, _("Num Ena Action")); ansitextview_append_string(world->gui, "--- --- "); for (i = 0; i < field_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, "\n"); i = 0; while (hooklist) { hook = (Hook *) hooklist->data; if (hook->owner_plugin == plugin) { ansitextview_append_stringf(world->gui, "%3d %-3.3s %-*.*s\n", i, hook->enabled ? _("y") : _("n"), field_width, field_width, hook->action); } hooklist = hooklist->next; ++i; } } void list_hook(World *world, const gchar *hookname, int pos) { GSList *hooklist; Hook *hook; hooklist = get_hook_list_for_reading(world, hookname, NULL); if (!hooklist) { ansitextview_append_string_nl(world->gui, _("Hook not found")); return; } hook = (Hook *) g_slist_nth_data(hooklist, pos); if (!hook) { ansitextview_append_string_nl(world->gui, _("No such hook")); return; } ansitextview_append_stringf(world->gui, _("Hook number %d for event %s\n" " Name: %s\n" " Action: %s\n" " Enabled: %s\n"), pos, hookname, hook->name ? hook->name : _("Not set"), hook->action, hook->enabled ? _("yes") : _("no")); } gboolean delete_hook(World *world, const gchar *hookname, int pos, GSList *hook) { /* Can receive either the list item poiting to the hook itself * (in this case, pos is ignored), * or, if hook is NULL, the position of the hook to delete. */ GSList **hooklist; gint *hook_pos; hooklist = get_hook_list_for_writing(world, hookname, &hook_pos); if (!hooklist) { return FALSE; } if (hook == NULL) { hook = g_slist_nth(*hooklist, pos); } if (!hook) { return FALSE; } we_hook_delete_hook(world, hookname, (Hook *) hook->data); *hooklist = g_slist_remove_link(*hooklist, hook); if (!((Hook *) hook->data)->owner_plugin) { --(*hook_pos); } free_hook((Hook *) hook->data, NULL); g_slist_free(hook); return TRUE; } gboolean move_hook(World *world, const gchar *hookname, gint old_pos, gint new_pos) { GSList **hooklist; gint *hook_pos; GSList *hookitem; gpointer hook; hooklist = get_hook_list_for_writing(world, hookname, &hook_pos); if (!hooklist) { return FALSE; } if (new_pos < 0 || new_pos >= *hook_pos) { new_pos = *hook_pos - 1; } hookitem = g_slist_nth(*hooklist, old_pos); if (!hookitem) { return FALSE; } hook = hookitem->data; *hooklist = g_slist_delete_link(*hooklist, hookitem); *hooklist = g_slist_insert(*hooklist, hook, new_pos); we_hook_delete_hook(world, hookname, hook); we_hook_insert_hook(world, hookname, hook, new_pos); return TRUE; } void free_hook(Hook *hook, gpointer data) { g_free(hook->name); g_free(hook->action); g_free(hook); } void save_hooks(GString *str, World *world) { g_string_append_printf(str, " \n"); if (world->hooks.OnConnect) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnConnect); } if (world->hooks.OnDisconnect) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnDisconnect); } if (world->hooks.OnReceivedText) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnReceivedText); } if (world->hooks.OnSentCommand) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnSentCommand); } if (world->hooks.OnGetFocus) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnGetFocus); } if (world->hooks.OnLoseFocus) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnLoseFocus); } if (world->hooks.OnCloseConnected) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnCloseConnected); } g_string_append_printf(str, " \n"); } GSList ** get_hook_list_for_writing(World *world, const gchar *hookname, gint **poscounter) { if (strcmp(hookname, "OnConnect") == 0) { *poscounter = &world->hooks.OnConnect_pos; return &world->hooks.OnConnect; } if (strcmp(hookname, "OnDisconnect") == 0) { *poscounter = &world->hooks.OnDisconnect_pos; return &world->hooks.OnDisconnect; } if (strcmp(hookname, "OnReceivedText") == 0) { *poscounter = &world->hooks.OnReceivedText_pos; return &world->hooks.OnReceivedText; } if (strcmp(hookname, "OnSentCommand") == 0) { *poscounter = &world->hooks.OnSentCommand_pos; return &world->hooks.OnSentCommand; } if (strcmp(hookname, "OnGetFocus") == 0) { *poscounter = &world->hooks.OnGetFocus_pos; return &world->hooks.OnGetFocus; } if (strcmp(hookname, "OnLoseFocus") == 0) { *poscounter = &world->hooks.OnGetFocus_pos; return &world->hooks.OnLoseFocus; } if (strcmp(hookname, "OnCloseConnected") == 0) { *poscounter = &world->hooks.OnCloseConnected_pos; return &world->hooks.OnCloseConnected; } return NULL; } GSList * get_hook_list_for_reading(World *world, const gchar *hookname, gint *pos) { gint *dummy; GSList **hooklist = get_hook_list_for_writing(world, hookname, &dummy); if (hooklist) { if (pos) { *pos = *dummy; } return *hooklist; } return NULL; } GtkTreeModel * get_hook_model(World *world, const gchar *hookname) { if (strcmp(hookname, "OnConnect") == 0) { return world->hooks.OnConnect_model; } if (strcmp(hookname, "OnDisconnect") == 0) { return world->hooks.OnDisconnect_model; } if (strcmp(hookname, "OnReceivedText") == 0) { return world->hooks.OnReceivedText_model; } if (strcmp(hookname, "OnSentCommand") == 0) { return world->hooks.OnSentCommand_model; } if (strcmp(hookname, "OnGetFocus") == 0) { return world->hooks.OnGetFocus_model; } if (strcmp(hookname, "OnLoseFocus") == 0) { return world->hooks.OnLoseFocus_model; } if (strcmp(hookname, "OnCloseConnected") == 0) { return world->hooks.OnCloseConnected_model; } return NULL; } static void save_hook_list(GString *str, GSList *hookptr) { Hook *hook; while (hookptr) { hook = (Hook *) hookptr->data; if (!hook->owner_plugin) { save_hook(str, hook); } hookptr = hookptr->next; } g_string_append(str, " \n"); } void save_hook(GString *str, Hook *hook) { g_string_append(str, " name) { kc_g_string_append_escaped(str, "name=\"%s\" ", hook->name); } kc_g_string_append_escaped(str, "enabled=\"%d\">%s\n", hook->enabled, hook->action); } kildclient-2.11.1/src/simocombobox.c0000644000175000017500000021636411570450170014306 00000000000000/* * SimoComboBox is meant to be an alternative combobox to the * standard GtkComboBox. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * Author: * Todd A. Fisher (toddf@simosoftware.com) * */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #ifdef HAVE_GTKSPELL # include #endif #include "simocombobox.h" #if defined(GDK_WINDOWING_X11) && defined(USE_SHADOWS) #include "dropshadow.h" #endif #ifdef GDK_WINDOWING_WIN32 #include #include "gdk/gdkwin32.h" #endif #include "util_cursor.h" //#define WITHOUT_BUTTON #define CHILD_SPACING 1 #define COMBO_MIN_WIDTH 50 #define COMBO_MIN_HEIGHT 10 enum { CLICKED, POPUP_DISPLAYED, POPUP_CLOSED, CHANGED, ACTIVATE, SIZE_CHANGED, LAST_SIGNAL }; enum { PROP_0, PROP_MODEL, PROP_MAX_HEIGHT, PROP_MAX_WIDTH, PROP_EDIT, PROP_MAX_LINES }; static const char *combo_box_seperator = "------------"; struct _SimoComboBoxPrivate{ GtkWidget *parent; GtkWidget *popup_window; /* the window that is dropped down when the button is clicked */ GtkWidget *popup_scroll; /* the scrolled window for the treeview */ GtkTreePath *current_path; /* path to the active cell, can be NULL if no items are currently selected */ gint button_press_x, button_press_y; #if defined(GDK_WINDOWING_X11) && defined(USE_SHADOWS) DropShadow *ds; #endif SimoCursor hand; GtkEntryCompletion *completion; #ifdef HAVE_GTKSPELL GtkSpell *gtkspell; #endif gboolean scrolls_visible; gint n_lines; gint max_lines; guint editable_signal; guint drag_signal; guint arrow_sig; /* arrow button sig */ guint bl_sig; /* button label sig */ GtkAllocation entry_alloc; gint fixed_entry_size; GtkWidget *label_button; GtkWidget *scrolled_window; GtkWidget *vbox_arrows; /* Return value of get_text for multi-line widget - so that the user does not need to free it. */ gchar *ml_text; /* IDs of signal handlers */ gulong single_changed_id; gulong multi_changed_id; /* Line height for size calculation */ gint cached_line_height; }; static GtkBinClass *parent_class = NULL; static guint combo_box_signals[LAST_SIGNAL] = {0,}; static void simo_combo_box_class_init(SimoComboBoxClass *klass); static void simo_combo_box_init(SimoComboBox *combo_box); static void simo_combo_box_size_request(GtkWidget *widget, GtkRequisition *requisition); static void simo_combo_box_finalize(GObject *object); static void simo_combo_box_get_property(GObject *object, guint param_id, GValue *value, GParamSpec *pspec); static void simo_combo_box_set_property(GObject *object, guint param_id, const GValue *value, GParamSpec *pspec); static void simo_combo_box_size_allocate(GtkWidget *widget, GtkAllocation *allocation ); static gint simo_combo_box_get_line_height(SimoComboBox *combo_box); static gboolean simo_combo_box_update_pressed(GtkWidget *widget, GdkEventButton *event, SimoComboBox *combo_box); static void simo_combo_box_row_activated(GtkTreeView *treeview, GtkTreePath *arg1, GtkTreeViewColumn *arg2, SimoComboBox *combo); static gboolean simo_combo_box_treeview_press_event(GtkWidget *widget, GdkEventButton *event, SimoComboBox *combo_box); static gboolean simo_combo_box_treeview_release_event(GtkWidget *widget, GdkEventButton *event, SimoComboBox *combo_box); static gboolean simo_combo_box_key_release_event(GtkWidget *widget, GdkEventKey *event, SimoComboBox *combo_box); static gboolean simo_combo_box_treeview_motion_event(GtkWidget *widget, GdkEventMotion *event, SimoComboBox *combo_box); static gboolean simo_combo_box_is_seperator_row(SimoComboBox *combo_box, GtkTreeIter *iter); static void simo_combo_box_row_deleted(GtkTreeModel *model, GtkTreePath *path, SimoComboBox *combo); /*static void simo_combo_box_row_inserted(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, SimoComboBox *combo);*/ static void simo_combo_box_popup_close(SimoComboBox *combo_box); static void simo_combo_box_grab_focus_signal(GtkWidget *widget); static void simo_combo_box_text_changed_cb(GtkEditable *editable, gpointer data); static void simo_combo_box_entry_activate_cb(GtkEditable *editable, gpointer data); static gboolean simo_combo_box_txtview_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data); static gboolean simo_combo_box_arrow_up_cb(GtkWidget *widget, GdkEventButton *event, gpointer data); static gboolean simo_combo_box_arrow_down_cb(GtkWidget *widget, GdkEventButton *event, gpointer data); GType simo_combo_box_get_type(void) { static GType combo_box_type = 0; if (!combo_box_type) { static const GTypeInfo combo_box_info = { sizeof (SimoComboBoxClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) simo_combo_box_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (SimoComboBox), 0, (GInstanceInitFunc) simo_combo_box_init }; combo_box_type = g_type_register_static(GTK_TYPE_HBOX, "SimoComboBox", &combo_box_info, (GTypeFlags) 0); } return combo_box_type; } /*static void simo_combo_box_show(SimoComboBox *combo_box) { gtk_widget_show(combo_box->button); gtk_widget_show(combo_box->entry); gtk_widget_show(combo_box); } static void simo_combo_box_hide(SimoComboBox *combo_box) { gtk_widget_hide(combo_box->button); gtk_widget_hide(combo_box->entry); //gtk_widget_hide(combo_box); } */ static void simo_combo_box_class_init(SimoComboBoxClass *klass) { GObjectClass *g_object_class; GtkObjectClass *gtk_object_class; GtkWidgetClass *widget_class; g_object_class = G_OBJECT_CLASS (klass); gtk_object_class = (GtkObjectClass*) klass; widget_class = (GtkWidgetClass*) klass; //widget_class->show = simo_combo_box_show; //widget_class->hide = simo_combo_box_hide; parent_class = g_type_class_peek_parent((GObjectClass*) klass); g_object_class->finalize = simo_combo_box_finalize; //gtk_object_class->destroy = simo_combo_box_destroy; //widget_class->realize = simo_combo_box_realize; g_object_class->set_property = simo_combo_box_set_property; g_object_class->get_property = simo_combo_box_get_property; widget_class->size_allocate = simo_combo_box_size_allocate; widget_class->size_request = simo_combo_box_size_request; widget_class->grab_focus = simo_combo_box_grab_focus_signal; klass->clicked = NULL; klass->popup_displayed = NULL; /* signals */ combo_box_signals[CLICKED] = g_signal_new("clicked", G_OBJECT_CLASS_TYPE(gtk_object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(SimoComboBoxClass, clicked), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); combo_box_signals[POPUP_DISPLAYED] = g_signal_new("popup-displayed", G_OBJECT_CLASS_TYPE(gtk_object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(SimoComboBoxClass, popup_displayed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); combo_box_signals[POPUP_CLOSED] = g_signal_new("popup-closed", G_OBJECT_CLASS_TYPE(gtk_object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(SimoComboBoxClass, popup_closed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); combo_box_signals[CHANGED] = g_signal_new("changed", G_OBJECT_CLASS_TYPE(gtk_object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(SimoComboBoxClass, changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); combo_box_signals[ACTIVATE] = g_signal_new("activate", G_OBJECT_CLASS_TYPE(gtk_object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(SimoComboBoxClass, activate), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); combo_box_signals[SIZE_CHANGED] = g_signal_new("size_changed", G_OBJECT_CLASS_TYPE(gtk_object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(SimoComboBoxClass, size_changed), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); /* properties */ g_object_class_install_property( g_object_class, PROP_MODEL, g_param_spec_object( "model", "ComboBox model", "The model for the combo box", GTK_TYPE_TREE_MODEL, G_PARAM_READWRITE)); g_object_class_install_property( g_object_class, PROP_MAX_WIDTH, g_param_spec_int( "max_width", "Max width", "Max width the popup window is allowed to grow to before displaying a scroll bar", 0, G_MAXINT, 150, G_PARAM_READWRITE)); g_object_class_install_property( g_object_class, PROP_MAX_HEIGHT, g_param_spec_int( "max_height", "Max height", "Max height the popup window is allowed to grow to before displaying a scroll bar", 0, G_MAXINT, 150, G_PARAM_READWRITE)); g_object_class_install_property( g_object_class, PROP_EDIT, g_param_spec_boolean( "edit", "Editable", "Controls whether or not the combobox entry is editable", TRUE, G_PARAM_READWRITE)); g_object_class_install_property( g_object_class, PROP_MAX_LINES, g_param_spec_int( "max_lines", "Maximum lines", "Max number of lines allowed in the multi-line text editing widget", 1, G_MAXINT, 10, G_PARAM_READWRITE)); } static gboolean simo_combo_box_is_seperator_row( SimoComboBox *combo_box, GtkTreeIter *iter ) { gchar *text = 0; gtk_tree_model_get( combo_box->model, iter, combo_box->visible_column, &text, -1 ); if( text != 0 && !strcmp( text, combo_box_seperator ) ){ g_free( text ); return TRUE; } g_free( text ); return FALSE; } static gboolean allow_row_selection( GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, SimoComboBox *combo_box ) { GtkTreeIter iter; if( gtk_tree_model_get_iter( model, &iter, path ) ){ if( simo_combo_box_is_seperator_row( combo_box, &iter ) ) return FALSE; } return TRUE; } static void simo_combo_box_init(SimoComboBox *combo_box) { int mask; GtkWidget *arrow; GtkWidget *arrow_evtbox; GtkWidget *button_align; GtkWidget *frame; SimoComboBoxPrivate *mthis = combo_box->priv = g_new0(SimoComboBoxPrivate, 1); GtkCellRenderer *cell; GtkTreeSelection *selection; GtkWidget *align; combo_box->priv = mthis; combo_box->max_popup_height = 350; combo_box->max_popup_width = 450; combo_box->visible_column = 0; mthis->n_lines = 1; mthis->max_lines = 10; mthis->hand = simo_cursor_new( SIMO_HAND ); // build the popup window mthis->popup_window = gtk_window_new( GTK_WINDOW_POPUP ); align = gtk_alignment_new( 0, 0, 1, 1 ); mthis->popup_scroll = gtk_scrolled_window_new( NULL, NULL ); frame = gtk_frame_new( NULL ); combo_box->model = (GtkTreeModel*)gtk_tree_store_new( 1, G_TYPE_STRING ); combo_box->treeview = (GtkTreeView*) gtk_tree_view_new_with_model(combo_box->model); gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( mthis->popup_scroll ), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC ); g_object_set( G_OBJECT( combo_box->treeview ), "fixed-height-mode", FALSE, "headers-visible", FALSE, "rules-hint", FALSE, "reorderable", FALSE, NULL ); combo_box->column = gtk_tree_view_column_new(); g_object_set( combo_box->column, "expand", TRUE, NULL ); cell = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start( combo_box->column, cell, TRUE ); gtk_tree_view_column_add_attribute( combo_box->column, cell, "text", 0 ); // gtk_tree_view_column_set_cell_data_func( combo_box->column, cell, simo_combo_box_visible_column_render, NULL, NULL ); gtk_tree_view_column_set_resizable( combo_box->column, TRUE ); gtk_tree_view_column_set_sizing( combo_box->column, GTK_TREE_VIEW_COLUMN_AUTOSIZE ); gtk_tree_view_append_column( combo_box->treeview, combo_box->column ); //#ifdef NDEBUG // only enable for release until warnnigs are fixed #ifdef GDK_WINDOWING_WIN32 /* once Linux version becomes 2.6 we'll remove the macro */ g_object_set( cell, "ellipsize", PANGO_ELLIPSIZE_END, NULL ); #endif //#endif selection = gtk_tree_view_get_selection( combo_box->treeview ); gtk_tree_selection_set_select_function(selection, (GtkTreeSelectionFunc) allow_row_selection, combo_box, NULL); gtk_tree_selection_set_mode( selection, GTK_SELECTION_SINGLE ); //gtk_tree_selection_unselect_all( selection ); // set up the popup window with the appropriate attributes so that it works correctly as a popup window //gtk_window_set_type_hint( GTK_WINDOW( mthis->popup_window ), GDK_WINDOW_TYPE_HINT_MENU ); gtk_window_set_keep_above( GTK_WINDOW( mthis->popup_window ), TRUE ); gtk_window_set_decorated( GTK_WINDOW( mthis->popup_window ), FALSE ); gtk_window_set_resizable( GTK_WINDOW( mthis->popup_window ), TRUE ); gtk_widget_realize( mthis->popup_window ); simo_cursor_set_delay(gtk_widget_get_window(mthis->popup_window), mthis->hand ); mask = gdk_window_get_events(gtk_widget_get_window(mthis->popup_window)); gdk_window_set_events(gtk_widget_get_window(mthis->popup_window), mask | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); // gtk_container_add( GTK_CONTAINER( mthis->popup_window ), frame ); gtk_frame_set_shadow_type( GTK_FRAME( frame ), GTK_SHADOW_OUT ); gtk_container_set_border_width( GTK_CONTAINER( mthis->popup_scroll ), 0 ); gtk_container_add( GTK_CONTAINER( mthis->popup_window ), align ); gtk_container_add( GTK_CONTAINER( align ), frame ); gtk_container_add( GTK_CONTAINER( frame ), mthis->popup_scroll ); gtk_container_set_border_width( GTK_CONTAINER( mthis->popup_window ), 0 ); gtk_widget_set_name( mthis->popup_window, "white" ); #if defined(GDK_WINDOWING_X11) && defined(USE_SHADOWS) /* only needed for unix dropshadows */ gtk_alignment_set_padding( GTK_ALIGNMENT( align ), 0, 0, 0, 5 ); #endif //gtk_widget_set_name( mthis->popup_scroll, "white" ); gtk_container_add(GTK_CONTAINER( mthis->popup_scroll ), (GtkWidget*)combo_box->treeview); // g_object_get( G_OBJECT( frame ), "border-width", &(mthis->frame_border ), NULL ); // build the widget face arrow = gtk_arrow_new( GTK_ARROW_DOWN, GTK_SHADOW_IN ); combo_box->button = gtk_toggle_button_new();//gtk_button_new(); combo_box->entry = gtk_entry_new(); mthis->scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(mthis->scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(mthis->scrolled_window), GTK_SHADOW_IN); combo_box->txtview = gtk_text_view_new(); gtk_text_view_set_pixels_above_lines(GTK_TEXT_VIEW(combo_box->txtview), 2); gtk_text_view_set_left_margin(GTK_TEXT_VIEW(combo_box->txtview), 2); gtk_text_view_set_right_margin(GTK_TEXT_VIEW(combo_box->txtview), 2); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(combo_box->txtview), GTK_WRAP_WORD_CHAR); combo_box->txtbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(combo_box->txtview)); gtk_container_add(GTK_CONTAINER(mthis->scrolled_window), combo_box->txtview); mthis->label_button = gtk_toggle_button_new();//gtk_button_new(); button_align = gtk_alignment_new( 0, (gfloat)0.5, 1, 1 ); combo_box->label = gtk_label_new(""); #ifdef GDK_WINDOWING_WIN32 // FIXME: should check gtk+ version number for 2.5+ gtk_label_set_ellipsize( GTK_LABEL( combo_box->label ), PANGO_ELLIPSIZE_END ); #endif // hbox = gtk_hbox_new( FALSE, 0 ); combo_box->editable = TRUE; // give an initial allocation size to the entry box // Removed by Eduardo Kalinowski. Seems not to be necessary, and // does not compile when GSEAL_ENABLE is defined. //combo_box->priv->entry_alloc.width = COMBO_MIN_WIDTH - 25; //combo_box->entry->allocation.width = COMBO_MIN_WIDTH - 25; //combo_box->entry->allocation.height = COMBO_MIN_HEIGHT; // g_print( "setting fixed entry size to default\n" ); //combo_box->priv->fixed_entry_size = -1; //mthis->label_button->allocation.width = COMBO_MIN_HEIGHT; //mthis->label_button->allocation.height = COMBO_MIN_HEIGHT; //gtk_container_remove( GTK_CONTAINER( combo_box->button ), // gtk_bin_get_child( GTK_BIN( combo_box->button ) ) ); // gtk_box_pack_start( GTK_BOX( hbox ), combo_box->label, 1, 1, 0 ); // gtk_box_pack_start( GTK_BOX( hbox ) , arrow, 0, 1, 0 ); // gtk_widget_show( hbox ); gtk_widget_show( arrow ); gtk_container_add( GTK_CONTAINER( combo_box->button ), arrow ); gtk_container_add( GTK_CONTAINER( mthis->label_button ), button_align ); gtk_container_add( GTK_CONTAINER( button_align ), combo_box->label ); gtk_widget_set_name( mthis->label_button, "combo_label" ); gtk_widget_set_name( combo_box->label, "combo_label" ); gtk_widget_set_name( arrow, "combo_arrow" ); gtk_widget_set_name( combo_box->button, "combo_button" ); gtk_widget_set_name( combo_box->entry, "combo_entry" ); /* Create the completion object */ mthis->completion = gtk_entry_completion_new(); /* Assign the completion to the entry */ gtk_entry_set_completion( GTK_ENTRY( combo_box->entry ), mthis->completion ); g_object_unref( mthis->completion ); gtk_entry_completion_set_model( mthis->completion, combo_box->model ); /* Use model column 0 as the text column */ /*gtk_entry_completion_set_text_column( mthis->completion, 0 );*/ #if defined(GDK_WINDOWING_X11) && defined(USE_SHADOWS) /* windows xp does not need this */ // create the drop shadow object mthis->ds = drop_shadow_new(); #endif gtk_button_set_focus_on_click( GTK_BUTTON( combo_box->button ), FALSE ); gtk_widget_show( arrow ); gtk_widget_show( combo_box->button ); gtk_widget_show( combo_box->entry ); gtk_widget_show( combo_box->label ); gtk_widget_show( button_align ); gtk_widget_show( mthis->label_button ); gtk_widget_hide( mthis->label_button ); // gtk_widget_show( frame ); gtk_widget_show( mthis->popup_scroll ); gtk_widget_show( GTK_WIDGET( combo_box->treeview ) ); // gtk_box_pack_start( GTK_BOX( combo_box ), mthis->label_button, TRUE, TRUE, 0 ); gtk_box_pack_start( GTK_BOX( combo_box ), combo_box->entry, TRUE, TRUE, 0 ); g_object_set(G_OBJECT(mthis->scrolled_window), "no-show-all", TRUE, NULL); gtk_box_pack_start(GTK_BOX(combo_box), mthis->scrolled_window, TRUE, TRUE, 0); mthis->vbox_arrows = gtk_vbox_new(TRUE, 0); arrow = gtk_arrow_new(GTK_ARROW_UP, GTK_SHADOW_OUT); gtk_misc_set_alignment(GTK_MISC(arrow), .5, 0); arrow_evtbox = gtk_event_box_new(); g_signal_connect(G_OBJECT(arrow_evtbox), "button-press-event", G_CALLBACK(simo_combo_box_arrow_up_cb), combo_box); gtk_container_add(GTK_CONTAINER(arrow_evtbox), arrow); gtk_box_pack_start(GTK_BOX(mthis->vbox_arrows), arrow_evtbox, TRUE, TRUE, 0); arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_OUT); gtk_misc_set_alignment(GTK_MISC(arrow), .5, 1); arrow_evtbox = gtk_event_box_new(); g_signal_connect(G_OBJECT(arrow_evtbox), "button-press-event", G_CALLBACK(simo_combo_box_arrow_down_cb), combo_box); gtk_container_add(GTK_CONTAINER(arrow_evtbox), arrow); gtk_box_pack_start(GTK_BOX(mthis->vbox_arrows), arrow_evtbox, TRUE, TRUE, 0); gtk_box_pack_end(GTK_BOX(combo_box), mthis->vbox_arrows, FALSE, FALSE, 0); gtk_alignment_set(GTK_ALIGNMENT(button_align), (gfloat) 0.01, (gfloat) 0.5, (gfloat) 1.0, (gfloat) 0.5); gtk_misc_set_alignment(GTK_MISC(combo_box->label), (gfloat) 0.01, (gfloat) 0.5); // gtk_button_set_alignment( GTK_BUTTON( combo_box->label ), (gfloat)0.01, (gfloat)0.5 ); // gtk_box_pack_start( GTK_BOX( combo_box ), button, TRUE, TRUE, 0 ); gtk_box_pack_end( GTK_BOX( combo_box ), combo_box->button, FALSE, FALSE, 0 ); g_object_ref( G_OBJECT( combo_box->entry ) ); g_object_ref( G_OBJECT( mthis->label_button ) ); mthis->arrow_sig = g_signal_connect_swapped( G_OBJECT( combo_box->button ), "toggled", G_CALLBACK( simo_combo_box_popup ), combo_box ); mthis->bl_sig = g_signal_connect_swapped( G_OBJECT( mthis->label_button ), "toggled", G_CALLBACK( simo_combo_box_popup ), combo_box ); g_signal_connect( G_OBJECT( combo_box->treeview ), "row-activated", G_CALLBACK( simo_combo_box_row_activated ), combo_box ); g_signal_connect( G_OBJECT( combo_box->treeview ), "button-press-event", G_CALLBACK( simo_combo_box_treeview_press_event ), combo_box ); g_signal_connect( G_OBJECT( combo_box->treeview ), "button-release-event", G_CALLBACK( simo_combo_box_treeview_release_event ), combo_box ); g_signal_connect( G_OBJECT( combo_box->treeview ), "key-release-event", G_CALLBACK( simo_combo_box_key_release_event ), combo_box ); g_signal_connect( G_OBJECT( combo_box->treeview ), "motion-notify-event", G_CALLBACK( simo_combo_box_treeview_motion_event ), combo_box ); mthis->single_changed_id = g_signal_connect(G_OBJECT(combo_box->entry), "changed", G_CALLBACK(simo_combo_box_text_changed_cb), combo_box); g_signal_connect(G_OBJECT(combo_box->entry), "activate", G_CALLBACK(simo_combo_box_entry_activate_cb), combo_box); mthis->multi_changed_id = g_signal_connect(G_OBJECT(combo_box->txtbuffer), "changed", G_CALLBACK(simo_combo_box_text_changed_cb), combo_box); g_signal_connect(G_OBJECT(combo_box->txtview), "key-press-event", G_CALLBACK(simo_combo_box_txtview_keypress_cb), combo_box); } static gboolean simo_combo_box_key_release_event(GtkWidget *widget, GdkEventKey *event, SimoComboBox *combo_box) { if( event->keyval == GDK_Escape ) simo_combo_box_popup_close( combo_box ); return FALSE; } static void simo_combo_box_finalize(GObject *object) { SimoComboBoxPrivate *mthis; // g_print( "ENTER: simo_combo_box_finalize\n" ); mthis = SIMO_COMBO_BOX( object )->priv; // g_object_unref( G_OBJECT( SIMO_COMBO_BOX( object )->entry ) ); // g_object_unref( G_OBJECT( SIMO_COMBO_BOX( object )->label ) ); // run parent finalize G_OBJECT_CLASS(parent_class)->finalize(object); if( mthis->current_path ) gtk_tree_path_free( mthis->current_path ); #if defined(GDK_WINDOWING_X11) && defined(USE_SHADOWS) drop_shadow_destroy( mthis->ds ); #endif simo_cursor_free( mthis->hand ); g_free(mthis->ml_text); g_free( mthis ); // g_print( "LEAVE: simo_combo_box_finalize\n" ); // g_free( GTK_WIDGET( object )->name ); } static void simo_combo_box_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { SimoComboBox *combo_box = SIMO_COMBO_BOX( object ); switch( prop_id ){ case PROP_MODEL: g_value_set_object( value, combo_box->model ); break; case PROP_MAX_WIDTH: g_value_set_int( value, combo_box->max_popup_width ); break; case PROP_MAX_HEIGHT: g_value_set_int( value, combo_box->max_popup_height ); break; case PROP_EDIT: g_value_set_boolean( value, gtk_editable_get_editable( GTK_EDITABLE( combo_box->entry ) ) ); break; case PROP_MAX_LINES: g_value_set_int(value, combo_box->priv->max_lines); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID( object, prop_id, pspec ); break; } } static void simo_combo_box_set_property( GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec ) { SimoComboBox *combo_box = SIMO_COMBO_BOX( object ); switch( prop_id ){ case PROP_MODEL:{ GtkTreeModel *model = g_value_get_object( value ); simo_combo_box_set_model( combo_box, model ); if( model ) gtk_entry_completion_set_model( combo_box->priv->completion, model ); // else // gtk_entry_completion_set_model( combo_box->priv->completion, 0 ); }break; case PROP_MAX_WIDTH: combo_box->max_popup_width = g_value_get_int( value ); break; case PROP_MAX_HEIGHT: combo_box->max_popup_height = g_value_get_int( value ); break; case PROP_EDIT: gtk_editable_set_editable( GTK_EDITABLE( combo_box->entry ), g_value_get_boolean( value ) ); break; case PROP_MAX_LINES: combo_box->priv->max_lines = g_value_get_int(value); break; default: break; } } static void simo_combo_box_size_request( GtkWidget *widget, GtkRequisition *req ) { SimoComboBox *combo_box = SIMO_COMBO_BOX(widget); //gint width = req->width; //gint height = req->height; GtkRequisition breq, ereq, lreq, areq; // g_print( "ENTER: simo_combo_box_size_request\n" ); // g_print( "before entry width: %d, button width: %d. total width: %d height: %d\n", // combo_box->priv->entry_alloc.width, combo_box->button->allocation.width, width, height ); if (combo_box->priv->n_lines > 1) { gtk_widget_size_request(combo_box->priv->scrolled_window, &ereq); } else { gtk_widget_size_request(combo_box->entry, &ereq); } gtk_widget_size_request(combo_box->button, &breq); gtk_widget_size_request(combo_box->priv->label_button, &lreq); gtk_widget_size_request(combo_box->priv->vbox_arrows, &areq); if (lreq.width < ereq.width) { ereq.width = lreq.width; } else { lreq.width = ereq.width; } lreq.height = breq.height; ereq.height = breq.height; if (combo_box->priv->n_lines > 1) { req->height = simo_combo_box_get_line_height(combo_box) * combo_box->priv->n_lines + 8; } else { req->height = breq.height; } req->width = ereq.width + breq.width + areq.width; if (req->width < (combo_box->priv->fixed_entry_size + breq.width + areq.width)) { req->width = combo_box->priv->fixed_entry_size + breq.width + areq.width; ereq.width = combo_box->priv->fixed_entry_size; lreq.width = combo_box->priv->fixed_entry_size; } gtk_widget_set_size_request(combo_box->priv->label_button, lreq.width, lreq.height); // gtk_widget_size_request( combo_box->priv->label_button, &lreq ); //gtk_widget_size_request( combo_box->entry, &ereq ); gtk_widget_set_size_request(combo_box->entry, ereq.width, ereq.height); gtk_widget_set_size_request(combo_box->priv->scrolled_window, ereq.width, ereq.height); //width = req->width; //height = req->height; // g_print( "after entry width: %d, button width: %d. total width: %d height: %d\n", // combo_box->priv->entry_alloc.width, combo_box->button->allocation.width, width, height ); // g_print( "LEAVE: simo_combo_box_size_request\n" ); } static void simo_combo_box_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { GtkAllocation ealloc; SimoComboBox *combo = SIMO_COMBO_BOX( widget ); GtkAllocation combobtnAlloc; GtkAllocation vboxarrowsAlloc; // g_print( "ENTER: simo_combo_box_size_allocate\n" ); g_return_if_fail( SIMO_IS_COMBO_BOX( widget ) ); g_return_if_fail( allocation != NULL ); GTK_WIDGET_CLASS( parent_class )->size_allocate( widget, allocation ); // g_print( "combo box allocate: %d:%d:%d:%d:%d\n", allocation->x, allocation->y, allocation->width, allocation->height, combo->priv->fixed_entry_size ); #if GTK_MINOR_VERSION < 18 combobtnAlloc = combo->button->allocation; vboxarrowsAlloc = combo->priv->vbox_arrows->allocation; #else gtk_widget_get_allocation(combo->button, &combobtnAlloc); gtk_widget_get_allocation(combo->priv->vbox_arrows, &vboxarrowsAlloc); #endif ealloc.x = allocation->x; ealloc.y = allocation->y; ealloc.width = allocation->width - combobtnAlloc.width - vboxarrowsAlloc.width; ealloc.height = allocation->height; if (combo->priv->n_lines > 1) { gtk_widget_size_allocate( combo->priv->scrolled_window, &ealloc ); } else { gtk_widget_size_allocate( combo->entry, &ealloc ); } // gtk_widget_size_allocate( combo->button, &combo->button->allocation.width ); gtk_widget_size_allocate( combo->priv->label_button, &ealloc ); // g_print( "LEAVE: simo_combo_box_size_allocate\n" ); // } } static gint simo_combo_box_get_line_height(SimoComboBox *combo_box) { if (combo_box->priv->cached_line_height == 0) { PangoLayout *layout; PangoRectangle logical_rect; layout = gtk_widget_create_pango_layout(GTK_WIDGET(combo_box->txtview), "W"); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); combo_box->priv->cached_line_height = logical_rect.height; g_object_unref(layout); } return combo_box->priv->cached_line_height; } GtkWidget * simo_combo_box_new() { return g_object_new( simo_combo_box_get_type(), NULL ); } GtkWidget * simo_combo_box_new_with_model( GtkTreeModel *model ) { SimoComboBox *cb = (SimoComboBox*)g_object_new( simo_combo_box_get_type(), NULL ); simo_combo_box_set_model( cb, model ); gtk_entry_completion_set_model( cb->priv->completion, model ); return (GtkWidget*)cb; } void simo_combo_box_set_model( SimoComboBox *combo_box, GtkTreeModel *model) { if( combo_box->model ) g_object_unref( combo_box->model ); combo_box->model = model; gtk_tree_view_set_model( combo_box->treeview, combo_box->model ); if( combo_box->model ){ g_object_ref( combo_box->model ); g_signal_connect( combo_box->model, "row-deleted", G_CALLBACK( simo_combo_box_row_deleted ), combo_box ); gtk_entry_set_completion( GTK_ENTRY( combo_box->entry ), NULL ); // g_object_unref( combo_box->priv->completion ); combo_box->priv->completion = gtk_entry_completion_new(); gtk_entry_set_completion( GTK_ENTRY( combo_box->entry ), combo_box->priv->completion ); g_object_unref( combo_box->priv->completion ); gtk_entry_completion_set_model( combo_box->priv->completion, combo_box->model ); /*gtk_entry_completion_set_text_column( combo_box->priv->completion, combo_box->visible_column );*/ } // g_signal_connect( combo_box->model, "row-inserted", G_CALLBACK( simo_combo_box_row_inserted ), combo_box ); } void simo_combo_box_set_visible_column( SimoComboBox *combo_box, int col_id ) { combo_box->visible_column = col_id; gtk_entry_completion_set_text_column( combo_box->priv->completion, col_id ); } void simo_combo_box_set_combo_column(SimoComboBox *combo_box, GtkTreeViewColumn *column) { gtk_tree_view_remove_column(combo_box->treeview, combo_box->column); gtk_tree_view_append_column(combo_box->treeview, column); combo_box->column = column; } GtkEntryCompletion * simo_combo_box_get_completion(SimoComboBox *combo_box) { return combo_box->priv->completion; } void simo_combo_box_set_completion_renderer(SimoComboBox *combo_box, GtkCellRenderer *renderer) { gtk_cell_layout_clear(GTK_CELL_LAYOUT(combo_box->priv->completion)); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo_box->priv->completion), renderer, TRUE); } void simo_combo_box_set_completion_cell_func(SimoComboBox *combo_box, GtkCellRenderer *renderer, GtkCellLayoutDataFunc func, gpointer user_data, GDestroyNotify destroy) { gtk_cell_layout_set_cell_data_func(GTK_CELL_LAYOUT(combo_box->priv->completion), renderer, func, user_data, destroy); } GtkTreeModel *simo_combo_box_get_model( SimoComboBox *combo_box) { return combo_box->model; } static void simo_combo_box_row_deleted( GtkTreeModel *model, GtkTreePath *path, SimoComboBox *combo ) { if( combo->priv->current_path ){ if( !gtk_tree_path_compare( path, combo->priv->current_path ) ){ gtk_tree_path_free( combo->priv->current_path ); combo->priv->current_path = NULL; } } } static gboolean simo_combo_box_update_pressed( GtkWidget *widget, GdkEventButton *event, SimoComboBox *combo_box ) { gdouble x, y; gint x1, x2, y1, y2; gint xoffset, yoffset; GtkAllocation alloc; // GtkWidget *event_widget; if( event->button != 1 ){ return FALSE; } x = event->x_root; y = event->y_root; gdk_window_get_root_origin( gtk_widget_get_window(widget), &xoffset, &yoffset ); #if GTK_MINOR_VERSION < 18 alloc = widget->allocation; #else gtk_widget_get_allocation(widget, &alloc); #endif xoffset += alloc.x; yoffset += alloc.y; x1 = alloc.x + xoffset; y1 = alloc.y + yoffset; x2 = x1 + alloc.width; y2 = y1 + alloc.height; if( x > x1 && x < x2 && y > y1 && y < y2 ){ return TRUE; } simo_combo_box_popup_close( combo_box ); return TRUE; } static void simo_combo_box_popup_close( SimoComboBox *combo_box ) { g_signal_emit( combo_box, combo_box_signals[POPUP_CLOSED], 0 ); gtk_grab_remove( combo_box->priv->popup_window ); gdk_keyboard_ungrab( GDK_CURRENT_TIME ); gdk_pointer_ungrab( GDK_CURRENT_TIME ); g_signal_handlers_disconnect_by_func( G_OBJECT( combo_box->priv->popup_window ), G_CALLBACK( simo_combo_box_update_pressed ), combo_box ); #if defined(GDK_WINDOWING_X11) && defined(USE_SHADOWS) drop_shadow_detach( combo_box->priv->ds ); #endif #ifdef GDK_WINDOWING_WIN32 { RECT rcFrom,rcTo; HWND from_hwnd =GDK_WINDOW_HWND(combo_box->priv->popup_window->window); HWND to_hwnd = GDK_WINDOW_HWND(GTK_WIDGET(combo_box)->window); GetWindowRect(from_hwnd,&rcFrom); GetWindowRect(to_hwnd,&rcTo); DrawAnimatedRects(from_hwnd,1,&rcFrom,&rcTo); ShowWindow(from_hwnd,SW_HIDE); } #endif // set toggle state on buttons gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( combo_box->priv->label_button ), FALSE ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( combo_box->button ), FALSE ); g_signal_handler_unblock( G_OBJECT( combo_box->button ), combo_box->priv->arrow_sig ); g_signal_handler_unblock( G_OBJECT( combo_box->priv->label_button ), combo_box->priv->bl_sig ); gtk_widget_hide(GTK_WIDGET(combo_box->priv->popup_window)); // the label should have focus after the combobox is clicked // make sure our widget has focus after being clicked on #if GTK_MINOR_VERSION < 18 if (GTK_WIDGET_CAN_FOCUS(combo_box)) { // gtk_widget_grab_focus( GTK_WIDGET( combo_box ) ); if (GTK_WIDGET_CAN_FOCUS(combo_box->entry)) { gtk_widget_grab_focus(GTK_WIDGET(combo_box->entry)); } else if (GTK_WIDGET_CAN_FOCUS(combo_box->priv->label_button)) { gtk_widget_grab_focus(GTK_WIDGET( combo_box->priv->label_button)); } } #else if (gtk_widget_get_can_focus(GTK_WIDGET(combo_box))) { // gtk_widget_grab_focus( GTK_WIDGET( combo_box ) ); if (gtk_widget_get_can_focus(combo_box->entry)) { gtk_widget_grab_focus(GTK_WIDGET(combo_box->entry)); } else if (gtk_widget_get_can_focus(combo_box->priv->label_button)) { gtk_widget_grab_focus(GTK_WIDGET( combo_box->priv->label_button)); } } #endif } typedef struct _DimWin { gint count; gint max_width; SimoComboBox *combo; PangoFontDescription *desc; } DimWin; static gboolean compute_max_width( GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, DimWin *dim ) { GValue value = {0}; PangoLayout *layout; PangoRectangle pango_rect; gtk_tree_model_get_value( model, iter, dim->combo->visible_column, &value ); if( G_VALUE_TYPE( &value ) == G_TYPE_STRING ){ const gchar *text = g_value_get_string( &value ); if( text && strlen( text ) > 0 ){ if( dim->desc ){ layout = gtk_widget_create_pango_layout( GTK_WIDGET( dim->combo->treeview ), text ); pango_layout_set_font_description( layout, dim->desc ); pango_layout_get_pixel_extents( layout, NULL, &pango_rect ); g_object_unref( layout ); if( pango_rect.width > dim->max_width ) dim->max_width = pango_rect.width; } } g_value_unset( &value ); } dim->count++; return FALSE; } static void simo_combo_box_compute_tree_size( SimoComboBox *combo, gint *max_cell_width, gint *max_cell_height, gint *number_rows ) { GList *i, *j; gint max_height = 0; gint height; gint spacing = 0; DimWin dim = { 0, 0, combo, 0 }; PangoFontDescription *desc = 0; // get the max height i.e. the tallest cell renderer // loop over each column for( i = gtk_tree_view_get_columns( combo->treeview ); i; i = g_list_next( i ) ){ spacing += gtk_tree_view_column_get_spacing( GTK_TREE_VIEW_COLUMN( i->data ) ); // loop over each cell renderer for( j = gtk_cell_layout_get_cells( GTK_CELL_LAYOUT( i->data ) ); j; j = g_list_next( j ) ){ gtk_cell_renderer_get_size( GTK_CELL_RENDERER( j->data ), GTK_WIDGET( combo->treeview ), NULL, NULL, NULL, NULL, &height ); if( gtk_cell_renderer_text_get_type() == G_OBJECT_TYPE( j->data ) ){ if( desc ){ pango_font_description_free( desc ); desc = 0; } g_object_get( G_OBJECT( j->data ), "font-desc", &desc, NULL ); } height += gtk_tree_view_column_get_spacing( GTK_TREE_VIEW_COLUMN( i->data ) ); if( height > max_height ){ max_height = height; } } } dim.desc = desc; // calculate the max width required based on the text in each cell this is expansive and hence we should consider // an alternative. Esspecially since it assumes text!! gtk_tree_model_foreach( combo->model, (GtkTreeModelForeachFunc)compute_max_width, &dim ); #ifdef GDK_WINDOWING_WIN32 // NOTE: this should be conditional if gtk+2.5 > then don't add 80 and use ellipsize *max_cell_width = dim.max_width + spacing + 30; // for padding we add 80 this can't be right there must be a value we can get from somewhere else #else *max_cell_width = dim.max_width + spacing + 80; // for padding we add 80 this can't be right there must be a value we can get from somewhere else #endif *max_cell_height = max_height; *number_rows = dim.count; if( desc ){ pango_font_description_free( desc ); desc = 0; } } void simo_combo_box_popup( SimoComboBox *combo_box ) { gint bx,by; gint width, height; gint screen_height, screen_width; GtkWidget *widget; GtkAllocation alloc; SimoComboBoxPrivate *mthis; // GtkTreeViewColumn *column; gint tree_req_height, cell_width, cell_height, count; g_return_if_fail( SIMO_IS_COMBO_BOX( combo_box ) ); /* if( combo_box->priv->editable_signal > 0 && g_signal_handler_is_connected( combo_box->entry, combo_box->priv->editable_signal ) ){ g_signal_handler_block( combo_box->entry, combo_box->priv->editable_signal ); g_print( "signal blocked\n" ); } */ widget = GTK_WIDGET( combo_box ); mthis = combo_box->priv; if (mthis->parent == NULL) { mthis->parent = gtk_widget_get_toplevel(widget); #if GTK_MINOR_VERSION < 18 if (!GTK_WIDGET_TOPLEVEL(mthis->parent)) { return; } #else if (!gtk_widget_is_toplevel(mthis->parent)) { return; } #endif } g_signal_emit( combo_box, combo_box_signals[POPUP_DISPLAYED], 0 ); g_signal_connect( G_OBJECT( mthis->popup_window ), "button-release-event", G_CALLBACK( simo_combo_box_update_pressed ), combo_box ); // g_signal_connect( G_OBJECT( mthis->popup_window ), "event_after", // G_CALLBACK( simo_combo_box_button_after ), combo_box ); #if GTK_MINOR_VERSION < 18 alloc = widget->allocation; #else gtk_widget_get_allocation(widget, &alloc); #endif // begin determining the window position gdk_window_get_origin( gtk_widget_get_window(widget), &bx, &by ); bx += alloc.x; by += alloc.y + alloc.height; screen_height = gdk_screen_height() - by; screen_width = gdk_screen_width(); #if GTK_MINOR_VERSION < 18 alloc = mthis->popup_window->allocation; #else gtk_widget_get_allocation(mthis->popup_window, &alloc); height = alloc.height; width = alloc.width; #endif #if GTK_MINOR_VERSION < 18 alloc = widget->allocation; #else gtk_widget_get_allocation(widget, &alloc); #endif gtk_window_move( GTK_WINDOW( mthis->popup_window ), -500, -500 ); gtk_widget_set_size_request( mthis->popup_window, alloc.width, 20 ); gtk_window_resize( GTK_WINDOW( mthis->popup_window ), 500, 500 ); gtk_widget_show( mthis->popup_window ); // begin determining the window dimensions // column = gtk_tree_view_get_column( combo_box->treeview, 0 ); simo_combo_box_compute_tree_size( combo_box, &cell_width, &cell_height, &count ); gtk_widget_hide( mthis->popup_window ); // g_print( "max width: %d max height: %d\n", cell_width, cell_height ); // we pad by 1/2 a cell height to avoid showing scrollbars when they're not needed tree_req_height = (count * cell_height) + (cell_height / 2); if( count > 0 && tree_req_height > 0 && tree_req_height < (gint)combo_box->max_popup_height ){ // gtk_widget_set_size_request( mthis->popup_window, cell_width, tree_req_height ); // gtk_window_resize( GTK_WINDOW( mthis->popup_window ), cell_width, tree_req_height ); // check if the scroll bars are visible tree_req_height += 15;//bar_height; cell_width += 15;//bar_width; /* if( GTK_SCROLLED_WINDOW( mthis->popup_scroll )->hscrollbar_visible || mthis->scrolls_visible ){ tree_req_height += 15;//bar_height; mthis->scrolls_visible = TRUE; } else{ mthis->scrolls_visible = FALSE; } if( GTK_SCROLLED_WINDOW( mthis->popup_scroll )->vscrollbar_visible || mthis->scrolls_visible ){ cell_width += 15;//bar_width; mthis->scrolls_visible = TRUE; } else{ mthis->scrolls_visible = FALSE; }*/ height = tree_req_height; } else if( count > 0 && tree_req_height > 0 ){ height = combo_box->max_popup_height; } else{ height = 20; } // TODO: we need to have a horizontal scroll bar apppear when the width exceeds our max width /* if( cell_width > widget->allocation.width + combo_box->max_popup_width ){ width = widget->allocation.width + combo_box->max_popup_width; } else*/ width = alloc.width; /* Never wider than the widget */ /* Always show popup below widget */ if( height > screen_height ){ height = screen_height - 15; } // g_print( "width: %d, height: %d\n", width, height ); gtk_widget_set_size_request( mthis->popup_window, width, height ); gtk_window_resize( GTK_WINDOW( mthis->popup_window ), width, height ); // end determining the window dimensions // do edge detection to ensure window is not clipped by the edge of the screen // ensure things are not hanging over the left edge if( bx < 0 ){ bx = 0; } // ensure things are not hanging over the right edge if( ( bx + width ) > screen_width ){ bx -= bx+width - screen_width; } gtk_window_move( GTK_WINDOW( mthis->popup_window ), bx, by ); gtk_widget_show_all( mthis->popup_window ); // gtk_widget_set_sensitive( combo_box->button, 0 ); // gtk_widget_set_sensitive( mthis->label_button, 0 ); g_signal_handler_block( G_OBJECT( combo_box->button ), combo_box->priv->arrow_sig ); g_signal_handler_block( G_OBJECT( combo_box->priv->label_button ), combo_box->priv->bl_sig ); //gtk_widget_grab_default( GTK_WIDGET( combo_box ) ); //grab_on_window( mthis->popup_window->window, gtk_get_current_event_time() ); // grab_on_window( GTK_WIDGET(combo_box->treeview)->window, gtk_get_current_event_time() ); #if GTK_MINOR_VERSION < 18 if (!GTK_WIDGET_HAS_FOCUS(combo_box->treeview)) { GTK_WIDGET_SET_FLAGS(combo_box->treeview, GTK_CAN_DEFAULT); gdk_keyboard_grab(gtk_widget_get_window(mthis->popup_window), FALSE, GDK_CURRENT_TIME); gtk_widget_grab_focus(GTK_WIDGET(combo_box->treeview)); } #else if (!gtk_widget_has_focus(GTK_WIDGET(combo_box->treeview))) { gtk_widget_set_can_default(GTK_WIDGET(combo_box->treeview), TRUE); gdk_keyboard_grab(gtk_widget_get_window(mthis->popup_window), FALSE, GDK_CURRENT_TIME); gtk_widget_grab_focus(GTK_WIDGET(combo_box->treeview)); } #endif gtk_grab_add( mthis->popup_window ); gdk_pointer_grab( gtk_widget_get_window(mthis->popup_window), TRUE, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK, NULL, NULL, GDK_CURRENT_TIME ); // gtk_grab_add( combo_box->treeview ); // gtk_widget_grab_focus( mthis->parent ); // GTK_WIDGET_SET_FLAGS (combo_box->treeview, GTK_CAN_DEFAULT); // gtk_widget_grab_default( GTK_WIDGET( combo_box->treeview ) ); //gtk_button_released( GTK_BUTTON( combo_box->button ) ); //gtk_button_leave( GTK_BUTTON( combo_box->button ) ); #ifdef G_OS_WIN32 // workaround for bug: 152566 & 144269 //gtk_window_present( GTK_WINDOW( mthis->popup_window ) ); /*{// special case code to get focus on the combobox window HWND hwnd = (HWND)GDK_WINDOW_HWND( GTK_WIDGET( combo_box->treeview )->window ); SetFocus( hwnd ); SendMessage( tophwnd, WM_PARENTNOTIFY, (WPARAM)WM_LBUTTONDOWN, MAKELPARAM( pt.x, pt.y ) ); SendMessage( tophwnd, WM_MOUSEACTIVATE, (WPARAM)focus_handler->moz_hwnd, 1 ) }*/ //BringWindowToTop( (HWND)GDK_WINDOW_HWND( mthis->popup_window->window ) ); #endif #if defined(GDK_WINDOWING_X11) && defined(USE_SHADOWS) drop_shadow_attach( mthis->ds, mthis->popup_window, bx, by ); #endif // set toggle state on buttons gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( mthis->label_button ), TRUE ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( combo_box->button ), TRUE ); // } static gchar *get_gvalue_as_string( GValue *value ) { GType type = G_VALUE_TYPE( value ); switch( type ){ case G_TYPE_BOOLEAN: return g_strdup_printf( "%d", (int)g_value_get_boolean( value ) ); break; case G_TYPE_INT: return g_strdup_printf( "%d", g_value_get_int( value ) ); break; case G_TYPE_FLOAT: return g_strdup_printf( "%f", g_value_get_float( value ) ); break; case G_TYPE_DOUBLE: return g_strdup_printf( "%f", g_value_get_double( value ) ); break; case G_TYPE_STRING: return g_value_dup_string( value ); break; default: break; } return NULL; } static gboolean simo_combo_box_treeview_press_event( GtkWidget *widget, GdkEventButton *event, SimoComboBox *combo_box ) { //SIMO_COMBO_BOX( widget )->priv->button_press_x = event->x; //SIMO_COMBO_BOX( widget )->priv->button_press_y = event->y; return FALSE; } static gboolean simo_combo_box_treeview_release_event( GtkWidget *widget, GdkEventButton *event, SimoComboBox *combo_box ) { GtkTreePath *path; GtkTreeViewColumn *col; GtkAllocation alloc; #if GTK_MINOR_VERSION < 18 alloc = widget->allocation; #else gtk_widget_get_allocation(widget, &alloc); #endif if( (event->x > alloc.x) && (event->x < (alloc.x + alloc.width)) && (event->y > alloc.y) && (event->y < (alloc.y + alloc.height)) ){ if( gtk_tree_view_get_path_at_pos( combo_box->treeview, (gint)event->x, (gint)event->y, &path, &col, NULL, NULL ) ){ GtkTreeIter iter; if( gtk_tree_model_get_iter( combo_box->model, &iter, path ) ){ if( simo_combo_box_is_seperator_row( combo_box, &iter ) ) return FALSE; gtk_tree_view_row_activated( combo_box->treeview, path, col ); g_signal_emit( combo_box, combo_box_signals[CLICKED], 0 ); } } } return FALSE; } static gboolean simo_combo_box_treeview_motion_event( GtkWidget *widget, GdkEventMotion *event, SimoComboBox *combo ) { GtkTreePath *path; if( gtk_tree_view_get_path_at_pos( combo->treeview, (gint)event->x, (gint)event->y, &path, NULL, NULL, NULL ) ){ GtkTreeIter iter; if( gtk_tree_model_get_iter( combo->model, &iter, path ) ){ GtkTreeSelection *selection; selection = gtk_tree_view_get_selection( combo->treeview ); gtk_tree_selection_select_iter( selection, &iter ); } gtk_tree_path_free( path ); } return FALSE; } static void simo_combo_box_row_activated( GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, SimoComboBox *combo ) { GtkTreeIter iter; // g_print( "row activated\n" ); if( gtk_tree_model_get_iter( combo->model, &iter, path ) ){ if( simo_combo_box_is_seperator_row( combo, &iter ) ) return; simo_combo_box_set_active_iter( combo, &iter ); simo_combo_box_popup_close( combo ); } } gboolean simo_combo_box_get_active_iter( SimoComboBox *combo_box, GtkTreeIter *iter ) { if( combo_box->priv->current_path ) return gtk_tree_model_get_iter( combo_box->model, iter, combo_box->priv->current_path ); else return FALSE; } void simo_combo_box_set_active_iter( SimoComboBox *combo_box, GtkTreeIter *iter ) { SimoComboBoxPrivate *mthis = combo_box->priv; GValue value = {0}; gchar *text = 0; if( mthis->current_path ) gtk_tree_path_free( mthis->current_path ); mthis->current_path = gtk_tree_model_get_path( combo_box->model, iter ); if( mthis->current_path ) gtk_tree_model_get_value( combo_box->model, iter, combo_box->visible_column, &value ); if( G_IS_VALUE( &value ) ) text = get_gvalue_as_string( &value ); if( text ){ gtk_entry_set_text( GTK_ENTRY( combo_box->entry ), text ); gtk_label_set_text( GTK_LABEL( combo_box->label ), text ); // TODO: elipsize text here when it does not fit in the button //gtk_button_set_label( GTK_BUTTON( combo_box->label ), text ); g_free( text ); } else{ gtk_entry_set_text( GTK_ENTRY( combo_box->entry ), "" ); gtk_label_set_text( GTK_LABEL( combo_box->label ), "" ); //gtk_button_set_label( GTK_BUTTON( combo_box->label ), "" ); } g_value_unset( &value ); } void simo_combo_box_insert_seperator( SimoComboBox *combo_box, GtkTreeIter *iter ) { gtk_tree_store_set( GTK_TREE_STORE( combo_box->model ), iter, combo_box->visible_column, combo_box_seperator, -1 ); } //EXPORT GtkWidget * create_simo_combo_box( gchar *widget_name, gchar *button_name, gchar *entry_name, gint editable, gint entry_alloc_width ) { GtkWidget *widget = simo_combo_box_new(); // g_print( "input: s1(%s), s2(%s), i1(%d), i2(%d)\n", string1, string2, int1, int2 ); // construct_simple_combo( SIMO_COMBO_BOX( widget ) ); gtk_widget_set_name( widget, widget_name ); simo_combo_box_set_editable( SIMO_COMBO_BOX( widget ), editable ); if( button_name ) gtk_widget_set_name( SIMO_COMBO_BOX( widget )->button, button_name ); // else // gtk_widget_set_name( SIMO_COMBO_BOX( widget )->button, "combo_button" ); if( entry_name ) gtk_widget_set_name( SIMO_COMBO_BOX( widget )->entry, entry_name ); // else // gtk_widget_set_name( SIMO_COMBO_BOX( widget )->button, "combo_entry" ); if( entry_alloc_width > 25 ){ // g_print( "setting fixed entry size: %d\n", entry_alloc_width ); SIMO_COMBO_BOX( widget )->priv->entry_alloc.width = entry_alloc_width; SIMO_COMBO_BOX( widget )->priv->fixed_entry_size = entry_alloc_width; } /* if( string1 && string2 ){ if( !strcmp( string1, "editable" ) ){ simo_combo_box_set_editable( SIMO_COMBO_BOX( widget ), !strcmp( string2, "TRUE" ) ); } } */ gtk_widget_show( widget ); return widget; } void simo_combo_box_set_editable( SimoComboBox *combo_box, gboolean editable_state ) { GtkWidget *widget = GTK_WIDGET( combo_box ); GtkWidget *button = combo_box->priv->label_button; // g_print( "ENTER: simo_combo_box_set_editable\n" ); combo_box->editable = editable_state; // gtk_editable_set_editable( GTK_EDITABLE( combo_box->entry ), editable_state ); // gtk_widget_set_sensitive( combo_box->entry, editable_state ); // g_object_set( G_OBJECT( combo_box->entry ), "can-focus", editable_state, NULL ); if( editable_state ){ if( widget == gtk_widget_get_parent(button) ){ const gchar *text = gtk_label_get_text( GTK_LABEL( combo_box->label ) ); g_object_ref( G_OBJECT( button ) ); gtk_container_remove( GTK_CONTAINER( combo_box ), button ); gtk_box_pack_start( GTK_BOX( combo_box ), combo_box->entry, TRUE, TRUE, 0 ); g_object_unref( G_OBJECT( combo_box->entry ) ); gtk_widget_hide( button ); gtk_widget_show( combo_box->entry ); if( text ){ gtk_entry_set_text( GTK_ENTRY( combo_box->entry ), text ); } //gtk_widget_set_size_request( GTK_WIDGET( combo_box->button ), 22, 22 ); } } else if( widget == gtk_widget_get_parent(combo_box->entry) ){ const gchar *text = gtk_entry_get_text( GTK_ENTRY( combo_box->entry ) ); // save the entry allocation //memcpy( &(combo_box->priv->entry_alloc), &(combo_box->entry->allocation), sizeof( GtkAllocation ) ); g_object_ref( G_OBJECT( combo_box->entry ) ); gtk_container_remove( GTK_CONTAINER( combo_box ), combo_box->entry ); // gtk_box_pack_start( GTK_BOX( combo_box ), button, TRUE, TRUE, 0 ); g_object_unref( G_OBJECT( button ) ); //gtk_widget_size_allocate( button, &combo_box->entry->allocation ); gtk_widget_hide( combo_box->entry ); gtk_widget_show( button ); if( text ){ gtk_label_set_text( GTK_LABEL( combo_box->label ), text ); } } // g_print( "LEAVE: simo_combo_box_set_editable\n" ); } gboolean simo_combo_box_get_editable( SimoComboBox *combo_box ) { return combo_box->editable;//gtk_editable_get_editable( GTK_EDITABLE( combo_box->entry ) ); } /* Text access functions */ const gchar * simo_combo_box_get_text(SimoComboBox *combo_box) { if (combo_box->priv->n_lines > 1) { GtkTextIter start; GtkTextIter end; g_free(combo_box->priv->ml_text); gtk_text_buffer_get_bounds(combo_box->txtbuffer, &start, &end); combo_box->priv->ml_text = gtk_text_buffer_get_text(combo_box->txtbuffer, &start, &end, FALSE); return combo_box->priv->ml_text; } else { return gtk_entry_get_text(GTK_ENTRY(combo_box->entry)); } } void simo_combo_box_set_text(SimoComboBox *combo_box, const gchar *text) { if (combo_box->priv->n_lines > 1) { gtk_text_buffer_set_text(combo_box->txtbuffer, text, -1); } else { gtk_entry_set_text(GTK_ENTRY(combo_box->entry), text); } } void simo_combo_box_set_visibility(SimoComboBox *combo_box, gboolean visible) { gtk_entry_set_visibility(GTK_ENTRY(combo_box->entry), visible); } void simo_combo_box_clear_text(SimoComboBox *combo_box) { simo_combo_box_set_text(combo_box, ""); } void simo_combo_box_set_position(SimoComboBox *combo_box, gint position) { if (combo_box->priv->n_lines > 1) { GtkTextIter iter; gtk_text_buffer_get_iter_at_offset(combo_box->txtbuffer, &iter, position); gtk_text_buffer_place_cursor(combo_box->txtbuffer, &iter); } else { gtk_editable_set_position(GTK_EDITABLE(combo_box->entry), position); } } gboolean simo_combo_box_get_selection_bounds(SimoComboBox *combo_box, gint *start, gint *end) { if (combo_box->priv->n_lines > 1) { GtkTextIter start_iter; GtkTextIter end_iter; gboolean retval; retval = gtk_text_buffer_get_selection_bounds(combo_box->txtbuffer, &start_iter, &end_iter); if (start) { *start = gtk_text_iter_get_offset(&start_iter); } if (end) { *end = gtk_text_iter_get_offset(&end_iter); } return retval; } else { return gtk_editable_get_selection_bounds(GTK_EDITABLE(combo_box->entry), start, end); } } void simo_combo_box_select_region(SimoComboBox *combo_box, gint start, gint end) { if (combo_box->priv->n_lines > 1) { GtkTextIter start_iter; GtkTextIter end_iter; gtk_text_buffer_get_iter_at_offset(combo_box->txtbuffer, &start_iter, start); gtk_text_buffer_get_iter_at_offset(combo_box->txtbuffer, &end_iter, end); gtk_text_buffer_select_range(combo_box->txtbuffer, &start_iter, &end_iter); } else { gtk_editable_select_region(GTK_EDITABLE(combo_box->entry), start, end); } } void simo_combo_box_delete_selection(SimoComboBox *combo_box) { if (combo_box->priv->n_lines > 1) { gtk_text_buffer_delete_selection(combo_box->txtbuffer, FALSE, TRUE); } else { gtk_editable_delete_selection(GTK_EDITABLE(combo_box->entry)); } } void simo_combo_box_cut_clipboard(SimoComboBox *combo_box) { if (combo_box->priv->n_lines > 1) { GdkDisplay *display; GtkClipboard *clipboard; display = gtk_widget_get_display(GTK_WIDGET(combo_box)); clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD); gtk_text_buffer_cut_clipboard(combo_box->txtbuffer, clipboard, TRUE); } else { gtk_editable_cut_clipboard(GTK_EDITABLE(combo_box->entry)); } } void simo_combo_box_copy_clipboard(SimoComboBox *combo_box) { if (combo_box->priv->n_lines > 1) { GdkDisplay *display; GtkClipboard *clipboard; display = gtk_widget_get_display(GTK_WIDGET(combo_box)); clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD); gtk_text_buffer_copy_clipboard(combo_box->txtbuffer, clipboard); } else { gtk_editable_copy_clipboard(GTK_EDITABLE(combo_box->entry)); } } void simo_combo_box_paste_clipboard(SimoComboBox *combo_box) { if (combo_box->priv->n_lines > 1) { GdkDisplay *display; GtkClipboard *clipboard; display = gtk_widget_get_display(GTK_WIDGET(combo_box)); clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD); gtk_text_buffer_paste_clipboard(combo_box->txtbuffer, clipboard, NULL, TRUE); } else { gtk_editable_paste_clipboard(GTK_EDITABLE(combo_box->entry)); } } void simo_combo_box_set_entry_font(SimoComboBox *combo_box, PangoFontDescription *fontDesc) { gtk_widget_modify_font(combo_box->entry, fontDesc); gtk_widget_modify_font(combo_box->txtview, fontDesc); combo_box->priv->cached_line_height = 0; } static void simo_combo_box_grab_focus_signal(GtkWidget *widget) { SimoComboBox *combo_box = SIMO_COMBO_BOX(widget); if (combo_box->priv->n_lines > 1) { gtk_widget_grab_focus(combo_box->txtview); } else { gtk_widget_grab_focus(combo_box->entry); } } static void simo_combo_box_text_changed_cb(GtkEditable *editable, gpointer data) { g_signal_emit(SIMO_COMBO_BOX(data), combo_box_signals[CHANGED], 0); } static void simo_combo_box_entry_activate_cb(GtkEditable *editable, gpointer data) { g_signal_emit(SIMO_COMBO_BOX(data), combo_box_signals[ACTIVATE], 0); } static gboolean simo_combo_box_txtview_keypress_cb(GtkWidget *widget, GdkEventKey *evt, gpointer data) { if ((evt->keyval == GDK_Return || evt->keyval == GDK_KP_Enter) && !(evt->state & GDK_MOD1_MASK) && !(evt->state & GDK_SHIFT_MASK) && !(evt->state & GDK_CONTROL_MASK)) { g_signal_emit(SIMO_COMBO_BOX(data), combo_box_signals[ACTIVATE], 0); return TRUE; } return FALSE; } static gboolean simo_combo_box_arrow_up_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) { SimoComboBox *combo_box = (SimoComboBox *) data; if (event->button != 1) { return FALSE; } if (combo_box->priv->n_lines == combo_box->priv->max_lines) { return TRUE; } simo_combo_box_set_n_lines(combo_box, combo_box->priv->n_lines + 1); if (combo_box->priv->n_lines == 2) { gtk_widget_grab_focus(combo_box->txtview); } return TRUE; } static gboolean simo_combo_box_arrow_down_cb(GtkWidget *widget, GdkEventButton *event, gpointer data) { SimoComboBox *combo_box = (SimoComboBox *) data; if (event->button != 1) { return FALSE; } if (combo_box->priv->n_lines == 1) { return TRUE; } simo_combo_box_set_n_lines(combo_box, combo_box->priv->n_lines - 1); if (combo_box->priv->n_lines == 1) { gtk_widget_grab_focus(combo_box->entry); } return TRUE; } /* Multi-line support */ gint simo_combo_box_get_n_lines(SimoComboBox *combo_box) { return combo_box->priv->n_lines; } void simo_combo_box_set_n_lines(SimoComboBox *combo_box, gint n_lines) { gint start; gint end; GtkTextIter start_iter; GtkTextIter end_iter; if (n_lines == combo_box->priv->n_lines || n_lines <= 0) { return; } if (combo_box->priv->n_lines == 1 || (combo_box->priv->n_lines == 2 && n_lines == 1)) { if (n_lines > 1) { g_object_set(G_OBJECT(combo_box->entry), "no-show-all", TRUE, NULL); g_object_set(G_OBJECT(combo_box->priv->scrolled_window), "no-show-all", FALSE, NULL); gtk_widget_hide(combo_box->entry); gtk_widget_show_all(combo_box->priv->scrolled_window); /* Copy text and selected part */ g_signal_handler_block(G_OBJECT(combo_box->entry), combo_box->priv->single_changed_id); gtk_text_buffer_set_text(combo_box->txtbuffer, gtk_entry_get_text(GTK_ENTRY(combo_box->entry)), -1); gtk_editable_get_selection_bounds(GTK_EDITABLE(combo_box->entry), &start, &end); gtk_text_buffer_get_iter_at_offset(combo_box->txtbuffer, &start_iter, start); gtk_text_buffer_get_iter_at_offset(combo_box->txtbuffer, &end_iter, end); gtk_text_buffer_select_range(combo_box->txtbuffer, &start_iter, &end_iter); g_signal_handler_unblock(G_OBJECT(combo_box->entry), combo_box->priv->single_changed_id); } else { gchar *text; g_object_set(G_OBJECT(combo_box->entry), "no-show-all", FALSE, NULL); g_object_set(G_OBJECT(combo_box->priv->scrolled_window), "no-show-all", TRUE, NULL); gtk_widget_hide(combo_box->priv->scrolled_window); gtk_widget_show(combo_box->entry); /* Copy text and selected part */ g_signal_handler_block(G_OBJECT(combo_box->txtbuffer), combo_box->priv->multi_changed_id); gtk_text_buffer_get_bounds(combo_box->txtbuffer, &start_iter, &end_iter); text = gtk_text_buffer_get_text(combo_box->txtbuffer, &start_iter, &end_iter, FALSE); gtk_entry_set_text(GTK_ENTRY(combo_box->entry), text); g_free(text); gtk_text_buffer_get_selection_bounds(combo_box->txtbuffer, &start_iter, &end_iter); start = gtk_text_iter_get_offset(&start_iter); end = gtk_text_iter_get_offset(&end_iter); gtk_editable_select_region(GTK_EDITABLE(combo_box->entry), start, end); g_signal_handler_unblock(G_OBJECT(combo_box->txtbuffer), combo_box->priv->multi_changed_id); } } combo_box->priv->n_lines = n_lines; gtk_widget_queue_resize(GTK_WIDGET(combo_box)); g_signal_emit(combo_box, combo_box_signals[SIZE_CHANGED], 0); } /* Spell checking */ gboolean simo_combo_box_set_spell(SimoComboBox *combo, gboolean use_spell, gchar *language, GError **error) { #ifdef HAVE_GTKSPELL if (combo->priv->gtkspell) { /* We already have one */ if (!use_spell) { gtkspell_detach(combo->priv->gtkspell); combo->priv->gtkspell = NULL; return TRUE; } else { return gtkspell_set_language(combo->priv->gtkspell, language, error); } } else { /* We don't have one */ if (use_spell) { combo->priv->gtkspell = gtkspell_new_attach(GTK_TEXT_VIEW(combo->txtview), language, error); if (!combo->priv->gtkspell) { return FALSE; } return TRUE; } else { return TRUE; } } #else /* ! defined HAVE_GTKSPELL */ return FALSE; #endif } kildclient-2.11.1/src/dlgTestTriggers.ui0000644000175000017500000002572411405233202015104 00000000000000 True Test Triggers dialog True vertical True 8 vertical 6 True 0 Enter _line to be matched against the triggers: True False False 0 True 4 True True The text entered here will be matched against triggers as if it were a line coming from the MUD 70 0 _Send True True True True Click the run the triggers against the line. True False False 1 False False 1 True False 4 2 True 4 True Number of triggers that matched: False False 0 True False False 1 False False 3 True 0 Commands that would be sent: False False 4 True True automatic automatic in True True False False 5 True 0 This is what would be printed in the main screen: False False 6 True True This is what would be printed in the main screen. If empty, the line has been gaged. It can be different from the original line because of rewriter triggers. False False False 7 True 4 True Would this line be included in the log file? False False 0 True False False 1 False 8 2 True end gtk-close True True True True True False False 0 False end 0 btnTTClose kildclient-2.11.1/src/dlgPreferences.glade0000644000175000017500000013667311407661330015375 00000000000000 Preferences dialog True vertical True 12 12 vertical 18 True vertical 6 True 0 0 <b>Colors used by KildClient</b> True False False 0 True True False False 0 True vertical 6 True 0 _Informative messages: True False False 0 True Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) 1 True 0 _Command echo: True False False 2 True Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) 3 1 1 False False 0 True vertical 6 True 0 0 <b>Window configuration</b> True False False 0 True True False False 0 True vertical 6 True 0 _Tab position: True False False 0 True Left Right Top Bottom False False 1 _Hide tabs if only one world is open True True False True If this is checked, when there is only one open world no tabs will be shown True True 2 _Flash window when new text is received True True False True True False False 3 1 False False 1 False False 1 True Appearance False tab 12 vertical 18 True vertical 6 True 0 0 <b>Sending Delays</b> True False False 0 True True False False 0 8 vertical 8 True 0 Enter the default parameters for sending multiple lines or commands: False False 0 True 4 True _Number of lines/commands to send at once: True spnGroupSize False False 0 True True 1 0 100000 1 10 0 1 1 False False 1 True 4 True _Delay between each group of lines/commands: True spnPrefsDelay False False 0 True True 0 0 100 0.10000000149 1 0 0.10000000149 1 1 False False 2 1 1 False False 0 1 True Sending 1 False tab 12 vertical 18 True vertical 6 True 0 0 <b>Web Browser</b> True False False 0 True True False False 0 True vertical 6 True True True Specify the command used to launch a web browser True False False 0 True 0 Enter the command to run a web browser. %s will be substituted by the web page address. True False False 1 1 1 False False 0 True vertical 6 True 0 0 <b>Audio Player</b> True False False 0 True True False False 0 True vertical 6 True True True Specify the command used to play sound files. True False False 0 True 0 Enter the command to run an audio player program. %s will be substituted by the file path. True False False 1 1 1 1 2 True External Programs 2 False tab True 12 vertical 18 True vertical 6 True 0 0 <b>Proxy</b> True False False 0 True True False False 0 True vertical 12 True 4 True Proxy _type: True False False 0 True Use global settings No proxy SOCKS4 SOCKS5 False 1 False 0 True 2 4 4 4 True True False 3 4 1 2 True True 3 4 True True 1 2 1 2 True True 1 2 True 1 Pass_word: True 2 3 1 2 GTK_FILL GTK_FILL True 1 Server _port: True 2 3 GTK_FILL GTK_FILL True 1 _Username: True 1 2 GTK_FILL GTK_FILL True 1 Server _address: True GTK_FILL GTK_FILL False False 1 1 1 0 3 True Proxy 3 False tab 2 True end gtk-close -7 True True True True True True False False 0 False end 0 kildclient-2.11.1/src/dlgTestTriggers.glade0000644000175000017500000002564311405233112015543 00000000000000 True Test Triggers dialog True vertical True 8 vertical 6 True 0 Enter _line to be matched against the triggers: True False False 0 True 4 True True The text entered here will be matched against triggers as if it were a line coming from the MUD 70 0 _Send True True True True Click the run the triggers against the line. True False False 1 False False 1 True False 4 2 True 4 True Number of triggers that matched: False False 0 True False False 1 False False 3 True 0 Commands that would be sent: False False 4 True True automatic automatic in True True False False 5 True 0 This is what would be printed in the main screen: False False 6 True True This is what would be printed in the main screen. If empty, the line has been gaged. It can be different from the original line because of rewriter triggers. False False False 7 True 4 True Would this line be included in the log file? False False 0 True False False 1 False 8 2 True end gtk-close -7 True True True True True False False 0 False end 0 kildclient-2.11.1/src/Makefile.am0000644000175000017500000000477311405233112013465 00000000000000# $Id: Makefile.am 1098 2009-10-31 13:03:22Z ekalin $ bin_PROGRAMS = kildclient kildclient_SOURCES = main.c \ net.c \ proxy.c \ mainwindow.c \ worldgui.c \ ansitextview.c \ worldselector.c \ worlds.c \ worldeditor.c \ we_general.c \ we_mainwindow.c \ we_colors.c \ we_statusbar.c \ we_input.c \ we_logging.c \ we_scripting.c \ we_plugins.c \ we_generic_guied.c \ we_triggers.c \ we_aliases.c \ we_macros.c \ we_timers.c \ we_hooks.c \ we_vars.c \ we_protocols.c \ we_misc.c \ we_advanced.c \ prefs.c \ parser.c \ triggers.c \ aliases.c \ macros.c \ timers.c \ permanentvariables.c \ hooks.c \ log.c \ plugins.c \ multilinesend.c \ cmdhistory.c \ sound.c \ perlscript.c \ kcwin.c \ simocombobox.c \ kcircularqueue.c \ wresources.rc noinst_HEADERS = kildclient.h \ net.h \ ansi.h \ perlscript.h \ simocombobox.h \ util_cursor.h \ kcircularqueue.h pkgdata_DATA = kildclient.ui \ wndmain.ui \ dlgSelectWorld.ui \ dlgPreferences.ui \ dlgStatistics.ui \ dlgAbout.ui \ dlgEditWorld.ui \ dlgTestTriggers.ui \ dlgMLSend.ui \ dlgCmdHistory.ui \ mnuPopupURL.ui gladefiles = kildclient.glade \ wndmain.glade \ dlgSelectWorld.glade \ dlgPreferences.glade \ dlgStatistics.glade \ dlgAbout.glade \ dlgEditWorld.glade \ dlgTestTriggers.glade \ dlgMLSend.glade \ dlgCmdHistory.glade \ mnuPopupURL.glade EXTRA_DIST = $(pkgdata_DATA) $(gladefiles) pkgdocdir = $(datadir)/doc/kildclient manualdir = $(pkgdocdir)/html kildclient_LDADD = $(GTK_LIBS) $(KILDCLIENT_PERL_LIBS) $(GTKSPELL_LIBS) $(LIBGNUTLS_LIBS) $(INTLLIBS) -lz localedir = $(datadir)/locale INCLUDES = -DLOCALEDIR=\"$(localedir)\" \ -DPKGDATADIR=\"$(pkgdatadir)\" \ -DSYSDATADIR=\"$(datadir)\" \ -DMANUALDIR=\"$(manualdir)\" \ -DG_LOG_DOMAIN=\"kildclient\" \ $(GTK_CFLAGS) $(KILDCLIENT_PERL_CFLAGS) $(GTKSPELL_CFLAGS) $(LIBGNUTLS_CFLAGS) .rc.o: @RES_COMPILE@ # Temporary rule to convert Glade XML files to GtkBuilder XML files using # gtk-builder-convert while Glade saving of GtkBuilder files is deficient. %.ui: %.glade gtk-builder-convert $< $@ kildclient-2.11.1/src/we_logging.c0000644000175000017500000002301411526001511013703 00000000000000/* $Id: we_logging.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "simocombobox.h" #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ /* XML UI signals */ G_MODULE_EXPORT void we_log_start_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void we_log_stop_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void select_logfile_cb(gpointer data, GtkWidget *widget); G_MODULE_EXPORT void revert_logformat_cb(gpointer data, GtkWidget *widget); GObject * get_we_logging_tab(GtkBuilder *ui_builder, World *world) { GObject *panel; GObject *btnStart; panel = gtk_builder_get_object(ui_builder, "we_panel_logging"); if (world != default_world) { GtkWidget *image; /* FIXME: Someday it should be possible to do this directly in the XML file. */ btnStart = gtk_builder_get_object(ui_builder, "btnLogStart"); image = gtk_image_new_from_stock(GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_BUTTON); gtk_button_set_image(GTK_BUTTON(btnStart), image); } else { /* These parts make no sense for the default world, so let's hide them */ GObject *vbox_log_status; GObject *vbox_log_file; vbox_log_status = gtk_builder_get_object(ui_builder, "vbox_log_status"); vbox_log_file = gtk_builder_get_object(ui_builder, "vbox_log_file"); g_object_set(vbox_log_status, "no-show-all", TRUE, NULL); g_object_set(vbox_log_file, "no-show-all", TRUE, NULL); } return panel; } void fill_we_logging_tab(World *world, GtkBuilder *ui_builder) { GtkLabel *lblLogStatus; GtkWidget *btnLogStart; GtkWidget *btnLogStop; GObject *txtLogFile; GtkToggleButton *chkLogAuto; GtkToggleButton *chkLogAddTime; GtkEntry *txtLogTimeFormat; if (!world) { return; } if (!ui_builder) { /* Called from Perl's XS_logfile. In this case there is no ui_builder, and the World Editor might not have been created yet. */ if (!world->dlgEditWorld) { return; } ui_builder = world->ui_builder; } lblLogStatus = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblLogStatus")); btnLogStart = GTK_WIDGET(gtk_builder_get_object(ui_builder, "btnLogStart")); btnLogStop = GTK_WIDGET(gtk_builder_get_object(ui_builder, "btnLogStop")); txtLogFile = gtk_builder_get_object(ui_builder, "txtLogFile"); chkLogAuto = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkLogAuto")); chkLogAddTime = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkLogAddTime")); txtLogTimeFormat = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtLogTimeFormat")); if (world->connected) { if (world->log_file) { gchar *msg; msg = g_strdup_printf(_("Logging to file %s."), world->log_actual_file); gtk_label_set_text(lblLogStatus, msg); g_free(msg); gtk_widget_set_sensitive(btnLogStart, FALSE); gtk_widget_set_sensitive(btnLogStop, TRUE); } else { gtk_label_set_text(lblLogStatus, _("Logging is disabled.")); gtk_widget_set_sensitive(btnLogStart, TRUE); gtk_widget_set_sensitive(btnLogStop, FALSE); } } else { gtk_label_set_text(lblLogStatus, _("Not connected.")); gtk_widget_set_sensitive(btnLogStart, FALSE); gtk_widget_set_sensitive(btnLogStop, FALSE); } if (world->log_file_name) { gtk_entry_set_text(GTK_ENTRY(txtLogFile), world->log_file_name); } else { gtk_entry_set_text(GTK_ENTRY(txtLogFile), ""); } gtk_toggle_button_set_active(chkLogAuto, world->log_autostart); gtk_toggle_button_set_active(chkLogAddTime, world->log_add_time); if (world->log_timeformat) { gtk_entry_set_text(txtLogTimeFormat, world->log_timeformat); } else { gtk_entry_set_text(txtLogTimeFormat, ""); } /* Store pointer to dlgEditWorld so it can be used as a parent in the select_logfile_cb callback */ g_object_set_data(txtLogFile, "dlgEditWorld", world->dlgEditWorld); } void update_we_logging_parameters(World *world, GtkBuilder *ui_builder) { GtkEntry *txtLogFile; GtkToggleButton *chkLogAuto; GtkToggleButton *chkLogAddTime; GtkEntry *txtLogTimeFormat; const gchar *filename; const gchar *format; txtLogFile = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtLogFile")); chkLogAuto = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkLogAuto")); chkLogAddTime = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkLogAddTime")); txtLogTimeFormat = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtLogTimeFormat")); g_free(world->log_file_name); filename = gtk_entry_get_text(txtLogFile); if (filename && *filename) { world->log_file_name = g_strdup(filename); } else { world->log_file_name = NULL; } world->log_autostart = gtk_toggle_button_get_active(chkLogAuto); world->log_add_time = gtk_toggle_button_get_active(chkLogAddTime); format = gtk_entry_get_text(txtLogTimeFormat); if (!world->log_timeformat || strcmp(world->log_timeformat, format) != 0) { g_free(world->log_timeformat); world->log_timeformat = g_strdup(format); } } void we_log_start_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; gint lines = 0; gchar *errmsg = NULL; GtkToggleButton *chkLogIncludePrevious; GtkSpinButton *spnLogPreviousLines; /* Copy parameters in the World structure */ update_we_logging_parameters(world, world->ui_builder); /* Has the user asked for inclusion of lines in the window buffer? */ chkLogIncludePrevious = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "chkLogIncludePrevious")); spnLogPreviousLines = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnLogPreviousLines")); if (gtk_toggle_button_get_active(chkLogIncludePrevious)) { lines = (int) gtk_spin_button_get_value(spnLogPreviousLines); } if (start_log(world, lines, &errmsg)) { fill_we_logging_tab(world, world->ui_builder); } else { GtkWidget *msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, errmsg); gtk_window_set_title(GTK_WINDOW(msgdlg), _("Logging not started")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); g_free(errmsg); } } void we_log_stop_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; update_we_logging_parameters(world, world->ui_builder); stop_log(world); fill_we_logging_tab(world, NULL); } void select_logfile_cb(gpointer data, GtkWidget *widget) { GtkEntry *txtLogFile = GTK_ENTRY(data); GtkWindow *dlgEditWorld; GtkWidget *filedlg; const gchar *filename; dlgEditWorld = GTK_WINDOW(g_object_get_data(G_OBJECT(txtLogFile), "dlgEditWorld")); filedlg = gtk_file_chooser_dialog_new(_("Select log file"), dlgEditWorld, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_default_response(GTK_DIALOG(filedlg), GTK_RESPONSE_OK); filename = gtk_entry_get_text(txtLogFile); if (filename && *filename) { gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(filedlg), filename); } if (gtk_dialog_run(GTK_DIALOG(filedlg)) == GTK_RESPONSE_OK) { gchar *new_file; new_file = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filedlg)); gtk_entry_set_text(txtLogFile, new_file); g_free(new_file); } gtk_widget_destroy(filedlg); } void revert_logformat_cb(gpointer data, GtkWidget *widget) { GtkEntry *txtLogTimeFormat = GTK_ENTRY(data); gtk_entry_set_text(txtLogTimeFormat, DEFAULT_LOGTIME_FORMAT); } kildclient-2.11.1/src/dlgSelectWorld.ui0000644000175000017500000002624111405233201014677 00000000000000 8 Connect to True True normal False True vertical 2 _Select a saved world: True True False True True True False False 4 1 True True never automatic in 200 175 True True True False 4 2 True 8 True gtk-new True True True True 0 gtk-edit True True True True 1 gtk-delete True True True True 2 3 True 8 4 Or connect d_irectly: True True False True True True radFromList False False 4 5 True 2 2 True 1 _Host: True txtHost 4 4 True 1 _Port: True txtPort 1 2 GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 True True True 1 2 GTK_EXPAND | GTK_SHRINK | GTK_FILL GTK_EXPAND | GTK_SHRINK | GTK_FILL 4 4 True True True 1 2 1 2 4 4 4 6 True end gtk-cancel True True True True False False 0 gtk-connect True True True True True False False 1 False end 0 btnCancel btnConnect kildclient-2.11.1/src/we_input.c0000644000175000017500000003243511526001511013423 00000000000000/* $Id: we_input.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "simocombobox.h" #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ /* XML UI signals */ G_MODULE_EXPORT void multi_line_toggled_cb(GtkToggleButton *button, gpointer data); G_MODULE_EXPORT void input_size_changed_cb(GtkSpinButton *button, gpointer data); G_MODULE_EXPORT void entryfont_set_cb(GtkFontButton *font_btn, gpointer data); G_MODULE_EXPORT void flood_prevention_toggled_cb(GtkToggleButton *chkbox, gpointer data); GObject * get_we_input_tab(GtkBuilder *ui_builder) { GObject *panel; panel = gtk_builder_get_object(ui_builder, "we_panel_input"); return panel; } void fill_we_input_tab(World *world, GtkBuilder *ui_builder) { GtkToggleButton *chkRepeatCommands; GtkToggleButton *chkCmdEcho; GtkToggleButton *chkNeverHideInput; GtkToggleButton *chkStoreCommands; GtkSpinButton *spnCommandsToSave; GtkEntry *txtCommandSeparator; GObject *radSingleLine; GObject *radMultiLine; GtkSpinButton *spnNLines; GtkToggleButton *chkAutoCompletion; GtkSpinButton *spnMinPrefix; GtkToggleButton *chkSpell; GtkEntry *txtSpellLanguage; GtkFontButton *entryfont_btn; GObject *chkFloodPrevention; GtkWidget *spnMaxCommands; GtkEntry *txtPreventionCommand; if (!world) { return; } /* Get widgets */ chkRepeatCommands = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkRepeatCommands")); chkCmdEcho = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkCmdEcho")); chkNeverHideInput = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkNeverHideInput")); chkStoreCommands = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkStoreCommands")); spnCommandsToSave = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnCommandsToSave")); radSingleLine = gtk_builder_get_object(ui_builder, "radSingleLine"); radMultiLine = gtk_builder_get_object(ui_builder, "radMultiLine"); chkAutoCompletion = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkAutoCompletion")); spnMinPrefix = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnMinPrefix")); spnNLines = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnNLines")); chkSpell = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkSpell")); txtSpellLanguage = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtSpellLanguage")); txtCommandSeparator = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtCommandSeparator")); entryfont_btn = GTK_FONT_BUTTON(gtk_builder_get_object(ui_builder, "entryfont_btn")); chkFloodPrevention = gtk_builder_get_object(ui_builder, "chkFloodPrevention"); spnMaxCommands = GTK_WIDGET(gtk_builder_get_object(ui_builder, "spnMaxCommands")); txtPreventionCommand = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtPreventionCommand")); gtk_toggle_button_set_active(chkRepeatCommands, world->repeat_commands); gtk_toggle_button_set_active(chkCmdEcho, world->cmd_echo); gtk_toggle_button_set_active(chkNeverHideInput, world->never_hide_input); gtk_toggle_button_set_active(chkStoreCommands, world->store_commands); gtk_spin_button_set_value(spnCommandsToSave, world->commands_to_save); gtk_entry_set_text(txtCommandSeparator, world->command_separator); gtk_spin_button_set_value(spnNLines, world->input_n_lines_saved); set_input_line_controls(world, radSingleLine, radMultiLine, spnNLines); gtk_toggle_button_set_active(chkAutoCompletion, world->autocompletion); gtk_spin_button_set_value(spnMinPrefix, world->autocompl_minprefix); gtk_toggle_button_set_active(chkSpell, world->spell); if (world->spell_language) { gtk_entry_set_text(txtSpellLanguage, world->spell_language); } else { gtk_entry_set_text(txtSpellLanguage, ""); } gtk_font_button_set_font_name(entryfont_btn, world->entryfont); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chkFloodPrevention), world->flood_prevention); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spnMaxCommands), world->max_equal_commands); gtk_widget_set_sensitive(spnMaxCommands, world->flood_prevention); gtk_widget_set_sensitive(GTK_WIDGET(txtPreventionCommand), world->flood_prevention); if (world->flood_prevention_command) { gtk_entry_set_text(txtPreventionCommand, world->flood_prevention_command); } else { gtk_entry_set_text(txtPreventionCommand, ""); } } void update_we_input_parameters(World *world, GtkBuilder *ui_builder) { GtkToggleButton *chkRepeatCommands; GtkToggleButton *chkCmdEcho; GtkToggleButton *chkNeverHideInput; GtkToggleButton *chkFloodPrevention; GtkSpinButton *spnMaxCommands; GtkEntry *txtPreventionCommand; GtkToggleButton *chkStoreCommands; GtkSpinButton *spnCommandsToSave; GtkToggleButton *chkAutoCompletion; GtkSpinButton *spnMinPrefix; GtkToggleButton *chkSpell; GtkEntry *txtSpellLanguage; GtkEntry *txtCommandSeparator; GtkEntryCompletion *completion; const gchar *newval; /* Get widgets */ chkRepeatCommands = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkRepeatCommands")); chkCmdEcho = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkCmdEcho")); chkNeverHideInput = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkNeverHideInput")); chkStoreCommands = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkStoreCommands")); spnCommandsToSave = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnCommandsToSave")); chkAutoCompletion = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkAutoCompletion")); spnMinPrefix = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnMinPrefix")); chkSpell = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkSpell")); txtSpellLanguage = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtSpellLanguage")); txtCommandSeparator = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtCommandSeparator")); chkFloodPrevention = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkFloodPrevention")); spnMaxCommands = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnMaxCommands")); txtPreventionCommand = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtPreventionCommand")); world->repeat_commands = gtk_toggle_button_get_active(chkRepeatCommands); world->cmd_echo = gtk_toggle_button_get_active(chkCmdEcho); world->never_hide_input = gtk_toggle_button_get_active(chkNeverHideInput); if (world->gui) { simo_combo_box_set_visibility(world->gui->cmbEntry, TRUE); } world->store_commands = gtk_toggle_button_get_active(chkStoreCommands); world->commands_to_save = gtk_spin_button_get_value_as_int(spnCommandsToSave); world->autocompletion = gtk_toggle_button_get_active(chkAutoCompletion); world->autocompl_minprefix = gtk_spin_button_get_value_as_int(spnMinPrefix); if (world->gui) { completion = simo_combo_box_get_completion(world->gui->cmbEntry); if (world->autocompletion) { gtk_entry_completion_set_minimum_key_length(completion, world->autocompl_minprefix); } else { gtk_entry_completion_set_minimum_key_length(completion, 9999); } } world->spell = gtk_toggle_button_get_active(chkSpell); g_free(world->spell_language); newval = gtk_entry_get_text(txtSpellLanguage); if (strcmp(newval, "") != 0) { world->spell_language = g_strdup(newval); } else { world->spell_language = NULL; } if (world->gui) { worldgui_configure_spell(world->gui); } strcpy(world->command_separator, gtk_entry_get_text(txtCommandSeparator)); world->flood_prevention = gtk_toggle_button_get_active(chkFloodPrevention); world->max_equal_commands = gtk_spin_button_get_value_as_int(spnMaxCommands); newval = gtk_entry_get_text(txtPreventionCommand); if (!world->flood_prevention_command || strcmp(world->flood_prevention_command, newval) != 0) { g_free(world->flood_prevention_command); world->flood_prevention_command = g_strdup(newval); } } void multi_line_toggled_cb(GtkToggleButton *button, gpointer data) { World *world = (World *) data; GtkToggleButton *radSingleLine; /* Avoid infinite loop */ if (world->updating_controls) { return; } radSingleLine = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radSingleLine")); /* If there is a gui, setting the size generates a signal that is caught, and world->input_n_lines is updated in that handler. */ if (gtk_toggle_button_get_active(radSingleLine)) { if (world->gui) { simo_combo_box_set_n_lines(world->gui->cmbEntry, 1); } else { world->input_n_lines = 1; } } else { if (world->gui) { simo_combo_box_set_n_lines(world->gui->cmbEntry, world->input_n_lines_saved); } else { world->input_n_lines = world->input_n_lines_saved; } } } void input_size_changed_cb(GtkSpinButton *button, gpointer data) { World *world = (World *) data; GtkToggleButton *radMultiLine; /* Avoid infinite loop */ if (world->updating_controls) { return; } radMultiLine = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radMultiLine")); world->input_n_lines_saved = gtk_spin_button_get_value_as_int(button); if (world->input_n_lines_saved > 10) { world->input_n_lines_saved = 10; } if (world->input_n_lines_saved < 2) { world->input_n_lines_saved = 2; } if (world->gui) { simo_combo_box_set_n_lines(world->gui->cmbEntry, world->input_n_lines_saved); } else { world->input_n_lines = world->input_n_lines_saved; } gtk_toggle_button_set_active(radMultiLine, TRUE); } void entryfont_set_cb(GtkFontButton *font_btn, gpointer data) { PangoFontDescription *fontDesc; World *world = (World *) data; WorldGUI *gui = world->gui; free(world->entryfont); world->entryfont = g_strdup(gtk_font_button_get_font_name(font_btn)); if (gui) { fontDesc = pango_font_description_from_string(world->entryfont); simo_combo_box_set_entry_font(gui->cmbEntry, fontDesc); pango_font_description_free(fontDesc); } } void flood_prevention_toggled_cb(GtkToggleButton *chkbox, gpointer data) { World *world = (World *) data; GtkWidget *spnMaxCommands; GtkWidget *txtPreventionCommand; gboolean enabled; /* Get widgets */ spnMaxCommands = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "spnMaxCommands")); txtPreventionCommand = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "txtPreventionCommand")); enabled = gtk_toggle_button_get_active(chkbox); gtk_widget_set_sensitive(spnMaxCommands, enabled); gtk_widget_set_sensitive(txtPreventionCommand, enabled); } void set_input_line_controls(World *world, GObject *radSingleLine, GObject *radMultiLine, GtkSpinButton *spnNLines) { /* If the controls have not been passed as argument. */ if (!radSingleLine) { if (!world->dlgEditWorld) { return; } radSingleLine = gtk_builder_get_object(world->ui_builder, "radSingleLine"); radMultiLine = gtk_builder_get_object(world->ui_builder, "radMultiLine"); spnNLines = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnNLines")); } world->updating_controls = TRUE; if (world->input_n_lines == 1) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radSingleLine), TRUE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radMultiLine), TRUE); gtk_spin_button_set_value(spnNLines, world->input_n_lines); } world->updating_controls = FALSE; } kildclient-2.11.1/src/parser.c0000644000175000017500000001073711526001511013066 00000000000000/* $Id: parser.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include /* Perl includes */ #include #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static int find_next_command_separator(World *world, const char *cmdline); static void process_aliases(World *world, const char *cmdline, int start, int end); static void process_command(World *world, const char *cmd, int len); void parse_commands(World *world, const char *cmdline, int totallen) { int seppos; int start; int end; gboolean quit; int cmdseplen; cmdseplen = strlen(world->command_separator); start = 0; /* Skip spaces */ while (start < totallen) { if (isspace(cmdline[start])) { start++; } else { break; } } quit = FALSE; do { seppos = find_next_command_separator(world, cmdline + start); if (seppos == -1) { end = totallen; quit = TRUE; } else { seppos += start; end = seppos; while (isspace(cmdline[end-1])) --end; } process_aliases(world, cmdline, start, end); start = seppos + cmdseplen; while (isspace(cmdline[start])) ++start; } while (!quit); } static int find_next_command_separator(World *world, const char *cmdline) { int pos = 0; int len = strlen(cmdline); char quote = 0; int cmdseplen = strlen(world->command_separator); gboolean use_quotes = FALSE; if (cmdline[0] == '/' && len > 1 && cmdline[1] != '/') { use_quotes = TRUE; } while (pos < len) { if (use_quotes && (cmdline[pos] == '\"' || cmdline[pos] == '\'')) { if (quote) { if (cmdline[pos] == quote && cmdline[pos-1] != '\\') { quote = 0; } } else { if (pos == 0 || cmdline[pos-1] != '\\') { quote = cmdline[pos]; } } } else if (cmdline[pos] == world->command_separator[0]) { if (!quote && pos != (len - (cmdseplen-1)) && strncmp(cmdline + pos, world->command_separator, cmdseplen) == 0) { return pos; } } ++pos; } return -1; } static void process_aliases(World *world, const char *cmdline, int start, int end) { char cmd[MAX_BUFFER + 1]; int len = end - start; char *result; if (len >= MAX_BUFFER) { ansitextview_append_string_nl(world->gui, _("Warning: Trying to send a very long command line. Perhaps a recursive alias definition?")); process_command(world, cmdline + start, len); return; } memcpy(cmd, cmdline + start, len); cmd[len] = '\0'; result = substitute_aliases(world, cmd); if (result) { parse_commands(world, result, strlen(result)); g_free(result); } else { process_command(world, cmd, len); } } static void process_command(World *world, const char *cmd, int len) { if (*cmd != '/') { send_to_world(world, cmd, len); } else { if (*(cmd + 1) == '/') { send_to_world(world, cmd + 1, len - 1); } else { SV *commands; SV *error; PERL_SET_CONTEXT(world->perl_interpreter); commands = newSVpv(cmd + 1, len - 1); eval_sv(commands, TRUE | G_EVAL); error = get_sv("@", TRUE); if (SvTRUE(error)) { ansitextview_append_stringf(world->gui, "Perl Error: %s", SvPV_nolen(error)); } } } } kildclient-2.11.1/src/kildclient.ui0000644000175000017500000035431411405233201014110 00000000000000 1000000 1 10 1 0 1 1000000 -1 10 1 0 1 100 1 10 1 0 1 Do not change No Yes Do not change None Single Double Do not change No Yes Do not change Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) Do not change Black Red Green Yellow Blue Magenta Cyan White Default Black (bold) Red (bold) Green (bold) Yellow (bold) Blue (bold) Magenta (bold) Cyan (bold) White (bold) Default (bold) True window3 12 vertical 18 vertical 16 True 0 0 <Set by the program> False False 0 True False False 0 True vertical 33 True True automatic automatic in True True True 0 True 2 4 True gtk-add True True True False True gtk-edit True False True True False True 1 2 gtk-delete True False True True False True 1 2 1 2 gtk-go-up True False True True False True 3 4 gtk-go-down True False True True False True 3 4 1 2 True True False True 0 0 True 2 True gtk-open False False 0 True _Import True False False 1 2 3 True False True False True 0 0 True 2 True gtk-save-as False False 0 True E_xport True False False 1 2 3 1 2 False 1 1 1 0 Edit Alias True dialog True vertical True 8 7 2 4 8 True 0 _Name: True txtAliasName GTK_FILL True 0 _Pattern: True txtAliasPattern 1 2 GTK_FILL True 0 _Substitution: True txtAliasSubstitution 3 4 GTK_FILL True True Enter optionally a descriptive name for the alias True 50 1 2 True True Enter the pattern to match against typed commands True 1 2 1 2 True True Enter the substitution to be executed True 1 2 3 4 E_val substitution as Perl statement True True False Check to have the substitution be executed in a s///e construction True True 2 4 5 GTK_FILL _Enabled True True False Check to make the alias enabled; only enabled aliases are tried True True 2 5 6 GTK_FILL True 0 <b>Note:</b> True 6 7 GTK_FILL True 0 This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 1 2 6 7 GTK_FILL _Ignore case when matching True True False True True 1 2 2 3 GTK_FILL 2 True end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False end 0 cancelbutton2 okbutton3 Enter optionally a descriptive name for the trigger Edit Trigger True dialog True vertical True 8 11 2 4 8 True 0 _Name: True txtTriggerName GTK_FILL True 0 _Pattern: True txtTriggerPattern 1 2 GTK_FILL True 0 _Action: True txtTriggerAction 3 4 GTK_FILL True True True 50 1 2 True True Enter the pattern to match against received lines True 1 2 1 2 True True Enter the action that will be run when a match happens True 1 2 3 4 Omit (_gag) from output True True False Check to make the matched line not be printed in the main output window True True 2 4 5 GTK_FILL _Enabled True True False Check to make the trigger enabled; only enabled triggers are tried True True 2 9 10 GTK_FILL Omit (gag) from _log file True True False Check to make the matched line not be printed in the log file True True 2 5 6 GTK_FILL _Keep executing other triggers after this this one matches True True False Check to make this trigger not prevent further triggers from being tried, if it matches True True 2 6 7 GTK_FILL _Rewriter trigger True True False Check to make this trigger a rewriter trigger True True 2 7 8 GTK_FILL True 0 <b>Note:</b> True 10 11 GTK_FILL True 0 This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 1 2 10 11 GTK_FILL _Ignore case when matching True True False True True 1 2 2 3 GTK_FILL True 8 C_hange style True True False True True False False 0 C_onfigure... True False True False True False False 1 2 8 9 GTK_FILL 2 True end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False end 0 button1 button2 Edit Timer True dialog True vertical True 8 7 2 4 8 True 0 _Name: True txtTimerName GTK_FILL True 0 _Interval: True spnTimerInterval 1 2 GTK_FILL True True Enter optionally a descriptive name for the timer True 50 1 2 True True Enter the action to be executed whenever the timer fires True 1 2 3 4 True 0 _Action: True txtTimerAction 3 4 GTK_FILL True 0 _Repeat count: True spnTimerCount 2 3 GTK_FILL _Temporary (will be deleted automatically when its repeat count reaches 0) True True False Check to have the timer deleted after its repeat count has reached 0 True True 2 4 5 GTK_FILL _Enabled True True False Check to make the timer enabled; only enabled timers are run True True 2 5 6 GTK_FILL True 6 True True Specify the interval, in seconds, between timer activations adjustment1 1 False 0 True 0 seconds 1 1 2 1 2 GTK_FILL GTK_FILL True 6 True True Specify how many times this timer should run before being disabled or deleted adjustment2 1 False 0 True 0 (-1 to repeat indefinitely) 1 1 2 2 3 GTK_FILL GTK_FILL True 0 <b>Note:</b> True 6 7 GTK_FILL True 0 This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 1 2 6 7 GTK_FILL 2 True end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False end 0 button3 button4 Edit Macro True dialog True vertical True 8 6 2 4 8 True 0 _Name: True txtMacroName GTK_FILL True 0 _Key: True txtMacroKey 1 2 GTK_FILL True True Enter optionally a descriptive name for the macro True 50 1 2 True True Press the key that will be used to run the macro True 1 2 1 2 _Enabled True True False Check to make the macro enabled; only enabled macros are run True True 2 4 5 GTK_FILL True 0 _Action: True txtMacroAction 3 4 GTK_FILL True True Enter the action to be run when the key is pressed True 1 2 3 4 True 0 Press the key that will be used to activate the macro while the cursor is in the text box. True 1 2 2 3 GTK_FILL True 0 <b>Note:</b> True 5 6 GTK_FILL True 0 This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 1 2 5 6 GTK_FILL 2 True end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False end 0 button5 button6 Edit Hook True dialog True vertical True 8 5 2 4 8 True 0 _Action: True txtHookAction 2 3 GTK_FILL True True Enter the action to be run when the event happens True 1 2 2 3 _Enabled True True False Check to make the hook enabled; only enabled hooks are run True True 2 3 4 GTK_FILL True 0 _Name: True txtHookName 1 2 GTK_FILL True True Enter optionally a descriptive name for the hook True 50 1 2 1 2 True 0 Event: GTK_FILL True 0 <Set by the program> 1 2 GTK_FILL True 0 <b>Note:</b> True 4 5 GTK_FILL True 0 This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 1 2 4 5 GTK_FILL 2 True end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False end 0 button7 button8 Permenent variable True dialog True vertical True 8 vertical 8 True 0 _Name of variable to make permanent: True txtVarName False False 0 True True Enter the name of a scalar ($), array (@) or hash (%) variable whose contents are to be saved between sessions of the World True 50 False False 1 2 True end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False end 0 button9 button10 Edit Character Information True dialog True vertical True 8 2 2 4 8 True 1 _Name: True txtCharName GTK_FILL True True Enter the character's name for automatic login True 35 1 2 True 0 _Password: True txtCharPassword 1 2 GTK_FILL True True Enter the character's password for automatic login False True 1 2 1 2 2 True end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False end 0 button11 button12 True window2 True True True 8 7 2 8 Triggers True True False True True GTK_FILL Aliases True True False True True 1 2 GTK_FILL Macros True True False True True 2 3 GTK_FILL Timers True True False True True 3 4 GTK_FILL Permanent Variables True True False True True 4 5 GTK_FILL OnConnect Hooks True True False True True 1 2 GTK_FILL OnDisconnect Hooks True True False True True 1 2 1 2 GTK_FILL OnReceivedText Hooks True True False True True 1 2 2 3 GTK_FILL OnSentCommand Hooks True True False True True 1 2 3 4 GTK_FILL OnGetFocus Hooks True True False True True 1 2 4 5 GTK_FILL OnLoseFocus Hooks True True False True True 1 2 5 6 GTK_FILL OnCloseConnected Hooks True True False True True 1 2 6 7 GTK_FILL True _Items to export True Enter optionally a descriptive name for the trigger Change Style True dialog True vertical True 8 6 2 8 8 True 0 _Background: True 2 3 GTK_FILL True 0 _Italic: True 3 4 GTK_FILL True model1 0 1 2 3 4 GTK_FILL True 0 _Underline: True 5 6 GTK_FILL True model2 0 1 2 5 6 GTK_FILL GTK_FILL True model3 0 1 2 4 5 GTK_FILL True 0 _Striked-thru: True 4 5 GTK_FILL True 0 _Foreground: True 1 2 GTK_FILL True 0 _Apply to: True GTK_FILL True vertical The whole line True True False True True False False 0 The whole matched text True True False True True radTargetLine False False 1 True 4 The matched substring number True True False True True radTargetLine False False 0 True True adjustment3 1 1 False False 2 1 2 GTK_FILL GTK_FILL True model4 0 1 2 1 2 True model5 0 1 2 2 3 False 2 True end gtk-cancel True True True False True False False 0 gtk-ok True True True False True False False 1 False end 0 button13 button14 kildclient-2.11.1/src/dlgStatistics.ui0000644000175000017500000010405611405233201014603 00000000000000 True Statistics dialog True vertical True 8 27 2 4 4 True 0 N/A 1 2 7 8 GTK_FILL True 0 N/A 1 2 6 7 GTK_FILL True 1 Proxy port: 7 8 GTK_FILL True 1 Proxy host: 6 7 GTK_FILL True 0 None 1 2 5 6 GTK_FILL True 1 Proxy type: 5 6 GTK_FILL True 1 World name: GTK_FILL True 1 Host: 1 2 GTK_FILL True 1 Port: 2 3 GTK_FILL True 1 Connection time: 3 4 GTK_FILL True 1 Idle time: 4 5 GTK_FILL True 2 8 9 GTK_FILL GTK_FILL True 1 Compression used: 9 10 GTK_FILL True 1 Bytes received (compressed): 10 11 GTK_FILL True 0 N/A 1 2 10 11 GTK_FILL True 1 Bytes received (decompressed): 11 12 GTK_FILL True 1 Compression ratio: 12 13 GTK_FILL True 1 Lines received: 13 14 GTK_FILL True 0 1 2 11 12 GTK_FILL True 0 1 2 GTK_FILL True 0 1 2 1 2 GTK_FILL True 0 1 2 2 3 GTK_FILL True 0 1 2 3 4 GTK_FILL True 0 1 2 4 5 GTK_FILL True 0 None 1 2 9 10 GTK_FILL True 0 N/A 1 2 12 13 GTK_FILL True 0 1 2 13 14 GTK_FILL True 2 14 15 GTK_FILL GTK_FILL True 1 Key exchange: 18 19 GTK_FILL True 1 SSL protocol used: 15 16 GTK_FILL True 1 Compression algorithm: 19 20 GTK_FILL True 1 Certificate type: 20 21 GTK_FILL True 1 Cipher: 16 17 GTK_FILL True 1 MAC: 17 18 GTK_FILL True 0 SSL not supported in this version 1 2 15 16 GTK_FILL True 0 N/A 1 2 16 17 GTK_FILL True 0 N/A 1 2 17 18 GTK_FILL True 0 N/A 1 2 18 19 GTK_FILL True 0 N/A 1 2 19 20 GTK_FILL True 0 N/A 1 2 20 21 GTK_FILL True 1 Hostname: 21 22 GTK_FILL True 0 N/A 1 2 21 22 GTK_FILL True 1 Valid since: 22 23 GTK_FILL True 1 Expiration: 23 24 GTK_FILL True 0 N/A 1 2 22 23 GTK_FILL True 0 N/A 1 2 23 24 GTK_FILL True 1 Fingerprint: 24 25 GTK_FILL True 0 N/A 1 2 24 25 GTK_FILL True 1 Subject's DN: 25 26 GTK_FILL True 1 Issuer's DN: 26 27 GTK_FILL True 0 N/A 1 2 25 26 GTK_FILL True 0 N/A 1 2 26 27 GTK_FILL 2 True end gtk-ok True True True True True False False 0 False end 0 okbutton5 kildclient-2.11.1/src/main.c0000644000175000017500000002421011526001511012505 00000000000000/* $Id: main.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #ifdef HAVE_LIBGNUTLS # include #endif #if defined __CYGWIN32__ # include # include # include #elif defined __WIN32__ # include # include #endif #ifdef __MINGW32__ # include #endif #include "kildclient.h" #include "perlscript.h" /******************** * Global variables * ********************/ FILE *dumpFile = NULL; FILE *rdumpFile = NULL; /************************* * File global variables * *************************/ #ifdef HAVE_LIBGNUTLS gnutls_certificate_credentials tls_certif_cred; #endif /************************ * Command-line options * ************************/ static gboolean wants_version = FALSE; static gchar *dumpfile = NULL; static gchar *rdumpfile = NULL; static gchar *kc_user_dir = NULL; static GOptionEntry options[] = { { "version", 0, 0, G_OPTION_ARG_NONE, &wants_version, N_("Outputs version information and exits"), NULL }, { "config", 'c', 0, G_OPTION_ARG_FILENAME, &kc_user_dir, N_("Directory to store settings and saved worlds"), N_("DIR") }, { "dump", 0, 0, G_OPTION_ARG_FILENAME, &dumpfile, N_("Dumps all data received from (after decompression, if " "appropriate) to the file"), N_("FILE") }, { "rawdump", 0, 0, G_OPTION_ARG_FILENAME, &rdumpfile, N_("Dumps all data received (possibly compressed) to the file"), N_("FILE") }, { NULL }, }; int main(int argc, char *argv[], char *env[]) { int x = -1, y, width, height; WorldGUI *gui; GOptionContext *opt_context; GError *error = NULL; int argpos = 1; gboolean opened_one = FALSE; #ifdef __MINGW32__ WORD wWSAVersion; WSADATA wsaData; #endif /* Internationalization initialization */ #if defined __CYGWIN32__ /* cygwin bindtextdomain requires a POSIX path */ char posixpath[MAX_PATH]; cygwin_conv_to_posix_path(get_kildclient_installed_file("locale"), posixpath); bindtextdomain(GETTEXT_PACKAGE, posixpath); #elif defined __WIN32__ /* Other windows, specifically MINGW32 */ bindtextdomain(GETTEXT_PACKAGE, get_kildclient_installed_file("locale")); #else bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR); #endif bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); /* Parse command-line options */ opt_context = g_option_context_new(N_("[WORLD...]")); g_option_context_add_main_entries(opt_context, options, GETTEXT_PACKAGE); g_option_context_add_group(opt_context, gtk_get_option_group(TRUE)); g_option_context_parse(opt_context, &argc, &argv, &error); g_option_context_free(opt_context); if (wants_version) { printf(PACKAGE_NAME " " PACKAGE_VERSION "\n"); printf(_("Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n")); exit(0); } if (dumpfile) { if (!(dumpFile = fopen(dumpfile, "w"))) { fprintf(stderr, _("Could not open dump file %s: %s\n"), dumpfile, g_strerror(errno)); } g_free(dumpfile); } if (rdumpfile) { if (!(rdumpFile = fopen(rdumpfile, "w"))) { fprintf(stderr, _("Could not open raw dump file %s: %s\n"), rdumpfile, g_strerror(errno)); } g_free(rdumpfile); } #ifdef __MINGW32__ /* Initialise WinSock library (mingw32) */ wWSAVersion = MAKEWORD(2, 2); if (WSAStartup(wWSAVersion, &wsaData) != 0) { /* FIXME: Inform why */ printf("Could not initialize windows sockets.\n"); exit(1); } #endif gtk_init(&argc, &argv); gtk_rc_parse_string("gtk-entry-select-on-focus=0"); if (!g_thread_supported()) { g_thread_init(NULL); } read_global_preferences(&x, &y, &width, &height); gui = world_gui_new(TRUE); wndMain = create_main_window(gui); if (x != -1) { gtk_window_move(GTK_WINDOW(wndMain), x, y); gtk_window_resize(GTK_WINDOW(wndMain), width, height); } else { /* Since world_gui_size_textview() sets the minimum size, and we only want to set the initial size, which is only possible for windows, we use a little trick. */ GtkRequisition requisition; world_gui_size_textview(gui); gtk_widget_size_request(wndMain, &requisition); gtk_widget_set_size_request(GTK_WIDGET(gui->txtView), 100, 100); gtk_window_resize(GTK_WINDOW(wndMain), requisition.width, requisition.height); } init_perl_system(); #ifdef HAVE_LIBGNUTLS gnutls_global_init(); gnutls_certificate_allocate_credentials(&tls_certif_cred); /* We don't really verify certificates */ /*gnutls_certificate_set_x509_trust_file(tls_certif_cred, CAFILE, GNUTLS_X509_FMT_PEM);*/ #endif gtk_widget_show_all(wndMain); #ifndef __MINGW32__ /* We don't want SIGPIPEs killing us */ signal(SIGPIPE, SIG_IGN); #endif /* Open worlds given in command line */ while (argpos < argc) { if (!opened_one) { /* First one uses the first GUI */ opened_one |= open_new_world(gui, argv[argpos], FALSE, NULL); } else { opened_one |= open_new_world(NULL, argv[argpos], FALSE, NULL); } ++argpos; } if (!opened_one) { if (!open_new_world(gui, NULL, FALSE, NULL)) return 0; } g_timeout_add(500, update_times_cb, NULL); gtk_main(); /* Save and free all words that happen to be open yet. */ while (open_worlds) { World *world = (World *) open_worlds->data; if (world->connected || world->connecting) { /* This leaks the return value, but we are exiting the program. */ close_connection(world, TRUE); } save_world_to_file(world); save_command_history(world); save_permanent_variables(world); free_world(world); open_worlds = open_worlds->next; } save_global_preferences(); save_world_to_file(default_world); PERL_SYS_TERM(); #ifdef HAVE_LIBGNUTLS gnutls_certificate_free_credentials(tls_certif_cred); gnutls_global_deinit(); #endif if (dumpFile) { fclose(dumpFile); } if (rdumpFile) { fclose(rdumpFile); } return 0; } gboolean confirm_quit(void) { GList *worldptr; int n_open; gboolean retval = FALSE; GtkWidget *msgdlg; GtkWidget *dlgbutton; n_open = 0; worldptr = open_worlds; while (worldptr) { World *world = (World *) worldptr->data; if ((world->connected || world->connecting) && !world->hooks.OnCloseConnected) { ++n_open; } worldptr = worldptr->next; } if (n_open == 0) { return TRUE; } if (n_open == 1) { msgdlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("There is one open world. Do you really want to quit?")); } else { msgdlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("There are %d open worlds. Do you really want to quit?"), n_open); } gtk_window_set_title(GTK_WINDOW(msgdlg), _("Really Quit KildClient?")); gtk_dialog_add_button(GTK_DIALOG(msgdlg), _("Don't quit"), GTK_RESPONSE_NO); dlgbutton = gtk_button_new_from_stock(GTK_STOCK_QUIT); gtk_widget_show_all(dlgbutton); gtk_dialog_add_action_widget(GTK_DIALOG(msgdlg), dlgbutton, GTK_RESPONSE_YES); if (gtk_dialog_run(GTK_DIALOG(msgdlg)) == GTK_RESPONSE_YES) { retval = TRUE; } gtk_widget_destroy(msgdlg); return retval; } /* * Functions to get the user path (e.g. ~/.kildclient) and the * directory where the data files are installed. */ #ifndef __WIN32__ #include const char * get_kildclient_directory_path(void) { char *homedir; if (!kc_user_dir) { homedir = getenv("HOME"); kc_user_dir = g_strdup_printf("%s/.kildclient", homedir); } return kc_user_dir; } const char * get_kildclient_installed_file(const char *file) { /* file is the name of a file that is in the same directory as kildclient.exe. This function finds the installation directory and returns the full path to that file. */ static char path[PATH_MAX]; strcpy(path, PKGDATADIR "/"); strcat(path, file); return path; } #else /* __WIN32__ */ const char * get_kildclient_directory_path(void) { char appdatadir[MAX_PATH]; if (!kc_user_dir) { if (SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, appdatadir) >= 0) { kc_user_dir = g_strdup_printf("%s\\kildclient", appdatadir); } else { /* Shouldn't fail, but... */ kc_user_dir = g_strdup("c:\\kildclient"); } } return kc_user_dir; } const char * get_kildclient_installed_file(const char *file) { /* file is the name of a file that is in the same directory as kildclient.exe. This function finds the installation directory and returns the full path to that file. */ static char path[PATH_MAX]; char *pos; GetModuleFileName(NULL, path, PATH_MAX - 1); pos = strrchr(path, '\\'); strcpy(pos + 1, file); return path; } #endif kildclient-2.11.1/src/cmdhistory.c0000644000175000017500000005652311526001511013762 00000000000000/* $Id: cmdhistory.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include "kildclient.h" #include "perlscript.h" /************** * Data types * **************/ struct CmdHistorySendData_s { World *world; gint lines_at_a_time; GSList *list; GSList *list_iter; }; typedef struct CmdHistorySendData_s CmdHistorySendData; /*********************** * Function prototypes * ***********************/ static GtkWidget *create_cmd_history_dialog(GtkWindow *parent, World *world); static gboolean cmdhistory_send_timer_cb(gpointer data); static void save_tentative_command(World *world); /* XML UI signals */ G_MODULE_EXPORT void menu_command_history_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void cmdhistory_recall_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void cmdhistory_start_send_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void cmdhistory_find_cb(GtkWidget *widget, gpointer data); void prev_or_next_command(World *world, gboolean next) { gchar *command; SimoComboBox *cmb = world->gui->cmbEntry; save_tentative_command(world); /* Update position */ if (world->cmd_list_size) { if (!next) { if (!gtk_tree_model_iter_next(world->cmd_list, &world->current_cmd)) { gtk_tree_model_get_iter_first(world->cmd_list, &world->current_cmd); } } else { GtkTreePath *path; path = gtk_tree_model_get_path(world->cmd_list, &world->current_cmd); if (gtk_tree_path_prev(path)) { gtk_tree_model_get_iter(world->cmd_list, &world->current_cmd, path); } else { gtk_tree_model_iter_nth_child(world->cmd_list, &world->current_cmd, NULL, world->cmd_list_size); } gtk_tree_path_free(path); } /* Fetch new command */ command = cmdhistory_get_command(world->cmd_list, &world->current_cmd); simo_combo_box_set_text(cmb, command); g_free(command); } simo_combo_box_select_region(cmb, 0, -1); world->cmd_position_changed = FALSE; } void find_prev_or_next_command(World *world, gboolean next) { SimoComboBox *cmb = world->gui->cmbEntry; gchar *command; GtkTreeIter start_iter; gboolean found = FALSE; if (!world->cmd_list_size) { return; } if (!world->saved_command_find_search) { world->saved_command_find_search = g_strdup(simo_combo_box_get_text(cmb)); } save_tentative_command(world); start_iter = world->current_cmd; while (1) { if (!next) { if (!gtk_tree_model_iter_next(world->cmd_list, &world->current_cmd)) { world->current_cmd = start_iter; break; } } else { GtkTreePath *path; path = gtk_tree_model_get_path(world->cmd_list, &world->current_cmd); if (gtk_tree_path_prev(path)) { gtk_tree_model_get_iter(world->cmd_list, &world->current_cmd, path); } else { gtk_tree_path_free(path); break; } gtk_tree_path_free(path); } command = cmdhistory_get_command(world->cmd_list, &world->current_cmd); if (g_str_has_prefix(command, world->saved_command_find_search)) { found = TRUE; break; } g_free(command); } if (found) { simo_combo_box_set_text(cmb, command); g_free(command); simo_combo_box_select_region(cmb, 0, -1); world->cmd_position_changed = FALSE; } else { world->current_cmd = start_iter; } } void menu_command_history_cb(GtkWidget *widget, gpointer data) { if (!currentWorld) { return; } if (!currentWorld->dlgCmdHistory) { currentWorld->dlgCmdHistory = create_cmd_history_dialog(GTK_WINDOW(wndMain), currentWorld); } gtk_widget_show_all(currentWorld->dlgCmdHistory); gtk_window_present(GTK_WINDOW(currentWorld->dlgCmdHistory)); } static GtkWidget * create_cmd_history_dialog(GtkWindow *parent, World *world) { gchar *objects[] = { "dlgCmdHistory", "adjustment1", "adjustment2", NULL }; GError *error = NULL; GObject *dlg; GtkTreeView *viewCommands; GtkTreeSelection *selection; GtkCellRenderer *renderer; GObject *btnSendClose; GObject *btnRecallClose; GObject *btnFind; GtkSpinButton *spnDelay; GtkSpinButton *spnNCommands; /* Create the dialog */ if (!world->ui_builder) { world->ui_builder = gtk_builder_new(); } if (!gtk_builder_add_objects_from_file(world->ui_builder, get_kildclient_installed_file("dlgCmdHistory.ui"), objects, &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } dlg = gtk_builder_get_object(world->ui_builder, "dlgCmdHistory"); /* Configure tree view */ viewCommands = GTK_TREE_VIEW(gtk_builder_get_object(world->ui_builder, "viewCommands")); gtk_tree_view_set_model(viewCommands, world->cmd_list); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_insert_column_with_data_func(viewCommands, 0, NULL, renderer, (GtkTreeCellDataFunc) completion_cell_data_function, NULL, NULL); selection = gtk_tree_view_get_selection(viewCommands); gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); /* This information is used in the callbacks */ btnSendClose = gtk_builder_get_object(world->ui_builder, "btnSendClose"); g_object_set_data(btnSendClose, "close", GINT_TO_POINTER(1)); btnRecallClose = gtk_builder_get_object(world->ui_builder, "btnRecallClose"); g_object_set_data(btnRecallClose, "close", GINT_TO_POINTER(1)); btnFind = gtk_builder_get_object(world->ui_builder, "btnFind"); g_object_set_data(btnFind, "startsearch", GINT_TO_POINTER(1)); /* Default values */ spnDelay = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnCHDelay")); gtk_spin_button_set_value(spnDelay, globalPrefs.multi_cmd_delay); spnNCommands = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnNCommands")); gtk_spin_button_set_value(spnNCommands, globalPrefs.multi_cmd_group_size); /* Signals */ gtk_builder_connect_signals(world->ui_builder, world); return GTK_WIDGET(dlg); } void cmdhistory_recall_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkTreeView *viewCommands; GtkTreeModel *model; GtkTreeSelection *selection; GList *selected_rows; gint n_selected; gchar *command; viewCommands = GTK_TREE_VIEW(gtk_builder_get_object(world->ui_builder, "viewCommands")); selection = gtk_tree_view_get_selection(viewCommands); n_selected = gtk_tree_selection_count_selected_rows(selection); if (n_selected == 0) { GtkWidget *msgdlg; msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgCmdHistory), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("No command selected.")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); return; } else if (n_selected > 1) { GtkWidget *msgdlg; msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgCmdHistory), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("More than one command selected.")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); return; } if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "close"))) { gtk_widget_hide(world->dlgCmdHistory); } save_tentative_command(world); selected_rows = gtk_tree_selection_get_selected_rows(selection, &model); gtk_tree_model_get_iter(model, &world->current_cmd, (GtkTreePath *) selected_rows->data); command = cmdhistory_get_command(world->cmd_list, &world->current_cmd); simo_combo_box_set_text(world->gui->cmbEntry, command); g_free(command); g_list_foreach(selected_rows, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected_rows); } void cmdhistory_start_send_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkTreeView *viewCommands; GtkTreeModel *model; GtkTreeSelection *selection; GtkSpinButton *spnDelay; GtkSpinButton *spnNCommands; GList *selected_rows; GList *list_iter; gdouble delay; if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "close"))) { gtk_widget_hide(world->dlgCmdHistory); } viewCommands = GTK_TREE_VIEW(gtk_builder_get_object(world->ui_builder, "viewCommands")); selection = gtk_tree_view_get_selection(viewCommands); selected_rows = gtk_tree_selection_get_selected_rows(selection, &model); list_iter = selected_rows; if (!list_iter) { return; } spnDelay = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnCHDelay")); delay = gtk_spin_button_get_value(spnDelay); spnNCommands = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnNCommands")); if (delay) { gchar *command; GtkTreeIter iter; GSList *cmd_list = NULL; CmdHistorySendData *data; /* Create list of commands */ while (list_iter) { gtk_tree_model_get_iter(model, &iter, (GtkTreePath *) list_iter->data); command = cmdhistory_get_command(model, &iter); cmd_list = g_slist_append(cmd_list, command); list_iter = list_iter->next; } data = g_new(CmdHistorySendData, 1); data->world = world; data->list = cmd_list; data->list_iter = cmd_list; data->lines_at_a_time = gtk_spin_button_get_value_as_int(spnNCommands); /* Send first command immediately */ if (cmdhistory_send_timer_cb(data)) { /* Start timeout function to send the rest (if necessary) */ if (cmd_list) { g_timeout_add_full(G_PRIORITY_HIGH, delay * 1000, cmdhistory_send_timer_cb, data, NULL); } } } else { /* Send everything as fast as possible */ while (list_iter) { GtkTreeIter iter; gchar *command; gtk_tree_model_get_iter(model, &iter, (GtkTreePath *) list_iter->data); command = cmdhistory_get_command(model, &iter); parse_commands(world, command, strlen(command)); g_free(command); list_iter = list_iter->next; } } g_list_foreach(selected_rows, (GFunc) gtk_tree_path_free, NULL); g_list_free(selected_rows); } static gboolean cmdhistory_send_timer_cb(gpointer data) { CmdHistorySendData *cmd_data = (CmdHistorySendData *) data; gint n; n = cmd_data->lines_at_a_time; while (n-- && cmd_data->list_iter) { gchar *command = (gchar *) cmd_data->list_iter->data; parse_commands(cmd_data->world, command, strlen(command)); cmd_data->list_iter = cmd_data->list_iter->next; } /* No more commands to send */ if (!cmd_data->list_iter) { g_slist_foreach(cmd_data->list, (GFunc) g_free, NULL); g_slist_free(cmd_data->list); g_free(cmd_data); return FALSE; } return TRUE; } void cmdhistory_find_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkTreeView *viewCommands; GtkTreeModel *model; GtkTreeSelection *selection; gboolean found; gboolean error; GtkTreePath *search_path = NULL; viewCommands = GTK_TREE_VIEW(gtk_builder_get_object(world->ui_builder, "viewCommands")); model = gtk_tree_view_get_model(viewCommands); selection = gtk_tree_view_get_selection(viewCommands); /* Start search if asked */ if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "startsearch"))) { GtkEntry *txtSearchText; GtkToggleButton *radUpwards; if (!world->dlgCmdHistoryFind) { gchar *objects[] = { "dlgFind", NULL }; GError *gerror = NULL; if (!gtk_builder_add_objects_from_file(world->ui_builder, get_kildclient_installed_file("dlgCmdHistory.ui"), objects, &gerror)) { g_warning(_("Error loading UI from XML file: %s"), gerror->message); g_error_free(gerror); return; } world->dlgCmdHistoryFind = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "dlgFind")); } txtSearchText = GTK_ENTRY(gtk_builder_get_object(world->ui_builder, "txtSearchText")); radUpwards = GTK_TOGGLE_BUTTON(gtk_builder_get_object(world->ui_builder, "radUpwards")); gtk_dialog_set_default_response(GTK_DIALOG(world->dlgCmdHistoryFind), GTK_RESPONSE_OK); while (1) { if (gtk_dialog_run(GTK_DIALOG(world->dlgCmdHistoryFind)) == GTK_RESPONSE_OK) { const gchar *search_text; search_text = gtk_entry_get_text(txtSearchText); if (strcmp(search_text, "") == 0) { GtkWidget *msgdlg; msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgCmdHistory), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Enter some text to search for.")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); continue; } world->cmdfind_upwards = gtk_toggle_button_get_active(radUpwards); g_free(world->cmdfind_string); world->cmdfind_string = g_strdup(search_text); break; } else { /* Clear dialog */ gtk_entry_set_text(txtSearchText, ""); gtk_widget_hide(world->dlgCmdHistoryFind); return; } } /* Clear dialog */ gtk_entry_set_text(txtSearchText, ""); gtk_widget_hide(world->dlgCmdHistoryFind); if (world->cmdfind_row) { gtk_tree_row_reference_free(world->cmdfind_row); } } else { /* Verify if there was a search */ if (!world->cmdfind_string) { GtkWidget *msgdlg; msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgCmdHistory), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Use the Find button to find the first result.")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); return; } search_path = gtk_tree_row_reference_get_path(world->cmdfind_row); } if (!search_path) { if (world->cmdfind_upwards) { search_path = gtk_tree_path_new_from_indices(world->cmd_list_size, -1); } else { search_path = gtk_tree_path_new_first(); } world->cmdfind_row = gtk_tree_row_reference_new(model, search_path); } error = FALSE; found = FALSE; while (!found) { GtkTreeIter iter; gchar *command; gtk_tree_model_get_iter(model, &iter, search_path); command = cmdhistory_get_command(model, &iter); if (strstr(command, world->cmdfind_string)) { /* Found */ gtk_tree_selection_unselect_all(selection); gtk_tree_selection_select_iter(selection, &iter); gtk_tree_view_scroll_to_cell(viewCommands, search_path, NULL, FALSE, 0, 0); found = TRUE; } g_free(command); /* Move to next/previous row */ if (world->cmdfind_upwards) { if (!gtk_tree_path_prev(search_path)) { error = TRUE; } } else { if (!gtk_tree_model_iter_next(model, &iter)) { error = TRUE; } else { gtk_tree_path_next(search_path); } } if (error && !found) { GtkWidget *msgdlg; msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgCmdHistory), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, _("Command not found.")); gtk_window_set_title(GTK_WINDOW(msgdlg), _("KildClient Warning")); gtk_dialog_run(GTK_DIALOG(msgdlg)); gtk_widget_destroy(msgdlg); break; } } gtk_tree_row_reference_free(world->cmdfind_row); world->cmdfind_row = gtk_tree_row_reference_new(model, search_path); } gchar * cmdhistory_get_command(GtkTreeModel *model, GtkTreeIter *iter) { gchar *command; gtk_tree_model_get(model, iter, CMDLIST_COL_TENTATIVE, &command, -1); if (!command) { gtk_tree_model_get(model, iter, CMDLIST_COL_COMMAND, &command, -1); } return command; } void add_recent_command(World *world, const gchar *command) { GtkTreeIter previous; GtkTreeIter most_recent; gboolean go_on; gboolean is_repeated = FALSE; gchar *previous_command = NULL; if (!world->repeat_commands || world->cmd_has_been_edited || world->cmd_just_selected_from_combo) { gtk_tree_model_get_iter_first(world->cmd_list, &most_recent); gtk_list_store_set(GTK_LIST_STORE(world->cmd_list), &world->current_cmd, CMDLIST_COL_TENTATIVE, NULL, -1); /* Try to locate the same command in the history */ go_on = gtk_tree_model_iter_nth_child(world->cmd_list, &previous, NULL, 1); while (go_on) { previous_command = cmdhistory_get_command(world->cmd_list, &previous); if (previous_command && strcmp(command, previous_command) == 0) { is_repeated = TRUE; g_free(previous_command); break; } go_on = gtk_tree_model_iter_next(world->cmd_list, &previous); } if (is_repeated) { /* A duplicate command */ /* It is not added again, but the old command moved into position */ gtk_list_store_move_after(GTK_LIST_STORE(world->cmd_list), &previous, &most_recent); /* most_recent might have become invalid */ gtk_tree_model_get_iter_first(world->cmd_list, &most_recent); if (world->repeat_commands) { /* In this case, a duplicate entry has already been added, so let's remove it. */ gtk_list_store_remove(GTK_LIST_STORE(world->cmd_list), &most_recent); --world->cmd_list_size; world->cmd_has_been_edited = FALSE; world->gui->execute_changed_signal = TRUE; world->cmd_just_selected_from_combo = FALSE; } else { gtk_list_store_set(GTK_LIST_STORE(world->cmd_list), &most_recent, CMDLIST_COL_TENTATIVE, "", -1); } } else { /* A new command */ gtk_list_store_set(GTK_LIST_STORE(world->cmd_list), &most_recent, CMDLIST_COL_COMMAND, command, CMDLIST_COL_TENTATIVE, NULL, -1); if (!world->repeat_commands) { insert_recent_command(world, ""); } else { world->cmd_has_been_edited = FALSE; world->cmd_just_selected_from_combo = FALSE; world->gui->execute_changed_signal = TRUE; } } } /* Set the pointer to point to the new command */ gtk_tree_model_get_iter_first(world->cmd_list, &world->current_cmd); } void insert_recent_command(World *world, const gchar *command) { GtkTreeIter new; gtk_list_store_prepend(GTK_LIST_STORE(world->cmd_list), &new); gtk_list_store_set(GTK_LIST_STORE(world->cmd_list), &new, CMDLIST_COL_COMMAND, NULL, CMDLIST_COL_TENTATIVE, command, -1); ++world->cmd_list_size; /* See if the maximum list size has been reached */ if (world->cmd_list_size >= world->commands_to_save) { GtkTreeIter last_iter; if (gtk_tree_model_iter_nth_child(world->cmd_list, &last_iter, NULL, world->commands_to_save + 1)) { while (gtk_list_store_remove(GTK_LIST_STORE(world->cmd_list), &last_iter)) { --world->cmd_list_size; } /* This is for the last removed one --- when the command returns false, and the body of the loop is not called. */ --world->cmd_list_size; } } } static void save_tentative_command(World *world) { if (world->repeat_commands && !world->cmd_has_been_edited) { insert_recent_command(world, ""); world->gui->execute_changed_signal = FALSE; world->cmd_has_been_edited = TRUE; world->cmd_just_selected_from_combo = FALSE; } else { /* Save possibly modified text as tentative command */ gtk_list_store_set(GTK_LIST_STORE(world->cmd_list), &world->current_cmd, CMDLIST_COL_TENTATIVE, simo_combo_box_get_text(world->gui->cmbEntry), -1); } } kildclient-2.11.1/src/mainwindow.c0000644000175000017500000012046511570205043013753 00000000000000/* $Id: mainwindow.c 1176 2011-05-28 14:43:45Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #ifndef __MINGW32__ # include # include #else # include #endif #ifdef HAVE_LIBGNUTLS # include # include # include #endif #include "kildclient.h" #include "perlscript.h" #include "ansi.h" /****************** * Initialization * ******************/ World *currentWorld = NULL; GtkBuilder *main_builder = NULL; GtkWidget *wndMain = NULL; GtkWidget *ntbkWorlds = NULL; GList *open_worlds = NULL; gboolean window_has_focus = TRUE; gint worlds_with_new_text = 0; gboolean debug_matches = 0; /*********************** * Function prototypes * ***********************/ static gboolean update_world_with_focus(gpointer data); static void about_dlg_url_hook(GtkAboutDialog *about, const gchar *link, gpointer data); static gint attach_world_gui(WorldGUI *gui); static void detach_world_gui(WorldGUI *gui); static gchar *format_time_string(World *world, int ctime, int itime); static void format_hms_time(GString *str, int seconds); /* XMl UI callbacks */ G_MODULE_EXPORT gboolean exit_cb(GtkWidget *widget, GdkEvent *event, gpointer data); G_MODULE_EXPORT gboolean window_focus_in_cb(GtkWidget *widget, GdkEventFocus *evt, gpointer data); G_MODULE_EXPORT gboolean window_focus_out_cb(GtkWidget *widget, GdkEventFocus *evt, gpointer data); G_MODULE_EXPORT void notebook_page_changed_cb(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data); G_MODULE_EXPORT void notebook_page_reordered_cb(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer data); /* Menus */ G_MODULE_EXPORT void menu_world_open_cb(gpointer data, GtkWidget *widget); G_MODULE_EXPORT void open_new_world_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void edit_this_world_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_statistics_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_edit_open_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_cut_activate_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_copy_activate_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_paste_activate_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_delete_activate_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_find_activate_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_input_clear_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_input_prev_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_input_next_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_input_find_prev_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_input_find_next_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_preferences_open_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_disable_triggers_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_disable_aliases_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_disable_macros_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_disable_timers_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void mnuDebugMatches_activate_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_edit_default_world_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_display_open_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void menu_split_screen_cb(GtkAction *widget, gpointer data); G_MODULE_EXPORT void menu_manual_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void about_menu_cb(GtkWidget *widget, gpointer data); GtkWidget* create_main_window(WorldGUI *gui) { GError *error = NULL; GtkWidget *window; GObject *mnuReconnect; GObject *mnuDisconnect; GObject *mnuConnectAnother; GObject *mnuSave; GObject *mnuClose; GObject *mnuPrevious; GObject *mnuNext; GObject *mnuQuit; main_builder = gtk_builder_new(); if (!gtk_builder_add_from_file(main_builder, get_kildclient_installed_file("wndmain.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); exit(1); /* No point in continuing */ } gtk_builder_connect_signals(main_builder, NULL); window = GTK_WIDGET(gtk_builder_get_object(main_builder, "wndMain")); #ifndef __WIN32__ gtk_window_set_icon_from_file(GTK_WINDOW(window), SYSDATADIR "/pixmaps/kildclient.png", NULL); gtk_window_set_default_icon_from_file(SYSDATADIR "/pixmaps/kildclient.png", NULL); #endif /* User interface */ ntbkWorlds = GTK_WIDGET(gtk_builder_get_object(main_builder, "ntbkWorlds")); gtk_notebook_set_tab_pos(GTK_NOTEBOOK(ntbkWorlds), globalPrefs.tab_position); attach_world_gui(gui); gtk_widget_grab_focus(GTK_WIDGET(gui->cmbEntry)); /* These signals apparently don't work from the XML file */ mnuReconnect = gtk_builder_get_object(main_builder, "mnuReconnect"); g_signal_connect(mnuReconnect, "activate", G_CALLBACK(menu_perl_run_cb), "$world->reconnect()"); mnuDisconnect = gtk_builder_get_object(main_builder, "mnuDisconnect"); g_signal_connect(mnuDisconnect, "activate", G_CALLBACK(menu_perl_run_cb), "$world->dc()"); mnuConnectAnother = gtk_builder_get_object(main_builder, "mnuConnectAnother"); g_signal_connect(mnuConnectAnother, "activate", G_CALLBACK(menu_perl_run_cb), "$world->connectother()"); mnuSave = gtk_builder_get_object(main_builder, "mnuSave"); g_signal_connect(mnuSave, "activate", G_CALLBACK(menu_perl_run_cb), "$world->save()"); mnuClose = gtk_builder_get_object(main_builder, "mnuClose"); g_signal_connect(mnuClose, "activate", G_CALLBACK(menu_perl_run_cb), "$world->close()"); mnuPrevious = gtk_builder_get_object(main_builder, "mnuPrevious"); g_signal_connect(mnuPrevious, "activate", G_CALLBACK(menu_perl_run_cb), "$world->prev()"); mnuNext = gtk_builder_get_object(main_builder, "mnuNext"); g_signal_connect(mnuNext, "activate", G_CALLBACK(menu_perl_run_cb), "$world->next()"); mnuQuit = gtk_builder_get_object(main_builder, "mnuQuit"); g_signal_connect(mnuQuit, "activate", G_CALLBACK(menu_perl_run_cb), "quit"); return window; } gboolean exit_cb(GtkWidget *widget, GdkEvent *event, gpointer data) { if (confirm_quit()) { gtk_main_quit(); } /* Never let it propagate the event, since gtk_main_quit() deals with exiting. */ return TRUE; } gboolean window_focus_in_cb(GtkWidget *widget, GdkEventFocus *evt, gpointer data) { if (!currentWorld) return FALSE; currentWorld->has_focus = TRUE; if (currentWorld->has_unread_text) { /* If in offline mode, then the tab is greyed. Let's not change it. */ if (currentWorld->connected) { gtk_label_set_text(currentWorld->gui->lblNotebook, currentWorld->display_name); } currentWorld->has_unread_text = FALSE; --worlds_with_new_text; } if (currentWorld->selection_start || currentWorld->selection_end) { simo_combo_box_select_region(currentWorld->gui->cmbEntry, currentWorld->selection_start, currentWorld->selection_end); } window_has_focus = TRUE; adjust_window_title(); if (globalPrefs.urgency_hint) { gtk_window_set_urgency_hint(GTK_WINDOW(wndMain), FALSE); } if (currentWorld->connected) { execute_hook(currentWorld, "OnGetFocus", NULL); } return FALSE; } gboolean window_focus_out_cb(GtkWidget *widget, GdkEventFocus *evt, gpointer data) { if (!currentWorld) return FALSE; currentWorld->has_focus = FALSE; simo_combo_box_get_selection_bounds(currentWorld->gui->cmbEntry, ¤tWorld->selection_start, ¤tWorld->selection_end); window_has_focus = FALSE; adjust_window_title(); if (currentWorld->connected) { execute_hook(currentWorld, "OnLoseFocus", NULL); } return FALSE; } void adjust_window_title(void) { gchar *worldname; gchar *title; if (currentWorld) { if (currentWorld->connected) { worldname = g_strdup_printf(" - %s", currentWorld->display_name); } else { worldname = g_strdup_printf(" - [%s]", currentWorld->display_name); } } else { worldname = g_strdup(""); } if (window_has_focus || worlds_with_new_text == 0) { title = g_strdup_printf("KildClient%s", worldname); } else if (worlds_with_new_text == 1) { title = g_strdup_printf("(*) KildClient%s", worldname); } else { title = g_strdup_printf("(*)[%d] KildClient%s", worlds_with_new_text, worldname); } gtk_window_set_title(GTK_WINDOW(wndMain), title); g_free(worldname); g_free(title); if (!window_has_focus) { if (globalPrefs.urgency_hint) { gtk_window_set_urgency_hint(GTK_WINDOW(wndMain), worlds_with_new_text); } } } void notebook_page_changed_cb(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer data) { World *old_world = NULL; gint old_page; old_page = gtk_notebook_get_current_page(notebook); if (old_page != - 1) { old_world = g_list_nth_data(open_worlds, old_page); } if (old_world) { old_world->has_focus = FALSE; old_world->is_current_tab = FALSE; if(old_world->connected) { execute_hook(old_world, "OnLoseFocus", NULL); } } /* Updates currentWorld, handles focus, etc. Called as idle because the change may result from a call to a Perl function, and this changes the current Perl interpreter. */ g_idle_add(update_world_with_focus, GINT_TO_POINTER(page_num)); } void notebook_page_reordered_cb(GtkNotebook *notebook, GtkWidget *widget, guint new_pos, gpointer data) { World *world; WorldGUI *gui; gint old_pos; GList *sucessor; gui = (WorldGUI *) g_object_get_data(G_OBJECT(widget), "gui"); world = gui->world; old_pos = g_list_index(open_worlds, world); sucessor = g_list_nth(open_worlds, new_pos); if (old_pos < new_pos) { sucessor = g_list_next(sucessor); } open_worlds = g_list_remove(open_worlds, world); open_worlds = g_list_insert_before(open_worlds, sucessor, world); } static gboolean update_world_with_focus(gpointer data) { gint n = GPOINTER_TO_INT(data); /* Now we make it point to the new world */ currentWorld = (World *) g_list_nth_data(open_worlds, n); world_for_perl = currentWorld; if (currentWorld) { currentWorld->has_focus = window_has_focus; currentWorld->is_current_tab = TRUE; if (currentWorld->has_unread_text) { gtk_label_set_text(currentWorld->gui->lblNotebook, currentWorld->display_name); currentWorld->has_unread_text = FALSE; --worlds_with_new_text; } PERL_SET_CONTEXT(currentWorld->perl_interpreter); adjust_window_title(); if (currentWorld->connected) { execute_hook(currentWorld, "OnGetFocus", NULL); } } /* Do not run again */ return FALSE; } void open_new_world_cb(GtkWidget *widget, gpointer data) { open_new_world(NULL, NULL, FALSE, NULL); } gboolean open_new_world(WorldGUI *gui, const gchar *cmdline_arg, gboolean can_offline, gboolean *offline_selected) { World *world = NULL; gint page = 0; gint action; gchar *errmsg = NULL; World *prev_world = NULL; gboolean our_gui = FALSE; if (!gui) { gui = world_gui_new(TRUE); page = attach_world_gui(gui); our_gui = TRUE; } else { prev_world = gui->world; } if (cmdline_arg) { world = get_world_from_cmdline(cmdline_arg); } else { world = get_world_to_connect(); } if (world) { world->gui = gui; gui->world = world; ansitextview_update_color_tags(gui, gui->world); while (1) { if (connect_to(world, &errmsg)) { set_focused_world(page); world->has_focus = TRUE; world->is_current_tab = TRUE; gtk_widget_grab_focus(GTK_WIDGET(world->gui->cmbEntry)); return TRUE; } else { action = disconnected_msgbox(errmsg, can_offline); g_free(errmsg); if (action == GTK_RESPONSE_CLOSE) { break; } if (action == RESP_OFFLINE) { *offline_selected = TRUE; free_world(world); gui->world = prev_world; ansitextview_update_color_tags(gui, gui->world); return TRUE; } if (action == RESP_OTHER) { free_world(world); world = get_world_to_connect(); if (!world) { break; } world->gui = gui; gui->world = world; ansitextview_update_color_tags(gui, gui->world); } } } } if (our_gui) { detach_world_gui(gui); free_world_gui(gui); } return FALSE; } void edit_this_world_cb(GtkWidget *widget, gpointer data) { gboolean dummy; edit_world(¤tWorld, GTK_WINDOW(wndMain), &dummy, FALSE); gtk_label_set_text(currentWorld->gui->lblNotebook, currentWorld->display_name); } void menu_statistics_cb(GtkWidget *widget, gpointer data) { GtkBuilder *ui_builder; GError *error = NULL; GtkWidget *dlgStatistics; GtkLabel *lblName; GtkLabel *lblHost; GtkLabel *lblPort; GtkLabel *lblProxyType; GtkLabel *lblProxyHost; GtkLabel *lblProxyPort; GtkLabel *lblConnTime; GtkLabel *lblIdleTime; GtkLabel *lblCompression; GtkLabel *lblRawBytes; GtkLabel *lblBytes; GtkLabel *lblCRatio; GtkLabel *lblLines; GtkLabel *lblTLS; gchar *str; time_t now; GString *timestr; ui_builder = gtk_builder_new(); if (!gtk_builder_add_from_file(ui_builder, get_kildclient_installed_file("dlgStatistics.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return; } dlgStatistics = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgStatistics")); lblName = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblName")); lblHost = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblHost")); lblPort = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblPort")); lblConnTime = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblConnTime")); lblIdleTime = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblIdleTime")); lblCompression = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblCompression")); lblRawBytes = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblRawBytes")); lblBytes = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblBytes")); lblCRatio = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblCRatio")); lblLines = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblLines")); lblTLS = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLS")); /* Basic information */ gtk_label_set_text(lblName, currentWorld->name); if (currentWorld->proxy_used.type == PROXY_NONE && currentWorld->host_ip) { str = g_strdup_printf("%s (%s)", currentWorld->host, currentWorld->host_ip); } else { str = g_strdup(currentWorld->host); } gtk_label_set_text(lblHost, str); g_free(str); gtk_label_set_text(lblPort, currentWorld->port); /* Proxy information */ if (currentWorld->proxy_used.type != PROXY_NONE) { lblProxyType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblProxyType")); lblProxyHost = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblProxyHost")); lblProxyPort = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblProxyPort")); if (currentWorld->proxy_used.type == PROXY_SOCKS4) { gtk_label_set_text(lblProxyType, "SOCKS4"); } else if (currentWorld->proxy_used.type == PROXY_SOCKS5) { gtk_label_set_text(lblProxyType, "SOCKS5"); } gtk_label_set_text(lblProxyHost, currentWorld->proxy_used.server); gtk_label_set_text(lblProxyPort, currentWorld->proxy_used.port); } if (currentWorld->connected) { now = time(NULL); timestr = g_string_new(NULL); format_hms_time(timestr, difftime(now, currentWorld->connected_time)); gtk_label_set_text(lblConnTime, timestr->str); g_string_truncate(timestr, 0); format_hms_time(timestr, difftime(now, currentWorld->last_command_time)); gtk_label_set_text(lblIdleTime, timestr->str); g_string_free(timestr, TRUE); } else { gtk_label_set_text(lblConnTime, _("Not connected")); gtk_label_set_text(lblIdleTime, _("Not connected")); } /* Compression Information */ if (currentWorld->zstream) { str = g_strdup_printf("MCCP version %d", currentWorld->mccp_ver); gtk_label_set_text(lblCompression, str); g_free(str); str = g_strdup_printf("%ld", currentWorld->rawbytes); gtk_label_set_text(lblRawBytes, str); g_free(str); str = g_strdup_printf("%ld", currentWorld->bytes); gtk_label_set_text(lblBytes, str); g_free(str); str = g_strdup_printf("%.2f:1", (double) currentWorld->bytes/(double) currentWorld->rawbytes); gtk_label_set_text(lblCRatio, str); g_free(str); } else { str = g_strdup_printf("%ld", currentWorld->rawbytes); gtk_label_set_text(lblBytes, str); g_free(str); } str = g_strdup_printf("%ld", currentWorld->deleted_lines + gtk_text_buffer_get_line_count(currentWorld->gui->txtBuffer)); gtk_label_set_text(lblLines, str); g_free(str); /* TLS information */ #ifdef HAVE_LIBGNUTLS if (currentWorld->use_tls) { GtkLabel *lblTLSCipher; GtkLabel *lblTLSMAC; GtkLabel *lblTLSKX; GtkLabel *lblTLSComp; GtkLabel *lblTLSCertType; GtkLabel *lblTLSCertHostname; GtkLabel *lblTLSCertActivation; GtkLabel *lblTLSCertExpiration; GtkLabel *lblTLSCertFingerprint; gnutls_certificate_type cert_type; const gnutls_datum *cert_list; guint cert_list_size; gboolean hostname_matches = FALSE; time_t act_time; time_t exp_time; gchar digest[20]; size_t digest_size; const gchar *val; gchar *mval; gchar buf[MAX_BUFFER]; guint i; val = gnutls_protocol_get_name(gnutls_protocol_get_version(currentWorld->tls_session)); gtk_label_set_text(lblTLS, val); lblTLSCipher = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCipher")); val = gnutls_cipher_get_name(gnutls_cipher_get(currentWorld->tls_session)); gtk_label_set_text(lblTLSCipher, val); lblTLSMAC = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSMAC")); val = gnutls_mac_get_name(gnutls_mac_get(currentWorld->tls_session)); gtk_label_set_text(lblTLSMAC, val); lblTLSKX = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSKX")); val = gnutls_kx_get_name(gnutls_kx_get(currentWorld->tls_session)); gtk_label_set_text(lblTLSKX, val); lblTLSComp = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSComp")); val = gnutls_compression_get_name(gnutls_compression_get(currentWorld->tls_session)); gtk_label_set_text(lblTLSComp, val); lblTLSCertType = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCertType")); cert_type = gnutls_certificate_type_get(currentWorld->tls_session); val = gnutls_certificate_type_get_name(cert_type); gtk_label_set_text(lblTLSCertType, val); /* Certificate/key information */ lblTLSCertHostname = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCertHostname")); lblTLSCertActivation = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCertActivation")); lblTLSCertExpiration = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCertExpiration")); lblTLSCertFingerprint = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCertFingerprint")); cert_list = gnutls_certificate_get_peers(currentWorld->tls_session, &cert_list_size); if (cert_type == GNUTLS_CRT_X509) { GtkLabel *lblTLSCertSubDN; GtkLabel *lblTLSCertIssDN; gnutls_x509_crt crt; size_t size; if (cert_list_size > 0) { /* Note that we consider only the first */ gnutls_x509_crt_init(&crt); gnutls_x509_crt_import(crt, &cert_list[0], GNUTLS_X509_FMT_DER); hostname_matches = gnutls_x509_crt_check_hostname(crt, currentWorld->host); act_time = gnutls_x509_crt_get_activation_time(crt); exp_time = gnutls_x509_crt_get_expiration_time(crt); digest_size = sizeof(digest); gnutls_x509_crt_get_fingerprint(crt, GNUTLS_DIG_MD5, digest, &digest_size); size = sizeof(buf); gnutls_x509_crt_get_dn(crt, buf, &size); lblTLSCertSubDN = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCertSubDN")); gtk_label_set_text(lblTLSCertSubDN, buf); size = sizeof(buf); gnutls_x509_crt_get_issuer_dn(crt, buf, &size); lblTLSCertIssDN = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLSCertIssDN")); gtk_label_set_text(lblTLSCertIssDN, buf); } } else { gtk_label_set_text(lblTLSCertHostname, "Unknown certificate type"); return; } if (hostname_matches) { mval = g_strdup_printf("Matches '%s'", currentWorld->host); } else { mval = g_strdup_printf("Does not match '%s'", currentWorld->host); } gtk_label_set_text(lblTLSCertHostname, mval); g_free(mval); now = time(NULL); strftime(buf, MAX_BUFFER, "%c", localtime(&act_time)); if (act_time > now) { strcat(buf, _(": Not yet active")); } gtk_label_set_text(lblTLSCertActivation, buf); strftime(buf, MAX_BUFFER, "%c", localtime(&exp_time)); if (exp_time < now) { strcat(buf, _(": Expired")); } gtk_label_set_text(lblTLSCertExpiration, buf); mval = buf; for (i = 0; i < digest_size; i++) { sprintf(mval, "%.2X:", (unsigned char) digest[i]); mval += 3; } mval[strlen(mval) - 1] = 0; /* Remove last : */ gtk_label_set_text(lblTLSCertFingerprint, buf); } else { gtk_label_set_text(lblTLS, _("None")); } #endif /* Run the dialog */ gtk_dialog_run(GTK_DIALOG(dlgStatistics)); gtk_widget_destroy(dlgStatistics); g_object_unref(ui_builder); } void menu_edit_default_world_cb(GtkWidget *widget, gpointer data) { gboolean dummy; edit_world(&default_world, GTK_WINDOW(wndMain), &dummy, FALSE); } void menu_manual_cb(GtkWidget *widget, gpointer data) { gchar *manualurl; #ifndef __WIN32__ manualurl = g_strdup_printf("file://%s", MANUALDIR "/index.html"); #else manualurl = g_strdup_printf(get_kildclient_installed_file("manual\\html\\index.html")); #endif menu_url_open(NULL, manualurl); } void about_menu_cb(GtkWidget *widget, gpointer data) { GError *error = NULL; static GtkWidget *dlgAbout = NULL; if (!dlgAbout) { gtk_about_dialog_set_url_hook(about_dlg_url_hook, NULL, NULL); if (!gtk_builder_add_from_file(main_builder, get_kildclient_installed_file("dlgAbout.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return; } dlgAbout = GTK_WIDGET(gtk_builder_get_object(main_builder, "dlgAbout")); gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dlgAbout), VERSION); gtk_builder_connect_signals(main_builder, NULL); } gtk_widget_show_all(dlgAbout); gtk_window_present(GTK_WINDOW(dlgAbout)); } static void about_dlg_url_hook(GtkAboutDialog *about, const gchar *link, gpointer data) { gchar *url = g_strdup(link); menu_url_open(NULL, url); } static gint attach_world_gui(WorldGUI *gui) { gint page; page = gtk_notebook_append_page(GTK_NOTEBOOK(ntbkWorlds), gui->vbox, GTK_WIDGET(gui->hboxTab)); gtk_widget_show_all(GTK_WIDGET(gui->hboxTab)); gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(ntbkWorlds), gui->vbox, TRUE); if (globalPrefs.hide_single_tab) { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(ntbkWorlds), gtk_notebook_get_n_pages(GTK_NOTEBOOK(ntbkWorlds)) != 1); } gtk_widget_show_all(ntbkWorlds); return page; } static void detach_world_gui(WorldGUI *gui) { gint old_page; gint new_page; old_page = gtk_notebook_page_num(GTK_NOTEBOOK(ntbkWorlds), gui->vbox); gtk_notebook_remove_page(GTK_NOTEBOOK(ntbkWorlds), old_page); if (globalPrefs.hide_single_tab) { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(ntbkWorlds), gtk_notebook_get_n_pages(GTK_NOTEBOOK(ntbkWorlds)) != 1); } new_page = gtk_notebook_get_current_page(GTK_NOTEBOOK(ntbkWorlds)); update_world_with_focus(GINT_TO_POINTER(new_page)); } void set_focused_world(gint page) { gtk_notebook_set_current_page(GTK_NOTEBOOK(ntbkWorlds), page); } gint get_focused_world(void) { return gtk_notebook_get_current_page(GTK_NOTEBOOK(ntbkWorlds)); } void remove_world(World *world, gboolean remove_gui) { open_worlds = g_list_remove(open_worlds, world); if (world->connected || world->connecting) { g_free(close_connection(world, TRUE)); } if (world->file) { save_world_to_file(world); save_command_history(world); save_permanent_variables(world); } if (remove_gui) { detach_world_gui(world->gui); free_world_gui(world->gui); } free_world(world); if (open_worlds == NULL) { gtk_main_quit(); } } gboolean remove_world_timer(World *world) { remove_world(world, TRUE); /* Because it is called as an idle function */ return FALSE; } void set_notebook_tab_position(GtkPositionType pos) { gtk_notebook_set_tab_pos(GTK_NOTEBOOK(ntbkWorlds), pos); } void menu_world_open_cb(gpointer data, GtkWidget *widget) { GtkAction *mnuDisconnect = GTK_ACTION(data); if (currentWorld && (currentWorld->connected || currentWorld->connecting)) { gtk_action_set_sensitive(mnuDisconnect, TRUE); } else { gtk_action_set_sensitive(mnuDisconnect, FALSE); } } void menu_edit_open_cb(GtkWidget *widget, gpointer data) { GtkAction *mnuCut; GtkAction *mnuCopy; GtkAction *mnuPaste; GtkAction *mnuDelete; GdkDisplay *display; GtkClipboard *clipboard; gboolean input_selected; gboolean output_selected; /* Safety check */ if (!currentWorld || !currentWorld->gui->cmbEntry || !currentWorld->gui->txtBuffer) { return; } mnuCut = GTK_ACTION(gtk_builder_get_object(main_builder, "mnuCut")); mnuCopy = GTK_ACTION(gtk_builder_get_object(main_builder, "mnuCopy")); mnuPaste = GTK_ACTION(gtk_builder_get_object(main_builder, "mnuPaste")); mnuDelete = GTK_ACTION(gtk_builder_get_object(main_builder, "mnuDelete")); /* We can paste when there is text in the clipboard */ display = gtk_widget_get_display(wndMain); clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD); gtk_action_set_sensitive(mnuPaste, gtk_clipboard_wait_is_text_available(clipboard)); /* We can cut and delete if there is text selected in the input box */ input_selected = simo_combo_box_get_selection_bounds(currentWorld->gui->cmbEntry, NULL, NULL); gtk_action_set_sensitive(mnuCut, input_selected); gtk_action_set_sensitive(mnuDelete, input_selected); /* We can copy if there is a selection in the input box or the output window */ output_selected = gtk_text_buffer_get_selection_bounds(currentWorld->gui->txtBuffer, NULL, NULL); gtk_action_set_sensitive(mnuCopy, input_selected || output_selected); } void menu_cut_activate_cb(GtkWidget *widget, gpointer data) { simo_combo_box_cut_clipboard(currentWorld->gui->cmbEntry); } void menu_copy_activate_cb(GtkWidget *widget, gpointer data) { GtkTextIter start; GtkTextIter end; if (gtk_text_buffer_get_selection_bounds(currentWorld->gui->txtBuffer, &start, &end)) { GdkDisplay *display; GtkClipboard *clipboard; display = gtk_widget_get_display(GTK_WIDGET(currentWorld->gui->txtView)); clipboard = gtk_clipboard_get_for_display(display, GDK_SELECTION_CLIPBOARD); gtk_text_buffer_copy_clipboard(currentWorld->gui->txtBuffer, clipboard); /* The selection is unmarked after the previous step (possibly a issue with the non-focusability of the text buffer). So we set it again. */ gtk_text_buffer_select_range(currentWorld->gui->txtBuffer, &start, &end); } else { simo_combo_box_copy_clipboard(currentWorld->gui->cmbEntry); } } void menu_paste_activate_cb(GtkWidget *widget, gpointer data) { simo_combo_box_paste_clipboard(currentWorld->gui->cmbEntry); } void menu_delete_activate_cb(GtkWidget *widget, gpointer data) { simo_combo_box_delete_selection(currentWorld->gui->cmbEntry); } void menu_find_activate_cb(GtkWidget *widget, gpointer data) { GtkTextIter search_start; if (!currentWorld || !currentWorld->gui || !currentWorld->gui->search_box) { return; } g_object_set(G_OBJECT(currentWorld->gui->search_box), "no-show-all", FALSE, NULL); gtk_widget_show_all(currentWorld->gui->search_box); gtk_text_buffer_get_start_iter(currentWorld->gui->txtBuffer, &search_start); if (!currentWorld->gui->txtmark_search_start) { currentWorld->gui->txtmark_search_start = gtk_text_buffer_create_mark(currentWorld->gui->txtBuffer, NULL, &search_start, FALSE); currentWorld->gui->txtmark_next_search_start = gtk_text_buffer_create_mark(currentWorld->gui->txtBuffer, NULL, &search_start, FALSE); } gtk_entry_set_text(GTK_ENTRY(currentWorld->gui->txtSearchTerm), ""); gtk_widget_grab_focus(currentWorld->gui->txtSearchTerm); } void menu_findnext_activate_cb(GtkWidget *widget, gpointer data) { if (!currentWorld || !currentWorld->gui || !currentWorld->gui->search_box) { return; } if (!currentWorld->gui->txtmark_search_start) { /* No search started yet. */ menu_find_activate_cb(NULL, NULL); } else { find_next_cb(NULL, currentWorld->gui); } } void menu_input_clear_cb(GtkWidget *widget, gpointer data) { if (currentWorld) { clear_button_cb(NULL, currentWorld->gui); } } void menu_input_prev_cb(GtkWidget *widget, gpointer data) { if (currentWorld) { prev_or_next_command(currentWorld, FALSE); } } void menu_input_next_cb(GtkWidget *widget, gpointer data) { if (currentWorld) { prev_or_next_command(currentWorld, TRUE); } } void menu_input_find_prev_cb(GtkWidget *widget, gpointer data) { if (currentWorld) { find_prev_or_next_command(currentWorld, FALSE); } } void menu_input_find_next_cb(GtkWidget *widget, gpointer data) { if (currentWorld) { find_prev_or_next_command(currentWorld, TRUE); } } void menu_preferences_open_cb(GtkWidget *widget, gpointer data) { GtkToggleAction *mnuDisableTriggers; GtkToggleAction *mnuDisableAliases; GtkToggleAction *mnuDisableMacros; GtkToggleAction *mnuDisableTimers; if (!currentWorld) { return; } mnuDisableTriggers = GTK_TOGGLE_ACTION(gtk_builder_get_object(main_builder, "mnuDisTriggers")); mnuDisableAliases = GTK_TOGGLE_ACTION(gtk_builder_get_object(main_builder, "mnuDisAliases")); mnuDisableMacros = GTK_TOGGLE_ACTION(gtk_builder_get_object(main_builder, "mnuDisMacros")); mnuDisableTimers = GTK_TOGGLE_ACTION(gtk_builder_get_object(main_builder, "mnuDisTimers")); gtk_toggle_action_set_active(mnuDisableTriggers, currentWorld->disable_triggers); gtk_toggle_action_set_active(mnuDisableAliases, currentWorld->disable_aliases); gtk_toggle_action_set_active(mnuDisableMacros, currentWorld->disable_macros); gtk_toggle_action_set_active(mnuDisableTimers, currentWorld->disable_timers); } void menu_disable_triggers_cb(GtkWidget *widget, gpointer data) { currentWorld->disable_triggers = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget)); } void menu_disable_aliases_cb(GtkWidget *widget, gpointer data) { currentWorld->disable_aliases = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget)); } void menu_disable_macros_cb(GtkWidget *widget, gpointer data) { currentWorld->disable_macros = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget)); } void menu_disable_timers_cb(GtkWidget *widget, gpointer data) { currentWorld->disable_timers = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget)); } void mnuDebugMatches_activate_cb(GtkWidget *widget, gpointer data) { debug_matches = gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget)); } void menu_display_open_cb(GtkWidget *widget, gpointer data) { GtkToggleAction *mnuSplitWindow; if (!currentWorld) { return; } mnuSplitWindow = GTK_TOGGLE_ACTION(gtk_builder_get_object(main_builder, "mnuSplitWindow")); g_signal_handlers_block_by_func(G_OBJECT(mnuSplitWindow), menu_split_screen_cb, NULL); gtk_toggle_action_set_active(mnuSplitWindow, gtk_paned_get_position(currentWorld->gui->split_pane) > 0); g_signal_handlers_unblock_by_func(G_OBJECT(mnuSplitWindow), menu_split_screen_cb, NULL); } void menu_split_screen_cb(GtkAction *action, gpointer data) { if (gtk_paned_get_position(currentWorld->gui->split_pane) == 0) { if (currentWorld->gui->last_split_position == 0) { GtkAllocation allocation; #if GTK_MINOR_VERSION < 18 allocation = GTK_WIDGET(currentWorld->gui->split_pane)->allocation; #else gtk_widget_get_allocation(GTK_WIDGET(currentWorld->gui->split_pane), &allocation); #endif currentWorld->gui->last_split_position = allocation.height * .65; } gtk_paned_set_position(currentWorld->gui->split_pane, currentWorld->gui->last_split_position); } else { currentWorld->gui->last_split_position = gtk_paned_get_position(currentWorld->gui->split_pane); gtk_paned_set_position(currentWorld->gui->split_pane, 0); } } gboolean update_times_cb(gpointer data) { /* Updates the connection and idle timers in the status bar of the worlds */ GList *worldptr; World *world; time_t now; gchar *timestr; now = time(NULL); worldptr = open_worlds; while (worldptr) { world = (World *) worldptr->data; if (world->connected && world->gui && world->gui->lblTime) { timestr = format_time_string(world, (int) difftime(now, world->connected_time), (int) difftime(now, world->last_command_time)); gtk_label_set_text(world->gui->lblTime, timestr); g_free(timestr); } worldptr = worldptr->next; } return TRUE; } static gchar * format_time_string(World *world, int ctime, int itime) { GString *str; str = g_string_new(NULL); if (world->ctime_type != NO) { g_string_append(str, "Conn: "); if (world->ctime_type == SEC) { g_string_append_printf(str, "%ds", ctime); } else { format_hms_time(str, ctime); } if (world->itime_type != NO) { g_string_append(str, ", ");; } } if (world->itime_type != NO) { g_string_append(str, "Idle: "); if (world->itime_type == SEC) { g_string_append_printf(str, "%ds", itime); } else { format_hms_time(str, itime); } } return g_string_free(str, FALSE); } static void format_hms_time(GString *str, int seconds) { int hours; int minutes; hours = (int) (seconds/3600); seconds %= 3600; minutes = (int) (seconds/60); seconds %= 60; if (hours) { g_string_append_printf(str, "%dh", hours); } if (minutes) { if (hours) { g_string_append_printf(str, "%02dm", minutes); } else { g_string_append_printf(str, "%dm", minutes); } } g_string_append_printf(str, "%02ds", seconds); } kildclient-2.11.1/src/multilinesend.c0000644000175000017500000003453611526001511014451 00000000000000/* $Id: multilinesend.c 1143 2011-02-13 16:13:58Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static GtkWidget *create_multi_line_send_dialog(GtkWindow *parent, World *world); static gboolean multi_line_send_timer_cb(gpointer data); static gchar *get_text_buffer_line(GtkTextBuffer *buffer, int line, int nlines, gboolean *last); static gchar *get_file_line(FILE *fp, gboolean *last); static void send_line(gchar *line, MLSendData *context); static void string_free(gpointer string, gpointer user_data); /* XML UI signals */ G_MODULE_EXPORT void multi_line_send_cb(GtkWidget *widget, gpointer data); G_MODULE_EXPORT void start_multi_line_send_cb(GtkButton *btn, gpointer data); G_MODULE_EXPORT void clear_multi_line_send_dialog_cb(GtkWidget *widget, gpointer data); void multi_line_send_cb(GtkWidget *widget, gpointer data) { if (!currentWorld->dlgMLSend) { currentWorld->dlgMLSend = create_multi_line_send_dialog(GTK_WINDOW(wndMain), currentWorld); } gtk_widget_show_all(currentWorld->dlgMLSend); gtk_window_present(GTK_WINDOW(currentWorld->dlgMLSend)); } static GtkWidget * create_multi_line_send_dialog(GtkWindow *parent, World *world) { GError *error = NULL; GtkWidget *dlg; GtkWidget *text; GtkWidget *txtInitial; GtkSpinButton *spnDelay; GtkSpinButton *spnLinesATime; PangoFontDescription *fontDesc; PangoLayout *layout; gint char_width; PangoRectangle logical_rect; GtkRequisition requisition; /* Create the dialog */ if (!world->ui_builder) { world->ui_builder = gtk_builder_new(); } if (!gtk_builder_add_from_file(world->ui_builder, get_kildclient_installed_file("dlgMLSend.ui"), &error)) { g_warning(_("Error loading UI from XML file: %s"), error->message); g_error_free(error); return NULL; /* This will cause warnings in the calling function, but there is need to abort the program because of this. */ } dlg = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "dlgMLSend")); /* Set the fonts */ fontDesc = pango_font_description_from_string(world->entryfont); txtInitial = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "txtInitial")); gtk_widget_modify_font(txtInitial, fontDesc); text = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "txtFinal")); gtk_widget_modify_font(text, fontDesc); text = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "txtStart")); gtk_widget_modify_font(text, fontDesc); text = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "txtEnd")); gtk_widget_modify_font(text, fontDesc); pango_font_description_free(fontDesc); /* Default values */ spnDelay = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnMLSDelay")); gtk_spin_button_set_value(spnDelay, globalPrefs.multi_cmd_delay); spnLinesATime = GTK_SPIN_BUTTON(gtk_builder_get_object(world->ui_builder, "spnLinesATime")); gtk_spin_button_set_value(spnLinesATime, globalPrefs.multi_cmd_group_size); /* Connect signals */ gtk_builder_connect_signals(world->ui_builder, world); /* Set width of entries to be slightly larger than 80 columns. */ layout = gtk_widget_create_pango_layout(txtInitial, "W"); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); char_width = logical_rect.width; /* This hack allows the initial size to be set, but without preventing the window from getting smaller. */ gtk_widget_set_size_request(txtInitial, 81 * char_width, -1); gtk_widget_size_request(dlg, &requisition); gtk_widget_set_size_request(txtInitial, -1, -1); gtk_window_resize(GTK_WINDOW(dlg), requisition.width, requisition.height); g_object_unref(layout); return dlg; } void start_multi_line_send_cb(GtkButton *btn, gpointer data) { World *world = (World *) data; GtkBuilder *ui_builder; GtkTextView *txtInitial; GtkTextView *txtFinal; GtkFileChooser *txtFile; GtkEntry *txtStart; GtkEntry *txtEnd; GtkSpinButton *spnDelay; GtkSpinButton *spnLinesATime; GtkToggleButton *chkDontClose; gdouble delay; MLSendData *mlcontext; ui_builder = world->ui_builder; txtInitial = GTK_TEXT_VIEW(gtk_builder_get_object(ui_builder, "txtInitial")); txtFinal = GTK_TEXT_VIEW(gtk_builder_get_object(ui_builder, "txtFinal")); txtFile = GTK_FILE_CHOOSER(gtk_builder_get_object(ui_builder, "txtFile")); txtStart = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtStart")); txtEnd = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtEnd")); spnDelay = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnMLSDelay")); spnLinesATime = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "spnLinesATime")); chkDontClose = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkDontClose")); delay = gtk_spin_button_get_value(spnDelay); mlcontext = g_new0(MLSendData, 1); mlcontext->state = ML_TRY_INITIALBUFFER; mlcontext->world = world; mlcontext->textInitial = gtk_text_view_get_buffer(txtInitial); mlcontext->textFinal = gtk_text_view_get_buffer(txtFinal); mlcontext->file = gtk_file_chooser_get_filename(txtFile); mlcontext->textStart = g_strdup(gtk_entry_get_text(txtStart)); mlcontext->textEnd = g_strdup(gtk_entry_get_text(txtEnd)); mlcontext->linesatime = gtk_spin_button_get_value_as_int(spnLinesATime); mlcontext->dont_close = gtk_toggle_button_get_active(chkDontClose); if (!mlcontext->dont_close) { gtk_widget_hide(world->dlgMLSend); } do_multi_line_send(mlcontext, delay); } void do_multi_line_send(MLSendData *mlcontext, gdouble delay) { /* Send the first line immediately */ if (multi_line_send_timer_cb(mlcontext)) { if (delay) { g_timeout_add_full(G_PRIORITY_HIGH, delay * 1000, multi_line_send_timer_cb, mlcontext, NULL); } else { /* If delay is zero, send as fast as possible */ while (multi_line_send_timer_cb(mlcontext)) ; } } } static gboolean multi_line_send_timer_cb(gpointer data) { MLSendData *context = (MLSendData *) data; int last = FALSE; FILE *fp; gchar *line; int sent_lines; sent_lines = 0; while (sent_lines < context->linesatime) { switch (context->state) { case ML_TRY_INITIALBUFFER: if (context->textInitial && gtk_text_buffer_get_char_count(context->textInitial)) { context->state = ML_INITIALBUFFER; context->nlines = gtk_text_buffer_get_line_count(context->textInitial); context->currline = 0; } else { context->state = ML_TRY_INITIALLINES; } break; case ML_TRY_INITIALLINES: if (context->linesInitial) { context->state = ML_INITIALLINES; context->list_iterator = context->linesInitial; } else { context->state = ML_TRY_FILE; } break; case ML_TRY_FILE: if (context->file) { fp = fopen(context->file, "r"); if (fp) { context->state = ML_FILECONTENTS; context->fp = fp; break; } } context->state = ML_TRY_FINALBUFFER; break; case ML_TRY_FINALBUFFER: if (context->textFinal && gtk_text_buffer_get_char_count(context->textFinal)) { context->state = ML_FINALBUFFER; context->nlines = gtk_text_buffer_get_line_count(context->textFinal); context->currline = 0; } else { context->state = ML_TRY_FINALLINES; } break; case ML_TRY_FINALLINES: if (context->linesFinal) { context->state = ML_FINALLINES; context->list_iterator = context->linesFinal; } else { context->state = ML_FINISH; } break; case ML_INITIALBUFFER: line = get_text_buffer_line(context->textInitial, context->currline, context->nlines, &last); send_line(line, context); g_free(line); ++sent_lines; if (last) { context->state = ML_TRY_FILE; } else { ++context->currline; } break; case ML_FINALBUFFER: line = get_text_buffer_line(context->textFinal, context->currline, context->nlines, &last); send_line(line, context); g_free(line); ++sent_lines; if (last) { context->state = ML_FINISH; } else { ++context->currline; } break; case ML_INITIALLINES: line = (gchar *) context->list_iterator->data; send_line(line, context); ++sent_lines; context->list_iterator = context->list_iterator->next; if (!context->list_iterator) { context->state = ML_TRY_FILE; } break; case ML_FINALLINES: line = (gchar *) context->list_iterator->data; send_line(line, context); ++sent_lines; context->list_iterator = context->list_iterator->next; if (!context->list_iterator) { context->state = ML_FINISH; } break; case ML_FILECONTENTS: line = get_file_line(context->fp, &last); send_line(line, context); ++sent_lines; if (last) { context->state = ML_TRY_FINALBUFFER; fclose(context->fp); } break; case ML_FINISH: if (context->textInitial && !context->dont_close) { clear_multi_line_send_dialog_cb(GTK_WIDGET(context->world->dlgMLSend), context->world); } g_free(context->textStart); g_free(context->textEnd); g_free(context->file); if (context->linesInitial) { g_slist_foreach(context->linesInitial, string_free, NULL); g_slist_free(context->linesInitial); } if (context->linesFinal) { g_slist_foreach(context->linesFinal, string_free, NULL); g_slist_free(context->linesFinal); } g_free(context); return FALSE; } } return TRUE; } void clear_multi_line_send_dialog_cb(GtkWidget *widget, gpointer data) { World *world = (World *) data; GtkBuilder *ui_builder; GtkWidget *dlgMLSend; GtkTextView *txtInitial; GtkFileChooser *txtFile; GtkTextView *txtFinal; GtkEntry *txtStart; GtkEntry *txtEnd; GtkTextBuffer *buffer; ui_builder = world->ui_builder; dlgMLSend = GTK_WIDGET(gtk_builder_get_object(ui_builder, "dlgMLSend")); txtInitial = GTK_TEXT_VIEW(gtk_builder_get_object(ui_builder, "txtInitial")); txtFile = GTK_FILE_CHOOSER(gtk_builder_get_object(ui_builder, "txtFile")); txtFinal = GTK_TEXT_VIEW(gtk_builder_get_object(ui_builder, "txtFinal")); txtStart = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtStart")); txtEnd = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtEnd")); buffer = gtk_text_view_get_buffer(txtInitial); gtk_text_buffer_set_text(buffer, "", 0); gtk_file_chooser_unselect_all(txtFile); buffer = gtk_text_view_get_buffer(txtFinal); gtk_text_buffer_set_text(buffer, "", 0); gtk_entry_set_text(txtStart, ""); gtk_entry_set_text(txtEnd, ""); gtk_widget_hide(dlgMLSend); } static gchar * get_text_buffer_line(GtkTextBuffer *buffer, int line, int nlines, gboolean *last) { GtkTextIter start; GtkTextIter end; gchar *to_send; gtk_text_buffer_get_iter_at_line(buffer, &start, line); if (line == nlines - 1) { gtk_text_buffer_get_end_iter(buffer, &end); *last = TRUE; } else { gtk_text_buffer_get_iter_at_line(buffer, &end, line+1); *last = FALSE; } to_send = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); return to_send; } static gchar * get_file_line(FILE *fp, gboolean *last) { static char line[MAX_BUFFER]; int c; fgets(line, MAX_BUFFER, fp); c = fgetc(fp); if (c != -1) { ungetc(c, fp); *last = FALSE; } else { *last = TRUE; } return line; } static void send_line(gchar *line, MLSendData *context) { int len; /* Remove final newline */ len = strlen(line); if (line[len-1] == '\n') { line[len - 1] = '\0'; --len; if (line[len-1] == '\r') { line[len - 1] = '\0'; --len; } } send_to_world_no_check(context->world, context->textStart, strlen(context->textStart), NULL, 0, FALSE, FALSE); send_to_world_no_check(context->world, line, len, NULL, 0, FALSE, FALSE); send_to_world_no_check(context->world, context->textEnd, strlen(context->textEnd), NULL, 0, TRUE, FALSE); } static void string_free(gpointer string, gpointer user_data) { g_free(string); } kildclient-2.11.1/src/aliases.c0000644000175000017500000001502011570205043013206 00000000000000/* $Id: aliases.c 1176 2011-05-28 14:43:45Z ekalin $ */ /* * Copyright (C) 2004-2011 Eduardo M Kalinowski * * 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., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "kildclient.h" #include "perlscript.h" #include "ansi.h" /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ char * substitute_aliases(World *world, const char *cmd) { GSList *aliasptr; Alias *alias; char *result; int i; if (world->disable_aliases) { return NULL; } aliasptr = world->aliases; i = 0; while (aliasptr) { alias = (Alias *) aliasptr->data; if (alias->enabled && (result = perl_substitute(world->perl_interpreter, cmd, alias->pattern_re, alias->substitution, alias->perl_eval, FALSE))) { if (debug_matches) { fprintf(stderr, "**Alias %d '%s' matched for world %s\n" " Command: %s\n" " Pattern: %s\n" " Substitution: %s\n" " Eval as Perl: %d\n" " Result: %s\n", i, alias->name ? alias->name : "", world->name, cmd, alias->pattern, alias->substitution, alias->perl_eval, result); } return result; } aliasptr = aliasptr->next; ++i; } return NULL; } void remove_alias(World *world, GSList *aliasitem) { Alias *alias = (Alias *) aliasitem->data; /* Necessary when free_alias dereferences alias->pattern_re */ if (world->perl_interpreter) { PERL_SET_CONTEXT(world->perl_interpreter); } we_alias_delete_alias(world, alias); world->aliases = g_slist_remove_link(world->aliases, aliasitem); if (!alias->owner_plugin) { --world->alias_pos; } free_alias(alias, NULL); g_slist_free(aliasitem); } gboolean move_alias(World *world, gint old_pos, gint new_pos) { GSList *aliasitem; gpointer alias; aliasitem = g_slist_nth(world->aliases, old_pos); if (!aliasitem) { return FALSE; } alias = aliasitem->data; world->aliases = g_slist_delete_link(world->aliases, aliasitem); world->aliases = g_slist_insert(world->aliases, alias, new_pos); we_alias_delete_alias(world, alias); we_alias_insert_alias(world, alias, new_pos); return TRUE; } void free_alias(Alias *alias, gpointer data) { g_free(alias->name); g_free(alias->pattern); g_free(alias->substitution); SvREFCNT_dec(alias->pattern_re); g_free(alias); } void list_aliases(World *world, Plugin *plugin) { guint i; guint total_width; guint field_width; GSList *aliasptr; Alias *alias; /* The rows argument is not used. */ ansitextview_get_size(world->gui, &field_width, &total_width); /* If the screen is really narrow, we can do nothing. */ if (total_width < 30) { total_width = 30; } field_width = (total_width - 18)/2; ansitextview_append_stringf(world->gui, _("Num Eval Ena IgC %-*.*s %-*.*s\n"), field_width, field_width, _("Pattern"), field_width, field_width, _("Substitution")); ansitextview_append_string(world->gui, "--- ---- --- --- "); for (i = 0; i < field_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, " "); for (i = 0; i < field_width; ++i) { ansitextview_append_string(world->gui, "-"); } ansitextview_append_string(world->gui, "\n"); i = 0; aliasptr = world->aliases; while (aliasptr) { alias = (Alias *) aliasptr->data; if (alias->owner_plugin == plugin) { ansitextview_append_stringf(world->gui, "%3d %-4.4s %-3.3s %-3.3s %-*.*s %-*.*s\n", i, alias->perl_eval ? _("y") : _("n"), alias->enabled ? _("y") : _("n"), alias->ignore_case ? _("y") : _("n"), field_width, field_width, alias->pattern, field_width, field_width, alias->substitution); } ++i; aliasptr = aliasptr->next; } } void alias_precompute_res(World *world) { GSList *aliasptr = world->aliases; Alias *alias; while (aliasptr) { alias = (Alias *) aliasptr->data; /* Aliases loaded from a script file already have the precomputed RE */ if (!alias->pattern_re) { alias->pattern_re = precompute_re(world->perl_interpreter, alias->pattern, alias->ignore_case); } aliasptr = aliasptr->next; } } void save_alias(GString *str, Alias *alias) { g_string_append(str, " name) { kc_g_string_append_escaped(str, "name=\"%s\" ", alias->name); } g_string_append_printf(str, "perleval=\"%d\" enabled=\"%d\" ignorecase=\"%d\">\n", alias->perl_eval, alias->enabled, alias->ignore_case); kc_g_string_append_escaped(str, " %s\n" " %s\n", alias->pattern, alias->substitution); g_string_append(str, " \n"); } kildclient-2.11.1/src/dlgStatistics.glade0000644000175000017500000010500111405233112015232 00000000000000 True Statistics dialog True vertical True 8 27 2 4 4 True 0 N/A 1 2 7 8 GTK_FILL True 0 N/A 1 2 6 7 GTK_FILL True 1 Proxy port: 7 8 GTK_FILL True 1 Proxy host: 6 7 GTK_FILL True 0 None 1 2 5 6 GTK_FILL True 1 Proxy type: 5 6 GTK_FILL True 1 World name: GTK_FILL True 1 Host: 1 2 GTK_FILL True 1 Port: 2 3 GTK_FILL True 1 Connection time: 3 4 GTK_FILL True 1 Idle time: 4 5 GTK_FILL True 2 8 9 GTK_FILL GTK_FILL True 1 Compression used: 9 10 GTK_FILL True 1 Bytes received (compressed): 10 11 GTK_FILL True 0 N/A 1 2 10 11 GTK_FILL True 1 Bytes received (decompressed): 11 12 GTK_FILL True 1 Compression ratio: 12 13 GTK_FILL True 1 Lines received: 13 14 GTK_FILL True 0 1 2 11 12 GTK_FILL True 0 1 2 GTK_FILL True 0 1 2 1 2 GTK_FILL True 0 1 2 2 3 GTK_FILL True 0 1 2 3 4 GTK_FILL True 0 1 2 4 5 GTK_FILL True 0 None 1 2 9 10 GTK_FILL True 0 N/A 1 2 12 13 GTK_FILL True 0 1 2 13 14 GTK_FILL True 2 14 15 GTK_FILL GTK_FILL True 1 Key exchange: 18 19 GTK_FILL True 1 SSL protocol used: 15 16 GTK_FILL True 1 Compression algorithm: 19 20 GTK_FILL True 1 Certificate type: 20 21 GTK_FILL True 1 Cipher: 16 17 GTK_FILL True 1 MAC: 17 18 GTK_FILL True 0 SSL not supported in this version 1 2 15 16 GTK_FILL True 0 N/A 1 2 16 17 GTK_FILL True 0 N/A 1 2 17 18 GTK_FILL True 0 N/A 1 2 18 19 GTK_FILL True 0 N/A 1 2 19 20 GTK_FILL True 0 N/A 1 2 20 21 GTK_FILL True 1 Hostname: 21 22 GTK_FILL True 0 N/A 1 2 21 22 GTK_FILL True 1 Valid since: 22 23 GTK_FILL True 1 Expiration: 23 24 GTK_FILL True 0 N/A 1 2 22 23 GTK_FILL True 0 N/A 1 2 23 24 GTK_FILL True 1 Fingerprint: 24 25 GTK_FILL True 0 N/A 1 2 24 25 GTK_FILL True 1 Subject's DN: 25 26 GTK_FILL True 1 Issuer's DN: 26 27 GTK_FILL True 0 N/A 1 2 25 26 GTK_FILL True 0 N/A 1 2 26 27 GTK_FILL 2 True end gtk-ok -5 True True True True True False False 0 False end 0 kildclient-2.11.1/configure0000744000175000017500000062552011570177666012576 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for kildclient 2.11.1. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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 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" 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" 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 : # 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 export CONFIG_SHELL 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+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_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; } # 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' 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 if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # 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'" 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='kildclient' PACKAGE_TARNAME='kildclient' PACKAGE_VERSION='2.11.1' PACKAGE_STRING='kildclient 2.11.1' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="src/main.c" # 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 RES_COMPILE RES_INCDIR WINDRES BUILD_DOCS_FALSE BUILD_DOCS_TRUE LIBGNUTLS_LIBS LIBGNUTLS_CFLAGS GTKSPELL_LIBS GTKSPELL_CFLAGS KILDCLIENT_PERL_LIBS KILDCLIENT_PERL_CFLAGS PERL GTK_LIBS GTK_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG MKINSTALLDIRS POSUB POFILES PO_IN_DATADIR_FALSE PO_IN_DATADIR_TRUE INTLLIBS INSTOBJEXT GMOFILES DATADIRNAME CATOBJEXT CATALOGS XGETTEXT GMSGFMT MSGFMT_OPTS MSGFMT USE_NLS EGREP GREP CPP GETTEXT_PACKAGE am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE 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 host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_maintainer_mode enable_dependency_tracking with_gtkspell with_libgnutls with_docs ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GTK_CFLAGS GTK_LIBS GTKSPELL_CFLAGS GTKSPELL_LIBS LIBGNUTLS_CFLAGS LIBGNUTLS_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_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 $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 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 kildclient 2.11.1 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/kildclient] --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 kildclient 2.11.1:";; 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] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gtkspell use gtkspell for spell cheking (default is YES) --with-libgnutls use libgnutls to allow connecting via TLS/SSL (default is YES) --with-docs generate the docbook documentation (default is YES) 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 GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config GTKSPELL_CFLAGS C compiler flags for GTKSPELL, overriding pkg-config GTKSPELL_LIBS linker flags for GTKSPELL, overriding pkg-config LIBGNUTLS_CFLAGS C compiler flags for LIBGNUTLS, overriding pkg-config LIBGNUTLS_LIBS linker flags for LIBGNUTLS, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF kildclient configure 2.11.1 generated by GNU Autoconf 2.68 Copyright (C) 2010 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_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 || $as_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_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_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_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_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 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 kildclient $as_me 2.11.1, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac 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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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=kildclient VERSION=2.11.1 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. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' ac_config_headers="$ac_config_headers kcconfig.h:config.h.in" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 #include #include /* 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 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='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi 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'. 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 ;; 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 for ac_func in localtime_r do : ac_fn_c_check_func "$LINENO" "localtime_r" "ac_cv_func_localtime_r" if test "x$ac_cv_func_localtime_r" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LOCALTIME_R 1 _ACEOF fi done GETTEXT_PACKAGE=kildclient ALL_LINGUAS="pt_BR eo sv de" 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" { test -f "$ac_path_GREP" && $as_test_x "$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" { test -f "$ac_path_EGREP" && $as_test_x "$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 for ac_header in locale.h do : ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" if test "x$ac_cv_header_locale_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LOCALE_H 1 _ACEOF fi done if test $ac_cv_header_locale_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 $as_echo_n "checking for LC_MESSAGES... " >&6; } if ${am_cv_val_LC_MESSAGES+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_val_LC_MESSAGES=yes else am_cv_val_LC_MESSAGES=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 $as_echo "$am_cv_val_LC_MESSAGES" >&6; } if test $am_cv_val_LC_MESSAGES = yes; then $as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h fi fi USE_NLS=yes gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" if test "x$ac_cv_header_libintl_h" = xyes; then : gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in libc" >&5 $as_echo_n "checking for ngettext in libc... " >&6; } if ${gt_cv_func_ngettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !ngettext ("","", 1) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_ngettext_libc=yes else gt_cv_func_ngettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc" >&5 $as_echo "$gt_cv_func_ngettext_libc" >&6; } if test "$gt_cv_func_ngettext_libc" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in libc" >&5 $as_echo_n "checking for dgettext in libc... " >&6; } if ${gt_cv_func_dgettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !dgettext ("","") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_dgettext_libc=yes else gt_cv_func_dgettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc" >&5 $as_echo "$gt_cv_func_dgettext_libc" >&6; } fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl" >&5 $as_echo_n "checking for bindtextdomain in -lintl... " >&6; } if ${ac_cv_lib_intl_bindtextdomain+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bindtextdomain (); int main () { return bindtextdomain (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_bindtextdomain=yes else ac_cv_lib_intl_bindtextdomain=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_bindtextdomain" >&5 $as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; } if test "x$ac_cv_lib_intl_bindtextdomain" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl" >&5 $as_echo_n "checking for dgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dgettext (); int main () { return dgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dgettext=yes else ac_cv_lib_intl_dgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dgettext" >&5 $as_echo "$ac_cv_lib_intl_dgettext" >&6; } if test "x$ac_cv_lib_intl_dgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes fi fi fi if test "$gt_cv_func_dgettext_libintl" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5 $as_echo_n "checking if -liconv is needed to use gettext... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $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 ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl" >&5 $as_echo_n "checking for dcgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dcgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $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 dcgettext (); int main () { return dcgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dcgettext=yes else ac_cv_lib_intl_dcgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dcgettext" >&5 $as_echo "$ac_cv_lib_intl_dcgettext" >&6; } if test "x$ac_cv_lib_intl_dcgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv else : fi else : fi fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" for ac_func in dcgettext do : ac_fn_c_check_func "$LINENO" "dcgettext" "ac_cv_func_dcgettext" if test "x$ac_cv_func_dcgettext" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DCGETTEXT 1 _ACEOF fi done MSGFMT_OPTS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking if msgfmt accepts -c" >&5 $as_echo_n "checking if msgfmt accepts -c... " >&6; } cat >conftest.foo <<_ACEOF msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" _ACEOF if { { $as_echo "$as_me:${as_lineno-$LINENO}: \$MSGFMT -c -o /dev/null conftest.foo"; } >&5 ($MSGFMT -c -o /dev/null conftest.foo) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then MSGFMT_OPTS=-c; { $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; } echo "$as_me: failed input was:" >&5 sed 's/^/| /' conftest.foo >&5 fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; 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_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GMSGFMT="$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_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CATOBJEXT=.gmo DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : CATOBJEXT=.gmo DATADIRNAME=share else CATOBJEXT=.mo DATADIRNAME=lib fi ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi fi if test "$gt_cv_have_gettext" = "yes" ; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po ac_config_commands="$ac_config_commands default-1" for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed" >&5 $as_echo_n "checking for catalogs to be installed... " >&6; } NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINGUAS" >&5 $as_echo "$LINGUAS" >&6; } fi if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" _ACEOF case $host in *-*-mingw32*) REQUIRES_GMODULE="" ;; *) REQUIRES_GMODULE="gmodule-export-2.0 >= 2.14.0" ;; esac 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 $as_echo_n "checking for GTK... " >&6; } if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.14.0 \$REQUIRES_GMODULE gthread-2.0 >= 2.10.0 gtk+-2.0 >= 2.18.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.14.0 $REQUIRES_GMODULE gthread-2.0 >= 2.10.0 gtk+-2.0 >= 2.18.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.14.0 $REQUIRES_GMODULE gthread-2.0 >= 2.10.0 gtk+-2.0 >= 2.18.0" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_LIBS"; then pkg_cv_GTK_LIBS="$GTK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.14.0 \$REQUIRES_GMODULE gthread-2.0 >= 2.10.0 gtk+-2.0 >= 2.18.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.14.0 $REQUIRES_GMODULE gthread-2.0 >= 2.10.0 gtk+-2.0 >= 2.18.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.14.0 $REQUIRES_GMODULE gthread-2.0 >= 2.10.0 gtk+-2.0 >= 2.18.0" 2>/dev/null` 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 GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "glib-2.0 >= 2.14.0 $REQUIRES_GMODULE gthread-2.0 >= 2.10.0 gtk+-2.0 >= 2.18.0" 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors "glib-2.0 >= 2.14.0 $REQUIRES_GMODULE gthread-2.0 >= 2.10.0 gtk+-2.0 >= 2.18.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (glib-2.0 >= 2.14.0 $REQUIRES_GMODULE gthread-2.0 >= 2.10.0 gtk+-2.0 >= 2.18.0) were not met: $GTK_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GTK_CFLAGS and GTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GTK_CFLAGS and GTK_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GTK_CFLAGS=$pkg_cv_GTK_CFLAGS GTK_LIBS=$pkg_cv_GTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; 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_PERL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PERL"; then ac_cv_prog_PERL="$PERL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PERL="perl" $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 PERL=$ac_cv_prog_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_perl_modules="ExtUtils::Embed" # Make sure we have perl if test -z "$PERL"; then # Extract the first word of "perl", so it can be a program name with args. set dummy perl; 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_PERL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$PERL"; then ac_cv_prog_PERL="$PERL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_PERL="perl" $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 PERL=$ac_cv_prog_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$PERL" != x; then ac_perl_modules_failed=0 for ac_perl_module in $ac_perl_modules; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl module $ac_perl_module" >&5 $as_echo_n "checking for perl module $ac_perl_module... " >&6; } # Would be nice to log result here, but can't rely on autoconf internals $PERL "-M$ac_perl_module" -e exit > /dev/null 2>&1 if test $? -ne 0; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; }; ac_perl_modules_failed=1 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; }; fi done # Run optional shell commands if test "$ac_perl_modules_failed" = 0; then : KILDCLIENT_PERL_CFLAGS=`$PERL getperlflags.pl ccopts` KILDCLIENT_PERL_LIBS=`$PERL getperlflags.pl ldopts` else : as_fn_error $? "The perl ExtUtils::Embed module could not be found" "$LINENO" 5 fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find perl" >&5 $as_echo "$as_me: WARNING: could not find perl" >&2;} fi LIBS="$KILDCLIENT_PERL_LIBS $LIBS" case $host in *-*-mingw32*) # Do not check for -lperl, this check fails. ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl_construct in -lperl" >&5 $as_echo_n "checking for perl_construct in -lperl... " >&6; } if ${ac_cv_lib_perl_perl_construct+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lperl $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 perl_construct (); int main () { return perl_construct (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_perl_perl_construct=yes else ac_cv_lib_perl_perl_construct=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_perl_perl_construct" >&5 $as_echo "$ac_cv_lib_perl_perl_construct" >&6; } if test "x$ac_cv_lib_perl_perl_construct" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPERL 1 _ACEOF LIBS="-lperl $LIBS" else as_fn_error $? "You do no have the perl library (-lperl) installed" "$LINENO" 5 fi ;; esac # Check whether --with-gtkspell was given. if test "${with_gtkspell+set}" = set; then : withval=$with_gtkspell; use_gtkspell=$withval else use_gtkspell="yes" fi if test "$use_gtkspell" != "no"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKSPELL" >&5 $as_echo_n "checking for GTKSPELL... " >&6; } if test -n "$GTKSPELL_CFLAGS"; then pkg_cv_GTKSPELL_CFLAGS="$GTKSPELL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtkspell-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtkspell-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKSPELL_CFLAGS=`$PKG_CONFIG --cflags "gtkspell-2.0" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTKSPELL_LIBS"; then pkg_cv_GTKSPELL_LIBS="$GTKSPELL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtkspell-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtkspell-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTKSPELL_LIBS=`$PKG_CONFIG --libs "gtkspell-2.0" 2>/dev/null` 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 GTKSPELL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "gtkspell-2.0" 2>&1` else GTKSPELL_PKG_ERRORS=`$PKG_CONFIG --print-errors "gtkspell-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTKSPELL_PKG_ERRORS" >&5 GTKSPELL_CFLAGS="" GTKSPELL_LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found, disabled" >&5 $as_echo "not found, disabled" >&6; } elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } GTKSPELL_CFLAGS="" GTKSPELL_LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found, disabled" >&5 $as_echo "not found, disabled" >&6; } else GTKSPELL_CFLAGS=$pkg_cv_GTKSPELL_CFLAGS GTKSPELL_LIBS=$pkg_cv_GTKSPELL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi else GTKSPELL_CFLAGS="" GTKSPELL_LIBS="" fi if test "$GTKSPELL_CFLAGS" != "" ; then $as_echo "#define HAVE_GTKSPELL 1" >>confdefs.h fi # Check whether --with-libgnutls was given. if test "${with_libgnutls+set}" = set; then : withval=$with_libgnutls; use_libgnutls=$withval else use_libgnutls="yes" fi if test "$use_libgnutls" != "no"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGNUTLS" >&5 $as_echo_n "checking for LIBGNUTLS... " >&6; } if test -n "$LIBGNUTLS_CFLAGS"; then pkg_cv_LIBGNUTLS_CFLAGS="$LIBGNUTLS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnutls\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnutls") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBGNUTLS_CFLAGS=`$PKG_CONFIG --cflags "gnutls" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBGNUTLS_LIBS"; then pkg_cv_LIBGNUTLS_LIBS="$LIBGNUTLS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnutls\""; } >&5 ($PKG_CONFIG --exists --print-errors "gnutls") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBGNUTLS_LIBS=`$PKG_CONFIG --libs "gnutls" 2>/dev/null` 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 LIBGNUTLS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "gnutls" 2>&1` else LIBGNUTLS_PKG_ERRORS=`$PKG_CONFIG --print-errors "gnutls" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBGNUTLS_PKG_ERRORS" >&5 LIBGNUTLS_CFLAGS="" LIBGNUTLS_LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found, disabled" >&5 $as_echo "not found, disabled" >&6; } elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } LIBGNUTLS_CFLAGS="" LIBGNUTLS_LIBS="" { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found, disabled" >&5 $as_echo "not found, disabled" >&6; } else LIBGNUTLS_CFLAGS=$pkg_cv_LIBGNUTLS_CFLAGS LIBGNUTLS_LIBS=$pkg_cv_LIBGNUTLS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi else LIBGNUTLS_CFLAGS="" LIBGNUTLS_LIBS="" fi if test "$LIBGNUTLS_CFLAGS" != "" ; then $as_echo "#define HAVE_LIBGNUTLS 1" >>confdefs.h fi build_docs=yes # Check whether --with-docs was given. if test "${with_docs+set}" = set; then : withval=$with_docs; build_docs=$withval fi if test x$build_docs = xyes; then BUILD_DOCS_TRUE= BUILD_DOCS_FALSE='#' else BUILD_DOCS_TRUE='#' BUILD_DOCS_FALSE= fi case $host in *-*-mingw32*) LIBS="$LIBS -mwindows -lregex" CFLAGS="$CFLAGS -Wno-comments -mms-bitfields" # Resources hack if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}windres", so it can be a program name with args. set dummy ${ac_tool_prefix}windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$WINDRES"; then ac_cv_prog_WINDRES="$WINDRES" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_WINDRES="${ac_tool_prefix}windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi WINDRES=$ac_cv_prog_WINDRES if test -n "$WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WINDRES" >&5 $as_echo "$WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_WINDRES"; then ac_ct_WINDRES=$WINDRES # Extract the first word of "windres", so it can be a program name with args. set dummy windres; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_WINDRES+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_WINDRES"; then ac_cv_prog_ac_ct_WINDRES="$ac_ct_WINDRES" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_WINDRES="windres" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_WINDRES=$ac_cv_prog_ac_ct_WINDRES if test -n "$ac_ct_WINDRES"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_WINDRES" >&5 $as_echo "$ac_ct_WINDRES" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_WINDRES" = x; then WINDRES="" 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 WINDRES=$ac_ct_WINDRES fi else WINDRES="$ac_cv_prog_WINDRES" fi RES_COMPILE='$(WINDRES) -i $< -o $@ $(RESFLAGS)' ;; *) RES_COMPILE='$(CC) -c -o $@ -x c /dev/null' ;; esac ac_config_files="$ac_config_files Makefile po/Makefile.in src/Makefile share/Makefile share/plugins/Makefile doc/Makefile doc/C/Makefile doc/C/images/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 "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 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 "${BUILD_DOCS_TRUE}" && test -z "${BUILD_DOCS_FALSE}"; then as_fn_error $? "conditional \"BUILD_DOCS\" 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' 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 if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # 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 kildclient $as_me 2.11.1, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ kildclient config.status 2.11.1 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 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" _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 "kcconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS kcconfig.h:config.h.in" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "share/Makefile") CONFIG_FILES="$CONFIG_FILES share/Makefile" ;; "share/plugins/Makefile") CONFIG_FILES="$CONFIG_FILES share/plugins/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/C/Makefile") CONFIG_FILES="$CONFIG_FILES doc/C/Makefile" ;; "doc/C/images/Makefile") CONFIG_FILES="$CONFIG_FILES doc/C/images/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 } ;; "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac ;; 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 kildclient-2.11.1/install-sh0000755000175000017500000003253711324777651012672 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.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 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 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 trap '(exit $?); exit' 1 2 13 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 starting with `-'. 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 # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # 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 -z "$d" && 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: kildclient-2.11.1/Makefile.am0000644000175000017500000000075311405233117012675 00000000000000# $Id: Makefile.am 1014 2009-02-01 12:46:52Z ekalin $ if BUILD_DOCS SUBDIRS = po \ src \ share \ doc else SUBDIRS = po \ src \ share endif pkgdocdir = $(datadir)/doc/kildclient pkgdoc_DATA = README AUTHORS NEWS COPYING appsdir = $(datadir)/applications apps_DATA = kildclient.desktop EXTRA_DIST = getperlflags.pl \ kildclient.spec \ kildclient.desktop \ win32/kildclient.iss win32/gettext.pm win32/README.win32 kildclient-2.11.1/config.guess0000755000175000017500000012763711344453613013203 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 # Free Software Foundation, Inc. timestamp='2009-12-30' # 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 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., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, 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. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # 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 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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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 # 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 tupples: *-*-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 ;; *: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'` exit ;; 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:*:[456]) 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:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 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-gnu`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/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix 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="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${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-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu 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-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu 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-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu 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 ;; 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 case $UNAME_PROCESSOR in i386) eval $set_cc_for_build 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 UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac 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 ;; 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 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 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: kildclient-2.11.1/AUTHORS0000644000175000017500000000051011413362040011675 00000000000000Main author: Eduardo M Kalinowski (eduardo@kalinowski.com.br) Includes SimoComboBox widget, originally by Todd A. Fisher (toddf@simosoftware.com) Includes Patches by: Sergey Bogdanov (serb@mail.ru) Zephaniah E. Hull (warp@aehallh.com) Tasci Synx Includes plugins by: Jack Mudge (jakykong@theanythingbox.com) - channels.pl