kildclient-3.2.0/0000755000175000017500000000000013220232034010626 500000000000000kildclient-3.2.0/config.h.in0000644000175000017500000000453613217705347012623 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* 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 Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* 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 /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if your file defines LC_MESSAGES. */ #undef HAVE_LC_MESSAGES /* 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-3.2.0/win32/0000755000175000017500000000000013220232034011570 500000000000000kildclient-3.2.0/win32/kildclient.iss0000744000175000017500000002412613217773065014404 00000000000000; 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 ; - Make sure to run strip on the .exe before compiling! ; - Generate html docs ; - Make in po/ directory ;;; Some defines #define AppName "KildClient" #define AppId "KildClient" #define AppVer "3.2.0" #define URL "https://www.kildclient.org" ;;; Paths to the files to be included ; Directory where KildClient is built #define BuildDir "J:\progs\kildclient-win32" ; Root of mingw32 files installed as Fedora files #define MingwDir "K:\usr\i686-w64-mingw32\sys-root\mingw" ; Strawberry Perl directory #define PerlDir "K:\opt\strawberryperl\perl" ; Directory of Perl modules (not in the mingw root, used for JSON.pm) #define SysPerlDir "K:\usr\share\perl5\vendor_perl" [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={#BuildDir}\COPYING OutputDir={#BuildDir}\win32 OutputBaseFilename=kildclient-{#AppVer} 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] ;;; Program and support files Source: {#BuildDir}\src\kildclient.exe; DestDir: {app}; Flags: ignoreversion Source: {#BuildDir}\src\*.ui; DestDir: {app}; Flags: ignoreversion Source: {#BuildDir}\share\kildclient.pl; DestDir: {app}; Flags: ignoreversion Source: {#BuildDir}\share\MSDP.pm; DestDir: {app}; Flags: ignoreversion Source: {#BuildDir}\share\kildclient.png; DestDir: {app}; Flags: ignoreversion ;;; Plugins Source: {#BuildDir}\share\plugins\*.pl; DestDir: {app}\plugins; Flags: ignoreversion ;;; Help files Source: {#BuildDir}\NEWS; DestDir: {app}; Flags: ignoreversion Source: {#BuildDir}\COPYING; DestDir: {app}; Flags: ignoreversion Source: {#BuildDir}\share\kildclient.hlp; DestDir: {app}; Flags: ignoreversion ;;; The manual Source: {#BuildDir}\doc\C\kildclient\*.xhtml; DestDir: {app}\manual\html; Flags: ignoreversion Source: {#BuildDir}\doc\C\kildclient\*.css; DestDir: {app}\manual\html; Flags: ignoreversion Source: {#BuildDir}\doc\C\images\*.png; DestDir: {app}\manual\html\images; Flags: ignoreversion ;;; Message catalogs Source: {#BuildDir}\po\pt_BR.gmo; DestDir: {app}\locale\pt_BR\LC_MESSAGES; DestName: kildclient.mo; Tasks: ; Languages: ; Flags: ignoreversion Source: {#BuildDir}\po\de.gmo; DestDir: {app}\locale\de\LC_MESSAGES; DestName: kildclient.mo; Tasks: ; Languages: ; Flags: ignoreversion Source: {#BuildDir}\po\es.gmo; DestDir: {app}\locale\es\LC_MESSAGES; DestName: kildclient.mo; Tasks: ; Languages: ; Flags: ignoreversion Source: {#BuildDir}\po\eo.gmo; DestDir: {app}\locale\eo\LC_MESSAGES; DestName: kildclient.mo; Tasks: ; Languages: ; Flags: ignoreversion Source: {#BuildDir}\po\sv.gmo; DestDir: {app}\locale\sv\LC_MESSAGES; DestName: kildclient.mo; Tasks: ; Languages: ; Flags: ignoreversion ;;; Gtk+ Source: {#MingwDir}\bin\iconv.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libatk-1.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libbz2-1.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libcairo-2.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libcairo-gobject-2.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libepoxy-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libexpat-1.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libffi-6.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libfontconfig-1.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libfreetype-6.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgcc_s_sjlj-1.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgdk-3-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgdk_pixbuf-2.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgio-2.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libglib-2.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgmodule-2.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgobject-2.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgtk-3-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libpango-1.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libpangocairo-1.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libpangowin32-1.0-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libpcre-1.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libpng16-16.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libintl-8.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libpixman-1-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\zlib1.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\share\glib-2.0\schemas\*; DestDir: {app}\share\glib-2.0\schemas; Flags: ignoreversion Source: {#MingwDir}\share\locale\pt_BR\LC_MESSAGES\*; DestDir: {app}\locale\pt_BR\LC_MESSAGES; Flags: ignoreversion Source: {#MingwDir}\share\locale\de\LC_MESSAGES\*; DestDir: {app}\locale\de\LC_MESSAGES; Flags: ignoreversion Source: {#MingwDir}\share\locale\es\LC_MESSAGES\*; DestDir: {app}\locale\es\LC_MESSAGES; Flags: ignoreversion Source: {#MingwDir}\share\locale\eo\LC_MESSAGES\*; DestDir: {app}\locale\eo\LC_MESSAGES; Flags: ignoreversion Source: {#MingwDir}\share\locale\sv\LC_MESSAGES\*; DestDir: {app}\locale\sv\LC_MESSAGES; Flags: ignoreversion Source: {#MingwDir}\share\icons\Adwaita\index.theme; DestDir: {app}\share\icons\Adwaita\; Flags: ignoreversion Source: {#MingwDir}\share\icons\Adwaita\16x16\actions\*; DestDir: {app}\share\icons\Adwaita\16x16\actions; Flags: ignoreversion Source: {#MingwDir}\share\icons\Adwaita\16x16\devices\*; DestDir: {app}\share\icons\Adwaita\16x16\devices; Flags: ignoreversion Source: {#MingwDir}\share\icons\Adwaita\16x16\mimetypes\*; DestDir: {app}\share\icons\Adwaita\16x16\devices; Flags: ignoreversion Source: {#MingwDir}\share\icons\Adwaita\16x16\places\*; DestDir: {app}\share\icons\Adwaita\16x16\places; Flags: ignoreversion ;;; gnutls Source: {#MingwDir}\bin\libgmp-10.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgnutls-30.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libhogweed-4.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libnettle-6.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libp11-kit-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libtasn1-6.dll; DestDir: {app}\bin; Flags: ignoreversion ;;; gtk-spell Source: {#MingwDir}\bin\libenchant.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgtkspell3-3-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libgnurx-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\bin\libhunspell-1.5-0.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#MingwDir}\lib\enchant\libenchant_myspell.dll; DestDir: {app}\lib\enchant; Flags: ignoreversion ;;; Perl Source: {#PerlDir}\bin\libgcc_s_dw2-1.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#PerlDir}\bin\libstdc++-6.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#PerlDir}\bin\libwinpthread-1.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#PerlDir}\bin\perl526.dll; DestDir: {app}\bin; Flags: ignoreversion Source: {#PerlDir}\lib\*; DestDir: {app}\perl; Flags: ignoreversion recursesubdirs Source: {#SysPerlDir}\JSON.pm; DestDir: {app}\lib; Flags: ignoreversion [INI] Filename: {app}\kildclient.url; Section: InternetShortcut; Key: URL; String: https://www.kildclient.org Filename: {app}\manual.url; Section: InternetShortcut; Key: URL; String: {app}\manual\html\index.xhtml [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};{app}\bin"; Flags: uninsdeletekey [UninstallDelete] Type: files; Name: {app}\kildclient.url Type: files; Name: {app}\manual.url [CustomMessages] eng.Manual=Manual bra.Manual=Manual [Code] 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-3.2.0/win32/mingw32-kildclient-docker/0000755000175000017500000000000013217767523016471 500000000000000kildclient-3.2.0/win32/mingw32-kildclient-docker/Dockerfile0000644000175000017500000000163213217767702020404 00000000000000FROM fedora:latest # Install language files for other languages COPY macros.image-language-conf /etc/rpm/macros.image-language-conf # User ekalin with password mingw32-kildclient RUN dnf -y install passwd RUN useradd ekalin \ && echo "mingw32-kildclient" | passwd --stdin ekalin # ssh server RUN dnf -y install openssh-server # Build tools RUN dnf -y install \ autoconf \ automake \ glib2-devel \ mingw32-gcc \ mingw32-gnutls \ mingw32-gtk3 \ mingw32-gtkspell3 \ mingw32-libgnurx \ perl-XML-LibXML \ perl-JSON \ unzip \ && dnf clean all RUN curl -o /tmp/strawberryperl.zip \ http://strawberryperl.com/download/5.26.1.1/strawberry-perl-5.26.1.1-32bit.zip \ && mkdir /opt/strawberryperl \ && unzip /tmp/strawberryperl.zip -d /opt/strawberryperl \ && rm /tmp/strawberryperl.zip COPY entrypoint.sh /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] CMD /bin/bash kildclient-3.2.0/win32/mingw32-kildclient-docker/entrypoint.ssh~0000644000175000017500000000026413217745511021534 00000000000000#/bin/sh ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa ssh-keygen -f /etc/ssh/ssh_host_dsa_key -N '' -t dsa ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key -N '' -t ecdsa -b 521 kildclient-3.2.0/win32/mingw32-kildclient-docker/macros.image-language-conf0000644000175000017500000000005013217767534023402 00000000000000%_install_langs en_US:pt_BR:eo:es:de:sv kildclient-3.2.0/win32/mingw32-kildclient-docker/entrypoint.sh0000755000175000017500000000041513217747640021161 00000000000000#!/bin/sh ssh-keygen -f /etc/ssh/ssh_host_rsa_key -N '' -t rsa ssh-keygen -f /etc/ssh/ssh_host_dsa_key -N '' -t dsa ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key -N '' -t ecdsa -b 521 ssh-keygen -f /etc/ssh/ssh_host_ed25519_key -N '' -t ed25519 /usr/sbin/sshd exec "$@" kildclient-3.2.0/win32/README.old0000644000175000017500000000525112374460043013164 00000000000000(This instructions are outdated, as I have switched to cross-compiling KildClient. The basic idea should still work, though, provided one can find newer versions of the necessary packages (at the time of this writing, the latest GTK+ package for Windows is too old).) Building 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-3.2.0/win32/README.windows0000644000175000017500000000476213217751247014114 00000000000000Cross-Compiling KildClient for Windows ====================================== Basic packages -------------- The easiest way is to use Fedora, because it already includes most of the dependencies, with new enough versions, cross-compiled as rpm packages. Packages necessary for cross-compilation: mingw32-gcc mingw32-gnutls mingw32-gtk3 mingw32-gtkspell3 mingw32-libgnurx perl-XML-LibXML If building from git, you'll also need autoconf, automake and glib2-devel. (Just as for normal compilation.) You'll also need perl-JSON when building the installer. Perl ---- Unfortunately, perl is not packaged for mingw32. Strawberry Perl can be used. Extract it in a directory, then pass that directory to the configure script, as shown below. Dockerfile for building ----------------------- The directory mingw32-kildclient-docker contains a Dockerfile to build an image with a fedora system and all packages necessary for compilation. The image also starts and ssh server. That way it is possible to mount via sshfs the directories in the fedora system so that the installer can copy the required files. Building -------- To run the configure script, use mingw32-configure which sets proper environment variables for cross compilation, passing the path for Perl manually: mingw32-configure KILDCLIENT_PERL_CFLAGS="-I/opt/strawberryperl/perl/lib/CORE" KILDCLIENT_PERL_LIBS="-L/opt/strawberryperl/perl/lib/CORE -lperl526" Then just run make. Creating a installer -------------------- Several files are necessary for KildClient to run, besides the generated .exe file. Therefore, 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. When downloading, check "Install Inno Setup Preprocessor" as the script uses this feature. You will need to adjust the paths defined in the beginning of the file. Inno Setup should run under Wine, thus completely eliminating the need for a Windows machine, but I haven't tried it, instead I run it in a virtual machine. To access the files from the build system under Windows, I use the sshfs client from https://igikorn.com/sshfs-windows-10/ 64-bit support ============== I haven't tried building KildClient for 64-bit versions of Windows, but it should work, since Fedora includes all the necessary packages built for the 64-bit target, and Strawberry Perl also has a 64-bit version of Perl. kildclient-3.2.0/AUTHORS0000644000175000017500000000051011715730227011630 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 kildclient-3.2.0/Makefile.am0000644000175000017500000000055313215302470012613 00000000000000if 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 = kildclient.spec \ kildclient.desktop \ win32/* kildclient-3.2.0/doc/0000755000175000017500000000000013220232034011373 500000000000000kildclient-3.2.0/doc/Makefile.am0000644000175000017500000000010513215302470013351 00000000000000SUBDIRS = C EXTRA_DIST = kildclient-html.xsl \ kildclient.css kildclient-3.2.0/doc/kildclient-html.xsl0000644000175000017500000000202113215302470015130 00000000000000 kildclient/ .xhtml UTF-8 kildclient.css dl ansi kildclient-3.2.0/doc/C/0000755000175000017500000000000013220232035011556 500000000000000kildclient-3.2.0/doc/C/kildclient/0000755000175000017500000000000013220232035013700 500000000000000kildclient-3.2.0/doc/C/kildclient/sec_trigger_cmdline.xhtml0000644000175000017500000004415213220174377020712 00000000000000 8.6. 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, “A very simple trigger” 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, “A simple gag”):

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, Logging the Output), 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, “Other trigger features”). 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, “Rewriter Triggers”) 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, “A very simple trigger defined in the command line” 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 PreferencesDisable 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, “Editing Triggers”, 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-3.2.0/doc/C/kildclient/func_world_send.xhtml0000644000175000017500000000573713220174401020067 00000000000000 C.76. $world->send

C.76. $world->send

Abstract

$world->send function: SENDs something to the world

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-3.2.0/doc/C/kildclient/sec_macro_cmdline.xhtml0000644000175000017500000002762413220174400020340 00000000000000 10.2. 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 PreferencesDisable 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, “Editing Macros”, 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-3.2.0/doc/C/kildclient/func_world_getentryfont.xhtml0000644000175000017500000000506013220174401021653 00000000000000 C.34.  $world->getentryfont

C.34.  $world->getentryfont

Abstract

$world->getentryfont function: GETs the command ENTRY box FONT

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

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

kildclient-3.2.0/doc/C/kildclient/func_world_silentenahook.xhtml0000644000175000017500000000554113220174402021773 00000000000000 C.91. $world->silentenahook

C.91. $world->silentenahook

Abstract

$world->silentenahook function: SILENTly ENAbles a HOOK

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

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. Does not print a message in the screen in case of success.

kildclient-3.2.0/doc/C/kildclient/apes06.xhtml0000644000175000017500000001311313220174402015776 00000000000000 E.6. Using GTK+ From Plugins

E.6. Using GTK+ From Plugins

With the use of the gtk3-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 gtk3-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 Gtk3 -init;". Create windows and display them as usual. The biggest difference is that you must not call Gtk3->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 Gtk3->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 gtk3-modules (this includes modules for the base libraries Glib and GDK, and also for other libraries such as the Gnome ones). Notably, Gtk3::Builder is supported, which allows you to create complex user interfaces visually and load them from the .ui file in the plugin.

Note that having the gtk3-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 Gtk3 -init;" line).

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

Example E.4. A plugin that uses gtk3-perl
package gtksample;
#: Version: 1.0.0
#: Description: A Plugin Using gtk3-perl
#: Author: Eduardo M Kalinowski

use Gtk3 -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 gtk3-perl under KildClient.",
                   "It does nothing really useful.",
                   "",
                   "Enter /gtksample::run to try it.");
}


sub run {
  return if $window_displayed;

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

  my $vbox = Gtk3::Box->new('vertical', 8);

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

  $button = Gtk3::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 gtk3-perl, see https://metacpan.org/release/Gtk3/.

kildclient-3.2.0/doc/C/kildclient/apc.xhtml0000644000175000017500000003742013220174402015452 00000000000000 Appendix C. $world Reference

$world Reference

Table of Contents
C.1. $world->{SILENT}
C.2. $world->alias
C.3. $world->aliasenabled
C.4. $world->close
C.5. $world->cmdseparator
C.6. $world->commandecho
C.7. $world->connectother
C.8. $world->dc
C.9. $world->delalias
C.10. $world->delhook
C.11. $world->delmacro
C.12. $world->deltimer
C.13. $world->deltrigger
C.14. $world->disalias
C.15. $world->dishook
C.16. $world->dismacro
C.17. $world->displugin
C.18. $world->distimer
C.19. $world->distrigger
C.20. $world->echo
C.21. $world->echonl
C.22. $world->echonlandlog
C.23. $world->enaalias
C.24. $world->enahook
C.25. $world->enamacro
C.26. $world->enaplugin
C.27. $world->enatimer
C.28. $world->enatrigger
C.29. $world->expandalias
C.30. $world->gag
C.31. $world->getaliasnumber
C.32. $world->getcharacter
C.33. $world->getconntime
C.34. $world->getentryfont
C.35. $world->gethooknumber
C.36. $world->getidletime
C.37. $world->getinput
C.38. $world->getkeycode
C.39. $world->getline
C.40. $world->getlogfile
C.41. $world->getmacronumber
C.42. $world->getmainfont
C.43. $world->getname
C.44. $world->getpluginversion
C.45. $world->gettimernumber
C.46. $world->gettriggernumber
C.47. $world->hook
C.48. $world->hookenabled
C.49. $world->interpret
C.50. $world->ispermanent
C.51. $world->listalias
C.52. $world->listhook
C.53. $world->listmacro
C.54. $world->listpermanent
C.55. $world->listplugin
C.56. $world->listtimer
C.57. $world->listtrigger
C.58. $world->loadplugin
C.59. $world->logfile
C.60. $world->macro
C.61. $world->macroenabled
C.62. $world->makepermanent
C.63. $world->maketemporary
C.64. $world->mlsend
C.65. $world->movealias
C.66. $world->movehook
C.67. $world->movemacro
C.68. $world->movetimer
C.69. $world->movetrigger
C.70. $world->next
C.71. $world->path
C.72. $world->prev
C.73. $world->reconnect
C.74. $world->requireplugin
C.75. $world->save
C.76. $world->send
C.77. $world->sendecho
C.78. $world->sendfile
C.79. $world->sendlines
C.80. $world->sendmsdpcommand
C.81. $world->sendnoecho
C.82. $world->sendserverdata
C.83. $world->setinput
C.84. $world->setstatus
C.85. $world->silentdisalias
C.86. $world->silentdishook
C.87. $world->silentdismacro
C.88. $world->silentdistimer
C.89. $world->silentdistrigger
C.90. $world->silentenaalias
C.91. $world->silentenahook
C.92. $world->silentenamacro
C.93. $world->silentenatimer
C.94. $world->silentenatrigger
C.95. $world->timer
C.96. $world->timerenabled
C.97. $world->trigger
C.98. $world->triggerenabled
C.99. $world->writetolog

$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 only exception is the $world->{SILENT} variable.

The sections below describe the variables and attributes available for the $world variable.

kildclient-3.2.0/doc/C/kildclient/ch08s04.xhtml0000644000175000017500000001352513220174377016013 00000000000000 8.4. 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, Logging the Output), 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-3.2.0/doc/C/kildclient/func_world_mlsend.xhtml0000644000175000017500000001433013220174401020405 00000000000000 C.64. $world->mlsend

C.64. $world->mlsend

Abstract

$world->mlsend function: Multi-Line SEND

$success = $world->mlsend( attributes );
 

This function emulates the Multi-line Send feature (see Section 6.3.5, “Multi-line Send”) 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, “Sending”).

  • 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, “Sending”).

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-3.2.0/doc/C/kildclient/func_world_silentenamacro.xhtml0000644000175000017500000000541213220174402022131 00000000000000 C.92. $world->silentenamacro

C.92. $world->silentenamacro

Abstract

$world->silentenamacro function: SILENTly ENAbles a MACRO

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

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. Does not print a message in the screen in case of success.

kildclient-3.2.0/doc/C/kildclient/sec_pref_progs.xhtml0000644000175000017500000000556713220174377017731 00000000000000 5.3. 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
The External Programs section of the Preferences dialog.

In this section you can set a command used to play audio files (see Section 7.3, “Playing Sounds”). 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.

Previously it was also possible to define a command to run a web browser. This option has been removed, and the default browser is now used instead.

kildclient-3.2.0/doc/C/kildclient/ch06s05.xhtml0000644000175000017500000000427413220174377016013 00000000000000 6.5. 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, “Reviewing and Searching Text”.

kildclient-3.2.0/doc/C/kildclient/ch12s01.xhtml0000644000175000017500000001552113220174400015764 00000000000000 12.1. Creating and Editing Hooks

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, Editing a World).

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
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, “Editing Hooks”). 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
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, “Defining Hooks in the Command Line”. 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, “Adding Hooks”) 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.7, “Advanced”. 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-3.2.0/doc/C/kildclient/func_world_hook.xhtml0000644000175000017500000001344113220174401020065 00000000000000 C.47. $world->hook

C.47. $world->hook

Abstract

$world->hook function: connects a 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 function 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 WorldClose 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-3.2.0/doc/C/kildclient/func_stripansi.xhtml0000644000175000017500000000456513220174400017740 00000000000000 A.9. stripansi

A.9. stripansi

Abstract

stripansi function: STRIPs ANSI sequences from the string

$stripped = stripansi( str );
 

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

kildclient-3.2.0/doc/C/kildclient/func_help.xhtml0000644000175000017500000000450513220174400016646 00000000000000 A.6. help

A.6. help

Abstract

help function: displays 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-3.2.0/doc/C/kildclient/func_world_silentenatimer.xhtml0000644000175000017500000000543613220174402022156 00000000000000 C.93. $world->silentenatimer

C.93. $world->silentenatimer

Abstract

$world->silentenatimer function: SILENTly ENAbles a TIMER

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

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. Does not print a message in the screen in case of success.

kildclient-3.2.0/doc/C/kildclient/func_world_enatimer.xhtml0000644000175000017500000000517713220174401020740 00000000000000 C.27. $world->enatimer

C.27. $world->enatimer

Abstract

$world->enatimer function: ENAbles a TIMER

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

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-3.2.0/doc/C/kildclient/chap_logging.xhtml0000644000175000017500000001006413220174400017321 00000000000000 Chapter 14. Logging the Output

Chapter 14. Logging the Output

Logging can be configured in the World Editor, see Section 4.4, “Logging”, 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, “General”). (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-3.2.0/doc/C/kildclient/chap_plugins.xhtml0000644000175000017500000001334713220174400017363 00000000000000 Chapter 13. 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, Editing a World). Open the World Editor, and select the Plugins section inside Automation. You will see a screen like this:

Figure 13.1. 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.

kildclient-3.2.0/doc/C/kildclient/sec_we_input.xhtml0000644000175000017500000001531413220174377017404 00000000000000 4.3. 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 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, “Interacting with the MUD”) 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. Select the language used for spelling from the list of available choices.

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-3.2.0/doc/C/kildclient/apes05.xhtml0000644000175000017500000001071713220174402016004 00000000000000 E.5. 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 sec_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-3.2.0/doc/C/kildclient/apes03.xhtml0000644000175000017500000000437013220174402016000 00000000000000 E.3. 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-3.2.0/doc/C/kildclient/func_world_sendmsdpcommand.xhtml0000644000175000017500000000544313220174401022304 00000000000000 C.80.  $world->sendmsdpcommand

C.80.  $world->sendmsdpcommand

Abstract

$world->sendmsdpcommand function: SENDs an MSDP protocol COMMAND

void $world->sendmsdpcommand( command ,
  argument1 ,
  ... );
 

Sends a specific type of data to the server using MSDP. See Section 16.2.1, “MSDP data”.

kildclient-3.2.0/doc/C/kildclient/func_world_prev.xhtml0000644000175000017500000000550113220174401020077 00000000000000 C.72.  $world->prev

C.72.  $world->prev

Abstract

$world->prev function: goes to the PREVious world

void $world->prev(void); 
 

When called without arguments, this function focuses the previous open world.

void $world->prev( number );
 

When called with a numeric argument X, it focuses the Xth world before the current one.

kildclient-3.2.0/doc/C/kildclient/func_world_echonlandlog.xhtml0000644000175000017500000000557613220174401021574 00000000000000 C.22. $world->echonlandlog

C.22. $world->echonlandlog

Abstract

$world->echonlandlog function: calls ECHONL and writetoLOG

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-3.2.0/doc/C/kildclient/sec_interacting.xhtml0000644000175000017500000002117513220174377020063 00000000000000 3.2. 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
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, “Input”.

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, Using Perl in KildClient. 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, “Input”.

kildclient-3.2.0/doc/C/kildclient/func_world_getlogfile.xhtml0000644000175000017500000000513313220174401021245 00000000000000 C.40.  $world->getlogfile

C.40.  $world->getlogfile

Abstract

$world->getlogfile: GETs name of LOGging FILE

$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-3.2.0/doc/C/kildclient/func_world_writetolog.xhtml0000644000175000017500000000614213220174402021325 00000000000000 C.99. $world->writetolog

C.99. $world->writetolog

Abstract

$world->writetolog function: WRITEs something TO the LOG file

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-3.2.0/doc/C/kildclient/ch13s01.xhtml0000644000175000017500000001124013220174400015757 00000000000000 13.1. Loading Plugins from the Command Line

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, “Scripting”.

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-3.2.0/doc/C/kildclient/sec_searching.xhtml0000644000175000017500000001245413220174377017517 00000000000000 3.4. Reviewing and Searching Text

3.4. Reviewing and Searching Text

Figure 3.3. 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 Section 4.2.1, “Main Window”). 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 DisplaySplit 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 EditFind 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 EditFind 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 EditFind 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-3.2.0/doc/C/kildclient/func_world_gettriggernumber.xhtml0000644000175000017500000000571613220174401022507 00000000000000 C.46.  $world->gettriggernumber

C.46.  $world->gettriggernumber

Abstract

$world->gettriggernumber function: GETs a TRIGGER's NUMBER

@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-3.2.0/doc/C/kildclient/func_world_silentenaalias.xhtml0000644000175000017500000000543313220174402022124 00000000000000 C.90. $world->silentenaalias

C.90. $world->silentenaalias

Abstract

$world->silentenaalias function: SILENTly ENAbles an ALIAS

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

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. Does not print a message in the screen in case of success.

kildclient-3.2.0/doc/C/kildclient/sec_test_triggers.xhtml0000644000175000017500000000751713220174377020445 00000000000000 8.8. 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 InputTest 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
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-3.2.0/doc/C/kildclient/apb.xhtml0000644000175000017500000000562113220174400015445 00000000000000 Appendix B. $window Reference

$window Reference

$window 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.

kildclient-3.2.0/doc/C/kildclient/func_world_getmainfont.xhtml0000644000175000017500000000507713220174401021446 00000000000000 C.42.  $world->getmainfont

C.42.  $world->getmainfont

Abstract

$world->getname function: GETs the MAIN window FONT

$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-3.2.0/doc/C/kildclient/ch10s01.xhtml0000644000175000017500000001636613220174400015772 00000000000000 10.1. Creating and Editing Macros

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, Editing a World).

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 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, “Editing Macros”). 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.7, “Advanced” 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
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, “Defining Macros in the Command Line”. 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, “Adding Macros”) 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.7, “Advanced”. 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-3.2.0/doc/C/kildclient/apds01.xhtml0000644000175000017500000000425613220174402016000 00000000000000 D.1. Changes from Previous Versions

D.1. Changes from Previous Versions

KCWin version 2.x was based on the gtk2-perl bindings, for GTK+ 2.x. KCWin 3.x is based on gtk3-perl, just as KildClient 3.x uses GTK+ 3.x. If your plugin uses GTK+ functions directly, you'll have to convert it to use gtk3-perl.

kildclient-3.2.0/doc/C/kildclient/func_world_dishook.xhtml0000644000175000017500000000530013220174401020560 00000000000000 C.15. $world->dishook

C.15. $world->dishook

Abstract

$world->dishook function: DISables a HOOK

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

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-3.2.0/doc/C/kildclient/chap_aliases.xhtml0000644000175000017500000001273513220174400017323 00000000000000 Chapter 9. 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 PreferencesDebug 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.)

kildclient-3.2.0/doc/C/kildclient/func_world_getname.xhtml0000644000175000017500000000477413220174401020556 00000000000000 C.43.  $world->getname

C.43.  $world->getname

Abstract

$world->getname function: GETs the NAME of the world

$name = $world->getname(void); 
 

This function returns the name of the world.

kildclient-3.2.0/doc/C/kildclient/func_world_expandalias.xhtml0000644000175000017500000000540413220174401021416 00000000000000 C.29.  $world->expandalias

C.29.  $world->expandalias

Abstract

$world->expandalias function: EXPANDs ALIASes in a string

$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-3.2.0/doc/C/kildclient/sec_perl_basics.xhtml0000644000175000017500000001651313220174377020042 00000000000000 7.1. The Basics

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.

To send a line that starts with a / to the MUD, use two slases: typing //info sends /info to the MUD.

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, Global Function Reference, 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, “Scripting” 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-3.2.0/doc/C/kildclient/func_world_triggerenabled.xhtml0000644000175000017500000000651413220174402022107 00000000000000 C.98.  $world->triggerenabled

C.98.  $world->triggerenabled

Abstract

$world->triggerenabled function: checks whether a TRIGGER is ENABLED

$result = $world->triggerenabled( name );
 
$result = $world->triggerenabled( 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.

kildclient-3.2.0/doc/C/kildclient/chap_triggers.xhtml0000644000175000017500000001177213220174377017545 00000000000000 Chapter 8. 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.

kildclient-3.2.0/doc/C/kildclient/sec_timer_cmdline.xhtml0000644000175000017500000002721613220174400020354 00000000000000 11.2. 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 PreferencesDisable 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, “Editing Timers”, 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-3.2.0/doc/C/kildclient/ch09s02.xhtml0000644000175000017500000002011713220174400015770 00000000000000 9.2. Using Aliases

9.2. Using Aliases

In Chapter 9, Aliases 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, “Adding Aliases”, 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-3.2.0/doc/C/kildclient/func_world_movetimer.xhtml0000644000175000017500000000642613220174401021141 00000000000000 C.68.  $world->movetimer

C.68.  $world->movetimer

Abstract

$world->movetimer function: MOVEs a TIMER to another position

void $world->movetimer( name ,
  new_pos );
 
void $world->movetimer( number ,
  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-3.2.0/doc/C/kildclient/func_world_listtrigger.xhtml0000644000175000017500000000577113220174401021473 00000000000000 C.57.  $world->listtrigger

C.57.  $world->listtrigger

Abstract

$world->listtrigger function: LISTs one or all TRIGGERs

void $world->listtrigger(void); 
 

Briefly lists all defined triggers.

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

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-3.2.0/doc/C/kildclient/sec_sounds.xhtml0000644000175000017500000000450713220174377017067 00000000000000 7.3. 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, “External Programs (Linux)”.

kildclient-3.2.0/doc/C/kildclient/func_world_distimer.xhtml0000644000175000017500000000520213220174401020741 00000000000000 C.18. $world->distimer

C.18. $world->distimer

Abstract

$world->distimer function: DISables a TIMER

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

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-3.2.0/doc/C/kildclient/sec_pref_sending.xhtml0000644000175000017500000000564213220174377020220 00000000000000 5.2. 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
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, “Command History”) and Multi-line Send (Section 6.3.5, “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.

kildclient-3.2.0/doc/C/kildclient/func_world_logfile.xhtml0000644000175000017500000000671013220174401020547 00000000000000 C.59.  $world->logfile

C.59.  $world->logfile

Abstract

logfile function: enables or disables LOGging the output to a FILE

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-3.2.0/doc/C/kildclient/apes01.xhtml0000644000175000017500000000712413220174402015776 00000000000000 E.1. The File Format

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, “The Plugin Header”.

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-3.2.0/doc/C/kildclient/func_world_gettimernumber.xhtml0000644000175000017500000000577213220174401022166 00000000000000 C.45.  $world->gettimernumber

C.45.  $world->gettimernumber

Abstract

$world->gettimernumber function: GETs a TIMER's NUMBER

@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-3.2.0/doc/C/kildclient/ch11.xhtml0000644000175000017500000000776213220174400015447 00000000000000 Chapter 11. 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.

kildclient-3.2.0/doc/C/kildclient/func_world_enaplugin.xhtml0000644000175000017500000000465213220174401021113 00000000000000 C.26. $world->enaplugin

C.26. $world->enaplugin

Abstract

$world->enaplugin: ENAbles a PLUGIN

void $world->enaplugin( name );
 

Enables the specified plugin.

kildclient-3.2.0/doc/C/kildclient/ch15s01.xhtml0000644000175000017500000001141513220174400015765 00000000000000 15.1. Basic Usage

15.1. Basic Usage

The chat plugin requires the Gtk3 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, download them here.

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-3.2.0/doc/C/kildclient/func_world_macroenabled.xhtml0000644000175000017500000000646613220174401021552 00000000000000 C.61.  $world->macroenabled

C.61.  $world->macroenabled

Abstract

$world->macroenabled function: checks whether a MACRO is ENABLED

$result = $world->macroenabled( name );
 
$result = $world->macroenabled( 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.

kildclient-3.2.0/doc/C/kildclient/func_world_maketemporary.xhtml0000644000175000017500000000632213220174401022005 00000000000000 C.63.  $world->maketemporary

C.63.  $world->maketemporary

Abstract

$world->maketemporary function: MAKEs variables TEMPORARY

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-3.2.0/doc/C/kildclient/func_world_getmacronumber.xhtml0000644000175000017500000000570613220174401022144 00000000000000 C.41.  $world->getmacronumber

C.41.  $world->getmacronumber

Abstract

$world->getmacronumber function: GETs a MACRO's NUMBER

@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-3.2.0/doc/C/kildclient/docbook.css0000644000175000017500000000306113220174402015755 00000000000000 /********************************/ /* start of styles in block.xsl */ .formalpara-title { font-weight: bold; } div.blockquote-title { font-weight: bold; margin-top: 1em; margin-bottom: 1em; } span.msgmain-title { font-weight: bold; } span.msgsub-title { font-weight: bold; } span.msgrel-title { font-weight: bold; } div.msglevel, div.msgorig, div.msgaud { margin-top: 1em; margin-bottom: 1em; } span.msglevel-title, span.msgorig-title, span.msgaud-title { font-weight: bold; } div.msgexplan { margin-top: 1em; margin-bottom: 1em; } span.msgexplan-title { font-weight: bold; } /* end of styles in block.xsl */ /********************************/ /********************************/ /* start of styles in autotoc.xsl */ /* end of styles in autotoc.xsl */ /********************************/ /********************************/ /* start of styles in formal.xsl */ div.figure-title { font-weight: bold; } div.example-title { font-weight: bold; } div.equation-title { font-weight: bold; } div.table-title { font-weight: bold; } div.sidebar-title { font-weight: bold; } /* end of styles in formal.xsl */ /********************************/ /********************************/ /* start of styles in verbatim.xsl */ div.programlisting { white-space: pre; font-family: monospace; } div.screen { white-space: pre; font-family: monospace; } div.synopsis { white-space: pre; font-family: monospace; } /* end of styles in verbatim.xsl */ /********************************/ /* footnote rule */ hr.footnote-hr { width: 100; } kildclient-3.2.0/doc/C/kildclient/func_world_listtimer.xhtml0000644000175000017500000000575413220174401021151 00000000000000 C.56.  $world->listtimer

C.56.  $world->listtimer

Abstract

$world->listimer function: LISTs one or all TIMERs

void $world->listtimer(void); 
 

Briefly lists all defined timers.

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

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-3.2.0/doc/C/kildclient/ch08s01.xhtml0000644000175000017500000002056713220174377016014 00000000000000 8.1. Creating and Editing 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, Editing a World).

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 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, “Editing Triggers”). 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, Logging the Output).

  • 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, “Rewriter Triggers”.

  • 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.7, “Advanced” 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
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, “Adding Triggers”) 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.7, “Advanced”), 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-3.2.0/doc/C/kildclient/func_world_commandecho.xhtml0000644000175000017500000000631313220174401021402 00000000000000 C.6.  $world->commandecho

C.6.  $world->commandecho

Abstract

$world->commandecho function: sets or gets the status of the COMMAND ECHO feature

void $world->commandecho( boolean );
 

When called 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.3, “Input”.

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

When called without arguments, it returns its current value of the command echo option.

kildclient-3.2.0/doc/C/kildclient/func_world_listalias.xhtml0000644000175000017500000000574613220174401021123 00000000000000 C.51.  $world->listalias

C.51.  $world->listalias

Abstract

$world->listalias function: LISTs one or all ALIASes

void $world->listalias(void); 
 

Briefly lists all defined aliases.

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

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-3.2.0/doc/C/kildclient/ch07s04.xhtml0000644000175000017500000001263413220174377016012 00000000000000 7.4. 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, Editing a World) 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
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-3.2.0/doc/C/kildclient/func_play.xhtml0000644000175000017500000000443013220174400016660 00000000000000 A.7. play

A.7. play

Abstract

play function: PLAYs a sound file

void play( file );
 

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

kildclient-3.2.0/doc/C/kildclient/func_world_silentdisalias.xhtml0000644000175000017500000000537313220174401022142 00000000000000 C.85. $world->silentdisalias

C.85. $world->silentdisalias

Abstract

$world->silentdisalias function: SILENTly DISables an ALIAS

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

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. Does not print a message in the screen in case of success.

kildclient-3.2.0/doc/C/kildclient/func_world_listplugin.xhtml0000644000175000017500000000611213220174401021314 00000000000000 C.55.  $world->listplugin

C.55.  $world->listplugin

Abstract

$world->listplugin function: LISTs loaded PLUGINs

void $world->listplugin(void); 
 

Briefly lists all loaded plugins.

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

Gives detailed information on the given plugin.

kildclient-3.2.0/doc/C/kildclient/func_world_delhook.xhtml0000644000175000017500000000570613220174401020557 00000000000000 C.10. $world->delhook

C.10. $world->delhook

Abstract

$world->delhook function: DELetes a HOOK

$n = $world->delhook( event ,
  name );
 
$n = $world->delhook( event ,
  number );
 

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-3.2.0/doc/C/kildclient/func_world_reconnect.xhtml0000644000175000017500000000476013220174401021111 00000000000000 C.73.  $world->reconnect

C.73.  $world->reconnect

Abstract

$world->reconnect function: RECONNECTs to the world

void $world->reconnect(void); 
 

When in offline mode, this function will attempt to reconnect to the mud.

kildclient-3.2.0/doc/C/kildclient/func_world_ispermanent.xhtml0000644000175000017500000000556613220174401021463 00000000000000 C.50.  $world->ispermanent

C.50.  $world->ispermanent

Abstract

$world->ispermanent function: checks wheter a variable IS PERMANENT

$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-3.2.0/doc/C/kildclient/ch06s01.xhtml0000644000175000017500000001260613220174377016005 00000000000000 6.1. World menu

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, “Connecting to a MUD” 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, “Connecting to a MUD”) 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, Editing a World.

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 you are connected using SSL (see Section 4.1, “General”), 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, Hooks), they are executed. If there is at least one open world without such hook, you are asked for confirmation first.

kildclient-3.2.0/doc/C/kildclient/func_world_getcharacter.xhtml0000644000175000017500000000542213220174401021561 00000000000000 C.32.  $world->getcharacter

C.32.  $world->getcharacter

Abstract

$world->getcharacter function: GETs the name of the connected CHARACTER

$name = $world->getcharacter(void); 
 

If autologin was used (see Section 4.1, “General”), this function returns the name of the character used to log in to the mud. If autologin is disabled, this function returns undef.

kildclient-3.2.0/doc/C/kildclient/func_world_enamacro.xhtml0000644000175000017500000000515313220174401020713 00000000000000 C.25. $world->enamacro

C.25. $world->enamacro

Abstract

$world->enamacro function: ENAbles a MACRO

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

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-3.2.0/doc/C/kildclient/func_world_delalias.xhtml0000644000175000017500000000542213220174401020703 00000000000000 C.9. $world->delalias

C.9. $world->delalias

Abstract

$world->delalias function: DELETEs an ALIAS

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

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-3.2.0/doc/C/kildclient/func_world_silentdistrigger.xhtml0000644000175000017500000000545513220174402022516 00000000000000 C.89.  $world->silentdistrigger

C.89.  $world->silentdistrigger

Abstract

$world->silentdistrigger function: SILENTly DISables a TRIGGER

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

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. Does not print a message in the screen in case of success.

kildclient-3.2.0/doc/C/kildclient/ch01.xhtml0000644000175000017500000000561613220174377015457 00000000000000 Chapter 1. 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-3.2.0/doc/C/kildclient/sec_alias_cmdline.xhtml0000644000175000017500000003053113220174400020317 00000000000000 9.3. 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, Triggers).

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, “A simple alias” 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, “Defining Triggers in the Command Line”), 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, “An alias whose substitution is evaluated:” 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 PreferencesDisable 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, “Editing Aliases”, 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-3.2.0/doc/C/kildclient/apes04.xhtml0000644000175000017500000000664313220174402016006 00000000000000 E.4. Enabling and Disabling Plugins

E.4. Enabling and Disabling Plugins

As described in Chapter 13, Plugins, 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-3.2.0/doc/C/kildclient/apes02.xhtml0000644000175000017500000001071513220174402015777 00000000000000 E.2. 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-3.2.0/doc/C/kildclient/ch06s06.xhtml0000644000175000017500000000426513220174377016014 00000000000000 6.6. 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-3.2.0/doc/C/kildclient/ape.xhtml0000644000175000017500000000654313220174402015456 00000000000000 Appendix E. Writing Plugins

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.

kildclient-3.2.0/doc/C/kildclient/func_getclientname.xhtml0000644000175000017500000000456613220174400020544 00000000000000 A.2. getclientname

A.2. getclientname

Abstract

getclientname function: GETs the CLIENT's NAME

$name = getclientname(void); 
 

This function returns the name of the client, that is, "KildClient".

kildclient-3.2.0/doc/C/kildclient/ch11s01.xhtml0000644000175000017500000001704413220174400015765 00000000000000 11.1. Creating and Editing Timers

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, Editing a World).

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 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, “Editing Timers”). Assigning a name to a timer is optional.

  • Interval is the interval between timer activations, as described above. Fractions of seconds are allowed: an interval of 0.5 means a timer that fires each half-second.

  • 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.7, “Advanced” 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
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, “Defining Timers in the Command Line”. 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, “Adding Timers”) 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.7, “Advanced”. 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-3.2.0/doc/C/kildclient/func_window_settitle.xhtml0000644000175000017500000000476313220174400021150 00000000000000 B.3. $window->settitle

B.3. $window->settitle

Abstract

$window->settitle function: SETs the window TITLE

void $window->settitle( new title );
 

Sets the title of the window to the given string.

kildclient-3.2.0/doc/C/kildclient/func_world_movehook.xhtml0000644000175000017500000000663013220174401020756 00000000000000 C.66.  $world->movehook

C.66.  $world->movehook

Abstract

$world->movehook function: MOVEs a HOOK to another position

void $world->movehook( event ,
  name ,
  new_pos );
 
void $world->movehook( event ,
  number ,
  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-3.2.0/doc/C/kildclient/app_KCWin.xhtml0000644000175000017500000001266513220174402016526 00000000000000 Appendix D. Using KCWin for Input/Output Windows

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 gtk3-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, “Plugins That Require Other Plugins”.

Use KCWin->new to create a new window. KCWin derives from Gtk3::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}, Gtk3::Box, the vertical box that contains the output and input areas.

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

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

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

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

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

  • $kcw->{ENTRY}, Gtk3::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.

kildclient-3.2.0/doc/C/kildclient/func_world_sendserverdata.xhtml0000644000175000017500000000524413220174401022141 00000000000000 C.82.  $world->sendserverdata

C.82.  $world->sendserverdata

Abstract

$world->sendserverdata function: SENDs out-of-band DATA to the SERVER

void $world->sendserverdata( hash_reference );
 

Sens out-of-band data to the server. See Section 16.2, “Sending server data” for details.

kildclient-3.2.0/doc/C/kildclient/index.xhtml0000644000175000017500000012003613220174402016012 00000000000000 KildClient Manual

KildClient Manual

Version 3.2.0

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.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. 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
16. Out-of-band server data
16.1. Receiving server data
16.1.1. GMCP data
16.2. Sending server data
16.2.1. MSDP data
II. KildClient Programmer's Reference
A. Global Function Reference
A.1. colorize
A.2. getclientname
A.3. getversion
A.4. getworld
A.5. gotow
A.6. help
A.7. play
A.8. quit
A.9. stripansi
A.10. stripcolorize
B. $window Reference
B.1. $window->getsize
B.2. $window->minimize
B.3. $window->settitle
B.4. $window->seturgencyhint
C. $world Reference
C.1. $world->{SILENT}
C.2. $world->alias
C.3. $world->aliasenabled
C.4. $world->close
C.5. $world->cmdseparator
C.6. $world->commandecho
C.7. $world->connectother
C.8. $world->dc
C.9. $world->delalias
C.10. $world->delhook
C.11. $world->delmacro
C.12. $world->deltimer
C.13. $world->deltrigger
C.14. $world->disalias
C.15. $world->dishook
C.16. $world->dismacro
C.17. $world->displugin
C.18. $world->distimer
C.19. $world->distrigger
C.20. $world->echo
C.21. $world->echonl
C.22. $world->echonlandlog
C.23. $world->enaalias
C.24. $world->enahook
C.25. $world->enamacro
C.26. $world->enaplugin
C.27. $world->enatimer
C.28. $world->enatrigger
C.29. $world->expandalias
C.30. $world->gag
C.31. $world->getaliasnumber
C.32. $world->getcharacter
C.33. $world->getconntime
C.34. $world->getentryfont
C.35. $world->gethooknumber
C.36. $world->getidletime
C.37. $world->getinput
C.38. $world->getkeycode
C.39. $world->getline
C.40. $world->getlogfile
C.41. $world->getmacronumber
C.42. $world->getmainfont
C.43. $world->getname
C.44. $world->getpluginversion
C.45. $world->gettimernumber
C.46. $world->gettriggernumber
C.47. $world->hook
C.48. $world->hookenabled
C.49. $world->interpret
C.50. $world->ispermanent
C.51. $world->listalias
C.52. $world->listhook
C.53. $world->listmacro
C.54. $world->listpermanent
C.55. $world->listplugin
C.56. $world->listtimer
C.57. $world->listtrigger
C.58. $world->loadplugin
C.59. $world->logfile
C.60. $world->macro
C.61. $world->macroenabled
C.62. $world->makepermanent
C.63. $world->maketemporary
C.64. $world->mlsend
C.65. $world->movealias
C.66. $world->movehook
C.67. $world->movemacro
C.68. $world->movetimer
C.69. $world->movetrigger
C.70. $world->next
C.71. $world->path
C.72. $world->prev
C.73. $world->reconnect
C.74. $world->requireplugin
C.75. $world->save
C.76. $world->send
C.77. $world->sendecho
C.78. $world->sendfile
C.79. $world->sendlines
C.80. $world->sendmsdpcommand
C.81. $world->sendnoecho
C.82. $world->sendserverdata
C.83. $world->setinput
C.84. $world->setstatus
C.85. $world->silentdisalias
C.86. $world->silentdishook
C.87. $world->silentdismacro
C.88. $world->silentdistimer
C.89. $world->silentdistrigger
C.90. $world->silentenaalias
C.91. $world->silentenahook
C.92. $world->silentenamacro
C.93. $world->silentenatimer
C.94. $world->silentenatrigger
C.95. $world->timer
C.96. $world->timerenabled
C.97. $world->trigger
C.98. $world->triggerenabled
C.99. $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
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
16.1. A GMCP request
16.2. A MSDP request
16.3. Message sent via MSDP
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 gtk3-perl
kildclient-3.2.0/doc/C/kildclient/func_world_alias.xhtml0000644000175000017500000001146213220174400020216 00000000000000 C.2. $world->alias

C.2. $world->alias

Abstract

$world->alias function: creates an 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", "substitution", { 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-3.2.0/doc/C/kildclient/func_world_getconntime.xhtml0000644000175000017500000000504513220174401021442 00000000000000 C.33.  $world->getconntime

C.33.  $world->getconntime

Abstract

$world->getconntime function: GETs the CONNection TIME

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

This function returns the time spent connected to the world, in seconds.

kildclient-3.2.0/doc/C/kildclient/func_KCWin_feed.xhtml0000644000175000017500000000506013220174402017653 00000000000000 D.4. KCWin::feed

D.4. KCWin::feed

Abstract

KCWin::feed function: FEEDs TEXT to the window

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-3.2.0/doc/C/kildclient/func_world_echo.xhtml0000644000175000017500000000545313220174401020047 00000000000000 C.20. $world->echo

C.20. $world->echo

Abstract

$world->echo function: ECHOes something to the terminal window

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-3.2.0/doc/C/kildclient/func_world_sendfile.xhtml0000644000175000017500000000676513220174401020731 00000000000000 C.78. $world->sendfile

C.78. $world->sendfile

Abstract

$world->sendfile function: SENDs a FILE to the world

$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, “Sending”).

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-3.2.0/doc/C/kildclient/func_KCWin_get_text.xhtml0000644000175000017500000000457313220174402020603 00000000000000 D.2. KCWin::get_text

D.2. KCWin::get_text

Abstract

KCWin::get_text function: GETs TEXT in the entry box

$text = KCWin::get_text(void); 
 

Returns the text in the entry box.

kildclient-3.2.0/doc/C/kildclient/func_window_seturgencyhint.xhtml0000644000175000017500000000515313220174400022360 00000000000000 B.4. $window->seturgencyhint

B.4. $window->seturgencyhint

Abstract

$window->seturgencyhint function: SETs the URGENCY window HINT

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-3.2.0/doc/C/kildclient/func_world_movealias.xhtml0000644000175000017500000000636713220174401021116 00000000000000 C.65.  $world->movealias

C.65.  $world->movealias

Abstract

$world->movealias function: MOVEs an ALIAS to another position

void $world->movealias( name ,
  new_pos );
 
void $world->movealias( number ,
  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-3.2.0/doc/C/kildclient/ch06.xhtml0000644000175000017500000001171413220174377015460 00000000000000 Chapter 6. Menu Reference

Chapter 6. Menu Reference

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

kildclient-3.2.0/doc/C/kildclient/func_window_getsize.xhtml0000644000175000017500000000537213220174400020762 00000000000000 B.1. $window->getsize

B.1. $window->getsize

Abstract

$window->getsize function: GETs the current window SIZE

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

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.

kildclient-3.2.0/doc/C/kildclient/func_world_close.xhtml0000644000175000017500000000473013220174400020232 00000000000000 C.4. $world->close

C.4. $world->close

Abstract

$world->close function: CLOSEs the current world

void $world->close(void); 
 

Disconnects and closes the current world, immediately.

kildclient-3.2.0/doc/C/kildclient/sec_we_automation.xhtml0000644000175000017500000000634313220174377020427 00000000000000 4.5. 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
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, “The Basics”.

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-3.2.0/doc/C/kildclient/func_world_listpermanent.xhtml0000644000175000017500000000522113220174401022007 00000000000000 C.54.  $world->listpermanent

C.54.  $world->listpermanent

Abstract

$world->listpermanent function: LISTs PERMANENT variables

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-3.2.0/doc/C/kildclient/ch04s02.xhtml0000644000175000017500000002161113220174377016000 00000000000000 4.2. 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
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, “Colors”.

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, Scrolling, 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 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.

The last group, 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, “General”). 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.

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
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, “Main Window”). 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 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-3.2.0/doc/C/kildclient/func_world_listmacro.xhtml0000644000175000017500000000575513220174401021133 00000000000000 C.53.  $world->listmacro

C.53.  $world->listmacro

Abstract

$world->listmacro function: LISTs one or all MACROs

void $world->listmacro(void); 
 

Briefly lists all defined macros.

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

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-3.2.0/doc/C/kildclient/func_world_delmacro.xhtml0000644000175000017500000000546213220174401020717 00000000000000 C.11. $world->delmacro

C.11. $world->delmacro

Abstract

$world->delmacro function: DELETEs a MACRO

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

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-3.2.0/doc/C/kildclient/func_world_deltrigger.xhtml0000644000175000017500000000552613220174401021262 00000000000000 C.13.  $world->deltrigger

C.13.  $world->deltrigger

Abstract

$world->deltrigger function: DELETEs a TRIGGER

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

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-3.2.0/doc/C/kildclient/chap_macros.xhtml0000644000175000017500000000751713220174400017170 00000000000000 Chapter 10. 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 /.

kildclient-3.2.0/doc/C/kildclient/func_world_requireplugin.xhtml0000644000175000017500000000671713220174401022030 00000000000000 C.74.  $world->requireplugin

C.74.  $world->requireplugin

Abstract

$world->requireplugin function: REQUIREs a PLUGIN to be loaded

$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-3.2.0/doc/C/kildclient/chap_preferences.xhtml0000644000175000017500000000520313220174377020210 00000000000000 Chapter 5. Configuring KildClient

Chapter 5. Configuring KildClient

Table of Contents
5.1. Appearance
5.2. Sending
5.3. External Programs (Linux)
5.4. Proxy

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 PreferencesPreferences menu. The following sections will describe the groups in the Preferences dialog.

kildclient-3.2.0/doc/C/kildclient/sec_we_logging.xhtml0000644000175000017500000001146513220174377017676 00000000000000 4.4. 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
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, “General”). (If auto-login was not used, then %Kc is replaced by an empty string.)

Parent directories are created automatically if necessary when opening log files.

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-3.2.0/doc/C/kildclient/func_world_movemacro.xhtml0000644000175000017500000000640713220174401021121 00000000000000 C.67.  $world->movemacro

C.67.  $world->movemacro

Abstract

$world->movemacro function: MOVEs a MACRO to another position

void $world->movemacro( name ,
  new_pos );
 
void $world->movemacro( number ,
  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-3.2.0/doc/C/kildclient/func_world_movetrigger.xhtml0000644000175000017500000000641513220174401021462 00000000000000 C.69.  $world->movetrigger

C.69.  $world->movetrigger

Abstract

$world->movetrigger function: MOVEs a TRIGGER to another position

void $world->movetrigger( name ,
  new_pos );
 
void $world->movetrigger( number ,
  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-3.2.0/doc/C/kildclient/ch07s02.xhtml0000644000175000017500000001653113220174377016010 00000000000000 7.2. 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, “The Basics”), and you will be able to use the variabled anywhere.

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

kildclient-3.2.0/doc/C/kildclient/func_world_getline.xhtml0000644000175000017500000000662713220174401020564 00000000000000 C.39.  $world->getline

C.39.  $world->getline

Abstract

$world->getline function: GETs a LINE from the scrollback buffer

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

This function 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-3.2.0/doc/C/kildclient/app_functions.xhtml0000644000175000017500000000605613220174400017556 00000000000000 Appendix A. Global Function Reference

Global Function Reference

Table of Contents
A.1. colorize
A.2. getclientname
A.3. getversion
A.4. getworld
A.5. gotow
A.6. help
A.7. play
A.8. quit
A.9. stripansi
A.10. stripcolorize
kildclient-3.2.0/doc/C/kildclient/ch03.xhtml0000644000175000017500000000503313220174377015452 00000000000000 Chapter 3. 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.

kildclient-3.2.0/doc/C/kildclient/ch05s01.xhtml0000644000175000017500000001013313220174377015775 00000000000000 5.1. Appearance

5.1. Appearance

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

Figure 5.1. 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 Section 4.2.2, “Colors”.)

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.3, “Input”).

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, “Colors”).

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-3.2.0/doc/C/kildclient/sec_we_advanced.xhtml0000644000175000017500000001434713220174377020017 00000000000000 4.7. Advanced

4.7. Advanced

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

Figure 4.9. 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, some behaviours regarding how KildClient treats input can be configured. 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.

You can also change the character that is used to run Perl commands (see Chapter 7, Using Perl in KildClient), instead of using the default /. As noted in the warning on the screen, this is not recommended. If a non-standard character is used, code (such as plugins) may stop working if that code uses / to run Perl commands.

kildclient-3.2.0/doc/C/kildclient/ch16s01.xhtml0000644000175000017500000001073213220174400015767 00000000000000 16.1. Receiving server data

16.1. Receiving server data

As mentinoed previously, to receive server data, bind a hook to the OnServerData event. See Chapter 12, Hooks.

Inside the hook, the %::server_data variable holds the data received. The elements of the hash can vary depending on the protocol and what was received. To view what is received in each message, you can use the serverdatadumper plugin. Just load it, and whenever a server data message is received, the contents of the %::server_data will be displayed.

Here's a general description of the elements, followed by specifics to each protocol if appropriate:

  • $::server_data{'protocol'} hold the protocol used to send the data. It will be MSDP or GMCP.

  • $::server_data{'data'} holds the data received. The actual contents vary depending on what has been received, but in most cases it will be a reference to a hash with entries for each variable sent by the server. If the value is undef, that means that the server sent the null/undefined object (this is not possible in all protocols). If this key does not exist in the hash, the server did not send any variables at all (again, not possible in all protocols).

  • $::server_data{'error'} is set in case KildClient could not parse the data sent by the server. In this case, this variable holds the error message, and $::server_data{'data'} contains the raw data received.

16.1.1. GMCP data

The GMCP protocol has the concept of packages (with optional subpackages) and message names. These are stored in $::server_data{'package'}, $::server_data{'subpackage'} and $::server_data{'message'} if they are included in the message.

The actual data in this protocol is sent using the JSON format. The Perl module JSON is used to parse the data, see its documentation if you want specific details on how objects are represented.

kildclient-3.2.0/doc/C/kildclient/pt01.xhtml0000644000175000017500000003633113220174400015471 00000000000000 Part I. KildClient User's Guide

Part 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. 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
16. Out-of-band server data
16.1. Receiving server data
16.1.1. GMCP data
16.2. Sending server data
16.2.1. MSDP data
kildclient-3.2.0/doc/C/kildclient/func_world_setinput.xhtml0000644000175000017500000000477213220174401021007 00000000000000 C.83.  $world->setinput

C.83.  $world->setinput

Abstract

$world->setinput function: SETs INPUT text

void $world->setinput( text );
 

Sets the text in command entry box to the given text.

kildclient-3.2.0/doc/C/kildclient/func_KCWin_set_text.xhtml0000644000175000017500000000462713220174402020617 00000000000000 D.3.  KCWin::set_text

D.3.  KCWin::set_text

Abstract

KCWin::set_text function: SETs TEXT in the entry box

void KCWin::set_text( $ext );
 

Sets the text in the entry box.

kildclient-3.2.0/doc/C/kildclient/func_world_listhook.xhtml0000644000175000017500000000614313220174401020762 00000000000000 C.52.  $world->listhook

C.52.  $world->listhook

Abstract

$world->listhook function: LISTs connected HOOKs

void $world->listhook( event );
 

This function briefly lists all hooks connected to the given event.

void $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. Several arguments can be passed at once.

kildclient-3.2.0/doc/C/kildclient/func_world_disalias.xhtml0000644000175000017500000000517213220174401020720 00000000000000 C.14. $world->disalias

C.14. $world->disalias

Abstract

$world->disalias function: DISables an ALIAS

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

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-3.2.0/doc/C/kildclient/func_window_minimize.xhtml0000644000175000017500000000475713220174400021137 00000000000000 B.2. $window->minimize

B.2. $window->minimize

Abstract

$window->minimize function: MINIMIZEs the window

void $window->minimize(void); 
 

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

kildclient-3.2.0/doc/C/kildclient/func_world_gag.xhtml0000644000175000017500000000524713220174401017670 00000000000000 C.30. $world->gag

C.30. $world->gag

Abstract

$world->gag function: adds a simple 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-3.2.0/doc/C/kildclient/func_world_getidletime.xhtml0000644000175000017500000000536513220174401021427 00000000000000 C.36.  $world->getidletime

C.36.  $world->getidletime

Abstract

$world->getidletime function: GETs the IDLE TIME

$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, “Status Bar” for information on how that time is calculated and how to configure it.

kildclient-3.2.0/doc/C/kildclient/func_world_distrigger.xhtml0000644000175000017500000000516513220174401021274 00000000000000 C.19.  $world->distrigger

C.19.  $world->distrigger

Abstract

$world->distrigger function: DISables a TRIGGER

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

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-3.2.0/doc/C/kildclient/ch13s03.xhtml0000644000175000017500000001730013220174400015764 00000000000000 13.3. 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, “Paths and Speed-Walking”) 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 gtk3-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 sec_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, Using KCWin for Input/Output Windows.

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, Using the Chat.

The serverdatadumper is a plugin to help develop or debug plugins that use out-of-band server data. See Chapter 16, Out-of-band server data.

kildclient-3.2.0/doc/C/kildclient/func_world_silentdistimer.xhtml0000644000175000017500000000544113220174402022166 00000000000000 C.88. $world->silentdistimer

C.88. $world->silentdistimer

Abstract

$world->silentdistimer function: SILENTly DISables a TIMER

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

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. Does not print a message in the screen in case of success.

kildclient-3.2.0/doc/C/kildclient/func_world_getinput.xhtml0000644000175000017500000000475713220174401020776 00000000000000 C.37.  $world->getinput

C.37.  $world->getinput

Abstract

$world->getinput function: GETs INPUT text

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

This function returns the current text in the command entry box.

kildclient-3.2.0/doc/C/kildclient/apes07.xhtml0000644000175000017500000000513613220174402016005 00000000000000 E.7. 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-3.2.0/doc/C/kildclient/func_world_getaliasnumber.xhtml0000644000175000017500000000565213220174401022134 00000000000000 C.31.  $world->getaliasnumber

C.31.  $world->getaliasnumber

Abstract

$world->getaliasnumber function: GETs an ALIAS's NUMBER

@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-3.2.0/doc/C/kildclient/sec_we_general.xhtml0000644000175000017500000001520713220174377017663 00000000000000 4.1. General

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 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: 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, “Statistics”).

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, “Proxy”). 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, SOCKS5 or HTTP 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, “Connecting to a MUD”.

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, Hooks.

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-3.2.0/doc/C/kildclient/sec_import_export.xhtml0000644000175000017500000000707213220174377020467 00000000000000 8.7. 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-3.2.0/doc/C/kildclient/chap_serverdata.xhtml0000644000175000017500000000665113220174400020042 00000000000000 Chapter 16. Out-of-band server data

Chapter 16. Out-of-band server data

Table of Contents
16.1. Receiving server data
16.1.1. GMCP data
16.2. Sending server data
16.2.1. MSDP data

KildClient support some protocols that allow the server to send data to the client in a way that can be easily parsed (unlike prompts, for example) and that is not directly visible to the user. We call this out-of-band data. For example, the server could send your character stats (hp, mana, etc), so that a plugin can display this data in a more convenient form.

Currently, two such protocols are supported: MSDP and GMCP (sometimes called ATCP2).

By default, nothing is done with the data that is received. A hook must be bound to the OnServerData event to handle the data that is received. Even so, KildClient does nothing with the data (other than to parse it in a form that's easy to be used in Perl scripts and protocol-independent): it's up to your code to do anything with it. For example, KildClient does not store any previous values of any variable, it is up to you to store what you want.

kildclient-3.2.0/doc/C/kildclient/sec_pref_proxy.xhtml0000644000175000017500000000561013220174377017745 00000000000000 5.4. 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
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, “General”.

The default setting is No proxy, which means connect directly to the MUD's host. Alternatively, you can use a SOCKS4, SOCKS5 or HTTP 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-3.2.0/doc/C/kildclient/ch06s02.xhtml0000644000175000017500000000630413220174377016004 00000000000000 6.2. 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, “Reviewing and Searching Text”.

kildclient-3.2.0/doc/C/kildclient/func_world_hookenabled.xhtml0000644000175000017500000000670313220174401021403 00000000000000 C.48.  $world->hookenabled

C.48.  $world->hookenabled

Abstract

$world->hookenabled function: checks whether a HOOK is ENABLED

$result = $world->hookenabled( event ,
  name );
 
$result = $world->hookenabled( event ,
  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.

kildclient-3.2.0/doc/C/kildclient/func_world_displugin.xhtml0000644000175000017500000000465413220174401021131 00000000000000 C.17. $world->displugin

C.17. $world->displugin

Abstract

$world->displugin: DISables a PLUGIN

void $world->displugin( name );
 

Disables the specified plugin.

kildclient-3.2.0/doc/C/kildclient/sec_world-selector.xhtml0000644000175000017500000001166413220174377020523 00000000000000 3.1. Connecting to a MUD

3.1. Connecting to a MUD

When you launch KildClient (see Chapter 2, Running KildClient), 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
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 Chapter 4, Editing a World. 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, “General” 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 WorldOpen from the menu. The World Selector dialog will be opened, and you can select another World.

kildclient-3.2.0/doc/C/kildclient/func_world_sendlines.xhtml0000644000175000017500000001002713220174401021106 00000000000000 C.79. $world->sendlines

C.79. $world->sendlines

Abstract

$world->sendlines function: SENDs several LINES to the world

$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, “Sending”).

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-3.2.0/doc/C/kildclient/func_world_silentenatrigger.xhtml0000644000175000017500000000537513220174402022503 00000000000000 C.94.  $world->silentenatrigger

C.94.  $world->silentenatrigger

Abstract

$world->silentenatrigger function: SILENTly ENAbles a TRIGGER

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

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. Does not print a message in the screen in case of success.

kildclient-3.2.0/doc/C/kildclient/func_world_silentdismacro.xhtml0000644000175000017500000000541513220174402022150 00000000000000 C.87. $world->silentdismacro

C.87. $world->silentdismacro

Abstract

$world->silentdismacro function: SILENTly DISables a MACRO

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

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. Does not print a message in the screen in case of success.

kildclient-3.2.0/doc/C/kildclient/func_world_gethooknumber.xhtml0000644000175000017500000000607313220174401022001 00000000000000 C.35.  $world->gethooknumber

C.35.  $world->gethooknumber

Abstract

$world->gethooknumber function: GETs a HOOK's NUMBER

@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-3.2.0/doc/C/kildclient/sec_trigger_other.xhtml0000644000175000017500000001555713220174377020427 00000000000000 8.5. 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 PreferencesDebug 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, “Other trigger features”) 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-3.2.0/doc/C/kildclient/sec_hook_cmdline.xhtml0000644000175000017500000002223113220174400020164 00000000000000 12.2. 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, Triggers).

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, “Editing Hooks”, 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-3.2.0/doc/C/kildclient/func_world_setstatus.xhtml0000644000175000017500000000501013220174401021155 00000000000000 C.84.  $world->setstatus

C.84.  $world->setstatus

Abstract

$world->setstatus function: SETs the STATUS bar text

void $world->setstatus( text );
 

Sets the text in the main window status bar to the given text.

kildclient-3.2.0/doc/C/kildclient/func_world_makepermanent.xhtml0000644000175000017500000000610713220174401021755 00000000000000 C.62.  $world->makepermanent

C.62.  $world->makepermanent

Abstract

$world->makepermanent function: MAKEs variables PERMANENT

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-3.2.0/doc/C/kildclient/pt02.xhtml0000644000175000017500000004500113220174402015466 00000000000000 Part II. KildClient Programmer's Reference

Part II. KildClient Programmer's Reference

Table of Contents
A. Global Function Reference
A.1. colorize
A.2. getclientname
A.3. getversion
A.4. getworld
A.5. gotow
A.6. help
A.7. play
A.8. quit
A.9. stripansi
A.10. stripcolorize
B. $window Reference
B.1. $window->getsize
B.2. $window->minimize
B.3. $window->settitle
B.4. $window->seturgencyhint
C. $world Reference
C.1. $world->{SILENT}
C.2. $world->alias
C.3. $world->aliasenabled
C.4. $world->close
C.5. $world->cmdseparator
C.6. $world->commandecho
C.7. $world->connectother
C.8. $world->dc
C.9. $world->delalias
C.10. $world->delhook
C.11. $world->delmacro
C.12. $world->deltimer
C.13. $world->deltrigger
C.14. $world->disalias
C.15. $world->dishook
C.16. $world->dismacro
C.17. $world->displugin
C.18. $world->distimer
C.19. $world->distrigger
C.20. $world->echo
C.21. $world->echonl
C.22. $world->echonlandlog
C.23. $world->enaalias
C.24. $world->enahook
C.25. $world->enamacro
C.26. $world->enaplugin
C.27. $world->enatimer
C.28. $world->enatrigger
C.29. $world->expandalias
C.30. $world->gag
C.31. $world->getaliasnumber
C.32. $world->getcharacter
C.33. $world->getconntime
C.34. $world->getentryfont
C.35. $world->gethooknumber
C.36. $world->getidletime
C.37. $world->getinput
C.38. $world->getkeycode
C.39. $world->getline
C.40. $world->getlogfile
C.41. $world->getmacronumber
C.42. $world->getmainfont
C.43. $world->getname
C.44. $world->getpluginversion
C.45. $world->gettimernumber
C.46. $world->gettriggernumber
C.47. $world->hook
C.48. $world->hookenabled
C.49. $world->interpret
C.50. $world->ispermanent
C.51. $world->listalias
C.52. $world->listhook
C.53. $world->listmacro
C.54. $world->listpermanent
C.55. $world->listplugin
C.56. $world->listtimer
C.57. $world->listtrigger
C.58. $world->loadplugin
C.59. $world->logfile
C.60. $world->macro
C.61. $world->macroenabled
C.62. $world->makepermanent
C.63. $world->maketemporary
C.64. $world->mlsend
C.65. $world->movealias
C.66. $world->movehook
C.67. $world->movemacro
C.68. $world->movetimer
C.69. $world->movetrigger
C.70. $world->next
C.71. $world->path
C.72. $world->prev
C.73. $world->reconnect
C.74. $world->requireplugin
C.75. $world->save
C.76. $world->send
C.77. $world->sendecho
C.78. $world->sendfile
C.79. $world->sendlines
C.80. $world->sendmsdpcommand
C.81. $world->sendnoecho
C.82. $world->sendserverdata
C.83. $world->setinput
C.84. $world->setstatus
C.85. $world->silentdisalias
C.86. $world->silentdishook
C.87. $world->silentdismacro
C.88. $world->silentdistimer
C.89. $world->silentdistrigger
C.90. $world->silentenaalias
C.91. $world->silentenahook
C.92. $world->silentenamacro
C.93. $world->silentenatimer
C.94. $world->silentenatrigger
C.95. $world->timer
C.96. $world->timerenabled
C.97. $world->trigger
C.98. $world->triggerenabled
C.99. $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-3.2.0/doc/C/kildclient/ch08s02.xhtml0000644000175000017500000002733413220174377016014 00000000000000 8.2. 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, “Interacting with the MUD”. 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, “A trigger which captures part of the received line and uses it in the action” 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-3.2.0/doc/C/kildclient/func_world_macro.xhtml0000644000175000017500000001103013220174401020216 00000000000000 C.60. $world->macro

C.60. $world->macro

Abstract

$world->macro function: creates a 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-3.2.0/doc/C/kildclient/func_world_getkeycode.xhtml0000644000175000017500000000532713220174401021254 00000000000000 C.38.  $world->getkeycode

C.38.  $world->getkeycode

Abstract

$world->getkeycode function: GETs the KEYCODE for a key combination

$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-3.2.0/doc/C/kildclient/sec_trigger_highlight.xhtml0000644000175000017500000000657613220174377021256 00000000000000 8.3. 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, “Adding Triggers”). 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
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.

kildclient-3.2.0/doc/C/kildclient/func_world_trigger.xhtml0000644000175000017500000002041413220174402020567 00000000000000 C.97. $world->trigger

C.97. $world->trigger

Abstract

$world->trigger function: creates a 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, “Rewriter Triggers”.

  • 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-3.2.0/doc/C/kildclient/sec_we_protocols.xhtml0000644000175000017500000000667713220174377020305 00000000000000 4.6. 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
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-3.2.0/doc/C/kildclient/ch06s04.xhtml0000644000175000017500000000711313220174377016005 00000000000000 6.4. 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, Configuring KildClient.

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, Editing a World, 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-3.2.0/doc/C/kildclient/func_world_path.xhtml0000644000175000017500000000643113220174401020062 00000000000000 C.71. $world->path

C.71. $world->path

Abstract

$world->path function: generate sequences of directions forming a 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 sent using the settings in the Sending tab of the Preferences dialog (see Section 5.2, “Sending”).

kildclient-3.2.0/doc/C/kildclient/func_world_aliasenabled.xhtml0000644000175000017500000000640313220174400021530 00000000000000 C.3.  $world->aliasenabled

C.3.  $world->aliasenabled

Abstract

$world->aliasenabled function: checks whether a ALIAS is ENABLED

$result = $world->aliasenabled( name );
 
$result = $world->aliasenabled( 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.

kildclient-3.2.0/doc/C/kildclient/chap_running.xhtml0000644000175000017500000000756513220174377017404 00000000000000 Chapter 2. 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-3.2.0/doc/C/kildclient/ch09s01.xhtml0000644000175000017500000001734413220174400015777 00000000000000 9.1. Creating and Editing Aliases

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, Editing a World).

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 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, “Editing Aliases”). 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.7, “Advanced” 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
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, “Adding Aliases”) 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.7, “Advanced”. 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-3.2.0/doc/C/kildclient/func_world_enahook.xhtml0000644000175000017500000000527513220174401020557 00000000000000 C.24. $world->enahook

C.24. $world->enahook

Abstract

$world->enahook function: ENAbles a HOOK

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

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-3.2.0/doc/C/kildclient/chap_world_editor.xhtml0000644000175000017500000000730213220174377020406 00000000000000 Chapter 4. Editing a World

Chapter 4. Editing a World

Table of Contents
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. Advanced

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 WorldEdit 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.

kildclient-3.2.0/doc/C/kildclient/sec_sending_server_data.xhtml0000644000175000017500000001141513220174400021541 00000000000000 16.2. Sending server data

16.2. Sending server data

The protocols also support sending data from the client to the server in a similar way. Usually this is used for the client to request data from the server.

To send data to the server, use the $world->sendserverdata function. This function takes one argument, which must be a hash reference pointing to a hash similar to %::server_data. The entries in the hash specify what is sent to the server: the protocol, the package/message (when supported by the protocol) and the data to send, which is encoded to the appropriate format.

For example, this is an example of sending a request over GMCP:

Example 16.1. A GMCP request
$world->sendserverdata({ protocol => 'GMCP',
                         package => 'Core',
                         subpackage => 'Supports',
                         message => 'Set',
                         data => [ "Char 1", "Char.Skills 1", "Char.Items 1" ]
                       });

16.2.1. MSDP data

It is possible to send data using the MSDP protocol with $world->sendserverdata, but it might not do what the server expects.

MSDP has two ways of sending arrays: one is an explicit array delimited by MSDP_ARRAY_OPEN and MSDP_ARRAY_CLOSE, and another where multiple values are sent for the same variable (in the specification, this way is only demonstrated in data sent by the client). In my opinion that second way should not exist, as it is unnecessary and possibly confusing. When receiving data, both formats are converted to a Perl list. When sending data with $world->sendserverdata, lists are always sent as an explicit array.

Servers, however, seem to want multi-valued variables, so there is a function specific to MSDP, shown in the example below:

Example 16.2. A MSDP request
$world->sendmsdpcommand('SEND', 'HEALTH', 'HEALTH_MAX', 'MANA', 'MANA_MAX');

The first argument is the name of the variable, the other arguments are values to be sent. This gets converted to the following message:

Example 16.3. Message sent via MSDP
MSDP_VAR SEND MSDP_VAL HEALTH MSDP_VAL HEALTH_MAX MSDP_VAL MANA MDSP_VAL MANA_MAX

kildclient-3.2.0/doc/C/kildclient/func_world_dc.xhtml0000644000175000017500000000462613220174401017520 00000000000000 C.8. $world->dc

C.8. $world->dc

Abstract

$world->dc function: DisConnects from world

void $world->dc(void); 
 

Disconnects from the current world.

kildclient-3.2.0/doc/C/kildclient/func_colorize.xhtml0000644000175000017500000001316013220174400017541 00000000000000 A.1. colorize

A.1. colorize

Abstract

colorize function: COLORIZEs a string

$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, “kc256”) plugin to display all the colors for you to choose from.

kildclient-3.2.0/doc/C/kildclient/func_world_connectother.xhtml0000644000175000017500000000507113220174401021620 00000000000000 C.7.  $world->connectother

C.7.  $world->connectother

Abstract

$world->connectother function: CONNECTS to anOTHER world

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-3.2.0/doc/C/kildclient/func_gotow.xhtml0000644000175000017500000000515713220174400017061 00000000000000 A.5. gotow

A.5. gotow

Abstract

gotow function: GOes TO a World

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-3.2.0/doc/C/kildclient/ch15s02.xhtml0000644000175000017500000001655313220174400015776 00000000000000 15.2. 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-3.2.0/doc/C/kildclient/func_world_deltimer.xhtml0000644000175000017500000000550613220174401020735 00000000000000 C.12. $world->deltimer

C.12. $world->deltimer

Abstract

$world->deltimer function: DELETEs a TIMER

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

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-3.2.0/doc/C/kildclient/func_world_silentdishook.xhtml0000644000175000017500000000554413220174401022011 00000000000000 C.86. $world->silentdishook

C.86. $world->silentdishook

Abstract

$world->silentdishook function: SILENTly DISables a HOOK

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

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. Does not print a message in the screen in case of success.

kildclient-3.2.0/doc/C/kildclient/func_world_interpret.xhtml0000644000175000017500000000516013220174401021140 00000000000000 C.49.  $world->interpret

C.49.  $world->interpret

Abstract

$world->interpret function: INTERPRETs a string as if typed in the input box

void $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-3.2.0/doc/C/kildclient/func_world_dismacro.xhtml0000644000175000017500000000515613220174401020732 00000000000000 C.16. $world->dismacro

C.16. $world->dismacro

Abstract

$world->dismacro function: DISables a MACRO

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

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-3.2.0/doc/C/kildclient/func_world_timer.xhtml0000644000175000017500000001077113220174402020251 00000000000000 C.95. $world->timer

C.95. $world->timer

Abstract

$world->timer function: creates a 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. Fractions of seconds (such as 1.5) are allowed. 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-3.2.0/doc/C/kildclient/func_world_enatrigger.xhtml0000644000175000017500000000523213220174401021253 00000000000000 C.28.  $world->enatrigger

C.28.  $world->enatrigger

Abstract

$world->enatrigger function: ENAbles a TRIGGER

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

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-3.2.0/doc/C/kildclient/chap_perl.xhtml0000644000175000017500000000617013220174377016655 00000000000000 Chapter 7. 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.

kildclient-3.2.0/doc/C/kildclient/func_getworld.xhtml0000644000175000017500000000554613220174400017553 00000000000000 A.4. getworld

A.4. getworld

Abstract

getworld function: GETs a pointer to a WORLD

$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-3.2.0/doc/C/kildclient/func_world_sendnoecho.xhtml0000644000175000017500000000624413220174401021255 00000000000000 C.81. $world->sendnoecho

C.81. $world->sendnoecho

Abstract

$world->sendnoecho function: SENDs something to the world, with NO ECHO

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.3, “Input”).

See also $world->send and $world->sendecho .

kildclient-3.2.0/doc/C/kildclient/var_world_SILENT.xhtml0000644000175000017500000000430213220174400017753 00000000000000 C.1. $world->{SILENT}

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-3.2.0/doc/C/kildclient/func_world_getpluginversion.xhtml0000644000175000017500000000517213220174401022533 00000000000000 C.44.  $world->getpluginversion

C.44.  $world->getpluginversion

Abstract

$world->getpluginversion function: GETs a PLUGIN's VERSION

$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.

kildclient-3.2.0/doc/C/kildclient/func_world_timerenabled.xhtml0000644000175000017500000000642313220174402021563 00000000000000 C.96.  $world->timerenabled

C.96.  $world->timerenabled

Abstract

$world->timerenabled function: checks whether a TIMER is ENABLED

$result = $world->timerenabled( name );
 
$result = $world->timerenabled( 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.

kildclient-3.2.0/doc/C/kildclient/func_getversion.xhtml0000644000175000017500000000456513220174400020111 00000000000000 A.3. getversion

A.3. getversion

Abstract

getversion function: GETs the KildClient VERSION number

$version = getversion(void); 
 

This function returns the version number of KildClient.

kildclient-3.2.0/doc/C/kildclient/sec_closing_worlds.xhtml0000644000175000017500000001110313220174377020572 00000000000000 3.3. 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, “General”). Connect to another world will open the World Selection dialog (see Section 3.1, “Connecting to a MUD”) 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 WorldDisconnect 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 WorldClose 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 WorldQuit 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, “The Basics”, 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-3.2.0/doc/C/kildclient/func_world_loadplugin.xhtml0000644000175000017500000000735013220174401021265 00000000000000 C.58.  $world->loadplugin

C.58.  $world->loadplugin

Abstract

$world->loadplugin function: LOADs a PLUGIN

$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-3.2.0/doc/C/kildclient/ch15s03.xhtml0000644000175000017500000002012213220174400015762 00000000000000 15.3. 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-3.2.0/doc/C/kildclient/func_stripcolorize.xhtml0000644000175000017500000000475713220174400020637 00000000000000 A.10. stripcolorize

A.10. stripcolorize

Abstract

stripcolorize function: STRIPs COLORIZE sequences from the string

$stripped = stripcolorize( str );
 

Returns the string stripped of any sequences used by colorize to add color to it.

kildclient-3.2.0/doc/C/kildclient/func_world_sendecho.xhtml0000644000175000017500000000607613220174401020723 00000000000000 C.77. $world->sendecho

C.77. $world->sendecho

Abstract

$world->sendecho function: SENDs something to the world, with ECHO

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.3, “Input”).

See also $world->send and $world->sendnoecho.

kildclient-3.2.0/doc/C/kildclient/func_world_enaalias.xhtml0000644000175000017500000000517413220174401020706 00000000000000 C.23. $world->enaalias

C.23. $world->enaalias

Abstract

$world->enaalias function: ENAbles an ALIAS

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

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-3.2.0/doc/C/kildclient/func_world_cmdseparator.xhtml0000644000175000017500000000630213220174400021606 00000000000000 C.5.  $world->cmdseparator

C.5.  $world->cmdseparator

Abstract

$world->cmdseparator function: sets or gets the CoMmanD SEPARATOR

void $world->cmdseparator( string );
 

When called with an argument, this sets the command separator for the current world to the given value. For more details of the command separator, see Section 3.2, “Interacting with the MUD” and Section 4.3, “Input”.

$separator = $world->cmdseparator(void); 
 

When called without arguments, it returns its current value of the command separator.

kildclient-3.2.0/doc/C/kildclient/func_world_next.xhtml0000644000175000017500000000550213220174401020102 00000000000000 C.70.  $world->next

C.70.  $world->next

Abstract

$world->next function: goes to the NEXT world

void $world->next(void); 
 

When called without arguments, this function focuses the next open World.

void $world->next( number );
 

When called with a numeric argument X, it focuses the Xth World after the current one.

kildclient-3.2.0/doc/C/kildclient/func_world_echonl.xhtml0000644000175000017500000000552313220174401020377 00000000000000 C.21. $world->echonl

C.21. $world->echonl

Abstract

$world->echonl function: ECHOes to the terminal window, followed by NewLine

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-3.2.0/doc/C/kildclient/func_quit.xhtml0000644000175000017500000000442213220174400016676 00000000000000 A.8. quit

A.8. quit

Abstract

quit function: QUITs the program

void quit(void); 
 

Disconnects and closes all Worlds and KildClient exits.

kildclient-3.2.0/doc/C/kildclient/ch13s02.xhtml0000644000175000017500000000607113220174400015766 00000000000000 13.2. 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 sec_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-3.2.0/doc/C/kildclient/ch06s03.xhtml0000644000175000017500000001514513220174377016010 00000000000000 6.3. 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 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, “Input”.

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
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.

6.3.6. Test Triggers

This command brings up the Test Triggers window, which is described in Section 8.8, “Testing Triggers”.

kildclient-3.2.0/doc/C/kildclient/chap_hooks.xhtml0000644000175000017500000001157713220174400017030 00000000000000 Chapter 12. 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 WorldClose 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.

  • OnServerData: Executed when out-of-band server data is received. See Chapter 16, Out-of-band server data.

kildclient-3.2.0/doc/C/kildclient/func_world_save.xhtml0000644000175000017500000000463413220174401020067 00000000000000 C.75.  $world->save

C.75.  $world->save

Abstract

$world->save function: SAVEs the current world

void $world->save(void); 
 

Saves the current World.

kildclient-3.2.0/doc/C/kildclient/ch07s05.xhtml0000644000175000017500000000641113220174377016007 00000000000000 7.5. Controlling Worlds with Perl

7.5. Controlling Worlds with Perl

In Section 3.3, “Closing Worlds and Exiting KildClient” 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-3.2.0/doc/C/kildclient/chap_chat.xhtml0000644000175000017500000000673313220174400016622 00000000000000 Chapter 15. Using the Chat

Chapter 15. Using the Chat

Table of Contents
15.1. Basic Usage
15.2. Advanced Features
15.3. Chat Functions

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.

kildclient-3.2.0/doc/C/Makefile.am0000644000175000017500000000102713215302470013537 00000000000000SUBDIRS = images pkgdocdir = $(datadir)/doc/kildclient manualdir = $(pkgdocdir)/html manual_DATA = $(wildcard kildclient/*.xhtml) \ $(wildcard kildclient/*.css) \ ../kildclient.css EXTRA_DIST = kildclient.xml $(pkgdoc_DATA) $(manual_DATA) dist-hook: html verify: xmllint --relaxng /usr/share/xml/docbook/schema/rng/5.0/docbook.rng --noout kildclient.xml html: kildclient.xml ../kildclient-html.xsl ../kildclient.css rm -rf kildclient xsltproc ../kildclient-html.xsl kildclient.xml .PHONY: verify html kildclient-3.2.0/doc/C/images/0000755000175000017500000000000013220232035013023 500000000000000kildclient-3.2.0/doc/C/images/we_input.png0000644000175000017500000021021713215302470015313 00000000000000PNG  IHDR pHYsktIME ,tEXtCommentCreated with GIMPW IDATxw\GgR711QFQc%Xbb[c=!ذ.v451*V@c弻mWcgf"zVVrhjFzP%Z:U SSDiMfb( Ģ(+b !DQ2Z_+޿"eJ8ly 2?mL-2,]5 He2J*}9LnxJaJ\j*eGRe4x@4-QPԥ(I38vB\zQ|W"my#) !MQ؜bp.-JXzz}W"fi(f?!clxz`{QܱX_7pf~z/<嵴T:= w󩧹JEE 4]]5KfwzMnQ&E=(KhkpR2U%fffN2-9%ԉ0WRzY&A՞ -E(!G%DLz֓f;mΰrDZP'C G+bۄ) a=Lq.aq|'5HXm=amo AcrscE$F6dPT99^EiX*0/_) #UePFK ܹN{d"OwVLD""8!ݠS:eFq0QW-KN^)F>c&)g6b =qGEϔc)-_].=a]b ȚVĀ"v$kZj+STT~2H;\(WwwG'۷<=]휗FpP(B?qĨJ2::WϞ7uH#֊JwA,t !M-PknAOO>#YD<T!,bX 3隂ӿuŘ b ?:uw`l0#81 ,YR_c'l؇,=׍>4\%r#IʂSa7$2amXԭj!h4iij) EEJEEBBjʳE y5@I2Bjz޽K}Tb=wOJ:V(j#"GZO{XY˼鸌l^#9kY6aƳڠY ze~6w)΢?(e(=46,_x <ڱ`0!Zz+lFN (rY rZOZvyKq ‥uvvdBy*Rng蔛^l%)$+3ӓ7n{]%%CRSS;uvZ]ZCv! ׮]8q"B(;;cǎA}A))&~չSI_MzBg߳gOiF(+ܡHڜg&fĩN b64q)llٽB0Stsll,u[f:4@s*iFz؅ORcc!α Sw3!Q#s0Xn*^ұF!~u4ZMNN\.W*TJeTTi UJeQaܹs,YR*v99ZFRyysM6-jÇсX|vsqc޵{ΝM։ۏ_ RVo۶!TRx_ei9M\^juH}BGV5ݨqУGZg*3g UC\?ҥ&Vz#G?|_Oe╸۲M%/1lFnʙ-#؀XwU(D njm`yeĭ~P̳qZXՍx5,CsA 17TI&93wj͍8Vy4o|JY,R*4J,o###YbؗnظjG yeeeɥ]w;m۶uwwx!$ۣ!w׼y)~?~'n6gU9ək2SOc.g>!Gao!eyOZ"wl-a-%1벀D"qssTN{E|БY/_ЁnnnD>QT>yxۂX}vX.bǞ kW._A5hP_u.Bٳ襯)tqobmt2y׮W.c>bc& "ԩ#J۵ !Ծ}{TZfM:jiwӷO߻wM2=eG^ט81ƼK͢Mr׹+ҁ*TtH$F$r)IZV"TR5=?.<rfS)*FHvvv2;[FV\EarH!s^RˇE[kڦ7i5Qo8x\v7۶9OLkb@qI"yMP 5Y`Q M+g~%.Bw}OREHmaKkhq܆59g e3CL i~Iͧ̓Ԃڜ嫭սxs * w;c0 Jx~WժU-R;ا=zݽVUrkb#Ekk}_x;hNA^yx̭?PbōVծU00#ؐ7KqjZKd&F,F9-f) hhXzS'ddO>$@*ȶk#*h,- #o5KhVd$1bn\L"|ǦG,"JW 5-?I&j͗HĆjjDse?\]U>KOKOIIA0vvq[N%2 3^为/WRyQzj%OeQ'  dCHs۝ySqa#k9 S|E%jB[VliE4ѐTR⢭Ǟ1CL i>5B%#5?lWU#Rj VhXR(*Z.98Tprr{ZR?/Tͮ +lq\~#E:&s0bp^Mkj}ijl 6RZ#j ѫ {AoXэ)4U3p +ªZj\\nT5kđga%%2e~*5 ;9"~Ⱦ+ 1S">H( E!B0ge=rm˃ $&x`lJL&RI(&G >)edlPeyXXa9J?F:XxNl|K6 m5Hוdd\^DJP@[60b8OÆ5l##5K)LXdBoBX'~l$ b9q6 =XaFx4YOC?㝀Zʍ+ E3٫qJYt4%hBG"ę뙂h=͔ԈwKu $3F1dfQ"BaE ,_VÂ$P}.Ŭˣ{F;f'tf6A/Yˡ(faW:0F,'iVx-^z)XL WASq$0LM iEfAޕ}qsLJdCq4z1cs2zXgC9=Y6ODܻ :b:/bړ9bL&nM*ThD."*ȫEn>C"Me6a{ZzyT5Hj5g̔hL5 ;0miun)vϫc)惋՞ټi86ڟQhU[ nv]dB"Dx6!|Ov&ࢤ0҈Ou1J>d6YUM+/\ m f>ϱD$(ch36 `}f2f#6m#Oc{62 DƬB,+KܷҚGj#6m33OpE(n "W굂&KMd5o&PY>*PscS'qO&Q+lE5XPbb(P&9g<)JqzL LU jik@:WhlYXc%bu{Fbl"}Gїљb}Q.X_wp.ǥ9=i/6AHGj9 M/х`Q{kc1ϯdobK]nK &h OKãЛE(9ګ遤ʮ,Am (?"[ȕު!!_, |.|Rhh*Sj+s{yhƣ[1φ!7byp*`}Hi%"r?vnf4Nӈx^Q1j]Eu֫Ww/(^+89:֩WPZl)njgwf()"fo[\3yT 6"Ccד=|7ܘU&f{#nCL )YCH m5Q]m2ebbUʌܙBorssVZ^eP/EKm,',c6%HSm3R87(6rP|};"R:[aWjlRݴeDhQ!EIK>$k_ L+1Q/5IO4hTz *0cܺ^ЛB;{wˤfڔ lf۪ _,W@r;v7L$܈{Tp9qj`Ñ[HCl͞mEnl~]8,'x˱4cfaqQS[ r\+H IDATd2Xίуc{k&Yg.#dDű]1l pnGj n ( w2+gL^ײU2}=lřˉk< { f7Gfۆ ^IF#׻SXoQ6k{fv05ZyUzP$j %n,i_=(N+1r.(ACdLQyi925I䲛YjF`wOٻY-ʓBٖ*m(83jǜ2GpZߖ'(-BS*P":9ђ؜؄DëM(EDC"#45ALﴶ(9G;x+T=&Spڢ< 2"YLڈK)ǔKU)Vp#1݌Ċ*XKL1 Ŧĭ) 2Cb5G iW&-X[kcA[ߪ#SF[{UPX(t.Kqi0Ǽ!EoST8V,–峪ȴT54aYdQ,i ۯa+~9,<|aMc֭Z׼yL曂Tٶu'͛_Fݻ'~úu?j^GC4nP~ݺGeee6 ¤1iuǛ!6DF`Bƈov2Ybi^v B_P<DKr +m0/ۖx ,B 4̈32#Skr1N?1۷^U]Ÿ1"-Doh!-gp0䍥κ_\V_xq]ZZd.… 칑p+uOLҥ3y.#PP*Ξ$XY65I_YʛXE#s6ZJ2BX[ EPZ `H7s ehm[^-, &S 7^CbfӾ}1 z%E9黔L3?YPz:*<+l?-lAC@53mY 7boX>FDkqX\)[Mwjaz 僒m MT<Q 瑷S+r6rWK0?ʽ~3XwRuG}֮BSCv#d7}snKnt(RAY+n0,"lذ7ڒ!eXDyY~J B9>:._jcfԁWZդI;w4i$**-4t̊ˋ=zԳg_~9==}bWQQQG>|x|| kn}'e˖Q;w8pg}={ruő#5jܹeOW\yQO:IG:uԩ۷oSN~Gg"ZhQv7{7pvU-KA3Gz=DnD`uk6m"8ž:{V-e3#?ٹ_BOбcZCkFJ3bĈZjٵo!t%#F wvvnٲ%B(99X6j+D 2ɩo߾ȑ#zisFpͥ_| !$sedd5Z.ٳgsAhذaڵ߿S:u?k7;@Gbf?c$)%&&ܾu:xo2c6m￙Q|*!+ek;w׿Dd̆ڱc;qc-ltknP-|_B{߽{B[] Jƍ>QXݻBhڵ999/_6m`ᮮbD˖ҟ[h w &hݺM6[~5nqcةk׌'mXD׷m?>zG1F&L~]dIEW.]ڹNpҥ &F^je͖-[֫W)SfggQ>˗/?ڵaaaz-ӫW>y=z9C0pݻ:ug^uL&M?K׮pET*/g5+J&7H$޾~sƍǍkg#G,vIpQ|:* c|…ӧ_txrr2mNNN9WcǍ[rs^^GŎ5jO?UT)((4PVh4 X|ӰaCx%K:vD(={v,>~l1zҤcB"͛`[F +T 5j$˗-]:v8@B*:yʰ6%O>!ZRGpӦ[}ƒm۶5j,YT޼E^=z.]?~'L1r'tQ#G3{G 4%@o2j5tuɣj  -Ƙ~B1~۷nc9jLBj_x)&&fYZwy-Z@Y;t8rȸ8FӺuHhhL&j}~5ͶmN:]PP0h@:JڰaB!!FI;wqذaqqqr|ĉO>ݻwԩS4h@:t8a;weggרQV)tБLB Zf!סC1qq222\]+2~uva9>>}7A%$$ٳwnms|ܬ١gϜQ.Gc7_nѣlۺޯYW3*<=z!^ՀtB>I9*j7nP?8((&zXR9gࠠࠠ9f*JXg͜uݻ}/XڷoBEn޼IQoٲN~իSvҹsvm۶m+6v#hѢt钻wӉ' k(ggVB騛7oamYر3%YttU+\ݻwߺueFqO<]jU+=zcܺu˗_~`-[6<8&f-aB]zmɒ{nڴ+OAB ZfC.!֊O85ar=6jȘZhbbbB6hk[aâVN^6bH]TxXa_^r~~D2_paמ=7nniںuK/"N:iggwiŋnӆ+W>~Ӈϟ;KjŊ?^RT]8UN:&щs˗O4ϯXj7nѣpPDDgxxgxQFvNNNÇyU:\*ffffggL4I+>>mۖU\gq̙^xH~ RΗg nyzz 3!c5jԨU<TreakTZ5cr]n})Sڱy1akVfh6 |ԩ#F9}j_\x~Iٿ/n}l,-fgoF۰i?>fI|C^T׹G;uZ6m$ˣc*Up2qUVEx>zd׭rL޿ÆEW\( Zqe:\=o߾޽{޽o0[>Q}iQQBeK}~~?>yϭFlޖ͛6j\b nY=Iv??O}}}uO<:fNkkQvG_ruʔ)**,{XPPٳysM+9ueKO+ЧZ\Skάً.E͙5S޽G3g.^ !4{{4w|:Vp!HlDBs.cǍ-#!rٌ?~t3秴*U*6NгgpPƍǎVCBBS_3o|}͛Ϟ=ŋULҤQ}]juF[u\&^ۡo߾|yߢ"ŷNV(_|14hƍjٲ-uU SE98_A ϐf9ۺu__#֯_7oxnAyh=|uvvv1\$P.ٳ?͙аY?Πu -?=~TusSXR9{#1EEE9|!Ե[@yYJS'kԨQ*U'>Hإ[nvBH"h05A7ڸ)VYdqZ5kqOбKB=z4--mȑ6*a4H%>~6wY[Tć}Vhy(#Gt튵j-ryn\U&=u.W.+U\ : R5`H$w77{;;/Bd*TpqqqttY15x4;E9:99T_(^ '6I(Rb'VTQ6Rfo `HF%/#+0FQ,hk e|2jKLia0LfӅ{tV^vm۷.`Њ|_ݻӦNi|f޽{5+qck&~g9::VZ5rB:\TΛ;?i|ܹu_֦V~ZvmſգG[ٽPnV!!Abbq߻w/z/_w}o z@/_d>t3f̘q!?Y&HO̬TҼa&cRύR°:;6Tj=y,5}ooשּׁ,???/^?W LOO'O_5kV^r?вU+ J$*ժ99:q/j\=-hkJ| >AÆΟ?`QOrrr͚5BIO'(J>X1p/ ljZ6W ?u.j׭{+&(N:x'r$+/?stAAARRwӦ]uOiiiiiisڵQF4_OZin&4=ƹ99ժT*̍J* ^nNsHNb,C0A \J>!ԩSg~d䲥K'NPR^hQ^B:w+ hڶm;."5jXt) BѼqrr{Ó,77XN;U*' L\Kc Df-k\*3~1(\)`.]v0iV ƘB1q۷ocGP(Z_4O>_0p>}ެ~hݻW>qjB*jƍ.\@jjĈLg nnnرBcs'Nh<<<!ԩSqUDD35k֩SCM0Ӥ8)S&ׯ_$g6mtfFiܸĉ*VrZY{L=k*(&eQgϪRJff!Cn陜MZ|Ŋ+?zs.f/0`={/^|]:p "#c7nT5[lX|%Lzu 윜 v5.:{6,4ӓn pA'&7nF]ݻ`rJ9B9YuՋ1TݱSGWWW:7mQ1~>T֟WeጌJ~rwwJ%9++ϗ\/333رm6gPZ!9E2Vcm0O\\rLJ"LacÇB噙-ѝkpU-&7 DYSXXpiS 1HqoZ.XA]@YEYe1>ve8v% f͙S^c{AV $IᑖVjUTj֬0W\]/۷\P܋հ6a`~t''~Ե$55[f3\ґ#Gk׮TfCّd+ef] 06>FQvGEDD\zui**,[fMZZZ^^^uCBZEddddddDGDŽ1`¤$FHH.]:/_"99YV?y$rB*VL`BptttppxŊ+ӷ Y.333333fZnbJppݻ?0!ڽ)W?p])sl;T1;TUtCI6 _ EǎCu%blD~kܝ:wvۧOh b% 0`ƍ&LD}34o A'OL]BI~;7--rCᯨ_'}M~~>Ï$ 3I_M\n}ge11k#d2Y޽o[fk11!o܄0/W?p])slZAd>j4>|ԶCG.m}x\^}(-JkԨ^U&v=;+!$H0%7ڰ)@?WjԲ($R :> I(IzZJj4 ޶cG]tQ{-KKKP&6PHRg'+-w1FVCQjVN.r颳T*A\R-ʓwzFD枙AAtpREIR<5ƵkvnDF}B^|9oӸqPhxx>#:NNNU>Ky۹ssUtWJe'''4@[ĉu=vdŊ7_^EkkA"켽 \*888;::Rm ik5ڵȏ5Y3P*fǏ-Z_՚OIEdFflݟys$&zy{0qۊlk֭]Q9cL\U/]g_6--qRry 70(D99:UpP%Hlpn"PGQA ۠^݉ǥ&;~T-\\\&OryQHěJ+/\5ٳ~5{\`f&(Opi~xknO//y#͏X5a]{2'$$,?۷srrBbWa[~Ê˗m9![3TH LKKR05hE] sEm5믛6h _MqqqyuYVP!K]x ֮_1>worIIOkժM㯗Y5`>!#KEEEYYYVߠA.YAALijgϦO 7J֠aõ1IMVx_V#Lc0g촴9f՛^۪}Mv8)֦qI˼*^X6(Td^(+h4l'g9<^>vXN+ffWto^l{[r{L5@.m05ɤ-x dBKnjIRnoV-[%ݥkѣF?p 33C]vs`{/ﷳ?nӤ};7ʟٳglIHh5j4a+ǎسgovvvM?>00!V׮[oKRm4ܼq77wО{߯h[j9z(Ozx13gάRrff/oټ#%%e9֭UpSӇt dM[\Pֶt/P +{* erc8ag'WxΜ9o߮ؽgּ5kܼyT:3]&%-ɓ]wߺ}eK>:p["߰~Zm,to?ogq!/ڸaA֭@ 2rA.]l޴)v͛u_ 2rmMW^%w?{|kK.߯];-\p=μq˗^2%{@>1&nB]o\~ë́<۬pȚCx.(kH(bm*4Z G;"Xu5ю 1iS5jixɒ,dΟ3+,ttQcxxxП?{y7ir-˗w[n7iSOɬpȚCx.(kH(/ F7{K-X (=vXǎ]]]nټE.GEGxtss;6b؈윽{.ZxHf,??_ff.[ŋt0Ƭ+jgdf= tU*ab>|HNW]3~رc;\\\Bnj n<t@' 6)T(޽7e䑣FݿIxJ)a=YwemI kkFM/beB`k_Vc|_~CVrssv%KB̩[R)l\wssA 4iiU RSS===uQ)}|̞SWjj0OfpѢL6)??A===߶$-M^F~c|_/uf^]ƴt)p~UT#krrrYÇxJ m.XO@"t/PX}FbZZ<{u 3{to%8c%?*pZ=X8,x 'ݺwUGƍwӧTΝ:)oDؘ5{έ۷Jenn]k֬IWX199YU1kfdddddĬ]۪UK:wbdZɓ 1|Y51iiiyyy֭U ( GGG/^\J0}HV֭\vF_h/:t׭[ҊOz8I{}0{!<%6+pȚC^PvkV!)@ە۝|d2/];v̒JKKM? !7~8ّI lWתe\ܿW,//8a)gСC6mtqvJJ/88g<*sܥkW5HiJ,,Cjz@^M .nŗ/_%+.ڌ%S{8{@۟B@MK!+/[jmWxcB_?}Wĉ#܃zh ZlY>}m"$2uO?vdvpTs[@(<ƕKg&fi2[Nk˚l"LBY,2 d xႭm9T|fɈpOh٘i+!ǝqȉT>DshtB8?(O"[?Tyxrjτntx<t@4$[Ch o BbܯA>IȋZ?IrjZ4%a|/WJ4 <b֍$M5*բuK<3B@I  }}Z[w!f|xW S }zlۺe@ a_VHHT\X -/B  r{?ZU~Jlyޞݻ?|pbŋo߾]vBbbҽ$|qo>ˁ^BB0آU~ٸB IDAT">IJhպ4wp\tD{u:܅Zo"u!Aa v:.سxص|hbbd2g̜KW E(X|UX"PX)Nş# 4yԊ I=#1Eb>633Ǘ-,,|S33|( #_.`0_H? 7 s1aX9DZiS=_0TWq8=z̘1-33+pӦBEb6sU+WW*wp8.l\JL{,`ÆǻtZi113vڱ}ۿ>ѪJ5"bbeoFUT{}R]M!vl+-=#&ʥ헌K-,P  aaGyzIqH AIB!rCMa㓙糎Oiߏf~~%˳ڭ>?b KKK3\2k }}}Ow z@+CV7}4---=k_*{ӼugL&UՒV`ox >Ç vjkkOyʥ jѢEV-Ο?Bu422FD9~?#95mw vF!Fۍ`|oo?u6CS'%ίVW 䘟y"B6mNŜvww#N윹;D0xDDQq1гgΙI)ё8 M -_?DyzVUIVoiiy~}xha~~ʥ헌Kwù\Vw_A@Pt_li3B۷1'O'j ⥴Act^p("GWWgx1յK7n uڕbI+k,SSSPVVVn0=]kۖFD;,--mٕK/VU||=;`m>T1Z䤧1ZW1!!6a"g{ o߾mݶ:tȕ+W\Qw ?,p^^^^^ޡնJjZZKEUmڴR($2v0ʥ헌JիWC 9rėϟ}& _O6&&x|e˫ͯu@sᶋ`F P}Ο'rFE"7mb&OwMVKVBcǺ ;{!BqrtV(--D¶jW;thO/ ;EvKF%V}u$2i4#G""f EB~:֞cq% gdL #wB|-|>vy9lyǝiݪZKLfgM_:8:C ȏBP;Հ_5C u$Ťy<4=++L"!D8ι !'P!>2C:Dcht}SB'N=Z[[ zԊߌs0CGeЛM >[ܸ$gϞܹBV̧̬\Q5Id2fسb?3?BԆ?RX,S׮H+bo`dlOа@H$ uuMGG\D***L&?BpH`'X,A15D"W [$$[.}zq}w:'O~]0o^]X[ϛ;@blDt;ZY;p1؏g`7e'|<"p86.'&;888:&&&1D]?CCB>}x&6Llso޾hѢŋegg߸uk ,z޽[wo߶Mb{nDd'Onݺr@ $H A'T~ ut~ZءC\v}ڵqzk⫯]6!>xkE***eee er|BB=UUU-^|ΝZoؘ`xzyy\~A $H A3T={6޼!CzMFd^t_9Nαgώ9RMdggfl6xK]]!Dė^ܺu7oB  Fyy9JJJJ0wK obbP;ߍ7wXx񏙆Ը{w޾uk%xBѡeee !CR==֭[#R}חs-\8w޼***%%%ݻvXo)߶ԣoR;tꤦb^>nnn Pغtmd߄Nwpشy3j yzymܰ(VZ/Gm\>pfІ F-g8ee*** ###cX*ONeXwҲ%~VVVF!S^bk c>}T;#66ǀSٳ!;omk3fΜ0n1}9sZndii9k9mVokݥOnnx(Q[TUU9ZlIUhpxDMHMv_ÚAsn\Ңte[/K )U<Ю& ke31t?>tp^^ޟPc(Yy>wlM!†.beoѣǗ,YԬӦ*ٕ['Xб}Y߼)ÚrdYi@=OLW.]4 5t~>xGZi 70>7d;{:fjUIxrjZ{^HLD͞9bĉe [0ܧNټu[ݩ_O1cϞy؉&'$())͞93%5\|2}ڵ ƝOH pwk0o\rw>}N+pwO8&x|~xDĽ$P>}*))9r;"2# OŜyVYYX{{;iȳ#ȌzH(бYTUgΘ~66Esf433C G޻DRfx4 c\R@+mIj6o'(ð9XLxHJ._R QI˿){w~ BA;wӧc.[njjZl=@}h:X(*N8q]BCƍw1/^lߺe׎g /~7$dP(>q(́k3gSRӶn޼uo)xUxutL߾}77?OF%r[o9bߧI=z߁x晳g322wؾuϞvqq8~lz?rJ2HvUlaab^zx enn.`I$qkTjk)ttL߾}^Z;^YZVODuC>, ?t;~x:a召 iIҕK/ SO8bii'Md0WN?_NIM% xyzhiiiiiyy߾sϼzTX,S<|kyͪs4O;wn͛7yy諰XVR.s6+++d2'Msbř3t{/_{o QB!̙=[$)Cz^kC}$5*#O'q=xLb#95/{z뎝'lܰpJe5uu?,BAƈ׺Ni9X5BbL$9ͰϜq:xZ”|>(`/999 U\fbD"hK|*CC*iܼXIbk!KKK*q3Nf̟;|>ӧ˖,m7wqmԔԔm[;4@P+&E@AoKD3B;s6VCCɓqݱe >}89F$H[n6240a<ª9ǺX|Bwceho-/_Η[^>fٳ;mMMM{ɾ|EPT{/^ݺuݼe[NNUwq5=eVV!dު(T\r{{CaڷG~ֈ#|oo<kJJɮ'L/+PlvFj siG98I{ oB;'97)O᜜޹STTԩٳ *g&@Y@'w\tS\'W[Rm${L|YJ121S1!u.]%˖EݚX(syQ#+j'95 [cեz,\XGGFȱZ ضw۷;xbtIwkaf~tԩպ5k|>ny>zmbyyDÇMITݻ.%&^{ܾ}dL̳/z <38((=-%d9yԉm_S h~ܷuȾ}|`1=O:~:>+O__j=>~~|bϜvMLLL挙^|g]G_____ܲ ҟK4:-3?@fzN3$H qךߺ Iq1 0/774$d'cN#233%`XbffyVVV խ=`l6̬R(#uuL*jlj`H$CX4=5%+3S]] [RmEwҹ"62JNNn[) IIfi_000]X}}ԔV[Is BHOΆިg0tV`]{͜5uii:tnjv͖mՃv"G'g}؎!ΟgΙ;XI{{2~?)Y"A)" dKNf\oώ0޾u&fx qg-,CP- jdjF;IOK[g3b8ta itLLLmG|˖7݆ /ZM2!^^^^5DPegRJJJ4z_9crFƆ!P'_Hl~k$t8ৼԴYwQSh)(..ٿ&&ZZP'S -/DB֨*{@%tkeن`@o4eee2Bl u ]EjѲ*tEӠjѲիAW@ '2dB?4cd2Pgx j+0 cNDC?|bkI#WϧHϞ/{D)޼}kP̆0/~RRzucJ޹=__>C RL /yg=w “b/^ܼ)`ۖMĮh؛7o6Caxԉ(|Av׆07Hw~REaaaX) Z ];9ˇݛqsaܽ{7"2ѓ' XnlYsidTs)jjjUKpstw{/xk _>\.w1reغeSh4ɜ8a?#婫KF~g޹{MGK$_R(:::f3_顧bN~1QPKKmꝻm5/ IDATf@+^c۶ѣ^ݻp&hX]m$^;;w޼ek%$$8tHOO!rjۑ#Eyzyؿ#l6;//hc@ޏFqO/(coOM0DU_rKdTRL&VP4:×["ӱ|gcO>6պS'PNnBaF"VO욌hi27LFv*:JA{o~?A}…o1pBwīBbW8>,bK%یE,ntvv6G|tlUx`b0А{khYpr4֭Z>{|45lcPVVV=Fn1΋z3L9}ZZZ?[fK,ӢEeKc ttWXGTfg&a$݁J֔oo o*F`Ϟ9d7V,cڡeeessr|==-["RSS寰}{CB0 }ʕ+'infMVV틊͞9!ԧO#Ǐ͞5 !t>{K9+yYv.`2htzvnndd}>GKA.NB$ /0l}zgdfy/Yaxx}j0iTUUӍbrvNFG^fOv~FYXXZk@.tCa+aa^^yyy7l G:k2cEs577G6^Y3O䄷1"2z^={:;9P= ckLvte Z A KA(d(+h;BF~NPF9^~A/ȋ 395xȋ05)d Sx2PXsՖ7D,->O Wc05 ;xWn-L؍mzNZ[ 6_$۫/[H?=ۑ#ڶnէWpy49>|pkJxfpPPzZk/$&&K6pءD:y'@߱my/77ocNy)%@o1)~sqG _().RVV;Qd2bhiH$RL}}ԔV[#RRUodl|<"TvV:8tð7n,[gp4@Pwԙb~^((d2hסciiϔiJT*1DשDƻ@c׸;8cl6{_SXӧ|>ݻw̑Xs?~ Bp[kSVޭgo ))"sJJr)dr^}J9ePbHWmN]Ŏ*`E°~>l *)OJA&gNҲe%˖IfZ[ZlOaXaQQx˔|/b!CO?Ԭ ^N㨈opM ͵@00L'汮45Nli3B۷1'O'6wwSs,*fO|Y\gds ee9+uT uuu'GA|ܹ[os8e]tqwBYqԨ{|"ss%X$LqJ8f߿c?|r&M~_ĄSDX39!_fǏK.}nʕo 1Tmn/^]@hHnXkoZ6W$VzU222'HU#G-U '((xNMM'co߽[yX~ A R-0rLLLmGۍ633[ly@#k ]]=.7lPV;0p镔$_pM tfL3oܺ6EWWbN86L6N Ozpu$MM MM)'U ٴZjZJBnS&kijhijL2޽$$#ۘ6lhh4%&1~/^,:YSS!A R ByzyyzyɟK*B B'++x733d"B!Mq+@P1@ P(ޱqgbTTXS]];#B(77oيU $K#qEqh4/zzzUIS()C#$nNєX՗_OJammmh@cHq8! !X,IZZŰxS33&HdT$(ifZ1bzFnEb=ŁB˗hcddήZ@ڦj5XGvv1g*))qy<:*,*" ˎ%V'{<&͘=GE;)d*FRBhǮ ŎD"!BMKKR)fK߷ci|>?-=VDu{CӅB!BD | @7j$X޽zEDEGFW- ϦWWGFGFӻꢅŅ \nNNN#DaUUr e2=77phO-/DBʿ 0I$ee\ LoK*--eX9<,x6IYYH⭵!}gP~~V~}mmGtkld4g,~z#qfUMWCCvO$q)+=-%P(]8%%eFKmFs5* 0pǣYQQѧ_ R./+F+ӕ\n9`rn^ֺUKYJjꎝAvlSvN5BPM[P+l[Ep+^~5́g1ZW/_rtv++qBrQF!ҕKz,&*(Ѷ "2kΊTyƑ(]VVvD#txr@D$2J9y.'hkkk(&]>~Kgqc\M6i\mkiG8ĺ eddD"/%mLLL&59yFƆ*,ˈ6#4Ώ<~@6Æ!\ Av3D"TըT ϣwnqBBf2m-hji2L [cc=}J!BϞ=.#F,&SN(+/rBBt2AP`Pqpurv0,٪5q:۷?|P({ oټ::s;nBH$۷SKJ LJ`H+ Id Beăq~a CF֘xˉbd]]ܻw}}*f7[t9sy42*x汣G?zt<"| h.\gE}%BdB&+j $H AIq.+s_־}{vݸ~]Z={*++.Z;x>Jf򌌌6N511QSW{Ŋ˗/( @4p+.J')cϞ1rU^|u7o!( 744d=k֬?`B(##vHa"xJ4Zssssݽ{֭K9 %77WGGjE Ν7owpJIII] 0+WL!dhhv䈱qJ$&0EoG"9:9OHXSV`0222֮^M/^ӧO!D1Iۤɓ׬Zg>E ( @PRbcc׬Y#qzw,"P2dޜ9Zڶ};:e D7gNZZE   / ! 2RR~  rph߽ra.  ǻx.ZT Ģ%ø0I^}ap B ;<24E |@'%*JU_bkdTݲM&SEZ$gK™G@& 12}ǎ"> --v;"E(LqQ~<@3!5]!mUHdJ91uZ\e ZnS uu萪Q`Í(mDƻ#ZfW?n_aPX\\bse+))vƐ[*..VUQR~~?V)fu_:PK  i4؉*g 5ȺqwH"!&\.w՚޾Csry"5T/S_XT\lnfnblbǜ9;HԮ_n*_tPثgIcH?ee.֝N6*^.S=BS<B䩘#z>~ت˅"Qܹ{IIeevG.cũ^.N/+))yMMHx2N=cz۶mǎ^Wm92Z"p q3h:RDmv{ޱվ|jՊ!A;t8r82tvnߪs(eff%\XW{ne6ogbnQFU#aD}.|Zz:?u)ii/T]…>|X|- ]p-cB(,(ܱu}U[Nh8! !>r؝;wUUUK~OOD):::t:}߾h4K䉚&&Pi+7oߙ:UWWbN0'jijjijNyoY,fխX-qKrZJ$imˣh}==9WDX,>0XM%{-gK$@Qbk sPHtd)?F oݺ+Eh~!7t FYYy srMMJ+jki-[HGG+))x<|"|PUSCh;;hŃ;;`ei+ʣv{-- cB0Rѳgs[nM˗3gt`e_3Omzѱ}&aޭ)BtjmCJwv䈶[Dt4591$!avm|m5=o@>?kqJ#Dɑ_2t:-7/cbPd􉂂{Îi{CUݨ-,/^Jrsrr~ 5TTT222{__իG׷wxDdvNviiidVDR:wRˉkg)$H Aj36ʪ_Sݦyx8:9H;v ߚ=kΠ|>ۖ-[6nڲ蓧444v$za\y}}}Оݻ?|p"BhB,A-^~ÐCssrv0q"D֍f3ad$:rV^ekΔ| ~yLy!'?B<ܣNOCC}O( žݻ\C!!CȈgoNNcNV)KpQ]MvȧϞvFo p8xF>sw=B{nmnbԈ\./ p u Zm{{]Dyy[ )=[&%JIM3Uڳcb9ȹIy [$Mt3FII)cxf%%߇ ~} k۶m<461_;QK6}/ !ԫGf>N 3SSo*Ob蔝Pj:nS?}ةu_k=CX s3%%%8us1"8%%*մEˆ-cB9*nI$WxbSׯ^CN1ٙU5Tf+n ,|ࡰAAA;whhh4NFsH"I\ /16F[q|WUVUfy<SEsq|n:B<qv#jm͙5KO_Y.V<nٜ21.gBܸn(hTnf3fii--wD1FY׮HhOmhd*ÏPQ)=[ʗOr1m̤-#hp<tTI#:JK9rO++ev$ IDATXLCPTiVT4b2ʘH$ L0Ek8ѝ$cޘGhD\Ql<~QS+S8I7aa5-#  e[ǃN5ܶ:w9t&FW&5Y 1 q˹*5I윮=zCoyP$hjhBo;)#ݽW˶m 5 4غ?R_1ZZV|c[K?17=4/Y*eV0-[~|flPR0 5a*3,􃄞ap/Ԑџm--CBBuҧwׯ߷{׮ ^@$ 8[׮V(++#V~xDAЮ]Ċ?9s݇eKΚ3矧O#?gC5^SӯZ| wE3kCƸX4IGҠch^ETTTx{?|=u򤏯+V\|Xq͚5zzz2Jf򌌌6Ag2L&?}R !{sss[lY:# $a[_tQbQr֠hģ322lGDa&䟗FFА{khYpB4Fð["ѹGێ,%nLY;$tK|a ÖZ`l%%gc߾{/ )**Uk0,;q:[[N@+5/ͮZ^x􉿬 @p zv6n Zc[uge>mC╫JJT)S32.]BgNj/0nK+BgǏE{-{en_J,..635pbbl\ijn)b՚ x? …KoU5ă7cLRv6cq\-(,eGGZ1y.<޼}w2tFfhV59wPⷓq_;~테CZukݱҊ 蓧>~BPF8IhX sf(744zw޾Ƿo?}{CB>~j+W ۫g޽z>_@Pʥ?lMC#ZSS&];ijb7tAvnݲcfM gJk޿{-Ba-X4U7BzFվkW%\p]ZugeXTT}&G}nh7:ϟ~o >Y/UڜĽؽն+-ݳkGV#Z-e1}5uq? $a QGev"CPnV]gu!VZEApj! ܚRHbDDṜ{ι;q9[.gΞ IcGV:%gXB$t&MBQik9*Mt\xDDnqݚӧ=~?i:vAIˎXSY-u$}XMَ$$Z>7|olΚ9SR&O6'?zƘ < ^~㦃H( 7nfŠ ssC/``-5|y3Μ;=! jB__}ڲgϝ`nffxytJK^;8sZ r ;;IR?oz9 U@P  \G5zcBL95UֵgΞ']\qӻ-:D Co޸A7ub)=Z׻ש)ENa]w4erdbD"1F S[]P{uT{k*7RVՔ?җN:je f0ƌIOOwlxغO>ƌhڴ銕+q8G.^3ܣt_P`zbvݺ8XT\L(ݻÇB>{?55UI !ⴢf 'PEQYX&b܌^(e灢"#vVSAB!!jYu˟*han^ֱ%&&|zA___&+M7rZ.]?H:x-D—XGH)vk١l\.t<&sȑ ۷k.]P{uT{k*7RVՔ࿗8PغU?jzjdmߞB6nh.[ZZ:vd5DS'M433HMUd23M9966քl8^PɭZPS5T{LM?iD__Oǝ;Z5muڵ>z~tk,-CAcoTWo+j=*Mt\x88O;[lZrU6W'].;bMeuSÞzXMل.99u@=v?&FEFt|˄ϻw߹{oNNΫݯgedfV{=w _~2)p8yyyvDrVwϯؑ)_lܼj嚪rtpHLJJ9Q7Եˮ{ vqֵ&vV쎉)(w8;uVS5 ﻴe6ibNZSۆAQ.;TK6].:#ddd mUN:DYo[z)Sto N ~x)p萊)=w~n2lɲRNx-\Zj)W !ZSFٷ~fs*зOo&nƜ\++>Umۣ$$|w7LJ`!k^j>򫶳ԤuVs/P(ݺvZPS5 ﻴ]ʺܵe=5ejɦBSk7l˳6Rjj[ի-Q{k*.ۖjko̬,8wc={TKҽ ]UrbOxdqv PU_Ϝhpp[?g"+p8h'<@"L6?|n;w8?|L&Ӟr-.ݺ n->ii=8]Q0eڇ'$'$ܿui'O ^hш# !'N7~{q:xwu7vkTKsͳසBvlmwuqSXlvVVV^nq0 ?_mr{묬,{{_|=1`РO?T%r5kJ ̝7g^8^ceiiY愐gϞYYYiO':xoSڶkIQSM81 W}|͝9oo_kk똸1{n:eرP.BL<,j@{w,Zկ!s܄ i1,W'L2o^ҬpqJRTJ%d2l=&?a={B.מ/--}``Wܯ4 L&m_٣T*ˤe] !.Gߪ+! BH5z{UjZ>z~~?ΙoCN7hRRR7Ŝ{(J&X ⍱BדIe9YL\.$Br9u=qCGohh߾][BH^~9z27P9CCCB]jݟUtLLחe۬B`an^ KGVظJJ$p@eގM[C] R2(Rؚd()e ,KF<;3%}`?anݾ5*jt꤉ffr===LF?PR5z86BrrrmlȚ=W[>^rKKKNcmHV K++̷:dY,6z"b3ztw޵EFFyy{ztw'ԋؒI?m;vddf7oFRiNnnTtt FFF55P5fBqAxwLS7}UIeR.p RJJX,[h,uOZ`0 矗h10xzB!@$ݍ^թC6X[I'ӛ`[1'7ʲO5Zm{D>v_2x-\FW#m&nj [.^E{V524dw̾6 LL]]^zN[k@Mq„ݻvdq煅O+C~YOpyJ~?wi&V?tT Աwn]rŋ_xqU_??]j@|LE3NQ ( S"!='ͷp8CGEULڶmh@@fFƄqvYǎƎ-((׶h,j۶etO'Dnɩk+//RaÆ={vy?ozE?ms_l,fD&Ƈ~;$L&!d E~;$ME"@>/{vlҤ.~1 0#EEE#&L :w™s,--WX*r}?xb=Z~C}M*5`{T?ܱsɓ'5WӦNv̘ׯڽ͛8+CCCkkks3ɉǟgR Ϙbg&K>q⸅5,<LriQa,P(Fqqu ]Ud֬Yђٳ--- !3gƏX06&fæM5"LA0c!fgge,Z{`0|#=!0/?/^TʙL6517Pqq:ɉ jUq>bDhH)ڵsgԎ;o/_޽{BBKml֦%`ooU`FFST*UXqYD 5k֗_}ׄ8IYYT&U(,100r8,L.OqpphӦMѣEi2yҤƭ]Ȩka@%ZZ'|B/7+޺mm6mڬ߰gΘ1qmfx02Pwnj9׭[ݺu@\RZjddr322fkВɢEYYYYYYK-T0 0p̙?.//2y$:ɓ=zDخv1 &bL&k;vp:eK/8aň#נ%s~>>rǷ}W`Pp07fLzzcƓ^}7fLFFFӦMW\*b=}V‡}w @f94fR  Cx` \1BQLZ&-)1733v Y99& BDRx?JP h9\M b4AHdffuqѬE .g1!2r"bkFl'|XlVM1M~rʟ x[,#ǎgb3&`|SмiuܜzEklMskԱ}oFHKKE 5ŐʕܦMhɠ%~"6o7O=goo?a8c:bGBlIC2x ?ؑsoBscXchب>ǒC_dd$&%s8a#[4oFgN8t,)YT:u:t f&pSǎApI m[6Wl\.+]f{ÿ%ڐ#$FZs}q|>/>ZfԦ p"Tm DcǏ{][8wގ"ܱcϕdMUcVXݩ[6Dl֞Y 'H[RR#*ʹ{wc::??u۴QyFeڇ'$'$ܿu gilM7\瞘/effjϬ2yq'ܾw_ׯ㘨z'8YRRs~.נT*_Pe B KЉgϝ`nffxڿGK!.y9_$cBL9dbD"1F :5jݢyd9>>UM$SujJx^FW@ s?VϛgiiI/v֨(kkkBHF<. IDATeJժ4e2gnu쬬\[ۥ˗㘨|~/?0d@]Be\`nnF/Xr^~9(npHvCbXUbb§er퍙8v̡#G~744 o߮-giE[7eJ8j5?կjllmUYYY⎎/_T[DSLGGG3lܺv͚5?s٫ȵo}ݧ'藉Jު\kzAHd:uD33Ӫ+ UUYBuGSc'CQԭwFEYڛ022MMdjbT_c+19!^~~`Š2={fee6pєٳgהYmv5{n)㘨|8o,Jsrsߪ11gntb_m۱##3S.ظyqe޽8uZSԘ[222 !Or<3#ceN8tĮS7w!Ӆ"ѣGI3ͿtuVs/P(ݺvG'ӛ`[1'7ʲϛiO Bv鬪ijLnؘgcm=:ld5juqc<~ܼWޫV#Fiϟ**4U+--}``0~ѮVJJK-<9Yc"D]Z"Й5e?Zy .dI#FKfզyժ4k6k<&vE^gwC}Nx[l6bk@l q@1Tb0 [).. `@5+}}'1=d߄f_u1#~ZT={wׯ@l Y BHyyҲRJвِd2 C__ Nj|k)Ba5n-5C3ҷ/nl]+3o\b2YL70@cZqA}~;p@X^^>/׭[DRaÆ={vy?jj@e2Yұc>>>ǎS=;yƍϞ>?ztΞ%lْqҥK|-[N0!0(܅ gΝ\bܵ+W9sЉ7_zu{tS^|I'n;v&l6F hlMК^83SLSX,VnneZZ'|BIMM={ؿ"W^|>2yҤƭ]Ȩkڛdemy+&Z[[oݶֶRf̀zDP(6Iyٚl_7 E?jPhبȈ ~(uAm ?|'U_~~G !^^K-ZpȀAbcc8N))-522r_ТOKK.^N  5sǏL4N (;6mZ(.If2TRظXyYZa$bL vo޺F)4lT=i-@<!ߍcgg/TerٙNYx;~鰠.]qa|өS>}ЉA7fLLIkj Ȑ+i 342,**R(++x9~Yi|GϞ)rҽ ǐ}$d2Y8;Fugyh#Jg͞pԨoKwwwN׬ZaT*6jǒJS׮C jS4܅ %:v p8MsBJ_TZVҗx$D"V&4UBok~YuP-_/oldDQ(o UOr?._aX.}cWoōҫV|j7׾ڴ!6mk@@鎵R\f]JC{oeV3W{^>e# tbRRO ú0!ÿM6eO_?rӦzUvmGҾ MBn޺r*B0ur?Oڹ IcGHBˬsgxΝQ-U 4`OLBP({b R @}Tp+:zׅ/e=C_4cP(~Z7mŪUB@(x: y<\K/~1(ܐ 2Xdffp]]>׾ M<}:j'ԡfs rƍNNKEBaP]*{;;G{'O8yuV8b<NhM>sW_ӉO?pPOOoM6\mY>()*JHywƎolyƍ\֭KR\ŪjS:wT*$PCB)Рb/lu'̛o߾%WBHE7V768e*%''ƚ^ tHd:uD33ӷjH$nT)2߄Jfo+ y@`0|==}P(-j1r\<<[h qR1KI5. a0aB bk@}l]uP !}kf E\^./]cx I.4o3^*I}T.ٸ4bk lӦUqj٦7  P(СB.}QʔJ+MK`g00=[@-R(EEEF<^qtG.󋊊ظu 6QJJ*+S(JJ`Z(%EZ@}g%4lTRp 5 ꫗YYqT*Zj:,Ȉ6*$(H1Dbog7<$-!D.sU76nTd^~Tz(?p…ҒN;s8]:T*_TL'^89uv7O/߱c_,.lҸcq e- qVݾ{wƴ^վ]ѻG-7wY߯vI:~AJSXP/yy@  R5saff>ޏ?I'N 8ױcɕ2 sBcظJJ!Lp}}}wbs33zܬk'/?opBEQE\q‰Z;9OXjO/dZIяPԯ۶S ^547qsgFsұ'k/rrs!99t===LO),~MDS'M433}ێgnf6{L *=6NQԶ:8(ϻ<:"N*r\mG;u'&V,=1tGĤdT5ӻWv̔/6nB> 7dϞ=_rjsi͵6ߚD߉ 6I0'>:ԨȈ!cߴY`brM==vqN8O{!۶GIHn7nEk_S=}f2o͵cT3\ a,[*;;`ժJkrs~&=cj54007| d2Yܮh;F mEz_6,i\,[?ƨZ:KwwPol;{xkcb==1:vBM!xkf.;v'Ƈ[;._qO +'7JJp999 <'L&gp9ǀ[1W^ *>h}kz[M % Go%!0.c1MV5|<.eVg^ߎYYZ\V53s 7 2iǀchhr1% FxM5005d0L|3  ,. @l [ @l [6 5@@l 5@C) p @l Pbk̹CUhبJ)QXۻ7D}(3N3zu^ V7ŲIӦtܽ 8~{ڶizŲ6mZڳĩ3aoF OMK5jG`:*25 .4lN9},!Յsu!:}b~~<K!/_b 0'jEyy> !y3B"PzsB B"H!"[ϻw'KJ.--MHJ&KBrrr0PaN|!.^ ~pFlѼ.^fe8xARhݪU`c##-e4uS6jI /O7IPLE7p,XRBtuAȨVmצ !AJJbR qAu}܁Yٕғx2}e?-V(1CBⱇ?>m—ȈaUޝ1m/Wov{.SGc&h_K o53O{vIH|0|noݹ7L\_M["b񊟖zy1e- qh.C:s~ѭk3gщ4iX)&ܽwoޜ zy$!Qˈ 4`OLBP({b B0#54`cP(~ZHN?{s33C+׮W*)Å/[xCWI!AAffysSɥ?/BP8j:'3%%H4"dv^GP(SAxOvi>\Awg'TM/xcsZlrݾsW{t:-q$׾_9{NPBݸIMfP  \sw8~ԉZneiik@œ[|~HP`HP(!ئ-?LJϛ9'BQEQ RAM ,-)01 2Yi"eK 3h&sȑ ۷kmO=]e !Dղ\.1gc*)!0L]etSǑD􂹹yƍ\֭KRV=檑4b;wP*N~#}&N:0:iXD}H]i~PQD XBZ' !Uc(u֨5+WhiB{sr}ษeo;۸9˳w\nii؉e:zS\]vkfjI&zUړM#|K_L4rx.55 sBny)ˋ&8:{~mǎL\b- jy;wyUR[##L вJiԵˮ{ v퉡._ IDATqU{~-ptpHLJJ9Qƈ[222 S{;uSP .(;M.{ԝT&r'//oێ7e>zM4fXqpvR8;u2bRRą/ztݫ/[(ܷwϞ~;S.ۢyQa#}z3u7ZYYTPS~n2lɲR˓Npw[diIIIkY4`!k^Ҍmۣ$$|w7;uvƼ<ko7oO]{cf gX.wWvndh}7m\}y]m7]{ZhvmV_P(u#~>@!1L@ buP9![ [|,|k(Bry9Gc3j1~Al u\.g7iނgh@*I}T.ٵ":GP(6mږ*.€@m޾yCPX,ѡ(JRTܦCW &Jcwo%03}zbk[JeQQ!W\Tw,k6Ea̡TVT()u#KTJee"V[C]+5@ =aX77WUի̝ppC#76nٲŨQa666"4l^ڴyW G`PYkV2bk@l %K>L?4eG#:b+/ aۼyKyy _烷 5Q+Ԝmڜ9{Wϯ!W^k;YV^^ /<4t!ow/7n<~X{-֯۶ !+ v!R_A?ŋ;o߾P(?|BBػ7%%%C qO89u=*@EȨQ`yyȭ.b}}v>H^U\SFἼÇx^q:BȨQaK~Z֧Oo.@ rww[hɗ_|`0;i$,<5ueW0ԟ.uE &^aOKiɿrQºtL,.U=qϫVB֬]?ea#GL4A.ܵ;j{Bܹ{wp##}t } y["ܵ{PMCJ{cbr֮v//8<55r~Dvj@QIGQud ᳌5Kl6Zu9{nDB!!䛑ltѣ oϸgyy1ߪNEB!dK<z z8t'O1}!d:19ganF 6lCUzA(.]R*5<{Y3讍z+OtM& pԦ:u!FQu#W@PݶGd0ACoaaN/[ZZ>>^ӓdigdd4rDh U-,T?~c箧OzEa2tznne?;'gɄzP{}8CQTVV_6<~TS|s33zœ|ZS !c PF ٲuqzl~JP~K ծ]rY9!}E/_f6jԈa*ξJ;oE]qnHRe~2SyՃDWRR2:4##ޮvf\N44q۵kH$ʲ[J+++p8X\qCڛO|Jv&MK/K:ޮm< : wjy2&*G[>ф۶&2p%TVt_tzTj``sU=2redd/@hH0!ĵo#F fiio'rD-[6?w=zto!lVmڤ^mw*55,b 7Csf}k섢zܵwYgn~ckM;iʟsrrmmmƏVUm6>SPE;:lGU? ^2ٯln2t@_:յ/a+Vgd[[Yg*޽ U bOK+-WqnhhݩA,TAQԹ:+ ջgISgcc`BHIIɄRz2##Ub iSUzŻtYS8|>'Oܽm֫W,kӦ={O:UGOUbqUZT\%01Q-gBϜJ&oV`br>^wkFK~P@PNj 5|xB0++P" b*y@Sq"& 5D y2:~Ua2ݝ%عGwg&%{ 0'>ϻw'KJ.--MHJ&{wĵL&{H Zۺ{U.*VVmEbֵju nvnXo. [ TJ!B~a8sf;/;^G]_RGv$8Y_R^ ߯/((**zk?\LJ"OKD췷CFQUro ~}BΞ;?{zz 6gh@z}Ο:]8gA&޽[>k 34Ҭi>oڤɽfMUގA9txGsj;CZwfvf0ۥ9J("d ɔ{W``>|P <4MGM@@n P3Po . 5rk.Cn P3[ 'ʕӫssERP$( ǙEF]!G@[h5lu] wDt/^`YChNnqؠRew|_ZH$F+,,I:5KZ!l1@|Ih>ݸIE N!7iz%"B, -6n\*`xdq$ի[kRnSm9ܾsY3/]07ݒ-[CYvS߯p -qVrgH{3W,]XpO_c fЎ&4zAW_/n_W0q>^u4x5ˎq[%ݺwݴItM1uWAt6<ݹ<G6oU5@ $6v}sr|ݗ)R<= uKJR9</=rH$ۻףGUZE[l! $ɐA]Q^K s'߯Bn߹Ӯm Wms?[#|eRi7~b@ZVyyz= 28|D"J8h`u:=#k<빑#"|}|dRaC+5VXl JuK*sUPvTzvj#; WM0!a֭ڵi} ?C"r_ﳼ9Igā[aNB ڜZs?k N9p@>fO+ӕ6_[*1Vmh6qwWX'BdҲ%=xh_'!+Zl={ƔƏ\top68oh6?z)La{dg 2bg(X,_c׷2+l`g,6TꐫܡRǧ΂6USf&O!l0w޳W0r줳yTyW9U˭֯>sf ڵ뛷|E_]]JܼYS봇Z[^!$;'GJe*fS'OH$SgW΅BwШQT* nw  kֻ3i0h)]v}kW@X2;'TAgu}UĖ6۔%7Z[}T8f*t9)iSz/T36ά>7[;#a(y jBv֡a͚7OMM`իזXe6'M]|-;=0,VM<~䩰3t;.FXٽ7KNߤussTl.b4%H$۶skh6m!!mZM<.&;PR^ݶsgJeX3b6m_fLū@X㿻vzOZ~b0yZ3Z=e_Uҥs=V٦T+uJGYЁcB۴t:]̆ mBP&[3A 6gvU*P'5ܚc,_m1w,\D׿QY:j˛7o왁 ,s ?>@ńN;WM*o}|2PQ_q{޽.۪y{ڴnE i:~B[[ɵ %ѝGQǨssxW/ `⸱UkקdlJ:{ʾ%l@q/io^7nު0֭Z-d0;u,n>̂3JVbW^=޿t&ܡêkpUAt6gvU*P'PwoQeVviioD sd2%XCTlyOlU:!xwn/߰^jH<,wE+ٯ Ph\j/|(Z+ MFbܱs穓zꙕʕ#XUS]C5PjAI+/ɕBplLrTi,O(/]Jv޿|) PIM8ܷژ[+uǎiB{??B!TaaD #O53Eb1".5FR^Vvٟ~L+H4' Sxy N([8EQ @ T*E"L&HPk wEfz:9i3779e Ued(~D pfzMT"v)gF"<^zlU&QfX,}kM#PID" ɭ5rk` Ì`WNIBK,L"# NɭCը:wQ( _xe-J%)*+j֢, )BΟCn 5O7nD.G 卛4tp<HL8>ɤb5M6[L l^5u[1sָIS,[իxr0[C-/JO!bwRM}{,"h?Tq n޺?!SR(aaCz|aQQ؀}znɾ.%Bt8!|>'NQFedf?yJ$M7Efip[,ӺUFܪ*1LK,>|0!$l`؇s B;]vuoO4cqAM. ~Sjgn߹˗.aCnh/|ޮmȎ]3&4zAW_/"k}Kl6*ekh~1`veL<~"f\~IDATtc:cFϛ~XbqU˖ ߸yV]{UM=u[b˗)=<t,&|G$&޺uku[}wQ-^\63B1uDaX9y kBiϿ9[&F }#+ŋ9K$Q#s/DFD(JeJfW-4ju:ۣ*_ύ#JG jyȈOҺ%/%qWAìl(z~-BD"2hе7| DoڟOٹc?ضcg^q PB=2rH^x[>=8ohBqǕmwwuB(LfFNVr6*6cCG~{L&h6TMui%-Bd2!Z"R1!<ϱ8VP:e>!dKl7|pBn 5ɖBg̜mkֻ3*CέW/VlS2A Oqk׷n߾vR <=99b%$;'GQS!;0t@%IaaU?&痚Y愐۟OO80|'M. Pb;fY_PpXbp mLbgll.;퉏hvO\6nnn*Ur͙*a!ew׮_SO =Ot;.FXٽ7KN5+(HD"Q^^޶*l_^LpJR.60|BH@@@| _~C\[C~{Ef[yn}:7op 2w 龽{ݸyl}|2PɢڷbCL^^^l<ׯOoF1,t@'^ҩcj*VcF߿~&w{].QpL*oڌ-4_?BȀLn_ÆZC%߼b~7"Gz0ɔ{W >K﹇sg7TM>~ ȭ"ءj@AAP]B0~ JC==!`]_nMN y]űlAύ O5#i/=Q*pfY,5  Bb.C$!΃? ]5 Hn ȭ[ Ṋ9(Frk5rkPܚcY ܺ@x=?[ )Q=P8Tt>rpfnnrBmılAύ Z"<^zlU&fX,}kքPd9!8v ȭ[ *'(WMq/aYc9f7Հ;Ȫ[M%/]Jڶ}GFFfƌԱu~a[SS/Y:y҄_p8;vJMKzUx$8(X =h|p,6|\ R K֎OlA@<'p"bbtE'_t7>n̪˩frm/8Neeչ'W!WPU/ {BlpwR46d?d0eBGʫ/ RP BOXdtՀ"L&H(8 (.X P}"4ZQ1D"]m!ǣF'M4xEhnȭ[ܚe!8²,8zX1DFXqM9Zo5! à&Ӛ5[ay5@5YFI9ax,> ,jR{#dI:O2Wi"JTI%H(~c}BF.(͚8IENDB`kildclient-3.2.0/doc/C/images/cmdhistory.png0000644000175000017500000007024013215302470015646 00000000000000PNG  IHDRc% pHYsktIME ,ZtEXtCommentCreated with GIMPW IDATxw|EǟNB4 @J$ 6DE)Ho@XDl`[ 5jHBByrewor ~ϊ{mv~33 Q0d2PWsXaN~nΝ.w&y]4by8*!戈+GɌbtYk8斒% *nWܘHHЊ=Z!NRl)@Ͽn4 jyqsr(8J&}.'RD8Nn]T܊NDpgtND?rrN⤾)Ne aZiHT0[".&qIԏUY@f&?t@E S7T-2֖ҘLQH ?mՕ:46HVU~5/K)*a_UX~_WA\:$";?#qbKPDGOIu$agqSw.hvFQ H&tL)Urܢ~LH[_SÜ ;PX18uK!nvɮMmh4/,,-X⼼bqb]^^^qql_[ q/.T`0 Ԑ$;{~b5~䝿7[fqL\?(M1NvV"E (< !xB-^^\0tWlKoY{iJǷ}'GOH\ubaʳ8S!}^n'[$pay Cn^^xxx͚83Z1n\RzVB}1blҘLFBM& F{Ĝ?py 4"lգ@|9(+X5ƒYNN$!PJ:'Lؐup:VpnՐ䱹"+4WS+c J=OTZUdďQ@Y(Y,Sȉ$-AdºG(#x f{*]©>Jꥸ)qnuiizߊ $‚&Yb.vٯ_[HnǏMF]/L+^j妍ߎ7i4$򇔜DDk֮%"F߇*Ҟ6n6}Fd]=w^Nu"Ș77mtҤD/jwsʕ1~;8.44m׮K/^ǎ(--m̙W $vGk׬-=klN}%?kժU׮]Qׯ_ddǒs&$oڴL !#|7n]fJ"",|q:u$GTDpeN;DnЎ@,.a2K8ء"Jirq#tK [إ[Ƙ6,m~+~p67%Xwl,8Ceղ gO}BY8aIP4LȅI$EM.M#6Ddo͘u;RET$1qɓ^NnZbu(Od6rZm[D7c Vk6>¢ٳg97/7l2UavG?qŋ>}t!ŮJA6nyfgΜINNZ5rE,y%OO7x 7QA< 9&9SrW7jX\\3 !%Kv񟸸ڵ[tYY'ZgΚ5{ZSψY#?ÅW]Uk4p谷XZfwh3g9y̷cϟ`q ]|Y:wv,Yj9Zjꏿl?rHh޽{t;;v\~}oz' A ѐ0 #"P$V)$092w!ade" Go8; ?>OK /bE˵b;8z1x+F/M'XsW(!#$2SZ4҇G0H)SO:歛sKLL3wޠuzd6 }[/җ+W-]lN q/vUЪp=z q#YDwsNǏ:_|զ?~nFPÆ3)WDW+vLnذܜa?I˃+7;C׮<3f? ow4?:ɡsf͜4af͈̚R(%)1%*c?lßǎo%_}su֛&3c[|7b:~mr2g2HVME^GmZb'X!UIP;fjYuB[D ͡#"0#:DEGQ-&3'$-=H#ds`V:ZvYϙd琿Nj K!'G+ٽ1l_P$q~H%&d@h. "\:$sNg0At6l,**9bիɛ6o&bd4QbeZr-9u%=t!ƍ~rUzzBܻYWɠׯX]k8'1@bU*iZ͝ܠckҼypZӵY':wVg7>uꔀn7ͷD2ƊJE>ӱ?uiE8 ϲ;3,iҬꕫƍ}QswM\p+fзh6i&AA;xaAAA$`P'?DJI% +!p#ODFcqI8̢gZD =L8x HjDJ hqլ@@E)``Dlt :d1&ĘdĚcle yxgTkDC+2N}!t;mj^&Qd_KZ~CpHrsndg]uf9-=[pvBf۶m\뒮^a ;-ĽUi۶m?MZh]iդ7nXOXhQ|bf[׋+Ϗ=RSS?dvo޼oС`\= z#JJwv7o/-K+57ƾFAh^ k1*Ɯx%F;?L"{lzb1 $iD]gSĘplFbH4I|rrd+e!VH &*wpIGMac5xE89ADNt*`V0yRK!}HRU^̩4j-#κt_fg]UjSWGګB.?wYhKΟ=bWM7x{\8wd(޴8/=/jҒy3ƨT@լVM~Z|weK=ߟإ|I;ߐ';0~2&O4KcG ybV!l=CƎ޵~0gG^Wكޟ4̙3O | `&MUVNm_ C/2&B8'<"x>eRV +oyJHrF#F;-X,soDB%S0WH*1eコ9{ºGb(#Ϊ,V{U!"Z]F OOxzdgg4c}|j֨V`m )..R\\bWj5+z>5%YWtkСNܸXxϑq[6MIKNO;wrj҇?F1ynFQ3See]7D^?"jɐr}|`n(qFzܼ``AIDWZ69EEDPݯJJIJTk45jtY&#^ZU렭%KˁXyfOV|'gKrNdTi J%wLI2/깜ҠN h| ;K\R̝,%I+:Vr]B&>Itu%ۙ SW~olNrdO :Ѡ7M*CTqMֵUmR{)OjuZAl6عCc+)Ǿحn}7nXj+>MX3`GvTT3fΊtEnƜkm+%ʣHrAxi#7dh\gXTbȹ8dY ʄS?"=T8U<ҢGjT TqMN8<8Q:(m-M fB ;epM7 #YKRC/1%jĘrc~%Pc\P{gΖ%'+M@WB'XCSv`$#-,ԡ$ x?9p,v \ݪJ3o:jAU-RN YOMŶCvaKs5H" UZ1&x7n0׮w:(o˭xihEI.{dܤ=>GuT 㜞RI24jS9KHۈ7 [9{Nt )CzHM'S9Eݑ)&U͗p9f:j}/ȝW<=qQ(w!p_0K&#yUP[q"h!`ZaWQf%kZx&~^DbdҨnvpo5A 9i+Ё-VHqZ5%7 S]!u!]S)UU"S8֐9T-WUeSIpoOdQN~; l|Z՘"X{fw;'Mݙ:j1 %jr| zE3dCw/W016rheR>5'đ\ &"sphI9NΙ9*Ky!\8 81'y3c?D&+?g Q &Su"/nSבDco'جޫ]8j4o& %$X uőHsFb9>9M:$wH,FC ɘG ?*G+ǟ%3g9Y|>LzPNdčP:X]L7˅|";$ +S r吓 "$~&k1Rcét8cVq̜Z!'p%³]oSezHn+9mĞMqO7;Ws2WNr*r0ew52yf` DN#'I4L9U!Ga\ @> [ } "R" 99 * 2cRB'A]ΜM@(pRzHK$JtoRX,HR8@^Z}rG9ջɻCt"aHβ==+zʣ{S:,\4uɎH&wh&7ApBQZ<0h( 3(>…:r/fkN}9D N!f SRP $cr9e)Gə!=#.YNT44]aO!sP1ATR qJN"kY=hBa牕AܜD{HH0 'Ҿ0[o 'v$Y\QtU &h+\0LtGrъW6' BGܑ3I6/dV.<ErtJizWPPk h 2!"$Uㆉ;`ߙZzEA8/gA) H X?$C|-qRD͜C6P2un}37gu!%Ĕ_Z!49uzJG:US^g:nᫌ lg2 $࿑rٝ 9S"ce;]DH#:ˡIt7sI0d%0…Sٹk>'ynP9yʣ{_FRBQå! B r5ĐIt_H ID1O qh|{/1m :.q(YR+R/*3(iR]cSRN "YMvu0Cl]낳*t̉ @|UPjNa/d-^ZRgb g r8f}1w IDAT"(U)82 >û%p0DDmɜy{v7OrU萒/"cH (:h-˛6PwtJLQϵbMQ%ĪwwU;]V ITAwaVcCxT䪟KܜsAޏ7_nʙ }<,77z挳:`0ՀZV8rO5yM> in^5lVqF#W,/5*Rl;~ԩаN:*dXnN^M zlmh2cu]JHQ.0ƈ CNNѣGzs#3w>Gɑ rr|xqpwc2rrL&LUmnMyy&$$9l63ff \XrKy+?gL'~֠ܺ)VfjӪSno,l+#×/]"zDtȮ6[ץs8Rzڵmۮmۙӧz<`C+.c4-)Ff^PF]vҦU+OQTBEJMȵȨh?<<]ϝ3{n= |N;zHQQщ':ug wK0ȨW>ߠAt< fY9nʆP?":pW_w.]̙=O_W^~ÆWDD]u[jՍ71$$$)jM(11Q{=zd|Aa`GUkժMlֲ1LA͚5hWZŧo߾ŋhCn2o^*=-2*zO3vd'H2`3MtB"1mꀁ߸#Iͩ9q\[1遇R?0ȱv[RF ~Su놇+[Ba5"fLڵk7"ڵٳ#Oyw͙أQ~m<uCl6Ξ8aDá>P=P@Cu椫W%$~AJ%U(X%1888%99(9)Bj% ,:u*-?,D*Gd]RnZZs-lf|MoooZ!wf[.bwK/XN~jذ:vXAR0z A, 4CveZRY>jӇ v}?+ nM&ˬ6cҥfX*oCY PuvWt=~5*}K̊ j8StV{JHHW8s 7LFA95(':3 &ɥ\kqj#g0ܵ+kYZv)z|5**000++lպuw}ş8(5-bT=,]׷~z)RHaa!uoUz[}s\lU*zgPࢢ»l>ժU8Nqi .T=Us\?__oxq;ʫ~P0k㲂qAhJ ̜D8U1۟8Jy^3{vΝt2.XZAA;~ O; oz/ zwrq]m:ͱg&mwT!L@Sz@UUE^1UQ2AC5a@Սi=TjITX qW rVvU1/*sGxw*Wm:Jz̈4Pk7*vJrl6?T98ݏ!T nXKNM54p@BBL 'Oũy ۰[?5yDp7m%e99g޼u}||^}ӧNܩJ0n ^ smà ~ۻ~.*!ҍ5=ʇ\?AnW?0)pt?DΘǍ\S>)d03PEeB_~))fsLLLtddv>8Ǖlm~|C֮_{nѸx"Xpo+MJ6OӦO[@'0%V7-hx{*5gjjj}1f6U*tF:eڤ4jrr:u@ "8}܁>g{>t`810%Ppp.zHQQщ':u n=R܈ƅ(r//k׬iVZzuƍ<==aPFp;%l#2*:fnݻQb.Aipob)l$٫7ovڍvvȨ(<Ǧ5g/r8F܆qq~-(?y9> oݴ8}8 WgbChΝ;{Y+$\(?7o=|F sng"T*V_-'/[98O< UHR\P?݀Vm4Uq*DpDЪ5CK0j138NZBRˇ\1FT9T*ǩUꇈpd4:]Sc5L̠7,A%t~ 1"?`]bZjԑc6lx <"~H%h4̌ڵkϙ;O-I*-[<..z%Cr)nEbbc4i?ďeCƜl/^4DPfYuvĻ2z1zԨԆ _-JW9UxZnT&*d.3iJp{ Д~`C03xFTk4ZOO/OO5& 31J1iu"w?no\)f {Kfv7[u,N0dE31l.mDDb=#2HEQ; ;8u*SvV9/FD{׮~'z?(O"s׮fْ%׬mӦ , ; /|'!}7O%|?ۺ_XF~\6fRUFi|"BBB6oMƷ.X GVcڳ.z3+r {Q@@^1UI3Njjh*Jp N8Rj/'F^+6sjʉ zh4zhc*O}|'_1_Wn' o\b3g˅6nlP =_侽{\p… >` lXnW_{C1 ,ÈKzd2K[y!u lT];OE7o\0'Frr(6 wo.' VqJUYE&Sfv:€.VB_,;w|`zLTԙ#P0W[AW1e ~Kˏz&FTcBi=Tj Q|^•u*uWuS΢ _ #G.^fR?bN:խke;5߬1k,r!}KʌYY*??Fb%0ݻwE߷KNDխ?w7$$D鉉)r{[ajc[eW:?6Eo;~ݣG^ Ôɓhղ]۶_X.XQ~SGf?ܹs-Ə[XXȧƅS-֭ҹSF  'JT[0Q,ߝGw܅h4Z8+ƍ+/wXlvvV-(""şQdTTDkw"DEG??;vcٳg-Yb)9..l}eK\r~ޱc޽UZhl~筷שřL&U+;xpS?9`4ΟϧXsMc:p0--͒l9*2*j|D[8{l˖-<:2:>!Zig@Zq{N`4#|ݻ]5a>KD?l&Ȩ踸8"ڵsK/ؽk'<MD?l~ڌaaaaaagaϘCf VM6Ogo֮8c=M7Κ='<^@@)S~u]lYׯ0utKisͫ[7^?}(QmWXoyIP=/7O5h=4n є! wQCD3g>|!O[vΝ,Թ)?v˺u_QQщ'|222ի_7hn)v:OOOo-}!<GqGDt k))zD)fY*}iiiZ w}j SV/  ~r*}׏I.@QqjL粭5F F?={\Dl7ߴ-yyy5XfM6jի5nID!!!IIW7nBDVE`PKW ~ۯ?#SNkߡZ׭nWrڵ6m*%-*2{82yxNn͍4|F4a֘b] abu~װaZ,)S&OκqoPP"2*:fnݻQb.ỽhgL6c͜>#=====}iy}m"Zq͘٩sgf'NppܹѣFC:mʇIIIyyy3gLj[¤#Wko;U.(u_7oΈ z+tzN71sƍGܺus:P;޽+Gڶ}|"1m܏?*U?Q3MڵumّQQygޜُ=(ߖߞ1}#={hW_{}%K*W^INJƖEO ywHWCi-Z 6l2^L7[UFpZLj4# ɥ\MHf2;1䰧0&5Ix7jG[mXPPpeA7NRԮ)B_xd2* U*wM&3Zj+**un5FiѪGFF(RJ,7ܼu2)X~~~*.(0wqf}37hի+U!J`+陙E4_dWp+7٠3?߿>@U>陙D*9 `X333-u:DIvf@ExjhhXWzzhʂgnw'ԗn IDATLF 6NWlJL̠7q9nݺp@@tϞ {.]nެ fv~"#mfݷoOdd}{) 5 Ր+cflki}Krh0$_ܷoZZzFdƈe={vYf= Ռ\!&e2<"*%zMrhѠOOvΦM4jދh@DF1&f={5͓Oع 6]ty^^^&L|!۷#'On;DD=#b*ݺuK?l~/\lÇ ^E-[;q䧟~vz7fWF,_\ ΝΝYJ[OƍPTE%%֛o#olR@zN'uzNQ97"ƧX OO!C_xO߽{o^fZjUݱ׷#/ѨQm۶m>Pvu5lƔrs̙޽zUV-o!77wuSMs޽{?h?}䔶߾=ֲy^=z|U–SN]fM~~>^j S*fEO9^~n|?}V7BB}~Jb9>}=ȣO=lfu>ᇻw^bN)黐kFoިUKϨH"ݫ?\ HM~ض#Opܹ&N|oܸÇǎ?Ν.ܹs>|ի=t Z>44G?#qPyʙ1%c͚5RkiW;788xʯӎ?ӿ~۠A4hK>8ٮ4zYE|Գr珵6u̙3諯s~"ݳ+W(##Y&Dt={^3{vΝtΟ/= _,avt^f ۷wގ5\|[o5VXa`}ļ3fL^|||ի7㏥#VXll߮'CLŋEuV\)fC ٻg^FPT}Fb)v,##}W7n\q_|A"=_=wϓ +Wc'O٣_/^r cfz䚥,YJLLl׾=1;;͉~ΟODݺw?tٽÃouޝo/^u۶۶%$$XRÇlzݵ+W~޾}mrO?5c{/{9g>|dZ~quر 78qJp?_߰пv}ԩ!X"{1bϿ%;׼E GTɓQe/Dt}NwtG#o:vݻwŋ_~ő#G֬[{ϞtAZe˖gϞ+*M3Y0}CBBB[oy$%G;t0k'<ɧu{l6_q爈W^Uf!;~D=5 |rzjP u4٨K}|39p>*}ȑM4t/;Ouj}z~eĈI|s-Z,;|ɓ'M$quG/q_7n_6k&Ԫuk=w[k&AZn_hhD}sΝ;pل>=4,,U6<}ߏ8b?Ao0|<a͛(͏/ OP CJ|1_YЌywűG-nݻbE&.?Ŋݺu9fϞ=җcȘ;{` ?yʔ;j2{݋/F"R6؁.]rj KWhh4922w,7X{u־}.YKQ>_x]IIIL蚝x>K. ç1i"#/>O<||Q|Qk5_|cxq^>/A+m9rq꣏^ޯ_RZݠ&ͦӅ֫W#4OMgxcM ꫮY,}ȳL*͛;zZGͧ{[:ð^*,*zmh!33sޝ0Q {ն!_N)S͘6QhڌΒS||:ػO»WxԨۯ;|U'C0F%]~yY*ǀ5j31c"4Oo[cy7ߺyn5_5ZA!rz1_reWO{B]_A2AQQQQAA޻ ///___ooo1?S!Ë5I*[q:w R8'0"F/ ܕ8Nuߠ" ÏS=~RJhwA^cE pk"^O1ŗQ#w_>smi r_"*#"Ҕr||}Ա}VٻwpDwr;lՏ܆٧.^݃j46g1~e?***|{sƾNXhhNN;c/^8?zԴ> 1Knj՚|OlOKϘ3kƌSO:emm:{Y7 kٲ9Z^p,JV7k9f}6lذa+i1_= Âj<#GQVΝK 'NDt\BVN!"J_f/>a<|qÞ{F``={`%NC^V-OOGz5O`ܰ ,Itv3իKX kYSTC~x{nGYBTd~駆Z&M08#f͚ݰXtҨ^;a^tʫ#GBDcO?o'?_a>Ӻu+d%!999CDwXF W7~w5jAA!Te1 %5ɱ%۔P5-/uv"keINܧ~.tH^N޳gxwkժe#4$x=>>> kwaZV"jP;of?ժK-$"ִfv+իg^^vm" t-EEEo~[:``&ץoS慬!fFwYCY $jUfDDd?yxhؖZR#W^j4S-_n_jтl_iR_\Kf2D??TZu}oȼYPPaӷ|bNoؔ~;݂ :F֍U߬9cN6l6'';''{Mo㛪?~N4m:Y-KAH--PFJ)Eí}H+!AQEpd Uf'mZhfܶIڤ_n=$rl<%/Ԩ֬wŌjbQj /wgu #ƒCEdRYЦuc޽zصgݻ' .}x¶m<5W6ofѨ#**4_Z='w!##McfSejJNdZooQÇ8yQ;v%[bxԈJ3x"K2 U s>`FysbFCYǃNhtoegiu:hOmD, lNTe? ~Θkq@ G,n׮.8> NV=`"!a"-8!u ~\Hl#R!R8J(S(OQB0J !TB8FaRFaS2!慨.g؉PJ8A !0Fc&)2c58 !"De$rA|sz %JF:J^)HF !cjPTX^Ѫ75M^Rcc{0n,ťB8%#V0bЁtMSGY:S[hq-E(1&}T03)1PB׵H$sqE}1?p(87Sӟ` }:}Xp-R~6aJDaXo94 OχkSõBDtC-5Dqc;14PFcheDo]R1RMP(I c]J.7J7 M7Ћ?1T-eR"Fucf{}/̴ b}cMؤH"u[Lh 1ۘLkC`\I/Se(F*7wj"l D(}5_C3UXeOCIª~hQὃ1VgFCҘ< LapfLXdM1D$-g2SZh|5sd5? dx,՟z5 3DeVU!S07& b`x4ZoF_VrBɉTW&iS ˪vLk~ n/Xs0O P|܄e.~\8~dΕ@ @"ؿ%ʂ7͝04w+j??/'wǮ=Ty~^-7*Pn~rsznݤR)z,wܡ{]@{~q.]<=1nOO];}wH-gT~E%;F/]@eA{S+WRU8%gDGظϼ`u323)_cK/ѽw,yj[8w jGw9bAQVV?9%JiS&>rDVC.>!lٸ~U,Z7o6w_~C;\:d3f<? ~n\h>ܷ:> CB`mճX, 5RŁ/;;W~N߇6%M׭}]q>ԓ"W__۞ZBt: vii{,\LYp'+?<u.]Nٓ+##ףVzMq8/޹{72"|D0BVMM'!CO-H!qӧM=x뒒ࠠL}v|)qB, f!Bz1g-!䇣?ִ:%ո73~B]jܘ="}윜C|6+nFR4=wnᵺt>rLJp!=ϕ+7҂K,tZUk 2&-@흶wL6 .]Nܩ܆wHvHH\C7fW_Zx5աK dm/99 okYYx/p'˓Bzܺ}'_xCMx+]`!BVdm[ <QS'~$z̘6-[zK(ݡCp.ݩcLt= gmNb&?qt$\]]Riر/\$ t:Bȩ3ghm\.r/itRwL~pE2\OYﵟ~eڔlʤ|᯿15&GQ(NU0?}4??_77nf'C11 7_ߺ%B,Yeօ,Yk*eޭƍL]Bߨj^S%4blT$mcK(./juiLVu?1"G of]l IDAT!1soLMۛHDܩӉSrm9LQRRC)).0qe[8?;g815&&WO+v[ EE~v`@_^^DUUU[D%̺%k-Ye#72J7߰hԽ{#N]f0V%oiwyx,Z&I~?Nz}TyͺQ#̞%Jܹ/#JNKgWW[۵[sg{BȹsvV:ĘF?,Sx!g0Νi˖ˬ"/?Booom6|%~Riݒg7o%2kmi3.~ukJo46Sَ%oiw j͛!zYw7nR/+:to##ا۶jڬ56T۫BS!J ?ݶXޥs'XG р>\å'Lfu57򓌔ڣؕT*]CLNRVvN8 ݕRTES["ĒU\Ȭ/<?Z67'4QhK(;$D8oɥO>'$]+q"Hٵ//^p ҕ( Z7&ڎ3bJٳj:o/N bLja;v~)ӦeddA:m$s#.q*5m۴7z1\ѼtYEEE02"<%mo;BB>##w&VX,9<_X"ĒU\ȬfΙs?!?|D(Ne;VN^zu*JTG*:1'[?..MGTLmBffO:y?Ywh4i; X>@fVּ9-UXzMpPPTq@,iۜrzΝo҂Z:փ1Wf~b)ӦL8 dFY͗lٸƚeen,AzK q*:7^x<lDbɽ9YYɎߪ'gFǕ޸Onv5nkf̗-h4F3Kee+]@Xߺ0{7:x<lC@ЂfS_@ @!,{0' @aItVj+~H\$. !8ć7chZkd2Q?ꌛ׵D"C|$[}B~^.APDէO]Nn'b]v3bBb1C/b~XQqI>}$bN `$z{)C|[ֳ ԗRj4RӪӳ@!uٮa8!ImlBsq!8d>m۶sz{oؾZ/OMݓ񊏒3>q\,TEΙ~3e2OoM".hz"#N# hE#G9sF@@Lb%C"qqwN23Y7,V5+5*rիB4k=9p[J3e !;7 r챟&>B]\\kɘ۷oۭ[ۯ0uOZrʞVZ͈!BHR9!ML޼2?^k~D+((l:W^ݶm !"X ,XKoh4~Px-=YjjϚ7kV\qq'&-뭫M)y.@0OdץɓÆ d"777}{BHNv_ީcg>Ol޸7c\p/>?w˯aI4??ߜ 'N^8LV&{ܒm"-{ ܜ\4k\MrOIg=Ûau߱Klnak0e5nܘ?Vɽrj#>ȦM[Bp->2/O㌌J-ǘR0,kgdfi47nd$&̗Dc>>>ر-6ߏminn^iiOwVK]\\׬93_"K{ռ6pfiּ{z5{?pᯊ Mqqɞ:wlu !)q6f@ٳwNIhof Em߱{˯B8nl_޿_ߥ˒ʂ͛7/9"RᲤ|e6c&M̗3:d׮%kVw}3wVgfnݶ#1iB9:h3_"-{ ߎe/HđΟyL,6l+WI>0oZ[WoۛRgp ySR{#ƈQsn@Ӷ}ǯ:1Cp!x b7 c?2 Jćࠑ@ AćQ5Jʂ7w)h RRTL)C.x-:9d2ӧNxinR?d2wH!8će ^ َ)W323 @!wgtć-^p𫞑;Ғ[yJeAiyZ=P)@!J\PTܭ )uJCp!snd?"JIk(l~D2G(%b1t@|c;,p1a8#Hq|8Yq^p8'b8Ƙ8Up.~t"8OaFmpq'PH' NBX.ʕwV@ x^WD"DV Er\t+㪞|QIENDB`kildclient-3.2.0/doc/C/images/we_hook_edit.png0000644000175000017500000004434513215302470016130 00000000000000PNG  IHDR.ծ pHYsktIME *7{@MtEXtCommentCreated with GIMPW IDATx]w|BBB (?)@*.UT)P^QQ MM@p}~l^.nvfvfvwyg=p͡m4̌ q\H90r ZdRXV{$kiѽs`:BnZMq^٩2LIGRYA]ڶr-r]a:2Ǿ|#C&(ͳ3#wCZE8Ǽ@,FHXxX AaX(*^>j[L+K9Ǽ?Xq !X*HUKd ?yv""I"R !|x ^q%J$"Niy b'GuHq4k!Z3۲tBvQ٬. ICF1_ci:돯,"҂LNb, )YyNPGdjIVBDC |-̓^FmJB!WDľkR T0H"TV=?''`PYYN3 yʖпxՌeme)!"Av!qYyLlqʖz`l:E7"!ҟTd-7k>4 HEMom٬VV7 6tFkkU&6^7YVa423zp 5A5Bmm6^oZh4 FCx_ED4^Gֵ뢅2 ^{}zzz?SG#*McSteRG*5A Ƥ5; ACU΀$+ӀUo?UQ8LSeרԬ6TiY+ k$CֵPL\NҸK"Ԁ(QL\|<&Z &X-aaz^Vq8EEcYgeeRF@WJ;Ⓒpf222BCBt:͊9]NDu #˕t:~k(*,\CD(B媋k. ǘ&`Ig鞂k~URHgrͻ匐j%p*aW`=REszfqs9 fX%4)/]CSsm>9o%o dhQ%ZN[BD]'rŽ sSp"jI!dYsov^o۩28BL GGEF l6[^~w)IH?""FehYmZ)8$l8wtxxh^RB\Nj;V+B(44 ))-nj}rtd7ʡC}KI/䡇IDKP;L΁Ej]@!6;u#Ps. dKt4ꅄ@@VH_fpzhAƹY5>Ԕ\q>B8yQ8ƎďɊ˪J!<+UiVߊkM̻W"NY6r:` S\UәH޸a4l6͛efe:].! !˕enִD&[r\E-GVD"!˕ci6BЍJNnTVbZ=˒t:Ğxӹ}ǎE/Ν?x~\\-n]1عvrB]rouWyB@$ab "px#X.0BƘxW AtcT1,bRcׄ F e ,`_#gYD+yWU\.j:j%JV""hiDJ_N$TR??Vިvh4 )--59331JKKCCCe/h&%Tf͜1q$_.d' FiiH!X9=ƛ30/ZijVTWh jB$Rcr=M;A|O萼P,4LdʹX8aw 1x5ljq7 YjͶ dFK&=rEDDXo F}nTVdef6keEdTd^~^9]ȪL?Իw;w!ʊ|:Г r ""M))l6kxadXϝw;c3–l˼ys/^xwT UڠgCj(Rf[de+5n #0ͲWY, kk[֬"bviY 42>J{-c^ a5Avrʕ+KKJfϞ.|PQY9o\'&iqjs%%t&ߟ˖,A !DeRRRvZu.WIIM"#n>AΝKOؒ^ZR\U˥hq8~tn޼rn;y߿.^*,p\ňVֵ[+uKuGh3eeW hux;3-[Fed;qȽ_d)e,YC%sss^}eꔩSRGi O(qK: #+bN 5IV} 1Y.-mϔ9L,./3kښ*dE+aQή\_q t.nyGv!nw"WEf /tκ*55a(&dFC0v9!Ufd]Y|CEf CmveYag֙3g_vfۜNnwdvLv`.9j,_=әN5'JwC0TXX`kw?1SBwG+7A.0THUJAfrgnY)B/?jRZx`{Pn>3ƼB]Bh[o=sn`ϟ7zٳ?oA`Z;w~pW_<Ţ%ƑD( Ky0Y[ h#nBE9[$T(\Uj#" d5kݏkFt:]XD^//+ H'P_F|nׄckа0`ۋ (V7v{qQB5de L&s@Ppa~jB[l_4Cp-:Ħc$ABD 4R$d5ΊVbJH!⦚DW'\ Wx~m ˕r2h;6aw]`0 3gv5nXj].WfffJJw]w drh۶-:D%YW*YN7[(3V{6w68h(\Q^k;_|[mtׇݾ+9y}޻e^8QB+XZɢ}=^~ #. '"^ Z⫱b@-QXq%Zbq%JT&ՄO$^Eoi:4plPHUb Qb-#-=ŋ MmVϘk\KKk&z?>GzzƥK 2ɱXly{||dp>&s8/_..,Jl(BCoe\\c(_GFg+--:d03W{{糧g3#((hu+vl{K_@up:Ia"` #/`TboLbkqc#`i| x`"Dݍi&Jrz9V 2"\ʃLx"&𔦑ֵejE6^Ooc<0Fƍt:^o$> ?3+3';'#3*qllXXN3*R||@@@fVfnNnzz:];#666,4T+xzHrlO\ͱĆmέZ77TXH m7q80dV` mxX.P5 :5gʈ\; |bZbT/< ! i&^%BMGEE p:&f)Y3/(ް:NNg7zXעka *WW:dm$L6܂FXf&.Q>r5Rp Sz e"9 nV@F <0Dl+\Ad.h=3(bcB6"Sp4g} Xlzg^Eaj X,y9) W\`a|Do(Ş.ZpUj?E ҇[j-~@5 z+/L篩ekV{s.GY(ZG_!fEGnE~c&h,UR|9k(fu0Yn3&n,k@[.cl^C(!f2=۠j2݄tyE%K2R5:GH0W"%H_VO :'k")z KWp̏{rp"FHL%V0yp"` 3Lk1=I82Pu`zav9v8>h.y?=! "BV-ѱ\/V@ g I*6Rhm?>N2hH._ʙVd]5MoM81[GO޴9O_S, ƤGtDbJp:*0(byr)k&9`f-ط!FCBE( aWXZF'X~z],qiQUGȚ CD~?uw*"s6 of-W$"=卫MM4i )nn1ga%[@Jykp9hF;!+ | r0{OkuN\X@\U"{&zxU*΁Hӷ',D^G2"*ѬK0qHY&뷼&/^cm1 \XVOt5t^±1Wh(T1} H(I\8˰B2,wl*h,,KJXC+͕Hky35d]mcZ%U5!^}W caCJv% 5(P ^ U׊$$jrZi"/Κ(amŢqHA%Ǯ"ʁc%aq2: G/B* s>%uĨL)E7eBVh/VwTVQz)ND |r|u 9Vl)fI[܂ʈ H";Hp [ņ q&9UNlKU@/H6RƒH̻Cy + B҈|5s!D C` 270/K+݇LR?]W4Z4G1M#|Mw,GŀHBGB& sK,!GXƢai5jvY0,{֙kȓh2"rl&!w\Ǹ'Hؠ'rQLMk>kWr3ݸ;H,Ix,$52SFpv!$ncj&l"Gx"/f,>'KV%{[H&\\J;eH#-Uf捨pV j"upM"Aj͛@Dg XΒd(-0;EEķY_B!#= _R}GKYNVB)'KVHͤDMyA1uB"J6Q'pD94b|$H,Jت4D!)4$ XA8 H[+ ew/ IDATTB]F7EF*GZϼ=DɐPS)p#y)"',j`q6{ #'A=(#jߕRVS]^ir!j(C32ʘV+z[A4׾L){ q^)Afx99rU32373fw@VѣG׬^5lس={ GI!9˰=#_T'X\O0]΄pNW]Ͱ ꝰ8t-?yEVVr♇8(ҬE_h_+YiǐիW.\S۴m{̙.5k*q_v?:uSTTyU|$@SKpkinX6+O Hd+uڬAD&b*7K)]KH_ZU̿U8/7g^z9]R)!G??kĭ[~ᇊ|p„~~~T'OJJJ...n޼+ؓaSlϛ7M6}~~gΘBG'ONNN***n޼ԩ$&&"Ν׮]>}zs嗫8֭رcz=BzL2%))yN{511#裏1çM{ʟeֽ{VTTty⤉T.ƍra zG߿_ҮTf죈O/IY~ؘ2t,lju|\n\n1j#"5xi֬J)gJJJ@@@ӦMwS~\. $ǏpG۷oСҥh޷{>.^ةtEBu%?p;waɒtj̈́ jB-[RSSWXbŊk׮nٲQc-ܹsGǎUe?hѢvvqT;w,\ц NǺƷ&%>}fᢅ7m'3Bhz"U-D^݃?P&FMքNDѭCh9y1SUI U"ԜW -`,-Njɼ#woVr%"#' mhRm(`\ !A׊h={b~A={ܳga{zڻw ccƎ{t'M3=W._)WgHpHaa!,QQF駞r`qEGDD?_~a3*UCB'M 4+{&Oҋ/:tG~aߤcc{yO rc_:oHTSV"\#!%⽏7-@\IRsةD%ι[&3I 9bO2TR#!+H6!lkξr׮][RZ9SLA}ETa1b244n4lv;㤄}„EFFR?„bJRRɪQL4uycOаj,ʇ?,,!7"hl6sss_3_F5"Rc5Lw @b .J-b$#{b _exPDQ#^P9vBIrY(IoM"ȨFGG+!w{˖ۧJ-[&9zO<9kxxxŒФ B(+++"<Dz_ GGLD415H9o[."i%+EF- \+Af>VҥH'/FTJ\|=+k R@ѳǞ{gTH>?Y$5-t^~}ҲGPPPjZ:޳㲅Mo)j4ze}}_c{K R`H`yܺ*`t^PqE D rAU" 0ٽ| 2Z PU/ Ȳo /ae ^k$*/JGZGka;)wRc_,an|Mn{WkZJW*5->֑ VUܫ#Ĉ3 Vj|z !QwS_ iPI|T4hVۡC=Do08Frƶ ^x~ Icܰa3g\.W۶m'Mӷþk0q„]_}e47mZ֭Bm~N:ҋ~~~j۽bIee=z{f!ϟ7&O2t(e\S.t(FyԄ6m9 w׭]fMxxCEEk׬~-\XPXz՗>;to̙[.s-TxjkV:_[%ǟN S&O4?y gY *k|a~|6m6 =53ݻuZÞ}Jaߏƽ^-[ޛ;/>Ippwٻwrrr c7࣏"!ʗ ճgrM^|eݺu^Z^^hjl@^g~w8'P!Sok_̌yvӥrK,㐐YtnUR>ʦo){?A|C >}aܘGFFΙnTT`Z"q 6s[}VB~צzI"V`0 2dƍtf3M~~+V('_lyzz鼞a:ѷ_ڷFW\v8.\8~<>i„˗/9N@hXؕ+ :6 ڵv?'Oj>04,le}`/X86va^بѣ5KcǦ5klkQ=zxǐݶx2*p O_ZZ Cagv\>W `#s0#G\*]|hJh^O|pVj =X ꙾q/AzH tNE03\x[(wΩhar[?20Qymuzbe}:ry-4 !!cɳd._v]MZ?0ViD>YFz˱pOH!hN!j Qif_S654`®C|B jZoRvqqIFFFG %p!! _ ]iwOPP0PZZr:dBp%񳳲#tg|Y۾mL&p F{&BNI9XWܓQVMl֌v|͚sBc͛^~&S> l3)!z+s&۽vmr:o8A5zg)'OԠg$~zK6n,n"]Gkڬ =KҲeK"02ܱ-.DEdeen;4$V[LA^^Ylqn]t׃@˕F~!~f0?A9֏☱/]Q M8tfA͝N >6ϩ@>Y﹧=ywnM7v~-ŋn{%m[zmڴJRib|mu8̘>`y%N̙ӝ:_z5rQef<1>n_>бC&Oi7,8Gty衮]:|a¿ο;띕˗ DvlKBؖc[C v_뫯))f;sݚU/Ÿ~frIOW=zdkCM._ҥKٽgW,[F?x`'Oֽ7ߐ_zں-?t:/\(vR8A[biW,[v~y=~U: G^E=޼yϿ3Yfq}ww--!<ִY B]͚&5ML<~o*_x~tLt#39ϏIe>"#Fc}^Awl6 3gK~ծYg7jԨQFyv-Xo6_|gHoݲ役x睽{H_9k옘lb,X$aޘvzTުΞ핊i+tU*g8[׮]h]vN:! bc9!¢h{LtLAa!-88n0v;}{rD89qrrr4IzOLX,HdZ=0RnNʁXZ,XrKAڶm.m[|S<GRjIIɩӧO婁7[|+>.Ɂ98?9:/w_~KVO2E}xOlrɞըѣ}KcǶW&M?IOdXډ'7IhGz?.]TG^N޾c׮K,b#Ԧ""r|SS|`0U>ݾ J"kڨF`::}Q0UT]eV?:>_oeEh |)ߎD|X1Yip/"+=`PlnRzH_`KfNKH0dB*+3R[2HG|M&?Vcd4 _젝`0?5x#_3 v-lM @bkB@!6=| "i!'@o  5} 54xBp8bzN[M폮ζv:Zwܨ(Ovt:hf ckT^\.7ٺ(8;[vcMm 9l(UjE֤z=Udc-BHIi--*r81v[IQQbfgO fL=|hNMzX~2$ 6@D^rKK s%wOhڼ,0 Pz{ln[ l3ޞyMm6!n9z4I1ϏkX,w?vF Ϳ۳g}n: :BU޸q߽|n8ӣܴeG:z]|!K }r…& @J 'Xgxcz``Yo",_9١/8rع+yF9{nYWvwg}_xsfi-;v}ovm̟;_|BoW-ˋ`ݺ \bƢ$ܨ:|"""Fc{]OM7;0 fiSO>s&aφ>s9bxdd!;N_T° <wYY/pnT~ܶ}^_gf?jw5`Wg^v=iԴ FS󀉊UTT-FOz̳Nw=VB8qAN/BΙ8is3;P~6_IƙM7MLGmK} INB(<,iS#""8$ɕ*4$ J>&ݷZLMM{kۧN?]RZH.Og2Ƽ5#FM[ 6mMzN?}Y3-#cStNqVՇ|Rz!֮[7zԨ˗.x{&B޽GgɒM=b ̟֮YtʔIwnuO>Y2oޜSO>YkZ4YڵkdҤڵ+.*NJ#]I۟:CB7t6>GWZo6ivn$%m;vDEGGM<'33kMgΜqm۶8a\PPBoǽcMN8!! Br%%m˯8?E۶+++;u݄'h\tC;w%;Bhߏ?]~ΜYquZ Fo?>Dk\79qys6m\}X)cs͛_ϧ3g̛;W8͛Й܄R`^IRw g``PQa!bg'2ЧԔ,dQVt:iس}$]^z1""`0R2v QQfGQ?űc###fQ#Ga: ȾCCC#"©šaǽ…Ϛv||7HhhHIIqxx8'ʿnذڵk!FCD}7v_)Cn^ޤɯ1tR, =եڢycGՃy͛g|ZfoFfM}AZ4o~q}B-Z̠^l1j ?Dψ̬&M♇"#"yͨH~!Iנ^Iv;wEE'8?]k.G޼/9rFVeيϨpg 99y+?Οs"gn]\6;;|T` qzڢԿ-$$ď{i[-Ō{ylBB<];iumn $~ܸnM^ɒH37lZА~}{>rTLʠ~j|wj{Lcss52xP!!|ܙ.5뽞蛕qPظNlA4ZmDt @}XQ4z_OnX?DC ڼ|閯ɔVbghUn4wca6CLAǏ54 42Ϟ́F栢2-=&mڴB!L[\KS)zI| Ajã BHiY%'7//ݮ0? 22"&:*(Pf+h| M8((X7ڬ[o204hMM&??[)k4V$4R 4#DEAgkB`'hض5B qaG0h&n@gl[vLhtriܵu C`Yh5k ]nM}mDp|M7@Ao]n T &nKc)æ1h QQhXBZá-Bc(5% ޮ5B@]kǧE6bCd,JIENDB`kildclient-3.2.0/doc/C/images/we_triggers.png0000644000175000017500000012207713215302470016010 00000000000000PNG  IHDRzM pHYsktIME ! ߁tEXtCommentCreated with GIMPW IDATxw\Gg4QP"ƈh.ņ$%F`5h;tc2{gٙٙ> LtqR(J%A5uʌcSHqfd(tJϤ(vb !D2TVO_ /Pr()&dxl}ˌ !1K;QSJD%ʐ䫏8?7u'(qVSB?yR?HX+~>8Iq\"nOJ)(Z"ma#) !֜zkap.,JRϥ55%2'\#ERP~BQXg`{w0O!b@| ʊzUd^TT5觨˒fAYecZ^.cjp80aS kzjZI-BzFQ՘t1DRϿKPUc!ˣk-ĵw1EQ|y3J"%u^o'B!gݗϺ+++ z]BX4X{*7X3יjiy "_.ZM[b:p_aL}0FqB:cVP\YJbV%Kj1%>Zzڈ%qImZT*UaaaVVVAa$EYYY*̉yIU ׃}>kb2ig&$&ĝ<= 0]ܯ dĺ)|RQ92!g <~g=if /n;Y?$CʇҎd{њ8vJB.z 8k?L x\ ZyM'Mat;OAHcCnȂ0r]VEQJPDIKT*XS*iiirsO13+AObbe/ĉմQص*ECJgdGNή13a ֨X0# 1sS[ hTVӔ&fJi)]'npx@uu 钓f@":KİXs28JRk"p9B*Vw\]mmmM+BPJ?1|(L>O .<Úr/2 h6BFG ڊx??0$|Z=,Pdc ~_O]c]-QpX;~V}CAu6=:rf#f30]Fv԰F5j{`B5I#!&) Nލ$5cQof3TP*)ɾu|1F"‚Bux3J";|F y$Jݻw!Bo?6m_[-{9^p(]j!$&DڔyqbFr[fa 5f7,;5,vkMAi<<6(R4X;}?Xᡎ͓$Ѵ:{HCWDV1~@RcQU.Bei^Na Q-l''g+} \&uppήJKیʮ䉘ED?~m˿񧟸iNIIE|K3g͡(ꇕ+~ݱPRhĄDPJJIw>eԔT{߾}h^3)ܛHZ&fh`%7ӹXm9M}\kkkv+5fJd~],ִ]AtGpBY5FJ0'1Ss̜u!#zs9,iXn%*^ϱކis~?*2++ںP._~̙yyr`ѢE+VdEE6YY*R0LvŋϘ9suGOĤk/7n]F "q'Oڎ [4JPB@.dUTY GKdMnvAAWށbknܤ/T*grř3g rsskԬZzMˏ?|Zkתz͑?xfR<Ʊ("nf#ւSĚ_Xc68K943[^b5bRvaLyLZV8A 3vqA1$yZfiyb6mn;7Wn,´c9<ڛ8'qUMjsf/jM,jqcvGA$ &Fq-\JVT(dr܈ˆܜ%QQ/_/^D&Ɋd"R)V[~^vݱc޾Ͱ|:TT1==H6?hݺ"bOٸK/;sɣ|ʣBEiW/BYСC޲8_5ZyUĉoz ԫW_#ܹ$**]WCNiEũa̗;`,aMQYcbiTsGb2S=⭎dz^Ki>^(. @c/ˮNЌ E}3QjE{'l>v5RTô+.=E Q}0b.MZi1o5ʃ^Gr1 Lyb69H"x{8S,N QUc2ruuw}=V|YQVn,2A EErB!ceEE;vՠ#GPe޽9YrL"dEErz zNu›Uk6oڛ|QDLy^ ~l3O]zEqIʵ;w~9dqs3U>kHR\Dvpp"ST7>v,#*.~DJ\sn̛;`H< qϤF$)ai8dzS:ZcD{BҜXg( Ř{1iiyÚsikW̼)uUqi>j)홛5T$`>egfv!ы.)]]-5"0t2f{8eEv) D0&אو!4Fdżb_0H ,O2BQZ+AR}r''G\!)m&29̭1w<,4DMٰ5>kV'lRM"u%71 dY&ͺnysHk,bvn9fOp[Lc!ot<g44$z;[o5π ?|NHRs@R[VVV+:s_[{z6/IINw-'ʕ),,iSXX(I+wokU2MbBQAnxD祧20Nۋ.:d$&:%$9{֭6Fop>5,ٴ7T*uuɮP"S#G.*J$눵W7*J"TJ]mlmeEEiJB3AuIxrL|gC(H#EFF_EH(cKA[4RwA~HsĤyHFw9i17H/=dQTo^'޾}a"B.SݻE7ZۊlD,XTJjq-ZlX_<Ƒv°v={͚sƤC.'$&>y]ff͚5=== llSzUR%ߺu}Mڊiك~حi{g^w*Ty/g>5W1(bEı!b 1bgnd2=m;Q,ia-̶;H%Yi#*GZV^DF)2E9a_ݯlelA4NbHltԍvɎM2 (E%hBzVO4\L#sM'fD] &uJrJbb"(szU\T*5C"r^T~^^z$++bEyEr۷$U*+*j#OR!="g$52[3XlZ|`q*'D]B3n6:yB-GL#S8{XF^d}$а\./,,+R5FIϋ]U@)zxZI[룼k$bzEDwEhn$HC~(im1-NmT%0{zNqQz8!pG>./m"BH#hl0Dx|hODs;rѿ (¡u5 39a"]/#15_oydĢ 346zZD\f4HjC'g(Ճ1"kȾ 8d}PdOB~`4WlZ`kKX@XPMb{|hS]PiYj0„"5%q|e<-6*:y4^DJ@ɩj(mI‹? [ kR#efi:5$% {5Q20Cj$IJW03>a,Li`bkJȰ`3OC35A{/'EbDd/9jdѻ4.4O@ ?~~(؀ŠYQ@1xD\x@,gi.@iRzOD Ne~D`%&XW2elCTz]GtZfH p,naKs*̱8CjS8M#53ט IBc7 !Hqj1ڱ)!uG Y)b|wObm{9ֱϬ5/)JDZҼ1Er|(UZeLU@kZېibW.LEK(.C`cN}L|ھW,y^u%8jb4YRmS7 bSYXGj3t6։t,:958%lX]yEjgB>:!;#ҹ;u]HaOHs wKɂUzDfF|Vr=N@O%s> yBh;40F>Ǒԋz{0F "lBY[A!ku]4/:׈Ny8pա5ѵa-ƺ1 b?YqJ're9b0 U덀Mᰙ0jةU] #02*&\ȏPLx9苙CExHJBz}_jbT5Xfk#lҗN8NǢnYA^:!6tvj{fxLDzn xi'X;?=Y@Dk*=uvo^j'3lr*L &&1Јx D>W\FDL)ZbYij "M.yBtm])v}ϫ`)G [Ga٘kE;(nB*ED,qC{Λ۹+J|:M#V8WhXbd42M,S&4~cqhOb7 ѦkeFl^ b6Ҫ qY0XfabQ#1qسug3Lj(T"g5&Bo&WPmc}'qC&ɑʚ8;{xDT5E\c z9Dak=)L#(>%6fSl:Ӟ^@"PAWZgf9ctcU/$گ\LC S `J :uM9Sd ?]I*"ҟ-1UlMģxhl۫qXS ETqfN~(LD=2SX/:,jel,fJALp eÍ0 qC\B#S/J(,PyF Q*$tooñn|`Lqs|Kx-]93RcΊ(^IUDLf!, |IuG0tC@3&<1.*B0&61 VU I@ّCDW nH܈A@ M}MvaRX}SEL~B]?(h+6mQ=d1ijjSUR*Õm2`kKqPs?<:cچ r/舸у5FGPlpe9T;ўoXB2B4,MG\d9QS2_&j= %J/WTiOմg#ߺ~Pee'}]*,}>bNM~ DHO ΕDBszPeFv&-E w%* ^0=biCj\H۰MjnT*|YV9T+5beSD-L* =7ak+Ϙ;pa Imk$zhJ!V &Mƍ Kφ4o-6j86Hfi`Q;IeQnlEXÁK-GBt_7s~5E>gE(?(AcFc:McC"b= c5PId@k [Um.߻|.=[ʼnlѣF+]aFlWJL"<[,KR ،57IL诿.lZY(.nJ-* };0UǏ)S.[ݻcAUu>^"WUPXhs.KqiIy1%BpRo$}Z7 K3ȸX_+541YdR, I~Րc6mwT5Wu }m~~>^{mZS;wGoٴuUAxt¸xC@0F*>@=FF$F"wtiDř;[ILpꄭ B|hP V)dC&[ѽ^[qIG ~hzj5iG S]tN>1UJ,ËZHluδ]r2׮^ݵwϟ(VPpž}nݹ.(hά]v/Bac 7w*^˖FBQm𦭑DDM@"uHA%x A8dQkMP-kQ SXkl" "+N}$tzkG+MLS7AaS31Mi ] 6F榥&n*iY9z@Pk׬qc[[[ڨLң;۴yKڵBi{|[>ykռusԾտ#H t?P~Bh.һ@%AudtgMLjK%}#Ԡg .Fc=@7C{gcd ̀ U=t5V]\R}bZ_'&v!1VTD},-BV}ΝK↓,46`bm /\zF RhqJ8jn'9%n,7E,oH Ʀ`lh硗fc6 L`QV:qrȑV_iMO|M!3!}">|8>k$#h'^-dMW稸'A Wj=FYn#M-*9c}ʼc<<"a*[LD&\;n x373ͬWA-?o]҅1ƍ7mzÆI$1F%תUi"lʅ "ǎ=fXȀegc6#2?/ ,u"O%u9BK52qhNf:fMya%P`IKMQ)2Z(EhV| RR&B)H 2zfJɫY86BlJg`#2µb0ӯZs6؏Wo6_.Ȕęa³wh E Χ &&lר bU5Md`9JtM ̸l?%dbk76ia@UPj۸Vmj3}0*%6JBL#ӱ  l%< ߆kq5rgQfSt2k(ѧmNBM-2]`m Eo}==x6Sa3f g(w}:''!yva?~ᤤ$ww>}Ջ=x`ӦMϟ?W( v!₢ ־|i_˚Obj12Vp[̠ RܹsxxF8FݻСC e˖?8F?^cǎ?þ}֬Y#Hz]TTTRRRd͛?~xϞ͡Me~+,Ҽyn# P$Fu+1Q7S?/ uW_ vttׯB\H$ѻw-Zav&t oh,m 8%4Qˑe09fEk1c֯__ѓ'ʕ+JJJB :\ٍ1"&&fUmժJpRaMMPnU˗sv&ѓ' '2x/۶5áM޼y;77 ]ɻv&EϞ=tŋ7nlk@U3mҼa{$Mr J%,5j;v֭վW\ ݻPvUݼi'Z \)i|b-7m:~ܸ쬬V-[fff E?f(0ҥ3Bhyyyw&շoBhƍYYY}}Y\Y̟Zj5k!dcchHs@ [UBǏOxTnn#pԩcoܼ_uK9rرϟDG38q◃y?\bE{vZF%3`S 0QxWHHٳ޼I2d9ܿ?,wy>}BfΜٸq9sfC`TnNvjJ24W~ZQUAYVeq7 8~„ 'p.,,l֤5wkvȑ;uتͭ[&ߡc#GO7CRSS+V\aõkw >>>ի0ݡC m޴iZZ}H@F'N_vCǎzKf33ro߁m[]ll%:Zٳ&Lzذ)|#ϵw<6΢ 6\~=… fͺ| @۪<==GM|O,={6wܐzO<ҥK.;QFߺo7s#^~m\qixo*yffe˿b`Ϟv_e(yePU/qpp=fwEFVRJ*#8O_ɓ'47K+^~^\{.\`u_x7oS}MTϥߗH$bh 9W^͞=eˏ7otѣG={tegy޽yOmӦMXOot[l| c=L]e˖lذСC?JtӦm꣇upPF իנԨQХK׉'޽ݻwkךd}P*AAƌ#j]]v8q"//O>7.!P(ϟ JCCCuKs5jԂ ۴iȎ]t:t'Mի͘1= _x+ M|Ӧt_R(}qcSO4zި`c^ziқ!Lb9?BBY7_TRmkk[PP@NKKSG( %@s?+V,߷oo-V~;hѢ^;wn[uEGG'$$޽ܹl۶T*oNڵ;1uttڵk_ZB֬Yqƿ;#ofر믿^tiFFzSx]v׮]P%'ܹz*SMoD[?ݻZMKKW˖-8pV\Ul\~ҥ:tK!1jv嫵k׬]v濺^oǺ&I ֧!eF?~bKFըQt'{/ױ#GQ(J2&&f1<^.{֬W.-Z}Bڵִ۷[lz73f(Xr__߭[y据ŗƪSO $ܼ\S-h#̏җ hhcLt~~~BB3ԑ+U,W=qOOO;;~{Etƍ8::7\\ƞ>}Fq|UTqrr5jŋϜ9@0 ~<2Cj]<:tC Kr 1bīWM_lxߦe/Ν3f+- 9u*nܸp///'''u|xǔ)SO^ZN77777ڵk_zT\={.<}ɚKF׭[__3f|=lXQaѣGMJ˸o%Ri h„wݻwibxUxR>}1c"{}@8эA'߫W/M@Y־ ذa)h>!􏑣F5D/Œ_~ݜ9yyyWJNN ɺ&w%>O㖹4BRڵٸ1######&xDQNuiIIIs5PҥJ]}ܹ۟!^4JMNR)6zAN|8z耨>KFQbe¨fٳgիWr΋/G.V h&fgեk:Zرc)#F /W\.'DLMM'BtrK^^z 7:?V,i (/xzz0QPnjСp9@3+ZГK]Q5n\+.Wy{H4׶JݺC-0zS$yogd,xP1FFY[-RҨg=&!d2=AUeGH0 ΩYT5p!V dgO4gR'OM |Umnd2ebCucGLdѢXkkaÇ/_\~ dׯ_žuKcLVTTƆ(+7`[fںuZK>?%7_ɓ!OaIB֭{Y3fŋYr執lص{7@D&;;;s)((x3xrнˬ2eZܩꣿqc*UBs  UѣG7n5gNn$22!4|Ĉ11e\^Jwy9uJa?Ç7n9zȆ 'M˄D2ֽjZ}=ْOeAU:εbjjz)))pooo:O&F102 9G&tvvoaj233Di]pa. QB <2&Cf4YMpVli2i-tWHhm, ҹ[w֍+GBB;+OOOuxb:O zt SlP(2r&;;{ťtB-]uS_L曤$PRRoAyyyuPof{eս/?ߦu+PPO>fx/-3m]:%Nپ?XЯ6?z-^099999yѢE={TG-Ydf|p;(T|IAAɓW\y q~AJSs왮oNxB NNv4a;zM4 ;D&-?/iM̟'B>gBU?a={ݧC]tG~ujij]xx`ݚ5vAA׮^E;eccsiիWڷGM4qw?ط7Y.c WJeK]cgŊ{޵s'+4iZսi0V2x6CG}bKMX锱Uɣ'O47ws^zի͝kkkKǴ]p7\֡Cz8#Oz<|y?ʅ渑l>s欳 `3 YY]\Xw\|ܹ}|DKֻwEFVRJ*#x%ry^^^^^^,<| B]Pk׮!N >8еWGYI)))UU~r݌Nk'vvvfLp<95j_O'Nۗ`{36nfeЯ!~g%[HD,tXU6Um_Wb,^먨: @r]Jjw={{9;GG)勅 +{ɺk?xyy!V#KW^QFdwJJ:f͚tx֭o{+//͛sFAAmպ5Bh-W._޵KPOϟ;ѝ;w}yc5}OMM?ի7i$Wt܅``&3]2XhтB;m2i"ʘLPj$xޡ} 6,k׮Ep[}cw;Z0?`~dt`p>%%%%%%E΋݇o~5m?k׮Q L7ɓǴÆDbwvvrppx*W~}E&MZK}oh(5?2֓*٧9s2B7_ww9N BVloݺ/^4iRnnn=Ǝ5x?IBS'id]Mn]tPFq&ȓ&թSWw[?ȯO?mӶ999킂]t3jz+W,i5 e+V.jW?nU]>n\޽^ F`?wi/ ,tkf}:\^Ŗ"&ʶJcmǯCɓ&M.X0;T?...C 7M~+VE86,nkk; 2?#u^4̷Wp^|o9Æ?F=rhRSR{ Q w?5wIemfeگ_M/1+[TOO>ZJmvȆG<+FYBuEQ$99F&+RXmcǺ螟9699Y"R &O0&K#9997oڵgo{-3m]:%J TPX{*XkYa~^E*JRfmc|+T+WnpkME%¼Vli2i-tlj7wSuJc+hLNNr嚇;V%"L׽u]+̴u봖|:p(iU @YB uZYYwrJ5jԬUv PVeXӁCjӀ ,-DnggWZ\hN...U@,bL[Nkɧ6f j)Bܟc6YF((PнR]eXӁCnxŋܸ!XYK1TM4Q*,lׯhhGڳd6mشd2:ի5lТYӸS׮macF7 _̨o߾eM$;viʯN=*/`>ac;uڽw={ƌM&ӷoHhcjr2!QmB^zǏ}5˪^믩ӧO?>%%իLYI ;fЯ]q→TZ45}5<]paϾ}m4gL}Ub4kwvvrppxӹ7<#T|i[A_?@3$@G-=\F_ YP;uqc¤Iuս{֭;~D-[riTT_ q\;#Gʉ1̐@VXZB!)(f0Sc;w k0$J f dKP j0j0HU["iiӧMk' ~9psȏA0>#bM6ͯ^#^BwMAAA>zDT^be:ܼysĉnnn666-[ܸiT*WSgh-[@?__nOխ4l~7mU "#rzf4ݻvk<~Ld-۴ny&mLUmaW^17ܸqcێgΞMNNVxA|ҡ#G;h2Vŋݹ~YDDaݺo{ȑW@U5ij\՗_6k6oRSSCFDDT^BŊQ<<b{GΚ=cFa ԩYXpnnn,`AFFƦ2eΝ5jU*k>>>իݝaoo_XXHNMMf$X~z \dF+X:a6[Vʷn]F4XOHHSӓ?2jբӁ0P1FEEE֯`쬬% xqJJJJJJŽJ*={0={Z$555555j4@PrՏ?6kֽkWXA5Yf СCUMZIH={^}lX8z̘/ #,<˫G}7o.JP2ߦyT*m砬jq8u<ܩCTdC5\ԏ>  ;#fUR 7EVfIF*9_t.N&od㱵j}d,$# .d7_GEEu *W.wq)P!CUYC? :dP.F!X{`"&Uػ_9rjL*3DU[I6R[;dö=yR"f#+BH@vU  QD5?BEP̼JbIsJ[DDn`/7@!!eB˄3/ͤɆL @Y6 ?ʕ+0޽ W2lYM6ް^cmZS;wG˗.կN6[޵ @a^۷֬iа!a5VNL D,$Op¸qOpԕ('3`RZwB!)(XYL8mMOHoԀ4QΩR l @E p)"& S (EzI#@ )[cpi$$Xw;O&fgΗ*MC~Oo:vUOkpSo=UUP)*b27|紼l"Fzڕ?ݭ] APe`L}tϙ‡T PT)K"uC a06PgsZKKBRH0(ce0TCohYe;N:в]\TjکڅP7tN>)'9GHݦj)T,Uj#@q\t>+cwO!6G_z_3UKUy} -w>4eg̩cA{K-UU!8fZJVU_Ut=?(Tk~nxNvzKK7 !slr{e޾9u7G/̃_;r?{NsTJEJUpX5h*lҺ?/[=C&pN zrO`H0`?|C|CymX/Fyx&$>_T8^ql_pg~InrSl#PGn s\͛*yī9@w}K?MfgFiaQl?:^B)TUEpOL/yIW_[UC?jaάwW{*l߳;#J6 HM i%HMd{@HWEV=qM'm^{aR(Bh%wP"sUtRa{{?\Vƹuf\>}?NZ)S鴧NlBQ)UU E RJ}[;~׆ߣ7o7no/IO jqOW8{.yy̴̹И>?fzάpsW g֛!sL0=9ߓS'K ;9 =SPRtz$U̹tSMXyn4n~ IDATw|zeFVT) w Iƨ`ZV5![탟Z8ԱƩ52edz?r]GwW2IvULSW@]W⟖_aRQpZbx_`,j]ed>ےJ HׅZg jjX`4 +o[n&^Ź ۽[=_GO%R54`5kVԹG>ѱC||#G {{]=GiykMݻ_7q„*:z`#uBzIjn޴ VGvsgXXkKkԓc=o׬yŋvGV~vY Tm;eKe=eo4>>>{v֭Z`83ƏVxe??'O޼yS!" Tfc9h㺵IM]zA􀁃֮Y}o>_}u !z־pfϞ_2oB!RUUNWEga4:chr egg}|O* 쬠%~y'??cx=CI)ٵg!DDd˖EEEIj]ȧKH80pO+\XX陚snj9znB8I~d>{QvСUtɹڅի_2tˀ_~韏Qk^eQBBC9j󦋇Ju]#GHMIiơÆt#F$'%jjĉUtF:u3Ԥ$j2oo[DYI)uk>;YH) 7g?O:}}M&objOZh^wq h484TS!ɀP ՗4.?ɛuPFljpn:JU*ӦnںU+CN|rn]vi1Ν7߼[ŋv/Yr7_նjN6G=w>mjպ}{B~~mW2PT~o }},}޽{_;ܹsڵB̟7ѣk׭[nÇߙ?_3{Ϟ+Vݻ@.vQQQ[l1Jްq6a6?̽ziw}ybbbxEgI&h7lxg0!ɓG~򩧄!3#ٳg̠2DCU:u|e uO黏 2V J߷o̙Bz====y pNgffFGGk1͛gddhsϟ7wsO4[oPT-zesenƒ!Dn*>nj֜9ݺvÓNm۶|+o$''iFtthh7w<)m^xo8;z\zNb_B¢"oooŒ6ԑ:ujrrr^n+a>}Jzzzzziz?3~cvBŹ}qf=@ig֫Œ3f͜k |]n#FtyC3QNLlݦ̀ ={MLҩ7ޘOL?raGoWy:"=ъLɛ7or>)SBCCiq6;;"23gR  qhlaq $ &jMMIB):#"# -~ko)SovꭢlK늡A֩DDF~lYTTtw`")7_=q3L24+~d>{QvСv7fѣGvlF R)?6LӍ1"9)UV&N]w5rĈԔ6o5j(?@I5u3 eNP[I:naC z}ӷEڧjy @6Hդ'T@e:|E Uj3Tˊfu(T*xKQg36a p3h24jp1K5*LWA%:s.vpT]> ຩZJ.W.Uk:}ڴݻ}iVvrM,]*q~VZETF6 ѥzRK\y=vݺ>|n|7_B{,_b޽Y(ReW7n΂aaaBɓ''SOU.Xl;/X5h-!3#ٳg̠P lTa]qN>zM4oQub{%Bϛ;9s'Mt˭R hdtz6m!N ]lŊ! >\k;or۶m/۷S l|ս+ӦMݻwBe+VYwZ?رcv]Savatb^ u=nׄ,[|#81cz9611--uֳ^:@m(gRNp8U[|-*OGj*owM?FQR= ZKOJJN!XZ׭\]w0\<g3CE0(EPGNc!HhZ6sW F,LljL(*p0OՒ3/b P"QP Cqdj@9ݴQ;R&.>f˗&4u.uȀwSJJrƔ];w8:s8 zMBߏޮVO<<<~/.ޢE?HZjOt߾srrG[DG-^{ZDRO8Qa!;uԱcNdʼUU5ݯ8aBaaڴ?=*D6 ]uROkw֯_ȐGG9ѡ;vqΰ^);vtg'盿˯N8>9e^{ǏVv?fizr'm?CF\/Tb2z'00-_vF3gm|SO_2%,,,,,/OYvm'~b+ӦGG8y͛vq6;;"23gR~j@nYV'a61'~LJB|t銏W !~WgL?nnB;Y~nUiM4o<==SSRyBJNwEߚ={inhTUhѢE||g7J);tТE !ĸO>=~;w(\EIIccjaaaeeQQe;tXh򛯿8]{~ .~[%.xww9Jk),,LMM}g/9*O}yJzzzzzԗܗп?2g=vf;tċ1}̘Gv!s6vYtMh-zSG }b͛6U=*ǽj7fܸ2O:lN9bDrRRV&Lu]#GHMIiܣB8l.MIM:t☶ #HS-6[[:(XH) َg2&7\xcY,.a @m=3?*DaMuu@-BQKnj0f*0fu(+iJav PTAT/I˘R5"Z^$7Fj.W]JsFX]8iRTTT~Q)nD&NcFrG~eK֭8M= `}ɒ[omVui=wѽiӬV}?wX !7߼[ŋ ]m^ezuܹwoΖ;w^Б#B;ztuk׭;|; !c?]S*&Xw^UwvJLܽg+KMuS;iҤmz /N6y6T8ʺ111~~xj`0dfd={6""bjpfe u6Q #"әtL>n1͛W͝9~&M[) 4LvR?ܦM!DӡT-,<<ضm)..nyRm۶ ?lNYF\*0+ӦMݻpKv߿ԩSrsgL^uggƏ?vnBNFG'&nf@B€QZ#G>9RY#FtyC3K*Գgϱ]:u^@M))O&8º/tDxrsltGXH+*o;$}UKONN#&7\xcYattT-B(jS{qEj U W F,LlYRE 6)%G4vE):A'©+rUAV"wy\&U_(x{=ՍNXz[PJv8шH)tPaTIɉZE htTS.-{Eߺ~sD)'TNBhz:^wԥ ,;Vs@k?o€k8l_z.nӒ!vm=;nqoOxfțt~mG8w.GСu}KWyx`cGk7fu 7v[h֨sߺ=:O~nBQaae/pT(B Qb~Ŧ{;a?/Z Λsɵx~#hj_~Ac~~Wfyvm~gHX؛3_ފ[o:};ڹh[?\x׎/[voΪeHRRooааjRJ٧<7Аа9E!oV\ _J^w}wgaVũ3##ˣ?q>}UϿ45*:w׮\_}I_~W+v\uk+l!6|O@o>Y}W{1Z{tĽ}ޚr?|-87_סrs!ښ`mlkg3tJKMM!RUU⇊ _=$ SYۿ_cSZ^onԪM"i!z~f+x1O}z>>vƹ/NUnhxDҩSmڶ+Pxx%FDF\p[RE1^|ú{$O€M?B}3OHHmz U}ޯzy{-iS_|^:D^ܙӧh~d?=qf;rsO+{n}\5WI[׭P 6~F1n\o~~0HpҗRBJQIQ@*KŪCeX*3HIU*[NYRR, R5Iu޾ڶ}Y[6}Y!n7m<}ǎo_&k۶oo&7l7\g]d#m`˯[>(Qh;*6tƿ^VYJj՚-_~UXXx ׏|bl~bdK|122ٳE))S_yT ں0}d23:))yݺO=<&<u:tȺuUq-71mbo^q7 :h4j?>Ξѻ}B Ӯ1QQg2ҥDWH[z!>>۷OU^~}2s˖xl.;?4 ?u]w]tf7$uY8kzcEKkZf !f5gժ5<7!ʕO'%i}x󭕫V?Z}|@!Dt;lr+l9׾ĩSiil7 C(4ᛶ>p;[n#yyz2dRU;wo;w{v%Uu߾;ulڣvù.Bb6zM%7m:))acl7[j[};a#m۷ /&Pt[u! `>V¾jϩ)]w\zC;W93+kSRJ)(^}u9|dSFyѣOMd_5дU{zz]9mٜBBАgs霜?CCB>JEQ`Ԧf/ϩB[z]Ζɓ .h4mE6==-[|HAwP&pK镪p:=LTT6,0Pk p9Zҙd>e2,fvd29WlB FUT aV|lΞ/xlؐд3k}:qB]j ^sM|4s]*ۯ~oGj7Ck-/YڣG g㓜Im4ɩQ&S՚\m¿T;H` V7l?Rw E̜ffVfxXÒ?jk gq w{a '׷I/_(,\чM6\O*8$f25sב'~!AAl]Qÿ8AEE8 Kf"H,_g;ҾEۄny7ROpsc}WrWj(76SwjIw[zK?ѭشEL p6N睩IoFLe .D/7sx%E2-IEJ3G"(BQY&np-?KVVgaVtgsM% {0fg+:]]3 0ʶ"O]4zG-=ak 0JUo:t:OO 0[a4۽{YQ/{ bgOYu}p-AG+ߚG_Bm~v[jHKj?_ܼMv5׆fclE!23Q +rsq!!B!P77\̬;wMF???R5܋Q-=vG񑴃҃s=7WJ͊QZz8iDgd~mk xyxZ, + oA[;tFGŒ t y`O]Ψ8 T(~F)0 qCf///Ţ ??P\BmwA0*.ڢdP^.P`-b6/QF=b:E( =[PhcZ2pU&)fm 2A6@m@]N 7\nW1NY햊 ϤI`0P6@m. TpUm.p$7[:x@q86@m) R5>)e^~Av/v=٭jZsa?_EQ P6p T P(JxXOv_]ןvBN!u6L0)ErJj6Cig{@1:̺PamT6j1ˡG|ygkwLTԙt)E1ڗT)S!FGGimi1g3V6[7ٞ4)m@*|u_fj˯:^k29z5~ڵeigvOOK-, 9T&_ Ru똚v(BN&U[;[n2DM6JHߙt%=#3//XA:)99%%&*S*P6%:2ɓWBNJnӪ|^n\BNEk[¢¸R"#µ]h4 !g{V Hoonnt9Nwܹ\??U{UFLFƉSnזryᒟಟ;ݮ; !srڴn>:*o9dVDo08%3;MVFQQr*Qq`===32"|}M&QQ-Ʊ'„g-'.(nۓm@*|}}}Ϟ jv|nHpA͚4k=+&:Jr&=Cۗwvx6*٬FQֶqΡ(?Am4?VĪz߄ҙ{_nF#>IWUMVΕca0l $v!`(=P=M z/OϤd^pB1MDGk=OeHh@\GXR\l6{!Jşqq("Ν!lӲd*߳.RݨF.Y!ATUfdf8)(1]zKl/?g7ٞ4#@W0ydfeyzZtbX29ݳ*HpnmE!DJZ(`0=<&"RJv>7/3;uڪ$D{L%%%YͣJ{eF6\`GfmCbW/%-5:2RW?hIpR[핞WFfVXHHeʾjR5֧p78J߽&j!DHPPZzcE n,s(fNt8ZjQٺEsjV),$L T֡LmT1j1n33Bai-!?! !$8LzƑ'!AeH>ۓWm@*{뽽gҽ<^^i>^V &UÍ4lCCCCfZ{|fy_BX* @_!g T֡|mT؍h2&ƹK訋{`@gr桰АА2ȭ'MlހT YL&t(sj4V"lNC;l>sR6*nEj5-:cRt:˞f3gwSf7 p?{Z, P6@mFa_5\.U}˫CBBJ(tBdefعl2HmPF=n6 ~V U]xZ,a;o/(`@ܐwpppXh矯Km+RjEQ|&S`@@qI ^^E6@m@nXf3'wUjڠ6@mnD(Bg@mFPc @H U UjT wAjT R5@@mS5R5@H UjT T R5@@H@MՒAjR5@ܛAuE$)fm PWֹ.(!wj\mT>t~\CmW@~IhܿRUln~f_~}oҔd6讻7AB֕UMOo8{6gOMm6Ep}}+{ye_ U1aׯ߸o߾iL\h+6T|ur|ʕ?]?][w‡?0W+Wefd5 ![o}^^*M ۊ@cݲ6$8H1tȐϽ0!B^ss烂IeⷾC_۶}7y Bdž +{ye_٫ R5W 4̬qOBH)h?;q\cC;wx29R~4'''8(H d{e/+{@F %hܿAAA'=\eN|FJoϝx|!(W, !DzKW̿W j4w?cÆYOB9B:$''GFF[l=zܸF!Xl啙H UT}B3g~j]tYYّƌ⤗/2s+P}}_ sUW̿W )GL?:U[;W{(0)[Sf"H,_g;ҾlSIzO䓼.ORRg5{V54mѭشEL w(.9O6%E `ي}|kRUpf%++KQJ&Uõt:OO;ss/88Sv{.6h%4yfo@+oONeqj#@ kCBCBB'?O~gfz/5u1^쫆{X"32۶5B.wppPXhR"U(g4JKpy<^^^ U%lNSeR5\NQ^8F[T 4x\@mS5R5@H@R$ @-S5CR5@H&^;6CZV!<VZ5*R?*M> ;Ȳ [Cp%Su#[mM͏5L&(]$j=gyޖ}Yqɮymz0jM^sqy|8k/螳!z UjT T '6`4 rBݮ7ZmTױBav`00 5̨܁pCǎ%Ņ{Hzoz!z=R!U\|n^|ǎa7 6*€Tg@* pj~~gAA^_Yf6Tw!UԘTeP*SDXRj T2t@zygPR5@Z!r]K_1lnuﹷ7hIIg:z;^[gYkK?LJNzKO~.w<p%'O[O=5C|xcS[hQz'Nжml:'O%v\w4T P]j]x]]vyW\ EsEK&Mz!&&FU; [7!DhhSO據p^{1}}}}&$fϷlr1͛!),,A ӢUk|Uaa 7\?f޾ qr Hȑ]y[.GѦݲeɒSU/CP\ӣǺvTv=]t׳=3O].]:ϝ7_k_L󲳳OoطiS;n-_9zR5۹s|||w}||Ӧs3vLbpppt@ʬ obڪ0)-R(} rxkv8 xqjf˜Z^.\D b̌.Cٝ%N-&dH&݀5n sAz^X^+Z+.sAJփ59 F|Cg{UWY>cxҥ_7HMMUwwO_/>>1Gsf6MSScO$w|ɉON,+uѱ+ ~hGQ&@֗5!(*r77z?=dAA~sȝ4m [oKwRTnnn8sl{G{mMu|;MS]utr*+v6_F=VF)/By3?qDP`j)?Z1~'[b1@R d5\XIBQ\^!&"! ejM 0A BHkC\j 뺦*Ȫ~p"r,-ߕRE"7d…:I)M_ ٙzYNG~˚e:@ nEBXF)fm2-lrЪR+֊͚m_UUS"K j[  @ )CUjNoK"HUK)j5NVE V-J5V^z5NfHU3۪V ۪\b5VnE V}]HHUOVRj՗ "[q)vQa$L/*؟֖rxIENDB`kildclient-3.2.0/doc/C/images/we_advanced.png0000644000175000017500000014476313215302470015735 00000000000000PNG  IHDR` pHYsktIME "%IiTXtCommentCreated with GIMPd.e IDATxw\Ig QQQ O}O=TDP(<{]O={X:RCʾC !(d3;3;3& ًzO e* IH2̈E.gnU2KXa²Zl'H1XR&+(Xe|2˔%AwOPFب{FW~gsS%OlI쿠f Q W#XHD*,4 3%W)r8T=9k'뱬kfAOAQ45QDf|-Z*<.1*,#5m b_T?O14|؀ʲ2ך-}.*&.~?<7eHw,뭙sS!3 D1nF3P2"e`6V\]L2|6r\MatҴ$"5/ْׯozyx]nrC zܪ:L9w.yo6̕x/ h|y GQʕihHcs W?h`y9@+TǤdx'Eç2|X^>:7UBD|㛢Ony"X{NJ]85@g79-ޛ,*ֿq3g91Kl)O̻VUt|\XnBNlUwTA60oZbCYHm>[[#[MD/MQHsĖ+w(׺@πы,eψb>l)K dY g{aB^Gۣ-hb]%}624"3b]G+,Qx=Ʀᓣ>-oe >G}Xuh-C6O<,qXEID"yZn} /pCYpMh.)̿8jOW_`"/7'1doSETPм~[~0ZI&  y4*K\1LuQLTֹJΦb62 ؛!A"+Xl1DC*)|ɰ,i|l|,˲,qYt|6BՁ]w+SixU;FE<"^EYd΅9 5 _[&"G}%䩏5.HeIS$~^k?0{T*1*Vd؈'phGeLt654a0,)蔄zq#N›.3 ؈ i.d~&G}zN<Մp|M  b).ns2TtYOrE$?حgLë+"iwfκsL ŧ\=*@sh0ˑg^M^rq }mc ~v'چܕd2/p'z PZ޻961lpwK^SRb.!#3h@{XHrR1'`D6q٪: >)K'4H{G=ck ^*"ո9Uf gx~ʔD*QE hxhC|Դt 14bh14bh_3I8׮FL145qo&]|𑰗14bhM})5 6߻ ++ʥ~}٢?֡/_;lUΞ(;bW֮m99V=wbfVfڵY[YQ5qwAffcF69} Ӑ c?ua,;u à_|߾][u L%sMx<":rĜa+Uܺ}הcFCΛ5S ժ%)g'Lbkc֫>ˑFDffc'N{p?Dx?&?MLlԋ\=;ըݧKJjjRR=}ծU]-Xաg /|uhc##"JHJ vmڵ~("#}_r%"211QT!6n:::''kBCW`ommuZN5 ?kmeN9`hhMnӫ6<͝5k=X}Ϣ| ÌuБ%WΓRRRo߹=kei٬I_GG?~2fzz?ul~_]lßʶ07^qUܳa׮3 hlJjJJ~H(Ԑ6魭eddVТy56yTT#ի9X-kMɾi/_r/8Cl1q |zMMM0.uKO4/ h()uqsFf[^leiѾ][}@|C.g~fMvo\qk\c9}oO5hHy/AuDDF3w{9@bCH$ D$u:P($ +أ%14@AD#:o@q3Zb{4o ىII6-B)$`[|GLMk ?Z??EC:14b7oQ6bs.* #({]'gN 5\vD"iZ5Q#솵+5+gϝ &˵Iܻgϟ;utyf}Ν?V ]0B}#:k3obewӫg_OFpbZ_{9(xG;Zq}zY&:M&-%b9m۴NLLz::K>eҙF ?qꩽ ݭ[yV E ܸ|?gϞqqvm% { Y[Yb@w}=w~מ}}z+ "JO|P(Djrz[Wz.u9zzw*ϱC>.^jժXܾמ}kʓ=2n F7eԼ<&LMLbh=|"222zfؔWW\OUpOX$$$s7m~KDoѭKyU>ߴ;7*11)W*SH$Bk@ayyyϢ,,K=RC˻sw) vv7mtvsu ũhԐа_}/8Bu߽+tq=vj߮GrJrʕ@:"JJ))"ҌK@W_/]ȱc ,_~sob BJJڳ;w7o.IHl4ReY}}}PQ?ۣ[6ow[2m,w޾sH(453u]kUCu~8jLBbRy;3ywZʕ]\c#'Z[[ ȬVաEf>R=ܣK]]ڕ/C7kڤiF|>_K;VB~}S8MJ;ݯo"WL&Eh1tfMeYv}::"{1I eC'ǧ nZ^:w ]&? ȱо;qjVi?OJNNqsHKKԕl(@ "+<&wۂ48[nV,]*ӭOa'~kt*}^ ӧk _u\% tT*c҆&mbb9 oƫׯ332jT)wيްi3gW.]hll<}܉SW/_8rn/GNNN]{L.^Rh i8Mu\" Qq>mŜ&wk_XrmHJN Ѫ]ϾΞ;:ۢ}zyzu5wJk"+?14a3縹{ Z4ԧD^=ǡJ3S_Gߺ}=wާw?kֹ{G[W(ܕ}P@mO>914=711ݱvBæ2~ /7m܈ȱ#=qx_m 0ijff֖M6_#$T G?S ѯ^׆֯.piL͛W,9oWcƇkUQrrʐff uhт97.g9zĩ"/P\u&N*ںpCGN$"bɂ^2+?kڔqjCk\{ojԨ=X^WW72y4\޼Hvv߸EDoܪRGS^Z{j\|4II/]3*ʪL2C}ƽxy㺏یO6=ݳS꺺}&%%޾sw\pEKW&%'Kçz52bqvmsrrF400+Z"JHH>zD"TBkuj*S ĈEWGrD>omm+gKDI)K/kuD\b∨}gW\IUgG zt6n::ۍ\VWZ _~~E&MuM}x<^9[m:BCC,ݗS~/@OOCjN77nԪYqKyѸQ4VVC|,K Kaf``)M5UBPK$VD&;eV<֐F rƈQ3([RRRCBΚVߵX,޾sgK ENNnJj*F}wVJML,~pC0LD)Q?T^|P@n&Mn``tێ]+(7xo ƍΝ͛TiD2J3 kMk lmlq`qRrD`F \,e&f~ɘdEKOTraT*eYV___ >|uR oApꔳq]koSbbcWZݧϜ̬_t \33Qܧէ"=KNNYlK:hUgYYGW-?xY9`А>_ۍ ܵG+Vj- K%XXޯWgbOM)Q)a=ᒎڊE2~Dkka!a[[dy>(Wset'(x|vmTǧMTrA{?~򴞋KIJk>\mܼ@_R`?4/Q}JkodwBpӈ:εtD"nJYYY\1꿼{4qoX*1}ҽk]|U]_? qB, Pw۾XoGv~>ܭ(!!##3{[}EUuwȱsfUTq]Sf?P}͞Qa۵ȨfMM ֡wǖ诪ֵwU`mLW|14wW"e՚?͈[Wz.u9zzwB@鲶q<JߗC=bmmUilml4 ՉSkaawbpU@ gwfggo޺]ܣ)Uup8xhFff\dժ) ݼ;v;qjos޾OP)NO Z} SvmCG?4~]MҼ<h DO3bh&>{%"Qf&"sy[7CǃfIII}skW?/=Acˏu|͗0eL\>s!˲ƌ 0.ޝz֜lE4"zjzzzDXđGh R| 6G6o ,W(˗ޭKV_p⤝2ϟGʂO {9D>{vG 223B!m uvjT_vέ|z/]j歘X>̬,Lb+GJjˮ߸0LG000 Ĥsݽܧk:zP~ޝ:tܑܬŸ<5333*a}7 yb4|eN\;//-͟`۷w?lHٲegGsKDII8w{4ggg+W327k6|S^0Evm~Ӌa"6Q=415 s碡9996lxrVVvN#[ZZQ?pkV-΍[6Ts""[hނEի9rK1ƌ/PUvh׆?{ԴUF PJDۢ?077I]z:pԘϣlmmFtQ T*>kB2i 4mK]ڴ6'?up]u8?||l޻/;;EfGrɊ-?ذqD~_nzkkOr`>iM;"'EKx-_esYzWe)SC?xhݚwy-/8II -y𑹹Y\ovCCunDiH߰GF>6M.7- ˲KЮjݒ1,jӺEmXڪ:șU_V<@VUB揵]]/Y6bhM&L*ݲiR:}Vhſ% ZZX߽-;;;$t/ȱsfUTq]Sf?a-υ[ٻSǙd~}{;:V vrR9go.=#Lf]1{F ܻߨAYӧR|bڌVV-=sO>=uĊ*ڳo{vlGn-kh`iаW,e[ljϞGU\N<]ǹ|TMAU}&fu ϩP3/0Ϛ>u 2(p=  |]O6c?egL5GC6eRU*uF}2yjժ#x+i\))䓐xձA:oרA,Pr.._:ӵK5GGҒt1ʔ)3wpLl܋_V_{'Nq+'NnK|\U/ʔ)#jT6wM}bc<|H###k֩c:ε473xrGIի#G7k$(`k]ԞC:T^Zr3lm\ԉx\ˢWurΝWy"}nu>]xb(dmKCӾߋl u0w_$6Dw਱{vlzo榥q3r\\8F l+ |y!gN+!eI>GAˢխ3s<\\LLM;````__΅ǃ6p& sGWeib/M:,NJNH,\ި]9Z5/\bBuǵ1BIjתdي䔔e+VwsRұ23$5l(efaިAy zu+׮K, Ǐڻ{ ƍΝ͛TiD2LC xjw /kZs>351zP(ޭwX1&6V.+ʼz윜$&&5i >2al ǫmw[%_Gs?Z]Svvg@]\n߹GZx+_۴IqvƅLڣx oVV5S=_qm.A͹v-}}C;w{~ ? vJȄ~M<ūuKuYun݆?{w߳g@0q561)jתYx9{]zhsABaM''HTb"ru]nݏy-9U7 xC>5*KkiҸqmf`h̬~M4y&?C%]ڤ׾)弑]vYeXv7J4mÏ1NӪZ^SL\e{4qozЩ3Μ8{uUڵWb/CΚݐd{ 9!f׮ߘ5g;n܆V"SbbcXS> F ˲5Sh |%..n[@@S6Cۢknu==>۪#:4'նc}}껹K%V޼u[WWiƾrVЪ147&@ }F:sGTOo1C@:r14pJW,]ԡ/uKrWx"zi. Ttt̨1;z {mS=ڷlӡongYϜlނE^ |GS=|۪mG$f̞׭Gn=Ι[FFgn~OLJjUnßA:x=w>''g{_=&Nʕ[@rJS;z e.^FWVJJJoA@ ߼ucbb;lmnݹCDnߩ\sN>=䗁{vnjr\:kԳ':v(lʤ'O<M_ա࠳'X(YZ$$>|=<|kD6cvVVWX8k/jp8ˠc,Z0wǖ?ە U͘# 7n洩'mGѲzEҴ6oZ?kzة3c o^Y}Unݹut=oݺCDܭW*O.utt;wLKKKNNo xU*w򕫚^<>JD2ڵ%{njjjan>))%{=U.;9ը.^|>wr_Tr9wbƍTˍ߇~ޝ:tD..uoݾkPFVY(qHU##CyR":៭wF%N5-˻Sǡ~Cݸ5l@D |>ҒKckcMD&&_C5,-,_㉨GOH$*VP=LLJ522Xsh_­, Vo_VC_ar\Sm- rȱOJٰvhի[ݻn߮bbllfjgvJMM>kn~}wraCTio_z5'O:|Wk@@D OBD1qDdnnND:"m}fp)}<̝kգU;^Î$PXI$UX\]fgg׫[WYVC4}֜>+_۴IcS{v~fێ] ܗӤq#\Fu0tXÆMˠ=8yJ%Fە2k>KWjZ(H2!''߀A'Ojݲi#4d|fVf&LҼY" &5-]ˤ?hްȧ͜s]=fN ^W'x\HKOvmo+%558(@CO4[=.ХٓG4O׎qɆuuC&Q*SY\.ʜ;s} W+ϑÇ>28(gsUJe&Mˠ^@)Ck(1##c̰ʕ*nݾkǮ=c:׮ \Lֽw={h/ko̚3ޝҿ/sw٧!AbRғ-=ȧٿKR󏉍} s33KKQ\MJNçz52bqvmsrrF400+Zӈsгυ>ĞݝjT%%55))ScYv::f3pK99ϣE  /lçH5=SϪV%$|խ rLMD:"]]X{#>{nͯsrruY%+QWGrK|vIu,[ۢ%M4V2؍J#;YbV]к::5TYwGXZZ(xMX5LII ;kZ}zbx'O-\J~Y"hl``09d<+Q{9 }u"RDTNϣ="̌,[Z4yw[u-X,$,XĽQnIXReY}}}PQ,%,CxMD{totB wCw ~s[sw̘=}X,`aCUа-ZEfJcJLܗws_/tCs7C @ C @ 1we່Ƹ{{xl;hw>r =?P MD{vqу{Ws5vbJj*z/XCw#Mܤq{>y4dz. /~08`bh'Of 9S kWNFDYYY׬;RfFf-Fź}מwUstk@5Ǫ%׵|>uԫU fffmٴn5IBhL"5mJjSB߸|~UDTd2" 6IDĒsQ۷5$VydS&9~(``@_r[*ŵ#=}ծUbbco߹{ps33" ػIfsPL._ޝ[QWNZ) BH$TS *b;wo߹[,֭\҂3MLVV/IϷrDP V,//㕳&qMܺ'ZC{v/ "^"$71A"bT'JML,(g~M7mT*O:p^]]spDy}w&'B333-ek5qԫ׮w1`}[yނII‚K5L#G) ɬ,-6v>s΋23<|e y\~sob BJJ1G;w8~Tmo k_FF&^3LjZIĽ4޾|uW6^䔅K_y!aGr՘1{^7].Yff֊kt9''g_GźԡK2lێJHL*og7䗟7k=Wk*6\.`rrrVNӻgdOԧCD;l("VV۷ٽ[@Է IDATzviDHa{P833kێ/]ILJ/7ڵj{ꕪwoܴyիד,-ڷk՛Yb[/dILL416quuO/ ss"Rg<yԴ.cd2.6/_p%vRRE"ZleZZZll븧(^ݛ͵^ RiuN;4l64"r%qqU#2b< T~` MEre;v>|ئ[|iVj֤O.'O8vM'z.ϥ}/o7ԗ{GϞGݺ}uNnΚx-v\r#&&ε_ktRn+<ժYsq ,\ cA֡[LF}Ӧ >C @ 1ti31=u *C\ V| .PkXE[[2bː"duWY,wXČ.t2%Gcm^Z5 u|HrPg)%JeO*vs-s=IQÐWŀ"eD(~$l`0"e S†f<=\T˪ @iaY6>^&N(YYZ2Lmmr%yhc+X.[S.c\4;x>^9>/*SID-Ҕ\;^WSÞ(Q|9']q.>?ᰘlqO)xxzO0v gBF ,a/@944))H~dGih<|F2)3&N;zw 6bWToҍ=֯ R ؽU<̶9W3j,&('7Z;Iw+صԮ] f՚u:::|MLƎ9G[*,*ڽmN_ :zJIS޺}ْ-fm̞۷ 2 }w#,_tBaXnÆN2Iގ=>KM{k6+++0Æ\tmݶm6Vح:w"/8s^(37 EO2=shhL={tySG{UUU 蠨=͞;{fpwJ,-5[x_VWT wlB6o9sbp>4`%/0kfIjjjJfaۥst偼B^+V+iiiBSkK}{WVVHHhmNkWDsX^'uWQך{9g^MM7Z\ĘЌv'@ Ul>qښĤ do4nX0X`jhhX 4OX0x `-jhhX 4OX0x ykt܃KuMUG˖-s9hS@Хh6;7/Mdѩ-tԴPC|!(1עEyyH(DBFA EѺH@3ΑPC@ PC@ 54@ 54jh@ 54|M۵UT\۳/C2БP$;'TǬ;Gr J{oHwjhBe+~2iaz-Zyx,GTNZ<ЍC9Ϟd͸IS|cS^->AmceO0>5--%5i5יo,[ ]Ӧ wsl!KJJ8pkӦ9tDV4JJ>tWXa܆3JBrrr7oE ǘ3uQxzI9{sΞ:ݻ{^!idԻW&kkkUiIi̅\.װݴ)XL&.<Ag_x*oy+!q׼1Ѯ.C{Ń{hT=n%ܖm|;1qkWjMƫ] xp[Z5;ennvPdSABqI9u_n߹[E7 _!r.G#bϞ:^SSp1:~޾SKusl=Qǎyy̹ PCCVTė|ahhH)%ZtJٖ#Gm#BsBnI:ԅdvܥs'Htn,&gO{BH$͕=22^B|700hTtAWtiSuttFA9RYY٣O !'ՙ#L 2eK^$?}V7Wesrr5W@3 ai>bزe|\l-2UlMOD]/(K6r4nO-[$pZ4 i4ɷBHBvUK[MMͰBa~%hhhhkiB [1\455egZ 3GitOYю!zxzO0v g%mjjj·JHdX{w}DM[߸a?c/ϟ>E|IDSmaCq$54|\B1|'cZ|'oE#6ԁ!k؁ݾz!Ϙ=uW4EW.|PySNZsMQO'JѤ{<ΔʹZ/V%ms2dЇs)i0,?R3zW!owl ,m"9Im-|<4:/|,B&Րr˫ű=1Q))-USSiyWR4HCCǟ[hהo:ӬmgcNE VZZXUYY* ZLSSS}ʠ!/~;uwy!Pz9EOoGOy@&I*)-Я|OMMM%89:$?}f0gN6 IjjjGѵ=v<[W۔ԴlsɢO:}|~ }P(( r6tڔI %xԴ7ޱ5\?pw SS^:u@)//(!1sl{ɡgjQXT)|OLQ#GHˍֱr(Oxa[2F#݇o۹ֲ֚lQhB (ej{Ej#EާV~S{*/ǍF_`'!$++{ZLϸv">?`e|*?uNP-ٲj:MMͽ E6[JҕU+X$4ݻw֬b0߼c'Jz5hrmτE8R+ zhi;p;1(0Vv^t#~Y~\|Ӯ[~}%"DW׬3p9XpU?9? }u6UUU:|4pU[;火V$׬oRr#u6ʓ(9׮c1E=Jn>}I)Mv%;s~>޵jߺrs=~`>`1 ݽGaQd#:vh_n❤%ڴi6ɡ~ƍmcm1j@ (,,RUqǎiei2xPyEm+S]S_6R--ڍ="N҇L\Gu=e#v"Kx1=cVvNיsUz}/cY3$U9Vh몛윜x376x^[7EەOD:[F/((E{*4.<(r\6R.C9˗7lܘQͥGtW.Fq1!2 !l!yT*X~ %5 !Uʣ5?khhH'Z]]nܼuɷYʊ*dؘB&L.,??ܬ{\޸<[cՏU1ں&+} IDAT06xy˽hHPr+Jn{* AU<}rV/]޿ww6%[?xa:9:89:}.>qDCC1kƟ>Xnʇ`1Bb1 !9&nyaE"QNn4T?hu몥yLL7IXRHrr` L1==Ϲ*1***SX%m(ԆoI+ n) Mz&+3[AWTCTIG{4.&B4!ĶKW^gz}}srjjjD"QUUHg!heKڶY_ (ؘӥs-vpv^@Ta b:9s曷c/߹{=iDUbXWGGNE3] CÌB'^˹ ?)+/?b1{;9nܜ]YY\]]~Cқql%(.q@cQ4ELML:thmG0jQ[E)ڮb2ǎY_Q (E{B6oYt9~@shhr_У.S:[W c{I{ig)j#6o~&͎ܻ룎1r6u_54!$hڻj=B(SrhWs" Gތ =uW4EW.|%o@ _ T&vToM'^j}ٴ*ެ=">tho3mʤΝ:}wl ~3zW!M3)imlttt!V_O]4|.x_X*DQM)!Bi]oWjiik#&{x)]I9449| ''7heȈݮ[wnҽof/\쟚f0gݎ"CBsN-n޺oC{ !~=|ؑƜ/RD^[H xԴ7ޱ5I~z-]@P!Ɯ>,-ϵ5¢M[?~d9B]W%ݽG91VLMMM(!ZQqk|pqzzy:v8!{Y9GFJvi$챵:8uE %MݹQ:<^aXLHvՖ]ˡh&9449LMzUUU]:gG] <^f]iiwRP #tfSP%;O5on#,^mVV/;wz'[ {"/>1cֵ7ꎸzzuu#֮tqCFt1->.6>.v-GQƭ~د40ݻ*ez:]Ç"CWvfuJPC×BljdX>z?J-;nhkk Q#AaaQnnޣO|g0,&s׼(,*jkeiqò7oLxCBȃuUx<^ }9mmsr_Δ;fAGLMvM}Nit:][[[]]C{OY}/cY3TWQԏqնIFۉZZZ._%TWW_:|Ǫ윜x376x^֛p1|BlڰmB:!+h?ajbLr CC;nBc=v(///Ճ#L2]vc~~Y[B?񨫫khhhjjJ$s8+/eoDqqٸ1ڙת555 $ߚ2"uSTT$mmmell,5#>kޜIQT?^<^]9DyPCN[[{HOIjXLP(,(XLBHvN.!dBwv [4bFkR ŦP(g,b D8!42r677UONNq@iӦu{qWn' +KC]CbG H_D-) pXMW2ÿޕZQ{ccNΝlQXTTn۱g{!!s'ْvvݎ<ݮ CÌBb1{;9nܜ]YY\]]t?x/@vNNMMH$&&Ɲ:vز}877ooā^|ظPЏq:w!'e'\^޽$Gp?~g[c,ڙ_[IIi~~}%MML:thmGG>CCcdvDTjjP$jej"}EW,۹k)þ|9jjj:vLxef֖bo-ݺ6o9sbp>4`%/0kfImi/ yL[XU;ea[n1^HȸhZ܇0=㕩񺵫 JNwjDЊ3{'LĘ3j?'w3\]^+g?)kltCՐ%+;hP3VV3hOuu.<9w~c94x B4h !ѧzY+r!Ѡ!g͒X,>{z>?FoܤQiv{E9ŢQH]J|ЙCVV I|^Puϰctuu ?Pn]l۹)|f>_OCLȫQLfUVRriPQoibpvshheP=QyE2ɥFj3 PC]FS /֡@ 54jh@ 54jh54jhPCjhPC@ 𩌛4kM6!|^t1fBiiiVwl%:~ԃ*,,RWS322r2h䉄O I{ u6=x54|Ο|EVK>xW@`PUU};U,''?}&`[4S}(@ f݆MUC;O6EVzr:!7ꭡE8za ֚}WRrѤ{B6uܘQT*d׸IS| SRRӘF Y3z99NNs8lwaǏLᲥ?I{y˖B22^hǏTWWW|ktXV~{IccζMfmkjj~\}l~}N?lcm뗽wvINL\x?eeZu{Ń{hT=n%V0Ie儐!NzzVTė|aزeo߹C8fG>cnvϛ9??xNO6UGGg/)%u ɴҹKN"+P(vwimeiiaQYYuVH$V%`-4?sW㯫Y#GL8^I7o !JBHMMͰ̈́Ba~W.mj-[$pk(_P-//lryu{oEE6]֡ (,,y3ɡf)TϡC~co~mmQ# !l~̩Zo著hd%ݽ7򀖖֎۴nes/D"qrkϾGHu6B( TX |E/]䧮w|@ Hg_{igh4_%nֶMeeވeee\jUk|%}$d :tH !T*NW{UؿX,c6ExKh(vv >Jь.?^N˖.ZnvPn?ox؉;I.\4lihky%E])dƗ/MMLf_;sZ{q]]إSGvW㯫aBz2 U0XŦ?)klt'(}+!q#ZC C@ 54jh@ g@H$DRTjh h@ >/ ]|tA{k- (54|D"/ t eFFg=>F0'2ȹv/?aÇ RۧdCC">LyM~y|.^<ϡ z h 5:]()++}y_vkusru-'z))H~dGihK23k1{.Y۱5^r^>GpuPCB_3kz|\ൺ:JAnj14ͻNJ/++۷`@\<<>MMM3dxͳnGY2(= f܆ 6e33.\ajjk^jY^^PBbbiiYN}٬z#?o>slmfV3mmgƜً޽vUYY* ZLSSSQ<{xz;TGJ6lW.ٞf9aUɕxPVVy;I%%顩٠]rCX6;>s*,_ ?4.f&9gD<2xPHhX,&vV\ 37_((. BO9V%}*ۼ|>p:E|?.a0 ׮IR;*GIQI~4h`曷/3$^ն V=WrQCHhX˗֬:z耕GVK{Or1'z̺t}&MoqcFX[khh. {D*jinwGu=e#v(\/vⅾ\Y9^g.42b(oVVV7‖f6uffYc}|Txǩ|SW ]޽/_"vuKr$Z1p$-YצMk]]waN=Z4:ޡ,M谖(E %_hB** !7n:z۬슊 Bbcccٯ\loyyy Sn77k<<}}BWb2>iֶM-,t%N_OHz)--Q9*Ϗ\..!=z$o ʕxƐORMdڿGrj`\fƌjgn PC/ UKSo*$rss{99f)ʙczzz uo8lkr0&c֌?|?`-tuSPU9*Ϗ\=$M}y@ n{eC7nʮLII wP w帽s*++_gfF?[GN-1kf"@$q*(AϞp{됆n4`%/0kfIjjjDسG7z丗_UUAN &Bw ma)GIz7"!1cGuuu+F>+KkB },6>XNԨTpi@ _%EȨIOQ|b1Ϟ;PYMuutF &ӈb@s/(eK튊ʔ%NoѢ@54|e4EKK/C@ 54jh@ 54jh*豗ФԬ߸iq3=5b޿]ΫyeL(n.ho޺=y]RR>[p5449{#O< yhRnIJII=yP]_||.^\m~^w{䢭 ߺm?Z[Y~HӦLP,&$ezvNCO{BO~mҤۗ|%sIOhoc\;6/v}3 ii/-wvݺ~;wTS]_q h͖NB|yEɮ'Ozϟ,}z%jjj4#JJ:NPgv7n#((|AM=~ҧ#R֬%$&v1z^Э%>Q@]۷TUU.\q=ھkσ ҳGw/9-Z L:}颅B<ޤߝ;ݺڦLgK-|3e F# IDATe[@+VQWƜ>,-ϵ^X^k8GOɡgC e;uf!eee~MTRZ2_@4=<>MMM3dxͳnd{yyn,_toNwJ“NNSQؒ) r6tڔIS=W%9)i4}DS4u6UVѠRu/Ev[o rȝQ8lvxT*@!J c r   ?X ʒFed8y/_=!vϮ]@xou5}oN[TSSsBhM!a֬j@;1(0Vv^t#~Y~\|Ӯ[~}{O,-^g\~bevNQ#\]=ҕU+XSUkB>*x %$4ݻw֬b0߼c'֬S4͸WV.7k6*LHhX#*Du68mݾS(zK( OvD4DDVYg rd׮c1EJ;윺Re(rSSכ @e٠*@!J,!Xdee=_r(eGۦE%~_4054 倏e֌kjL \5? l옑VZZZ.WTH255eitNVWWc*Í9cT*%N\ט֞1+;'̂n❤%ڴi6ɡi3ZCCcHw@PXp{U=ÓNY%#*!JZZ3zD$ƺsr>[5@_ؘ1{IKES$;6P4S/z~a;oدo?o|#'x?x `g]No]] Rh4-ejbLr CC>VWWԔ~[UY@cg(..6777fT;szc缼 %퍌KJ55+:B)m (ɡirRP(?vjp S2_U.t_=f@NCfk9.u-WS54jh54jhPCPC@ PC@ 54!.n!7~ rvqۺ}'R ptT1nT>_0eĴϞљ>mp7WIƧ1frr$ vuD!A=<ޤBD:uf&! g];{8 CC$$$.Z]o n'&.]pꟲsWxZB'r.G#bQ@jhb wse1={BD"QnntPiۥsΝD"ѥWdjh\fV-[B4[H$eزiI/"]@">_'YLBJ%TBd~B(H+q\'ɏ$S(סC!ߴ2%yAiiɨhPjh~? hgnNY٥+q?S'ciaq!F,] f'}z9"eZBbm΍ۧ-]4d32 _<@ 1s CE8$WϡPC@ 54@ i3VD$D_QT*BA54|4_ x .>:u˖Z"F C{:]VSS2##vZZZ 6O\k0Æ6'M;u\__C4wc r+!bEՔCO 롡khogn&v{WTTԠ!|.^TvNRJJɣޯFhhP(PӅšZۗ._ǟ ! CÎڏ;Rwp$>66:::sװQ#\]4|mXkv9sh1b/=>d!waD >R555shh(MVn]{9Q(˧Ɯ>,-ϵ ,_tBaXnÆN2I7o|.NO055Y5SF,//(!1slV6N_hawn.7iwNGxxz;TIbvrtH~455͐a5Ͼ!hSǏ0FF%Em]{1cֵ7$Cbt~O+]턐bgoc? PP\\ku6eeg8r7Wb㬷%]:gG] zzuu#֮AYf]iiwRP #tfSP%NYL ceŒE~qu =oܙMܐAfy2=Cr]mpWu::EuIR2zI1ޝEU2 ;h~+_(K;i*[{fiVnXJ*.R.۠l6?hz>s=sΝy{3Ax惦ffffVVVRy3[&&_4xDdlj[ovi'8;[YYSmMZXX P(3ļ?>%p{wMbbҕ&koo(u􌌚M_ͽ!o^-_zy пEf&&&e5K0~┮]:O0N} ]sgii߫7؉S])OWYJCA]*35;u=v *S}z[|BBظ8xW"DEIgp/ 6gyg|e[VVVF  xQ#AΝ˽>A ͯSS4w$C`rrr DSFT*@.lmmՏhLZ6) \]etZ5khӡ߸9q|Έ߮}~kd4}M-FO3*_LMM|},]t5鯤n?֑쒮 lEШWdgtԩ---KMg1EpM(r:nneQTΜ8y[l~o/OK`3?+;=9I${jR | ׵L'wpW(ꈜ$\^\\(!>!Qr~[/Kתiۮvm{akժU^]Q@?.x_.O9gkZ[럻5hzĩ ?Cc/ ]Cy-C6nH4.i?3yKQ~e imct ԳOIe 3Gn~Ae[OH(***)))((())Q(U*uff7o0Ls#rZn^޾RS:wpGy'?e+>z(^Tƅ_XXXXW/5[w߿ҲE57*l)sV-׬ېn۩j"77ĩ3;%y1t U%SS97lPԙ蟻}K:ZO:o ]ݰww_4GjJ$^=:rO}zk=7W͛Pv٧"uh<>vήe|TХڴnuݙC ;r C>yݤ{ΝnܸYIl{,YƦ>gΘk3T4lP!otQ#/]C8wr;;9V!sf\f;՟q+6V|>ٸyAҾ]۱Aԏl6l B;o?;HwI"L4M[&NryAu~&6\],u1hM#MoXZˏ {5_ߣiStGpoƚg=" Tdlz})sBxd֭! ;п֣I:^/agVaa 8~l`U+ϡKW>Uuh4@ CdhdhX|>4jARgdTΥR\ H(5Tzn)J|KMMstSj@RAJ/5JȠ@GAA jҧq 2424@x;y uO_ddfUVl/~Cwsu٣,,d' qƘ1{Ͽ\ҲamӺK[]0ov-(@?C*]븹xա3kFNNNDd1AgNݿ&,P(iA͛Q @*R>^OoQ#Տ4lPwK<|?y̸vvǴk-y#.J$'GǾ}^з$ A|}\wΔIN>YnnGDfdwulPUݾ|+W7ha꼼m;v]mղqcG\xi=(7_-H$ڷ Uf2/MΘ: iioΑk~L=r#^qSG_ѵd4˳Ml\;wӧNsayݻup(Sh}эAسwwǎ޹NLL Cäd^=u58qy6h@X貕B"./BII{}hs?~bAfMMLL|e+mDgg++с#Ct굉;D]9=#|K1{_2rssli)5oa@J^4IcwKKK^=՗븹z{zݹ[gtrj$$$^y|K-ML̬RifA#ԏ?yrVo1*ckc#BZZ\ TeRsrヌAh٢yi{'Gү6KJN611quqӫ$A?5lP:gj[7WARSSʴ7]u(@ae2Y.]ZL1Z+CRB&~[bHKKd]]賋3>ݲ-++QԨQU(֭8dhիt~>*ԙ'O?U/wܑ rH$';zĖm;'(߶keRRYרanfv j(|<豈 ݻ{qqM'?e+>z(^Tƅ_XXX,{pqqnݪu32RRSmء}pOfg$'l޺Vn Uf(\եekoTde%&&mٶSA IDAT[OH(***)))((())a}aL#"t"C:4Rm?^/OTPtsuճNNG_ɓ&ݻttM͞9mf߭̚k1=F 0hM#MoXz挩v9cμLE򖹹CYl=vWʂhU5 N|1cw1c}{}-`\z'޽ãF{ƨg8Gyo7?TW_g'</dh<z{&$$&'J/G6uJժeg4q:n?^u̚Ŝr 8s=7i>'dB&bd䘛3*ѣf1ׯݶ<][oA'LۧA㴶IKK_zMLua@})l^Z{;iv[R}v}AFiؠ0~eguɘpq,_z:u9]{:/4˳Ml\;wӧNsayݻu*QTXYz`Le⒒W.[dтeۦ[ #1gȁ8xHZE.>?dN:n>4m_'Y?eyovվhi6?ۖ0tG6oh&ܽw2,t?)..4qI4u}cS[BȨmӤ\ZWcԜ_\zրůg?ͷG|0Ic|7sN϶ڿt- cƿ3U3+ \̬efz%'';LL4h`ߢy<4x@M-,,S(XM|BBظ8!o-"+K{] 0K GJMKS]FOH[GDN:~z5ЕC,LϱJsCt굉;D]9=CZ7˲m;-e<Z4inii߫g^~JO7WoOϸ;wK,՞x-&.#S453533J͛yK+S%E`l[amz岗tV$;;6vveJ4/M*ڿϣůk?׿__6OUuIsv_*Uuh<3##ѿ^Z_A<۴}£iAΝ˽>A{(5'ǿ&FT*@Yۤ[ZZfYmmlԿr˵7 =0KGϮ222Axc4%''7jؠۤdW9Z9_IJ2 F{LM555uvrR"Bjj]b&rY;| L&kؠ!k^1f Zkh66S*ZXXoQ[be2qW?ùTAO$իtpS(R%T$'G'DOZ:osvr*))IHLtsu5 :X*賎G8%%Q.B|B r_؛Ԣf; 3ڀWʀ.wpW(NRN9;q_}aaaQ%OeUumV 3 A"":/NeIUOIOIIyzHHHuTxek| *]%V]%aabp/Rau\էVsjJQ[Uy\]7onFEVVbbҖm;Kg>O \"y¸NlٶQ|Rm;>܏a(tɘhwb}/rN~V|QR L?W~|Ühdt5u,ͱj8nrͺ )6lо]_j9)^Vj rC3եek֗].Goݾ3>!D|7vUuS[1+P(/o4 1SqztjvۣW^۷@jjZN *N00fy1:4m<|]JjV#"ԗF0t'MwƍUއ93?xw;88+6\"оǫ} nz}0Kn;hM#MySwrƜy =5{洭?1kn^~~]id4z2cg;듍G+$۵4š9|銏:9ҏ97F%RTbhjra WVl mZ}!iiu̝e)v[uE`EnbVQ\.wp(y&]$zo-J]RRZj^mgwdK' Zu1g1sg̋S"Tdlz}Iϵ mZ&s{1 3k[5?υF^H}DCrySv7o޽ux.DDF͘6: Cdh@q'O& 03OIFffYYE/**ZbkURju:<}bV""cc}k =|a dh<6]ZW+mPc'N>ˣ{hL1_? wkQF|٧B=`~;qfǟ1Θ=}_ <)W^ C);'Ǡ?=H^H=iAgNݿ&,P(I+LIcqcG7vwAP߸hA"оmpШ5k00hgظw:9ʧO|-rsw:yxD"BI}V_JKK_zMLua@})l^Z <|?y̸vvǴkpҸw\|fMq>]~=77cZh~ק}qL4ϧö.jb⸱NNs׫w4F|kS^^^\n|5fLKԴ~5tJZkB52eh~yAOUu177w#"su:6(P&yzFƪk^㴥;uR͏(7SKޞmtJ/uǟعkA|{l[f9|+SSSROR0tYqqsgd21kC U>o:Ͷ(>l{uh]{yQ>̚1|ԜMjjᇏ|{ƭN}EYfY&r͋l^QѱoW;͵VC9^סQ=ߴyjtgϩ_hINNΖM7mXl/>xLş32oM[ZZꙗbQ32b<9pĻ?A>7KW9u249~>~>*ԙ'O?ryqqqJJ\DArrpz~OLLp7? %vWR$HUyKQ~e U?YH- _I??`rgIſڎTRRZa7|B~--W%fLDhxZ5z{ծ`ow pZ׫kx_.O9gkZ[?J΂ ~z<;qO_13LѺ+1Q+ c4`aH*HmU鳬j_t23 Ci) ;|}a>p/[OH(***)))((())qqqnݪu32RRSmء}; ڼyu6*lY&vv^\\G=zܼ}uԱlsw]GJell\ H$^=:rO}zRaC}dvvNrr;*](KwOMUuttX|wXDE]puui٢eUx%j"77ĩ37g%ejj:g O:S|ӳ7eп}__qzh]{qq_~ ~[Z` #WAgYվ( *ʺF s37o?s\ʏL1wtizC!sgYZZ bAc'fMZ% 33;'{;g[΂ ʐ7s_z^ϫW?Ұ~ᆪٜH$N}z!o ި||bn܈mgg7~lP^ lwxdTvNv]ƌ)u!""''Uƍqrt+>orT7 {[&U(AJJL>gG&ӧoffa{ *F&%'ҫ֟.SǾ=!O<}so_;q߻^=XURaUqw,^G_+V=JHh=[NȂ%~x#~랺bzv|{%/qt9}3B24o3_"K;{=mL$FU.x4il!WP$GFM~ukXUSSS/GL8rԈwA3Wu0bveJdgW[Pw)62_+$O?JrT irCž?Oef?Qa! Tg8k!))YLNiؠs_1*VRRikkWzJ$g.]a(#]ݺuO9Ѷ23;˳Lv~TiNC;9:$$&Q"|ZjʸWy) g=U3?+))ɘс2lڬ?=P$0qcOnݾ3>>^uJJaeenjz@maR9|;_z̓rs~<2ꢣܡϊU=zϏ‚A}۽A7fejJǏO>MoyI./Rΰ!o 9'$:Wx"۶kjY{4@tuu٣O twCxΝnܼ8b*A1mv͜A~kNGW vw E;yFJ!Oe سaEE3*rx,-_8gt_΂d*8m@uvgn7NΔL):4R )AxO!`C*n`:4@0YQQQ5xaaZ TwkNHLrvv2(E=())ٺ)(_ |hPݩTĤ$E:]573i-57eJA8FWQZZZ֨QC"P CU)@ Cdhdh g9C+ irӧLŦ&nΖ2t ۭ}iGChIENDB`kildclient-3.2.0/doc/C/images/we_general.png0000644000175000017500000015402513215302470015575 00000000000000PNG  IHDR pHYsktIME &5tEXtCommentCreated with GIMPW IDATxw|EǟrB D "ytB)RZP)RAPBH.  \%+[<ϊٙ>3bqUNA)0%<7ȺDّf\ 圮@XNLeGɄgVEδ3#) szā.ByT&Our djGGZMPr۬W)V9Jޗb)(Sq D29JH]|=)sNXN(!ׁb^וy!)M'@- UUsU̝&E kٴa6`L8ǑnR"a8P|BxӁ~CX7`JxO4[Vbn&|#6kB*M7Q 4jl6]"ik 5csLrim͚NQlQ;F['9vyMmlL;!Ep1!ښ0.aj"4C5|7jk'f9-Qb!BQeǯp)GQTtZ!6=E +5Xۙb4 g3~a&̵ 1kSbθFB'0]Lk_`/!M2m,,ɲ1YX]Dud6a k[& F.< kb0ju~~~(I8??_V Rj{ :ջmZhxB ''JwI&bIXjO< -%8EFJ峱DF34i3^;KVC2_z-9h*1>f4>N)5 XKG#">Ynj kx8H X`ۜ$O8@N{ ȍl1Zq~~TTTHH(EQzJ(BHNvvzzz``k q"@ :L1볳:'O0i򣼼ŋbBl}N$ R)B[ "n7k)QQ, ViVJ)]FN^Cl$j?K$)wLZRPHY =qGEc)-[].;a2op5ѡ;K5-)..{Tn]WFC7(* (HwڕА\Bz\Z AASMɧfݺĮqqzlX״cE.QbNҹE .)K$Ja7T3cDxl&Xk`n53Z٘51P[N$VmLۀPbLfhF[śl@MVmfmfɺnlW/ZwYA\k? ^PzCnnNxxFSFSL/Ei4g9zz9~XmL.ĩ5rOXXym[>~Jlg۵,Uk׮^={meZcPBgl;* y3:U b6a5)lbBfR(sRf^lKYͨ57Ӗ.4\X q*ֺ۪!@k0&cLtb Fhݶ A_.Rk5)'>{h̙xFS\{ =o!Z/'Ι;ikO'r  ݶsשSGsέ۷WVXur|a 't-[@Vs9n<|7s"-MkZƞBd^[_Ow O贺'~)**zihXrU776\zqO5-v1eJ\cYܤn5oHYk$E93%ll&D*&b@)l3A.9]gK]z#XDNqlfy3yk[ V|w%8!P܆j>IJ-LU=sxWnfBx k'xV%Ġ)VkV3m"ӟ<}2/!!%%uyXSzV[_O%$$,__6m^zCy qyz{I;v?y睠,C>͹~ߦML9:rd*׭}66u>$B!WMHx8_~7m*:)2iȴԟ}I{Ԯꫵ:-\re^B“Ǐ>; |m4BjG%)1ӄ"؛Z5U,e-V瓘l`b(bĴVR/rk2 d+æ/*A,(.s%hތUj ]z9({22EYL, E[_Z[ẄoI w|$_H$XKڰngB=\jUÆo$߼^#M<_3 ֭M<~7y SzH,rOys{ʥMծ}ޠ>4+L<}RT* }~ v!}رZk=%Sԓ'Jٳ'&oQ봦 g;AsM-55:Mı3۔i dE6ED0fq$V˺)ٷerp)HϦ+ڗ)\X\P[H6FB`$:6&,2aX%VkObBtd%_1NsDa (2-xs{/[b2 k#+|uZFSjaKlܴ񣜂坑)W(d^^a#G ޝdH/M8N Bz^ねwDDoپOO'~jjNNNu?+FFv>X"F~v/=Fرp۶m[222ԭwޞzk?R&aFt۷ooܸqYskG&NFDZ0oOT[Dk17I0]|.ٌBum-ܒ oP-L=Sނun&OqMDDaŅfI(2~q eVkj6m98:ZlO8nT* +}\?v*3Ge2$8X*V5jBz^tISSi4iEO{{HTa᳜,qc}~o^8oLk~i'oڴɆukuT536"B½<)P!NR! пBD"p&Xaz`H$TUeec\&jHjpj]-vW3jϞEZK&Q*9BRiHhFV6x`Haۢylq~]phob{& %-@;EOm$8-R74W#/"aC 4 a]<;xb`a0b*QDh'4> 恫Mj]gfN#V*Biqmke>/IMD݄I:[,Xw \`iNxJ#:EO;QRf~U-"8305rd%,(?W7eE.xUvΛG +"p$:Io)y6G ޳%5W")U5Rv"Hu>"wyc asqJ8S~D͐,2Ta2uV7=ib!M b[kXL M{6իšmy٬ (Pn_|Ps&Ա;NRY(Pm1|)Ď3'8T睺^d@CfA)PDh=3'/ka!L$P-Ub4*Lu3:3[IJ@j*EPMD,?,u-7NլNq(1a%)wrx)DL pZ+8 ŪX24gsWos=9X#%Qk`O8"(ۓez'JRrDnA^e G.umk)!ee6fH~lª)z-߹u6C]{2 !Bb1׳Y$6XU ţo]9t%ωؼ'}"l_Bci< :0F8n9i Rw&Վ .4pYm8u)km}q b픘X"DMi#3cFl8T"DI`/AA&ׁm*`fZZ0[mlׄICno^ `Dxq 2veA% 7hB4a> _/Θ~$5N$BXm/@e;_UW~ z5E-Ե\(bta6 8vx$V6wZPSX۳K)l3:b>Y)<=b`y4 n&dhzNbC7;j"\!D؝IJJ{"K^}1qY/qD?d㼉6jF AUa[z0]G` ǠqwnJ@|`VqAvh1o4z sR/>Bq4c0y"Vh3kԙ|j/6!,D@X9Xq1@PAN+r!ZNQhfQR#D3`D+lqtwfl",%UgS*SR/.F{" |Q=(v"Tp3" !Bcb"mjkv_Q\4bxFDM.FL $ͪZLk:9p5j5>'bHP" e&m Oc{6D&H$TZsHm`0lm:Ξ}ApɣXĺm*UW-, ռ2ZjnbKBܓd)N}-'hE58Pbb(bxgQ6Ypڳk=(`^m+Imڶ=>8s yDp[խ[~vknOf^9==Kj|ؖ, Ոik쮈il:WhJXXw1H>c#e}`D6{c*)voo3%/` ǦY=i/y:NK@t!DDLA+/1PB'w@ZC=8ic5v\u bc4Qu/p݉u~ =abL2}p_;wpri7! IQ¬u)n}Kx/j'<0mD 0 KFTp'iM%5⹲m yqDxwJC]YHmw.n.M84*Uj[*s=<իb[1DŽBe770|Dbp*`XBY[K=Ed?fnf5N x^Q1j":xyhV{$Q7P-%f]qL>m5/"龜A21F0r,ڀ}DND\OYr#oL'EbHHnO>.LhU5A={4G2 2n]h`ؚ|fWj2'H$EO(IكHJ}bJ M lDH .[寕s1D_hA"kz-h-j0(ii܇F6{LKwRIHXPor( fiFm?fm}.剤P <@%F9O$ e=_둘O"ژ\t2חC(\m r?>M8m[aٛwNt&%ʋq2[& IDAT3^iD RSfg/^^e!g,PA&3!sn%ۣ/\.xm]t@gށۣmm/hk=!5Y^*O}Ad2V}AϏesg q?_9FA Q?e=!SG?zKt:ZIkGBb'(f3a&6EqY/`~6 U?02 {`ħA{;F*w6 N;0qYό8@{L˜]Wa' YAo`(fUwz ::zw=GO}':KyиYݬZ&t =85 k(F!fȒ=8=M<ɴHyإ(A(ZS `nQĨBMU87CI G1 v0m} i_(+< O&U=կ `$5qX͛BhEzͫ/J}I>H$R"56R[l6NXæoD)cö(o.KW B'ȴ g#Nܙ[$qyP$9g{/}== u/}wTg}XM7 A:8EzR<>*_?_5d+:"د m=b-RY"ps%)A[$U8_CB"=ۚ865KВSvFdz, dm{ G4@&WiJM2؏%_čZjVڽ[?rsgn=X]zd<髅[nͣ)0H㕶 FmkWƽ[9d7cTQRC?ef$$ZRos8h{8@vE1 B" xfYkl^ڹ@Tz~K)lڥ/ꛙ#2CD3XCA7oc3?XjkI!Im[7aRASR^ Cpfaz+Y(D;D)nd".-i:8.QF#C={$;Keƴ * 9$a u`C{ iJN6 euo1 }ڥhQly!.P$/⠣EoiqRihxwD>)!DMQZM YwMDnC8HG:bw=+T1;A:A@3i_~xFw}He^=M[D"pcmSt[]yLw.+ȕ9-QC#tmRik ycSxv638.TJl5/~+O B9G'JAP[ Zdpz~\KC M@BlDmn1bpyy8n"w!R.+gRP@# (vڝޫ!'j͍R_Q XV5b׮:qYu +!1zȑfĉ 4ܺu+qshٲet:] Mm;!K [s9&nE:Qm$23 Eb^rBkp4i}V^ol߾7HLLܷoikݺuR ߹sgҥ~e˪W}^ju͙36[޽{ǎ:vcG=B @ a!< t팋aXs6;B.ԃg%㭊 .8j#dsv]j֨#@M={ի'8p47oiii>o=`߾}={F{"蛍yl(IŎSriD5 =-RX*ѰᐡCkժet39ċJ@@@^^Ǐ,6eee@PP SL&+7MЯ_c+)9<:Jx>ĎAx8ߎ>,$+׮ukZ>k׌x^`5j&Z>z=z۶m<;z!z333C\-X!ƌ͏ yO?~73=kСf:s]t_nl˖v4nWo5iҸaYZ֢̔{Fٸa749bģG 4nL!tM|377/vЯAAA7}EEEwIHx]={s.ԩ=uu6lؐ_XXtɓЛwkt!UVu@@kݺui?<AA^xO TꜨvUmן~ЧQF͸SZ~?~首͛w[XC;qX>}ڡ]gΤ}ܷ'd25nܡ#ZR2wLd =vAAH$a%c)ˣF|w}1h+c,xS֬]fUNڼE :=**^ZJի-~zA~>HRzz9rCϟ\P Ƌ  "{/cF?`q$R|zaC:uIL$>}zʔ);Gv봴~و#WZ%䓹gWTA>>>xAAgc\._xǛ k6z}jju6m8|Ǝ}Nɜ sT*J0wnΝ-*,*S(>^{Mtɒ.#  vk_24kL`M5kԐJ 5jEwyg>^%KMzk.ZCC k޼y =:<<|A?qӠAf7~M̶AAD|,AΗ9XFa2۷mKKK0q"^fQ2/.  ‹T* ɓ+  S[׬QC"L>z#  >zw`!QGAAբE= ƪ-:Ɗ˴-iA1:$wzm٢[Ȼ *$G+O;NgLW̚={q]Ϛ8No^-[u}~~{GW^3ٲuGֽ%Kjȏ%J|6tK/~ɛjzcoִI͘]ty&hf͜ѰA ̚9C`'DijRn3m톼٤9qzLqӽw zu֪5OtQUo;R(Jwnnj}mؠuk2 #k_{[ϙ3sN[lCBBzqS^^׿~ݷ}]~uޤ+WpoF}wt{ﵵ xq-K-Mf ضcsgddO>c׮Wrd:qʕn:pЁC5Va@A}K\C˖8ȸi!⟿_YqK=pQooǏ￟mJH9kVwc:tIcfFa$.QRҾOuk_{5w/iԯ_?R;jD[>>>&M<}D[:<?vlA'2rI cfFa$.HPPPmnx֭I&wv{񧽼L׵YYO?ܮ]m';;N#6[~~Q#,_j)%-t322 {>BPJZsAA<r ic| H7 W\?o?׮T*(\4itƴϞ=|k7{/Y\H9ȘQ 1[nÆ ҥ1e޼}?:K__gϞS`Qaa͍t:aOSC.*UJIIYkxRRR"##'  ! {v'WyOK/}_O ի_Ԉ-nFvUn˽p母)jZTTW/cǎ˖-OMMt̛܉'o-|={͘65555??VL̝Ϙ?cz.qA3 㿜33333sȞ3>49nܸM6u8qRץi&f͎`ؖ6];LW ,C {a{toʕ*s?j̘NwjW^9z4vA 'Y;ZR36DR(*.=Vg6df0mLrثj{zڜ:sv-GϜ2/C$̝K'̝ӁcSJ9rC4ҋS8kF,wȝ;wb[Ƈ F9yhձ)HȊn֨AP[#ik 6pCNi >yϓ[@SƁx"jA\A hF.r,lA<ܬ,A\ A8 ʖdr  e!X A2s.-T*RiJe: $ jJ\.'9^jŔ0YE‹q㘀V#뤀.C ACP`# q  b4L"  c@m   ýBj֨q39/Aw!AAH6StTvSw^T  B+j7ƍ'M=g[͚][nxʮk=z|/%PL&xNGRttPP 67;fmb>{ukZj‚tFYpᡃ}&N6ݑ-C5|כ7Tn~ ܹ:|zaW@ɹ}n:u+T@ă((ȿϵ_ @򮭯^2yF};9yORL0aڵnj…  O1#666''gը6^O^b,d^7_Cm !;;;$$:6liӦ 6B[sd:u*-@&eT*U;oUM g_5:v l yÇ۴kOٔ(zjj*Jx*׬]fUNڼE #JRv@#`JR .\>`ͨ٨WS"=<<<---&&RߏtZ:u$&BN>=eʔΝîdh*)i*XcE1}A\<6|+N?^XXtzNΞ9gΜ;Zțfرot nO;v|gy]AA[qy_}y +Whܰ'6jبtڵ{׮5j:|(@;> V,[x   Zl٢eKD\>uڴӦY'e@ӡc,&mijj7o>}4hb^^^oܸ)---00O>m۾Gx G̟7wsΓV._{O3Cݻ 9N, (p'&ή]j֬QogΛ;vrrhXبczCѽAAʊ5[ qXSo~~+WXyw-ݻ]-Zt p!8|C<ڵZWuցC:• IDATYN_6…?ytⰡC>?p!2 >}zǮ]\mܵ3zWk˗.tJZ: kA1 .aw[#)3Jrd̙t֡Æ͚5룾}@*>~8<,3@a_M|SbE9kA~9޹sMժU3fҙ=FL4uVMH C]LRrsr*U`" &n:9NR}lyyyziӶn۶e?C4l:(3TUљzFFFttE+W̟7kio] -@PjZڸi+- ?el,TAbG!AYx4F0#8PLLӦn߶mK-)ńHMOcWT)%%"úyowR}^mظL1s~v !+@<-[[>'''''gݺ-[>hH *m׾v?cFFFFFFF靻=z1mjjjj~~tbaaR|IeԈɷqݺt)(( Rf: *㡁GTIm?`t]`2#GC ?!z9o;w^[: =5?^el q4<"   6s#@A_o7#QUʹ*v (Vr9 '97 ٘F7x˽w?qQ xi ggDTr4 KqyǍjZP!K&x%""+}|04 !XVefdgga HYhk_\(u_} o6if&Pb]5ݽpϝ,a`l?;{v9CFӻO#Y6 :].qfb.yڐy/5xB;DPJ%ҬGyy@ăj4J\.'9v;nz?p)i*y!3f/[R.^p Ygcc9+/ggϜ9x7vUV/˜?&˽r x qq)nonVݳGڵƌR1;9z[oO4Sjd**7'R -b3#>>22222r={x kAAD2R0 ;/aܜGرku+W̟7k@*:6nZbŊeKgjkjjJj233yT2*AA`,ICBCǎ?-F>lgc׭e&ˋ dgg֫aFB_~.[@j5^W"##뵮AA)?O88//ouգӃoN6f+,,S*<2i1"[7_WXXŤI|Ĉ[:$榘53>33333sݸEAA/]uߏ>^hQڵm|J:}ݺt1^x5_ݫMw67a'ԯ׻W-ڼfȧ֭ŋ\x$۬CNjF]/  R?R=|`0mԉ * z8Ghp206ȣǏSRD"A` A"DT$Æ@rrs޽Wn 5 v/bk ːc1%vKիcaA<"/kWCP[#K5 HdU),FG߼/6F$H RĎ 'T*}J|#HYhk1|!Hhk~:V/ )RB[@C@uR7 ޡc'z߿vC*j;=` H_AAAZٛd҅ tC._WAAP*T~}܏S~7Z4o>`@///бӧ|o_nn.!J,vZi֭M\F a!m~?wy?5ued;wCzkW-] V>!;vWjFFF@AĨ%kcбSzرtS :tSN<֎eʕC ˁ  H&25jLNvOҜ|PcŊsssD%S'Oˁ  )l 8883SEgdd7QŸn+W,:l86;  5kؾm[l˖}g[&M7l8+>^-v7b+RniѢ rrrrrroТEsl*THKK3i'gPհQ#lvAA ea>s[qb-OnL٤{bֳgOMRYbaðA湿+G3LJA6_oLr4z/N>tQח sC2x-"\.ql[{c Aq X ew!6[-S(jژETZURq26 >ZC%---&&^1Nd-ˋ dg3;jP > I;WRTs;uL'֩[wMEEEӦM3f s^?Ex_OZ7Mzk.;tZ8Vl֬Y>fFۼyiC F.v@VeJǏTz|e^U+ VG'q4KnJ͗|Z[PT\%"BH?uQ*3#AR6A J#*VA,aETJRUül A<FP(r96d6|;ۼ~Ξaƭ[ 0bի:vXt $e%.~ƌӍ͞RT*xB*mG)ե[T* 5rxѡCGDD ܹ߭w4a^b|d鲼s왳f[ϛ`pwɝn,٢ l;"(õͻGGGGDDի}z9# . .e@J}BlVРAUW8~|ƍlyN?^Nڵkr(w`/Mw6mځ>;ϯs.EEEnj׍v٤qW\YP 4?/0\p\p\eķ|#yA|bL|8/ʷ"AABf͚zw$%%u+q5i^;7v :jݢ7 Ūu։ 8PqQgݣV #$gS~"87=wyɒ%_ر}ѣFuUV`ĉ# 1˫Qƃ;;7idW7/00p[r5}/+/Qs2ғ9]u_kHդ^]&b(k{hwx6O`P MQ|8!'b uN[T[|''>0 5WQ嫩qBU\mLAhZÐ C<IUʬ 5(' Y|3I>c :p8ڷ*дPpkgZ1smZըϞ9Se--UwwD?qhscjӧ7'Nѽ{АzUqٸj8}ȭ۷و씶,fS'O444ۧO~g՚5׮]_8wߵ[YY CAjji֢sIO5?nϘ9HUUcNwdbxʕ;uy͛ؠְ0XYR֖CCڶ-/\XZZ*{Ңl1]tjڸǏٸH$Z0w-[kzchvzvk#[nkժUئV߶ܶ}{DO] 6.jۦuaaᙳgK/Q?c„ &L0g%"]ҢeW.14{#.]"_~p̱ _t'; eg垮xbwvlp}PPRb3gHqիG ͛={_ĄDEmڲ~DOVߟ-P)-?n ׻lr###"0qRhp0Տ>q:'D %у:%6ojNN}5k 3|.<Ҋ\_,HJL Xߧ__4Hm HO5yk >8!JѾO>f^y-<.@>t`uuL>!<Z*S{IpNN-[̞g s& uIqQ|4W-k}MD a, 'Me'=D~wh׮͖0Y̾{mwEC>}_z-lw0yyyMHHk* }u^^Ϟ6f筿i֬CѼ~[ҥKwoۺu{#ٳf- ްaa!I$<--h %%hhkϔIkLn6m~*.yccc"`]2FFD4cMoOOK277_Ac(kCJTYNyvRR284@~nYzDxB:==]vף2lbMD ް~… vY sqeg6m:蓮.jMΤRvM׮}bS |`rʽX)fj| 9QSS+**D!'&&6lؐ^a̓CBxy\ut:r"Ϗ9vlCHox2))S!=e>,aU調M-WCهW\tMQv%N[@ íviޢŶ[-Z$ppX:vyX,&".HvZ^ű2uH"Tc &O4yΝ""fY-E~&D<~yeJD]\yS pף11&N?abq!yݴ/P/"?Y֭[cƌ1xGAX}{C[,PZAIIɊ+;88FDDt}KJJ֮]vڒYZJ w޼999m|6KK-,f{\+ g:(0a„ RLDydɒ/^ؾQv*O233c۶m~QϞ=zym:h͚V!/D4rΈD"Hv,[?ݼy#hژcG;vr ůT6(^V0UG pïe*ZoW} \\]eq55%n߾zzϞ=MMM-XfCN>Gt =32r3g%$&N>3LTU SůT6(N80qC)ъSh a-0aH$Z|y޽{:"C|vN1;ojjwaϾȒqF߸FR Vdbߊ223=aFSؕm@'d_b>>kWDxStЁǖ]cŻ 33LLLظIձ3Yo eff ⦦O6o{Y~~>qrU.WCeyUUbT6(6h aBB6ex#KO@ukBY%aaa1xРҞzn_gp#{J_(LKKWRS٧Ǟ߮Dt' jDUE\lDnaيe+240?'###6,355y{-Ž255emܸ07nוG?/gȷUV 99ʒ˖ag ׯODIxrr,tQ455߼y3prUp8ek(▗WJnCk /9bp&fF<ֽ~ҥׯ,]$uOΝw߹Kg"zannnn2e|BlyQ?|}zf ص+;;';;gǮ]?ty{H޽6mIJJ A׳#o쮸^z[ŋ/^\~}>ا.]e\iiDT*up_jU\\H$zy@Ҋwv  ([lֶ iiii6veoÖ UUՔUVWjmN\\lr+[Q"݆pv8iDOaÇ-SUO\×=+-wvvڽg ȦSGN 1>l(}{͝CD߶}GfTaߛBI[4o>w|DɁۇ\6##tذ!rmoÆeffk!6:[YYi6trt$-IMMV_W!=='|'G?SVque)SQ?.+V'OŶݻ3}|6nڼt2}}!C_t\eUkG 6}7Olr݆*r0R"\  '=59UD,V\n^zs5jN* 5OPr Q!\Έܺ0ogfddx#\GQZZe!ÒjU|I@mu+5>?AkW@Y|>5<>_ENFVS* 5y!x""ԁSXX{Ģ >zqۼyСKKK7mTr^)(ahFp8cǸ ?n?>FӧN;5RP"mپU!r QC.().t/K5JixȬjHr57\30RhA@C+ . 5kȭ9::ئm[3SsrIMM9"q _O@|f֖q e }4543OII=sd~~DhkkkjkyoGݭEdyse94%p8:::***%h墮)qM1NŢž[6O"xL 9aρR4xȽQ+/.[SC#iGGʮ9"¾eNJ3311)\xY"5s;۶n~ިH]ŋV\pLXڳW̌k[Dž nJ~k":r8zl|o=e-XA[秥eef׫ˊ_tU*Mgr΃+[ļ^4K++vʪ;I{ "aRiӇe۲u]PPКzzzK"w&N9te89nbbߨqc"θyz;#",,,ߢe[0 sܹ?μu.z r_40`ZZZZZZ;F͝3ٳ=%iS<}D,.*3D _O>wq=**c\rEq|ر\.w 6qlgI4Yn?pE@&!NjrRBKDtfZd! WgDe*\u>q*ơ2"Aϔ ˾Q:_祤ʽ =)Df&:hvvZ[Է=?oQII>3|C(5ꀼwo߮'15j5NGdaah_TZڧOY3H䔶;6+@֨[7Bz;z;@W0cGu4j4jh vvA0@vK444q^5@:ڽZqUQ"$%)#V⢪Z*q%b毶}zyaF[ֶS8Glx5r];o}!>:1*7n \ٳcb.E~,保g`nRӧ37M~Ӵ) 9sEEڶq=JMMF{Tvvc2 3sޖɉر6F?CTڼY3qc؛bq׮_ydSY**{ `ϾȤd]]ݻUƑ u\Snc\;~T"4ՅQX/2DdөӈTrU1!3ڝv GoGoG3v_\o KkO:ѣ~ZWXr`쩇/]{gƃ?hjhZYZsr[ܻWAk֭Y/9sҥ~|erlKB6mvrtxgϟ+t!{ 9piJJјco#G-O8z4bUl>{g,Fo%du&M6SI@'Mݘϟ8HSSe۷d)Q]]ϝЭU\}󍪪`ؐ}_rmHP>z|erlKx\nNnn^^xq )P(=򕷿{5Q#kU @IMDMnS쿺GWWgqcbn\8.efe͙7a.m"gws*.X΋/EFŽ qo?f&&&˭-9cz#kiio+ VrSw g99eY\qU5<{%wnݺܳH<zM.YFKkhh.3DkQ<{wAaQSظPQ9W/ʶںtoaa[U O z iierlU P ]S͋v4hC*>+8$KS;k׶uS{FիNN߶ha۽(6(JCBBzt޾]s)( U}Zz̓GDy4fzزu{RrrX>8T3.޵.\<b]`٩D edfmٶ]VƦӮ{srsrvEyg**ے !Ib8\H1Lڽz8xiӦ'gO^gm SS!me67Hb"jZvݻnC][n%"v;!dzw˭-iӺu23ꙛO8AAJ{#Qឭ 5o͂EĦcGlɁ{#Qaߒ%ގd }WUQzs5j/Nc׿+JXw#F2Y˽޺KDԽkWO^{ qc (33s!/\KPr Q!\ΐh<ܥϢHʲo(rAo ?ϽOʍrnvyРCܺXy_c!֯[pan݈(99ΎJ{^Y֪uffK.^04wWόSN]~VAAAvx̓CBxy\JDfff[oW^JPR #E#`q;8uѣNN>M-\XT%-X yX,&"pϟ>yg ԛ4vhͫ Bj'>Q:::z…e#;b偁ӽyx:usWrrrFVZGpzy%&&Z7h0Znae꥾!H{KC'%1> 2v{3{/AKQQԪUFZZmoьMAAgTUT6 op7 md\./!>>5%Q`DoGoYa!UUU|ZwG554z;z;7hȭjWnԺqB CTzkWS'Uy@WjaH!$h MqS.Pyw&PȰށ^奥g jjΨeD%%%EE&Ɔ::hvvG P$QGGQ D" S"ꘔvl|?lV7qǍk6B-ͭ--򫋫,r1n6l6j睛h vvev^wnq*6`o@]vK445[ cc*L5cNGaϝ=ۨqcS/_|~=[gi<;wV'z36֓X!##^vvLoUyVVVO8'=o}o쌺у}x *jӖ'ž~~&&&C[̈oIq>?HD<>?---+3Ӽ^_V[1e$ڱm 8yjS~R>ގP [Z IDAT}{cʍ;8.}8Μ斍?.ׯ_c)))5WO6feUNMMeöl]f_ڟ0[ac/^\TTئu#]Ԉ}'O >m'^YYYnQ?xGR7ߌ㦭.>ySUTTƺNJJ=yJMMmϦ_}`N[KtQC}fx̚v ==5A~9P,G?pM"رC|~G,yM>ׯ_ @n>ЕJJJ臮]ƧyMqv~~w-[͡6mZ?(`bbI(..Ԕhr- Ü?wn3oݹEe(Zz:68uϝ3KCgϡG\c?zw===iSwZ8o.m 2bxDrPǍqg~z/7o]V۷_Hzy{RA{8T ~mG/>_wG~ےKJJ]DDö;<Щs<655m?hsέar3ΗBmm- y?͑Ň ha||ׯɭioJJJJJbGo)S>}"|i<^NNn^^o3 6jƈnCV~,&"ѣ U<\_ !ݻ/+?y@ bcSRR2h;7q< ))i.*peG?ӫ?$jْ^1uP/rukF[ ;]UK&M2610q҉X6>q¢CzO!wiӧ/_ԡ"0`7ӷ7ivzt&uK/H,x<5N6ẖGc455F|۲eee_a@_Xqtuu؇*"7o vMM "畝lֻc[.Dvl +Wae]TP1uӦv).)~䉞~/xbX"&77Ȑ(''Wᓓd@I.vvc# aD4fXvϞ9?)JMMoIߒr;8:98:S7CCÔTK arr!x1 {[[ f044 _0r-dS'OEEE^3+Vٲ )^/%}G"ʺábPUE h4ԯۙsff*|bHOO/==9 zrb퀛AtlkҤ={ҙ}*tdd mǎXisVWR"Reeem۱ V^w؉UErZ9ۢy3"jѢYo[da}9999ԡmqϾܜ{C|DN%(h}pvNPإKg;~klݺЬ,s3=`=8κLSSA2܇cDFnյwvںRCe]T 7زeˈ7o5ol_ԁ-[O9 wR"о{a,yv}!z;`׃R$ſx^*+.mֳ!YHS٘UJ,t.Sr \RUUESԝCR$:'MގP qq]b3j۱`~ʴPTۻ=oHR#e8r-).zU* 5LP+8h eTPvK;ގ,j|Pk> jFh:g*8*:AGW'91Ͽmݸ6?2l҂gOSttu JЙu@]&ƿJKIFkj @Yͭ &PB**TWHDoGoPܺVݳִIO6mӧg5 73T;Ud td5f\%Ev>i&!!!۶ҹg7mء]]޺u- JCBBzt޾]s ߾?|WDtUg'o[}Tz|`n2_3'==܅ SM[>#<;#"Ξ=[*]+[͛| ͞5k;wv7[rtr***> lTdOs:uJ… y>enn߼|Oc׿5;Rl^$&''0R[fS3ss|phhHpu.\ص[7tPܺ9133ۺ}{z*>7E̓CBxy\nȑ yiiǏ}f̐[lϳgb1q9n>S7qgWbbu3*ɭ{9+99QF+WBwQsrZV6lvs榸B @'&@n PrkQf͹55@-RqBx|*_MT.zU* 5Ð C<IUȭ[|:c<'yk/οBkKDH$yX\RnjUUdDe3ZH-=ommi(U\RBD%%wopH=]~[YvfxӲ1` _2a۽W[x H$\v͛7er-{qǫgn6ʵqFحP]o-kݺ]K|E"̽{wjn֭Dte{~M7bi޽NA{&r/Mevǿ=go֮yf;s;׮`ؓN9۩CukmuU\O6!֎76>!a[NVQzúuO<}a㬳gθl8"=u8xOeff͛}#HnCqn- _>!s/|R\%v4543YCC}D rkB*pfffD$`8T';ƒׯ߾cgVOKK4W+>k7nMD]eegQVv6T6]'`"%"==]k 0حPrr΃eiiiVVS=XYlÑJ p8we´yyBa^^s,/ z@Ys9tuǿj+"355U'] ՝8i2iѲ-[9g޺s]S~&0;y괳cDd۽1=,}<}z'J@_VbGDdffyakT"6e |*!!,nܼu {~ƸسiVDRnANGΞ@:GD^.Ç`_zog$ĽB"+.mޫ!YHg1~**+,RRR|c1LjhÀy )p>{G֬^ظIt #b(йLsw),=CWW'hJtx|>Һa-ͭu ؾcZϜݳH޹5~;\M4Y󯹯_ttma }g;۠cm|ȭ[%[KR#e8r-).zU* 5LP+8h xUF8o va5KKIBn ?~%oݴIOV=P0DRqM_ __37ׄԺ:r߾k׮ *ݹs#H̘1eukiithNV^3 '$$4nܘaO`effu7S7o0ŋ͛wUt.!!1l[X͚}wϘ[O{WrZT2 +pΝ;)^*\ ;vx9{ʛ֘;a|HaQ@ HNN^/AA˖3;XnAב#Οpb++/^YfxM&\S8z '6#"u##ϱcظX,:p[DԩCaC>j',-ǺWOAa㱿_\TXԦuQ#ԈH"9s굢b9GU.WwczQ)):::}[;wKH"̘5g2'T*kɰ_񝝝dO px,pϞ=X8x@GGϖ+,sAe+H${E={pa캈nؠiS׷";w}D"miStttyz;|HVVv^cǸGGH%ݺvʪ믿m OHL>|X>+ QgNGc%έ[i& ۴a#{{8uɩT,4yrGpzy%&&Z7h0c 6޳gϩ^^ɍ5Zjzϧ2.eP99I~Qm1c~(?f:yv/;GAog=~Ӭ544v}aC('O4GMM#1|K5ccd6o:V߾;sߗ[Q/\?=|akmmm;*aMy##'%%ZfMP٧ܺu;hiS:veϖ+,רaYl־(Y;w/ =|Ȇ_$?2cR8"bOxiS6V_qeݽ{wUD6h]T~Tj՚<۷oz_dT^=+ QF _xxP *Z}QQev޽[ؙrZ*.9~|rde 0}͞Y,ڍ>Ӧ D4eĺ !t}(]]"E/~iT/#CC"1llnziS&w#rss ǹU,зwW߯/Ν:}')..\0O/$">d3ǎ?phM4܇DTPFCSS?sܼy?\7V4qPGDNNbAkW}KRQ9eŠ+Ӄ}Q<|0ry\CC)S&+fAA;7jҙsm g95hg˭j==ݼ|G"/s&9\TUUERaadWgTjS;v8&FSSs߶lQQ nG>zC=V\v5;+؈}hjbB[>ö[F ˞}ykMMͼyzzo753Ĥb1=]6"gϟ˂7[ق:c͒(,Λ;;j}<=ƶiӺ kii5@`ߟfkQ#>6j߻׽k 9^FF ޯ~}}Y3T ]]1[yOb{ZYqEٳoAF UUU$O@?%5‚RRR>%Yx MWQQ)*.b/-[Xƺճd)arree[RUk 2kFaaC Ss}}6h`Ӝs !۶n,HDO=m`]_ ]Sob(ׁΎGgqIIzF;xwۗ{odޯݻm߹39%E,'&&n cwg_FFƛ=o/FJNIXɇlLDBDW5lbө #wٶmGVffVfmᲧ K,>slQG-.*JKM \BԦM׮ve[jJj~~mRaqq@]]UE%=-=$tSŭbAW\/[Lm+vꠄxqi)0\GAJ]Ѷmń &Lwo(ը.*7Pt|8>AeDԡ};Vлg.>84#3dWW$-ueII۫-]Kaaa+.>dc|ݺЬ,s3_>~ݴi ~wvv 5c>0UZ0zzz~ %!ǏicCGt:9޺G돻u{aCq@qq"_!C_=y;v\V(::_~yZh>k_ENAUS` T≈H,NvY?~*i|#6x@*3Go*D+I_1x18(WK[ IDATv\[k#Z:C/#3SMMPR\TWmoD8\AFFë8!uP-]}#\_5u\nM_ykkKD9󹵮yǏ}m+c""[_z\1S;# ۵k y0@ LS/] _mM-##CSc A }y˯8;;;lƙg?tp8]U} _5u5MMM@P#ZCLM_?eڴm۲---955e|H$9p#Gq9o/-FDbxڵ/ϟ6} rrಥϞ>542=} :"ԵHC PWWg0|Q\nέ͚7E_~8昉 mXɓ'1D4s}~1.!5!rА7o썌 ZFqaK{ꕙv-rkxhO߶dmiamiѣ['OZVgk":}oIh׍TV@T.b<>?---+3Ӽ^_V@[Dwp~͕݌h^l>--ʪ\:55U"KIIba-[Y뿤-|ZCWE0&&&4LM}UYa h#GT,wiYifw]4ʁ2-gZBT APYS',>u>9{>tTRDDDZOݺV$cƎ}Ex uӦL6e@Wc͛awLuӦ#nt:!D|!%?Q_~;#G21[@C 6tذv+W\xgou:x/͛;gwӑEݾ \};Em[mW=}'r"555--Wa{,E[ڪy֮ 7>^acq'trrBsi#CJCZzSBRi4Z-۶GEE={gggズKIqX]J<~T!$I$Kh!>1|=?mccӧgzu} fRqFB(ʜu͔TWWsRo֒jU^ iӪc_tY_ÆjQ\P7ggws-wBg }KY%Iry5-<ڇG*FR !O3;9:&&&U!SI }71q굅djKK?iכ7ić]ylkkgӮMt;K.?/[2YQϬ\Ej*NLJZ)jZAA))))7Yo @^&V͚aasЀ^ ~]| ?RGNou8'ֹ[ofggu16v8o222|\&%IInݺ;īxIrrr%qr#}Yv}};uas)S E:\zg)E޾8XN:IF-5[b۵$I۵ ~="<|ȑM5jؠ#RRRjլyӦm;a7nz ۶nݸaU+W ŋ۵iӸQ_|Ynf5v=pF1dIDx{v⥗^?}ꔱéSjҨQɓۼ} ‰'~ڰ̹sZ<1^t׮_رxc5kΞ9=-\Xnf9RNwwwwwڵk;zؾk &O4vAA|AݻwBڽM>=o6>mڴʕ+z励1xǎɓ'{{{;80ظ%(hԩDsBߗo=!Ɩn݂wة"!!]񁟿yRRR$I:yČ3CB̙sմ 4Z2>7m$66ַS'!$It|wxٺ IJJ:y_lcBHJJrqqqssQ"**S{{6mؾ]m۶;`'#Fmmm1`99:|p .T(:V ..$$[ü( {[[SZR cənk+W@R@OpZTZV )dB#3 [ť!L sBPf\ ٺ#8..ɿ-~\bYQmeiYHfYF=\]\8%+;l '::f5Wiii-l]DkScjOCW?s@qKޞ^dkjB+WA~˯?5~+ !v=`~B4Ww:z҂ vǩ̬,.;ilӘ%Iڽwo'OffdڠA=---aOKK7;~j!igkۥsO>[!\v=hظ8{{{.[o?5=%%u1.>~w:n˶ϞB4mo+ʼ;6m9}BMo]NwQȕ+_koB,ݳǐzm1CCoL𥣣c!?p#渱clllvcӹք<|zhX[[oظ9x箞a!rJuko/Bmي}{Jii;w1f뼍u\ ~ᅰJ_.izu};u!vw0sIHWy(&@eCj}{{|~߾..,--;!2*8c_RYC._1ӫ)ݳu;NקuwBCׄt ?h&ݹ;xBMPUpv yBo. !֫[Wq>={:;99;93N؍!,2 )n!-=)*JGDnٶ=**aFB.eqAUX.%K?yB$Id2YC&$$ ڷG ߹gϻwx:oKjqSVv[?vqw\=M&qJQ#Kt)5k͛oJeV_Ujmm]JGU0R111R%!DݻN9y&&<Q w]믬컉+W-&[V[ZZ&''^I޼O7'&&>hkkgӮMt;K..&mɲ山qz^! iW}}Bԩgz>>5mxRRl&Cךl JIIMIIݸ9!,bMoe`7mǥp>bֹ[ofggu16v8o2227|\&%IInݺK9!o֯%ɕ<<XHc= 6ש§v'[w ڶ}YB&v%M &NP(:k<eNi E  \};Em[*5*4WcI#=QBO?5Q!Wmݶ +ܦ L&Z (!n skuNSMsss3>V( II*WfΜ2qh̙0ibĉsD[@)E  \};Em[*.kIdı$}`R=::{~2VuR3<*t]rHw;{qʴmڶCAX->=y' cV6ujFZ4kbŊ;?B|ן]-l睏y"##s]3~ѣZn…eK?~G3^B,YfX?.YbΉ'~ڰ̹sZzBCCŒZgIŊ"# QQ%}hyoɵEY:xٳgSRR,^clݧoݺjo~'nݺM>=:::ٳf͚1#>>>>>~̙]t)|.~~_͚0{L)9էϢ .]dkk۸qo5O&><&&jj ٷw#F >o Bt tgkT~0haQ5\9nF1OoJeBek%[(*>fJb$+Jg [dkl l͇VhhZwxeuk} R,Yg/sy*P0w{v*v"c_ҿѣqqq]-l &ϛ3Gj7 f^3v̘ !D߾uK_+!!Aq6-_/d ׷hִVFEߪ^+/o֤q5o/!V4aB>4X㒢ژcg͘!5cg^-l Zj5k|ݚ5W\qԩM[~N;\!DmO:%8rJ:zԩ?ڶkWǏں⥐6mNN>=QB>[jeZZZM7Θ9a¤IBiB#`#OjӶl=뫯<= rHHSMsss3>ޱ}ʴiS(q͛3g¤IB'm@v;,4.:J/Rv.ڶS-T\+4WcI#Lei\߿ĉj0.$`0ۑQYYYocC_krSZ4?uܛWKK\,ۜ£Mkը~Uֲkը^ĕٹvD[xNFmz|BŚ >|bʕ5l6==eVB-[i۶wcQUjo-[.DvFh\ Zo P [{r(dkl 55PB$53YGIDATP| [dkdkl 5'$q(&dkl 55@(u(dkl r%I#[3 [dkekO@ [dkl l 5$5PL [dk@ [dkl l-ILPٚ) [ [dkl g1#PD5P\ [dk$5PL [dkdkl 55@(l 5@@9֒$ől 55of'[ [dkl ,.0;L(tT"<fFRF3݉QT0YwOP*+yzmd2s$Icx4Mصk7o2ZJR[Y(P*^E^P(,TRY*[*x3#̉$Ii|x5A2*K5Tla/_,e]fpT6dT +P(jשw^xZ+R>sULeK-%[\y[㿝hϤB{v>{v:0ݳSM{?{֌5q8klۧveOq{dk)Cq_)`@_}&Ϲ4!IҖ->ѴkC 2t*Wo2o~(/*Ç<nnTT?j<~0_PblMNN)+`TH7 in-di-ZZ.))9))y媵"R;;WZ.6.~wӽ[OG[P7*Lٜ_[\bUddtv&22zmZ2M^z]_gMU-V\r՚[4俭v{? +5!-Z4ۻS23wݻ={clJU֫WG u[AzVV^9A-\Tw5&>M8 c?[;j=}žƙ4K!L\&.풽%Ŕ$>(dkl 5|Hx !K $mr =^--AsV,JCIyG[]δ3az3}^%!tZVWn!hPZ(dkhVu9FscQɪilz-IBj*CWu:BzZ6uB2fDE4RH=2R\׵З#uQ*׵@й)4N쬌(uQ+O0YNq9zjUVNWV1H԰z"U!$?_?+0!UUroG{i,I ٸ5VfOlz 6=bkkngg|KdkJz źYQK2Hٚ,Lɒ }B  ߐ'ӕ ԩ{dk|HgϞ[f;+W0ƍ}e|=k>R+%v%>!Ν_v}TtKϞ=lYhWE, Թ|ʂf͚^j՜C_zmEcǎyŚ|Cxx>hxSSR7miF^>51uA[{ѸQC!DF {cLC9{v'~m0l޼O^5i"psܹnO!!!zW1^8|؇۶oOMMVG#GT-7o9z엌= ` [l;tHFFFӦ 2ʪW9g@^d(77nhI7n0>B{yiRnݺml?z+Vt`@c㡃 jmm~i#0!bM@>X ''T oSSSL#pܹLY' *jyֺuMLh'BI$Id3T%w<'Jի;{coϞ=WzuӈhP'O6q/PLOHϟܟ 2owy{O322?ȴ\uq{'+\]\&MbE׼;)|Jn]7ovܟf;!h˶93njM1ڵ2&[7o9s\FFfl\?hlʶR[X/Yf~L߶mzqq V^klС%ˢc4mDDԼX`JtQA*^Æ^ac\\Wk=CMJ쯿zu}T6lȦMA,rqv@v}8x_{قsʚ%;)72=Ȉz^V·PȽledk@KHn][:tȾ!E;YM;((IRZzZ|ĤغU=>'  BBFC]|y=LZ^Zn!{5VLfo`arvr.bieiccVeO I"[f!Ƚ2]9L(&Z*ǟ"2YQg _ L, Ʉ))tl 5A<=IA.I \Ec r=wdJ2 rIj 5\Kzk5P`-^gMPp(z5P z\ \2%^/4ps2 ry(N (c.+ٜK[T^ ,<, W{ gx\IENDB`kildclient-3.2.0/doc/C/images/Makefile.am0000644000175000017500000000024111744137121015005 00000000000000pkgdocdir = $(datadir)/doc/kildclient manualdir = $(pkgdocdir)/html manualimgdir = $(manualdir)/images manualimg_DATA = *.png EXTRA_DIST = $(manualimg_DATA) kildclient-3.2.0/doc/C/images/we_aliases.png0000644000175000017500000012656213215302470015606 00000000000000PNG  IHDR pHYsktIME $.+tEXtCommentCreated with GIMPW IDATxw|EǟN@" Ez/"EjBWikRB@ ҥ Ҥ@I ,\^%<)i;;瞙VPkt*//-3P(ri +LM9l#QvĵEgC9+P6fE9S@ّ3!YÊglʎ8$gތmkcH?!]љ:( %?5|QߧJ,U(۰f^ʓZ#/jQ/m^RKQ'ey %:Pl׋RJO37[V][RvrEײZܧeW$f9 Y᎝p? r[sSճ"c>i`񚧝q!;\ X; vPak"B\ٚ, -lm݇BEQ9$:/OO<Ҳr>r^#;;;??PVV!M.7o!V[#I5q+-q^c`H ,YX)a~#@3?fڗX%b,E֦ Htg2\$ud.[ږDH뢸#X;WFQVgee5@ Ԛ,Zm4]IN(RzeF}322ƌ8C؟PWR"L,.DGeD(DT<[@b2N5Y;?eח'C-&ˆ) ]f"_ڥ]?"xyNq@4`$O8=7VnFt:󬬈 F"QO?~T*];b5SS'nj,3sy؟PYh'r hVn(f DfGUա1 a h5b3K(tLfhldjʜ (0gm&P[HYgʱOE@E.gzZ㭄%UYH,մNF|VvmRjE.{@gg>e0e\j(S4gvvS>0P&$wGGEX rY, BDͦ"(5݈_'#gGRK?pA$xX{X8yKB{!q,zX#/+j:b*!KR F,t"!mfhCCDU旤85!kn5!n%vV]fF`0DV$ZFkF.((|zrJ2tyUϨRA~`\Y?"""z^軧O;̝S|y<1飦/N(J=MB > Jڗyqَ:z ls@X6oe+hsœXhf1DYm` 29P54M,7D0?Qa[5:*ea'5X[[=:vyGqDeQRvv\PiJOvvv闶Z1dfd k)AAÆ mxoJv4xamOHQԢ 6N$XӺ} hqegǤ%ŗ38K SC+WԳOJ-Jع\:6(!P23Y[`ͬ`i0Z٘-ҚE813Ts\1X j x hy0mohٟ&)}{uG-E 6p\ Al8񕠄`0fd rZMrrR~~V?yO'ju~^hhhFF`̄Ѷm)?װ#zhk֬޼i˗_}%X%NNLLu߹sGPݳkRCyC$'' iݪʕ+M"Tvh9r$<UVA&LX]ŚCՄT!\,o,"kQ/f#AD?кmFCVVRTuZm||tZ`֬Y ,iC呕m43i'=k.۷w/ȟS+$8h'O6t趭6mRbE*q;w<<<̛7n:޺,`4e=" 渼l鲨3j6r׫޽F_ucǎVT ,^[oq .]Ԕ*IҞ_~uyV<c]Nn6uׂKʺ 6)9pm&D*!b:@D6ʂaxelŠ,li&RxmfֶΔAV|¹ ℄ <}Zـym7W07pxvG!A ZkAIbjZVN2%@=eʔܜ9qq<=gVh5Z`0t:LNv2..ŋrK?_0WffJ)oסõkכ5kVzz`GK]_&~%8thծ]%swnVR}),iEމ)x"ClG.k2PCA3YQC/zFaP&.މsehٌUh d~[ eu,(!/s1F^lBu֗V<@#u.JC@`AsAh$L4"eQb1r"vo6#C@sd$YĈR@O4jNtFM}s@Jlٶ-7'KdVKmXe&O_a7n߼Yk'3 ۻ~5/N߷__8DPpR=?3{~;.ӹ;G5^70 h@nNw~~y'C`4֭Wo࣏zGk֪LQ99yy9fOQ0u{Q씢')kvf259Af⸖m| dc6}1=,b]e}nkqY6rYZ)˕W/ra^f'%P3wj$lln#![0ʚ-!, [ ;@1cמՋ2iB>M="0N%-'mDii;3QZ XKekKTzxy$uzVim듞V~,=;9//RI26h$GUZyqwoĩ{mڲ544dm=w)=?J>!=JOOS6gxXXA2Z|F*KtFonݺ5??G}}}_]{Ν{ޣ={^^>԰a#:-[曦$r^KH` D*-A1˺8V֙^ X]v% ;pp)tj Ǻ#<q9Qo! z~X?7 *kZǶ&\" tBo#n% ;!GeyO<ʵDY`M8H&\r]!W^23<33с2ꕫ2L0nܽP>{W3qyl޺Ku5Nyϕ*V>/֬uԩm ISǏ(*ϏM>tȘqcn])*>?h DQ\.oѢ9|rZj_v[n7n3v}KG'$Dtd>&KqEby܄M dl|v 7٬b9[ j[7[2  YyBgu<9HX͛goV8\mFjVDp^3yC\^6y&r"rv&\w8k\.,S<՟338u,5%.zz)#3QZKjLz^:vT*jI5zƘ8/ODžΙBmǾ)vmҤʄ~B`QªM(R]?Q2_)Lp&Q*Ue?22l OhqBQ&0Xh22z M5),gOB/7%*6XH8J xڞ嫝ItjnXp(ۤ?}g*UQk<<=RSR=|Xt^(_^T:;79/YeLK{IϏ[7]p jd۵^ad9X%d[>aͱF Xo\i:Nl?,fI\%h$B6v^A Njs*?JTVMJ~c( ϯfe˕)SZP :/*?//)'$++ߟF;{ej5wjծ %JqA6lp+b,`1 mY%bK+QOjܓ\+S";`ZLAjpR5WՌFt:]^^Z] RC2)AlBc¶Em  @6y8A؁DrWD\)P&GԆEw OmZsK"j@s5$fk6ʕ5%{"""g@*vc\~#_%:` bpYI5 m4bE wmkҲܗƬ$"ayP61)fL$\h4'NDj!hj 8sqjk˥x9f\/cOE:Cذ#˽YB]!p~3r&ֈ =o(  !ȵ-@L&!Ģ8LXPMb{|tS]Aq٠}h""L ΍tʝ( ?cch҃XV۬GPVF5yѬ (ܬxE(1Lc{XR|XT0Z$L!vTVʞv"5n.udANj@'T1# xaT'E,,D(c0BJ%fWXE9YG`ә8,j, ʺU\؝GG`91N:Cb֗K!Rrz^'qDM 1%ds_o98#(p'i)m_V$$G" 5F(TS6M89B6k)1ee7fs ?o6dʪ\3gU&X8j!b]^YSK7vo bc-b &Vj!<2 I߰Tp%ωLlN3Nĥ% v-m yAhg 醻DIK̖[5viJ܆SjHըfk(w!lK!lf bzesj汈&Jl8M[>9'%]}'-Xi2rӬkm""fwE,߀Đ4a鉠_ L~Ґ7b[lStJ&6{A7]bfƾr `e "&m fl`̇ œX#*psw< ڞ]X8f͘s&~)8@aO90O݁^9lz$u)VFоZBvNccDJkD8Rֱ`i1^$?d㾉6Q5XCrWfzElp9Xca\$]iطmcR"e#f˞g)Ά|qz+blܻ,>uv/_`ڋ3rr%"nmP,1Kh.*˿7ҦvJ2D۰۽T^4FF![PR/L` (bflE8%)vXj϶l8MgZՃE 1 ³1{ڻZWKBaK#sاI&jZJk:yjj5 eH[K AE;8fH6cW3C1ؼ{Fʺ`l>xQqQf)1r=sz\+ ڃ:9 9"iom"eA+71.n<5WD_hpӨbqQŝ%8H]+nml`F1,^Vɉu|O0W8 \ n~(ޘ lH ֥0싃j'܇벐0<1\;< HZ܉01٫!R/-JdKwr_! eU j3t6ahU'j3ɜ^OqOgH ,/@,Tv[Iemkm(h z^QJuQaL2zbxߑgRW,cſk53E{3H[&; F`-9؝H"߳@pcWeOt%bLH nO! njFFlB<֗ErU,1zP೹I.`0_JFm"'.c6ъl=bMN)3 /Fn˗My~bp#кv{-cJ-'%Mv}(25y(cF_jJ [a(S4U,G&E.9 VHЖH*| }Gbيdc6 jV|%g0r;v7L-ޜ8X pp8Nt&%ɋq -i"\fUihF8Z'=|d*(f Z|/\.6l.?ȳhw`r{66NB:l-rAEaciK-ll`esAmH4'7%J%A`e #%d.f-U"@QH0 hF=;dG83ی*QhqfN j'ܬ[8߂(8%~]J$P㞦G:S{"? / ۰Q#5Q4[n_׮͟tk8hp6m %yf[<%eYLfdcʥ)A~NrX槰&o//P-VQ4Zք)'aFL*HL^Y#g~cM˲:59sJfsgn޶?E :uj/_8a`sG3dp>}ϝp͍CNFcIJ1 r<B ZgbMJ!B/^,Q1ߢ$1NII=wmEׂO٦"DqP/B,\0}viZ&6Ǐ[4k (Lii///Z-lr/_;gW@.%G90GA kYB$#.`Eh9Nl"?)i3,)ѐ#_mQ(+GNvv֭c޼}[?y{qݺkצ2T]v ̙3g:kiii!!!\f͚:s̆ t:t4k׶e߿…k\x ʁ)))7o bƕjSz1dbb z5{fW_-\h4 BQbC 4hٲetɻ3;v[vtTmLGWۍٰu:#6͆ h`СϞ=jϞ=#&o:~8!$::#'::r TF|||Zݚ5kM6{UTJEwV\__Ǐt4P(ԫnhwM߰a?:4??_dV[ߌ1_}5$6?lܴҥK?~}מ=ފF#F|ګo~BCC.XP߿mv[l#;wnݺx]/sS1si„ UT3fLǎMnӴڴijժN:?^z'~Mw'$%%ݧgϞ{޽ BP(NKM!BVx}{ކFϥ_IϞÆ>bkrSZ_o0? hޢExxyVV n߾;dcǀK;77m֧NNLLݫc Ŵ)Sfvb@Fv#_~:K@ BP(adаvwÆ5k޼#_XIKKg.[<~ٲKL4>#""/*THMMez_rNRnCmܹsFSxQ( BD޹Ǐ9|x~FLVa¿*ްڿ__O9uԄ 8sOLL։TG:l%K|}}sss|mfϜYl xzzFP( B9[[{xx_˯2k. GHHXjUС_}^2=fNMMMMM=}T^^^III'N4׫WOT.ZcNxQ( BP. /\y%UeʔiبO6TQYfbcV`BSxܱNo۶퐘F9s͙3rĈ?|PgL[oeM8BP(J^e4 =ygg-7'&&;/$2%AP( \. SYv~+BP( rJ&[WdLBP( B5[9xaeCBP( rd( BP(C&@2L)P( Bٯp*m* q[@D&W(*'%}v/ۊ"$ B()xzBP(J!^[RxJ8Bq稒,wƠP(AeBP( @, $KtvYr/%W}Yhel  BP¨K BFĈBP((.݁8@"c#P( BLlM>͛6 !>P̐=wٿ 77:Sn~3::ٳ#*دٳg6ϲ%K߿w8y)ŋoݺ}˖,T3>nXɼ<ʏ1U޽ǴiRRR_OKj?{l޼ܳ]_~՟<0)"77yH[R\uھ*Tx_ (]n}&o7fS'OZ'W|C^bMϝ;=~= Ξn*&];wL>=,,,<<|ڌȻw:}zxx8{NIeu!U/?/\G|O:\,֠U""*̟?-Y=ow٧O_~ũ7"Lrۛ)))*TWT955<~/_ʶW#oٲUV5j}E?~v`04hPQ$۶m߱c`uVbO_>ed///[NݺuLcټYY:pFYdLwތ3׮]CQݱ|)J b-IcGf(f0e\S2 <<=רu%dDT]Y?hFQyؘݺ^r`0Hgʕׯ[W^RJթSǵkEV<,,ѣCCCM< ,.\{۷okԨKYfu~ƍ6vSgٲe lm]/;o7h0ׯ_Oo޼' K.9}5kV{z[1_x!66&00 9q ,#G 5r<##!!!Gx=qz~̘1]t; Y֊9IǏ K@*s1l8вeKw$IcGf(fW^(pObټ gΘ;dHHhC1*:z)>sf͊v؈ӧMmټB4xOG=}6Ю}a#F_V]V>tnJ=T~֭kܹsfYLfF `,̓:p B(322L ˆnooݸ#P:t6m6o2pSrzBi]M֗e'O#d$B9BGnzzz8\`ԩ7mڰa_̐!5x]:aϟo۶mnBOk:fY+a͍7c7o*zivڬl …G)$qGҝMc*3o/jxx qfP+L65_do~䬹U\^V-8Tsfy>!1/Ǵ3g7 rI'ut(%%B k@pHȜٳCCC၁ɬԪK.111;tSO~q}$b7+Ɵx bw}79Bz-___wfIcۻMҹRo/,VJW{Jjgjjwo~(aŊ􌌄+Zخ]oѣGzs^A56%\`]b~~C?xT>tڵb/zĴUTGqಖZreFFFFFƊ+L-[ϝjѢŲ܄.Aܹ=d2-SS\rEfegoڼ922juJJ",k=pŕ<***~ QQx-C-[G߷:u 3g/WOtxϞ/OXAQЭ[׋/2ڭvI_=D"[$vG_nƟ %%?A+__=ȺwQ3FV']IgHKK1nݏ۵]n͛7ԩ3vWtÇ}[n GY֊1z\eq%ǫV6|8{={~,kȰ>Gׯ~ uy|gz5n/? g5/9 rRBKm,'5e|~طk*\zi <.p"CpqIYrejEP(Iߟ6}ƺbSP(QFχ{ 8ldrs IDATyph8P(TWŠϞ=KKK[bo7APx{)* PreBP(BCC 4iܧO;( o/\NAi HfjⳒbi 2^S]QN:u B%ߗBP( *Q"(Pea5BP( %IZʣ ddkr4F BP({ds_ MGռE PB7Zvy6mێ;VxP=2r_]&55ƭ[gϜ7w ޣ ߷woʕaaa0yؘ[D4i P(RS322ʖ-;{vni6uy9 +nOߪpԑu f%J̈0]b'tv>Mdk#c[9x5m/4"+---""^bT˖5}_|yeK,4i|=ϝh4m΁T.Liyj:s?# (sn^:+oh$Yf-&:{#ۄ 1;8P_dƞ e[]Sv1CsNݺN!!!ժUG`ޛ_eSNM03g;eb$L^ԧvٜTh999j٪eJYwJ+ТL?~`YC}OOsFѭ9 Ǖ_o`xws~7 ݹvVu0q_.-~ܹЮ}3gSg͚ծ];FB=:vЊ+ `0ˢ FBwVգFv!ߐjHɰ#[\8q`BŽ2!0!aG”-z|znEPx*{ncf}e[Qsdk![ᓎl]iw[߭W3lHLw\\*P#ÛW꓁ͻ33:o:l־{8U:UJGﱳ>OS}gȟ'C,LxNγUL<5osh|>+8Pb] p o]F9qq.9bDٲecbcM=޼;@6m 7r5k6,66))jժ .nflm4g>HY3g^zBŊ:v[9Mͺkֽ}u?(l\vӟ_xȚY_+;+k,\ZTb qFGp`MHJ¯W79e.f:g;qmn y{\?5ܷnYG ~+zM._aFBqOꃨ&O4y2#ܴ)`Zm۵kaF=Z O#!?giԢo&7iTy2d$<)BQ<: bFVJ +v]&^Yu( nҚ}С-[X i޽?IT'$u: `$`$HSKmre+}};7򓓻7DZaI"G%.n~M}rN6u[-gyz鐧H(^e-BL\vk2+?s=?' d2u4|P԰BI`kˍ]98De /\*m=r~޽K, -\f̨^V~a0h$1b5H{0zBڍ`କm%}DLs2q]zӟÿݴ^>>u'bySR:+Cʣ@ٙOO(53FlXK<}|y:5N8WjXij";1q=Qne$@ 7b v:[>jԨ't!1Z5@?״;߾?ݱxzJO6#B%:l>3zf=_ ۱tce3Dc-u W_{UQ>?[|JNzx'BU:P.Pz=h =Q>?/hC{)U#%8hp;G'@pXEP295ek! /FI<f j @yQ $ JbB*l `p)[xQ$Ba 2ʞ^>rï rsE (WY勦PT  իeBdKͪJ$>~[H:F&;WTrySqERzx{x2VEJK+ ի)1jtRy.7 yiY-++~cb5o.v+Mʐ?C`XJG %{|/7n_Yf̓G*lz$'ee=* BP(]z@^A>_AA*ƍ׮["{b_v5޶uժӤ͛Yk<ש=e$NS.~hf"JH$.P( BG`k7Cufi7M1C g+,,|8h\=rİ#\o;.kOС޻ww%<:w}}BP(ԫnEw״Y'M vQqc[4m*B^\og3u02mӦOg*h!ZVrST*eɣP8"P(V-E ޾sWKPP9qe/1l?[ǿ|9]r XzgDEG[ǩP"bŊ)))-W{H+ ?++KRapD@pXlѢZFE7Gx3b~~~999fQPPO>5׮SgUǏ\G##_lrFt:ݳgGDd?Ϲ4B  yXLiRymlmP8Pn+{V}2E凃][&N֭Z6oVbšÇř __~m붌t__̌ - <:xѣ~orÇٓ~[طo6#8"P(V(_ܭZM5kڬu d3ihy}cVz]{;};tȐXF8Wah4#QF]z2d|шMcƊ+2k֬9k^cmS _v͚naGB۰B 2lT lb4Κ9k*Vб# Է_?X@xxmhwnޱk׎]n޼|9|߿c׮N2033fZPR ` 3"'kϞ}߿woEB6;vLwOްqϿSL.pՁn;Q9P)=F1\7 ǎ_'n;q䰰ɓ'⇦{L<9447Oҥk ;GK % zҤ=wӁ۶n:mZK?æӧO/W_vͺ,nUM4)$${=[U هjٲ޽?IT'$_n*BEDʹBŊTp$SN=|O>ٴq,Z(fD% LIIIm[g2O7 xyyj벸 Wx^,v+{M~W.[\.Ǧ+vBm#K8"P(V(Eʌ(Tɺ>tze_E ^>E?99?zFX(oG(V\=E/??j^x hKTXJe???l4(+BkTɔL& /' }P8"pDP8P`kT>cƊ+2k֬9k^njfj^߮} _T*>MY=2{"[EBBH(֧Oްqc2e֬^=eʔ[={ޝ|?ddDJR["TjKjK-ڢB^-ZKKm&dT/Hb"I|u99ΜtoEG(lJ&UWVU.\JH )4F!w RVu:ݠcjk8y^oOazJ!>}T`[4|es_SfZʆN͵*AAAA!;9!%.cZZZHHF77N'Ⱦp֙/Ѩ̜>`0 ӧTC>]4'''==}ɶgΜÐ[=htTT^}51>>~]4oBm۶u~eȐg~ZY*pNmM[˃r}'@H!gM>iҾa})Sz^;ֿϜʐW9z;%K|Ir{F)`0QlAAʶCժUKtE q5J|2taz}j 4BRS뇄!RS߿v{twwlE}SdTS333333Nekg0 ô l@wwGF/El7!ĈQBBBzvֳ[ 9R6b(??Ν:v{KDZ;;B5 'è._8 lKv]ZQNl:?D'g ܲ>*}n%?ߺe==:Q5jÇm,N:EA7s]{̞mZݻw ?ih;[jݪw1 ͛5k;oxѢ۶=x!ّÇh>|ذ˗/{j?L߾Ntyyc[a:vkjaׯ_/hfȨ^njˬRfO:eN^pԩIIkN8hB[ kט1cƎs;w1boG|ݹ{^3{v)@{Ylۮݔ)SFPjU}}۶Kgm>>>>>>7ޱ}{"yƉ'+w]4'''==}ɶx{{9sc=O;·w='SeddL8@ZJ)K[n}dz;zm׆':Ott ^:·7cƌٳf?Ћ7oѢ̔Dx|FZẈY[/?7ѫ̌Rd}E?h>ucOT(yIǮ.Z4ب5@m  `cWfR%[tض*;;3 @PRjOU^ n:;gtapBcBX u`E @Rwҡb<|P1Ӆ Ǝռixgm780X';9!cGレ[㿍{XH/h;ߟF[f-WWGZ\ٍlm6ߟ=і<x'+K/nբyݠ@o:80`„f?$lʤI&l_߭[lR?:*ĉJhE/Zd\l0j!t<֤ɬrK _zϾ233m?Ϧ=lm~fGYꔴwڕf#Gw0qxqܹӿٶ}֭] )o[;\b¢E&پO5i qީSהqqzLv;}̀@WѣJILz~JT>1k 6f?*GI\k֬5}3f^^0r5_ !233o; lԩS'++VZʆNU C`P-;t G{Om[?~uOvyS:u46wT}5ϯsݞѼVu*k@'è YRS-VsdEG:ܧn)tS*G:Dp`@]cbW(Ez8vM|wr>zѕF*G|\ ΥOd7T8ݻMΝ;ƛN) @)n O3(&  A *\tڝY"%@ 6YfђʂVoͱWrfdT[!X PRRIJV ٜB?lطBlTP7jЀ( `cǭxܛ ]z͚M4) ;[QB* .LXW4iRv(?;[K!yv2;nnn999:N}ႭvBٿ R]vM0B'K!:߱*Һáaa.]>yd[{=gΘq,Ωcnj9}lBU*`k@a*5wH/߶m[[kCv֭WddfʹZ{OzԩCsPz(.` ;ޠa5kllO?mo[x˞m?vѣ{BVy"̘>=…sfΜOB|ҵ6Էӻdnje.ǯ{pPlWk_zŗ^~Pδމk8< lfRvzj]\nµ՟uXQTRH1 !,]R2o ?A(>jP*][~1|F+noLIK!=R*]rsa`]y>T`#([,]UuEm8 7 _0VujPX]~woO6 ߺUU+WRGY\Դ=Ͷ훶n~wlta3MϞ]nj9|ȣǎjC؟3Dkqqz &Ozةwl_ޙ5q-[6Vk0.fgk,.Y7l:!Ik lݧh0:wl?DB)jUΝիW߾CA]ޓUD.JUz}Zjj!Djwl|Ŋ֤'KH)۱qc:L%*5#zM3 aZ\7<}d߆ZnG vI,? RVԓ`G׹SnOvh\>`ǟoLGa9[BX߲NraZ,RZ3kKQ-iZuJ7?=~DZsWHl2'-|J!yk)PV 3cmiN}hUO/ =g[]~36'vFsϋ޵}cҸgczCkHC'iYqdol.7U\Öu-D+ۏtaڇ>Y`N=qtdzO~B6+,MyTwƏB\4PZUju:[8@E֝v+=fz9O{~ݿvFsbvUB9XƧ񣻼0|U!wmW]Vv":;s6K*(vǣR[669?'m'ڶQcXeW=;ܪ9m퟽3:)dRTJ=vFiј~i7)V)Tdk @A5.I|6}=u+WȨ^qSffffffMF^6ԩfYV7y"7{λ3g6n٧>Ҳ}k5x>m[?_}Gҳ[ݺ5lpȑJ{. sfp|#g06չ?R?ao55=ENnmrZ;O(ng?95#;s{9Jp`j2}Ϳģ@ ؏yk5_JHIkQTl޷B1d䩬rsU:0F(m9x eJ#K5PJn¿_  7[;w5hp{S5hp)ʢc-jѾmۃ*VkBBBGD=~|NN˗-kצ  !~ط/:*ۯYj@ utv3f1cΟ?c#F̜1Cg˗ؿ+on2~Xvo'O !xWС/z1QQ999#GRO wr^;Oz3gΘL'N=ncnj9}lBU,7JJ>thzzzpݺ ֝:u>thFFFgϙC9$:[߲m^|_,z{ޣERf5HZʊsaF5CRuB4Z]]3ʙJ )4F! [d'80ΛoDdC2S##cƢm=ҲyħK !߻{'oݪ媕+yNi]B?[}(-`0\׬YJN{O}l)iDme`0չUtb',^tܹs?xzSw@)Bfz}j 4B.HjsOkJKX&,Y"nǎ7ƍ=x0R !+#7ujffffff)QnB&~6qժ>RZF vI,PY,+F֭gn 6>rd ^uΛsC{9g}8o>u:úd-nnnbҡvkժmwvȨQ(E5@@ƅlRuB,fhSYؿbuF93Ja2-f*F'N[ykڶ\l !ܟ.:qğٺQj$Z5zԨGjUI3PFn"aso߿{wޭ̞mˁ֬]ɓSDMڰ!yӦE<ϖ/?+Vl߾d6C_uП/gj ).;'&&*?NLܥGZtwwZ꘱cmˤIj׮}~?qd^ߞ4iqub؀j^^o7(ZpE??3fPCO{OwM8hЀ^8p+◣Gg͚uر\Bh4}n[ p322w*RZV' &,X^իO4mvn"[tԩy&)ehXX:ucF6|===]""_*EOKK Q6z-w]l- v0aQBqcbb>]ӥKcbb99:.##cĉwCgNn0 {FFr~??Ϝ9c2N81fh}1O6BuAiL및,iS777eCi1c3FYvA11Ӡ SDV>e2wkr/R\ٺSNÇȨ_9sJ;{j~I~.Y]ovf{@`"#Ouͮ?UI~wi)t•%695#RFԩ 9P @@Fuqպz{I!̱mRɊRJFh+[m作c3[.RAXdUK ٺlktSTZWjJ1]2-JN@jJ+K'pTZ/K[+a d{{7?9?6^/-SKFnuG(|g҄/_Z F}.vR kF.2TٟPcwCG?c- BMmHxG5-h4*}?º !,Gܦᡟ-6}g׈!]ڶZ<Pe3 ._8aʛ?~.S,wU6ڰo'̗B9&8r&ș4^vB,]KHܲs_VVfѝmi¸QcV}uCfpj*u۰vAUU{c;h.f_:= )Z?VjeLNZ[`C=ltj|l: Yޥn:vvpђO>hއժWkrc:PB5WٺgtS W §AU_ժOOM@R[JR{a~))! {ama',Ro_' ):#(5'7~RoiS22{'QJ{u9}n?%--ʕ+v ?slBTjδ1>\7uq?Y7ݟ^A×Pӽ>Դѝm:t#ce:FkXWl-VfQ aa4$[[fђʂ)B3m]qfV[!88(ly@)[ıu x [Y' :*o.3:Q5jÇwTl].{~:[dmѺU%K!~;vFޗR>ޱ~K9{v-""6JF ZC=ӷ禎'v2;k׼YO.UVkBBBGD=~|NNNaplm4ٺ52**W[F}…)g&oڴ6)i]B￿Zj?~G|ݹ{^3{m{Ylۮݔ)SO>~޾cGVV|Ŋ۷~X4[o߶-44ǧq;oW7n0qd^3ydSO%&&*ۉV=SBɏl^j1cٽ۶8N7(&د*IM2%(('*TzkoK]- lܵyBݻwҺuOv*0 J{P:F̹|r=yGѣf:v_W!4XV-eC*YYYdddtU!Zj> dk%@&;;{=v|}8Edgg׬YSק!RSSVV}֮BtСZjB1G>|׮]kQCM o]l- |@9!7FFE8uvurGϞ3O7 a;ҧoիWYSO)-sr<==u:]FFxwiii]2ctOz3gΘL'N=Zi/azZ)8(PYqpBT ޛ0[3p@&d\hpBn1И]Ԟ3Yȴ' ] $0&pB.ZVEm8AFgs&_Ȫ5'3$(#WٙWf !Z=fյ^FU< 't5Zڀ=ASdatUk%7tFio7qL^^cdLP4bUCCrs}*4ZaG>lX4 L5_ ՟f/y9_ Nl4XA.y4*ڈ"H)z-so׭UR VeGa\6*]-bҹ?htY%W^5|Z^Z+oTuժU= l g@J!*Sl>0J(ح{d ?`v͛6I7 Hg;ה_/5;ިYe׮m-HL\Gj%^gGu{֨QCիφk-y"KA?Y<}fckWZye˵kլ1QZM>˯j=p`8(֣Gip%97lEgt<3O+۩/Xûz 1|sҾs ]{p]v?z[T7*)OT`8ɰ={ժUDk־bS>ˆQcRJ)JZ?ɒׯ_?yQ#^62''ԩS#eVUmd2:Ԯ]K׮}%eҥKv!D5[W2ƘfY]- [9柤`]ǾV';Zj֬9yڵjټeknڼ%_T}\?2jPkgddo*IC筲VZu)?k.Z@SpZmߧzr.dz}FFڤcFBz}dv]-(OqB=~jy7d.O5>CM-IXjm_>-d배7zl~eTdOw_zk$!DD,pQ=&Nĕ6*RfѮm=]-(]S=aXxǚƞ"@'\U[ef"=G&vd[3MBK{kڸ4Ӡg @o&sJjʓzK;l~/3jz[7'h6" h4Z>[Áht,vsuaL.5Gu/7apFI*BvSoH+|.\RiT*jj)0kv ՗1y<g 7M ՗]l:jC=UqNnjwZMm(S[ñZ깫~<;C}N@p-L?Oqj/fS&լ5k9[{Ur͛~je6J!g߻oFU'vڠZ? ,2G"u=4fKɌcj]q8!KBzh9|} yk ZųV>:;FYfkxj,a^joK놿Y ⪪P,RUrqq흗ǀ8!7w*Ut:; l ⢒Uԁ:WqJZШBxteŜju!_U6(r+AҨUF@qU*]1@JI a6MfC\.ZjeYet8 ٬quװGvFYѨj P6PAX,V:44,7׮2 NHvEHj Ja,]9_ s29V\GWݫJ6@m@iNb^zǵW gf5UuժU= jJ0p"*VUHOvuNA+Ϙ+Rh g/jJ0pO}[[Z6oXPttm8'\Jh4^^C?tz jҼoPUQ7V⑭AgN^oSVڿN^o`u JN^o6[.\8wo{;!!Kܩ g{`МipOR:s4͋|gF+֭gdtƤB={ !7&Qh4j#jI'(W]~eG򲻻{^`kPL+ip!ѣ$%2eR^LJ`Zڶmr e1ɴ|Bm؀/($/ \aŋC8I;7_W :eŋ|ْ5j6zFF}կ֮?֭;b:u!dk0PIc5ΝB>jݰ~mT>֯Nz;TXd/4p@(b?FE|.^zambOx}?xbWO !|8/q~=/z5j!=@ |5 ?r䨯h8إ;rYʽ:4jռ6lظ a3CJ0#Ǩ^}~!Ν&N_ûbpن j<=,^;AMҠ@1F&V/`Lo61Q$z4yR&i&MzN=IDͩe9L%6gf7?^~lmȑwV,a !fNfLooAnFwzзoI4 &:Jkgi=f\J{!!5cUI־ihz|Lkxx'̖:?H=jdnn޸qcssFjg͛7.:~g. `ھ76+][_Bn4mHE吐mKYyO!TUUUUfwдM!Cڵ{O]]U+=gp\|E[rk=g"""iogKmN>tq%ׯ_?wܒE =, IDATm`0\.ںUJ`12"gϞBi $Bp!76oG~۴-6mUr~㞭,7Z9Mr[Ə7.m%#"Ş_ǁӟ_3[@^zA} fSB>g5Oc ~h !gfCCCbcc ?h8?F{!S'hA2)uWd!rI^O/[@Z2c@DEQOܹkOrR/HgϜ*+-Q{m;z&$7Rř^{r744^(3vŢE{ zrWSޓEJhWbNG0n.nO+ 2]' h2KN QnEn}S2G"˲lzР,MFۇ rV&5d%&R}~um  @!=v[tl2 7@nD$%`Z H 6L&r>H QJm.Y^ a6F#_ r 9!7 r:%1|],IB# 7@n@4BP[]@jk5ZF!@քjkU>Ho.K`!+\vZ<+ϩA,Ĺk.[C z@߿X=KPPP$bTrrNί}xXU ίIU'-[BXk !PUtjkxR[zBp#UƆƆF<ޠ7%rhF]PP[o3Z4\z7 -֪V$91}Y[u'cۭHjm ZU]?%Ynl6U'O,$܊R]]b6T}cWFj 5MRUv+f݊RSUHBm nn[ɩPߖyϺx86Yfs}CԖ/\(ZsSR}N$/xV EEvmԴQ#Gtױyjko%/VPPa,]x@SNoذi͚g|aæe˞]n7 oشx񂔔ʫ{sF/5@(i9hbРNMۻO-{sc~">>^QǦ=zB(%\Xc|[INNZ0b!&N^>}Yha^B۝{q:iiO4Q+sryNsȐ}h4~ |9sw9г:xgjB?9zeB}-=A?q zq1_پ֬sk}z/}e7f5|no7766޽so! m(~^j񬆆Z^- !6o͢ vO_t> Hz~6nXFcӦ}tc7of :Ӷ{s2CfϚm˞lv:g>9~i6[ddVep87H]OgbL<);g_^Gμ'BbG 歁$w1Av B]jOY}oh`MQRRVYa 6ݻ\侅Z}gŠmM$դrIWZTR\F@,0ěV}ᬟ0˜^`%Pbb1ff$*RBeg;ޙ,|]$ d.alֶTn&H$a]wyl6kbVF+..jf v pl4r=.{'G_̙;/#3# O@+ xJ"lI3'$V%D'%8t6l =kٚ^yO^Q׊ƐF먧ʪ\r;%X>!LCτ/Ү!xVy' p#hms19"1F.d0 EAX.#0yyuJe Fdd-d2V4yO\`v"aZNr\ ݪS(RW@c2#8a'a U'QlF cd4A{[kj DtAmuF)C5̕ՠXmVo,0VM4FbMR*E@*mT7H-blj\PՔju^#Qf^ӪCBB M&`!qtʀo /ĩ>sgNuݻ?C*qj댌 ; #6Lz(X2$+++fjLWmܸђYPgtOڵkfBꫤA}옱f׿_ɵ7j^={Qb=;;ؤ.¯EێC^xT'[t s6vD`W^!)D6 e~])٬CWS9ܬJX=MwԘ.9VWanF1bT5H\o,j֢^ұF4mͦRh zϛ./7:fɒ%+W2:ͽl6 bϝ=tҏ[vݱG@Bڮ{ӦݳwWbbÆ ĩ蠟OY}`G\a/v ST}7o.+-z2~[Tc2/7<,44Ó'NlݪU-MFB͛J 7n?3ǠV1GkX6xMT>} ,iEމ p -Qle%e$PbY:G6QF",Sl MFSW,aB0>DXO_ V[|!h!{?H`$ lPh$X"e0ogrJvomG#Qq7dJĀ-| `uvzk옉&֩㛸woYiANg `u!2fMǎݬi[?~Lg !aǷm1o+o6AUaڥ7Ǽ> [t./ @_fLf3B@K.}U3m۵;~< #4zJIi٪G2AxyyRd4PƼg8(EORDkׄ#5]Ss j2!kI>kMP@fL$hѦ'"+Qm>"[F}+=SW/ra^f'ZPwjlQ2c-1T"1[)vq_;fڳz@!"M'b^/Ei yVA-'mDii;3QZ*AXW1 3;Jm4zѠ7ǎټeKQa~IqBM閕P*P!1ӧ;k9s?{'GJ3q#d GW'߇DE;Y&_:hնsR+ݩS={ݻw3cU*UVV3uTGURR!a*b.ZFb*0qqc]g <q9Qo{`sfsVa]%ӛ 34r#P`rxq{(qV99F ,[{ g,{`g k(aAXd2_VȕWtᓂG'ydL.֟2LShܽs? qjwv'/A{F  諿^Eie --A?{6&v:5A>>Uճ C|4k>Btc 'MM@DhB. BO>riӦdG͙}y3OHX^cщ7}\,˓8Q̭1w:,4M߰]|-٬bu|nX0@)oQҙN78VYcj%5Dp^3]U,_#FUsymlȁ"~.FÁv)ryǵ7=՟_<&';׽T^r\VF v 2D?|p_?iF%X%B.ͥs~ۯW,! '3S}Ѯ]l#$#ZYIBTԩS hN]_:ue2͙Dt 8ldd=" @^+(3-59;,X3Kmól&FJb 1ao^ֱ{q,"DՎK\H%80K$KH/r;/Rds!HX-sdRzȆwa4Z;IU*a]Ǐ2㦷W֭ :Ѡ7M2Mv-V׮]z&g:,l6wzkN6\v;/@➽^xaJeմZ| 8(y-,fEՎWl_9+q b\ļ{*Aj K_B MFaqӂz_R($gjgjtj$\mJb;❱ ؆`̼svQaaFBBBtZ{NvkּyDxRtv!..R[˘WRR2v~Ͽp3n~:ul}{z&!-? %l86RZ,|<tGz{و9Ѫ,ea+ ˝2u} '}->IUmFT1.-򆑑fkd[?aRc +ͪhB#ƕ-iwl{B$*A&'D-IXCAe>\]Q* ""TުYrs233A U>>-[VOPTA!..B]^G )..[`8{9Y:K jC;'D9Ȇ(lAb,Vc6ڲJĖV5$'U;h'lzDPHj UHw Uh`0ZhT*^JR)%ص5`mv)l[vF>JtAbp5L5+:iiJuCm343aQ^Gtc&Ml`$B` O=DI-$Uđ8sqQ *GQ񝅑TFȖe,H6l垒}WH& 1S">Hq@[`ΓQw{ږ[ILx`lUKBL$XM`{|t!vPM٠}haEΙTz 87+wb;[YDؾ7ƕ:%qTO./u#tAn=l-N1PcKvzD3Q$`4j")([cO*r#rjLXbOfǜ8 kl]mʈ F5 j2;cWcD^ul}%GS"m2Z#뙂=ԈwKuEHf* PPahFEB|]tR<,D1 JuI'GA{p:3$!" |Jlr(E*@_sNN@`iYQb֗$\SKRJ G#ujBHB6W% 6ߝ1L+@XGlYE09IKo"&|Y*jDԔߍZU6p)Jt]K9 "_vc6gƜ*`}YU&38j!b]^^Sk7"00Cp6f$G0ˤO NHVjF}s~6ˋص<D;/t` l?pW 9iR\p.ԏHڪ҈bnCӹj5AU6NKXKKIMrsaH=saj汈c )i8~rNJ\}0e1[iU`fmdMZ1oA bFxdˢJo(i$ڇA'~b'MRD,"TUtmࠛ.حa,.%دG6BֻP6Oĺ ˝pV(L{veEPvL FVAaOsDo0 뽀M簙녧7R$u)VB_@jEKB9OP6HH#/ek--K\FqDT5XD)l6p9.ǢqY ~JB|ž89&%ڡY8ҞhX$h>BlȧXeDĽ[9Ϫcfٽ|^k..ƨMaĭMUbe4.?UWJ|F6S!چjIS  T06qt$(flE8ԹK&U>%.V{6CgژkFU=n"Vp"ӊ!³1jkv_I\f\INÒv"QاL6j)䅫AU9Evaq̐lF\ IlM4g#`Hd* IJ ]VJkX ۈö\g>"w#8ĺm*SWK\ *[\l)lV6h*KCJ-,r'GvkgpV@[%-flɎ"$8٘!턜F=YNp6@싗!k69mۈ{}i.%,[ x?HTᶪ[٭_Qly] :j!^R;ö gT`j 8-Zg[ M[KQQ(wl} 5FL&9h=7 Uj޴b(JLKqgNO~˅2IȁY% ,iom,eA+71.n<5WD_haAO5V[jΖ0"u>vM (c 3}hC۹_37sv$A %-!a a/NT;> 6hx"&œ+vG7I;QLs| WI \Y0RP{Dtw+U!!_sQJ, |.|Rhh*Sjӕ9<4OpOgH!1o! [Iem-ku4qZF7qAU$[?ҢROn(lDt1k53;l3E{3H巌%-w<*`6"Cc S{V "oL'vq&7O!.NhT5P srf3T"*ȳU;3f#7k |7w: gI%ї&gDy 3'> r1$_E] AmU۶d-i2$iiއ*#W"{LK <岀v뽏PWUJoȝna^Ч>Jټv~Z7[l~*X)!?$Fz>6•ܘȣŨ܄#Zw{7\8't˱4cvaqq60Q{)%F W)حep7U[{E IDAT+WYg%Ɉc>RWcvG_/뼂!B&9~7 _(3׵|l_m;|irQav<n"Ͷ gG[KrD@5{,ll`tO X!Fm钆ՃT0*=E!~;b_ZlObfR%[r>+ r1D gQDLBKe$ɰIj ,nGř9}08T;<]Y"(#-BՄu":iyp35'!(I*a6JPQ;tf{wmkM3-n_ƿ_^o5i~\NjKXf6aIb )r q*]ynFĊ*\V5CeWbJm;SFc[+dQL`Uo߾֛o7{_yƄxր*JudstyC":%84Cc^yLHݒ-*IpfrNj(tXX+i$}'i+oָ!!!:vLش2kV]j=j5("|?ԵKd&Æ NKKLeӦ;= !t޽)۷jrʤOaN4Bi HLK8|>xG쐎mloZюr@<=&rY`p:NjyyImQ؏23{ !162̒!OOOV+^7o\l_Y\\p'+ HжqJ&ƾ*X|-1鏍*osBL9k'pB/mQU+qqgw.bKOI۹:(0NsQhN9u޵+??Or%ͷ͛;7=`HMM_jGѣͅ+mRmS`,ٹQK(V bLsaC`^ߴA{]EzqK*%q7wc.O?E":R3po pA.G;=1pɌU_Vlݶ_,Z1nۮݮ=d#ɦLaƍ?3(W\ESL259) d2Fmlۘ͠LX#F1Xj n"#jkâkJ803#*-;Ž+;& Q^Vc6M]n\Fa=R]M4 & KyVȞ跪:_ y!RAڡI^(Aoip rӹW2o-i]k/adBR0>̃tvjUNNlס/ Uo|BpԶGs#KT:-Lwθv*+ɖofaǔj(inZ}9d7UR Z^-lZB9b;|PdʘGv#6 nX6W^A9}ڶق.]7nq>)QAZZpL&0`6N5rN.Lؠ7FJ}̡W_ٻv"III;vسg`xh4JPp0F(77!԰Q#>DL0@^;8$$::)O:QR[*Q ʾeURnTvE ]v[bwɓ3gv!ԨQ?X0ʂ믿gϞK.1˗B=z@0uRRR0G=zhNNNppAJJGKbrgddxzz[Y{ fΜٹsgZW^ye 2Çgee :tРAM6ݻwh4FEE1cǎ<@lBhذ3Zn޽ӧ\2d [ya~E[u+WȨڬݠp(U9Ps)))99Y)))#F믿"ty'QC #"##SRNUhS))‡ZvmwwaاOÇÇ,Yi Sڔ)WNݻwo!~MNNκui r_~СC{oiҤIbf͚Ǐnݺ5wXK©]'؄޽{:tpΜ޽_Qtfޭlwڮ[U{CLEʳC[N\ܧ_*V|͚A 8s׮ݻv0j#|}}y,=nݺ2cH30kc9rJ5j$Bرc&xAPllLPPPݺuMSګڬb۷y,jѣGY!:v2uj˖--Qiwxxx 6t׮7A['Ohy*̨}!!!a…zLҥ O&"HOKKJJB/!Qb;DvL #3ŋO$'Iv?q׮-[{ͿY`ذaJRT2u !'$%ԩS'w5ct//Of{!ʚTEBPppZ?;;!Q!3ڽ{ߒr*998p֭[;o?~x57!5PӦM_aeg&oH1CP =w2N7W\i6L:iu֑˗. 2mTT}{Zb7oԭK;.^`0|p;wOVXXXR\ܥsgR Fc_,((]TG=zj%?~֭ۮ\F{n\r(f۷Bh߾}{C 4PLÇZ~C^^^iiiBB=Qٳg%;m #^ڸqcqqZ׫'.\tƍBB/b-ARYJ^v㴘w\0+uZ?{왟nڑFБ#ys&O1k̙|Ɋ+ ÷|j%K8pObԘЕ+WڶmK$((h5۷oKJJ-P(wy;$$;j(S)IIIASNСC}}?q$//q޲4*G9rJ2dѣ 6ƍGEE9 m޼955UPknʔvvHNN=<cƌ3YӜZ J}ĉFx<9Sw܉:5]VV6_.ddd{͔3g  :u<`@"њpzJ@z獵E۷oǝ]v]x+׳w>!b&5 >|o9~8,2,($nmOyׯ_1}˯2aDK O%Drss֭K \au֮YSO?ޣA~hРANN-ןn}WwIq1BH.Yڴm{ĉ\recEd@,7Ə74Ejh{'ٳfxwfLV93U䤤;[nnzϟ%2<##[gdd0ӟ{ӦO_fJ*++\Q섉~Ezyڪ ]'+?Cd2=|0!>~ͱӦbߟ=;==h4"d=.ɉ[t\jFRyzz>~O>kNT~j[6aj ԩSn-[.W^zI"5;u#[%x嗧>~I&+Wwmؐ!qD*˖-[l̙NpIKԄ /ZԹ]P I*U-kڬ`p6}ϥKƾmym5:`2d6:óMv7~n BP:yҧo_ 7~'Z[P{r jԦ&m\F22]@q6O jfV˚Fxxx6k*[LS'O8-9u8;;e0j`6_L\H[Íp!eFSyTe%RVԩpshu^^b*߷3gHLSTTԤI{QFG۶m?L&Ϸ5뽺uYwԳg)S,6r|݉'N(//֭۴i̓W8W}'E\ڵ+777!!~ݺ7n܀; @ٷ[={~2% '8r޽֮)y n!TZVh0p >,++ !O?n0KJM&}J=,3g 1bDz20>~CvݼyW  zYOR&Mt/64Y.Ϟ=[ؘP߾}}Ȅ,gϞ 9{,v˚ ϵ†.:u*eڴذ0J5uaf\\a=);Ӕ)C5e\4?X,Ά-!biȒ훜|Drߊem3IׯߐaC|ϞٹKj/kbB:u>|hUݻu볲;D\a=)-DGG'$l,(((((HHH; ֋.j*amڶݘ?i򔂂ş/$OOӴi3R[{zyNKmnX^^]^VQpB~'GT]Tk"B'$$,]ĈR۾}iӦ1c^e:tLF,^Evvvxx].Z877A>+ FP3IƎyg w>f\%5kgaѳg_VVFh:h7+!Iimd16O:wL`rX >chڵ6-R5RmCndum]fd!BJPk:d2rw/O///O0BWr§Geٲ-.`2 zNk&,?ځ΄ zb;\!2 a8*+`hdJSdf5d kiwt86k^tɒv}kץKzK :wR׮7m©w6*jȑwnD[oX>Ν8t(---~Æ=zII|Rezp*.\q]ڽG 5X[;z> ώ=4ر#ʪZxxxW* 7W]^):ָ44M6E=ߐKxfffƍBbNd[FULFV٢[j,T*U@@@yYyZ^Jyuׯ2{#W8?/_^~C~~ yp}dUϞ ZK,8p%}޽{7nkԨƂr5`0lݺ=zCWv˚ mM&Lܴi#h4[|}}-]G;elܸqpss9sƿ>%'%!h j믿߾*55Udnݼ7$'%T?nA߸~Gzsg֐,Vn{)Xs^ԃ6 *Gd2?nFFFr"T٫O<ٱ}qrœm{c؍ % 88jʁ5xk#xolp \TZZd0 .--5Ltkq>cÇ׭k׶v͒~)S&O>s,,'NR&NŋO ޛ5KS 铜hzD>}DfdLjM2%00000pjL9O@ٹKj/kb*<׎ ,1lذ$ҭҥKzeǽW^ZoI~~<KY%]qqǏ?^| U~JltJB]fBm&Ral6K~vww;wlٺݻeee!LfIB~ -((#rrrL"Apt}kv|NұcGϽzF%%k׮͚9!,&#fRʐ傉ryFFR{Nj<< NH۬yd ݵ:Ço4hQ?[ovtW_vj:5EUg |A0eΫ |g[WTn~⅟FBkݺe`@+p o2!k/tR5!BRyxxhVk2rB^u(nt&:n_.3 q`#F>b}F4䟖-z~;>|_s^oIfwm[))֯]۾MT; ߻3er6QQ-[N4ɓ'9~xkȦM  \B  oРAxxxpPPBpppXԲ '_;qᄑ{L4+^ONJkÆO>~ܢYy22-䵫W߾}XRұgݚʽrsr/Ν;k_._~o/-"ccN7+W믡a+DZoDϟ߳o{d<j@2!d2ppˉkB7:)!+ͩ'ڄJ9uJ):Ed8|%9sT*a Wճ?Jƞ8ҵ[79=O6hi\\xx)Su ~h(ݓvmɽ4e%ءr  9 >bĸh[iРSF-Q!777g]͛˗-?B{h(((jaHEmT))SL4i܏NSWϻΞ}o挧^ rwwh4_0xPS>>*//Gh.Wxvkw}FE >j!Ktmۼ>jTіӦ6def5mtPo޼3EVoUZE6}t*߂'0#5_0rت65Ot{R [Cd!adF =@<[[Vg`6 F)/+h4AЋ X+=0fZ P(FcQaa~NNYY'5դA\' FlZuld*w@@P*UP1C׻,:6 &za4K;tl2 -fh2jOOv/tvJB`J^\.[n֭FٸqcP8=pEnd2j d2lզȌY{_~qn `<gj<XShC+++Øo Wz{$ryjZ|;onI}nG{vȑ[n-[e&;R3$`*5F5BL A/ z}PpPYYd)3 (ɞ<)(*. 5sv횶mۺy{{ֵk[O<9 `IgϝvɘJ5q»/]K ϒe}BVXqŒmNowЗ+Vy󼽽_3֒>;;AC@@ŋgk3f tssܹMpݷѣS[l!#5~۶O?-7m֥K/Zd0,͚QY>$3:mT#ܾM t]7odI8kPR|!1\.T*26;dڻoƼ:-_=|A:XZ#77wڵ6m*(((((شiSttZi_fMFFh|_K UQQQ_Zָq 6oLH߶oݺk)_w@p0dx_97wnB|3qp;woݲeB֭{B?ӵL鑖i+z{l8` Lۺue5jDKеˋK-͋dY37o޼|~~~_vbtfΚe4zt>z(Zi Ērrrׯ֛o¥g IG&/xh%Ľ҃w`$_zٳgjuttyHW֭_߬ysjfS-9YM6Eݹs'vԔ3gudf/] Bi4.;qB^6nL<>_F5"Õ-˫EEiϷ^J^XXt᧟Z3Յ\. _={JNb h/\`ƍ{w]Uu x'yAjuBdPUfDb2X:2Vj[U' LKS !$&@Y{ܓ}kgc!v=Ҫu2O:h׮]^^./,Ck.(:c~mnwohnݺM5?#VQQV̢?-^ܦMuLΚOrpsL^-[ZG[mn''''5oӢEL׬Y1h͚ϛ 'ܺed$Fz,?^hѢEf: j3χ lٲO?ٳw0`IrrrS<ӦL˛6eJ3LU6nޫŜѷﴩSׯ_~iS4{FegjEO.w}$-=^PTλ7yEZj]~}Q oԫW#iTClٲ(˖QF<>~%%~#RC 9|\6=b)'~iyK/8{Ͼ 32ׯ~ڋ/)))umܸQt@ӦuԱ4PC˘(ȷ{x(̊w9bğwx&er_OIIɖ-[l)((H&XVVVڵk׮? XE3we)C-**6mډ'Cx<^~z>0E5G>i۶xec=Oj~sY5.|/plBd`T6[ Pu@euEZY2ffծ*՘=QFX<+*%Pѿh UQBz$Z@uaFÜ5=>NصxLPۦ7nܳN>;P.Zٺ&T޴iӜ{7U?5^ïI&.|k҉^]ѽa}muTΝ;sŊ_xSOڹ1zG *M6͚9;ݺU3֮Y?ɧ~ldɒ{7ꫮLUtKƼ_FxLsFn~ۅ<-ZN8a6SMk֬Yaw͚yyylغM_|@eŷ= ʬ`[!n]ڵ/M*Xj׮]PP:sw̘1[5jtImp=>0}B_Off-[j׮BذaCi}-rVԹsa*~=z{}Q=] R?Jw &0qbOxɨQ+W[RRBHOO72_L+ϾΦ͚9goȗ^:kOsB<# /\EW/0*"J'??=hhl6#Zw]DIIqQaaA2-O TS+՘=0'JJikJ PP G20*%(Dkgvc劕+mKذ, IDATR0gǔeh(9Fڥ=q<0l3]TTtٳ1z7g.ٳO8#zWnٲti~޽ϛ;(`Wx毪]lټ 7om]f?,ZBg?e^yW=Ԡ~na_yU;Ozu{ƍs&*}B&L]!<w_>S˯ᄏm۶!]yكfm}'[2u7~P!{gY-ZޱrBeQ%2?뮻fϚu̙ 50a±gPlgg';Vƃ֛7of͚;rrrvYߪUxM6埿[nfώhɒ%W]uՋK~sik ۷xF߾ӦN]~mxcg?'^qq+V2O{رV*)) !lEQNN9UVvYgy;=rw=tܸqgqFӧ#?6[ʗJilXqd2Y~Kk2sZdvn~*wS*̣R+n;1=Wzv 6IRz,ֺmv|۠/:eСCMvI'm0ω'^6v.`7g}vvr S9*,]@5fkPQE'X#s?;]k׷kYc[*#W2 Y߷}vx࠳̟lo8u?z?!bTcƌڨQ&N:w5kNsB!d2^Nck ]7{\*74mlƗ1沱ᄃ~7o>GT}=({.u!mꡇڶ$e6JIM֬.\دs֔nol_~:u]]=jʕJ;W\jwygȑ4 Bۼ)ϛwI 4ɐ!;6i-7L8r-Z 6ER'aC]s.13UyE2$g;?jykWN$Kowv[9IfV,m>pA#R_:uX?`Gya5O?M'8_k.}>BQQєɓ^L\TTjҥ;{?o\#JRٺy{Q9sh̘1?>_x/?ߢE[OO{=ڃ}677e-Xλ={ʕ .\p+T?#_[GnxPYh]m6;;{5ͼx"u5O?˅ͬٳ۵kBW0aBSOw{o˖-C\s#\zi!OZn=eT##ԁPs^O-*SO_]>nܶo7?!bT}nnnwu7|! >#rdO>G1( ۅiz*}BJ;dynj}3gy=#JA2ynjuHnǍ/}s:o! zJΝuc>jHP|/}啟^qťGK{ĉ^~G>KKJo>/osBc/31oy|@ճuuH97~|z?vܸ~#0yJvv ^}5O=OآEq,dm曍2D((J^'䉅 ʬ`ШQBZ=.**Jt5'9!EQ2LO|6mJw3f̸F]7q{ek*{c+mꡇڶGiiy`{=({.uF_|WZw=rd.5jwKJJBmB/aC^ݱcqǗxO>uSN5?O=xʕeFggg۵oW~}_:0뮻fϚu̙ 50a±g(Ofm3te5o<''s!}ԢEC=kа_֭۬ٳ(ZdUW]ҥU>;挾}pCnnnnnɓ8C-[|Gϝ{wj.;vժU%%%!4=FyM7 ?pi 9͛?Ã??H5O>G;u4[$ ! i֬^DI~PG(#+DU|G$UW8S[~Cv)1uO>;Q`@ERS>95Pu5NBTgZY26̪]SU1{z`$ZxBWTJ|k̶emi.MwHR}B:dT=TD֏<#v5b#?\ 7[GQT 4h+Ym59.[6pРÜ5W( *P/_wߏ?kG zh:hؐ7mڔiϙ#.;l3o>p]?C{tv„!Lμcz:{_|O=kN:G EQEQ% j:6oޜz_w;#|/K˖l_`vɧ~?{^~G>KKJo>=U?1/ޞ7˗֊((ʶi{IM49SyaGySO=I&O/~& ++kϮ8Jrĉ-Z<崿nĖ-[~wec/>ȜnBk;kCx ʬ`C?CBzG{<o8u?z?!b7nfdzӾ]nƵk֜BEd2=}cƌڨQ&N:woKt9:tн{?-ǰ~ꏺt90uV6m~CmfoW߽G{/}v_]@H- R2:l{s=C Oׯ_N:k׮gW 崟tIOlȐի;v8nT?8yؐ!k׬ܥw *֮hRs嘰jrt:6̊m㉅ *҃}BA"zwSuiru.ou)a?e20*μ5TSM@դu|^|6MQQ%()).*,,HxPKa2ߵ0L[^jӖDRbV27*zi~yg-EE]Ea}@ֻͻڹSFF<ix ?\nu(:%?'>#EX%}+f«?(.I9!緄lBHO }g" O.YƥtPA3ZI(zru_sKdd2ELtI-ZzoS9_&Kcti>yygEQVu&-/!\ZfaO\,/=eR]/Ù3RƥozxU?>I4H;Cƒud%C[ԴlEQj !|U"y񡕅kj͂[!-#7o]f5;el曅J^YXs& #n,lؒBc"d2`eO-*iY{,e~H=3K#zg͚dPs-g}YjY=n?>I؛SO+֙I&Br'7n?-L6L[U2ЬNd]}g>)H6J[5.?O-i!4~qQKgT#rvDZzXq]]3f5L5uũEQ:ilt< +-+~|`fK?zTVuBZQ}ߨu4rwvm[?oU]U7t]UYL:n݌f}KXuGɊ u5.eyŗRY5_&W;oРH)[T6WR]"skSv&{^ioe⒒6իw]H1n_( t]P? -\NDQZl PlEw㌬:X\_C:YHg ei͍̺iA dy lx3xWKRSDzZ&u4N{`dX;U3p ;3BڵOw!upV7M6(Z%~qS7޸qBbѬYAڵ R֭+=ak֜BEd2=}e^l ;qㆿ>s>{٘K~jk&^?4Ty+VZY\\;92UJenyg}ζ5m-d1ڷ}N?{lic⣏9&Us[n6;]9gQvF8gs <۴nNG{=!ywqʲe Wk.Lcs# !h1SY_7|3HrGhРAG>>[%Go.H${l}.??sVT;wgQ3lYYY{+g!#8G年C\4춻2,U={cNys~y=M4~_^חO2_?xߝ5T?9esqTo7zs3)=hO?~/oOS!Y=jdfv5~n~rmt-ʪo_/aÆ6mڬVZ{g I-ԩ.0U 2YfuԽ/.}${CdM@ݹ-Fƍ>쳦MH7i\#>뮛v_ƍ}gpv{Wz>˯Bo԰AVƍlbkXa%c. !DQEQZZZih/js2\۹SWz)'^.[jNJ?>ck8Wv}C:wkO>iAns8~eu|ťR/6=k폚5mz̈́7oEF[u%ƀg=6w_}ms?߶;؋.<)ob^2`Y=6W^ܙNfeȨa]*}uy7LU|wuΚ?\}˭3 v뢂G Y.U#i>{ G}T,zMspho=bG}f4mzS1|ȃz[ooܸљ}Oe;[Αzyf ~bAA᠁[Or)'ߺ~VZܳwzcd"!Wxi}?^7mݶӋЮCFF\TCv&мykE5q-:d#[%k[tȾŽb6n̪Ykoذ!--C*!5@Qzz:Yj&4UA^{mY:Y:W$>y!Bw}vu!2eKE_l"7o 7k֯[Y-[4oPAZk tHų{KZZZ 32j5iܸp532֭[v4R)`4Bڵ1+<;C*H([zZZD@(;['($(p U OddzEf:J[KP`B"&&DW@ӵykD2=&d"%PUu:h]aX i|mc ߋ5OH&ިaiAZNJ)H06#9GCIENDB`kildclient-3.2.0/doc/C/images/we_scripting.png0000644000175000017500000007727513215302470016175 00000000000000PNG  IHDR pHYsktIME 2#itEXtCommentCreated with GIMPW IDATxw|gR!P' 5*_HiA, *_,f"]P&( E H peZ.~rs<-;7PLzj6[,Z;s9oLyfj8 Uq>9BA͔R_}v*,.Tz*Wjz1!J[ەHh87fG4EfK :̛ͬ&' 8e֫sr%j.ˉ%,rѽLĜ D.1_O9:pB׋RSo3k 9l:%PUQK hEZk6Tt@C vHSӓM'WD]2 E%!ʞ}(ry+W*) ) RS&EEEq]ܢ6Rw3)5鉝+qIc*WHxsԂԡOs'J(un2%]98RZ.CնJ:˹;3YLXw;M) aQ$K)a[V^/*zjs%~^&).Bbe:y߳O˛2uzzF];q??+9vG&A=A-ǜ)A /'-tڂ%>2+|Csoxw2qxeu\8>ʷǶǹ!+~AI8PYrK8VNXFfv=9M=yw)L&ӭʕpgRdddDFVj$΋j55YRŒc2;ǟL~ƍs}Rf'.-Ǚ5i:NI hjSfHKˮ{9D(]\FO^L$K9g-$9QSsʀ#ZYP;sz*)'S[.U]zo ėV *+IԴ jc0nLJJhp!*V~̩*+t:_W8eUbzBHTJ1ÌFҥ{=MoۦH@~; BfSQ/HH_鑏J#1i @"pXj`R|P%z88yPG'J8qG5esR@Q$\ى:@u e4WSE $eAXK?7ZSQcoFk8ŒH)  A_\q$n%byߝWqQSd֭[xټqӦy?ynJ\\ǟ~}]SqlR7]˹#ig }Y2[hDhNPbcl!κ,m& α6;!954MC`v*L,yBO앷UY'_^񁰦\f~R  3SWxF/g2AаJl,ˋ\ߝ׬3DW3f,?}g?n:++r:w>5ϛ5O6lG˺XsL)ZQ~?òYܘ/9dr>QNҥE.7NHP*n'جMvZ`u1;3P;ON.mBZ@,CРMmo؁1Z`.;óIɽ*>yF-!KUX7ƒa+A9bׯ~+.*n4EyyU~=]vݼy-Eטq?0|jW&lDuzz:!/xF-4Jƕ˶O~:?ylgnۦǏ'ܺu駟 ߌ BHVVքt2ql!|ƍk׶}UG>xBf 8il;* y-3$NJ65)l BY(KBĽ:)!^As *iWMX B\$vEUSJj)?*xxLfzIn <V%?@&q3O/*,4wygy&`tVE3g.w|t%>=*k7lcFް~WժUKI:EN7:y{連5k"'/}¹k7oX[M䅲\^pQmz4$$Tzj~jᇽfy}wܩU6!d }챃G4k|…R׮^/\۾*X+qeekِTH6S, ـMRwU]Զ2)l 3U@.ëpΦ:T"홈ZRM$ŵ[-Z@8[hATBK%IZbaܢY»}s&"(T&A@koHleL&JFh2M7f,*Ϝ9)/_b4 FhX,&I?~>YpѶd+yݸUw?϶o߾RٲMҔ<9{-[L}e2!dΝ˖@?&=$_oX %h3ǩSsRSoߺ1xOV*9.|iժVMreΝ&͖5lX~D9uTJj[7_4Gn 'Ob2KjT[(UL8JG/sru8'1'%]B{[֥,g?pλA3v{vuvl8^ וX:g;wq%@Bo8p.c`|l:qK(|kծJ߭^@t.+CLA* B$HșReTXR)WT33񻱎 %Lq(xS,1΀O zd6LR嚯^CVnÆ;MFJ jõ+~ 7ovlbB>ٶm|%R/"qMP[S<ןOOMŗ6:ѫ !OodbHbPs 44OſjɃn۶ҿ͛7޳Awd} 44(J,f}po*ytśy"$9yGjgM͉yԴ݄8|r2QsƉH_4=8jʎRn a9շ]g-p9HK&.y?s+5R]nn#K0RU;h Nj Eqbc*y0cד20OtcRIɯDi%"{) 2ͼ¹'ڭkBhZ]HHf0l4& Vݺ[ hTQcF[Ki+@2uڥsҕmݷ[Z>66fͺ Qi/$a\mYjgCF>?6J#_hڵ{ï_()믿ۯ_AA~~ۺ7pݺu>9G^J -¿J*'*-A?: }SWf'"keT(=n(",ZF85Pq3GQĜ(Kܨ.yrrV(Ms54swM(m$$RYM(rJͲ} º,R"##<}V^7o]wo+u#/'OTgNTT\p҅& ħvАsZL7ծU[>v!q$[JB}F%C_sW9"Bڶm|ʔiSO?ѧw65K/>lDBHjuOB:vV]SgL?>;w~i>:(;Zb̙7.v&6G& OE'"[9UgHmW-LeX7zVkn!OqMD-aEąmI-(& ILVkXT׶j2ΎfaB&a-(ju(]hBB7rߛy38$ᡕjl%z^ħգgOF}?FZFN~dfg;s8i/v-͍_Zl|9a_h41Zm*TkBȈ U*3V[+VURUu*?h*GtF!//b6Whkсg,^/ c,'YcM\X8ɲ%r%Dj^Ndo N1^r咉o"SD"KڝCN 1WD&Z(_Pzč^wq9i%8-UMa]XkW3TXhhF MdX-*:((HtiM׈SRIZ\%F@[[Gk#,Y\vc~u`Kma=Wkh9OP5|D$f8u[`q [HK+gi%@+ҒX2t 54S2Y@(Fيy eQIjYUIj_jsj\JHa232.\ufڵccc z.XFUXn|\Vu%r^X1;;Oc.=}j+Tɧ-ڸÓO6{ PDdA>"rn>ļDD`>ẉG E4^ vS'OW2  Hatƥu,EB8hA$)q]5z񝺿%P"]%kפr nV^\R!< >WՄ˪~ jkLJ_~5+3+##p4<"AիՈhPI@WTX_sp=ɴ돓g]Uh0<0bbqc&ZJ,c%6qWXl+ dÒVL`%'Wn'l<zZDM$5Gj]vBXL"d6k5PV˾W*)RՕD kkʰvO -Gd9l"@VUMϤ?3)i=MM#inTU5GxmAGb+pEgL)a}b~#:fspNSH1KxA4⢂눈vUZ2{YoX M94UJpҜF=CI-'Uh\\nT55;{Yy_w֗\C#q{«BiN@ɛJDco8,BEfڣزY9<=h,bB:G\/?bՔ\!Dŝ1"!6(Gu_Ik-%PUn[> 0OTJlȻ'[`D"Zϡc8S%V{6#\\JIYBĭ[*csrMbW3,ZNEh7VWS!5Jw3Xa7WM'".zXތ-ZDD;DlNXKXugl<"R(Ճ.[X99qDhokv" H \INvW"G&jUqjjm 9UKN2;8f(6c1C1yo;yKسC_Hd*(9"YHk M DĶg3- wq"b=.FfB>jM͠d}<U2=qHk#5^;ة Eli'4B$c9'zPy\^F ۜ[m \Jd5~PUXs tr-7Ӄ]R{ý$_=T0T2q2u[X1YD)XG]h_Qsm1qB"[}i$KmNL(l;DCgQOi8E}eQxzOSkr@q%TTIAML6^|.s. श⹏%1C.n-SR)c;RMd[BvT&VWzG^u 7,o6-P70Lx ^}3O/_.QG3AÉh\fΠ/'"]9ǜ٭H‰j*]Χ Rw-֬CeU&ʧqBL+"y~0rԨ t͚7_b%j.'Z|0єɓqk-%ճeZ壏_xB?=j'%5h0b7nb9盕ҒPւPJnmSZZ]&Js% sgхJav6qMKB,p\%1筤% ]z:]#rTRoUsc/"V16Wk&RjÇnXCfiܹ]_qS۴mڌ9N5rĠ/9GV޻ɐoJIaA; +PEE{ "]+qUJ"B~^au h6&)ؕW6m?ZRsIU.wˎȡeF::VN ٮs;+Qr+q:#Z[ GZ󾥅wdgZ-2k 9WRjut!AnܽWouj:{N |"?}6+VzNBHnnN>g;vdtt4!i.J?xH8ף߹sCv#ȀB/0^U[!Hcq.N >RhrnQJ^Aw/^ 8}xX!y:FxZ۱Al3'<=p ZU%&k[lL5wȜ츸x)ڷ#PJVJ5!$$$D^SM3ZK|0#Bk BK\*\9QlʪsNL9G'pYK{ }0JpˡZ׳zz< My5m-m~vСרռfA"}1|`Pd1Rۭ[/^|ĉ%s,7*=Qꖖ~K[CC)!(3S>Ã[͛7|5kֹgPw W-{t@K9?@e}>){Guj7|~7mڔ /tҥCNšOᅲވzjƖٵFUرc5jD1˗/n߾ˁ`XҊ +׀ȤԬPhk<\OAXXXaa[x,)qUT7,ZYf+V, Zzp;vLNf׀[lT)r{С#!dϞ..ܡCQGMM}wV$lذ~˖-=zt饗VZ '~ O[yQfD@ 2z@@*<:vvKL+L0rw?ܻwk !ɣ+V8ztԐ!/ٿ~Bvޘ_~)<=.%I3*QMe{GW6~ ᥰZ\rG٠AۮiiGy䫯_'OܹsWVV֪U+۷oG!TZյTTTDnn.{cTBh4ί?bʕqQkΗpv<;L qT?x;XrOK;u꯾jР /BlncLŤIi͛7fs!͚5w,!d%999o^lco(,,ܰa#XbEBוSM6[ B@vv}zMƌ]TTXΝO?8WF&'vĚK_޽ǒ%Kw>ax~3={ ?V"4ٹsg׮]92Wq݄ / !On ٷoc_|饉&T%&QvlެysF-ZR3ftϝt,-իWwl߾jϾi契GU!Der9)ޣS𐐐k׮|AV;޼c27H:: ྶ\,?xzj:**#|zu2o~Lrkԩ3w<[zVzi2v:r(R)))))ǍyyȐ]vv 2ٳ}1\fEܝhX ]G|.deukצO:Y.^  ZSUS^O۟~_~+ CU*3g} ۥ{!XGhk PHkjFtBqBt!PmJ+d2MiZXgR*`B<Z &pBIaa BZ6p,E  flnԸh4DXOqhdbo5Ji~~~bFj?cXת٨(17 ?X8=;,o z[*V(f$*_hk֎ʘuNO޵)q?/\(??~`N_wXRJ)|xC=z>%8XkY7X^_lZQ΀%*kk @uNO*TШQÑ#GVZ6ZIJʜJHNO'UVR.MQtɒiisu4qb/5!D7̚9`0WpHX6>?𢤡~6 7'%uE99 5zիǧO˗[=yc,~:}v|uW6mz͛a !GUumظC%%%}z-=t߽،Ӧ=׿sDDDHCQJS̡ ?Zua=z l;)߸1*^1}[v/l۱ʤ.0qX .TXa ۵v;wjj`BHNO1|vZo]X͂5eM&ӪU~i?!M' "G,sFO??X,M>4~+BfҥKiFݻW֭ߵk׮J**ڹcN&&&'{73\G J)Aڠ԰]pao>؍7VXѽ{Ka]9qq񡡡Glذ_~9`˟ҋǎƧݻ79yT*n\IKKWOBuhּl)OVtҗ_i>Y-C-_þo2g՚~K|l^d( 6pP6y~!`01J?<O6Gl6uZ~}m1 ?^`+x>o?_C%8d^=ʕlt:]qqqHH!$''ǖ?kWRAк5lpDbnի幑… V}r;wBT*`~naRPPaR:b䈗ح{7%߻cǎ|M<)_>b8_dڌ;~g|olyjիBOO/((@(kkEcy5H5k~g ܿo?[%&O[Oo֛ߟ7LgM,_tyyozӖRTŋi cRRƺEKfCT\933f͚k׮I[2믿VXXhbn?PB~~~TT}J*=OV}2n8[5ⲳmFEEu:o[ؿo?>jUT"Lu֕+WyfLLX毿Z`o&؏A5m'NOUc9M4~_'۶eN=ٞ=P!o`~Dڭ[>ʿW&?\NIIO$Dk*Tp+?۴ixܜܜ%KmFbz}hHh.8+3?o׶ҥrsrs,YjKi]/!!᯳܀?u[JtttFFʕ+11NEZ-_:rБGza[gMUbPJ_9bvJÆ 8("6ּk]vׇjrs'-Sp?GJ9*٩`z|ρ/ ? 6|ᐾ⸷~;333FO4Ν;v$wV;ҺuH/yҤI˖-էwy0`ҥ#Fh4}9y򤲷!VZ۷eNق!C,^ȖҡCs널ءB?{=+9&OQƕ+W>y}?`{#z#~7D=6@ ~q*U|Gnܸ٧k,c8,$4XvꢅtcV7TPZU  V;ufS/p[C׋֟R&0iӞ֍\׽/xV-[:|Z?l谳g)FqE{%o~AAANEZ7oz׮]Y?A/ ڰq[@UVCZjժUҙ-_Ue維 8`>txҥ/_}t2>t>-?ibiWPU1UisPvWeJ EDDg))g[rV0q„JԵOӧO۷oxx8l.8qB6[ƍ+3:X-Zha#68ӧ*ouWeo=_z% sR搲=W矲%%)}1Brqʼ]7{n( Ը1!Dɩ8^XZ}maB@ BMVv.8DFVbYNBʕAA:]ѣ[PgDQl2 z+P}1BMFlFW!T*Uddd^ލɃVV}v8y2H-Vc_7ej^O?.@'"*T[F\XXX XB5(TJ* _  uk*om @㸰1oVyU[c (8 ]6iQ' H2W34|_|Ze6G$ IDATy(˔1Fq;<޲-[y[Xr̙6ox˖+W?[m6MvtAʉ^xŴ[l޲K,hk׾߾}˷>t$H=5k~=vOΜ9 eX[oxjժUV}7~[gjLLLLĽ^+/nٳkԨ!g |wlLع`zvvv||`:ˁ+f2(AEHyޭ{9o;t͖b_0@J uDF\'!w^{JLLg\Z]<ӣGf4t,n@\A,Vt$D%DjKޱ]O ϝK5j?2]!Good6] ZZ=!tgBJbt,j:j5x%⺌3[5mNӹBt!re ZcAW(vk,mMiy@RbP\wY>ot3~ i?m[%g8ĩ~_@[/?o{MVǏZ/\N&Ao8~MZGڼic>}{iF[^֛7mڼiӷޜe4m|QF y=/\P㤖=z_ jԠaCoܸ!X?ˁ|-[Kӫg/7ņ 6lذaƪU3qT6lܰ~a Ų۷?쳽zޱmMJX/g ?… [oߺ}_h[Cԩnj:pߞ=;jA_<q,Ǐ>CNF%nݲټic}}n޴knʪY]ڵ333m"## !AAAmvSN23g !jEGGBBBz=n`WkaϞ# 6e4 n/77痟q߾ UMnnN*:8$$c+q˪^obb]B˗VؼɣMx鲈۷o?8I~>!`}!ޱ)Aw&VCDz‰$VTsBHm R5r5khՓC9ICJ6Nqځ (7r V[>@Y᮶E)54`5#ϲBZUU/8m^h%I+Xfӗcu1lXS??;o7RBȶ+5b4OwIy4|Oj~+6bm@|wl~rNOu4nΉbBHNuhcNڵi{Z*Tt1m}Cb+ RMqEw,/ںDSC\(~El ~:[zaq0>=Oo28k'k}n|:_0ZE]WkrPD`kM9BW Rq4TCz]`j\OW9 ֐DBOBzAbXOwOmUC9nzBDsV18hkeb6b|W t 5fz? o.Rz$4Xm !N5 puKż_ǖo=_/7*L IQl'kB[($ℨoY߲s\s!zo)K-N|1XӅKNBHuA' jkJhj-^mj0Kz HB˻Uz*(Jh˨z7j,D-GdRJ9@ L;뷹j7X|٢hPy= aӹEj]Ѵ԰Z&>&"$Go1u+~Ld6ڔ=B+q/kk6H t!Ue &sۆ᪔.z ppz@x!HZSBBZࡴ&[ ];>rz. &0T8CJ7d7kBCZm 7nXl6~HkKDEE;?8 N^PM.]ؖna͗_>޲E:z8<~P-֭];(֔{7nX`AF/裫~ػm΃ ٿO:ݦmfL'7fgڸi'pgPBlxKsddd}!co_Bf9Cvy椦FGGBd">QdeeVQᅬ(EsWdױv͂{}vC:+++Y5k kBHHH^?X>fզm[7@Lkht!!![zlll+u!W^aRWoߔɓ8[@27i|Ң+NfKߚ=:-l&T*@)O9N:e…UG%'ٳD?~۷h_|vqİaW32?x2zc8%lmKWޖo|aAӥwG9_op*T=zv7p JƷ._ɷfs5#fw|3H_h2u)Sq=,h)>^6ڵkΦZVJ%X%K/Zpz'čZ Xh=&&&## ˦WVmէ֨QCF-ZR3f믾z%t&V;iċ/fBJH )'G%'WVk.ѬY3F#>ڵo?&9|hLMM}Ct`ASO ..ϚLO=5aDt|ˬurfOʀ/jk'J)հ+kF u:@g]pe/,TRk, VEoM L@>I24LdlkfTڶOٸx `$}BJV'w 54TvB[z77mӧo}6mfGP㤤 F z >];?]/-[[OZ >艖-Lj4e䢢"̀ 6lذaFK5 <Ѹcg}W;m3b9G1hGvѪUn*>q1cǝ>MO8'~jÇnXCfiܹ`GRBi۽kWRRjժB%%ٽkn9w2mjv?MVVV^nn5|گZrU||MBkoѳ{g 2(AS*j͂{?l޴w߾}n޴QL[:uݔ99OQ|>裏>9k[mڶ%\о!RjZU*Dfq /6 -Hnn/?}ƍJ&77JhcG0qeo~qԸ+)?7ec'NBרqqNf@6lҳW}`梢ЫWΘ6Dsvl6Bl/ >uŋi&ܹsc%2 %j6mSz欙C syo5;yȘ#FؾOةaîfd$$&~>ŗ^RT# Kr{d ?<0PPP0f]te^]w^tgϚeD[WU)SDQBo„K.4⢋^z_ziӦwK,y󹹹/^<{? 0yҤ˗ϝ7oy˖-6~K.>c?Ov*e˖ ,QF pN3zH͛;֞Pu{y/qK.RRR:tz;xwؼ9jO۬y 233YZ%'N͛;@}?m%KL 6dff&ֳZ+}K|ufiSv92ǭW~Qۇ<֩Ç';.]aСW^~Ԯm.<1sd7X,bqI-kAA_˧-[$~/䗗ƒW/hvK~kr.e??G}8 ;=ګΜK,***kܸj[7{,]*-bX,;rY'~1c !̘x~.x.Azz__wI'%#6mM#Gfddnyd!3g̘̬ #Fs7bO7nlޢmwIk(8޳wW\_.BxGf۶h}}6G&[b:*?%cPIm96 (k lJO(=r;&^TTXm┴nԲmMi-ƿ1vt3e峌P 9Pa A/[-~uJ [lSPf{e˗/[ ڶm{ݰa{6l8`wy'OOt!1Gwҥk.cF.((_>}7 !iJ8EzuHǎN@Uoā矝rʊoÛ4iXn1"#####cĈO?TO7xcVVV{ e|X,!/O?m޼c|7z/q'Vvaf͛'7lؐXj*//ofYZq㤉'O8 7h0|O8nɆ.\I&999ڵ !YiӦܦ25[zu,I:t8iRE ._YnwPsfϞcn%77777wgyfbaÆ~n֧OQF|y1cJ8!CVXQTTBHMq9jݻo۷ ;/y]mvy~GqE^ؽ{_jw>(;ᇏqwiIYz嚏>L-ňO۞۾1MkkP#=m烻 Vl*|-o_ܲ&[bڤ*hޘk[P1iXjתVEk6CjLMM@8n 5hݫufKomnԤ+K-;;g9۷9sN:u<rw=QfQ{oG a:v<.l9Ǻv9vm{:kٲe񢢢ƍ;S<,..pt9caCm@D{ ?>}z̟\PP8aʕ===/B8?WW^Il/ׯG`Ab|4rdFFFfnuKbϟ9czb}]p~u9uu _|1c~-3ԩsEoVbpάY#oݪUx_?ی[F̪_ #F QŅ›oy1͛Ciiiɗhܸqbv[nM_>I֮=I!(SSiQ+7~^z|W6nQk֬nի_WIݻϙ=+'wW^쁃2֭e˖:u,-5o|ժUt h㏷l% (7Wޫr&>}?z{#ssssssG|S[;3f<1sy_ϯ[w:u[__/zι4b5k6o{|c[4oN>uA\5ٽzPv)9>ZxQQۍwl:W+=-Uc[m[>>eMbۤ5hk>ٸ1kke˖}i:ēZi֯٧*jٲe_ @8ēZi m5Tm !PI5hkP ڭcrm {ڕBr@[%2@E!r*m 5@[m hk@[5TBd"ǭhkPP9m hkm 5hk@[*, P95hkm 5hk@[m u""ǭhk@[5hkm 5ud9n C[m @[֑3@E[@%@[5hkm Rʡ@[֑Iʢ@[@kk\@5@[5춶vqk$5hkm퓌P9mm @[m 좭}*A5Tm 5hk@[nik<5hkm 5PζTP9n D[m @[5qʡ@[jQd2m U[0#TN[5hk@[m @[Uik$5hk@"m C[m հ$@e)m 5@[m hk>ڍ5Tm 5hkQhk@[5hkm {H[@@[@5l(2 Pmm @[m 쪭}*m 5`75Tm 5hkQ5Tm 5hk`Wm5hk@m0#TJ[@[5hk省ݘ**r*m 5@[m hkâik5hkm5hk֑ @)m 5Pᶎ|įbeߴ }B[㪫+((0 [Ƕ+]}M/ ~K똼 m}>rͨ[f͐b(*((WS7h>*[Ķ jRUWY~$qk!&i[oQ|P95hkD*3PTXTXTX]]'D[IQQQZ͚m<>uϘU+ b )캭?Ix8%C۶eu1bi?#OHm ע(b˗;lkWjG_>;oAz)))&,*^\e˖}/[\XlR]5!;m[qlx[֨8 i&Lʭ8*6 {q3{yim Pxo<[q/ң:21~gS5krƌu+;s y%<ؚƍ]pܽJ*vt^[XZj+W{N;;w=~̘QnK{w=~ذ>vnaʕw=;MozY'w?ioik)ޝǭxr??#;C]9^z!g8`ܹ6m:teVY!x< n{%z֬9 cI+.OOOR9@ x-|:'}t> B˂?ȨQ7efܭo#*)']#~=ԇ=~ yYcnjzG:w>bɉ9s;})6nܘzƌ9偉EEӧH>m PV[>u%֭[>O&NЕٍ7ޭ!ruBvI=w١CXFzz_\xߗ#~Q5kuV?(1׿>߯kҤi:e&+kܸq:\K^YZI9!%ve16liӦFO<ܴiS&_q+ƍ릛gf'a7ow_ᇏ>:}ʕ_~U!555 K׬Y qMwz>ׄ((%%%A=]$%Ysx_}ƒOΚ^;p_KF2sOz7 Ooݺ-=v5>4yJwzn'0umC?<ԓ'M&gmAAUkksBzRAV{ls58_V;pǤzCҩ^:!2b'{|F;<{랆 ^_9y֭[oy֭IzvjJJc]6|ҬYonܐW_h՚U㵫~?o󖭟t5jLHY&dWoqkoZL^G[ԒU-&dⳌRR>ٸVzjæ׮'N(s֩o߯qZ5ɒuꤧ2Nȷm泌;*?MNNQqt!6i$RB7n׿Y#-5+3s:uLH'D2jkE['|eu1oƍ26W^J@2zרQs mV]ZgڵkrNH)hkodujNOOHIMM-YRFd))!-Ik.;ېVô&5o\hkJ 5ƪFoZ(jUIENDB`kildclient-3.2.0/doc/C/images/we_mainwindow.png0000644000175000017500000021120213215302470016323 00000000000000PNG  IHDRzM pHYsktIME 0 I=tEXtCommentCreated with GIMPW IDATxw|EgR!B"W"ET) AtB/ҋHHU@b ɥp2Wrevٹ> :$k`2F#A: S)GLy%639]hrb'B1Za?Y0VBC,?:cBHLR6 ?rd_j:$&'cy4A@-YRO }_S-qPZ2CR"'e}{ Er(E]) 5ব[S0#094\Yf-ϥ--ڀ%3OERQ~B| 9waJpł'Ӛ_+1_&x\N=zih@.IefuJMhQv+=]P՜ťYŹcT}š kvnj;VI-BzQ՘t1DRϿKPUc!ˣkCU Zc1EQ9HQ`гgݕtr;& Z}gf:sQWZT.VZb6tOa4*#͢Pbb1-lʴBac1٘,|]Dud.IHj)U) "%.ڹL&FU"JVfeei4b#E~^ l~-[xebzz)Ϟ>= p]o ĶS"+d22r(Y~g=ifM/vgMV>u'CwT΅ͷSt}{]]'j'y)wKkI}BscE$oEnYY˗ (hr1NKMMHH/T*]cKa4XTj 'O2#cɒEГTL2""8!mUX<^͚HI?Aҹ5*2)lb<խ4e (dRꈔ7BTX8x@uu颓.@Ό":qHİXw2J;Vv R GQToT*gqqYh4왳f>dNYOt\:r 20hvXK xaI$"zع`9,6Ú.0m>sUe[mc?B:uGa#c[x2uKAY[PlCQhlmxcd,$C4^a4 *f'Hj,Ely>ة?!2G'W(4c:C퓝KKb$#==0(܈ٳCGC?ڶoǝ?[Jj:!;t6}EQ˖.vBIM3Ɵ zgqμu?/GW2ajC0' G-_+ףiw,jeF֞^+_٪S9xC|i43+ܘwa2s$rOH%c?\6?8;tMi\N"??O[A~^bBN煅&A#g;vxAs c|nZ͖-ŤIMQfжj*if L 1s1C1Fb4_L' X=&TRcɎiW~?- ɘT*5NvӦu:mAy,YZCm2u /̟7ikW9v(oĩg/5jX"O8UXJ5*j䢅a׮=zedJ--kZju^^ެk[v?}d29p܊*!V\ոI+׮5hpR/_GOZ9:x .,na6ra-8E5f̈#C3%p%vZc,6,m6Dښummeʞĭ1SaVLgoFg,Vo#^YsEeeis&1 i> lRS7DQKwQm1! $aN&ĵ8z=&Vtzݬٳ 4gYy tzVFQ +WlІ[V^sqA#N=tGmڴ (S%EњYS&}:q ֮u9YT+ti4TiY!{w~ttNfl\x\ x(qqOŤfZ5j4w.|:u2bdVSh cE1&`M>w)FX,9Eރ)x4ͻ]֦,exe0{Yv fEQ\URp7ݻ}zӣ٠CwowiNrBxӄd?xL!흟k1h2խW^z:tٳ5k|0loo\'2tcޣLjDšfis<;E-qMg-)9mR(ы'z-?l9gv<6ev ,eZzf96 XaLfmf--b]b"Ƭ(bV[g ޟ(NC}klF݆⇲@1,4DMٰ]|-׬Aؤ DdJnc,@*t8M$mfXeLGL=EĻ%cL*L@z>>!G/_VT),,LѪ>J|@)bWPHkik)[P[FB!WH8\DtWPݍg_TOD@;EI#nۈiqj[b.R=E D+sBP&C{D>("BH3Xl0DD|XODmq$مwVm"b?PCgj,f,t`+Ɣ$5dY@`bQa:EI;QL ea=-bvpD".1z$5rUIY)Ƽ2x a5F$wz+;Zi+ۊCGE($<劍\ `+qy<#[Ւ"kbQl/~mʶ]2T\s;L,0HAǟsI,<'sD%y6"gkJ!)4Pt@[c_Ŏbȭe)hlni 6d5$2Z>e-3`,0IJW`|}X֙WնCfe6k6^N(ą^rjdѻ4.4& ~8lGeŬ(nF .l|ھR,*,^m%8b4YSkW7 bSYFj3t6Ɏl,:958%lXCyEjD%ňtnl;C]#Ppl ds wPHɂ5vDfF|^r }@OEs^ yBh?40Fq,l9by?Ek<G[?8Z\|0teq[T[lNlCp[ĮJ6`Dɣ xF ˗ h;S81ͫ1ɻ zZ>ƒ=8JU#腀j>kk,",׵._bk+xpa5aV-ź1 b?YMV)aOrlO=z\m1Fm & jbx@yedHĴ֪΂'NO@UP. Y9 Q®kiC8tu¦=lY>l͛Cdc5f져% fWD ³ 9jr_(-J\IBâf# |InizZLk:y"jj$ a!,a]׈+i!ʁآ<>ld6a 2Gd#g6gΞgf:|SQ2]T"gu&˂%B( `D>&TXI hrSY0U R\עB,bZC ^S<(cu|ا$ClMgs HX5uZ٭_N$.ruԁDuixHKr[N= iبj@S 7gl§+S>X]\^uWS5FJM^s 0xoKMqGu3[q̖s"?.7032!9;nI`Q+cc1S d`X.T/%0rᠤb]a;lkB@g)m3sFgC'ڂ;_.1-1lHVK+[Jd2LN;>]gBl8ä\4 Èۉ2K=GijO R.sSy->8D||:H(2XYňlm>yԳ)Sd359=ݳC0Ϣ!'7by}oj_}H+)!.V ("gcԢCZFK8J%NO&R8U5yD ڟ {Vz3,nYlS!O7m† :"d,b ~sQ/8T2oXd>5"8QDPrH\&n.zrjğI5U;īVvG#U,1Z0cus__5_(E$#yA$-BW%Y"O }>*%b$6QӃ*7LוۥM'Z@(JTڽ~!YeR y4(-]cW Bޟj>[Η?Y#5K &ifz į׈M~%0mQTM~>g6•aژǣIGiJ!V &ƍ? h$[0ŵsqHvH g rj,XYk:P|Ʀc[TVm.H2ܐCq̫G y%9fz+ !0 IDATlR-L8 ,%.|]ϷFzAŹȉ+aurI%ۣť@b\vO9ѡD&D1[j`U ̸ XEE)alb.Rjb<>Ƅ/@fM//88R)U"܄QQ+0r- TW*_y|\x!멯%l 0$lyol3CcN#Yڅf5L%(qȠilOF,^x5%ODTN%-rA;- 2ϪjW_-^7zݛk6ÇNdX87Z&B_)1Fxܷ!Jm$3f<4L.eZY(/wR+d '0"[\U?zOOpbmXp_m]DخvXVCq[bN͹d/!m$9Ɣ-JyKHD wsjȼXTK,Ҕ;h$~&h AVcF0Jՠa7ѻL&Ӫ+m֬^7'E~~>^|]NիVG>̿yfQ^!)pZLt{ dj~_u&MΜ:!ʔ-cNZpRȌ9v1rrrުS.6PT["Vs!KXM*-P9 ΢MBSB-nqڀF׊u:;ZԲ}9! Ffsbdq׬YgԂ˿jկiS><o0~~wbbSJq2㱭O%d $klʈgEZƁ0ʒty70hhmQayx:Ԋl)"h(S;l2k4:ڎyF<ܙ!6Go.YfZl]o|1[] $ɆWr/&O7Eђ̝5bDhXذ#N8pOG$6fs"SYdyA`=ռN>L\S]q(vV%g; E6ߖ3Z(FXVZR!ъn̺,dMGRKsgdEGWL^]*űr;T:;); F`R)).]7U1W-:8y]+٫p2%83Mx1#)¹H3u+hp[U @qmd@b5XNW8@Ts}2CNvcv}PUێj#VDͳp-*%0%K#ӱ샆Pζ51FҖ|;$""U =a|ѣGΝ;'ZkkV(+V3f̛oiN?u^\ 87CѮÇ.wHxňmۙ7:رB=zٳBرcE>|{g6,'Lb}Dgmf)qYz]7Z򠠠 1f͚]?+Qy].$%%! 0 F) $&(TXS=a[dvrʩ'Ir>|;wY~ߜ?-_D|! ح45L<+CPU=0V;yҤKL&ȳ#F 6l͚5t9㷫W|qڵ[ly`~M76oڴqÆs ϟ=;zt ԯ?zԨ/_fge5mܘj!ЬItnEBۿBsNJ.JJJ[@ UnzΝ=jT~~>a:t}#qI#n޾k?Ü~G;~ӧcbƎi~\|_–.YRt鎝:ۻpڵuv+z9hgׯ_ի[7G'8p@ҥ hpܜu24Vկif[7og1cƎe-h4oXj{ ymۈ˂OZ*BQ#F=wqDcvүs ٳ5nܱS'؄h86SM=@ףΝ;cFn 1'9y:=HJJ S%k֭[fUJϜ9-*TV߻x;;+ !$"u=uTǎ]6/JK~rqc|6hЄexN8ѠaCFofZKO~U:=>>ULJ1JM?~+Wm!CM2eׯ WpUTK|1ih4ŭټiSԨQ'L5 !ŊjZ=~>b/(zŬ3S(˖. ZᕯZw~ ᑪGF}sg5ڴi3:*ŋUTYt9Y]>Xo0tqȑR ,^`ر|iϝ3q&pCy5Zd4;hEa1{쉏MM7_x!Բe!+J:رcyjH[&sMۡCz u11/^T(ݻvdZI'm糁:T7=p𠧧紩SԩJHHغui4ׯ?~ܸҥK0Wsڈ:~)SJ' PpjcA\00lE hܺu/?ßw.^hq޽Eؾ=-5,Μ>m+XYwݼysɒ%hԨъ+ 0{Ϟ?_zի>}g<5Es.]σܳgObB5W_qC8k#8h32v~g}pazz;v/fzzy>ݻvڹ38(h֭b+\ݻV<})keTS0Q.oRL&M"3g0 &Oҵ… 'O=:<--=--}ݺ/ڍFV/_!¬[OA쩵o<J52͡ck~S0B**6?еx57ȈZ=2k%eJ^l [&GۗSCcy{Ҳzr ]J2T/-v:TTzQ_ 02›{Uz#r7LFETΝ;m߾Çuԙ2e2'dܹ$''+Wv\zj&Mh>/ثW &>}ag۷ϦMGzßcǎY|޽{of͚͙37%%BSNg>}֭>|B޽;wpNj7V&N~v6ko!<P|rSIÆz<»Zf]lrJZ"B޸:W ۔U.SC'2x)&^7?!9ZϰKVɛ)bN뙐g*#[~W$ý EMӾ3!5/n=9}lՔkrGUVgx#z:R4cq|OsфOTUa?o'QP!FW &!c=n顤PҲ55K{)\,W: PɒtyFs~eMXXnap~U/[|ZΚL^5BnNDyN!߀XԘPRMY,c,ض21פ5КUTb !-3NКL&,x,SP Wn(kOJe:Q% |)@%ʜOНTCϪjnZY?VKhJ_uUP? \IZ!4JN?0q T5U]3Y@ !+Qk2!Xk|=K3m0m)Fq[kSt#Uo4Ly+EGh`lg575`tNN?_3Bj` ?[j ѱ9Y)I&ߡw]1ZՊ ?ua"0n6RiqrnM# @v -Kɕ%i⫪S}:@qQnۨSr\U&QPBSKU]\)r%"d2R)T FUS,y7U7YQՃ}*=AUM`Zd\Zi⍐7\"DcıkjmVcz=\T*J%U8#nn^drW,$"!LJ@0 zv:V@ e(¹T5^`תjLF#41 :+T ZUꑑ?oш``0fff.UکjvWE}eK>y$""bQ]vn_d2i4Z5p{Ο@;@chM&J Z[̃Mͼyy'--mݚ5A1 gΚeyrʘѣo߹SΑPtu~1iR yW;999-_)ի#$nWnqǿ߶-BB ~Ktŋ8~!aǎL,ȕzd/ܺeZ~oW.'OGEEVB#С?Xzm۶o٭۷BYYYw=km%%K"-Ztȑ>㦪ݻӦOgU۱:|!4euƎG EM4iW_j*--mՠDxO<B/_T⭛7oN[rՙӧBڷ3v hԠӷoۖ^zfVR'W,_ٳχ Oh#cƎݵs`h&N'7n͚7o471s?Bh4nڰ~|~!L&-[9ۢeS&{yyq4J;LUP-[왳 ~V\yM?i\nԠᄉwڙz o~tiIS&OuV:}ԩ=z8~ı?^N߾m۝;wƬȏ)j5g[nYw>f] 9o^jU7mNzgw~,cUm[n7)O}`۶X<55%55e5jصkW~~~bb  ,`+믾RsrϞ9>6w-[hْRfΚ5s,FyaE 4;uGTC+þQl_(:qk֬|`P֭d̕;}J*}lsن |6p`x<}+W͜1+((o>/\S_5`РnݺQ5}ڗ/^PСCxNΝcbb6mZp˗/o?Bѭ[[n'OZw鯿^f4W  <477N: .,_|~̔F~߳{UaJO93d2Gcıkj؜5.>N:߯u>yd쇋%?tQЀ[AQHFQd/O^b[FZO? $J.dE9{$XǓe>>7_ot:-\NxxĐ!C û;th(KK2Xpd2@FF#?֭VDDh(~{V?0.x_y率B 9w*$&&rBvN64(W*<>>>U-W(*J%g KQyzp1؈2XTɨGHpH&> w(///XU{?@U} -cQᕯd5+ʗ{_n$/쩩ǏkvjU*?e.K UqもO9s_LpWXhs-n?qbppGMn߁^{+/gvE?{taoթ]fCdddfc^|cWN{aI̺ Vڳg<ǥ-o޸YFoT(_B: 6` 6`Mx!յYϟ[&!̱#G 0k7nvzxxĢѬٸ0n1cρܾ͚?yٟ>}f*\vc?=G a 6` 63F {tS1j5kSg6ko).^uBVʔ-Ŭy3'<<<<<|s:$xܯ AS(";|5sn /NOK[vѣ8hݻ ,\.U6\bw3eVy*THXbrrq˔- ?]Ht&!(8xĉMXmrLȱ'Y痓VڬT*UAAB(55՜^N 6a/??7n߱@\ܿǵ=4`c2(=< 9EF|߯]jW]؜-??^=11q)tF:unXԩ|ԨǏ Ľܯ$'''''z']p zވQJoUTوy)j+t:jߺϗXIG͓x,ZtattzѤi3sqF /^Pn={hҜ]vÇ]%\Zw}cڿߦbŊƌ?.( dQBٙ\B5j2Mc'gMk~&i :)Kڵk {'cKp'yvsL?@Uby6m:nsyrV[x)~l s:#[90ɕ߮?_0񓧚5on[ #FFݺǟ`q 1: qvVVJrzFT|rvVƶCP&M?nP2P3`h "F 4Mƈ\te˖x޽{oߞ6o߾3g5ktĈ:pÇFc-P(Bz~֭.jA)J# 6/rk.uرBc2رcQF8p 33rcǎX"]~:t?1)?qqD},^aÆ_,˻tuVsX ]ۓpmNٳݛ&x5 Yrƍ]bEUf䭑}wzo;fLR[|]'b'ɉN(xx;GԹF>&lMk9U]XL~?\n0 `P(tYfٳw~~~Ç kذB(%%edTYSzatzDxXzz:9##0="ܜn[zze}c0 Ryt:ƁۓlHH0#fddҟ,GPU-p^86OKOg ^Mfdf^)6(nݶɓD$ lNr"ū 籟`(Xh0uZDYj 5KZ#FU>޼|*UfΜ1y+v~!2wܰP~ @szRR9LPPPa+t h:8mO^^^>}[Ilo4jU*B˗NxuB{?~%,&ĆmZ[o\N7.n]6mZV9CO?pU~ƍ7nزe :Eoؐ~Æ-cj٢ O] RJ;, -ZqӦ6d.I~u1듓sss7nDJ,iԨ+W akh4oooOOϔUWꙒMժU~FQի,bINxuB{_[ƍ~%4ྺڎ{tͼࠠ6mt֍լi 槤/_n/ď:wQԼ juٲej[Ǝg0[^=޽zmٺm t3zܰacԨ k 2OG/&M;6PYz~ƑQ yN޽l p$mޭkWF;utFӧwoV"lFnfI6ޯߧ_V1nM6-\m@@@]V$$ی5jU޽N~"ūJ۵kw{(PY/_&'%O~MTU6 gNhCh͒ƈc3ڃ9j:>66c_9~HժU=^π Ϟ?y[6o*B ŋݻ<}l/KLOt=zG$_Pr>}zJ2vh^ɨduC)8CcM/_LIIٴqSfMB1o>%IR#A *eFDğPň"A>}TkпU799έ[*G*|}PT(\Q=2rܹׯOOKY#U'OefЩs_~I/P##!% '&&^:>''+_e@P_weٳgٻNr#GBӦLY3z. =]QGpHHAT^^^~Uڕ̙| כg̚E̙Q#Fje@VӋg~=d2YQq+9y56ޚ!///FcN/_>jժzqiJUPPJK-~7ZSǎ+T1r$8w_.]jҨQ~{=saÇٓ*eEQh|b9>XWf.4 2 .U ݪ-_^ϬA +1U5H']TCj CT,+<5K6bL0BSBV$ةAT=0UX@*/<>xY@TSW;Q Pي:n_5_asJәg|9:֯nm-?w5^J?z!ApE~+=ztĉc'N?kVWXpsOr9?W%.]wZj5c4`."~{ǽ | 1,2ZkyZZÇ 9‘@ FHybP(<|ݻw+*d5}Ңngf9puD:qBIIiIɁ7o߮v!jݻuEkDEYySH$\h+}?c#CqBm۶(GQڵ=w.^l {aCvF&שOL:B(!!A xk.]ty@(LHHjdĕdÝl:4$p sî\:`S#G[vf,+gH26ZP]-}J ~NeXf̤V!TRZu˖gθOt~'OJdǐSr5,< $H Ak4sgH&F[f׬hxIa/c_98 ӗ/ޯe=4UUՊWZZڥKݺGE]PQQ14a(L&e4BZ5ɪ<< ~|k#ݻwϞ>kg|~u+GyR)5۽u\e%5332֮w6W@0!tԩM' ryGqhRWW_ YzWTTXT={@%'x⅍/?|?$򤤤V{xN*(݂B/hFG~uEop@?`bXX?yڊNWBYZXľz,҄FVVvIIFII1BHKK;ɑ,,֖ ʕ+66/^`0-eUyK^^:VWW9nJ"MMM]MM $ͰOS?{2opq?إKk/B/q8aCe0p@H&wlJP;ZS(Νm嬰 !&O_\>(([.nEG߷{׮{9^ 5%eݻvbk;{֬b+ЁX[ZII0uGؗ$YO:vY8b|>zTQQQhU*d-AA߿o^qw˻u9sΝ;wܻefi>ޯ+WA $H AR dݵ{w͛U&M ]]]]]]ss["._g +V|Y\&򌌌V[RSSCQTcqq e!4:rm ;ݺuwΜ^^~>(^AA޹pwmkfcEEOۙ!ܽӯo{^xm5p5fRjSWsMrEfc0 dD\.wx æN?ڷO%KzMD"ߓ̄BǏ7mI#?H$9c B˗#Ba߾}&O"^DžsiS/_,))1119UVypw>/ozwɌ uu?Ƹ J5kβM6l6+333 `Þ=Oݼ9u_:L$OO$LSSgڵTmmB/^9ŋζ{{Ok׽d{sNjjKi^#&u]/V<_겲o888yNP({`U8]oS)))l MM 6jԩxMMMq?8u*SJEe%BHruݯ{*MuuuF(??wg+,^||ؙs甕xᱯ$9ݓ\.7))oYy<^sf#''yRcRXd%u|4Q9"y b y~Q15LPi4%M 4%MFrqoP$؍ܹ3""bǎ111۶mG^Y[/TUQСñ',--Bǎ07WVV H~w̖mǢ  hNn!~\|V6mxa119tFYݓ7T*UOOZTT۶mLik l6[|Rْ'%YƷb999NJjBx<|MsIII#&r1i#/a-ot a6ɬ]_y/_\|Euu>CUUhRC߾}ZZX YZZŽ׷—tw>GѣNJ =֯o_jiuڷ7##C y˶mxm3҅BBH݄dddH=ζa;X#u ٶӗa#GG|1GVm.]qsr_ꃜcG$H AR' THȵG8VJ~K$Sz / (<|umgf[͛?Ȱ^,{RLɣGL*JC&Fp+1ahT}&Y?O3n:vvㆪZlL̾AVjA#Djj%aa:weK5PDc(KyE%FTv~Quc}2LP={%vn~9SMGX999)iFxllddٲ'+VP(i_q1AA{ -,6l l߾=B^u5"L5mꆀ7`2Yٷ*+ULUEYG[GO_ɤZ 4qT5h*pS% zi虳;o?yb_!עB ٽk q]ݻwϜ;fk$+'kIjh{{xn |*VYEGwϜɩ9ƍWg=1|z9sLY\cʤɓ=|ؒf, 7'3-M(/7?Ur9{}4XwS?z o,j/:15332֮w6Hj=@~9FN# -nAg|lBPagq êB^Lݢ2v?x{OnD),*Lȴ 7eecc 40;E;~]0bUUU$"uL DEՊy@|/dTEEBqӷq%_T]7@P"IHJU42W  Jt ed ܿs| ?F5Q5Ea! b;062462y -`i bBПxF?_B͜>ukqKLq %e73{ %cǍ}ҥRccӦ!'>zL"F!.a؅np8ݻu5Fɪg?ƍG=*y~K//**9k=,+3+k۷7~Ǖ+Wτdgg>  ,-O,o'LrP$mg7ӃL&ɗyY'+ks5tZ{ԩLu55WWAk7qrdya_{v٬Pqolyӆ꼬5bNV+wqu}!+6QL&]xoۚ#} ~lmm=d )>q'BP(8qI_ _hH A|UON~uㆩE69ShiihQ#G?4fkS&O=K[[dzO|zd&;˗1Ç|hk%￑ kʔM|qffk߿cǎ[g֮BG6n񣆦chrFqQQ6~+._P0"aI~3zd07?r8MJN;gy<Ç}f45}mOCSRSHgNϗyY'۰_?T<ӶSv[S'OH fYYF2LȚB=zx,[RK@ ;歸C,wϞ̬+-O#\2iТ WZ5p=wCTlɓ[`XFxJVKK.z8;ϗyY'0Zڥm[ Κ%NgȑGPݤ iii# CMtw'-msйaƎWM8ϒ%u*[3jOZ[uRo,q-R2 3֖O?vvx`{i!ÇÇ^W-uA;Gv-{Q\!I.@\x4'uwf^^ 2w(1 _#.oݺufW' K#WUUeddXB?rԨyyyyyy볐c߇B(cm|BT^6|_GIMϨkQu$H A~5kܻ{Gn8ɩK.&(bРA}|ضm-MPS8|(ͪ/3 a!/';sP(_nQnc!'&̜}6\z 90 {|a8֍(Y+@r)[W~C5 Q4ڲӨT6_ւV^kuu5n&jjj9YdٰukS?a"sjNVw7&yNAH\Oj]"F9Vf5h`bGRT $^_!ȘkgId2J)h$)+#iJt[Wa0!FId! ^5au &:;A` PTa,p262!Y@G:jf7$BFwkbldx^ݻ2B7|?˖vjkooP"h}zX`ÑZF ־i^=O,ir"H Tq*.W D"@T]oO<q%%-]2s׎oF_zaGzq3>n,~?߹̍Kxw|XlL ̒9"_ IDATB321ҽWted҆Lq8Ьj ryѩybttttttV^Ug~hHRSSgŊk"O"sss 6 5eT 8UJ=COh!9ڙu&?od_$ʉe!|MNzZi۶u8uH~VV0[ cy +--îϫ(Z;wybI^v?|G))mMMB$WWW'&&ZYBH~6h4\Ta2" rKUL.'t^<}& BIId2}R2BH(>yήxwkQΛ1 !mǮ3fN:}x==#\3{ꌙG,=7o͙7{5?/^738K3o;wj,{xs=Jð eS> ·6j5q)4e.1BE<&#,<@p3fΘ5'j% 1_`Yts|};ڵ[72,?!ӧN~ޜΣV0aԩ;l}箖nBjBN@:rD5B tvR{uI,[cۖ¢"%Siʗ5\dcc.C2 C(>!S'_a}^F҆B A f}#V/u ?h _a|"8+9aG99ߺsWEP(WoE_Aq+*+;b{!'g'>"TLIFpLM^=L =H⒲2M iy׮MN~{I::L&}(Siʗ5\b666%"bbc uxJxhcc-YÇ_.=ӣWN//5gxk; Zg>hdP'?SYY`0Bylb>~5i2^L!.)%%ϟ+++iki:EEGUcもE/E<y/]WVVtwɻ@>JjtujLY)+_pwp n7>>,?~9}ڷ;/਺ i#auVcH$Uq"Q5444֨U+a""*9"DUQQn,8$ԼCG; о2/F |;]3s8Uf500,R0jhh,YPKSFqbYvY# ѨTPIia^ihsrs kLY)+_nԏBT*EWW翛7Mۘ0tc7nS(d,b/Vn^8_(aoG_xS?{2tzD"LH'IB; Bn. $RFF:LR^;";vOH-cG+єh|dpHQqqQqꑆ2#YY ==cמ/A󞽙 xT3lHQ{+W=~d^^~eez|E\DYYY^yGήb8\Q47>@{*[V >xXYYd2sK 4%zGt%{/vҙogоVjӦz ݱkK]}p%˖ zpv=5a@ضcg~^X7ݺcWAA3Өr85#"9R"jG.f]sa_Y)+_OK*=yWAi+--Mi!*LhJ4%%q:Q^}̴I@d?(<WD I{[x* OU?j)`wh7M˭BqU\DbQtuuLO*,"7r颒2eeU J$"BUVV-,.={:TMMUCCC%9@D/!0Ah i`!2KS}4}N@@OOWI >q ^P<!*d2Y,(,|*P(" :CMMY;Š3-@T]''ek15b2J4z"!Hht%%:F".C n-DVV&3 w`d|1~]ylL H$Rׅ!D"D"Dj?X]񅇇vqxBGۛ))sg޵k[ٳf=rqv8`gLHd?`@]-YRUU%0Pdb@ $H A¾!Ը|('ggѣ|sΝ~;lټ_p 11!!^3;NEGGW ;oS  A $H0|!wQH- @勸|yƍeK^U0JYYNgeeJݻw QZVGөT`aϫVSUf^xx%sF[VjT> w\mm)҃ 㓕ejjy<Ã@ 0617orr:w!VVVP(dX0!;#--P(_nYN1f=uhm)JZn\A %Oryt?À=uӬ]{:!VUU> 0{ L H$P$"d2H$?l @sF"ڴ1UQQҦ>'!͙H$xʪ:,6B&W E9eeJ4֠+L&Cm &H@%8\M's +C [XYXwpw:eSgcM~Dw# 9Un=HDbaARP]- 9y${O;J(Jn߽+M\~vu /fld(ð 67~F{T5=@0ʶ3ǭ(/0QTQ^ql;I An߹+?^ր z&*DJ8kP$ L&(ϕSTSKdx<%%vl񓧽z!^~.1(''w"y)'(o 8l%B]bb䵨~<&OESƸDF]P(S&ǑEfL֡};dX|$ψ+WKZj5rĕ;WUUul>FIְ% _czVv;6o _ ~)D>|u⓺uNnԫϒBK?|TUU4qP9H^xCǏvzqqɉeV55OH=s6++[MUiԀ0KKKl|*8~q=EZ!.Z{qï#+@0Օ@ OHTYYi`ԪKEEaee%&՘\/^:dv loc[YgϝG6nB@(8~ܗ’7oqq.N!^#5^2 >QƳoYxVGxl-7° 5z.aXLl,L~ aػwl%q%;;'`+߼yWVrBwr|[`~ژL&BL&K+ ISS|T*DžKY/]0`wDpi /?L[Xqq~]n4pQq>QBiu^VYmI3M̛;KL 㭭B'V|v_yK! fYYF2a3>~ՠ՘Hq8U! Q@pD"Ljman^]]߳whQsfͤUUU3g7lǿWMP|>JEQ`-ԔUJhߌebb`0L[߸GP$X|}}P^^q%~vs ),z觬bR۪qrSq־sfcM#GwmZyrwvS3Bڷ{Bo޼i׾}#ƎOG|v5r7Lw362 ̹s6R&%H&23dr$rFFLu0aݿ5B(Gi4ZAacwKKK3h} [G^xG٣do?YY =#cX[Y]r!diiyU+ezzTH8_YY9++o'OWVrCXl z)^Lj[5NPD۟oA:<td6fś1~aX\3g G<lJ8lh|B?ju^8| X9;jRԶj"lksמB}}Ӧ6b0Dw?]d?7LQ(c?y&:4Z;ErqSIE N6!t+:::fɓ}O6m#@ػO7ϟ?WQ^>wxU+V:t@NNNJZ:!'g%߲A?$'kji͙ے "ޣlwESe? 4ɠqdS3+݊6mc g sϴ4WӧZ$ivW `"H$TR^A᭛i5Xl [ـH ed $"ZrsP~7oݮQQQf0K^,U+_-B'VegggggZsfJNN¿CmkD`0z:mژt¼cmژ0 A36eyY),Aa"QyYi\LUU5oWm۴y5>3fhL>Zd$?}LN1ng<ϝ~ݿB#G=D8 u>ujfFF[3;w{@" &.;\3497' FC_]DR*6i>}˓i̝@Y_O0 u|/2W wGհ ?߉00,01&<WD I!ǭRz'Īºj# "UԾT01USڛ|}r2\D!P?5bpa"Hǃx޽A{޵KM]} ~Za=j``P!۶{0 {ҥK>z4-0&N\lǏ޿7Oj~~>|!"6 D-Ã@ 061'#4hl,SS[lLkBءrZzT]cj6DOOOO9rȑ0 ~3q8:]ICCr@T @=?yeLYVW#QK o%]"Bĸ5L6nzLG=u%%Q/ސ1 };l䮃G" ='55E 3?|"r|":_~A :!|#GPVV&~f :UkVL?ԧ];[BB--̷odaazFo^A;O╖~ <32=w۳sbQ5 &{zWTT>x/y)n"&f(+'~W:߾s!4lpuN}1Ņ`t!g>x!8|78hX~.+K6|)] υ]ճB!YYjj¢B*BHUU!TXTTnX!°/oRWWƈId2J)h$)KZiJtūWa0!FIdᏪH$mkֶmv/xx>/(/(ӓrsJ,D!cXyyee,zII)\z4STTTYYy95CE]QUUyBh}z!nܨz\,4?8byYY@f? A**ogj%%NNRkp> !ѣ;;d㰡cÚ0 ȂPqp *Vj[mVQjmUP*{ֶ* C@0Y$|=<>s=o.'7+#;3#+#MY7eSV[@V*CS메bMR2^bǴ7dJ)kW9OiO3]r\R>OsϠi83;r j yID24$x _Q=wٽD.ҩSNEGiZFo !W._8UcyoVnݺ{mXr93Ǎ[WL@|O?r{q&{__Z-z_\N9]-J 6j|J<^ͺCLW^w+RI6kc儐m[x:Kn۾nڵ~#.ݧNxRܯ%+롇'!$33r9!$6w>ϖm(:_ܸNxfLB׫!C.[ dP77ظ11.lNGa25ԩZ 4(x OOOL\NsqqwukB>vޭWZfz<ٙYr0z3?yS`U*t*ذm6lf Lt,[|\ -=ɎcnէjNWh4jM=Uee=U0/e4Z`rޠѪ)E AZg?r8^<+IWUju !G =yL.߱uNw߮#GXn^Ǐ ?zBhq5~ߝ۶WG#"'q);zԻO;>piwjϱڪ/S&^_r'M~6\N_4vLXgg?fT~Q"޾0X,G]5c9Yj_+"X4&lTk8wٯU cÿ]b%"nˋe2 חH$m\Do4h {-ްj+j_+wo RSxrxS~hHpF'Y\}Y!"ޖ狟\öVKJ&{K3^PP @}Kձ11ӦN^>uʔؘ Fo׭RQQQZV,Y&tySPPPTgr_߮cbeblX?_kzl{Y޷YӦOh4;X.7/r {bce2L&iw&Ta֯[ѣFѣmʕִޤg޷o9<=&FN j_XhB7dpPl܁_B|v dm/ǟ& A_tyK^T*8lh^ sbdggexE-pZlwxB@k3D7|]IIɜs%_-Y"Yڵkz[,ń/sTz?%Ã֙otgϙcccC; >n߾Ҳ3?*B&%X<--iҤIsB+I5Sj̬y9wqk|"!Yf66o׫Aj_]\W=&<ѣ ѣcçL>vl]\\VZeR \|c27}s_gϞ֮YCϜ1I~ys='ΞRA VAa Ƕ;r9  Kbcbx?.koo_\JL42o޼n`]\\\\\̛w_/66*:qBYɓ'r6/5lKq7ng/Xն|.+jb~0 y"Ə);w"ܹ}{ʕªn VoB}wwwzI&RʎAB(2 ƸaӦ6|~H4o޼{ RСDqh|]\ !0+J/\df9]TobfvӦM۶mpEQm۵kڴ)!i&|t17y0 [jEoTm}t۶m7lHQŋgϞ}%) 'K>_x\5{;;gggW|oV҄ -\HQTTt4]Tx<^nnklBjeFpHHDŽϛ3gނM4HOߴiӷkBI'e/ lll%bF1W'MԹ3á7蒥K~t)S4h X߭{aCTtAAAIǎ`0>4)''YӦMI-[\z5Ξ x\.2a2Dt;AaRL՘jjj7SYfr8\e^f.>-c*!%҂Bo2p'ǧ}BQZZT:;991!PS5`L.˓t 0L(kN,c6j0-/Oڵ[//{v*AȍIHT &bY-Z҅booߢe7~T@=[{c<` 0oaN}>,$`:("r3W7|1ޫ6Kյf윳.hiz2]T7sҡ588}ꔝ۶Tٮ eKoۦC˗}MQzʜyvI$ɟ}vo[vڼ;!D.ҩSNEGiZBu&Bt:7Vuk߶--W6rr^Zw/Ήvz).5mڤv] {w|ұ'?~)116&r9?n⭛oӶڵkuqq!|n]JJJ|B!iS7_9Wd5B6^}"ho-W6|ꔅ{‚kքӢNH͈ȉdž=~BP4qwƍB(?xJܩ1arBa^oҬ_}N/7!]CG`lTwнw{2V,]Bޘ/̛2ƍS G$]U![=*2| ('O _ѣޥkVI>\݆(٨<9m[̝ UҸ3f~ބ2c߭_G&1WO]/6vJJoˣ.#5!C.tsssss^CM6eZܾ} /iڴÂh+dRaFW9Qݾ{w߭OM<}~rW,[>Boٶ=8hЦk̚^):ܶڎ=(77zssr%T67lܯOoWfrHw࠻{c>w~1 |ƍu[cHI}0k˖d) Φ355 _Xhqs|tBȟn^n\QLUy-p?2{{zo?|XRJrJۧ$'[.j05?oپcgӦM +]~JMPf?~lX5kF[mOreЀ>ouyuc9Y‹ $BG?'7% Djl$bD,vlsq^6<oİa%ݳDžD…ķzէo|%i옰>̨PcѣD"wǰ0X$ƄJz¨-;w:whQ3Hꋰ+ךkkr|FBJJ|2TɴgY筿ݧ!֭[O^ۛ+%*;eI_~Gx-ԭԩZ 4(x OOOL'M<|UOӥ˨#ѽQF+|[^rͺ8'^;}{ڱkWn^NyibߖyWĩnggg߷bX&۽7Ϸ.&h5<[={\Lt{gf?=wyOLAAAR'vўXL.v^Y^jv䎷0@ÊjxyP&T \J1 Fjggkkw`y:oOZUh52qWZ٬4zB[QXBanN[Vvv )QCYYiԼGO>MOob2sJr1ϬZ5TM `-sp8L<< @$1PSuMb2;ԻT]+:4lÆr𠱰bato.=u۶m!KQ$}7̌)~ۥ:utdLFWٻO۵))t^_fM^??lN 7ݻk.s_Jeu.Ukړ'N 2d'NhZM232;pPŋ֭[ kW^*tpjzʔ)c&^|!1eU/]ݿ޸v^ , loOgϝ{1]Νu?={B[fnԹT}̙mۺiٳtÇΟ:|pȑvlLȑ# !G\_|q)1… 5j>0wC.XI&B9s҅bc7n,tp'?aÇ:xpTN7iڔ fjLFQK/YBsʕ+oEI !bLox.aXNNN...٭Z"deeя ޽{Bi?tvvveee]X[Ç ܶѨQ*MvJ$ȑ!CSS_C ;OW_IRTt.#}w߾}1r$]Tx<^nn'+:,>|E%%K.>oΜϧMuC 6tذCB>4}pPа!CzBn* ֿ[^V IDAT7dҥVԡ{cv~عscׯaÆtqI;v>}rsaL^gz]8D6\Wy5fbc&FLLR5+O&9S5 UZO)0,6Ɩr8HF)[&TX ת91"r= 1R۶<R5e`$l@7 EQg_8wBaQDҷOwa022^ԫoAwwY,!$-==v^ߧm[<#T g퉉 xАC߯凌vnb͕w>tGN=' Bߺ`ʧڵipR5x"Զ.BAs/4 $PY^d2 EJK^O OV  BB!!ƇLF1JJJBz{o1lh~A{tR5zvN9qJJ8yҧwΎRPP`( 'Nѭ]~㦬lƍڶ&o5b U@m4p!rR҅DqP-2s\b=gΝ?soA^ow0=#b ^ô93zzZyK=%.>^S메bMR2^bǴ׮}Xܩ"fy`]57X+@͆O"DWU`öa۰)@0Iӱlm[xzsu򬇙:ƙ V@] f6m|s_z}E6 ^] ';S_w4כzcU>L P[(Ѫ Cϕi4腋SakLUSVcX.  4`?6Iȉ߻?.7/O( VOБ#N<7}}GzʢRiC' 6c23oEvv^?mƗ_-ӻCt}q]A:r}s1\Mh֜yOU&oW.DyYKƫrţO(&׸QZ EQ/_V)U;u;&Xnrivĸqrs

aM㖇}8~lxLKfb9Ox<|j=*2|溡7tUV $/ZnK0 sMIFLv`j v&M bMS]'*[mi9fDG=>>p^6mקϷ+W|bX$;pPvp1p~r͌vnbRG{=n99,k267FO{)?fy>,ݻgn7}n3g͘bR^k2*))Y|وCߺM.Z{cYx>ڴlY'5-99e;nЍ'RR̚9}岥2Y}vwoO}޸]&,.?֝; Hj_?${{m`tִ$r)ʪg?% DaabH, tZG/nekkF v]BH`w.\L4tܟ^ 8|tkZ.n#}v)?yr?9c;ɑ xКb8;9 Б7~T'Cx-֚y0yxjsN%,w򕤱c8; 1B={\HEķzKk3_~dPC5UVVvBb^o?{l=P*iJ^" ޡoI%>^ P:;; ery22;UTBL&!ٹE7~ݯk{Gx G1Wn 67FZk/Uk4ii9s\V[>ްjz LRT\4gA4yw ozq[Yx>iy,σS&HQ,4hPeG}wPiY;w8 g WT}?8}QB;[@^ȭcYʦӣU¦ML<[l߹sUtyAAaÆnɕ6M xճK/]~gO˻߫Z5TMu?罹D-\L4n\G59d ===;s{U*tqMEEE >`,oh^4^"ݿ"UZ9 0{[{yULK^T*w ;+Bo.ƣ+7Ne&mnƩvviƛҮMq>oXK~} ]]]M=[ iy0wxjYٍAZ+Vi4Vwk^GneyAcbEEXw_02>zE-ü%cj=RIS+^Vefe,!6.nGD4ee9;;4x4@? C(t\5#x<? H5!|R:L&D H1 baLR5R5R5R5 U U U UR5R5k)Lsj@@k7UR5R5@9s6o26^v%4o4j%;mR5S|[۷kCqx7kx3{b1 оcCr%mKJa>!E%^|ܹBXܿ_{3*{z*Up@vN^ Ӷm~aX,k"̏r߮\rsuu]d 몡6 64?C҅ma.&^PGBߝ?Z6;'seQQ{ҏcOM׬Z??{!RCM8~7[N:)Nx5kΜ=WwٸnM7g%8icqsuRz!?:@xj>mzzxr$C#kڴM!=6iv͚6%%t< O9}lC\IJ뤲d*<=>YG 4~9)d &2 0rY@HUC-9|+og´􌃿]V^NQ!X&\A-tMBH~A!d֜y:Ri~CrBPH f{8bx̾6l$4pvڱCeIciټYӌ̇z+rphѼ9jgӶ#G*nڲhڔO}ڶ>11[C,~rX,\-D \>~GGw=p]VN%%%],WXlڼ^7ҩc+u{ 64;;rAo y#_ZVVoݾ5իuO9qJJ8y\k7nvoܨmoBL8qҸ{nݪna,]''GzsN8\ӼYt?%}޽W `;B|9{!ģU&M4JSgZh[=LHgحBGV~̹gΝ3h@`-d'vn3a&egz tw{J8\~]TJ&)Osxc&|lM_-[׵'})pN^Rkѧw/@ /`6}`B^zvEs{XT T T T HHHo6|" `* d6L&kB@.O5j@E$۰:]L/*\$t:RjsJEEer.۫RtOfDɛY/ٗ\W_! UXKחԝteŅ*e **T|ѹoRk!#Vi}'}߮\͊b(A|˶A6_;g̴Cݻ#A!Ν..ɑFϟ=nvNNc ) ή-LgX!%%%/1t[U˾RN0 P reF6vͺBH~~o5c\o0l-0X$G/&^z/| yƇƏp`;ux!>SƑ^!ķkA27307=6&=~^NѨl~Q0oIw7ea)d}S)ŚuJ$lժaC7.h=HM-5tsuqi>a0B /(*.ͫWTdy<gV1R5`M|>ck+9jVX,&ǖryblo4>f4eR5+OIxT)@@@@ >^`0td2l&d/-T `]Vk|ХH"a+t,_*U+.5H$Pwt:Zƛ甕ʋJ\ǫWZ鞪͈ȉ/7󋙳^x/FC7=jNחԝteŅ*e **T|ѹoRk!iUi}'}uy2LѨ(TF1FlѢtWzaVVR06n~~a!!߭vӸ] IDAT'HQs|>_T(PT553YGw 50,!eRչSc8!$"rGP(M?qFF_:OGDNܹm ]B.YdogGf|բh񈏥ҸO6m#GWqyyB0dpPzNվ~=zT(L}fStȉSml==~(riƑcdž ܩ#!~.>U'+Ojz+IWUju"sUCCQTRְQy  +.WM8X*]=;w'O߮\͊b(A|˶A6_;g̴Cݻ#A!Ν..ɑFϟ=nvNNc ) ήLgX!%%%/1t[U˾Y.B =J$Y93U sc! :vh s=qk$b+IcDŽ5pvcF<ᘜsǰjl^q^jLM\Do4h`,/*. Bsa|fkkVXkgg͛w]OZ5ed>w ++\$ 8uG/3w߮]|%%A}ΝƎ!2ܸD"~f09Bzqx nd|o_K"T"?'+Oj2iq8&j3TePT a0ԐLR4Ps[,6lF/(zgLheL*쉉qrtlղMG7m2$xpO>x*jML<[l߹sUڷh*f_\k/OBH^{c{yzUTi|q &;onfan,5fͭhެ٭۷{w򄘫&ms3ia8֜0P`Խ`عrYlv+@X,v\6d1~{bce2L&k,ۻ׎]rt:]NΣMZ]n^:-[4gXq_QV8NQQю]?lͣ05H޻߻ukB׽o112YL{ooMkKv+ :ˑh t\ݻ'\d]xy UC`0\nZj[Ϟjrer] ;&v^T4p{ty~} ]]]b@A,zRγ?˫C"ݿ"=Y۹cu75ts(rntԉyx"xzzN:Gw zW߮]Ř5̍FO;핹7|6~Q" B:iڠZ4MH` [IKQѨl~Q0oIw7e/ZOk1;>(2{KUTqyrJbb-+k_.  P |G¹sar8\k?80Ο=(mJux`vHT*_I,h:2L&p/:K$ }ljW+"r";fX U ͍d>uJ$lժaC7.h=HM-5tsuq>!ٰ n޼zEe0L6spzj%x|`? U ք9"Zh5zbrl9\.8 ,6ێƏaf I@]Ƥ(LjLR5R5R5R5 U U)00 A0(&f0L& <֨KDlfWt%2YT,Wp9\dk tJǫ7)+嗕ʹJZ=U_l'o3gf_^_S"^_Rwҕb櫔床 ^P)ˋ YLF.eJ^UA{ĝ۶NRu"?칗$՛?/jazF)ӌOkzFƼ2R5EQTB֧V./SP)4UjO.]XXزE9hvvv n3v?%<~I~fe+o^ 㰮"F|~QBR h\.dN7vߵ7X,{˗UJUNƎ p8ȉdž=~BP4qwƍ<9q-t~D[d!DOW#>Jw?`зxo]{c AinG>$ssƇ_X9qГN[77tUV п;O}Z*$ȈA[6nd۷+vh;ڷs͊EBȍ7IC;|䇛Ι٪8c&*%{\z~Vn/ \rկqco@2fegrH(Z_lOM7N.xu+;细X\@0rW}Z[&{sMhEbSY1%b89nlH(;zv]|D)BHAogfKxgBH3QQ2ǔ8kٸ0n# ]C099F<MFǃmX*]0mX<&8)j}|vc__‚OB윢(S^^g\.d*s}||m,:]1f}ynbҾRb'ӿONAHվ][gMH$^%%2SYLVj4#搋0o{Ű]oEmܴExİ8`:'[[&)VŐ/6o)((:-6ooWۼeYn4dZ8$r8T5ر@ x- ;Q/frBHXhȈAr6p3n=h@=K`n]q=-(hZ_R㳱X!3X蛅Ɠ*]BZR'r EE_S$zgapߛ7{ֶ@^T D"L?ӄVB2H$ վ}1O:9/9oL7|={KFl1V+bq/|d2o'Ó5iƍ#J0ȪHOǎI-Z7؄Ѷe運|P4]T\ܾK&A2ݦ]+K%ݻޘ0Mu{k BWX-1 'ټ$f =<<*>oe*r^#oνldjF_( Ji{<hC#yc$fgki-Y~ڞ4ylKPÙ|0ͶJ$>Y?<b#3fGwfzMpΝ=zΝ;obc^}_ŒǏ{vCHHngdB߿߬i`nn.!$֭^ݻ=򶘘[kx/پm+. +h.)}PLV?~ϔ 4l2оnzGdĠ-7|2wNۄ]_oce6!(1 ,w/;ö]ja_mZծYrXxETMAA'ZvT,ro[lIջBȏǏqܟ~rw>-BW[69s:^J Ȫ Z+M2F[]+X+jbq6[{doNL3QQ2T&FJ9F *v 7ÇasrjE<~huk %,K0&of|<՟}ؔyثwSNB~<~7ㄐS))zymB/]pQ f/<6Mb X<&<\R"*.)IY3"(:*}hZ9WڞDn$m*ֽ{ʙTB͛7J__1bU ~8#SlŪNs- !],Z0s_|]z֮EQTV u0&Vڪ)lMJYi],8+0LvQQmPPә3o\n;vbv}R"vn^T"y<YhY;{ֽ{ff1chQ\L͚ٽ}Xܮ]];wx{mBȪؤdQ6Gds8a9%aʀDD  FcZcnfpPБnjF:?WlmەJs>T[+7!P)h+;٣ܡyƓW?/3-=g !z={BˍԤ^h%c0{੅ PP3u3u t>ow]907&~-E`Oswl#b8b.2_ b󖂂bvF ljN,28B/frBHXhȈAK.]Y[h9? T\9dI7mWދ-޽!{+-ջw-5u4^7:n0{M`Ӯ橔ξGfAAֲ–2M!p B,4T zg! (td4uEQbPTPXxܹzbqe2D P,rY3> ݌[m<<Ѭ&ք <.W"2 Fb,<&Kpxӳ'+j}έtUNA|UCp<9P|HG쬀gXYwsUJ }PVVpY5@]р3i;\.IXWZ@/8qEfjdȪUԤS`Oarj oiׯ0gs]rOfM(O,v'\~uiu^{&?f2Nyd&.aqO X8"jGv~ֆ/7M~sR#tS܇VzZuŷIJJ,ѳ{7BM?:;emvyy/iMټu!_~JC:TYx& `'ߟ???FGsZ"/WXf{ s9w!f91iߩ3QLNhUL'N !#<\9&'..z1/v8,l6&(ΤeuΦby&@B3IDATvVb[bԅpm_eOɸ}yoܘOWX,ݫ|}}]voiiCcFU?T$3}&h׮mڍ/r8 .BҮh߮mW1׻fw PR`^̂y:/7n\8cME^xe1O>|J/j._|]vmwu;wX;:.Y>6ɇ](fKWqؑM[{gtT"IڷVhU# jZvͪ"+݌ 9<0g])@9|䇛Ι٪MspWT혻.| PAAŋ,--[SՓp;+Vr1I[׬_cZ[&{sℿS=G. Q^Kݫvݵ'6z }0g7u'͉|ramoܸIp}\prƍڹ>ȔgdRL*rbcFK$J%JRب'SNUU qro7Yw1@kt\E<d)&hLy7g;Y\@0rWʏ6T wn4lg;.rx`vz!'Ǎ cGt`WunwsׅSN3zD"H$cGvJ#lT*?Ί3Q]4G$u#bf1f3fg͘}rwD(ZfAa' c!4M4MQ]/iՄ2ٕ˖,_!',Y4~ܖm~@?!V7y{Lۙoj>>%}}5Zb2̶ |}|W˫.//1rMj* סvA<\baq#w&&*!,ֿDfڶm4v\4*rNBHFBLG5]wMbn^ kZl\hs6yzrngܙ.;I]x+d5%U6i|D,G pŚY!#+-aٯs}U:y1sؖ]:u#+yUVuͣZ˺ [x|65d }xRKH+\ꝁ<)v/^v_nl  @uG" ^bz&^ll1daj2~J_Y5jdȪY5ΪiY5 @V Y5(qfjdȪU&nq/j2B [ dBqV1\om!DȞ.J9HiV=@UdUF\.Pb0Ѵdx䶎5Uxq:bh{;,@}Q/תRuվlx !; @V Y5 @V PqhBe2sYCǃY5@%f3}e+HP+e4Lj@*n\uBv!!Fbn9/gf4Mkۆp,ܰ;p,W/]x)B@ 3X/ZRR" <(n𝵖<=%%%yr\E@UTm&bS@[iF@ j*VdG$?FU8@[k7tʺ|ŪiL Pkݽ;6=yTW_[WU8JZ\𐙙/fz]\~˗4 .kio3gv˖j@233׭CBBm"}!p6U'(;fth!:4&jBGsfۚ>}̎wΟqӦMVk HBBb1!Κo._lX;thb1!$rIڷO6k jJX, ?N=Æ2sbbұ?tSLa78@y3=4%ðn޼lB;s%K6àT=MթSNJW4bЀ[e2ݱ9w܊KK/nڼٟoիW/پms~~>\ry۶n2UrV+]{?Q#aFbM&lfLc5Wk_xǃD׹:u\rȸ駟~-_B7&1;=>}||BѤNsf' u:݄Im5<˽9ʦM?#/OŃ.u#KHLJMTz"1iW/㍉/]v^1bXBBө:^qW~ <<[kwwTrKJwnfg~l޲-^TvNun%AAӦ7N7흷V/tWgo׶$iiSko˽G3흷wfϥRɐȈS8[<a0,6Qlͺ<_ן KyV'@YN֝"w4 ĝ8kuWzY5,n| R_ӊ(BQlu~>/h jdnF,P?W̧a<@,>{PgXq|ZR.=n߾oc_Bڿy.^f5  AV P9K%j7<}|~}ōĔ;iEP%{yxpeR`ly"H PHĚ@/(YY5@5(وVpdȪU!^mM,M[ 5JlS>B("y))*U1eeeaBLzvs 1IIE]i?sSH ٌ_a7}-Hڔ3 0ӷt7t|KB1NA/km˰ ӞETGf`6*E07uQN)= t}G .ñz* 7& Ĝ+6#[ …R (J!R EIKMMLL(`LJ%SUTJs}=uFK?!>Y`'e-kjH5D(0C.m'l  ePa3hݮ)]e@6z%RBOQ#p VENXi-oEt(֒bM@meryz`\\ U|yW{x{y999Y;9/Z%a˷<˗nG(m6mXJ/ bl"h4@AyF?r0}g z١ a(hΫ 8*D7;\BA<;Bg1>F +j1J`!nA,`DBېuQ߇4WYt/IqO*$LX (1j35:ZT3&!PZ|jJz1E2yT)?/J2333 @R+W~ܢKhϝ?>AJ'@QEnsGiC4}34&z ahc,lb8 c]a+Ha]A禣?|8(F阦~:0>80:o^'?ٿ^L baMD5-KZvzKqe}K. ) G'Z!d{zy z5gl cǎ_m?ZJvxyg|3+@aMTqG>ZŲ5cbMѢVɄ+WлGpnQ¬K 1B # VZkz^#^ZDbdf>t ,j`m`Y?D mՆ{hџz&1}}qG}!TX7ͦ1cOZIOO)U(^{P-?͋B^7==MfBoOܹjC3y?3kV ~aϻ2u*oXuBBcǏe2CPi7:իWGuqh5WB;w6m 7oޜ0adffvЁ6ĄDHNN8ab&M5۷wڶ͊t O(Q3[i fĪN[t 6wD`V^!Xtlb(u;ɦ^lKY`O"@s3*ic B &BevcmUMU\~ 5\ 1QZG:1Hmkoo#nFvpp(/P*ׯfƌ7o IY7z6\͠eC' "'05%8J%!@T(Yg̞=;'7gqDijg/V(r\jRɛɅ#""V];h[X.豣X22]vߐ˥VIϿ׼yS'6m\rџup-z4mSGuUrϝ;""r23 ֭%@_G_B|'NL2ޯ[UJs∈ڥ6)Ӧ)r#tRL8!:^S><~єۊ|SQl-E](- )]`t2zm𲡨92a%+uOPxHQl j=Di5 /㬍/-y݋Fp]—4(aBD"1,gJ)Rf9JZp6&QV.] '|1Qo"2P 'RR)\7|e=~ٻ77'KPH$B.WSm~&/^l؇ eGgb>3O]#Ld}~5 =z{_O:Undvqqy&G- jRwroY:bN)x"Ϲ&H^SԆbN P:ئӗ۔F)Y( AOTͫ ѝM_5,Y}XP:w ҟYuE1M / Wj$L@gl#!K0Xhj0}EQbv+Pf5gbLtd%_1Ns%M'nDqi+3~QZ+QXsRK77WRPUJŏ~e-[fNGWIIN2—ɨc4I,?^ڴ_?}UceO׫D&׷w}Bǧ 0TzS l^Vٳ'//6>+8Ыw^{>tVƍ?3_4iM¸jwH ﭜ ~K1~2&( /=[J834YeY06#qXG13|c_lN̋%rnNrfrVa%՛xAӄY0@NmĒٻNFٲ>SXMi&uq@"xxxܿL@{EHٙ)tD*wD"ɣOG'T*Ϟ>o&V= |~޳1}}VR_P^6$%'.=;jXzkݹخm;FLzz~8F @{O*~'gIҠ of{ߞ_|_sׇtkqB% RbѦXbvMdLvQnftHmcLxoaY$fgDls̰Bmf\n82jkj6m98:ZlO8vT*tr)sN.iW.INzEY.n.^R7>Xv ?{P(^&&s{[%*/MZJ8I\|kڐv薐t͛7ۼq;gզCd2WǜeсU;ey-'H I}+Vzh$I%W/hqLUI!U* 5( sœPLFLF "RB(δ)R2T;%`?ݵx;r^r:3 g~"۝O 3[(a_w1:i18`.Zs* R֨%ݻ W/e19[$9/Tà5͇M7 Mq?w_0MٳoO;e9OXkb䵀R(-0rV"ĸx-9U旾` -(@,#u "ǬaӼz[Rs($56gjkjw57WP#6P* e~]jU___yܩSrRR׬U+ڙyښa]Ɣ/ =yt9+[۶Gi`Be(b F`Y3IalRtqK4  1 cj̐LG# ]>qOA{/> @*ȴj#a4(PjL!'Ւ&`pq Vtjwba!UvM`oE%5C h.888|"9)911( qswSJ+{zd6Į΋{&-'$++\9J܎K~UK!\;"MmwO 8f!6XQL!l0՘u{5u qIwتk)342QFR5?WUPja}шR|& _R9de8888_s"yIR/ A6F ͫGdLju6;/FF[T}#Ojo= &j4H\\Dhm-Æ@l \ ."yvb`90+QDh'0> Wd8W(?W7eE.\7VDI^u!?s'1s:m9Hxϖה:m\t>DJTHщ[#EŎq.Ȯ)jL5CSP҅GuTB8Ɉ(oa}c04B#(W54t}PlS=BQB̙ S8JYaaJW@5MF Bcz3*+fMr3%5p.λt,@E[AU: F:xkT'I,D c0aB43NP "JWG0X193a,2n"b)`8]aY@pS,X6$e> 3_ c 9H*2)>G\)b\O֟LjANZ86++$`%-Aމrֈ*.!%R[#HѫlZS#DnZJH)@|,7dʨ\w[Pֻ5!XS" kofDW1jEàOM(VHFjF ~&&O% t.mǢA@!` { %ykrQf. ~PU#E"AD;C"b."&4ȑH걔EtU#O6EP"['d/AA:ׁm*`zZX0mhM3Z f:,A&bd̐˂roф(i |^^^1 sԜ:b!5m}U-^%=XKtP"rYq@[5ۆHN9; |_ ؞"LqtVՙ^Naz8fvap}0&s=Fs;+мZB!̥.(PR 'u35%.RUL\7$U>ֈ}>!*lQo6~ 1h\$]i40طmeP"ahz=5)~8̈Ͱx"Vhkԙ|j/6(nCX0qkRBsx C9gHjqC;EMX^;_8UAm bo3%Za7c3M-¢]"Xu6Ŭ9u,ebgl8,R7.\ nf]d"Dp,#@pmt-+JFF|ӈňi}d6YUiM+O\Am fωDt$`G fl` `|g2f1=H"FILL$`۶<{ n5I"MSᬺZLVP¢0Y͛(,^*Y&/=YN ׂKVDP[#%)flю":*gqem1E9=[]Nj0K@߰M1E0mV6 ΥAv\C*TukٚńE㻮&yhOڢ.YDmFC5R̴5vWil:[WhJشޱ"J:"EqXo3lGWjSgJtE9_d]:zf\W@ &'dL$¾x\|E.m."A21F0rmD"v'"br#o1+O'"V1q$7 &D):5-566vݺe˖3>zܙVmC5K YWf 000_DOYlE+oGg8cmº.dnڔ'vHvI7^!vxMUM'ZF )JZʈ䱢`}D_^ի;;;?ժW,1;:8>zXjkFMl-`Yu.+?AH_vn.670yo :_NXaIͧM!f϶{71,Q^ rl11Mĵul6* Mqb IDATªyzAP;QD"t~%ww*U#;cpEyfk ޡXf 99aV|FpryCX7!57gη0)gL V2}=břׄ%څO L,X[0946BJ]]\\\\J...%I٬m¼ׄo9FA Q<6R→ӃbU0p*=L~z%1/.1's!LMp-,ΊLl.M")+mߐU%$G,᙭-%yU#̬>,th~#(& 'N W(B(^c-LM̉HLJ0J؄RDTL=-r:B3L[Z4R9Rx?8xDȎ:@Nj{lřKɄÔK +R1FY +pz_um3n&V -. S;0h"׮yO2%p?٢yA5ztC[7Z`<52a:uF۔.nBm@&$@h&6Mh&: 2!WnM43ɘCt3&LuۤD$!XaPzb a章~B: 155ao tړ0L*]&:] 4f,%o-u֕pU6+[\㏟xJ\|Ѕ w6mfok׮si| 9pku?KDTFimD&嵨!BLAI/NY"by2h6ƫɯ+l"䪉eeԋ?vXly5,k :D%@h ] 7J}K榦$inB 5V#'''Lc Cڶ޲z-4hݺ]BoTރqq鹹9k2 FP\8{&((B( 70rR'<A| d&/8%%M9Z-~7yE^ >epnBGLfjT*񵘿u.ᑚZ"1Ӑv@h4D\PPR;w,Y{YYY J#VV#BktBDK\µ sD>čwfckOG%yP-Rm@̽HMMpivM<ÍU\yǮ]G|]93n'߸=''a`HQ mћ;لkijJ6$}:dp7p !P'J6ѶشΖ+R$ <%mxYqADF {wZZj~~K8cǏcJƎ͝yyyn.../^xM}f?m}TT28vsTu5(!0ylbmLϸ|>>>ݻw!-ɓ'ONII4hP踸8Jܳgƍc#[  cp+Zۉr4_"CYQ1#bmĪʀroׯУG@ݹѤN6-%%e} ^7o|ѣ={6n^¢UBYrg@/&Ob hA糎l\5k>W\cb@^zo_z5jTNH$B 33^zÖkF>~(p"*XX,$\bQKtqFN0HR//7^NTɥSN2씔(_ʗ/ >T!|!!!ڐaÆmڴiܹPRQ›5k_xѫMQ1#X \rq!1޹wouؿ{xJ-u&~|||x̞=+;;{֬rҥ 2˗kFb >n>LSf6=Aa HIxPѣO6mhj_/Xlrt/tk׮կ_ /һw!C_~O7o޽;!-|ȑ#/_aFԩ-[w1cƌ ̜-0  NIN"|V'4kтxƍ/;nܸ#8Ua<=ԦUaÇ+VMx ~`ܱKL6w4ܥ ^lQ(kWM  ‹D"W8ь5o߾=nؐO>6|6c")))ʕ3ڰa}TԺr}]֭z'00099 սw-[fgeT*ԫ_ĉ;wvڌo~i/  ̝'ٳƍ|т+UjԨQ2eJ#  \k''e˗O:UWXV7mܸu˖c/]|7bĈݺ5mԠ)A`[7mC3gji=52a:uFAW sgjѭÇ 2o'O ))Z`@rr2uW۶k'$ȧON:ss紑׭]ѣcb"#E07xN" <ӧݻ8p_\beA[;=zt]'N3(4o..J[oݲedxxV\\\>n2lȭ[҇װ}:wجiA<÷DGݦMggsͣrK? $$dҥr;pZysNڴj5wΜ<:\RԡC-wAk FAҥ8~SڭO<ʔ)>Ο7N("?%ldwuk׮S v)mڶ̛WbŹh#vy*VHvFWo=o77jժ8pΝ.ժ;vhܸqse׮B]CpM{ZjUVݣW6Eo>sG-Z,Z?nMݶn~ɮ];w臭[a Ӯ7nlܴÇTJ~}͛NNJ"DsMq[7S\L 2> )138hȐŋ(Ν;K/^VVh}uP쬵hjiּY߽y[kEjQ~~߷^j|UVFNNN OJJU¨zD;֨QC8vXs#F?!,,N2~@Ϟ=c~д4i?g|󍗗mtA-Ǐ_zU:mSFȇ-WXL4qA'M1V,\2L2Y_ǑU+W1q w Rښߵ/\^Y=D֭{Ş={^pnݺl&aϺu^|{yVP!11ZjÝ[ߚȵ+V4QA#ٷo_ ds3v  zv*"`._$"nZ}{jڬںmNNN˖eV999mڶvUҹc] B;u ԩVZcǏ7"*?~۷oOteժUJӧ/`Ρϲe?a«7hї.]ͽ|rt1Ns!6npBޛĄ~ي+W._gq_,Zӧ qΤ;w|ٲU+Wҁ<}N4^3f̀X2p 7pF;[30 lۮ$ 1`1jժiԭ7GGE#-~;?Q􎓓 tG7ӾаaCJ 4ûw& $%%W}&MKg(+CvT\͠o&*r]BBB@@̙ Tfnܰq22duq޳_OatW_}7jdx~~СC 6,7'k~ҧwo ӧA~" -rR^i<~ts>Jؓ }C~,#ǭ AA~$EQJNzG$JB3E =BƋ^ʯD*usu_J{E1NN_('J T[ A^O4j¦s#$GzzCoРbJ&ŅWܾ!t ʹ5@_Ra5JΟ).u/WѷreWWWl A@p,#p!H{x89:V𮐟]\\A%\]]quA):m]3֮Yal,^N uP@h bc`BC4$xAAVe)< .E QQ9^'  ?vꏸa '~...O+E h޼E.4'-B5oֺej?^ѭ[mۻ  Rb;wZiè?xp>ܸaׯ_߷G`ԩG߸uݻo  H֩^^^1Ϝ5o֬Y1 w2,%99==RJ/~  Ow1:vw*Tg!%%% R%99Yx-au<VCQ~ '!!!((?Aw ?jzBȅ +WbW`8AAD8{\|k׬9st^^^||3f]BC-Xp.]$@3yҤǏT*m  ^{k׬iҸC?lDk}ѣ=zԬY3|hcQ&$$d4jfժ+V`g@AȦLyRp{$V<~ôHQP(._XFul AA^_9bAAD lAADh,;  p$AALh$   e.SgyB裢¦s(AADhFAA  b_ښ;\AAA5#U%$NAAD0v:y℺r IDATרV꽿Z+PEAAP[L0ɓ{0eڴ];wBAA&|myɓ+8::6mlۏ;]5_k~7jdXzu1<##1[˗;wP;F~gƚlܰF  wJ\:͛|X-0tnnᆛP,lGpz˾_3@YBzTȁ_ׯU\$1&;n۷n1ƹ|'N:$j]$G4׮]-TָnnM\۩O*U^=խ3adh'NjGeʔqww ϋ*E*%''U\e̙7oy-wy  H)DVsp?cxh/o G,Zacq;w,Y{YYY [J0zֵk֬Ycμmڶ5XީRJRRo*W^  Rڠk'M(JѣO~&ww999;;;@jj6<^[BΝ=;mn6@|5k;~~~  'dA^&322E W/q6Z^^ˋ/z6 Z7oژ_c>RT 07󒒒ϝ׽"  bں+-W'>{lt1c>M;+DDԭ]o^M5&7(bsկ׷wmh}#FyoeF2֤-:w*U7\AA4CeeN~BpNj iёh<=GPxձ)AAxH$+I!AA"1Sl  "[#  e( E/:3уo  b>.{ 5k>uZzZl*UAAyრ^6 Fq\IBPI +Uvrr«  rĄDb2OO/l AA,FC2]  qrrtuNI   A 5AAAlRfM;AAAE. ?X^[v͚s6m+#m菚5kҸyJ6 z]V2O<B3"l䈰b+ ;o//Xϳɚt(֗.]OW֭gϞ rCb}iFwR#1=N>vKx!H$bl[ yƀ+V/}3)ּ-8q޼y*a6oڤ 9k/|wǎ]h!E1̕.\.cF믙իU7n\*Uŋ;vsZnРc˖-K'Tk4[>|LwB{7yy͚5 9L2R/^$J{a\ggTT5lE7oܠ8zv ߿ǎA''Ss)pgΆ!O]=:PV/gΜۧO=BQHL mRm/@V q HI觫{޽z 4Hw%k6GG_|Y*}>ŽτvSݚm<<~q3I kpvv.((І;XJ|7o݊X]4 **Xs?n߶<Gm^fȵ/kCݽ{wE[7ժ]?Dݻ"׮^dd*;rAq|퇭_|yzF-_~o֭ĭllET\rmm۶|R/ZuKtZz9s>sؠ_ٻ'>U+WZӽ{r/Vb ]wժD1={RSRE]aOrs/l|ֱ&<m''j#S% 3zO2e>'tȵstttuu8`[¼F8wA)'~?9jT۰C^J;N=2,3OsԿW_>FGҶM9w=bGoA5jx{{{{{רQ?5f>>2bE?77Çs0:aa/_AڗQ'M$0. >s[ obgΝ=khE/YBv}a֡Æ/ZP|O޾}\H}F~g䖒2z B_qڄ+V4 ڷ߳gСCtww|v/[=bGo9slHH;z?]șg>3vB^7Hq3O"vQnݔ*UΝGϟ̙6n ;{zȑ}{#K-׷_yߗ_i%%';^^ }*T7A组IIdgrԪ{ncǍҥzrVO[233o߾}ƍRiffW ;پ<=uW^s)wr~ZINN%BcyB @ 9|Ĉ׮uyjٷν{ΟCMr2eʤ[{(:zKzzzzzzt6$ԩSdddBBJzK[&m\"OL_;v '7lDlmڴ]]/\OBB6nڜe lٲZo:]Zjy洴͛[jm;HA5j8x 99y]T]e֌-[b#>cC߄lٺ˗G+: 40aJnժe޽ v(jʕ+ߟӻ-cƎI=>$ j1Gԓz"rّa#tCBڵ۴9{ny`7ۇ>ګSMЧOm۷O4Zظ#H0fu/C9:z2K.w\ |B@efd$Lh4ܱ➶jVkN6c-SfM4B sիWqqqOi'cA=Ϟ=[p-% RhUa#H}+U_FA޲)))[6o 1±\<).1A[3idRմY7QS5662mqAJc',B! 6&44444OV56"s*oMV$RlAA5~!vD9AAĢP('-(P[Fˤh5GAbj52mE썐.%*3 j   z wQJkьE/ьc_gIC/gG^AA!_7!LDfa#r,!x'Ӥf9ʤj ~! b2iJM9%NZٯ3/RuFՅյ5Rdvغ}{Ŋ`aÆofϝivt|p]EDTPFoޯ1O[B2[T+&J䈩T(d~b٫O=},2y5<\xd &=VcQU?V @lQ6{C{|XޯZjRR6< 0Fׅ\PP l{3:|9^CE֙=[2S\zb RYQҵ[ys,[͙ݵ[wm_̛1\HA%DLkh4aK@Y`{Tڭh4D!LΩ=?wջ\fU| '8G3ҎllѹOZ|6-R9sãOYkrGGu/>}~X8%ǨC'yqn~ٺcQ{9q}-QI Ol;Fp [_eyqZC\=㒯Lh'eZ}x7xx5A LGlfR5_ B;u ԩVZcǏ0RJԡ}?dἘ!E51k! ۆϜ9~Æ2e MΥ=}'-V7ϟ%RiFZrfFZ9_M_l R]99~1v&C*[۷<&,sr3l}Pǖ7ۇceyq;w.9-Zpek,w/O7p+moꦵ[ L999͝`዗|x٠l ;vBuvv'ڷo_ۙ>sN7VR*Pִ['?[ůP pQGu)kwuM2S<+\~tg̴dmWoz_XF)/g{=ִiɺuc뱌a;/=gkתv_kzWy"ua$12Q(}֡=o" EIwTk@C8rkV9|pdd͛7WX sϯ]Bv̫Fj POOQKyU6TaB®,w(BRG +VX'E_ HNx^W+ w8[c,Ԡﱥ-[Jb<)3և8wܪݑSq-g8]f!g Rԅ-5_ @Νv :m:o"7JbO?:/BtZVqOǍw͙T*FwA^O 9+}BH{m:|‰/*UJ (:еlOxgFOy":Q.-HOyjԂFm0mXAcKv/HMHMX|Bd;/ukܽQOnsN7p+Pk"\Æ 6Lx"ve)6B8:عkM0:u>2';8U}B>6gLFRbM6aΘ)/}k|9c9ضo}s|]4Ъ0y~޺I_) >?!Fٲl~ko {;1jҶ~x;Ke{ }t*mX>_—8}J1' H P6*(#=UbF3vӧt%7&~s!vBjժٸܧO.հ9WOwiT8Wcc6l凭y9o8rb`^zA)yԀ|l% BQTKHf&$'۱ٻ󸨪g6eUdL,M4ͯ{ bVJLDrATrI%3M\0ɵ4JfY& b 3W'~ B0G˙3Μt=;JB褻ML,,:ljW( @MTF'D2yBP˩LBifSzv;l"7̪Vi~:Prcjjr 11jۍƭ_׮lǼ;ֵ’0P# L-ߕI(Rg55Pg*JU};O:w.>51,<.9QFr/TFQ6AءG>s53WW ]MO)Е{jS3fAɽmj$Rio؟lԢS݅=z{_HH721jh*)C*FooB>&Y??~|=yRR*Ϟ=klM@)ǔ?-\Xx^"8 0pƦޅkW̛;}v۵7wF1􏎎nݪU?x'+Wܱ? wHr%$8_-Ǎyf/ܴ͆KOK /R:(DBR DCv~Æm[[ܦ4;{ ػw!I>|!!p8yEtmqq.\r C뙙>:)4433CϏ 2tc9h"oP†=/NCNf͚U[ *n$)???x@)9'3O˖-}o]S\~ԬYi,w1s3gikbh@@^^^Ȅ ڶ577 4#WWW F7ӵFuJW߾Juv_>{n/07 )DBoջw7./{xzfddB^6D_ϝ[`oߺ%PT!暰{.iZ͛fnsML88$'׫ggbb¸P;'&) F\xVcG>tɓJeoooffgaa!Ⱥ~BQx+ɍ7B$]Xʗ:q˖YZZ޹s_/jh!I7nܰw:ܾuƍeKrDG9{挵uΝ󎭭-/؂My 133[pV;ۀ>kVKII9s!vvv/_6ٯys椧ϝ;_~|zyy3g(nNmiYWHŻ}v,K˺7u:]>C?x֮Y3jԨOVޝ2w#$I*Go߾#xـۅG~uaCv1cˆ#cD  IDAT5nb`oEEE-\3 :u6ŭ7sr%} Z˛8qE+IRn^#)ڹsk?Sߟ8oΝƊYn]NԩS~wNyk"'5ORTFWȇWM׭]۩C'4M2"zfjr#Sŕ+]{OkFmh߰W%oB*-??_=\EW$͜9ׯwqs;u{_fff Fv͚Çϝ7jΜ9ן:m???s.]dee-yQQ?kVb&&ƌϴhjQ~~yJx{3fԫWoǎB%|B3e_Ȅ c⪱w^pppM@)J4oUq- T鷊ⶲbZYYEXan^Ic7ofmcԩjufFFvv˼GacZIIPËF!DXX22O`ݾ}{޽={BܹD\٠N'ڷwo!$Iz+VD/_e6aaa;u*n O ?𩧞ͭaJԨIJE>jB8vc+Z 'BC/]$Rkf5 >`뚪ISܤFMTj2-19ՑR777wvq;խSҒ@û2i„'zj6gϜY"ٺA`]S) +++HJ.O?rժu !kmvNt[?a7!fΚ+IɆ^nSO_:gxwRuGG/Ϻ~{,hڴBDVjS03(|) 6J!d|g6oh_"S6=}ZZɓ;⿾@cGڳw7/3"Ç7orst1mܸlɒk))=kǎSx$ I29Wt}iPfOM!o3fpCGGLJ3;"iVxDܶmԩ昷~=wNnjGYgϮE%Rm`#SG>Wt5\޾gge yV!DZZZqqu-r򂧧gzz#X  w`o"AJ&??fffM2C'Mj{%11Q> QRUo&򂓓Sɝ蘜Ԩqcy=Tfuhrrr,,,J9c^^ލ78~7.#_ɓ7nxRA/<{fXRRҭ["#Fz.]J(0'2"#####cNDES-hڬ,;;;nZ];;,Vˠxȿ$,;tE 4o ]$&&.^Tn3vl+?Wر.\OۻWyzz?^n 7n`@@?{Oң[>znVkUT3%IζMF#Oܾu*;;[_z=|{l/zI'ڴzvЬjg&4!P I2Ÿu֭kn);w 7>0G?ؠV7[Y{G߲94r:.;+!ݳg y']Z~}z}Qon*2&fUHp/7FBF݅P23CiDF_~ZJʜȈz2 FNJ%˛8qE+IRn^^ղKӮ3>S&O͕ۏ;ַwoMcuo۳W/kk뺖o~35?o߮mƍ/\PzժvmZ7pBhڙ3fhײ'+W0PUmF+>yxx=ZO'O5MΙۯyxzTpYs7n>rNpB=tBHs߲uK=77wuWMR;^teWow>w )TAB )*B5jQ+׷bZYYEXan^I3lڸqUjww!Č35KR322\\]_5,oƛ7<+cZ| }[ڵlHszЍ* 6F:OP1I֭ۛ7-a믾MLLWl@_9OZJJn]yy>ײeZjܾ*f٥c8&&Æ gd +<zza"/.tj|R$I_xɸqn޼)Iҏ?ᑑM6gtqu=|ī^MJLNjۼ11gS&O7G9y ~aW$!2L'7OpoVk4MMHkWŋO8qƌZAzNe>ÆO}HOO˗/tBƅLPT+޸礉^\bEv(wFG,XH>fPJ榦?0|Є'L ӷ[oɹ}#F(1G''%=L{1fk))/]&7ʳ߾}[@]tɾA.]~x m ;^V!!{Mmb1ǎeHSP\Ht@Wrī{)ѻO)[Ψ*=<+yWX+}Ud!RR:RBB-c֬νS3?=3fff`uܶ5بUjw9~ RLOO315h :I+mظiϮ]};!fJ1Nxú%!Bu%cSoo2˯QRXۜ|KkSSI t+Ș֩kۯlmT*o:ǽI5õ!C>۪Ռ077rBBUXEXQT* 222f&M] k]gzzډ'4 [@)'-o޼:&)S6nTnDRzܑ#GVF4PlmSWٽ5vǡ j4swmbb2b| :4Oz꩹y7i"ĉ탂^zeZS* 4077wquֵdkP.|fJRS޽[1ws _|Q^5WϚ5kӗ_ !ٳt钕5B44jP~dL)666>|PG 6cF޽aߠbQ~ɽP332]\\EEQjy5@9n" {xgHgff~^d9X !,,,޽+//_"z- ة2gkIH|׎133˳Bd]nhwppHIIy'ɥ_hI>fß}ۯ! !U%7/kϟBt.tG&^8Pv{ᅉU~F0׆J;pNT`d J}ꉙi ~e*PҒ$[CO~dGmUFI*"3QE4PSZI20pcbrJ!nTG M9_bCL'mUڴn. h43Okׯe˕+ٮ-]v2yrnnn?~X޽6nԾ]/7mPf'OJRreK\KI]{?vkVǜM?i?\N r[n;{ UgkQoU*<"Ưv͜5qVGoڸqy6663fܳgwWYY./XP{C@ 6U8OH|ܶ"XC\\]np=<<~-%{BIzR,rbV/]dGΎܥK(@u 6J^Y 8 FGG䤤F !>u nn%߷yOcb$I)'p,G<0'2"#####cND#ۇ>w.]JjGpPP?n\BEN'(|l()[KBHRu= v ...=uӫ_jGx{1GbDq@ Lv=~k))s"#zvWuj^^^ !U <$R*Fٷw@@{Z.RHHȐC;vGGE S~ϜbƟYnlݺӧN߰Zn%tF߸T`##=8999995k\۶VVV&=rDnWՙ...͛gYؼ;u}J J"{#/'ˁmޫw"s ,8[*Jn_bE/[fckֱS'!Djjj޽$zRYBgdkC.RVVֱG:rJʲsĉゃ.[fiiyΝ6~~rhI>x@ƍ w]ϱclƌ~ƍrNp>OU~"7z^] =܅&2|_˖~-[Fh4rǎݫiF۵r&ʣ,Q7jleVk+K$Xч#G251_{?~͗W>}ԦͱGO|f__IJB|tŋw߽_l'tBHs߲u3g>5 ؔ5|{111+|zoss)ӽkWϭĬB̚n(/۾z:ggg!Dx7G ٹKJ [?:v,>>hl蕟XYYh{/C$&&6m( òcRUo&BD'''ݷyOcb$I)'p,R$FۃB\++:u\vmڻaIIIn݊/r"fNKKKKK=?`>n\BEN'P*e e'Ĉ|p{7k/\v1cǶ{eЋ?ZcOиq}ӧI&!!r{=ƌԓ.XtQ;dŵI^ז )9eࡦEy3FٺqG_J0`V6|G( @)=[PNrVߛc(6Y$Tk͓%[U9F ȠUFg᷌@Ewl T{pJ|9%lʜꧨW M/$$PFQ{W +ڨa` cFo8;::uV\ϯsǎ?AGGGwܹS \vmlDOvyKl,rfjzfwN ׯo~*!1ekI>f9[30"e'BbqiUE޹z@{SULTJO;n +7ofmfoa潩*yy*gK42U ʘUMNXTl}7oJ':^eqk+m6N.{gq rڶᆓW pKq @5:!s0 @5֢@wrNB6Ĵv^u7{ K#~Di{-cW( $c;Z_PpQn׮\b-5v8w;^(U^ ]ozݲ^~/21i%ùovh`KBS ʺY+wĄڅ}gCc<|Z^Rq=,;!S8!o^0l{b%#|׭L;'7y_Y% !ݼݚ4']g]kֱ})8s(Tl?"Ϭ߯CC?@[;d\Kvl,HOjcXr"Oj^צ+o-΍|FFDK>P2e4W( N  7CK. [TlT2e @5* X Py]VRycļHTlT/VE]I*\_`Tl.h93ʨ /{f{f0JzVguPJ.\h؈S/عdk2Үu#l ׅ ژz{(/'Np_~Y Kbd  ]Vڵk?ҬBB.*bff[WqڵϯU˖ݼySk;ud&q+W/YmEFDh^ڹsk?Sݛ1'ҹXjz=1o=xȐ]_#y]_=xȐ!C9vБ#.4<[m)c*~׮+ʕ<֭;} 8,^,Oy~ DEE͏0r(i) t}}k8t0Bհٺ[nAA5ZhWLJ@+_rrJy=KsFm[%o799eАaU_|ZP)1@EP2 [dkE*|f%`fnh$ A(TL@UΫү8uYGLNN"e)cbrJbrʁC{74a"CDReR^qۯ^nWjצuCw!F ײ_˖5Z>-?nBN…Ϸ}if>ǏۻWƍڷkMOeg7n,_ɓ;⿾,xҋ/{|2!Dbr[~H݄+WD>}jأ'OKK+A脐!e붳gP0l-xکŋ}(/>;"9%tsqqILLlڴii:6oiL$I<8eΜ,k~kgE̞0@nWҥGv˳g%%%ݺu+2"ǍKHJ%@'Lhܸq>}ӤI=hܸyB6fV~~ zc]]\KlУg1G>䢅 /]FM(|JNWrACyo|ܶ>'IlsJjOɕ`FVzzq P1 [dkE+õcIe4kF ǭ ֒$[ĸuSoo֏֣{ݻ3ٺRθ>{JT)gϞePCu 8p@` Z6"<_vbbb ]Jҽ/I ]^+WBj2xܸ7oz{iSΝ}套.^ ,^ܥS֭ZYZn];wn7}Լ`Zۻ? `{N^bE+vm;r'>rƦO :ȱcqtt\paG~cNf͒???p`zzٺuOZaÁ:ݒŋ{f~ԬY;j̙NNN3gΔ_4h/4hbg|smۚ[YYNt#""\]]-,,FuƸg͚amc3} 1vnnn66No߾P&Z=lѻB8p`zBdddB-y$Iǎ3ws,Xp۷n !T*a  wޕ +4HMMۻB$^TjQ [8YYYǎ=|ۓ'-**++199qB$^kkΝ;o߶MK.BЉ/]Ν;mJ~JNIWz7iRyڵt.ieRp!!pu|_Ȉ;_z)66vKl싃-yy3QFFF&''߾u+jhaݻv7*mP_* _2tף׶sY,IRl|۶sc|1Agpuu1r1KI9gާDS-@oȯ!v|ejj2nؤ丸ff'O;𸸯;1jKj֭?rcpFjgv yB6j5SՂ }58PEݚ~._W_ş;wnu묊Yው#Gٖr&&S٣~Ug9ܸq#f'_nݺ~Ɋ'Ygч K.,ؼyդ$Gn2ۂޫW"`_Vv.ZP9^_o |u''"7׭SO8)϶lq$s^ܯ϶lQG kB ~ sNsn,/'%%:1rD=;zvFݡCrG9]=;ѣF>|PlmPoϔ"r*ZjɰT[c UztekÇ^r' !$I$IPf͞4funn C';.$///!!!$8@>n]N^/_°j ˎ77nhhBԫW@qu R4AT*U5j'I_^`'n^= -3æ:4hPi7SǢ wVj@sax-_TinnnBzz {>B%ڳlРAJJgrrC5jZrZ~i 7Zzvbŧ#G wttLMM#tx!Dl:@^ͷmWq k)ayAc :۷~k?k߾]+JNNvuu6jN*f#32bVԩCՂ'$5V |]ݻ{v `Nί|/@?L7}}>߰񙧟f}}}ywmow !ڵ}.p+ 7#,͛>6j~$}ԱC~}JT,Ee/99eАa Y-h~񹻻[%oW%&%ZޅZ`dBP]255ϿǀZׯ_W(T %\´)TK0RSO?k`fnNfvt:J%)c7 T ǭat66n޽맟~Q!BHWc'v6Ndk({aQ~?PԂJca씞y𡜿0 U] Xp 7PAaT ǭat i=; H-dfnVn] ε sAmPBQ~L Qܜ _P*7PA j¨-a P7@mTCTďa$!tZVe(j!D6@mYJfat:&MԭhB&]hj5j [(((+>>wrÀB*Is?-((P:?jRdk$ιӢEw t:vi4yzɫa~B6@m@EH^SN;9LͷɱTT P [R殾@,^u+%6j{1P6PAFY}?в{O_a|Ӫɵ!Ji앗_z≆ڨ1ʿV356ʳ*qV<5Uyr; Ly_ _IvΖzhVi߃6817Z9yG<6l3g6lؤi꥗^2 ƅ~+ !.f17IDATLmMox ^Y޿/}飧M=gݻO]SCC1+{]IIɒŋ-~i3M6m\?ru6C6817Z9q,\B!˖6Ţ!<윱coBdeWTpSBE^wMc|'n"rƓ`KHSvOJJtklښw!_ѿƣo>GΘMx|6|1#;(GݍB|͜vuBLm]7ȍ鈫s纺:cϖ-͜@'N1n븦Vq|ֵk=6o~S}z'%&8a1b6!?i̍ !>ٳf].c$yɧnsq2\;Gx~li z??>hyÆ]7tWrQSLru,> x5|sFۇ}o$i/pMz0@_K_^zwg׽wOz]ǎ۽{]wN3Z8ƆlnhhШۀEfc.]!ʚ636$IDBn4ȿ>c쉋{xxĖ7h}ټÇoӦ;GXxj_ZZڸ8rƓfKHSo6~ݞgm={tw$'Lf2`!_Zb崩SWdɍ0航UUU765F׮r /,0~\BBBii {zӾԠYnrr#eW_e>c{!+/b_8sW/=*=h9I%KHKo+^Y;izZj>}CAUAEy+.-X,,B444Y'~^?hU /).,Dᄑ[j7Dnjͷ}5 7pR"xF;{' IR*,kXVRI"7@nF׸K8Yvbܞ(D(ݶ-nʲLnӘ!ż5]m9ro٧O!й[!*+[fEq&6InFw} 7m6hbP[#m3T|5u$E;:yoqg M8ӼTsG~Q5iun{e$jkT!tH5 ^ߐ>*֪8ڣN555ѝL4uMm Фu! ]u]5ZD|b\꫇Λ?SS[k-%ssVYRR|^0Ͱz.**ēSoܯ_ߐ3ۖ;v̐W׶yjk`%V(VXXhw=wZ-?ݺ5}꯾zѢ%g k(,,\hW}zmV+~O5B9o6k7`@!Āo;&+k[ssb왩u܀]}7]tB8NIIUUU۷ϝwLu:B飧M=gݻO]S]znjaF彿yށ/2yj N_+d~rNZڵ 7޽v2ݲeŊG%/C?%ԧ pމSîj/{vefj|=?GW؟;w|KK2vnF~AYs͚W4=t>l<|谱-xy4t! H6[hA^L&j?y2er\bLgϷI' 3[I<ȸuܿ> ?A@bM@z(/ru5VWWܮgzgY8w씔.= .W#GcccfϞ+ !dYn<~m ^CEeB躮$I && H)g왗wUCyg\Q9s=kF;t@s۶C46Ȃon{q쉌qq%)M_zk#+1=jmvN^guu޼m۳sFt=e^:q<6ӡׄ\{knz}zf6[|oDw/e/-[QVvvLcСaiQ޽E .aM@{E]L2i՚Wʓ>kהf '|էwZ HԔS'ZւEKbvqO\z.W>ݚrna>oμG|;~*IgVTT&%%sϾ&Dw#"_ǬYu.*- ]># ׏q|f{^u͈{#" ]n擛V%6>ykZHCm lB@:>p"(UQV[jbգQ"Ғ$$IlH5@BwC6{XבvWRogˇ\f]nenn,/ :jsbm˵ۭ|E2e_5Yn,+e 8FA?hzާO0(/̊Ⱏ*㳌S*kjoeϑ(wv3PhhS'RP5GTTVVՆk@<ĄxgS:E!\' N#j@yvaKR:*"qX&y-V3R"eÈ8qihY2N@2"a'c|{ Csň]))f[S2!hkA=Mxt%y jN x"D99mN6&Ƨ'WD-Pػ ///+++7/En^~VVV^^^wp&~^*V+ܵ{} ̜9kvBb±ߎbOB+HD"V7zFfOZ:IDBY2/'wڼθp׻TwV0_?X_ h|zmp.h9ex11M ]]#HՀȏj[ā~.67PKk( 4hފ heexzVfF'JCHOOLLPc2qRtZt:]zzFktS3?ɓ/'!je..ĩմ Qo؍#D31h2F ,L ЎP $/aҙjk>͘<Ս4 pU6*1xF A D\W.yrqWÔXt^ޙ8y)rJ+fgg_61jz :9 N T㥈 M-i++#"HiEsBS,17\Ry D1s41Οq<ԉd0yġV쨴}$]>,E~o3$52T60Pe.~[QVRӨ.nKήJKɓJURyҤ?_Pmթi̞3aGo;JI{ad{5?ˊ/+uɂajC'!GL _W$GBNLPr^zyyefftzL?gޟ !&Mr+:??oi租}&R%AU}{T*(w INN0~B6nhWmw 61r_SNgϞٓ5 :m޽zO6=-5`޳gϰ:wf[:b&ڨN"E!y? ?u :OH[c~mB嶐&Y\a5cWbZ p ͫ6*iS11ML%),=Mb^D0agP%590hZ-CeeeikΙ=;KZ\V繹eee:L4j'D,|쵫<gbZ{N:=iݻvsHUu{nnnC'|4JOQŻ>iY+JdP^zM X[z?k5Ox·vmXrU`6/]jzjCI~n}nV"#(2~-F/%u&|K43_Qj5!rRBELFVV aMLvAE$yFf<zDe5q[m)OZlS-n铤'u&j  |Tc|?P\CW5jF ,,'7/,,QQ/Tk|:_i4LN9ʕ#>q˷W9td&v='O2]]}ᅴ]tX|FFHT?ܼy+(>GnظsBs)_ lӶj"Gׯ/zɈ#ݲ\BիUK~/M4iԨNׯGFE=Ï>߷!OgFX鈭5"goB:X3 g-9ň34[eYZxaL?i<^9A*1K`4όM[;s$rEIDH 8;@jKeCэ a:1gm>޹g4m'M\CEHtB(6V7Eď V. ( *wJz??}8_e?{*o[BB!Iqwo 5jøػĮUJvvwNcϵ}kT~W\f !iϳB'SY3 Yx:w6llg]ڐC\\\5z옱&C QFJ[н{wRY~}Ь9ows!oߙ9sa-2HZXb>(zD'5G)O5 Vaӈls-~L$he7nD|ҚȘ[d.oS\-ӼXlH-Y~=-25 ζD-2`#Bp( RY[R{iv6'OOMIf,^k(YR$//OmL^^d&v=!!.*ej:)1!?ŐaDHK38}Ƨgϝ%CȢ=?JLHH9`PPۍו>FlDRyVyvr@:Nʖ+P(L\G\\\HJ wǬJYMjj"R:b/x'm?'aFMP224ahZG (#r w-Ɏ\"K.#T0g&v"#ԧWR2dyDx%&' 38߀EzpIeJnڴ&_ըuzBtuuU^q#//E5jz+6y΋GUm[^`JW/tN]N޻sVoӏ?\\sHTšqkb(5\ /Ű謝ҢVTj9*%BFK*iq1-Ӓzښ^ Dm>&Dd"hc}iڵJRŊ~ x{;'9/ҳ]n`o^{a˕+mkֱc3_U?e,&y[Έ=摁g@1|Qy"FpH{k>a~ %oEx=JTTrYBqgH@$M|Iݞ4RTL"""֋i1=qz(>1P^VMEZ>>e<&&&!e6nܨF*UTTI΋y2#$++|y)5<ש] 1 m͢c6[B^l+ TTOjPu yHzwخIi+d3K8FL==WO5]_EI4h^h.*UReʔvqq_=&yj)OkikKvy R!W ."+2_&GԂOTBEIYiĴ<-S14Q#6>ÜⲼ;,pHb!ߣC{ѮL 0QsJ2#Ϋ\DwxNIJKzmXfX< &,Z܈tvQvRrYZO˘LFOF 9qb +W}$_ّ#w!gnb.y! ݓa@b"XwFv<_Bj D7 1|/~mƼ]2(*KMYTrT $X9B[d~ɳ%5%]GpEJfD=FBք+Q,%"/>_`b`vJFCy,?hzbF &QŒDdYg_W#4 x9a&нXGeӸ2M)hdc+*+gEq+4.. Ch3rzX?IZ+Me,w6 !py#:-H"pk hƼKTD`mqt43"nH<>,/3 c7 !j1Ʊ)uHY"bĈIN H 8Ȭ5D,+$`'-pD,koEH1SR6tںBehJo<>DP3f>m_)l Rׄs Zx'3Op,b&Mt61fa0P6" }r&OD kvUtWFD?U ),%ݑjrYf1+.|PO#!΢A9MDaOߛx-tMѶ@QBdEjb| s^`@Q+s1-o,krgQL#V(4],[9H)ai5ߴ!BPa3^T2,^# R3v0’Vj+" " _9hjz[,-K]IB#f#6iYb=-5<5iU5X$' Oj7 ٦k }Z2`G L^1,#@Tl1f=|<6oAE-s];k(", h }%A)6|7d!ZKGDPU#Mĵ%kn!#X؀- \D@Ԇmg 5ed`lft=^@#%Lmujrb2I]W:@_eA2K[8U)rZasf.x'˔ «.JƼ`ٌWəU fAqEL=cd^{aR۩wbyN| 263 JB&96OB\BG%AU]) [{ts](P&too<0љ|򽗈x[rq%f6! 0¨uqeȘBZi;e!fmQpiWiz5eM#4RTU5'!G^w9_ )Uq^sDD=bE&g{6{3C ,H+h !vվvh+i_9X"s&?~nZ4H˕@m4RU5}Lz^癤/V쩡kd%C[C{e]n| m† :21z?օ(U ̡j'2'V˓QWY: u6tIҨ勌T^//Y[;S۝h;~ bk\2DW8Ob>2^OyJ0223Rҥ2r.Kbv-Rsz0Pu-M'[@(KTZ~!]e)x4(XcFiCk>Tˍ.Tq9ErTŇ*דJUIE__/"ۀJnZ)!xWY|1c6ҕ1M'%ODsԌ C@MzэX_, ho-&Zʹ8,6HfiQ;Y_SEWU]Q+U| fW\,ېf!WBdJr¯L*WD@jYF@' \ IDATE oEV|=bȩk6SKz&F[fƁ\HIPrٓC׹2ؘu1#m/Cj>9^lF@ipS1jQMD5#^H B 0[S#%dN3Ԓ* nJՊ)22q4K#&ш/]+ժUri*dVoIfB_R <F gbăYHt  ɣ$Z֢2:<6dA:GW MY"%zPR +ytWǴL\bLLhst-p+1ŋNb5z<M<۝g}{ ,^mߛwFe65%Ӧ[֫!xvUTܖ͛ݎ'K5KyΝ/^ 8Z5\Ne'abr3ez$XY K֔XFf\&۠-xa2l99RP3&!>nݺΜ)e/8t^^cǍ?r0 d9 ٳ 1L$+be3 ]R-j#5eloܵC3%$Yv=ڡ`^xԷf"R0xMYrӑZ3X3zȫC8AlJg;9PὈ Nb_lluVm]YI!g-"+ U+AA:^rFU5m`9˭%Jlt̤x?edgk7iAPU#Rj۶Vmi[y6l-Byhbb1i*9v+-q3؋G{۫~Ҳ3>*Pbo\]]}]v]pUՄ#G߿?99J* ׯ+غp$&7ͭf͚/_2eJ`` {_~Yn0+Vl۶qX87J>|w5g2{ .\<==SRRv$55/hh6B֭]W\VuP(,M§OVRӧws۷Oj* jAmdffv6 7nɽrsP@2ejͷnk5ʗ/'\z NeգIk/_޽>JE׭[7[+JDj%5 %km՝;w~&E/_N9q^ݲ$pg-X0888##cC cϟ;=kֆ'MM5eʔy}hKwΝ'LK.5o/1p *GC&9s^f̙:1Mbnnڴlڴ5գIxxxx0Yػw͛7߾}[Rhbܸ3AϳRSyFu5fG{oɓLMn<oܼ}{S?knիW&ߓ'MҵO>1~0;=HZZ˚u֮Yzժ*̟?CǎlSVTT޸lٲ7ofgeRd4kѣ}tsJ[~EA-ĉS'Ox3fCDĴ#2[iiӦk֮%>}zΜ9/\`X[uBBIӦM4iU/^|O>Y5khٲeRJ#  Caez77eџ~WR 7_eЉMΘ>޽{Z,IMMMMMZ_&rrs=<<ݓ̛goѢC ˌ  ؕWjBڷoOYRC??RYR֭ؾaF&t2)44))^z˗ƒڵj@9uʔU=~3=ztŁme ҏ  BɫъzI th?Y#f 3g, h3YP]lAAITĞ?u1  )aaAAIUGOa1*  #Q`   gӧo~AA)SLƍ*Vh_UM?MRJ n.j;{qW\)^AAĮBW݉WnʕرW/3v[  bMQeOjqJeTzJbDAZݔu//Ҿq*ʔ.ש\ZPA.]ePU#% &_GI  -ٷ0!љ3Dp%D1W~řZ&P:9" Uب K:!J:7.<thӂX &U) i=@jx/ZvMFzzM~aÆls7mܨj Xp ٤?kx9m83OGN]m֕o/o_$ǯǟGլwx v74svu`˹@C?=J[]ؽ&*r*1CwDi:PF[>~ߦ_8iAAw ӧw͙m?w#G5W* (%zNGa{IMrMߑ󗳁pVա?v~<6w?;oy$݊ng`ٸghֵK3VluR5)|FBWgq~2}{ԁ2 \h4ZΕ&7Onn6F+.R 7~ݚ5WV -3j3P_TׯmA_Ŵ (^ 7#\*e#׳I.~ 4jS9O/6%l}FN}]㗬 Cg߸BB|,3b̌4$ۣ4jkӠ{1a@{l  BȨ}{y lJjpww3ת/_i8p蔅_fo /S2MZJgeUW^YF*2L}> Dg ؈uG_sh* 4Id!-wNuF7ENZ7!  D>\=%>_v5Z[nn;"3 €Bk<ꮶkqvC&q?yVM}Pͷ>$<*_ً gbnTIZr_ sAe{v2J\jAAc҉_x΀f͛oܰ~q HJ݋_{Iq U8 lBvYϖ}YŻ-_V2/^\Ťjc#sL\PFy>X`6,?vMݷShrVC&ݩ^IBAASL}zj4L< \tkW\ʄc~gC'NKaLP*u' <<-pHgm^AТcƳj;/ 'l[4IJbe=FLc5uħiI^7;,}[Ձ&Wx:a@ n\I P(@v6쬴dt|ܱcVݲ<|`ʤIZ4qӧO =dhv֭Zo֯ ԡիWV j&337Fk׮ܩS뀀gԖ R^vؽݷΝ;׭{f㤤_w  s9{|j"̓'O7ik/f7n~OHIISL`3Ν:skyt4q'6+MvzZӧO>cNM<9*2\}ݵs'ҥK͛7u/=ݶmW._~Ǐk|]AAJ9xpނժUVڂ b|3gܪUVZuμy¹,^f͚F gfFC}VVr\V>p0&M۶J*[3Ξ9#ӦO;eTv7z!D+8K& &`шBYU&$$ԯ_=2'&&֭[yi ,!1L֭[j׎ VzG~ 9}ڴ&\ŋl806O>Y5khٲeRd$իW߲uk͚5" ưQΊ}[))))))}5GEF\HEi ,!$,^w*W4(<<~\ܾ:a')-&<\z\:t`Mʜyn;v$$$̜5  8Qϝ9S^]+G.YqTTTn$-HX^X<|֭AAJqFwooi4.]N>]2 ")aa.%( {^{t60M F 䦃KVǎ   v!  bFAAdU+U*W[)p[:í;f!B@}T;z  bKyPڻU#  jAA)|UMHX   HUr8XRV㍗1?^A zwx; LGPY|A֪gWBT(ZaB"vSڲoeAAĉUOKzYgȐ=@^j:|€-Z _PVZy&lykW~P+/ܿ?a77n^rZ_.߀HAO޵got 7g6>)'O27:u|b%~+W.ص셋◉p%w7Mz B,o[6_xq]g_j5_EG2?w#G5WxKoSL<[{~kc cUd?{kQ4SyVzAM1m ڱ㇟~ۗ.'OmٶϯܹsgQϝgs *7wߤ/^<ֹ+WE)굿T-7{85\Nfspңw\|֭UkOP@ڰyKÆ ii.M70?$+9e[v i@FFzH~/^bt w3jc?" 6OѣG5A)LyVHݺuWcu1f8C`̾;=ޟ : }O?ѧ+,s̙N{n111  8vNk׮M2rʮ7mbu:݊o رuVn6۶ukǷnԠp 6oԮmŋ5hC??n4;;ujСwjzQXX`@@͛6, M69}Z'|IZl9iħO!So)jzIDDAAK""g`rS  bwUjGoܰ?8brʞ{oV6Ο;Cܿazxmk>{|juk7lƌ46|/ժU\s3ğ?~ժU`/Yŋk֬>j̙;jժUV)$ 1챙0hQ#G_= iӶmRʖ-;}ƌgjǔ[J,VZj,XsI*B7 L-` gߏ 7XrE3337m?#5OXF }||؝ZjJVr*쎻{^^ma遅^ ^:Ǔ'NDHOག޸lٲ7ofgeR-kHۣ,sxKIKK+þ}X$M  %YZ/kU垞LiYzG\EMP~}vK<UVMLL[.GӺukXq[ډ^O6qҤVyxxx"0 @VOpLYTZЇ=2ar9  ~ƌrJ~~ӧO׭]φ4(<<pk70$o>>j0 ;nܻÆO1!4z}zпVT*GҢEaC zBddde-[hցpʞxKZ~8o|hy  c`=}XӉ۬j֡Qi] 7هߏw|.;oNp\Ϊ4E5|,'.]]]p5A)!3'O֭[~E(˥\$#==㨨ݺa   \Й ooi4.]N>'CAbkRhĈF  B "  vUA_ (AAj*3dU+U*W[)p[\­;}V"#!B@}T   E(^kwAAAQ(AAUMPT#  ڜ>x )ͩd)v4(e)Z=GAUaS8n-73jTBB<>KvS_vÄĒcBAP(RT}T;%&&٪U'x! (lN~*U8yknb3V͝F3-ׯ[k6_o`H;wϝӫgݹcv;aޜ9QK?ujn׶MM6m`{qܿ?a77n^rZ_.UYGs' n|w9A|m-oђEV\yݘÇcu֚U3j DA" 433qN/Ƿ-=M<۝g}{ LY$MdPBE}}}pVgv ?;oկwulkWRrss[6ov; 7~B=רQ@b.|'3sp<޻/w\|֭UkOP@ڰyKÆ M n;_rUw|[;wzti-u~_dz9"6ouhn˶mS;zsE2j KDAÿ֩S~E3C1sնeTZZ|y㰏|pwwc7m޲rŊ_UB;cw #"\fl804ɫU5>zTЩjԬ>-ԁ H֍t|-e8VVͲAAE]Y7IH!_N816V^#RX,7/3#zJl.xx999ez.]s>eXҽ{?C _8%%%%%%|BC?=kֽ{ۓBCBu3t.-?d / 2@<AA ;8K:yef1S8:FݻtݳG@*2=3ƿq˾Y {epzol9X0,&LhΐڷYY||iTT 6M CxĉBB$磘4eJ-Z=vӫ:?9kƌiڨɓB-ԁFS:jAA):  XK1Y)1AAa#d9ⰾWK۔~~N  Cը43^ˍ) 8E7T % dѯNl,*ls̙N{n111N]! ªjghm֎oݨAjAA7m k׮ܩS뀀g…!!;uڳ{7eaXXxx8lڴ0ϝ=r1cD.FYhѫΰydqra{N$"}PP%j! RT5)nW\ٳww֬yxdw۶]|ۏ?jW| o3?l|h׮OOIVɓMoˢ`GEFjZN9w<~ݺ;h:N: lE6*.eDPDQd!" [6ֲE,Y2R@ir_hKMɽ~y%LO?|9r/xBtLLtLX$b%:ը b@Ν;ǎ=vGGn2qҤWnjosVMNJqFٲeϘAoֿ_?!׻vI$^zk֬[qʗgؾ} >>>&Lx ?ܱc J;v_Dm=smoZWÍt``#ھBeIju_dE>_-""ya1hǏs 3oW_;gν{V^MJJ2@Pr<:'/9'%%_D݋P>9/*U.ߓ_bE!D\\#V^-^,ǎSsHlM,B|lYƍ/W׿˖͘5+Wre!Dll#yDO ̞1lJw+k~3sW{7ވ7ҥK??r#F\x`0!6yҤ7n!N򋧧ѣ)))x㍳gu|>]3OOJJJJJ1miyW1qwwtR">ujbbbbbiڵkǦeYK췼 kۦMׯjo/l94<^:#G+lrhxxu̟?g\xծ][.BӦM6MFFh4#">|6vmۆvؤYG.A=u3*W R;lJFJrB\!|qUzX^=tv?:s ؎e>9t['"^W^jZ=w'7z{+T(oE?Dr7ӧ$\6s̗[zd;# D \c -ֹsvvv˗_~oĈG@5ds w>)x;MC6fx9 <9m3Fi.+8;8|EL% ;YhBXxxEp5 3 -Adj@.$>:Ur2 `ۺ"Tbf/6oFFbb)_hִjjؿ?agrZQk4'^gوk !,]ߡSljM6e ,-U[_壣v5,KTևk:V}zN͐ pMlګ*WjҨMFI~iFCGOg0{G||aC,]:ᣉkptt(S};v}}QD IDAT];w_V._ިsn߾]v- C:oRl򿩅ݩsа=_9A=rǎ͞5SiÆϭQѿ<4Z?orC9s KxѢ}4hӧ[Rpg>_YRJELh_B#Gl۹rlw~k7mؠtOu)ɆS0~R/8$份{5n<P5ZmRRҍԲҸiƩӦ0aϞt+߷/sbܘ1o_N.*$ /!Ĥɓ}||r8pÆA7߄vL@yMrΘ\ۇ)Q[úvUútڶ]\rԩY3=sB,_ ̟6q^|Qq->U˗,KV錢/\lY!_ޣc'}4Ao>Ϋ es0\TN_jߡχOh"UjJsRSS~8th} vYj)^w>x{#9--N=fe+VȲ߾Q#?~W%Q]> L2TUTTX׮[!tiQy'2BT3y7G=I?W[dH>}/:uif0@VO:חU"ԕx;eJm|BJXyo1 zcJU6+^gXQ֫*F T 7PN0\VjY Ք"0S(+|yVJ-9[_w߾_ >^C|||Ι/[ĉk֭}M;5:_ !,^|…蘘蘘dg~ 7oT N{8 ܻw[ǪwܩL888x܍E !ƍoLܱe|}}&L0o\"U=88xŲ,LqMXLvo.]1!!aB3=:w=k~ԩӦMk׮/^4 B.ˏ+RM^>f̘1O֮ݻW408^zzlٲeg}48U˗,KVwHiz-X`<77[nhKE[,Td]> _T}zH͚Vey}F䯔u~cy7{= ΝkaC\`B< <,,[V őFڭ+ x->r*~jxI5fZK^.PmEMjo~};tlߡ#E§j5@\l IOXM)3e 3 >R5Pi aE7f$Yo2|EL/lhg`5lԂOe5r}OWA%3e kSu*UTp&rS,u@R?Q7ˡO֤Q&M6Mnr̙M]Fá; yFFRyPRre=YȏY%_p!:&&:&_,YbzkIBwO(.xi"nYq+%ijZq !._s{70Ͽܾnd!,I_[îȌz[1I/#ͼ~墋g>Cn q=WW?KV$$h~#=Qv;ZZ17gӬ]|.tBإ_-=tQ#VZԮL|ϓG_~ƖlCJ)F}_FIcrqvS[RBFIvtv앃6%(oUGgvU^X[=zP :|2_ax;:471<[z7'Kh_|5)Inz1jh7˰ Θ<~SJI/vpdeW[k-$ijvACe:ʴ_$S2q#ڔ> ZᒤR-ٳv׫?srq:4-BH|jqCnׯNkݯ\@e9j_9$VMy7СT̻:=kuFY ҞOkq*+>K{gj_fW)Ų,ycl=l PBXUjI-r]+-Yt5:6/=a4|,~39frb̢^y+z}_N}Wi_3%Y*՞"˒$ , j5juʄ;vpg][Sg~#WhNFCv۾Өc/Y4fbg@WWor!$'Uz}~re=Tͩ j1ب^/ʯKE=tsgLt>uܴ*e/I%ʚ+Y^e;_"^zl\|t:<-z>j-²[QU,Zg~֎TmZV+b`cYǪJ ^ Ij-`8U[naXJVmQzWtZBȖ_y]J7fsAQiԾN0LÌ11ε0 zcJsqV潼,A]M/mM/)N*ͨ3_xlve4jU27 QBšj`%|rُ 2ҩT*RIRTLŤj(DAOEJ$I.Y P /!?TTf?rqx`F(,B7ºթWq#=S之\Ss8>Lì1Wېr/^BuVL7?f:7GrCmݽ8ܭ_5ۼUz~i6lմ᜙zGLMa4|iۗР+lrឝ;4ܮemQ UʥKVa:_nd!V~҅ 룶vUKBğOyQyTd!\_OJL̿)M[8N\L'[Mp&EjI <[+w~/5ilYVθ#Fxzy)w//MسsC^vD`ˈ1 8OFtF_2lyS;zݹhL8Dž\;5M$'*ӁA咓r}H^ݒɜϗ\h.nhܬe!K{!U~M)iAϼ}L򎏋P"UooW**{j*Us=ΦTz˲|)9xkB6}`c5'1?|nλ۶;sjRRbRRܙZm_#Sܹ=w6-z_m0B*NVn*5: W{o*?(|} !^~MÕ --ѳ֫{ӻ{<$yx_OHPRq7ؿ/ Ŕ}{۽{vuȵ2$[,td.4"^z\\|7tl ̷V Þ%,,d.Ppf?yV&H\ല$$h%,+U{U,UƺjY*-C`)A-g9$jFcX5RFi.9z#\e! B#PH U?M7%iT7{y3'ˉjFќ'Kaa]'_fȳu.b?hޤ,߿,͛4>矗{ ^}7oT: ذn]F Uڱv0oΜ \cJ$I ?[дQ!Fizݻ;uzҾh˗w}`~!D5\\]tuu{z ݧ'~>voSdA <~@Qa,zئmjUΟ?'gw7+1Fp#kJ۔ח"{A!UWQt5kw Yha*k?;c欆 7]GYeY##~}FFFÆz{ۃ'~4ƍr kSN_t1X~CYB{3fvnȐq11F|/$8Xзodl޼ـ+/\{͛5۷[mqMewBCmXʚ)jW(jus;O>=mRX~֯Wԩ~~~G=v֭~?u~zraZ7oXO3g^˖/-[?XzJ_m9B-ѣb˖Wcc>?lK֞P>sٳ<<<;mm \US-xZrX[mI⛲ciiY FT k?$KھjkS焈1^^9{i|}wRJNN*VzVc~ô.9W*DԞ`jϻUT6]W|||rAݸ8ojp\VPvyMWZ\dY~}||Gl0!D:DFu $V_mѽ ko%ʦU׆L4kDioҤUk4i(:;;SVEW8ObRҊ[hT V5ܽR+J|2d?_Gڵkrm͐`Ij[vZRuHH&v^iܩ ?!hNraGLe:j:tNٟ̻qf2-7k߮MՂEuϳFcbʾFi(t*͚eO.C/gg^yMkq6?7w*og]}6o\C 5j)^`aTBҤtY蘒RiT|_C~(_P,Zvrr8qW/{G6;89q☓Zn 7 jE xP"gZj{x !J6SN ,ĿJ7 Y/(Z`a&&%p@t9*ȱ%@Qd/(W R\\\tYY w/U# rAmPEBE@ Vhj>xJ j(ea*h7@mCV㊰HlC!AvZ;VEmsSN 7,`tVs*UlQ݌ث zV6@mڀ9 T g4%:88$^4igCNh8jO0Hհ~,IKSt&^OWtn.*jO0Hհ FIJKK+䔞vѰeRvkZZsiFCmUjYQ⪢W_k͞]6+K)KP^  < UYZMzG>CѦmicYsm(h\]kޭkŊ ڰF_ՌFav 6HxGڹ ڹA.Vvn3))?ӇcM6rJ\wj ͮ@@e\G|Ū~Aцvh־C1; !ڵ$ع#(+Ѩ}}}t BicȨ}Ѱsspm3j$˄&vX^]!gbb}QD}.I͛ xr/\{͛5۷'VmwܸqSYO5%HA?ƍ~~zG|)S/[}DEGߺuB Æ)W.BJ:nzڵBg9I}[tNa۷E >*i5+sE7nmҲ}ӧOO:T)+V߰9kk#P%q]ysOԜ'XrըF*}~!|022GnB-[^7wbm|N9YBٟX uׯWԩ~~~G=v֭~?u~zʣN<9}w,Zd'L|",] DƎrV!āǏ&V4 Ԇլݻw{;foޣ>ۯOydE>ݨ(_\wܥRjת룬=[Θqn]7]̘ٓ5ݔY 'ַy@rPV/;vm6ǎorӧϴ|EQ twsBt.*+>B*jë|Moo/eGj[+zTRJKrJʰwG!dYeYR=AO7j6|~Y'3{ o7n*7oϞ.9PWme;\7}՗XF;lݻpJOWeNKjR5],:HL ~znʄJȹ"?>\jJ焈1^^̿|.;wj߮mVVV̶C)=Fb2=b݌ ?Q @V6J!22J9gZRk ƌBphlҸaAܩ ?!hNrO?kצ]/ $fHkתE~Tq&9d4//yjjBbܬ^b_14"^zvJW۴wma+~{gvvZjFzyJcp>O%T*MJjN琕yY)))*F6@mG+ 3Q3ְ(j/]=d^ĉcNNjjO0̄3@=Dq7##6. ɵjB2?mɉɿFXɉ'OjO30qrt,盘iw\#jzaaT*=+3AJrttTQ6@m Ak!T-ZLJJ jRjJ%4 P(5jS5 R5@H e.2U3 UjT]`2k%ln^^'n^X@~4Ϭ[d=Cf Rmgv:C4Su;jpZZN*cgdY_OV;p PgO$%JF#і>R;fd|碋c'κ!R5@H@y([wthTZ٤jFm6KhuUc'U$T|(rOFIJKK+䔞~ti4g<\MȑdYa,Uk+YFd+"IYLY/j\5כ+kU %UB";5׮%ׯoU۴tllv:ͶfOY.6.˳G^niћIȓr WOx|O?{a5CϜ9;ӧT(_>5j*f}2f˗/ϛ`ذ:u-/|o>R5@AI[nUPa! !F͑oFFF]C;uTsddhAoppp(͗+5f&˒nu6hPRݻz)S&iȏs酋>[YnիZ}͚usד3OYnM-^GEu&-_855Uiܶ}3Ol"!{ÆMdgg]ggnL !-bp///>: Z={rW4mOO/NױCKV S*{JGL3)ygB6%/nݺYF{-ww9&N (v2e<~ҥk7\|9=BVLtvz^NMsHNI6=!,˲,T*SȯXGp4特+U:~V;vrJ%EFTXDHJN8ٺՃ;n]F|)##w? 宧gk AA99!bORjK`.:vu/wf?qrKdTh9^hѼy>'OK ;wڼ9'.\ҞhgKJJYdi,tZ,_U([xɲظx>ʕعpe1)4p݆ׯ'~g`rиqCV3cG U3H޴i <=˄uU3k֮;Sww9z,7ڷh̬.agګU*ɜy)~~=w-3@TΜJMNF-g9l뿵}B%[XAսԵL;K6\j Wlb@{gvvwc-WT [^a@J >pFPx'>Smh{OUx^4"C*P4)61 )))*F"U<)_^vwptv:TVNr˺{'999Տwxd>_.Γƨ{$WyލPjKݬ|;^ٷa?<跖`hv498NN:HX77F .YΪ+j^mNIS/ha/Kp`ճӳY*[]U)qHP6Z!ҋ Iv;N $iR ICH2eU ^TU5:ƘjSՕUUctjU] u [@ݪvVu 7VU{ZVYjUt`U4 |Qn?f!7ȬL^L<.6IENDB`kildclient-3.2.0/doc/C/images/testtriggers.png0000644000175000017500000006356713215302470016225 00000000000000PNG  IHDRPg( pHYsktIME *l1ctEXtCommentCreated with GIMPW IDATxw|ǟ{"D*,_Aw+ETT@Q@ Ф$( ĂtD)RiW&+$~nvfvfvw>Lfx94&چ:ZV+! }s<۞87Xp޹8xs3![28-0q?UJ,]M3/5-H`wtdwdZ}ps쥧V]Mq.1Wrq$d@^W\TI($1_O1K r8T ,֜ci*.̒bLT]JwU15$ Mj#D?wAPB8%ʘ8fO$+ a,m"y$B(QdlwL HVj.үhazH2$S5.Zs鐼L($KsU=#L2,]nYD.$*m5zI&zBz="DAT)J2Q@QT k/CBqǹ,Ʉb#a6]dUAj%Ͽ7L P_j(--t·_ʖeuL݀* eKL2{eHTpp5hi9'D tjG':TD`L/4Qod;VLa}#" k3 $)Ғ5>QVXMkcHR=v%)hS&# l6d4uzXi1}|}}}}4 c"z_??celDūJm6d2z_??ʪ*#$(JU-ᱮ%  FFf} %I=p6Y*3)q&.`RMplSݩ]U5TY`.2Qi儏3M[D9CYNU ^|t{Od!TՒ=fl64l0"28h5!`0dgguzLfsqII"ődeeDfƍGFF9$ 333,,$l:Bj-G?uEE Ԕۆ2y2)w{iLFw_)kC.c(0UZs 'frQ9p h;suCTUoq ko"۲*n(npb4 »GM&bd={Nk yd Hؚ\<[lCdSLOJ=(%?TwE goB؋(=dw|8ʼnv$t)S@JPȗ2Q2>$8&N1J/͠3Q_0JLd՚s Jhc4VUVr4l)&;d#ED^jZy-hATVTTYQqТ99RtRg())ƍ[,۶-\QFxˣΎg| p6:'8xjy&t|0LXkj2d+m 2ڋs]]D<@⥘[VbvhMj~q"˘44sj1~'Wɓ/ӐgY -cj/_z UEBZju zۯɤ/-- E#)*,t?@ \ZZ'iƻFEG7֭[{ɏ/E@JO>7sh6ccx }N 3#x(TU=LB]&v'4w^"Q HX ؆d;ؘEV`Kgq13%a T&ܴ`9bXЈ^|ސu.V8^jZ!::d2dWTLFSYQa2*cbc ՠZHϞ=?tϷ]#)4l+,4I7a={,hJIYyӖSI-,4X6,hEs #[t:ݎ/cȼz;Ǖ|4'OM:deeEDD <[n]<ʼUm28?!رc [ތ7gΚy5ڸq ++{֬鵎d޼y'Nƴ{:u<~-[R 8z!Ct]ڂC58NhAbaˉn^pԜRP7qB3?+G9cA%+/9Ej~ ڎs/ԸZΕ`V'r8K0uCÕ;&=q2ufA.P!.Mn%:TI!z̈\˵Lz H NiQ `{PKvDWK_5k^Ysͫ=} ^/)YZQVT sN{%Kz HJOђ{8f\/nORLt洭zxٌM[R"Kjj> Hh_ѯ̛;blܴTM'/||vqf˻~]=5{\,ݏ=67.\]`{?8-i/\$5.oU==ծ.]&7]G}ߎ۳qҥOwvio̲G;ޟ}ꏳSΝ?/mԼذw$";),!PZG P-3IqDfCJ i#OV2٧N&alLJ;"WNcIddzJ$uH 60u LXZ:mڄ:҂CN%t?q)uqtDt@)G yZq089jܛRh1&f2V&λVTV9>Cd4M&j5f!H?gΜK:le˒vj#IW 䘤BϞ=?j0fJ?СS7~ber)ʘvo&^ygwwٳKtJͲqv 3sGdǎutTppcZp^qvA=D %IYWPuxwG3fל];yX|jTlTӫ*f;)[#Z%YJo|_y8qwZXm2fl& 7 oK#BB¶sl2i4d4R7c %>?[|ݻwFb2`l$ >d׬[Sϱ 68}QcK>utۚ~~-﹧QcV{Qmmp_y3ߗxq'&-oy]kVLs_ #a٬"@yYf+/GXUG"JྲlM&NHLJjٲeS&MRz37c4L'e$RP >90M v!jA~T0))1 Zd}\$,yٝR;˝G+9'4f5:8[r-FdGAHƂTkD3R.Q_H~9Vd2f][Ƙظ6m,)6LFՖOūk#=nl6m\h2]|{fS_VINězss$m߾}W;7n|lܒϿ߰ORNnD|5`^cFiڟuf9!a9u#/;BC~^x󭣿rrrUY`Nam.u˖͛7]۶k%U9!a֌w^5~ѾE/07?rDSF$0iDaJo } 3Eh%*A j\V:$eZr,ry9/Axhx}͢c=SCpvUlx3R]}93 :١2;ʚ 0݌J8*hS05e..m#أMDJ@EV@փVD. c$(3&JQ kmpՍb6*,fN ⍓Af)>ʪ*ŢH[b&IUUUfYhQ1tIn06!z,/_D+ڬX7V=&*n5ppMUnf:^<әɂV/7N ?/(10muIjra1G0"jn4{^uŜ縎heϴ`5;R ^u0 臓5sjj,VYU7FDSp0,-GUH"jCd#9ꝣ%jIhڸ\:]lז\t]}65#07mf[b|sYV2|vhhb 00)va TAU2)is4%gBKJiRl)*4FZԡ?:-(yIZv *w@zJgqwd4eaJ#]3U*a$`4ޚ €0ͮĤ۴)t6'2߁6V¥>Ӷ A}(4PTY :-qY8p_'Nd9[R+fuzxث y\Rr*g+WMy\ bw⛥Ao|8k3<ZóeL]EaE'hQn=;-gEWh9Ε!G 1J,CF8xuS#WYfg./j`HURo M lo#j\n Mg bII2Dgy"کSӓal'[S\C֬MQSZ|N)442܈cMs IDATԜH)u]eD$OYΊ\ FOe+$G.uͻ% f1xu:ܵLȭp$jkDF@qM4ɫ0q1Qg)uؖ^"ij.Z4M>:7犩u1:%J' 0sU}AM{`FSo#$amC9|zOj]~~[QQ1hР޽{wvlڴ;2ujfl7nܽ{wyy#<2qDfSRRҏ?jS}; mFFFrrI>=mN:544/}a?22Wԩa@sΝ;O|a̓^|9̙3{ԨU@}}~ܷdͧO7mTPP`YxW_}C-Zo ڶmۉ'}M,{f322RRRV\o94WfΘ[mKۺ5*:zʕ|ҺsssS֬YjձcagnϞ=m۶u訨+VVq8rҥKwC-X7gCe8{lڵGnkjǏ'&&nݶb6'''Ǐ'ZÄY3g :,?:0tsA@U Nmst@ Yq ^1fm{#k=De(j[S}ĉqqq~~~{x"5ݻ'L/:t~hرiK&r);vqݻO[dd1c/ ӽ+QF;hl),S1&&` Cx,  = Om?KLLz9k֮MII  yW۷oUqx]lvg"ک< s\-s^C${x9s*tȥӴiSJv~rrr"8EHjA͘9#00{Nܢ2b@*"Qϋ:***''iӦ\vV/ϬY 2dAAee5=$**2''I&|A̚9kȐ!3g *++{dz4i,-Z̞>!믿Ν;w| g8cIܱ .]48EE0,***+;YYP3=***++=(bcc.\_jΖs|H_>;vfn "k:{D 8;/n&oHõ7 ,$$ڵk=zXhѵk,˕+Wfb\{4)iyAAAAAARR?ʙO>`0 O>s:?[*@|}r.\do z6O>TbbbNN?\0á]`aիf~M˖% `ٲe5uC eUUU@@_nnނ yǓ CaRRCrsr|@^Mkw{W-m^Nm4 MO*{nWӯM˗.Ϝ1i M$.nZĮ].K\f(0 K  1q=s=7o^zzltҌ3(1cƕ+Wf3pl@v2 q*6Sg v biF 1$I5qv{k6PN';jf"*ށTX]>!ێ@~}'LXVV{91cfnnnF D.JπVL3f,$$$EiWF[.]߿TN2e'|{GDD9կ_Ǘq/ӻW_4hu$Ыg/ ƍ>?6`eIÇďSϚ5+""O> 4(11qذaZgϞ'N _OJJ9sVddyLgP=wy'/7iӦߞ{?1c/z ?f̘C+?I^=9>}:FDdF2qdK,j.][oTވǛ\߈ٳV"fdW#scT`o4Yk1,oWLjI/ǰE5III3IIIt6"IٷTp6OSlٲe˖u~6ឤ߇]=a z†wQꈧ#d+WwCGQoFWl;Q&¶;Mym!6.ѣf#;#ۥ^.' )އn7['.6vԨQcǎ/ !.6ֽ(/]yLVK:hZv\?y6 ˢ\؝nx,6ָ87#w5 s77DIY9˟x B4DKY FDFǢ\MhЌX6=IFPɼV2sULm$WEA(ד nUMnM-au:M$LUI%HZS7xvTo;s' ckVuOmI|I2rY aE "L7MAUD.(aS)^\_'l4{vףFJ2Rg -) 4Zg^{kzJ_қV5u[P = H=Ifm˶MCnL8A&^MOEyyvV&G^B.ՍXn(H2dAq_ڹ*d۪d2k%?Ϝ8NcZ],rM]gdM -UVnC )^{FV 1FM^E[R9sfݚ:=S #DAuVS>Z ڶm۶m[fKY՗_uyӦ@6mߜڔ5Ewwi~`6.XwtAf%B j dK2b#^kv鳍ǎO+Oxw+VܻLJ;v`{ʪW^ݲeg6L +HF]APbi{gܹyԨQ]ޞ>=??w߾}Ӧ7h>oΝݿ)'GGGGL:Ux iǾdA$5aޘ6iE֯{{OW| 999_|c4=HDD8h44loԨ!ڗ,dEA䦱gJGoXxȑ#yP\\ܒKㅆgLLLffff ##ɛvf(D7\# 7ak;n4SRR.޽>+WL{Vhc{>^q~~~~~EᚨJТ# 7iLPcsŊgϞ lӦ͌3C/q^ݤIQ/_ 0#WxzIA~ʴS>} 8>e/q B眊s~L&ſ/>Lo>>>>ZmTL,BAn}88M^^Nlgr}do{j_ΥgP7@AFG~'&者aaZV9!@:+e 9_,= R,3ɯh(i(j4¢;l^MONn'|>aa O\iII~~.N+[j `ߓAAjɯx֝kf9bJ_+WۨaPIh5Q1l, m]3A ݩҫ`HIk`ABRm6[84jF\0.AAXЄAA  h%# bddA;V2 jF\  uAA@vkeAk+AAdAAjwR(go&Up>9?g@}AxOZ6OB!51p5?9Bl&GO3':Ğ?9yeTBl†!䵺G\84s5%_S>Sז0jj~UBOMAT=NCHMj8_}Qpq k5$I>AY8`9?ګ ~lRP?> p\M5j4AR8B6TX8յ^]9Cuˇ8"́N#H3Ԡ=i:[p]4W]q±&U\O=Cq^%r787g~PK(EwctS:v/ؒ,.9NtHr[2Dɱ)E Iȩc #ȿǷP_١$Wr%WկҵD)L6@*sPN&6#sGXʔHDI(h-*N g,"+ٗ !AA_AAKAAz +IFMFA: Rr ûA  P&( ROd¾T  ް G\&# H][u3t)~܀Uy_&AI2QNbiSPH?SP?PTHPP;w$lvܫoyyywuY$O]-WPIy A/:v#F~Nnݿ޽3ݺ4/?k񅟟)S>m}jMHH5r3!$55(//СW^#9r_޵Sٜf́ !az3ݺ@=jT6 cgl6XСZm=S֬wgLɓVddd'(yߤmZRRrO0iӦvӧO[!!!/ cVu{쭨׷o^=e)U,ejZ{  Rm'6mz;wbx5?¢5)2yÉ'.Y,+335-w˯N93g·)WY- }fH%5kK,^d+驩ivz.2Qݩ1oْ_|yRbғN*3|…}ޚyΝ;~l9[6ozv˒xѽۆ֭]f:\3^8nvs|&e NbIMMZlG @A~Վrv=hUUW^{xQF}~;fؠ#^:|gW^|}򨨨ѯo~Ay#G5r;cʵZMaQQI'$oر~~~I˖n'00pǎs0ƹgϞѣ_ 5R} _5|&S; IDAT,,駞ڲ%^/n6/qWFB!8h ˯HU=*v1Ɗ*Θwyg͛6n ~Q>b/&~Ŕ5k/]TVVPϘNb),,^5Q; ȿTUKܘzmZ1P\\M4DFF1117+FENHDD={TR8C9"""7/qF| S~G6!G?^dg)b{7*;qFEE]ŊHKdd ȿX hԎqпuk;>⋪ܼeb[\XXXXX29.]xn}Xr1:{NwgLyga~~~ƍLB\MĉWZ5gua".8{=߫X7+UҧO+W3VɓA+.4Zm6, y\ISRV3# #Z&:6fxso9~jzyFzyƌw5lXXX8tukDDDdffz+dMsT6E|۷ol ;NBHjZP^QѾ}W^' H-.k!S& /\Ck׮-xm*.*^zР-XPXTzUrV^ayݺu[v͚Ȉu?1g·6~vIIyǴYY.xѱc.ZԻO-͝syQyصsP}?>(_nHeSĉ',Y,qifVfȿ3gV%Z-mZ\2ʹLAI خPg5******Qo?4pGtп?ի%.mݺO``A?n8vؘ??^={}oQFEFF)͡F[TXt Ƴ 5~Pi׮g#Gȑ#p̙vɗ H-+AD :"bUOjzpNAAAF&O矟;w|Bzdkverrx eZ{T3:qYmžoG0fSkVsN{tq܇s5l`@JXP CcaA~~^jò@A:ADkp AK3" H=AG  HJr"cI  H  RO$lFAAd4AdRz*2 Թ̨%%%.\RCAE[lJА{v!!X HiZ-QJ~ U7`+6nKAA}Μ<,FdY6i488AAXnҴ_gO3UJ|A?EdATRq ې-@pdAC3AA/>WBFAW-`4" H  DYvkA2$]( -QBpAkA{#pAMA'hp ԭ!M0n  .VP:[A&SAAh2BAzmdAv4TBAζXG\# ,`yNmЈu5 2 xEDqAMAcM.2.AcN:]EyFAv'(  ޒ[ %T[A! R׊ kq  ^[5m xN1BA/-aûA>ɀ j" H@WmN  4۸'AA$DŽޅ  A48 AA^qx tB}VpAAT[̫wAEA:Vm#sLFA.as} R/ R4/ t] % i#(Q[\A,+FFAo%# H=m !( R皌 j" -`4 RtKFAza& # #A^6.  !DAZ,px Խ&  lFA ûAXɌûAqRfbxnP  괘{=>XU  ^NVI5a" ;<__F:6:$4 _q  T!ƪܜ@@o8˗.bY# "fߟIy5}z,bAaLJQayp^2  48#AAKFA:]( R? WBA:3 .A  $ya!$,I߼E $3,5p0Gj:b=X,{/)'˟Kۿ!ƋT̊{6U'G:޸A\ ] 3WG"{ܿs륥M4yiF7M95-;;'4$Y)ޘګqq'MY윜E,7W*i>sV{>thppРw OxŲ%m믿?Է:NQeeX6n믿iڧ~ $J{o;ھC#'عkCڶ7}li֭֬[/:򓤷zKdyu8N<u֭e4铮?ㅋ-O۶^oX"cų|cgfV{3g7sFFFƎhǮ9~y3N>-ٳgp{9;wΝk ϵZo=,;~_Z9ԩxP/5cQ\xG/>k+KJ-mڼEP`{u_piS}4z 5jbAn9U&J!|}}=TիZziiddru>[nuy8q=ɓ׹sn%ߟuw|gE,?#"#" p_Ͽ ?<:7Oxx~qC ׷e  S{O͘Ub XFW췄bꡟ~:eْERٻfv[ӰA^eF`'_=vq5g  /oؠ兇zׯ_w.p{|Zjj#x}kQQQ.8N\5QH1;BE!_[BUjdDD^^s_HeA6ku< Ap.5_>YmXd"TyV;w{@۹kwVa4|| ”5AAAY9 ʜC6|x/춦Xe,7]\h-EE6n6M[:vhϻ?أRegX̖̤+*^OQH1;L7 rHa, RSNt\򲊍PKeA2k4%?bq m6K Ŀ2jQuV6m{ ޳95uVĈC7mNM\IXX3O=c{nÊ qO2gyG-i[ߝyGw})kuhHHnO?qRg{tl7yW=ԓgZ}3߳Z-Px?Ot}˒ {Xū#rԩn9_jƢ ߥn U ޫh+ j" aM&B_?A_+&c2&:24$DUX*%9yPHH(; P)-~o65<,\$39yip;Gۻ<ϝ;0ü*TQ+-UNf嶙f%VeiŒ֖"juZ [ 0(r83efp<Ýyww~ܹ.]r! /WEJbFfnw r0_h6V%SJм,H2b AƔɤвRrd2^z7qCM 5k[Ͳ^k)Y-?pg/&FJ"!%#H 7dtkhnOޥ`Cy^5{jyZ,.8dhXX8#[Qknn(=W{WZ:xN/>m ái^~!$!nGfb" W XMJmkd84nO)SS[+˧MI}<smsnRoηG^^;wv2!+^q}OBwyeS''~:!{<NjJT)sf-`y0oNjR l5\F@bXb466UJ|{dޜZF&|.SP*SSy~wlHV&NŨ{s=L6'5_tӊ !RJ)0.۶M!Rm`6 KQu7$ow{xy1ŢhxF c~[)7𰰡Cd>2bLÆd2BB0CTWT(VAAA6˗oVyC:03`@,ݻ?}#gD?w#!w~䞄kOōٙ`67;3u ׶0/[[[vp.l͖]Y:7,,V6ot^(IMmᨮ\t:~%_x[ƍ]YFjݥӷ{]xEݐe^17&SX,%uq/U2!dTllhhСC!Æ I៚6%YB3zjd~?xr<9i]``IDATӦ$ҭLKgY6..INZV_&o>O.|+љ8~lzg>::jC|ٯ381msֳɓl{u)u^wQu7$!{+wW!rwM3SK,N钒=tbmۭ?n]U~"pkaYV[.FɔӏA@%FVQWypx![ DDp#JP%L H m(HzJƧP%LQ&JdK8['$dd 4lT&sX M,8"%8Nu֫VkKso&+fG5u:,z\1HkƦ11W-N78ʵ cpraP%@ $J{d9-,L&X(#%ϫdڮ:~pr\*(q)R2\4[+bBq.W )p*V2qn켛)0%+Uu,,//xsҥcbb,fKN?aչϫd?\fe̞G\m>QB` Bȏ?U "e棉,򫯭VkBBO,H$>n ~.tt؛u422ed+wg5vvMٳϿ{+kVoyþs箮 ~)X%.p:?|ۅ?RTJբeYd6[jO<iZT`u}Ÿ X%wRqEV뼡!*J?2L\{OnwXXK3> !RJ)eR]#)%/pSKsof,LDGEJC;X ~N>0\R*[iHBd2YhhhG#S^V2!PDҋfD"QuJ@ b² PB(lj8#6?s28Nq&9N5dqw5Q 8'e2('jq ~hDe ,QaX&zIB#Wg2+e_jr/Ch_́޹жCQ%Qvs#musMF;me`b2 6 !D !8C,쒠Z.]<<33S$Z?*$&طUln6cl_ +yӫ@.|*mR8OZerZb@ydC, ] 7 36W@l?1$a`GhZQ"YR'''''@ `AѨjXVIQ YRi5j''':] ʔ!._m֫W4uLKKì?.^"d1C'd:cB @ki^]R&*ٔy.d+FϫyA(uq=kAq%#FM#6"^|3G1m֚}X Qt찴FU*˗dA H( Br]BX,&VL Y IMHHRj*T|͢E%A8z}jjVgҥ3T(V^YXk ytɞ5cs8X 2ńH}Q?˗Pӓt72:1pME҄Ea؄)g`tmFšF >nё2ezNJr>oh4[> dʟ׮ӷm鰱#"6L#6bhvmVqE?6L[d̖(.﷙NTP^D.'VR5ueE"mk8ќs6P%#^Ffs4UͲY#*w&C9DWyl꣉ VjZfaMkdF#+m93`RikKg:8Pf:bֆ 3=ZԳYfmJ?%ͺȏJ<´TOAQ'&h䕓ѨUYr\[Ku4?tnj.쬀y\7mHKQ/JiQB@k-}aa/_DNݫ'qh|l<%SNFEѣ];P*̞ӹS#F>}ڶik0Z4kNZ< S2ڴnѧwٳgwӈ#H!Цu}{uS^055}ŗ[6fϚuǎÇ {$7+WE/{<κ1țHO޴mȕBDKrdMt,iRs93C36M ,زa#! K7iqGv[|wv;E3Qi1`HŪVٲeY:'gɒ%Wj4jI┑7P`L0 j4tgڲiSHGRHfFgM߳glF?6y#D3^H@T4OY+q&z+fPʹF 2ډő%GԜfՠWNFVuQrkbiOБ3%ӳ:2c*:fQm6S?nQ 'Thj Q4ZF`Avj?_|yLLe4ZZhz^ZmZր\zy7l6|]7m|Y!3!ƚlrV%"M"v'_~\BqnDmzif 8w¶;׫s=įԫZVvg{z1uŢkx3fԪUowys@ bc wԃ!wH3~^4jԨ?4!!t|K3i y;w<,>}-Ysڵ۶mxɒ zJV-i!,W2tD&O)J[ețW,cg4:wP<@^ͳ MtS G`> ({[ ?t_li#~u+@O zdk!jii:ƭu/iq1*@R ὛN?~}gϞ?շ#Xp4'EbdNEX"h,&e#672G&Y'˝F9Hl6 c2cNז G`2c !WaͽmUmJ LJ1Ӟպ60!I^9kWm¬399VzS{fqѹEbKRRNh:f߁عkWR$))E$#X0y޼zo_WVe?z)(h@$;$%swwiugϞ;u### %IIN4Q#-Sı?4 :A0G1ؘwF&۴Y`~T{wo3ZB6m-~dLpG1|P`ItwǏ `<\޻OgϾsdy.څ+1J$OmLݡtՒtrq%W;+7HtvqwL* ֯ 2N.*JcJE q!J۹QJ\=xo"alF.>NO~rw%OM6׮߸{ˢǻ%uTfoa+T @ ʜ]\ CF2;;Xh6>2gCNvzxk4P / 2229PB%< >2DDĻXR 223srS(u *xmi)vb&txl 8+dL n tO|ؚ8 +(&9G,bbþm*5jK7qDs^M)Z%$$!]vrRH\~bq%KNN7RFUm(UP]bBrR1JkRtQ[)Tk=xXN*Ө-ԫPP bN:UEpr XYiq/`k  *~8"]-8EA<ΩfGM;6[3CP@7@feeeT:N$8;"6ARiu:H+DL}PwѶUU(RFTfoA ;>ۻP8ز<ΉgPnG=qQ.<͢oQ l͠^dscH>A 0!4-<,Xټm~<لփ9|VL[Yl :sZFu.nwya(6G!( 4m "bMF_X l]mS u<$qvm#DS,yo0EF7`K󇸇~, >=,VYe1%ؕfuA;#`gG,;"(e :6#ө+zv='jY΄#pr `{8Ծͫ "]A(A*cBIPM;GKV\cfK?-k 'Yҝ5iQ i= g<͗7*vbH#=-6I2)F0f YM"6H%M l|ll gY.IMlYk<-Dth `HF=?aY`>wfOi<V=S&Vlf~(є)"KY,;S>tNњv݊G(Xd="`|z- dCж4}/AUZZӞL@,7L&VC &QuD+mjk""T3 ؐ%B;lqܒ5 6oºj Z>MeR9zuG@@9m*?$uLywK2*;iOYѹ#&ye=A1@ ORkĻXF*6];hXuYvxC&`p(e8Ta9OSM]c2[>'r7?[p 7CڼN53Z-陂-ҜAVKR[M}d m6K,fbP5dJ2{K,#i`m3ϗq7fd!VKOs6wF}й'}sҽɘ ~J7[ Lпu 4~9 ˳(-uqDcw)ԉ$4F Kug F7!(3MXv)~,ws0Fv帕 6ac[u7fF3w!7&8&N?lЭֶ N5qDa饳#: bIºZPV,臆^jf"[:nu-l9mfX41LmIavY9<'@ ioiW.TR+mQ5o?b%-UpOpM&k*89PHN8P[2`V( O DN+sf5AY.ri2#`#ޯWI,po&Fy?aa^S1s[8 ݤ( oViÖ9Y7k)ڗZv@0\NkuA/9܌nڰ sxYT-`I]{aӲXLk{6>G8{v15svIRΌY};!N;rVlwFѽ Lf6,jǔ Qv:`ٴU]fSG'(m",X]o0zĺbX&z<}4i fksF",u-Jph0z:soTˁv6%5!MjvqnOQI̭ce6f?IvWe@E'ã-b06Gnk?"UTB(]Ad֒vD4,4D䈁gDVY.jXYtV4ؒ:e|np|kU,0Ɗ{RTR5!/ʃz1gsйK3x%"ni *70[afs35 IDATnq1ưݼ46ppd-ϴÛD H"쑉a/8!6p5#Qs6fns6D8ۥ3,,6Xխ\O)hwg1͜h Jvˋ,O -,LҜq".6ckl msPagnv*,vf8i2.N6~@I)܌=ը9[:lSiBx^\Q pX.NmǑ4aTxU;xVz]:7:E=1qc@6S(K5A&3>iVz<{mZi` 2*:y,;rfl,%~S%BMg_'7,jfmp`p{^^a;qưь eD\qʖ ok-eFr~pț##3AA0]*{U0ű#A>QbO,-]KAX.ʆFiZF[:O"%A%VmH$b*!VhX+ c;JY:!r;u|Bn%j_L5(Ϟ9rؚ9;T1UۥsV5 /Sͭtf܇Db0)2[>Pf>|HII bjuz_@;$,\.bjcT4(c[~} IL@jЂg}x zat:JQR@QX"xI$fKR=[lnɳ`SH,|E$:.';ZJV:2<^1{FPX"wׯ_KԇYkTU @ prv~1JkնEe;TZ)[ϖBii*իkT*VSsP,c^ɤ@-Â1삉b)kLiiiTh4:-9/{98D8!6WryZ`Ŋ@ѱ.s "oZ!DD!pZig1 ;>[$r阽­+ӕ3Ky5*2],J3G˸Mi4jR Jez ̣Aث"!)exfj}J!ԩc'^NF)WOs#v#dShZlJX.8`0T*`qAZ2g} aK.792!9eBĻLJ) ^99z`%PX`#J>4iiC?;xT]pNq¹ԩ鹘{CLNDAJ|UR Y 9<_>#66ܼC2L?a"l R 3:[J}>|Ç5jիi&6Mh7ߜ>yAJ926:"h-|9uRJٌ'bҩL >ӹWdx^^^A |wʕ+ 6r9^JFa{+E/@VQ>~9I;QQ5k,yh"Yg˚k+Uj WW/^LiC:{B ??x#G^_^ݱcF_2> 8̙zEfC &KTAC >{B ?t@:~-hѼ%Zv_[+ v|#ZOLL<N=sX"3zT||3g4vO :zevPʇ< ڭk7 fSN=|pjj[7ZMСäɓb)Sn;~ۛ,cݺv;tU ^(|̵RBITB`i~i5oiբE-V3K|Ybbɓϝys愬]t_aWo)dpxQӧ-iѡa=\0w ڵt?u=7gΆukҔq0XdK*UMJJpO'O%%&|ٲ??zI5!(2r;mmР]{NL\|%яtGỳP>KMȨe! *1 AN6xp~@.<~t֯ GJF! {WRY+ʪT|} *Ie2鰡Cݸ#Gwp2xw+W,W[EF 6D*6zH?gn]!ݯ^6b2e=܇ ӋML_t騱6g3˧7sW6|PnFԭk711ܼysA2L3l` M/&"AAZ^Rr*U.?_lQ"/]5rDېo߾M#ÇJ}?Geyu$n{1Δ 1lL+6wÇɤR7F +1Xnܸ9lL*Id#dR5+WԯWmG   ҦU ZܯyC0]>w¸¼UGV͚5o֬pׯ͟ot6mL&#^paڴi~~~~~~ӧOx"Bz5k֌8ѤiO?jB\ر.//>f͎gFT Jݏ"B\VGgs_zMV}֭\g?so 1\.~f˸o>6++ |Mo^䍓ĸtBQLEZ^^^F5rDffS7nڲ`\fT(Ƽ-e@+J????8*?#jjYR3LWf @899i41~|T (@)P(2B 0ffcS(~~yҟM N+3z(>rpG"^Ւ~ݱ_WwwÇaCzfq4 x/˕/G ,J޷Э999֯@ʕSΥKo{S|kF T2J^0B=lvKK{FFFdTԃ7m%]Baf{///HI'oR18lάY~ym!7իѴfgg3(G fd)j>ākPw>}MFHJRJ5Ɯ:O<|rƀv%X:=wk3ƍ\]`fST(0[",0?+طwӧ_s1c=)ⓒHHRSRd7Oj<7S2M=c(&P' orLNUTB< ݶcVQnGz&a|뛐rG> ?ܿJ:x9s`׭ (S^= !D'`>B g;*K܎cv]~eG4^[~YS( bV-[Jo۱#!!^ņl@jWg''I!^Ӿ]G?jY"Oݺc¿qo4eZR7lV-sB^-Zؽ/LP=lќLf-W+}'{1ǁYE^zR'S&M)2{?ݺFEE[ اW{͘H(я%hG: 8]k;gVo[0++й`u))e˖܏P %IL?noB|||w￷yT]8kNo٢y= DA۫gϞ͛5ӫkg:*:0|q{_n=MӦMVYX~C0ڨMQ v4w6d-Gv 2 h]cHALv͛׬^Xnm )$[Le,dF.Tj4R>35%ٞDh?eǯF>d~Df^\P'/ydKmlk6mqtB`iwh7#ʫVo޸[$˂㏚jgϿ!M7PɓƏ~$#$H ߃\(VlZ/,ݵ:]XM@B8c }a= nwcI[LTnd(aXdeeEDD[CPaq[ŗD=p8D:źX+Æ%oϛ[Rr|Dx8?R7|ذ?(D!T's1 ~јIS|Qdq/HiivR+%xJ*8!%8e9Cr mF#FFW3FD,żs?R<u/ŗ)[ñN %|ܘ)WDDqTE YY }C(ss^OW*T.OIVZM(NN{/h$/|zaGɹJ/{Jy'p-OIPQ4[[}L|5`LJT602\uډP(,⢐pc``6VP{{yWɦj!G2 8100000xCϗOG10000002@"3 ^w(Lg7 b֝100000[5rS~n G77> 1000000sc```````(@100000΍E_F!+n 1D37fn O|ω#Zޱ A2yf#Gtqq_6'PqFF3}t000000.sD" q?$qq##N>}d]~Mw .]vڵ%K4iݻͯ\rLL\\\޽{7b]voQPf}U~ p͛4nС5 =y|dooիWƮ^{_>ӬsKyc`````v 4͑#Ь#Fpss#Ϟ= }qww۷9s<==NT*'MT*M٧O8~^r fn  Bcǯ ɤݻw9r#TjOIIoooQfʗ/P|?׬Y{}T*Zc```` Pc/!!!==WT?… .\ЧOe˖GD%Uy W(a9qxA{xԡC8vXևG@.]"Mcǎen -[;i @ЪeRLfy_B3)H֯oÆݾsg7vloM7gee}?cڴy3=zkÆ q 䡰/\`H(0` 7׭[Ɵ5kMD"u10000J0sc> Ŧ͛ ڵ ޜhbΉK yzz~q(:wP(x<  SJʧ|n GC ΍Qtnnc`````859 :TZXHTN )η RCv!;]? DP.!xd9J"N]ZPtM|PUCeWCds1=0>Md ky;@2U0>˰%R0 捁?R2 t^+Zi4jZSJ^I߬2K#@g\000037z  S*^_zҮ4Mn jn ka#@DⵒNJ+uʹHⵒlJw1000܀-/=*!xT}QS~NJJ*gC򒧦Λ;_|ִ#^l|t>z}ڤI^^btGp}?mҤ[.'O נëW/{?0'Q#G, WW ~b 33ر_W^z ݦyըQ#pGTTԾ}Zlϟ?_pт 7n|E nZF ͛g);wvT죇.\tҺM8R>3Ouz`````MHzʨ?~|Ȑ;wVm۶8p۶mZΝ{=dd3gff.: 7sN=6`~l٢AGoݺu*u);G*ō5 !w5vܸVZlrرw"ڹsmڶuqq)_… IwR˗,Xf͚:u2Gedd.X4> \0000fň#UV5GEF_ٳ p۷B6l#`Q۷iuz~}7m6Ν'%D>U]ϝΝ?w͝36meK||‘#ODFFX|:~~xv IDATSh4 R͛6ƾ0,G?nժg֭Ohق}o!!!lR | 6n Xi|^  _Wxo1й;uܩscľ}Fd2KƏ;~„K.@ժUW~ԩSN+_\Ϟ=ϟ;G*7o];y?nL&dƎI .L8L2G~W{Zvqڶ7o^JJ &O6z唏L5eK͝7lٲ6GEE|rFeΜ9_~uXpx~Zسϟ;k??_B(S&Yl4e{UTK,@eԬUmڴ~9vTy6ɋǍod> Hd227y?J2l_yCL&S(Ɣd2R>ksnܴJ*׭]7o< 3֯[o!aҤIC)```r].*~DR4))bŊ.1Ѩ?~WjرcӧO>{n_'A&g㋒/_g#fDk//QGuҕ|TNWݛ|zʕڵk]~Grw.&NvZj1ȏ l|٧/ү_? !7yzĉ N#?b4Cm۶ٺm\.[nk۶ DFF)ʯ:tڵW/cbbVZ"h}_~OOϸ8OJ۶HKKKKK۶}GvmI.]:lbbbtԹϐ3fܿ_V+={ԪUt6l;_Çoڹk谡ÆؾꕫK,1֩siӦM2522A[7ܼuӞgO:ga```8%dڽ{ʔЪupaC7v],^ {ڲ%4((Jk;YYYF LvNkӦ "{w!XdIRRr¶Gc={ܾm'O6l`QgϞy s̩^:Zjsu޼yÇ7J#olH$~,Oׯ_p0&i HW*R뭳5틗/:vM1Ms璓Gs]9C{ =^RX|-~lR|\F)E`*ϟQD"fD )ugee?~Jb1000xBԘ4;uB 33xV5aWi:gF|=;w 9 Dv{LѨKUHblgAs(\̑OQ[^ @,tI$N|d#Ȝpn sq&jy o$ UO-E|{COUFRƙ|ɵ b@%:.:wJW)I.zε%b@a``jSpSC).DYKIł.%x8>"$\ISjNŖ!"|t &3 : 1000000sc`````` s 8100000>΍QgrxA6-" $F: J+x{ Rs (_~S^}OO/%V+ŹK;.ZJwIE|l|ÆTs ''G,? v\K->5GP,XΊ+?{W@\qi/Y\K6\\]]]q>$oK;.xnХk7N%J嚵kڣg~uA eយ9c5j~Z˗Uڧ8sRd/>y2dР:j~֤qđp166vԈAuխ3jX˖խӠ^_V,G4[P7Ƈ.V%+it ܨh׬]iㆣG |9AL\|L\ϋi4?/]^|q4syBpieyzu񓧮_NOmuj}ɴ)Z=|^pkW g/%PJW E<5)`0 j_xuo^B,{{~ggkȑ=++矏?ٙ짏=rL2;wl't"F;oʕ*1LKK;sEFF Lv't;v\zM(s=gϜfpx]>z{xoo;~E_nugDb%[P%/Ǝ;o>|iOy S&OnҴa-|֮Yn=}OL:mvpҥM7:1)ah4^8Wj"^qt6bǏ6mZ=Z$VݳgWM#F LZ(t%tqQDJ{E*.=SFuXVuky {h~ɨ˖ڹC8p(*:j5gϜvss{I:>zݽJ6Z>|]ۻwn_l}w7m Y{Ftɚ5kG _ˊ=cptq gp:ux yƍ֯7cLҽ_l߶B ϟ=jЀ zd6Q5ktlݻz})lBn ټic||BD r$mllu!׽9a-dgNiGi+it ܳgf͚/ի ~ &5͛ ƎJU.\ _U,Z`ӦAAAm!'/]W]jevҤgϞiڗ/_̜]n]K^-+Žm۴ɭ [o۾=5U*߶m{֭)Eyzz(t%tqQDJ{xB.wiϟ?wuuW煉֭+AK-KNN._)em H@PP}NM1uʷ;wZ i=oܼI w&O ={|!+bg-[4%5B`3f08 F#oshѣ[&Mܵjj%<Nf Bپ I5/Z0@&M֬[oρvk4xpp~ݩo'~lٲݺԩ%A+6h0uT^ߺu~V~{6}:jn!oϜe2[i+it"Rڋ8&ryJrUa]ž~KSo:t\Qh8j*E<]upK;F+PjgNsZ& Uax? boyެP9b(NPrp&S<>h!qiǥt17Ԕ`89IRWaw&':9\\qi/ 7T(IMIe:ؿF#XUNNrRbjJ\qi/]* )87J \qi/̝k9[|mN^'SRBbҎK{I/p3B |)[Q GQ`(>čŇQ?+ ~(ccP$Ÿ"jA_boo!^R[dC&s 33#:Qʕ|e87piǥp7F_ .>U^F @NNH(z$̍K;.%y)CC$URgEɀG*U{g.Zs˱\b$ S\qi/@s1*W, 7=p&``X@_ji7=Oh'OJ$I&?qyiuex/ ͛69}Wibq1#G?aQo^^ˊ[7ot-[,eT*Թ+W\l-婩u]rUZp)*ۧ(euv7ays˗/6r=vJKn ݢj]vZj9|PXl]}t:]]&z|=Ijݽs͛+W^t54PU˖-}9x%޶5T<|*UV8K.ָQ-_Vܹݻv!I?` T*w>hРkץ)۷o?x=ޣ'W%dܺu87u:իMÆ YtQ`qC [o)Sv %ʕ+G}ն]gUUܛ̣~R2C֎5F޹#n߽"7n"[f5cbF;FY}"Kx.$d5ݿo'Ҿ5t{ζVKQB(* ??ɓ'qcG 4<**IFD 8#J k:#ADZe}qgUlBumڊ28 ̞** !K=Bn%:)˛[ԭS9|G]uGSSS].W~o;### ømݻww?{a[[[o5˺_YYyk+/>->>_x7w}iS[tiW[[z_]t劍]|;yV6 cфB8]K/q1oR_!v}.!}'MStgRRRRRҜ9E;wgǎv syy_ݺU8Grp;tv2úeee7o)**'xw/\du_K)_[1% $$t^/**ݺMY?쏉BXc]u}_t5Sz*4 ׭pĉ][}#G3Xwnwkk+׳D{8x =_{=s}7/B4nLKK0#=ǧ}~~^*г bD_<55z̘ӭJKK^׸q9+V,R~'xbp{ 55!"{45~?w`2GKYY=R꬙[[.h??sMMMgOSb=D{8m3Ə6ƏƶmYYN!dbBbCC]vv611׏ObbRnuiGSffB; ǖ3xD2ϭ{jݺW\15kB:ҵ\SOWWWkl}VᎊxO=e$V_wz~ݗ|?~߲e|_޽`Aח222e槟|cFMM͊j~z8)/ssMʳte>|K.^/d5/)Dk/17*3ꝝY?"WQP xx#C|u]0yGVy={,6^u\ Off[g9]x%6Z:11!z}4=QYuo9s*+ǎ{ҥݿekgEZũiis};.l~zݘs& )r'NܸtҹZ_YXXZZzϽK\|Q63֗hqc={߹c/w]JJp.OߵvԼO] a|W|-*UTT\} 7^P?3./=zttmpm9gƏ7[w8R34oC60m%u7LVw5$w.{䦵73LnCOM.$+rp&GD>Bmh=A'xCimD  "jG%p(FC]mTT$@Z;=\hc~= FŏG8Yn~(XKK}m~T(>vZ{Xeݚa0 r4@{G튊Pi#ooQQQ42qv&h9aSu ܜ`XX;رd7Ð݂%YaL`myJ Jtao]J!Yqe竟J!嬡:[݌- (T7*-:sKaD76Ya6۝Jf!fM7Im*ѝ-|6zjRt)r9 ^7YaT I=݇~@wڿ b`Kni\0+ uJtA RinN} mך& nB;Era3n)9 Ztg*uR݇^UU8 Z5Ya G-mOq IDATbVdfRN J?T I m'O<7fݵ`UA\w S.PIP+0[qrTzu{I`pr 5 ZHnTŠ# ҔR=G8Ƹ CinI r5wg*q Ɩ >cs$7%7(BVÖ6r[˜ BI5+luI0(d7#P bM7BgTm5} O`ggtnccdz5TBr@rB0LEHR%vv֤S[ { X!ynTBr@rܜ I!ImLp0 5& <Յ$P&[JHnKn}R)R"7B!"-`jѩPF׃| v ǖ Im+cP$P@-Nkm1{:%7CWuz57*aV*N!vu0$Yl'Oj(%YavJUfQOr Wڧ |*O;Ģ Z h)@5$7  $|@ Hn*Psܒ˖@ HnHn@r[0%Hjnԫ |@ Hn@r@rEPsܒG$7$7s@ HnHn x@ N^rs! OnIw9Iӄ'&6@b< kOn] e匋`3s}޻u%[_--UUB'M!Єr-rnw}7Mhx: g,nwFFzCۚ IINIKO3 0M"""Zy(Wtv ,3 a.K&62T׃ֽi=a>7$7 ᤐ$7:s@ HnHnIw9$7  *$+'u#\_`3Hn@ȱwmkl9R}tg5hsLgMA PǦ -G~8+<:&g{4\i655EFsab͎ge757 TknS4GD0ͶViJo9 zT'陯7|CArB޵+RRoW]9O>DGrzHVEE_pAnnؼ+'8͛f:ɓii֝7B.;nBٳ UFyfiS/++iii -r\hpS@ }́;'RʵkW]5k8W^~q~Wƿz{ӟ^O(|._gN kn9빽wx%&$&&$)ݎY;|̷6wΙbw|[P3$$:r䇤1--ź+[Z|111Ewޑw.\D!Rj&FrB>}{q~{+zĄ,!DmMmRR=g˗+ܽ'| !R)Cn7}񮖖cuOwS?vKT Lp ,V,㬬TVJNK3L99!!Z_B23SRR4Bp%6d RffFRR7s0[%PŒa6'N>㓜֦^1 3[]F[UtIJY c"0b D49hyi [rSlةAkȦ;ubr\N8=V'& ةZ` 8 & CFF?/J F#٢&Axy(;o2[U^=B||*[7r!UnРc}4*Ǎ|}rz=BHՒ񿙣F1WӻpҶM[wE$B/Q'~B*Ǭtmc&F7vc{:v'\N%`LKC!o$Zjb16g T.ihh {fw?z}ZUiDlDFDb%%FHa0KJEՎNII63?VBf%EQH:uRRS#XbtujU PKե2?.$FMv}ÒZfтP֬]?O>pk1BmvgΜGڴi{uޑ_piIK#0pLϏ1P"e"*m+A % Z cIDe56!Y.GӜBM+l͆V Z; ۅAل r0%vrv'Wq6 ;/`x3J[%YiLy R,K:FT&yyq/S)Uvdgei}}(<BGb~^ڃҬ/6r-8Q MWѕH {eTA`+#z2a>P8 q Z,]|vnn|v$2/˃Wd cldddԮ][_RhX%IMٜo1=z%\u% !Ϝ933?qݩ>x%" R š *M:uy{mݺuk׭5 90({^bۘs]v!gPekۖ_9{ntԙgBm۴3fLllT&=۹c\.'ZD,ZA~IB~mԩcc322Ξ;epư #a3awp14iRb;g-1pWN-z<,ąR崻8l%˔p4j-=N !rܮ jY;q=bajZyR!?͙3G*Z-E_]T\<<3A(U<*1Bj A;w~ѢE|KƝ;wFYVX3:j5SU ۶cwݼy311)&vo~^nqY-@"]1;7oKRh2sv(?7;+#L7oшD"Q\$i|4oޝnݺArMoM ˶P J>>[oUض}J)Ť߶sWdDdiq| #$*;6¿B6RBO0qp"cd-;61 3>#dac'dAS&OҵcNl{Vqͩ 8v>ohK飤m N\Xm4HkXtB 'x\.o,#6$ƀᔄ n$FulPCGELih'p`:VtdH FtlQDICzY1'O6,9E"FV]rUT.Hӥ*K/j_V,Qg^V+W)/]"Wz^P.]£Lsf+m@TKȕ={J%8јh()|wJ.*_J6(.*LOZm^࣏Ϟ;񟿨ٻNJHwV-i'ЈH'BbD/ =#E+//oO/B$Je^HP+4s O- x&%&'孑+[ %A!$>sI!>2nɒU`i:ABx#>8x'Sr억%mR)`~o9vtfݖկbsz Ig~u[A!Mwe3tHORpLD$'bW{nҔ265!;k!񟣐9 '<\džyKy#M'0l`BSp&)!1ޝ9YYAtq {>,,L*p7ɔxݜȈBt_nBˢnusf3LIIɉ UQcVSnPX, `zgd0عi ~_xyymذq۵kq<>7P>T6Sqff!c]6c#Rg#Xl_(/nN9Q*̨!}S{<;ean=sRW +Y/HM'X-#D }iđD[I%҈p:%9Y%'` 0_~HHVcsRIxx:9%9MaU^Z!ZV"8F*Ijt]Zbb""D[=^|Z!ZMq1\=EL.)0LǮ]yZK5 4 %*bj ^S##g Aߧ9ٗP8!lc8.ʃSpY$c_D%IzSs<`Vd2&D"U*jZ*8L~/d****M&D*QBlpaaW&ZM&SQQ^7MTPժ*1 fsI %c"1Ϡ=M6R-%)SUp3; |n1,r2Ӹ! 0UGNsG}+FvK 3O>"`ը.rOqfC C8XS&p܆X&a֙z؞a1]X0k" ~j:{ed}߇‡y*:{׬{Dž) M0n~;bcS cAY,B|_ rke Zm>RJ#.8A܀T;\c<|:;5wm 9K`*J TАW|ŀB9 W6K6}:<3r8==rI;b!HBTAHqp:1Ijs W`&X 鉐,ʰi [尟>^b3l?d M vwv}߷{3{xiG(l f7&}{ ˕\`X䚑{"+N鈇F NpY&Xrt0a7{ f.;a7OPMH* c,2o;ɶՁ q 𚠛[hvПerX!/RY`8 AB?QA[HX B OTa+c/b>has;./GNPHP<~3PCwԱ;- F/jTl0% `y_sm#^)f`4;n! 9<u|s|Y[~ zvq.Iç7+_$@+)yKiK34]RvrniC8l'kVTpUϸ}Z3|l"![74X;ݫT`+Ml8[%r=qefd1m0,1c?ab&?+kg.9X>:CA!>K8~ؔUngOJ$q}l ? ia1ϚRЧ50o|Rn7Zl~fKH\F l ml{Ĵnf>+=6vF.=|tþ~r 8`1y ~B]+Bzy8a'3':;TKf,qו! Y]c]ϝ>;S. XH`7{b3Scy-a rcl;hC0<H0/N AO+zzJxX9_#q ߜ?iXQv-5ᴻ3?ĤΣ23=?ef4e@0(k;Tb7L/!|0x'iɹBӀa;cA< ]܋lBrHu CTTW{Y0 W?OL6ON\U,u ~~߱v|?f =V<.CW.Uﴄs^I@_31):DBРO,J.`m>!T6Ff'2z*Myp[b Aj1X"DD׎j44CRz6xøعl0 ӷHs/^@5"??έ[u90SaTI,8b 秋MĆDEG+JT#JJJRٽ; B z|d]UBlL؉rH%^xzzGDΝ; g}ڨQ#rvᢢ֭[OڵK̶cR[ݻwou< D$Qyxz`%R }d2njC AǎWυh73}n!lg„=zR,X0x3V}gQ . | &rDy D.:dÆT^WU "--mɒ%ŋ'$$游:Cc5 W^СÞ={??ß~Z=o|V;=7ѫW/͙3WӅ>*i)]3`"Z@D~^^F[ ჇxS&AkP0~?^Nm>E"_@\;8x ވ*(ԐV[hrhF^;fߓlY=!2ܵah/0P.WTT}0>#--3#C u*D,NKOɮK>q#=m-}*jv;[=bQM&J)̣^Moܺ\. 1 =Orueg5v.\M( 4}JRcIHpIrN } L(pXYJ .g:H Z*gbTg Q{s*x~tM T[Jp9Rљ`.4<{`  B"ql6GEFj4!0a(je$2o &ݺyNt?m1>>[]bEۧBd2_vڍ5J*]>!ټz͚ӧOK>}P&.*ǩtEcܼ‡D>td={\vm…֯3[[l6~ŋ:᡾z ~O _l޼i *ХkjxIz}76_oX3ܻ{q&zƍݽZ: D1XonvoܹݥwyEnܰ>33L}xٲ˖-q c&''qeK/^HU&rpM<)00PPy92齉AAcƌ9w<ӄ }}N:>|L<|pNB?\ѤqcLVvWե׮޸v`QwQQk2R#sssߟ6K'{xx7LmKwq|]6u*Boxaaa!BH$4Қvdƍ/[s_ΚmJjw~ݷ߼]5ײ'$-HDpw7;jժTpzuFffFfO?n߾Ӿ}k~Zf ,<0fan?С=zh޼y:]ZHHȰaCjڴlF5) ^p"FӷoGw3veڔɏ> ޣ&O!Cu}._Qxj>4bʣGxL&2= E~A0[m@G&vWuS!ŀ99@M;"h`)+F- ))h:hEFZ\.v9+FHOHAAr]{;6KRu/& (U*XK΂֨FR)ˡ.aer G PQ !xJ '!x{FcD/>@ 6 V܄ H,H%f YhZYqq 5p;y7_MRbrf/FծT*5NIID"u:TN*􄦨 <==#"ݹMO\X-jJP-Rjh*w @7vٶq>=zؿ#ùs~Z&//;>sT?2hsJIIy2i]W,!2,\iPPPoǏi`sKot{7n}zg.رcNj[|eq 1b={VK۶mnj-H8''l޲kIƓ'M"o[bljۻW/dڸqәgBm۴1bT*u?ĉv͍2yRDD~ƅ{UwfBv[=zᄑYY}WwOF׮;{X,!k}%pr5d;@Paa W !dXFrrooW_} t pK7R`_##"~y_'ٲuk +K|;wl}u]6_~Z_MEطٽ{͛7jYd;߱c]DK ۺes^\*vѓM D:*gόͧ:.皵 xƍv=O*;v$'/_tT~:EsNfp!Gxm۴9r(rB׭]ѣG"XR*S!Խg={ <3fL=v|j#GןTch}}cƌ>qΖ%5d*jȐ.]a7n\PPcdӧǎ;vSO3h+'L+zz!w~6y˱T$nA^88ڰ-EjW.d1c4Z-w~WӞ|)P9ebWC{qQł۷oG(,,<"XB"7d҇O<=B#00\ &?x`͏=*,,DDCYYYAv9~ˁF!Wrhd;p .(()AG^Κk]߿]§x8Sg/>WiڵGEy<<i&sf p̙FPI|݀?dZ**.xK/v皭 qlhZ:O]N ݻך2(8"N@կW];w^bebbdzQ׮]vڒl JTd+W陘X7^fNWXPv:2m6k~^ڟ۵mC׮g^}IINUt,1G^~=rk8/pck[{4W\k.o}GDZ_nzwAܼ&50zWϦݹfB'p87vݺ)Ž{z:] ޻Wk4jԐ0ϿF\!2uTŝ٫>WjD\\[ݺS65ಲ hJZ \ȑiiiÇ#\訨߅"` C[l/RzQ\\oy_ͥR `JgEɽ1Pޱ"W>A;WnzQ9ط҈b+V\,5 L.ץzh)* ]jL. U^ƒrcON'HBBJ|}뒓u:7T!$z!J)RS2ӡ5܎hR*r:'TfK%2\1JA!W@c` DKFY ԋjA2.$D䫴 \Rb %rp1 ,IR) @5006LV)4,[`{.8!qf^^T#]?5%?@RNrRr׮[WTBkP())ׯ\epW\  1 K%ўT/<==#oݼsfǨڵ!:*RRA;P-G0JP33 E0Um%A~j3+W22EpL:miN.ǟlj $x wU.ݻD"H${޹I5">1 :YyyΗNo׶]۶'Of˶'N6bԾaۯ~<ԊhZa1F~&De8z&48!O}Bd2⋦6olOt8w͚5olYFd?w[שݺUm۸7 ]li_~~\i^i?VeK_kժI?"B-[Zj|ڽ{{ʘh4~gGHǺkWdffL'Lm6ڶL&w߾wnϞ+ggg!vNKؘILLz¯-|{R?]ruYׯk֬5?ۿ59CN}׮>ucK&'%G?w:xfǨ:|c.^j"#/^H]  Y@r=8((+;LJ\e׎j:.<<ԙIu:?]];աm:ؐl.LF_-9)׎oެYjJ [RyfHKK 'שl;&guyyyW]t+J>>I_6jfZ'KynHͿfٮjשJHx T_?b>{\^۹=Zڵm{yPvׯߐ^TTqf2grrc9[ްqSVVvVV_kݚ{FM߳Wﹳt:N7ѳלYRSSSSSG^N4{f!$oȐ>1&Ν;{Lhܯ뫹sҨ ϶ x0N>ݾ}[zJmN>n֜ٓL%ݳ3g?.N!!>O>,,4o^1R1SGݺtnӶmLVN]v瞛gp%a62Y/jlӜa"ύW0k-Pٽ® )UcӪޯOM3~;avG+*.C@b%??_Rge;l4c*ffreaz}Bs-^n8=-`N/[W~TiPٽ Ux\ׄuwq )IDAT'Nqy_!,[С}{V}ϝ;ߩc8 }4[ jE|Xb5 [9FN:]\RG J~"{{aT:zȤ䃇I&d=xjye!d2nBZ2p@DB2xСGrrrnޘm߱acFgdb4e7xyyQpʕn]3f|ApppvNΔiXDIIIŋf1[6fZ[h6oŒn]:;ma 'u!D֜hmZksIX>U }gϞ+.)ݳG]8*O?Ң[B?p0///""|QaWǨak7olMNIݳG7_)u`<6wL38%/`z3g{B;}Oirǎuf0\qfOQ}>tZ,~]w]㪜?|߷w-11To.7wт)F&ݷ?))yNHLܷ;_͞uFe+:报K/YhbweS8yLyvt@%$$FEFM4uBҥ+[o7kXP2G+Q 5Uhsg_vO sd -ˉhm[c]sSN¸_wO]vNʫj{\vcYi6ltziZݫgk~q+QA}U`; Ƕ/`zQzttTRR2StTd z s N>_V8  P*_m`0Ӈ\OJL2 :Xh4C;wL?Æhv!Y`կ'ɔ*޹zc.;~b]_֯EQqJ&כ4n|/թ/cnݾݸIF7[ Z;gZC0 K_8ZOTrw=}aCTjxBpc~~~2[񏝞|S,e3Ү:<}a<ۊ{tlGXmiJ\WTzIV?Ƃ(;tUEL! j5H*Mf3!?\!srrt֗Z}GEEE!H-߿vt?\h[o4@*UaA7B /lڼE_?c ƕwOoƃh%iaHزGkgfJ8ܝD~~Uv[v/orE&F1?ˇӦٷ={=<Æ iҘ_)uW K3֗Xۊ}lGXmiR(EŤXPP{,*,RՕMd~~" !!FCk4>TzZJGD+VػWϩS&⒒'1fֵ_b|֩-I$,<,.>i!LxߣT*eTTcjժ%J`<(V*Eєxzf@}/lKRhdܼ<]sSN¶_M pt"{pup=AawL1rښ׮\q3%QA}Uȹ(r3%/`;"j =NOShHȣG= ^I1}bc+OYouSRfsbbc֘-[cZڊL|eͿlVZ2nk0J\.Z~.Ԯ-wZ֎6k ?4n7jj԰~k"0vP|ZV-˷% eHNIqm|Z;*2C CFFok~ʧh浍[~IO(**ڲ5FPWq[\:vŏS, BBUtuijY\h#b6ޱkwFFFFFƎ]۶yŋ͚5 Kᄷ:u$D%Kgddۇ |,Ҫ+=zt'{-vfFlѢWYcnj%&fي>>>ݺvEty_{᜵yh4rDֆ #BL mƃJ={O>X,ֵˍ7yn˖{n+..&Cl˧G ս[K.39_)`0~``ݳЮ[\:(_\lYffVHZM_+TP_z.N[g`K<Ņ`;"j -izCgBzږrty FGtIsd2?޻.%OA!J^!Gi#|8q2#3c2޽ OYoyxb %˖G%Z!2¹@ \n3tBd ɫ\KJ=ŧ3էݾɕyjE"J矿;[s V͐jOGxT"QuA}A :8C?|d%(>!b^|)((!g lMMMb11-P-%$OڣR)Cjti'8^XXȖ#?((PR P){|E-ʴZ=P(jRDJ\`5J\AD"3HD $&BIPcZ4܈xT hµ(5 BaaNL Iaa` !hB#!B6!d22H%T IR'<3LCjpX,f+APbJg[, Z dy,t1zt ,R`1/lдi^ndi4##k߼vۋ ʽS#ƌ˼q It52Xj*;+#[aaS۷k]PP!ݣCBS&jzjbm 9_ݽ{!bhxިZ1;9fܰ!>6rА.-m{n߹kZ׫7bPrG=zblb@~TCt;b8B2W.wydW2TTTh4>Ϡo>svA~~jj\_j5@fa \XXxԙxzzǎ=Rt媟B_bbۜ-Ed2t;vNHH(*.FD Gڕb{Nn.a`@!؇1>}ܺWsfyyy]~B -,wWV^ӳM'W*%%%}@YV0Pi~~vj |~K cܽ{=8s֜k׮&i^{eA~yS:R)˳6lB)fܜܘ[|n۷۰ysJjlNJJ^g2+-7``y Fެ9_!v6t`]r^~v1wiw:], E ׫7kW/wnÎo."+WedfՓLv7kX,VnC'1#[i)in߹k$D" 9bă6mǕIC:)!X"`('DL\f4LfcfZʦ͛=ֱSG]JC EFfA xj@@ C$TKdrdLOIСmzjbjR)5H$?ہMGIIRF MKK;uL" x&¢ *Vp.-l<=<TJ%13baz //oTh z[6BVJ%/JT(je# +NZ<@Dg`` B)LgiF1E0_0a8"γH }Q,bVl"+q D$dōU!XTPY&ևHj4?Fl2̦gAD*E (Bl0 쑦蕛zd"dVn;l6eWUj'<3> -FԠ/.)瞫[a)SkڴinNnozu?}aL #vA%P/ 3D]vYxxj c𠁯h 6u2YNrr-\~b6ix^^^=z7q®ݻsssLX,;8q~{$Uaǎ]ǎ^\\ܲ+ǍQ(Oq@ʹ0ܻw_l{ǎmذiYaaZ ,$,мy3E_ӭk ^nVٴi UK/-?-^zŕ?"w͛y͏d}߸>ޜ5Wͦ[cB@0 L 5xzzQzzzd+<=JJm#%oРD"U( e>Ǐd={t'ƎRGA&;z|ۻ(83^mOµWj}Z >L, jLT*1B`0LFC{֣wLJ%k Armfoo7s;mm.KQ;l#C@)I%{qU-D"N،D"j=bwwvvx+{@T͈ᘳOLOBcKb24OL aM{y69fߧ9]HL^ f_qիu@j|Ό:(Zwm΁M1vc;O.7n׿?$$մe󩞳~t-]NYf [ޥKC˺$Դԩ^,vkl<ɧ$ɢ iɶ?@uOhtˣnj >v=L$f+IUVz_jķrOJrՏ y|+[E+?Ca*/߳jke^ba(!d#1s5 Г4q-q"BW~APQ b8PNRfimvC _&K9tښO@sFouC5klc)mpFT!*{,"N ⺺ tIj~[zT [%VbX96(PsJp5!T?|}|\]]m\B(BBHU}>RBOngd2x)j񦖴+Σ"Hms@sZoRxP~tPCoR#gJ 0=Fd39b$!OR X`2B 됧c2I7IyO**m& ՔzXXv$=#=~@UTQTTXPq$Aô4嬒 ?ߨH"ER eBHpppqqq-_]VVڵ󂂂в8(S{T*lenr> 2l~ "h^hGڶڇϞ=;vXBȃv5=ԔTBHFFƸw>~̌L;>>ot렟ف MQD\c3ۋBXh.b%7Esښ 55t;> Tn kj,vX3t!>BYLS N y5&JaFLLSc .0s6ɆEOSJi1*dxyLfVTEE.yMd&js?;eԥ7mx&6.? Q6oڼ~ڵkIPU'^:*:/b׭[O)Ptڕh4 By%Žy͝bmjnּERMF(((xQ:u!.jNl٪ŋu޹v#I?+Xkpdy k)b/)`&/@(њRn|e"kk+P$V aMviA$yf"hyr6ma;7Wi<bl L9HEqZOR2"^曨y6ǐB%IjLPMq-ZMFUTRTjէ3fΘ1ᣇbcoJ;oJ*RTE%%%jZ2Cn¡ソb/ٹkd&6{r\zᅲ:vXjL")K\tm6'N ڳg5C_8z3Kк'~K|W"R8}}z&! >|poС߯^]z^JEXzJr={>0m4~oTR&\pa^l2wϞ 'L.*,͍Rk kT"ߔ2{MuJ;Ϝ[{}s8[B8;wTeMr 6>QCO^3t j\)5U8a&xzq?O0^LI78Kk<чQ^| GL6mZ*[T* %RO%^ӢB Lb{[ߌa(arc_Fʌ(gzs^H..V)ֿ}X͛=UT **Rk0gL]hQV-^ _ow!-lv񧩓'~[q'T$z_07|k`BoDS"~q)&#7v 2W-g8sJ97 XOMPJHы.H9S]l("d V `L%Kdh6?JEž-aG'X6Y Y'd\[I-W"CR[z]OObuJUTVoZzy!..innJgg*IQ y#|;n&Mr#x&6;w}m޹Mg4m'M\C(EHvB(6V"xThG?=$5BKJ'g{9woydejNN\[PHfrڕ.kU[7]G2^M\[.N:"E/S !MB2B8=Z;5q>^^AiC&M|]LG 1$piMe-2)fi^q,6Nd,EO ygmA)g#aBO8HjɧZ5WJg:殝^NC3ӴVrs?{/wOwj՜$3),,TRXX(Mw>J[7U*ԔGxCH\~L1?p3NBfůꙒڶm"nm`z(J?gg*W vroU 눳K@`FPvG!T*rrJ3ԕDVO,VOc,'cMLqc Dӊ0<חA_r"M |PkIv N\F|`bةP"G}Fy%!%L7"1(^ 㙭arroYzl)hI .RU%Er¢f͚֨$`fJ&s]v/>.7k*q[h|ᘕVn!b&Z@j)ũdk0u yHwئIi d3Kb1MlzzQUHjG5QZq~aaYTٙ}@dRů( Ok;iksvyMCl1mUM͏$??3iho%M#mL4TD`>ݜⲼ;paHb!ߣC{Lz.a2<> ';٥/w^m"b46X+蝉2zIWM9Ԭf'D 2r*>M Ŵ\2f'l& !U5EքRneY%_QOHsBTB87 E?WlZ`KԠ@xpC|is]HyYjµ("%5x%q|e"H^-*:}>dJiPv2֔Wx +aCYJE$_|#4OK2s 꿣ˈGFP/#'3|SAe9CjXl,ƗkRc1asX5lQ'~rR?jAa(n& K.<  4(OlVx?1$rI8:S04X&8}ghkNF2c#\5OagZE#x**:υ 9 6k$\o.*'Z(D '"'egXo=9F9qDTDfbYq'%6H9i[`ZmæK]!dh+Z,3}>6ǜy߶O6ϹJSRS Zx'3.OpP,j"t65NL<:5'lx]EigCLN)runl":N@]fWFwhT bspK˂HUz$f&bVr3.]ՠA٩j>(ښș>ɐʘ'ʶC cs0yzQZ N yG`hןCvZ JWJ5ʦ:0Ѽkʧd`-^ ̔3w:cЄc}I]IMDg'E"eVU?kj^FW˰Y en!:mBd uѿm8$wS! *"0W۟3\Ԇ]Z8z+LbLJ 7x_ wj })>Fk;*uвRSkr$vBSŌ 1I{@I}9R hopzXI̵p0mmBx0dPByiyذA]c+93ˈ-""=t<ˤ6oAE-s]k(S JңQ3mjYܐh dhf>=0@U`qmZ[X,\@SmuR."DԆmOj4Rп#SCc6Dxy$<[ %|dosuC~m3M9FN]r :ŴU< YB= 4(7;uͬ sئ.}'˔ «.JδTik/7'G_ds^FWJTd}!8no.jC̶'VLj=NɌegBeML)>}INclSanhKQbáA9T負+l!r7uMD2zx{$񍔄Μ<;/w+7]bFXjS*X'*) jW,e>s/ Vfh@/˺J7Im(nBb9 AyUpOG^w9_ 9~T9"yAu[LdSl:zƚ eXdGVM|>HHavMn,Bknf8Ȝɏ_% re4a^ƺ-j,Ϡfz+.=GUx<ݟjU>Xʀm/'B-v &kJ.l(#O2FR׺E# 9PTF{2~aѲ<)gsebXGN*~RMb;Yz<:+;+11 /T\_ ڬ0^r9$$ׯJ#lMe^[dѲ,^" 1٦.(JOA ۆXn҈RszXծkn7or>ZpGY #GKPl$NnҤYuL^su6+ ..׮^)WdsfnGd3,.&yea[ +-f_]j>/mV$~Y@j)mq4 ݸa=M[&p. &gYU-ѿڵx* UkNS IDATJ^q olvey` 7}p1lQIN[༒ R|R[NH+M8 *CsZ~n%УV_f,.<0i3brKyl ςfgwwwTo5[{`1j0,OWtp,:&XtpETjSQ}Wpcǔ)YARK2gGjN7֊)22&0K OU?cNpЭT4< z Z"[bd&[TPHm^vibrZj(8>g(?8I#4M-HJJ/،%OdB%-sA [2<^\߯SjU#"u'ey`eV$B噱 c;\M$l[Dpd&SJGZo}m7,oΐfi\U_v?/㠪jR]dj60eV \HrBDSQaܲ9p6‘ڳ̸\+51YfV,(9$7 Xݷ#24 յeVWh4.O۶BO0!|u֭]ۮmիW\ٶK &LJѼIhhF?wۜ7.6  )htۓ&75HFPL frL$ɛO T'|eiMJL4,p^9x+-tD4çM/U@ÄT?I;2ߘÒWer9bIzP&bOL^^"w6luζ?~\2U'OذycNj̟;tСM]>,lOxbT5vF_gw3i֬Y999>>>111[&PJw믿۷W^Zu"p+W&%%0UVsI fqqk_14*e'˱fuqL cAP79I&GYdI/B .ԩӷ~h"Bѳg].]DGGyxxBcccfϞղek׮mڴUh2D냳ifgwi^N>Hgêjk?|PPPJ>>6ܳg.7o&MFZ+k׎9rK,j؄ǏӧihhX7뎮Z6mZj5glZm筛7cFnݪU-Fu6[߿_/䠱5#X"777?ԩSNcݺ;{(pĉ#Ϝ;n=m;wLJZg*&&=_ϟ_J={nڸQɓM6AckM2dAouBwjժ}M:Yfӧ M=HRoiNw̙ =f̘FӅ/6o~C_{m؇v900P?ݻׯOILL92a~"ѣݺ:r$%%e +Y3fԺu=زPT'W@~X_=cN>Po. UT1 \l%K/ZTO>y׵ڝZjeddůҥKy'''m&MٳG'O1Lf_tjs9p1c{}Pϵ{׮&r4nxҥCM6:%%% (qFp"OOG~?g5khѢn6l~ծ_͟?aD}I-DIIIrrիVEet_^\\LQ譈;wnFFFFFFܹz6J_PvOOׅ7kL_ l[ ڵc=z2J5o޼y0l޽{u 6g/f680dD<ލ7?̒5b6nؐ2id4TGb" ʊza>\fOkעT94 Q(Θa:Uvls*(PXU_|qcT,FWZնRB(iDq6Hp 29ovvW|||j֬Vعp 9tЦj|VX>}-lӆ=rd=_xѸ p+% xZݻ c7lp!X~ ވMV&m*TZBȩS׬YowٺŊ!ZV_p'V vrʍ0rիl|[ F+΍ vww9u3gϮ^zg̚mV4?0}toVǏ%tСChDGQiϟlwGK.) Bqe>:'DѾ;ԫV W_YvCۡSnzz6~ܫ_Qߓ ujԮ];===0~ČٸqӃի;nܸ:uBRSY.))iѢرTMys֭[KJJGFF*wtÆ{y+2jTtJ!qqqqHTFDD#bjx9|9s>k׮uС[nuvv;v۷lRR)S&7iDQimWk_B 52r֭dggY=q̙3].{i7l0tW^yE0a6\V^?Bڷ}ذaD6x{Ν(% 5[.!a<"} |'?%] &.`)C* zkРM7Z^,JW66T}}MϢ 2X.N~{ɷu;S\]] YYY3gΟU|^ziE?w^֭>>k|ܹ%Kťnܸ(_~v_~~z*S6މ[xӧyKCB֩SYfQH9Y{/| r iD.oB)r %Xpw s!%Uv}Æ?P\^^gZ/'FrF]B|֬YG(=sؘu .WZFFشw,EJؗйS'mΝ;'$$꫄5xr+H *ޝĖ|  >;pѓmשp-Vi_#ȨQF 6lm{p@/B̋;LתUK5?o܀p]´4ޓ>zPdBHRNq ,D0rKi ]LOOϗ[Nط/{zzBmؠSw.ҍ޽...EEE˽X"ݿsN_jC߿_jU??w9 /T~މ< < n(m֞lNLy`E +U݂/ɉ[CF {w%''߼uk^l6CX.Ჸ83?޻G'KW5,GXQʕ+'''mݻwٽ[!KvРA?]{ĉF޾}˖eggggg/ k^e˖ b%t:ݳGuΝ;/Y4--ѣGq˗/T~މ< < n/_"'''''g֩~g9@"mtr j0S=:'%|W̝7Zj""=ּyQFo4o gA5k:D>h[klj_=b?Y>YiP9%06"o{74ѣڞ)@ɛ7o..&4oTf+mݺ}5k~|\ Ҧ}{[V=f !^4-mx̘}`MoƉ'e]dFgթSe7p@DQaI ym/TNPAD'#T] i.tC=eqq#"#Je޽7F/[6Ra^nfzD<ލ7:ݱm>R&el-nܸQV-lY-ܼys9?ma7jurrM <@A\|+ET0x6#MXucF)..n۶СC`C ETS"r VPT=eѷo߾}+* BUVE*FݐBb@RN U *2{oU:9`-KJ*yVpEe1\{UTT(#`}mEjb"ZіG @HSfTޮmvmsGyݺjժ}z36lȘTHT*Çܼܻw >Pf6OW^zO?to= ߱cO>4@>gϮYÆ]_VVVԪªUfggjTNpJ٪ޥ[w`~ڵ322tAAOj"iw  4''+bZ˽啓qjj[)"訮76v9{{Sj;pVK1Fxg\USbԳ)))'$߾ OMM[.!$%%E?>o8ˉKhb=+P\\H$Ç5z!ɷo8;;݁\_Jj =zd=ڵ5hV/90> Uac#=_X^~Yzzzzz޳gO]xy g9y AESQ ƍ_ٽR_hPul?qZ&N%~yZ͛jby2]J3kf-Zh1gL݀u}=ڣ[׆kf\t6 IDAT -Zi^zEB¾7o֧SXXpڶmx҄ :A֮m׶M}U]*jӴWl)go.4 mzGѯ_HHhmݻݻe˖JR<\ YJy7|goڵ{zfbwKJJL#\zifM^{*䆗k,ZtfҞw ^vmǮ];v|ELӎ3zLKl9ɄscG8zĸ?=[{իN8aǎ?<@JI7E:thS|_. >mix#,ZNjܳcAo`3iwK>nHk ݷ{\^_A,nvJuz7n$un ~Ŗٙi-[Z// 6Tp٦M)B>*ʕ+sflڬٌ֭]ڍ$|qqqnܺmF-Jn7^OUkք4 \z5SGmy^k~Ѕ!%֑#k %t?*AF_D~u#dgg؉UT'8!-6x]?PڽǟկOILֹC8x?f66OmՔaʺ{NlllΝ%H}fUEnnަM<)omOkw@`&...M6]h<yyy\eih#g2'==VOW.<##C?<==4U;ֽkxk" sڹczuj׭]Uiw ُodZ`e-lxAAA7~dg!KݷF>̙3| !d֜9 6TTXXP4lp￵.\hаyh=DZz'۷KM[nU^4mh&+V:OgΚ4#ԨYѣ7nN|+%5vD)Oԕ* n' zȑ'O~nnnfg=Rڳw n&3z3g<]VڵkQa<ƌuUZ}z d8"bLIINII՗a^xO~sfL3k.wgLKKKKK=sF>}y+91Zqq1!DP'eCN|zZr觃yVvzWڻO9sjL %)SOkkƎKޣȑrQ=@j]u;ftҍz3viڷNNNѵ+!|-­[r;3:&f:*GDF=rb;6v罺w'stLi.]"Z?$仅+S֭;a$mxQ˳ƌ;{.;(cX|([iw5|q#?nъ QTG*ъ]5Z1N !DpR8 [~u raÎ?F|I{l*ldL3ZMDVgER8sBHOOsvqQJ4TM^aΝ{tB⚞P(̞=JUTٜ]B/|`SPprrRʥ/{Vvvq {UThtv..^sJ*NNN:ѽwj՚8i2*Bl D!痑AO&yT֏vI_??,Zժkש[^ʕQi>jBӀ-BWR5k>~H(||acUm^{rɘ^etZ,-[8rʰIG<{ItYGHj` UmjwEEXF#~[ 1`˖x]:d?uUTsflբE-̚Rt-\д /"!aŋ7 mrSp3))*rD&E޽{hڵڶiX^>^tr"+wy͛6EcKPTwۿ;w*/ZT y…׮]۱k׎]._d"]̌9q䱣Ggdd=qbbFFgN:Uz_CDׅ¦Oe f_l2nŊ}{W._.g޽M&'ne|_t&LկD~~ W^ݳ/+TTkҔɇ͍ vww91sgώ1sᑑ۶jwӃl1p6$b[{~Zjkԩ;M./\żOnn.!Dr~Jiw u@0 ## >i?^vv֑Ç80.f̓*Y~nnn,]Yoo4 ܺuz3nҸ^^^>l$7Oe,q킅SNӗFm[~~ڭĀ~%4it䏧L%Z뉺?{;{̴3gӗx^^wܙ6eP@Uϫ&˱%>~7C"< dn<آixѣFG75ǘcׯ߫{^ݻ7h`tL c/4l_nV(f+^MLu.0BΝҺu+WjKJJ|]믿ԲWkf믾|D0$dʕiӺU9gjц!!t;7lk߾ih&^ WTfhݪUmW\ 60VՎYoF+/?s̏k?p ==]~ԩ[<:=m;wLJZGZ&&򚨏9u>Ϙ1Clɒ;wo׮m۷8~jJ7{…j'~Qff6|/̘1VZTxt]O>4~'lWΞ=f͚nnn v;vNZaʝa_ܚ۽7\梯9sf͙rŊ ǯ]^vmӄ5jfݩUVFFd|;nnn̠ 6hE}||ĴkVg۷C40qo򔔔kw# Zn]m>>ԩSEEE_tihh6sIII͝7wd>sfdddddΝ۫wom`ժUoܸ^zΛ;o: (z;,V/ؽk۷?_/رc }ھJ>}z\Ȩ(mȷx}*ݻݻe˖J=/xII7_ sqq=o.vY-aH碾zJtT~9ҔST*}MJٹ[w`Iؽ˦FA(vAysfgeݽs'66SΨ _Vwi`+ڊC2t( RՄ"DAdQ4CaDUKJY{ei(F_k%7\+ Mp 'T#`UM!PU?ݡ [S'8mfGhmL(KHsժU[ziY,VJ*z9F t?RRoPgynHM35*Q8WVmԘ1Q+OJ5i͛j"nR]κk۵mӰ~~}z_zU~ݺ6_]67l@(uݻdѢ7fh;{߿sϞcG9tЦ.\l6}Tm1\t9~ֿΝC(dZ벷wV;Tݶǟ!3fܡi~~~#-Y tR*322rkԬ߯BT5%kض7WݾykU6o&jWZp~=saaX62TEz6WWׂ777BHVV.< %9^6ib*J&M aÈ&MX)}~6gvFFFFFggg8fԨkńBdR^<h7x=}8;F]:v5K/)]»DEk†yS>=c!T oذ;D:⿄+/ol(gݟzջ:0Cj3{VVV֝5m lA¾mIPPpUju.]&N6 W:7ǏӧihhX7UMoe˩Snr~%Kܽ]m~qԟW/;'M82:̹s֯?39hmN(䜨,Ow1M.yӦfUReԩ{_TffdԨQcy~Ưz]]uJXi`fffPPv?88X2ݻ=u#PJ5BɲeK,YhQoO>_G7"z"YLSSS֭KIII  \fM͚5oܸK)6m1=g'(o¦|سWy233333c\5~O>ƍjիǍ_^\\LQy T5[`Ttt```ݲeKR)>w;t8::'LгgOl;v8::e v_q̻)F<͛:t{t]N"sʕ訨2qT*Ձ}{{n4߶T<o:o쬬wvY2ȁRop@y6^=AAAꎝ:?^2<2d!Cu@H@`U $dԮDffp~VYA)P 2T5ދ+W VbUMz:Ah3{(oF*&W^{88rٳGojU~FD ز%V}3))*rD&E޽{cGֵazڶٸa6P,Z?m6 m{%}J*yyyM2hÝʌ5k֯T2Ow%`" l7ey$ b=vlޫ_vgnߣgO$.\b'77dEV/\`x{{Ϝ=}X!Njj!RFP(D"LX FerQ:Kvv֑Ç80.f̓R*Y~DGŌ4nÇ7 Ն6ib*J&M!5j矃}GQζn&!S"AA),(OAvx ) "Ҍw*XNH!e5B lv_>p|7ΜZ; =SS''r݆ Qꇵv.//3O?ĉt8B>ǓO>|noRR 4k_]|ug̬2tذ>15;8ws3g>v͛*}73&;+]b+-PGhƍѦM'L38lH*̳fgd8eGO!֟nLPAf} y4 6κ4R-yjB5`s @| LUe";y7l6 @Np,+jEaMR"wQw!4~oNĵkTozDsߥ`UY#K.4nsG~W_mǎM4Gݺv4qɓ'v+puWwֲejcķ/oڷBlٳfիO^gr?mے")_v-I#,Y( 5ɓ';b~_ϛ;Wm_vZ ꟖnÆB,^CRS78pŋ>S))v^zO?DetgScbbbccl٢TWƍh|o0@ -B]N.oח,BL6-e„ɏ<"tyy'N=gqM`ӐT,eZopkҿ%IOh >FSß IDATUNe'+N赚 cCTV'K+Ƅ :ޛRasUE8T9SУCAu^l :mȠ_q18*T`ڠ,/g+U 7Y-۪K&d{'iN}v +NSVFl]G+ѳǨK^0 Nʙ~l 8,Vl;ڵsjKt(TwSm8?R׶YQu!yyMg䓳s콥>FӘgC.擵eWǦ?b]w\ }ȶHQ;|Qn.GU4%'I#@jZ=3a͖u=R Wz4!.+$hKj)B(YO:|VokEHoOXd IGk}`^Ox2?'<_15^puf=I~*9Vu,K>G[B~&>p48U~7b ƮcA249@InBsYRfwh:%;zYT0-0UGg|% 'hq\Uq:>rhZHiVi0fH !}c}+T/+VUV(6Y! 1f %vUXXUFwL8RRrrrڶm;w<!fed;t:ydPOl:Ϋ3fQj\\%~ތUilR׬n`;sstg^YNsGl4 1@H@OJ ;n*0>FS=gf1kU 4ZRuCm/'@ 6W SMCh1EH&!6WZ5)eBƯ^1hT([2tذ;27feeLK:lXCp<34U !~?zK{kٲoݗ=a.:v7桢" 1˖.qھcG_Eݺv9险SvYAzm^W&ujw~{ۀ[:kۧW{ Ci@ 6xK徑Gݒ>辑O?n}ZZDD/GYg[9U{d'u~ܽ#TzӸ_ zJU+ 588-h4O[3fz?;cFDDDDD3gnp[Ycc,Ӧm޼Imtyyy' KlԛYjcZ%U;޿CcX5B_~9[\\,j_Ttt͵?..^]Zg=0;+'PEego.{W_r``3f^ (DjWtGBBBRR'7*ҹs焄!)&?آ/--9_+FFzbb{u!""FEGreLLYI;/yMEQ)OjZ֙gܑ<o?|Cv~r&OxA!p}x8k}||Ź9#eo޴5ӿϵ}npnt?|GhƍѦM'LQoqcdgeKL|Q! 6&egg=GFfְ{F Z1uCC@ b֯^w/Sg0tp̏ZQ`H:4$ZP|@ 6q EvS+ObLƥDG 6|[ Un9e o-<=((h ۧ퐘{YB6{֬>zkY];k&p: ]wuno-[VgmK<~ڵ. U_R'O|}⎗_jIKK[ao !/ZtС RS8BuWZ !Ʈ]Vje6>%eݫV駟 oVw6|㍇׋/ڧN.o㧧M6mƏ?uUuuKgy&...bO7p:.?/ĉQQQ̡&ptkE[6o u}02*ʵ.YָvvYx `%0pԩ@jWz>_1233۵k'HO٧n7KN.Z(֭[zm,p^*0 sVjΚ5kj{PPБ#GmȐ!3g,).3{v]Ç;!FnhzBJJv&'MNNLL7rnsUWG~`I]]?)%[׮Ο?w--""w|֭k֭=pOCm|}񢴴YͶsssƷ[9έen?II######;%%}eڞgg̈>9[J]~o.lz6S֯r|ĚݳGm\vf[,gV?7kvllbyzڴ͛72]mLPkB Ne;7_wB'$$ w$y E_~ya}{ !?.LJu977׵B쬬BQY53*j}%MjtKaa7__<:3ϪFDDdd'&B? ׯ[(JB<2a-z .IQQQǏСßY2&&ε 4B(MNN> :H9}jZ3?z]ÇzwՖr?ٜߟ<gM(..9c8⾑xÇ~mRJ^u-C9ȤɓnKҷ_?W>^k6{>}Ԗ{/gs> u>|~}zGGEFˍ73e}x;u !G3u:v}!6mwc/e&4QH UjjT R5R5@ZtV UjT T R5թM @H Uhl, @cS5R5@Hj46U UjT R5@HH UjjT TQT OHY 46U UjT R5@HH@j.W46U UjT R5@HH UjjT TQT R5@@H U UjT fL 42U UjT R5@H.42U3 UjT T R5@@H U UjjAR5 cƦjjT R5FjN46U UjT xw滊@cS5CR5@>UuE UjT T R5@@H U UjjQR5@HH UjjT R5R5\ZQq!H Uj46U UjT R5@HH Uj]( .Hp;ee hYT b02aE~`hҧ1p+,nWBD??I?pY.++=~Pnvv%T /b2MVFz^nn>쫆1 M]{\ghT( иTjT R5R5@H@R5WR5@HH UjjT R5R5@H Uj+AT$ i%E#-*U3pCv-rj*e4pZ`C/dF@.iEm7d:{+̹B$Sy2Zo Hawv uz^'Q8 UÓم&n[<22$(ҴqiAf5ph 6;}͌*?]~at!iuq&u**ssfaኜtAgg}eEyiSzV:?; I/[p1AN,i:uJ(?]Vʀx!NwY=?t:Zmp88]V@y_ah&&>υD]B:2Oj8]tfMaWj%z(RRZ֩Ke^>o$n-$jmԆ\.E9pUMwRS| βvOzG,{Ux)OTTzY.--5J /7-~:(5JK/. / UjxG+B"s(G%叒JRvprR RTUUɲPdfNNUjxnоslc?g%^:o\ gTm={R5Q||nokp7g[dQ/`knWm>9)xF ={^:׏Ɋ]~-//qc2cǥ<'N=KXD7o2ޓG~ xѤNFLMH})n;__kG=8Ï>>qH}Bl8O\jˎbbr"Z6WH3%9)O>A76ٳgs3|}K\rFvU_~}G^ۑn_u=܀Gm)**zsm~ܗ%o,noy/~/Bڂk}]B5k֥gd}ښj={ Bw 0z157rSǎBǏgDGF2o\Dn;)xM=㍟ZY޲c 5GmvEe},[v*gޫvQspm➿7R322\z`tpP`pP~<8z֯xy!+jnEt:]lLL"U}N7 yL(($ɲ|=+**:4yR Wm6eYV^ZaarxX؉ErQQv!Dppp9DR$:{DeNo BwsV8n2m?BCu6ֶ][ԶMO7m|yõ-7e57&&F]hsrr\-ŕd? Ѩޭ4 ͯ4}UUz a_B9lZnK=2<<<''wCꇏ=K+׬]?lh,W\y=|O7\R~e[I0N]۷ާOeoPۗ-_ѧOZWMmx온(f 6?+''6:J]R5=a{IDATiH7($W ##"u&:_yeo9,˝:rW\:=:>{}>WzOMByM׺|zk{׳kCIRr<=fV\{QEQ-a!! ٺC8eff >y Ͷ~ջ1IB¸tü ^.:>of'*{;gցٙǼmW7b|icB\^;Sǯcvqgߒ:^楅>O?SM}p#ZG+gIVeXUYx-єQ!r,^$$I[PXhykq1oLuYќ(*4TUV2D޹shk5bw'u BE[]_=mѠX,Mwrk<\khO0c,UEmNRk#f)*2š֯JO1 ^/44$"&IY` 6ׯ U[%%Wk-+$ը0LF [xih2Aa\_^ 7ܖV#iC#IBjQc H:-)B8Px!N$j 4ea\Tp 9I3qjTQQ8:jMQjx>p*.kWYQq y%N61_INq P(ASm6\.;r@%@$j \ U+8el.+-a4lJKKtZ-j.VaYe|V!ݶ޽tt*UUU-@mE, R5O?Wjݳg=Cmvk$IGGE6r۩ 7>?4f.V2(Y'cccԋ6ع+>.6ךgz|yS@j}eOFf/]\i+*+>'7pͦ6 &BWT]6fVTV$]Q(ջ)ܣUi?*/"ϮhɵZk^~IIeZ6=#33++.&CjP6Y%6:ȱcIwBgdkZsSǎBǏgDGF3IyEy.Sss"t^Bx|yXR[o 'Oh4'O )).X,g:]n^whOTpOf~UW!DaQQmԓۿ55 Nt:Ֆvm z!DLtb?Tt6Z`4f5/_H"`019!8$ۏ8cb:'uM 'N:y8,4ԩVJJZ V~  ˵yoFj-?{ث\)RvMӫ FXmClZVmlB(Tt6Zh εʲܮM1cv֙.t;S9}Wbc՞k2jxۨ*+F!DUe 38P7ɓ~f_Z' =L-ݍhے_J<>Ԇl(vTqI~aa ꦅedeEEF UUUy1շgF=6Zⶔ>mw8-!ġ#EFQ(\3F`ږh!DfvNR4g>}յN u~PY| "(IO^pP{U{E˅a!!9VG$I mժk(ԅАVs:jjE$ VknoQ7Up"Lc ;pVmԳj%PndDx5u|ZBBA ɵksZ|͊X|k /LI/k##VAj{RԅVAAy_glx=   JeZYg-$ I9QThQ*w1OJ:[F0p+l2`{)ӏ?M&ׅK P6pQ n-Kqq|~yRа0!P!I- Q_=mѠX,;Rqֿ}QoA0LQּmJ/fUs P6pQ T IRŢ7*/d5Lj0H`-d2K @SJ jRjx$ qjZ@1hTƦjjT R5FjL @H U7"ˌhT]VVxyn C#H?r`00 k`K@NVN+]lϤrYYÇr, L&Qde0jn>ȩZa0Y^LJAh8H UjjT l:&Eaw=u:N R598Ц}StyF1ͦ{)ϓNB8N:wRUYtxlF>F~ jE9U\ԥNq:Znw@K$I HC.,ee%PZZ匿c,B8oT*NY/QeTdEh <Ȋ 0`͟\'%UB6D\ѣG~mocu9##s&ۥ˕MM> ;wZ݌А~_w{I+ x8vW^{䑇;'uڻwΞ=uBB:e'6i9v_}.]:y5kZGh()Uf=~unBݻk֬{rޑS>'r_{=G!Dxx#'yݕ{q:+b BA'L~ÆSNnIN/ˇ3jt^v[^^޳5>d4/W+XP Ev࡫ۣGBlٲ|3iҗϡw޵f z[oYҷbŻ׳sf\nݮZhھ~=k% ?x=gXBþjjJ.M.v„キfWCBZ g1+Y9Wotiu޽}mLQYY5l處 &I/}9? 22w6 o{)ϓN3r렜ްQ1 mژ H]W P^a@ZR5@m)=€|[$$I[PXc4yMIJ!U4 i4fq;-#}VvFFÀ4p@;]^鐕+2, +S^vb= p^Jb{evL'IENDB`kildclient-3.2.0/doc/C/images/we_statusbar.png0000644000175000017500000015210513215302470016165 00000000000000PNG  IHDR pHYsktIME 3 !!tEXtCommentCreated with GIMPW IDATxg|UnzBzP54`@A#M@A"U: EZ {RAxA@&!$$$a`ٝ-8osR+o+UEKzZNCK`J|jʖu[",>eaQ/b (+J&"+1;[fb}#6) S[fbTRbKօڳ\'Z7 Z]nl LPR[W)vyJKq,rѲD 8.E>1S_'@/LQz[ݔio  ͩ*В5k~.mmlb, ?&'gD[m/ExK43n+)7C./TJ2]&ikښUܱ96EYůl9)KճJthk5O[.yKRh+.EXD[%BM&ZH>&BbG -%OB!EQV gB= <dZ5 XrssB,zv9sm XHI%i?SEH DXa7S-HL0Y,e0(PB3%0)Pbv3YXK]$]\,֖4& F.< kJennnRPU*zqi4^z]6yGϋ53v|RrzBLW{Jb߷褌JgaHFг4a>w/A4뫃Q/+넆)Ųn! vi珈G<DzR<v@8H5a9Myo#' |h4 tz"Q̧O|]\\S3j:PNS$_ό7>ٳczB,}N$,R.B_n7#+AQfafQcV-'l  ed4xjjXP`ڤF\I?*yOioU۷kg}ӛ4qLV t 5ؠ"܂v#ޟ~|G DPTK c T_bbC.! &NSý4!qUC6 fY1R 1C6FS"\MJ0>%AX?8am&DңǪÌt:]ZzZT(B@YXVT*ea!EATikAlaU8GlϽ} }lFvquz+[Bee/~5uʔ!Cү u-o:==?[0 o޴AaOhq|I5EKJ/gXq& kA\Q>Q 'l]K&J6Tc"6kSL&^3I^#5sp"1hdz@ JjV[ś@(´U3̍,?9&&)*E YA6=;~t̐eaZJMM)(xV議œ$Z,x _~9ٲe={vB q 6//IR]mFlNJJ 7޿_P<·ذ! WZeH;$ }ʕÇ@NNg}FԻu햜 #hy#Ffg vܩs&MbJlR WڢmGE!YF~=q`V1]&f?.ML6W1\"02~-LC۫K@)kYDhnV%mAfIjnbĨjB@!\L,"֢>҉FjG{~u2z]nseRV/_|/^hjUa̙3_QU*[ns^'XFf7~eq qm۹̙C޹c˔)#$Nm}}77Νjl /ܽLg7r9nY\L&wÓzmnQÇz/jN.,,/S,,]nz\~˖-3JyrS;bt%.,mQ7ZpJYk&C9pĊ6`"]-"(c6E0qlٯJx3=HU+ 6o6omBY:i'rLNHx8$-lS=xW[nf1!v [ZTkjz))S͞3Yg5jZVt:F,og̙hɒZvٲ#Gbz,EުMfff6Ihʭ[6hPc+W.]G~7;sj_~H _&ׯϚ3'/YϞ=&$:c\𰰤ǎn}{VRReVׯ_=gN^N=ziPwchTץW;b+yMQHY&Roh.x[QOb;^93!-dR/e=ŲDtfl(@tJ,/M3:Dn׶@fWSo~PfQ`:1E~Q0bK/m~j j׽h%ByL#Hxb (#x8R"MQc3c9%v_#C@sd$YĄR@1` *Fh!jjӖ_wڧw%ܙQe2JRi6ٴ'I).]{wnE/&a# q@Yach EQM"(V)_v̞^{_m_aHRU=^IfB{YPo|[MWQȑK{>qd*_)*/﹧yFoQi5Ɠ{^)k5%HwJ65%ܦ@6(H1fi8/0'6Wt@b<5eMmE(Kl}ئ {e| jJ- 6º#ձ6JP˄+;[bĮ5 "҄(}({(Rqgn/nZ=i JL^ܚRRT(\\<7 ,s6&\" 9=8 {}r\|l9)\SDA%5Aa]d~~~ܸ^ϲ$>:xgYO3@\~M???L&XȃΨQ?wߛCz?:rۮe˔>.֢/_ ժEB2ӧBO}MQT6ij1^rc..{}ۻ_~PR%\ެ'мys\^|y:jձC۷;=#G^Dtb>Mx_$Ns+l c7l'prkD6sX-Fj o>d" V|SҔ(l>O78&fcj%5Dp]3]UL_#FUsym[lA"~.Fz¡v*ry`@kyxҳ??TOw+Wyz{rBJR)X]M۶. yGj:%9IU߱sg&Q/232Gy!dڮ&'{'AW 2&Vm?DP=/Q—,SϧL&c8LIN2dD'B vusSTYYOuZqԎ RY(|bEfDs 07/X8&ZgKHKK 8NS.!P0gv"!/Rds! f %7Y<X0N f-,R?ENOy׽<=VQN䮮 W7n(5,!09ۤ9.\¢z}z ֩bi7\=w|n٤pqqq"Z^%E/}-XHYm{&3 ƥl~I;'DkhQdk8ffOGY'U5WSUݽAL wXFIJNwnNvvٲeCCCUJ[zZ P!2"ޅ8qښe]ƌϟ?KkwS7O2Dk׭۵GU,/C K0ǂ|Y^h<ϸD2ܑ^6q4i1KYDCr'0:i| 麃?_|AUmFx5)-YF< ˔ShV4O"~'G(DkGLB+/Z/A vW UbKHo/'i@Q@OʕJ W((ĩ*x")'$77ח9J9%*U*ⅅ1!bs۝yS"ld{9%" ƒ ΀ВU"u Q4$G}J{B 1-L`U ֻZܵYhDѼxQTjZE6)ȏK.kk) l)lKv B# @"RD)2ڦXHzV ~|Ei6Q;%"UՀjM đ߀9%{X"""g@.v8.S]"b9q0$N\mTsNׯxVm4bJuCm+-uij"Խ7,&E*b řIp!9(Wh=mGI-$UAQ(xu╇8J^Xa=‚_2 i$)/.'ob.Y_$ ER!2!&xyI1i%%N&RI(!G} )KAqYuhaEDTz 8!3w+[o晃Dhu])Bp+īU5Rt"H]|DR8æ5lD͒L,Tat!3ME/Dn0ġQA, ?cahԃ6芠^ k60}P\S="BQb̙ S8JYr8+RZ&E?1be)ĊJYJI K .]/B2PvPՀN H1CaAl^)Y("v='/ka!L$%CVL1k<*yƊ 8bEKlr(ʼS9]X!) 87$ > Wn4_ Rc 9Hq*2)!G \)—b?FIZc9I^gfWe~{DBY^*.!oFWٴ_;GHtfZJL-@|ٍ7pdʬ^;fuNb.)V z̖d@(6E7Cm`6a! ũ)}Rͣ(xv<Υ #846v^ &~n rR=B].Aڬg1йj5^(l2+!0lf b&8"ƪ'"N*T6J1ٴKsPyZp XV5j4tӬk¦9d7p1"M8z+䲨j41JD0_DЯWPL~$5N$bXe/Be_UKWAl%FvkPצrYq@t5ۆUN9; |2] ܞ!liV1֙2/Ұ x]hX,\l:\/"UHM,_{ZE`gFJlKؒETrbc6r^{ɻ⬔1԰MEmN6p ͥEv C*Ru딷՚ł%:ydOڦ.DmFC5R̴5^HآuДi_c"J:Ey\ol{Mc,)nooƑcQ.XwpNǥ9=iOaH<`ì,p\62DܗTb+Oą{qHx"]gKp:sWB2Zg7N3shCu/܄pv$E ޥ-%a a/NT9LWT h d4z "L9W B_2& ޳顤F, t[B-]D}ՐK]IHmw>n>Mx4*Sj39==٫[1ςbe77|Dbp*`Xbi%X"q?vnf4NK z۞Q 1jmEuqCw^{))S6gRCa3%&Rܮ86w6[QpQD oH[H_\#yT 6^"C SwV17XU&ad X8RCHNjFU:֖*A}{ 7zm+xF)0`/%Km"'*c67"A6wJ\w+<pM?B(>$R:[aWjl6^KջeIђCJV}(15x(XcF_jv#u|`W*ި]A':(R>#1]lE1EjXVOJfѸҗ۱ϰ;`x lbїz8r ptٳMKd4HLLi=f|jC5pjkQFMoAZO?%RPB9Mt&$$%i}^%lB)j8l-bye?b|Fݷ_[38ԖmN4F%J3i-R)WT cv#͊'V,W.*aY(-&nOM,mZ\D!^hFp{_u1ry~~~7oX25 :o|tyC":8䴙0' %oKT8Hp6/™!1-b-VQZ,(g }'i-¿YǒE? 8=CCCޯ]{5t^_d Ԉ: [6mjؠ~ڷms W7[ґÁլ]r}={'W[ y!7l/ /7%bBp7,θ%zd-aFY6ꄂ&إD"z1aQخnp[S/@ӌ8y}cM[7'a\=Uu!F #p\-^Z+\V k.^m8jΟo:{]]Ӥ _xqÏ`=z~s.] ;u2Jk7S$1Ec !Fb8$ Kz ,E 6A H%La$^dE|8'_KĔ(cjL,Ӽ@qgNBbBGbK0,pִoiz_ciʪxC ֞$릎&84ik~uzN;m>Q%Kڸy3-X 4p؈Wլ')*m#&s'[x MBMIՆDX"sV'Ȍn4;z\>".nٶ[33~!ꫯ{;{C /JdoOO'OL7ϴO`ܬ6JhL%d^GecXG?*dc0n Z-ҋ[Rq(yGJSQ,u8gɬ&W.Hwg873AsUR%a0}!z[K&7)1wnD گE8Q"6a3(Sh 32Xj)."#jk#[Jk3'3#JHb '6{I#HB{i[3)FeRTYJ`SZEhfl-QB rb6vB!6j-zK#s _e;AQdmk^-, &S g !e-tb+T1AA@i_~xFg} bSmct[ @G['ɛu9 ;[ئ|RLAm o涭X!A\6WRJV_wEiaz壒Fm"-T<,[(O[۩pMJ'h=RP@#_(;qw.b{ `7A8d-:-)%1 ok!:V֩(=a{إojLMn94kI+K\msq@ 1>*=CӊxvJP_E-QC# E<blI#5LUj [wk6g" phAkkq]0|Ѱ!C֮~ZC~[n]ZVmP^VVlO]^xs.hݺ`.___HMMD[]bAWAkM6ݸyݻ \PP 2g~Fѣ ի[n믿 9Õ\Æ W~ ]0~ _ߖZؾNpի)w*:wܫ7.]+W0`@vs׷GmAA{F˵Q|~!w3O[fa  x9Q[И{,fe۶%%%;O$ c˕ AAD.)[nML#  d2)S>"  Sk?b,suAA#.@AA͛?[nsvc87 HQ iMP*܁u7wUڷuN E\ zמ,{W^˯Tb.a?=q(\jҤUTm /ŷ Y3 vB 6Xy/GWclSb oow]ֳK#(K;!--rʖ!)s}qim vn?qlSAq*nݺ5u^z ߂۶mر/^43J6orɂnݺuСMlQٱ}{vNNrFQlY1 4͚3g@LLL޽]\\dÆ cB:8kVY׭[?ZvE|3g E#Jfm@ONN^n_jժ5bp___dΝ;w٣4i2BU/]wٓu1AZq.֭[߻wׯϋݸaV۰q;vyFll 2>5ǏV֨?swS%KDQm{8nٲe>|m6yZÏ]vݷw }۶m{2>>nٲK/  71/̙mڴٺe˖͛׮['XիWŭONJڶ};O4ׯ__d -i} F,ldv4qV=fL/;wnVV~矇ݯoϝcdJpĉ 0`M>lXhh{߿/= N>=pР>}| YYY999!!!FoScY'ةXA|||5ܼzuY* 3pS"XAFy18kaȈ9?vr_d\ nr}a 6t ٱs眹sϛ}B!(%KXk?:URWUTVVVxX(gɒYY(%slݼyϠԩ-N7a5 k߿2CO!AǏ6 [%m˖]rJ.2em_]6̞=xMJ$%LQסGּiiK'))JJ Yʕ/?uB˗/X}6v'%5Umo(9_}}Ҥ^^^/^رkI+IMK3/zQM# R~O*W!ÇY-:r}<{7fزiS+/׾m;w0 i --ґF)GL8fڵj_a(VVϘ6vZk՚1mZ a0yo[n[jOZGgϞȕYfqqSSSWҁ%JHLLdmO금Y|EfffffMiFTTݻJeZZŋ sMLLtҞΦMǯZ"g~c=FJ===}Ѣ\͐W iӦ2^Fy;qyBz|ӳO^ڷ(jO .Ze&:jSMiF3?66vϞ=c׮իVN0~}&BI.[/'Onݻ_pɫ7(9qK>z_!F 7$^dݻw= F [tw߉ ֭[mذΝ;ժU;v ޮ][1ㇴR={ddJЩSGJ9zRٽK/.]9*??q}FFFFґƍog׮]W߿Bرk׬uJ AA).ȀmDs̩R—;իRm$//QШQ㼼&MD2lX2?㖟flS:|x[hѺE * 6 7p 7p 7lys3R:=ZA:)BL2R8AADZ. 5AA68Ӏ  8D  bP[#  mx?#  "Y[Aj:'KJY((I&QtZyAh4  X)ښeD~4 %Ey{AAxQPHzWFQ`#ΆVhuգjJAA2\]]*TrE)н[JJt! XNURl; ps+m]̽B*FEݹw/ ;H]o//%:# b5Z;''ǷL ⬺3 ,xAxx 8zRB{A[QFk o'RWZЊIe}q~9 333Wš.*%zb NAVV֢]x!//jt7={6jW[zF.]-,TA7yΝ(K. !ipR˗1fts~Wbc9-Z3vqF&|ko߽{|A`PРA:u~bb' 30iҤ۷{ܸqcÆ 6jd\ [n2y h4wiӦ['L`۳o3&~ŊaÇLpҥ]{ѣ'OڤI̸eP[;!z A΋Zժ^-L/1.nٟtu֝8iy 6_Ubʼn'+W._xG~ۧwvn|>_zƍz֮;pbbƌA[R.XpIB.Yrʟt9jԖ-f-N,n`<=< '#F`N;tϏ&F<8hP^|AfffV[zh̙3[bz&xi9reʔG$lu N_>}ZlEߞ&Nݻٳ?mOs 8r3g>r/Y{]NаE3?IyB?Ɠ ᮮefA>>>ӦO~&eT9s.X0|ذ%K4Ƞvh>obpcQΟ?2hPJJJr/XWSjk!S0zݻUZp֭+VoOR,.,SLիWDD) ({Ȅ\FǏ}ѾsFQT 7a4kE&|?/Zl[R-[t5;;{ElAӦ4⅋6n\d3λG110&Mt={.Z{ E\B3z7nWϝ*Fy_ZsFFD:]L=HMdJrc_}%O]I7ʼn P[qRUxa%,,OZ?۷v ٳ%r>ޞ3q.ɻyZAhP/2k)ϟ(עjEQ^^^  ( {8nŲ '-:\ kZ-q̀  b&y-RPȵh,R B`W  0حD*Xw[vۥoۅ z-2  Rp.:7esn\yUkj@W|`9"ow@CAA!+,W G|Jܿy?hJ6jۧ0iFAL[ g3oNwYnPFa5j@@zң=+ݾzQV~aq}͓]zW~V=4nżE6şؾFu..\%w:Ď59Oל{P|V@)AAD4yz!+FMMzLIo=U:Y>ipLc1wVIJ&r 1EA5f\3NcH'%hjÛKsℕ{Wv߼b vknnᆛHlHڿ%G-? A9@O\{quqk{Ԍb~ҬgOs2C»Zid4dҊ9N&k/mjAAUo`;ur몄#/bؿr^[y %i~3W1Ⱥ%%: TG Gd< /uz_AAD x*un<5AQ"&wj@Se`~=䛩Kݽ/oW5[Aa<hbrUn0cy&?I +S 3r :Bwe {AA7'[D'+{ώo^M{Oy|JY-wuL}}D`MUԎ5OSv,lHa戔G4(Czf=H{/n{Mk)!z= 5  [rzD`V]^(u7Owr\,eû?=q:u(~ƙ|B>sY>cONm[ӹ?N*7xݴ)u?_d\V鴚MZtOtSBm  "*7';=^hUMeU!\Dס}{x<=3sw³R)xA33!AAD&t2U^[SzB(AAD pB NAD&.  "M[;.^jV.W)Zme W AAs'˄$yxQ2B׫j>/   hkPV < /ZAMWdPrY{JAq  bFj:'lַw\(QHQnnsAAR4lպe֎`AA/2"of ?rv  o @Zn44-%5 zAAy T׈1Vm77/ ={0xРڵB':غU-[/̮j$=sL^^OoYnǏ5Mtժ۷{-i$*,??p`5Eի[OYYYܰ~GJjj߾""JӍ  o&0QQN^ RU*գǏ[n5o^lFFFʕtџ^tٻᄈq?pE|c ٵkC6is֭9ݣ͟?9rm]t>xqlVvs={d{voQN/^;~Ξ= 73  o8q7kV|9z'D/iiitȡCk׮^^^_o4/:t|LFDGGO:8Cr={+W?|p`NwsР~}< p;HŨ3f\2+3r3g͊P3vڄV۪u B߹w8{h5XXmw+%Zdϐ&%%ռ,??sMB̙ <5e4~Ν6?|0//n!ZttTTԽ{6n_bb@@@Ŋ" ) s6o˗є)9C~UZO߹wC@@lܰCv`>d99\}g۷m]O=:55uƱFك̳_1bw2{WG8  o0/5! >}zR<</((IWԤIسw_~={r6s-[f͚jf=M65ϮSlذ8 CCB۪q 7p 7'hl7#$(8P*Hztk FDiw}*+Ѿy;u|{if֯s王ZjeÇnժe_gw+W~DNLjɨ6mڬ^ӳF8% Uls -;t[aad>}jH?/;45nQB1`@vڵkZF`ttեKse>} 8}۶Z,]zt3~;{^:_Uc#egF NףgÇEGGc  ,=剩( k+yJ]1N|J\{H&.+룽  "\. /)z0AAA, .#   !  Hqa  Tm a  R \ٖmqs|3@  "z,#Z'AA+mAAAJkAARZ5 l:AAAQ8FAx\JFPZ[F؏  o. 'reӦMIIAAA]:wEumڶ;hJ&BEY\2  LyVgLZVڵj͘6UV'~?fڵjůX^62?xg˦M ԯX\mܹßqN=zx_vݺensx?ĉ WNׯoXXW]3gmB<==bb+nݾKL䯴HnnƵl;HJ_TTxqXX!<)1\qzp1YɅ!AgϞ  ,6??zMVgd<8=k,ˈ QQ\iHHMK S0ƒRR˼(1y mKKKeQ FA yomGFF6:|x[hѺE * y5dm%Klq}ZNB.(T:ue붋TT-^oԸѪ5 YYYY׬iܸG}4nyRrF}M6]jujzz^~t` d"ƍ$}ٶ( mڵǟp 7py6`6mڌ<|gn; %30ɕqN)[v!6m7/88sNtxN7l0aÆ:vVZR2jܹ%KޭE*'T._ޡCƿx}sw רGXa;ޱ{O{."6Ta/{QAr{z;+̓gٝoϭC R.Իx: :a`4}2|g(d Eչ*Z0U*!*.ck0g[dž9!Gq\ ֟AnDh ~ɷE -)E[_t}c\r cJ޹};wH>>HJr K/h4KFFFvxAmjT9^nuwJ-vZ5jԯWٳ֯]fFnݺx#j׬YzÇgdd<1'ޤq㪕+wg:1̻>M6ݱkׁG .STN8y6fՉ}sukO>]npJrcǎ;699܅ #F7w.wԨQ={x,^ZNtҥ]aa7nj3fR2CaNGGפzV>{P}eΞ9SR%GGGGGNJ+;{H^ԑ#SOgO>=1cǚQGGss]xO" 12ם;wFѬyj3O8nKB؜"lպHNNvssc=<,-- !yܿhѢGegeBxu s΍9o~cǍr?|32|/]palKMMr\(BRSRU8W͛7e˖%ļ~`dƎ3|ĈVԮYS?DcH:7Wp\Ą_§F|>'L0D9ofS@`Ѩ(BHʕl,cccObmm ڷ3{vbbbbbޮ];#'̄Ba||SO'Je\ãzm: UɥLRY߸ؚaN֯_OaF~(8\NЩ ˵PlN:عko!رcD_!0`iRӱc[;GQ~ݻj\pqJJQ{T<~oZ]A>lm/Yjmm~CCT\ |jXІjbíhF\:is*ɣr>M[zD93+ٳMZikSSSSJ}?Y ffpr弬,ֱSaN#99wǣ](FGcJ0؞:q_BTJJЖ Ύf"pdQGCgO-SJJʸ1kz2txz@(bݩi"3sSKp&&"3󔔴ử,-lmm Աs>}mF"7> C{Ǎ]BO[XX޹}{͚777E:WQCdnf%cQQʻ "BǏg8ySw_C sMu||jzyvу!xN13tė1o<\puҔ)6nj?3gOji7̝vԔ*_ۛRBg(͟;G KDXXS85-֍j5D"er66Ĥ/Ku~U,Z0իWׯ[{^rׯ:2M/]:v?5WiWobuݹwq&S'Ob3WX{c'O^|XUrUj?UZr%///gggXl`ai0a|kׯ_tiΝRifͦL@ٿw3CB޿.!!!3vΙ7Ύ2x/֬a3ܺ}{3[4mf333֜VF}**||vsΛ3w^Zj꺵kGo?!$!!ӳ`Egtw`7<<'0ի^ooP<edBSRRbcg m}uBJWW7mT&]9@Qc2Bp| 0^1]'DaHcJÏ7DJ}h4&7W\.Ąr\.whTwjuVr4W(rUj!xF#W(-%S\UnzzZR|۷YB6|93Ve EWj5XmVjJr,XTj?O&WӘ]NVNƭB4-jԧxܴ$4G\LD5ȑ43.ܵ{2l^FR @ ((6lj D4a232kխRJsuy-6#ժ5?eߞpSRR]=ۘ=H.];jbb:x7obF PB 0`kuKݺBؽ _Đ<׎TV-`:1F*qs}&mT0#Ïu}uiޣ"7 s%Bw>O)S׉?hW4MHJ9h 'Rnko#uͺֲd2<^zFFvv/CkI$D7KZp~JMMME"Qn]Ҷm?Μep֟ 6065h@;;;>߾]ۗ/_/_d#H$]|Ў7յKgPذA}R٥s'v9lΞ=7?{{;XܧW7nZ}ݫ=/]f2{:Zx!: XԧwH*ψ*K[[[2thz >.kTTs&&&_p!-2kֆ RS+T9^B]p/^6s.%J4114S&|J4\,##C,u¸#8`&6۷O~b G|^oXXWR)!]޾l2ׯߨWÇz26eeen|Jngd|hcvdkcScffFa4hssslRRSMHa(C_hkuKO{:Z^8QZUԛ[FF +Y~ݚ5qG'L7e.]+,L"lټyƌ{B&N0}&MYuI hdR)!BckȤRFck{{,Us7_'%%$_+Vua"H&9bmmakg[ΫPkkm;411Q*$vkB*7PmmmNdggg*{DtyR}-ILLdMzڪ| /. tkBOn٢?ϟ/XZQQQLd3)JNJJKKsvv3w.F1r`p)Ill,EQηxԛ71τfLĤC!0+Wž4aݾcgzZzzZ;6R |S~JJꆍ|2ey<^xxD ^Z۠wׯuv4W/]TT1Bq{ҭ. oBZUqq[߸).6Ny|*#{I_kOwy:5tT_ ۓ9wGEmU KMFϭO83߷u͐NNNvuue=3$PP(5֭]fUVVӦMkψKDG(?yеy \j0_ |PXK\.¢|3OpwWf-MIIuuq5|6rJM5t;w.]ں}7nj߮ݖ[+ZPvO2RǧC`?x6E>lei_8Z7mLL7|7!u.ge))N]):uضc_xݿ.BJEp,R٩C{TV}yqbc^jpp+FLyטrtyBB [kO_rn BBHjJJzMn -]4!iۺu:'j{J0SLa1>.fqg^/m|E3V"B.WL Ξ>]LX?Q="w\?ΜINN٣S;ãxt BU\yr<66vvϛ;799999y^Qv;a_]dFl&:v&@s6_ 5ǎHf(I?ѺU˒/vy>$$$$$$afͺ]V޽z5jH?t0''mըQCB5klİa5W_l%KS,EXXGN[R.!Rbs˴̈0KKs[{۳mZHqĄׯhZm\Uݯ9'xɰCϞ?\$r<`gq [ \]Bxѣ4WWg''s 4G{P߅͝3g*j޼y[Q>&r8X~ڵh<%-{{I$6"5| !Ի "eKWW׎:6k|ر͟4@^E">ZP(Jy<BQ%k0@wܺOPP ţbXq15J!!Prp=GQ&_@Luu/"T`skσh"dY5%` )fᓧkWob#ż{/#C7닡XQFM%cO7͛6խ]`[RM2*kV~B5ͪ+ԭ[rd2ǿrr֭˖_gOx8Jhj\JerBVk4t |i%f ׯ:2MU+Vƞ:sɓW._)4׮xZtb;zԈ?zo;ocZ&Q&|RejԮ[&5ju+U2d2DEe,/ qppȗyP;3[4mj8?|M !SOo~ڌϣTgDM Q Un՟'riLFr"Q*UR齻E}t;|p?oNHT;R03))ݝvw(4?.6Ea4 yMWXbR++!7i4-oU&i54+k׭RX,xaBdz.W.vWG3? MNk ևu711eʖ%ļ.4eǮ]n_J Ü?wnqnH)ajԩRJsuy-6#UWk#*|SRSoܸ9ki'*棇TnY! -& )4W>~5x,/^^rڵ;rQcF{z"} ŖBbQjJbof9 R(,Cǎ!y[?x0,|O\\e&{{tz Wn=9IHLG4\\ .Y8ܜB͟gaaa[XgYaCjԛ糧>y2C6 !=W_'ޭ ^~}G4+!DVvub`%7.Cü[@*F۬iV-k֪iׯy !U*=fm;dР/YhU?`JB0T*suwyh4mT*0L:k?}<߮56n0cg9ϛpHTZWm|V,Gu}|Ξxqe-,6`-mțt8~ԣOM|b5޻'OM2yŲ%ilfob3;CGh{Oqjժn:89CBBBBBBnCS ѮcoAk|>?xם- sܾ=ًOqoKoB^;qnzV4#; 0J>G*i1K4yζuZ...~Xfdg􌌝aݡT*B_OMM ݲE_Lw:髥 htS薸xZM5 IDATsÆwLNNJ;vݾ3,=====}ΰzu} zu=cgMP(8P xqMr|B|=zq\ Mƚ5/]*55y/h+U8e kAvXʪmڹ΄vmZoݱb ۩6ndKgي))N]:[]6 r֜JRY"o3 !>uj;~){Q*Z;ٞGQ| )%Sv6666^p>Bk~5Cؠsa&9;9qxak[;o.|PTƼ~㌴Tg''G33^W؎mqJ\@a52wX[Pe&yE5<W$YZZz{X"/^^O?m=5D\P*qy|>_(|&G}[ `<23b, |i\)/0w3xFtgϜTcŊϝ=䑨:>>|q.^d)JNJJKKsvv3w.7"bfpo&:u@a"6e<}|mNa;t>mքaط( Pbkm SjjK/\0~>Gfϝ=[lY;tT\A|Ztz>uVi6uMuk*FQTg֬^f곂gT*ؕ˗۶n]L>{1<'RX>- GIԇ=4_@bҥWː!V]p/\>۾yFx^++˗iuCQG!W|YㄐqcFYj񄐱GY))+/ֽ;o60wD\qZOc!sKrY{3$7cK(pi~A⏟<]1(5>77www'NXY[}n}@ ۯ-6eܿw3CBr(mۜ!fПy`"oZ#ǎ'&&͙q59yONuH(ڵ{Cw8۷}Kh̬u65lP73lODȌ= @A滌Qt|ł[jeK 7޽{=uVk OOςsvqn'%%{۞W\iӪeF /?]vgnk^=uŋ}zEݺvϿtB~ݺJC?Y?&ꛜ}`Gc5hPTB6j7䰡ƌ]~۷oR] +oo|p>!&浗W9BȫWUl esǏuǷiog,>e B0 ńnjCkЉ!aغ<9e2H$7wm~]fNpKK˗2s%K !!3gׇ5fg)Be=kkggBHrrJ6Ʉqclmm w8bKϛWѻ\.:F͚];ulTκ#G.[l6mڷiS\F-} TB%-_ #goNH:uvGdddddd[?6iex:766v fff_b#:<@| I_SL y&@fM"!o~EQm⯿85;x|oO`~چ:}&nآYSrڔTGG[ۮMsd7"Fezptż4S}:5kj˫hF\Ĵ٣"9S1$VNstBQV >Ó8 xg<4lDM[6'`8hbaZUJѵdR!7PE* _!*.AoX.#g0>wsB ]PغX}g˫`Ͻ>{5ˌEm/F` _q\go6FҒbjjw[R{۶nMaFp>B89;k׬[v͚իVYZYM6?c@\4M䊚u*| Mss2Xl>7^1x<[X*ۮMkw7/1o [C''[|XRJk֮e&::zW^ŀ(ήVVR!yLNN0Vw綵UޑԴ[5ђ_Ǐ(>׈ѣgiSL1[nY)ZƎ6|!rs%Rb(-5)oT*6BXT xڴp8G1V?p-BOZ]:u8}艓nnz>#g[0bV{߼Z{ O"OHk ؽ]:u}N:uèG5om۵;y"PBT&S{K.KNN!$%'/YLT*ll2)mp+K+Ln_qgnkkuݮ]JP^6|>uK1T7׮ڊ㗖ζH泵ztz|fϨPD(v !!e/4MΝz-4Jz,ߪ={lmlʖ)mjj) Sr^ss9ŋQ;C,]Օt2]<GQ<.WGtKk4))G8q_lOZa{gdgdGԩm|533OH]ND,nv"aZׇZu}䫥T)B!OKKۺc6LR<ou1!S5xG<ύr!a'GWuB߼NMNd <& >9;p0˵07/Wknl_ϞC]&?#۶u-d׮m؞i3y<^떾=W?r4g'!h+V0slԮUطf+K-}vW{{c,|jX˘/^Vg+vkL <;}KV0|}*+OdLN`欬/_6hLhLP$2p9oe+eJN>|ʛe_NIMҩ#?G(ʭT"[ ~HJJrwx陘h8qcΝUy+-2q& P"c1tQ988ļ*Gyꕣ|BHݻtP6r*CC9nݾKSZ2sfBBBBBB~ !NNNDٳvj6gϟ?SՄ.q%.aF]lmڴoӦ\r#F2rppط+W,'2hP ,^|*t7y/V.ܼ-qGE0~G קbHrEx>xSF;nĿfLu#ϛWVV֒;x#Zxz[Fm}3O>m4y{II >ރ:ZxgmEgdzԪ,,5nY5|F#Iml*SRack#Ii1,d2YL.m#٭Un]^{Ž<$lBEv_w16ԫ ou̻-n٭Zbmݳ{koڱ=w2yu (@?v;6.)>={ڊEn]:붑׽su.1:O\գX$ѵKH*")!.3= kA0*24mi4!iSRE 2GvCQQbgnUTfl {;|^zwLFa+]ԭS'OwbL-m҂055Ur]QfYD")ńvJv["-:[k)3 !'cdkudt6FI0=#q ܣ"7 > vNȏ[{{y=}|(50\a8M!5ˑdFc8yr^eezx>a{l޶mŒl~JJaAֺ ۷iP(ˇj{[eJYK_ eeemgRr&&&*Ԕ6~}$BDb3ah[[#Tݫuޢt IDATKNIYFIP"NJNfMzڪ|ULD3fhτFسwr(ϣBxT|\<ţ\Ԥ5䔔O8uگ]M D̌u}䫥T)B!OKKۺc6LR<ou} D_-}m(OZa{gdgdGԩ{zx8uZTn۹S_ur+kY|BǦ޺cG|BZ[a{^H_ ԫkL4t}Ax5+ 0pʕqqq.y -2xp8N (2ÅA'lr-˕4qk駕kץ9;9 8@_Bf4]vm5o}kol3n !Z /]jkCڵ xBHZ5 sGhۺ՝8Zնu-d[4{Eqnɦ'Ћ{A:ҋE*5*`A_EE@ RPiEC $^v1ư,$g<'gfΜl~iOMOJNѭS 뽹ƌUڵ=p]TX ifVKNэ,zHtjҹS'Ϟ>(auK"[7kz}kVl/W\di~6jhW :v)۶ms8<&X,!D55j_'&&>z5SzLީs7Fj"ߘ/\ #3McǏ7 B[{'N :t׍-lHg7J~)mNKK?qCin2rs ãƍժTu `-w!ߐܻW2zg(gtS:u˗ ظy¦| ;vhG/C6o^tiN 4`;o֮]gԠ|IY~oB߷oLOKBj׌/C(e":::1:v et5mϦMOƌ9&)""BRI?Y` VzddQk9ci)"#M\8n-g|(ۑ]Ru\B11*UB4b Æ'fff6iUeyÆ oo[p9$I2} &ի{v[iW4F\z@Khγ@rޞ駟z̯g|k׹g t,Lĉt)0cnjuĉG4bRK/?~\yJ"yZHF1",Z*uU/枘uSZժV 5kPzg4>^L(%&MzgҤ }]à >ؽk3#ʕ˙>}:ԪS/;7nߚ :bW{k!n !f~>}_͍+Z'S{yL]N[[>FhZfFzPph#Z HIů>lwq?,Lxl6wԱ|w?^p:5iXG5X]JL\xɡGNG{*Qc&MxWp8FoŚ<̥TvۆVe9~ʍ7dװ~}zt.]ۖ9]:ul߶n/XhێBfMS٢A ӣx -ضcZжPykө#_-~έ?v*}384TybƆ6K?YX>Q~fyLZs9ҕޗ!˲(Ke9+;7"BVf,;=#+dezƍ?vx_|~J8ƫ|:b|;W)\rե cǎ޻ٺhK}UA=nܵ+f tM']NLGU|9uV-ŨJ2vlҧsέo+ĵ#*߷`gmz;v=ktZг{}!ڵi~F!?l̛­w7b X?w0 88HwhkcflݦR+1!t[~:1M9?XYBаgV^Cqаp[$埽jagO^VVդub>KY7ouv9,۬6Vp8h)sLĎJҨ5 McBjM…ZRp:/'%-_j5]:u,wg|pQ!I̋KIIMII@ڬA_re7ߺʫUV.^ͮoIasZh>o.^_ŗJ|y󓒒-P 5ij=scRS*DF^q܀f6LN;TB8P%I2} &ի{v[iW4F\z@KhE;[;<*9ewĚ[dBpں"ӮrբePIHFQZmVéV:AW l %jW1g*PZ<yjai@ɸu5hEkۦM6mtl}KF\{ZRTro%Ktѣ[?.^*{36IF=W_}%8|p-eZޗeu˖G>}aÚ4jtÆ^x!%%EPFpcb<豣Grԩ7o9S)t:}Y-7j4srr kpfkͶtڵ[~f)O~ԩ+-Yq!Dڵf[ [n5ת]{ ظy¦|k6mn;wyq)3b׮]svu.]R ̞conڵyvS knݺuYvRlcdž;V)٫W\\27~^6k/oڸѵ7|B ᩧ>xRdqEGGG.EkzjnH=;fͪnvxD5 D)ޣǒŋw HLLRʣ+UR&:w)))),o޴ otC\|q:xaռox.-iwIDAT"?mv AQ֝;>?ݳwߏ˖wzVZ^xC/ږ-曄v3˄{%I干oŋWԬiyqq))))yߒY mf~zOJJΞfMϝ?jJՔ5kzf+UZzjMJNE6@˽iO[rULݺBu\U?&[]j0z+Wf}~oNJϛ&!/Ng/7rCa]nwka?z7i`LUyĂ/>=(go߮ws]V5۴jOMOJNѭR~_+WDFD<;iϕ;vh?=\إSǹƌUڵ=p-ϛfHv6?Z]:wr5;nط' !4nԹ#JϚfssh7)cb~?n{1u^oua4p^>"߿C܍P+>otC\~ntªy-7vzm!9qGO^ٺeh`LH9gq0SKvtOop^xѫ;RETie|Zmm Iɽ{PX&2cBP@$z]w 蓒$I-ܟ999MV O $leJ2}vp6r͚[XMk^/&0܄AH4cK@ [([W,o!r7li< @n~) fdfV7$$$<,h0il !I-kjzd2 \ @Z#;QT/$I=Q.e! @qB@ ![dkl 5@ [dkdk2,d[%l 5@@ [l-`Fd[%l 5@@ [ [dk@ [dkl l- @qɜJ  [w^f5P2 [dkdkԲ57 M5PB [0[s%#P2ٚ. [($[s1#Pd[%l 5@@JLJ [dkl l 5@pZbe[%l 5@@ [ [LJ [dkfkYt@@aٚ [ [dkl 5@VLJ [dkl -l 5@@9ֲL'%l 55@ٚ3$ [%l 5@,B [ [dkl 5PFdkd5@ae:(lMdkl (l l 55PJd5PB [dknB&[%l 5@PXD55@fkt@ [dkl l ܖl̓9o 5@ [dkl l b@ [dkl l- @dkdkl R27 J$[ [dk2W=M7H}U&^a#tl6 6<[Sɺ ~zndlyt@gzGׇ4Y!Y$w,lc*c@g뀼0Wߞ"+פ kvf;J![ !In2J [dkl )$\n顖di%l PPP_uPm k=N(YBgP^73BcȎRVL<{>CPjbl vKr sNe$ !蜞^vNWf-X^;$;+SvM2lМdQlGy`zT=}g20)֍fggeQkԵáVX [\R]jmtxc6zovc^(rzFfLYwCTR=fI!dkkBʕU)L̰%la~Dٔ+9lp:322LFcff!挌 ??_M&[KW,p8+:俷-)[mnj˕!l 6dsg!:tZjmY5 YQrǎfϹp!B'Ԥq#]VXL={nwnHvzܹkΜoϞ;ܷo6[ѻxg"ViKԩSM_o裏'N|JW}ࡏ>WG֬YCnvsm8uԇ}mРAjJ[,뻏l pcyz~ӸBFoHת1YcƼt:n̟ǚ6i" }q0e9.$|ws8[ ϛf!D.݇>ERSSTa/T-p8/X>}ޭ,X_5k>>>`y'z,ѣ7I=L !VY3k֜UT!c5jx}_Z՞4ンsMlRpLϒ.۷ obݞ7wАRmku!єuj4ZC~~=>;$88DuĉJڵy0ԓ53!!!Fi'~۲͵[!n1& 4oa)oSSS-n|8~eC,ԠO曹NBT*ʴNltrm#,˲,I|jndiح^;۷oݱcgj\klaZ5ncF^j2!իU۵kw6 2eޏ|uјĠX688(BBttToFhho p(Ց=w`Νgeeܵ;nݺ?yro=С#ezLH_}위>Rk1hĤϦp-\on˙.^Lzm֟Mqy-S>1!wRTPR>y/^g*U*05IK׋)R):|}ܔ>٣{f7MpХsmw6CyۥsqoZ{J/'EDm"޿7rGjO\VO8{njn1]1j*Mde[PΐvktUzWT6*!$!rT=ҩFf{m?테ٝr/]޳OZe2Uʵdkte؏f'U!i֫UI5~_((rzFIIYCL!!af?tBOjGʢuTN̲_*iI!FUJ+qU$_Z,\kyd2 !dk\٤2H{9$*e&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc/C/images ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(manualimgdir)" DATA = $(manualimg_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ 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@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ 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@ 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@ runstatedir = @runstatedir@ 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) --foreign doc/C/images/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/C/images/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) @list='$(manualimg_DATA)'; test -n "$(manualimgdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(manualimgdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(manualimgdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(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|^.*/||'`; \ dir='$(DESTDIR)$(manualimgdir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic 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 cscopelist-am \ ctags-am 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 tags-am uninstall uninstall-am \ uninstall-manualimgDATA .PRECIOUS: Makefile # 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-3.2.0/doc/C/images/we_alias_edit.png0000644000175000017500000005203113215302470016250 00000000000000PNG  IHDR ] pHYsktIME #S(]tEXtCommentCreated with GIMPW IDATxw|g\KTT O*QAӋAEJE.(^s=>?6m%_Jngggggw33xť<3½#d dl6yXIٌEEĕ0zz}Bأ!޼ "_%*]Z[^$ȀP7"Ф,klh+!"-d-Uѩ[?#@h\m  {K0&{ֈ*R iU6vd2drR4UR*JD"26d2L<LRŢT*JDn7&I.WTRbV*Jg,K0 ;aW5 ]%;o~o̤Y||ᘕ3Ћ?u ` W+(nc$[vp*{!F['թcJyn#HV_8APgHqaNq!B8G.;Mh.a+<뮡 --5m8ΛΏYr\sQ\ iRivǻ{ܕ*V---5&:d,-5Lf&cTA+N͖fH_>O" 6LMKFJkl6CaFҒZJKJ0F{,͐>` ~sZ,{e #""cMEkuS'i~tOFk"cwcC—vihj%9~b@eIabG%pz퀈]9!ξVk v\.B% ]3UXKb8톝2%Yq–pⴡf'J?i_"hJla~ W6`^.C.~Rr\NRURXZ22 R*^|ZCK$';; 09R]7== |>Tf}iPpS(֭[.wqerR̋ smU`H@'j;w|>{ah_{SiɉNW>AOKMf>w ǎZϏijĶDrU B^S!8 ÔPU`H8Pm+bb̨*Ƥ }.&Wrdpj]!D aIrapJ\Wh*_&qO>|O'xHn"1p ѫ6gq>S޳T߶ *TZx7>mpZmyr!f͚9srͶϊKJ̟oX y(On;%:}ŋ|˗#B^yH~S"nw77n/pd)$8hמդ䝻c +?n1qsR|c/Z;vDZ֍ݞL ss,TȪ+{:sVRw9޾w;/YrJRb%Ο]{n޸pgX\ھciNL2٣;鏥Wqxב#NvzoVew]ʃ/.3s)5zS"xSwqu1(!m lfl1-O>駟.\(>>qEfd6&fXϮbى#S\hѲ+FnUV;~̑͑Mo;W#Vȥq^xAʨȒni=\vgxo:n}fMN'ǿrfQܺO?bb:.]p‚Fmڸ92_rx[yϟ_=bdRRbH!ϟ;jՈDh_kܸ sCܰ!y!}&"E;-~fB3b"w؂^rT=ة8\ Uޛx<*hti[qBEZ [O_- H}6p l2[,VB1Lw6c޳0b6K$l6-f6LDRR\ٶm75j`Mǎu$b1 SB_]sȱ[?c独#GK$fMztrfͨkh/txqӈ(Tֱq~v JIJp,dzŅBg]ŋ7¥0:+ŋONԷV^co\aﰎ!ffoyŒ` &o (kbm3G a˿8ɟ\ ƨ*=4KVpp<޶oFscJ8gn'Zj!fͦlCJow~sG^nVNvlArS*UD&M~UV6M 7̙剤4jW(Djפ+~yRY:xGwմi۶of0j2h@?pBbbVVV< rL'6'b O=n%%;wdOZZ|fslHpjJ҂ys;ǹY}gϞQ[OVc&8Cbn_Dg>`J'J\!-q#A$5>ehaX~ aQ.?RrvE ܣDu`?2b6[ܜG;^AJҫW,aDﯿ~:[7޺Nh1޾u ȕ+WN*W6PY_Fe)88dWlF}bܵw_LtLY^RV^.?wByЩ_f J aTIeNilɓ!f̜1w.&-!Qnj=ԩޟ)J ?zK4PV}̈;l$.x)faڕt8\0A$saDs%BL,[0v~Dc |vGaSu8 >shÜM3_wC &!bR۫ExjC8<^>-nQY`gAcRI``@V}fM!r<#hRJ$T"5mZ)ȅZm`s"YY݆R$PO֨.wY=z,--MJMN 7`!5 4ZM^%pIqQVFyg?Nyߎv]ONI2r3ϴ_ZNǝaqJIGIe`\QTXKIL@ՍNIJ||tX"IB_O)).&'b#ҒQh}!E:_$j__TjZ R1S!sU7*|>{DYuVwr-Q1K|OdޅrSTe-!z8fU@H|{^ q]V5%%U*U&-&bmTP+qfeuFHR l䔋.jԪ&M$g2[ZhQN]Jӥ))ɗ/]j4MdreuFІ-I\̐ޮjf*Ggw>5@l6[ܱ]&K9'9+^WDg&W@X B쓟WHho.A^λWՄ \O`*D:Crܹ#nRE֕*M dXnݼj2*ep?1)00Fx%>$ !G,! CyGM B1&#βp't0cDX+}@&wb9-߉2C9LRFV7P$T*u{E\JQ.GGFh}RS CJJ*P6iҤnݺ2wQQ>>ڔԔtCzrJ#M U6e)2RIMK0'%%!,AĮ}u <4l%Mˏ/MO04*I,}ޗ7#8[n UlIp`eOoR\T E];Q6&$OA"|өz& >/"&p *[,RjIjJ2H'PVU*U*F+1Ƣ3g]F\\\b4VL&WTZq٥ 5~yX4r֘seJ&=ķ4Ywt9%,Vיyj:QGY+v_>7.a1dv<"U#&qxE 2\qDsDM'VQߘ*"BfH_q~e|G9Iʮ`[XpJs4R0X:8rJr BO j`|;__Yti+dه~=eoa#18Œo3k"Eam]U?Ŧ y)";z>;0 HWbJ `L*rj'dH3BHT"I\9@k6ηvf|[:Q^1)WW#h^)w/h5P(@ Z| ;Wی%G9[p:0f}ZY`sŃg 1x["#2g_x_ Mh9jd~1N$ C/łrX^o]Dзݱ8\"fTZnL03P!~4rTg EM W$m뗀؛"tg" 0a:$y&X3 j lqGw"A"f!~(B/$,Sb?,K0)\1'FYzWØ^lż`} S w+}X̂Э;B< J14 8tShx'aU CjAtA^nT*T>IU&^&D u ,.X1OLյ|01DlKKSL eFK;᳢Y"0`:e b a 6'^7+»xzO!~M% u\xUU7âq4^*ιv..qbߓ@,CLE^^]򹧸>Lٷ:wc7B.V xUĘ~5! | ¦[.=UPp[)D$$<,P^RTB%!!Ao?ca! -l8A{/7SCi02͉ٟL{bξQr :ĝoK|DЉqlVD+9{`EÝ+xyTs'Nwa7U*UeE#J6@-ʜKNd蘖-Z>|M"h޼=zصs;6n䈐oGpoo6lT\ IDAT_S?pҥ%_|}6պuV*K# q, -Nya+l\rq1EEE΁|u-JV=jsFh^|8bpw||!xxXS)y^U˪x =@䁀u )U<O8~%K;wS'O^jՊUN|1][iX=udg#CP<| ƱB"W;hw"RS_0`}͛7 2[25 b'v9rT~Xj_} ޵k7jر#Fٳ;Py6_qwةcް~ݦ 哏>jټYVzJ"G|pbЦN+܎T!nuIP5 w#D,\Z׾ݾm-A7oF8~ !tǏ1W"|E6ohYo8D\\ܲKZ?lq]OmrJ*ګ]> 0fܸשCשscRW?|FR>ds)''iz-]^} :^ծƎ8}ڻ5WxIBjG~Ť߿ƤPcǞOǦ'V| u7CCCU*U߾}ܹS.g͙>{"jHHysCCC ֚5z !O#6nTVp; AD{-h45J|JG__Ĥ$±ڭ[+V$&%YzWv{_z٫s `;{WO>(;+ !tܹR{2Gz7o۷̙7o>`@wߝֵk7=zUE 'RhBfV_R6r NRar&T*>$^!C”*5|kBXfp[ jF"rr4AXfZT*WNߚ}RT*P԰֭RA=[`&!xapPo?^x@dKDs y!#UZ !bZfrB.}"^iX,LSFSR\oXr95z j'4+.*(,P&._Y,2̗N{G =5 oPTP`1[O(. ~vJaȾPsL!l6[~^VXPX,fm~^fI1"D ;!&*hlXopiT֫W-[RuM=ߘ4iyyy՛2h*-[PGAults19r!dϞ?SIIIOO?^R1un_~d{Bn۾=.footҦ[K](C('L'u5z̖͛ΛB'N|-6mڸ!0 pmTW_-ؿ;/\p *P(m۴C9sV.={rr\6mxΑ3Yٴa!C,2';gúu ڸa# =|!t𡣇gUPU=Xx+Z`~?5fh}@> `1)¤CB*U^޽K` h:?h4>uwBb" "ÕuaFx!0x䆆R?( W*+㇇T rxs{F sΖݻWTTH }A=vtƎmӦ4ouF͛O6~tN9GdY (b?A1#&Wv=8͹Qj$ @JOO?22!fplrF̞“TPPPZ!::9/ 4pZdȐTx >Bȿbʭ[69BSαc5jj4lw"## OdcNmSmW6$en /?\}:vܸqSNvvNvƍ\׭ߐ~Ν:++WNJJZ, _|u yɨQU EFFU~dIRbjEaM{kղ%"U{kӺ59r&37 tIIIÙW*C[s. ?` ߚ*J_˂luп_h Kŋ3ԩ3t`f>{?h2 PΔɓ7n_۷{z233"""iz -[@lrmZ?G1z w:U8vage2 i6|prd9taSk/\ V*5 T.q8eK$8==M.W[A"{b7edfnڴ駟Uj[8-k3J׮ST*Ԛ_O#lO>j>ݮCJ*5YL7d0EEE[lVۄAav9L^^5TNuMCFV?qE SFRY!1SAAAFc)W4JѨ@Xu@ *jjgx+Ƹ\(Rj03BU& ,$5x@IlQ8CŤ @2PbQ({A!2}@ =A^~~rRD!R45 b͖Ⱥ~~ Ĥ'[QPQb⧥ @!HINiպmFj55RDwBӗyxbH{T.__AQPt1_zYdU]5h}bѨYi4ZdUYTP ZH}LdD?)q 0+W7~!E8MҷUZ{{Vp0Uk'%W}PcC'1vA?б/+v,hfecƎ3v[f#?4ɃÏOqR,'}ԲyZ}ZiTHrLdĎ;< zqM6nv{H*ZfyYm[j۪ٳfc+?ٴS[ӏkVjټ3O;{ >O~֓rd{&oټYƍ'#&l8K2~׬A;w2 r/>[Ւ/RSS[(!!ŋ̞eVZ[ 7`[rǏ7MϡOLrԩؽ{Λ~Æ[`1u|R+nݺuǏ_~}ʕ33:sfS'ONOO?oμ9sXyyRvb),,}ra[oEEG ^}cNow˗kԩ 6޵k]{oUlp%`⓿ s}zt L|ɗ-jc3ſEpZrRzj KyjfcbDJ!ud8G~{2('jh F;T80DWIqRQR\qXH eZr"5DBt gϐ*FhZ4?xCZ[;ʨ DR$t( jER+ wa B!rfT)=`1$PʱS]Ӡ@@ +S 0 K@!`<s B`(p| XVA.d2=XVB٠A#V8!l`FXB"fcIm6svV:b4mn~}£ <*s )((߰Q~^d"ܘMz˿`G-N[-n@ˡcUdιv M|cW223<+,x`_({YmZ6;Kf) ؿ@Cs1ܾ-VyǚGwnVJ**XY|\UFRV !#B&n#q(bL&B]V._tTW6!T\gm6{MƎ+Wܵ;%5ϯw?!4x؈۷:8=ݱg?3t딀1h\&"5cQƌlZ2Z/t>zƔ*!Б'O*)-mۦèOj6bO|c%x Թs_˯';wDZp~& Zпߥq<pT_8nh֘aCz^6lz_^0ڟ5|}@> `İ#¨Q#Jen]'U2g-i3f&L0 ɑ#k:{|EA dɋ<׷J~CԷOwrR , ACP'ZOB۶tx= BƎw= k{IDAT!Dwԃ8xG;|O>|5$8Kv7^@ܼ<:~+ Ó'%5yDZ8ױv}mgi/J5bxo)V5))ySh\E8uQpFF7 WCtuwlA5mj"4iL;۝;WZ߭gϝIMKWʮ['PcFXiv…5m'l63ѣ;O"ݻw=w~II {u,{kwdzf#ڷk׫<b*嗺`d򕙙aaB0-pwG'ܻcHIلk|нwoCjD=x &&Z.CiRihrA؂a T(&?R}Dќ9VT(ˆ>-JR矿4Ds<{H$~yhպMXX8BQc@\oR) yq=eGQ׭n0OEEE\|||BB!P5Lwā}u~r" RZZFn <@AHncQUJV% |*#+3#D"IjA2NCٜKC8#9[+}"@b>*Va=PaAH@e@zkg} {XyfwX-A.rt ˃SjXV\^+NIIIb}"ɠj"Hj&Mm6sNvbh̎f1 w7X`Gw!!i˖yV'd*ωip%?_+L#ǎE޲a]N|8R|Gpc jMNvONzsz u:T= 5WNfn'Lsݼy !<,*h6HƎ>tȱDEF1nݺ!Cz߸iۚ4nvDݝ᧟oܼ9s4FcC !tgDo$5>Mu EEEu:O??pP.^Rݹ| l.~|ž}KJBIQ?Bshedl*Gxn^cАm;!7n?ϛ37. B  ,*,V~gZNVKKKߜcSffV:?mǀoO ;fdfg%BH==Xbb'\_Z,߳ Wh2jR޼m󦝱yy;cci4m{mRҬVkrroSnWX Oج6o=j[f͙ڭ۰aC )I^}:f䈝{W߫/t !ԤqYsl=ս[Wڎ]^? +W ӫ'n;v~|$P(>ϞhTcփD"/8'[ R!mBm۶y}ؽ3ޛ8g7nDEE[ w2۵CL}k2NJJl-$___Pߘ4qyyy՛2(f۽{/VRR2p`޽zRgϾ}'RS`=ثnuSOqk֭[o?yֹsgEFFTi6; ;m۶b/n]_ټinυ.,\0[۴izZ*|W^]0ukC][0κoV[;v:aTTݒ:Vu:ܜ\7Bh'Fpppq*-ڙ:eKlڴL&WCL0>((XP{T/:nܘPF;zH*~?n\ppF9bH ù#`=T]z^^^PP ;8i%K5Ȉ^ z~~^`` -ݻ۶~QQ1BH"8~+rL !#3s[oS^&BZ/ iok4#:ҧZ LMIt33I\ӻ=Ν {1ҹSQ#ϙ5ڹԧOݻ9s45ͰrThRr"==suir>\7mڼ |׬]l6[j98ΥIm߱3-6iHcgKe҅?lެHtTIwr}zSL8noj^ߣ{Μ Q=w3Ξc4-KW^}䫌A?`!ոtfGj$R-25pu4PLmdb'ƿҵ{jr#Q 1?#g HP0 PqbZ_a%(iHQ"k (QԵ|U*ub)(U:cifV#Q juff&R7EA6^NlkчU5dUj>Ít2)_mF)(,0gdffoM>Aa!:O$ ##5%VCm=Mk$u59hb}}rE^o2jsIjj5D" PˑcDRa$`ijJU/aDqeKxJJ H E[DPB@6 d9 D>N`$v{p.8{?).(szBvb>]@<tʬy*Lv p2%FS.LbAAd$w!Xei20ŧDn]VDKX(c(Ru?@fVG 9zIENDB`kildclient-3.2.0/doc/C/images/pref_appearance.png0000644000175000017500000010305713215302470016577 00000000000000PNG  IHDR ʼ pHYsktIME tEXtCommentCreated with GIMPW IDATxw|EǟI.)*ՂJQ@B E bi% D:tRHKyrewow~Nogfgt@ h4B*ܩr,0?6c;r"j U6%2+ ob ('r&cEX_`rR9ʎ$gΌ-ą?%3-LIRDL ڜ̴\=) kp(JR.O9ȍ;-ŒG(S(G\`8EH)ϙ;by\zQ\WU<ěC)tN1ͪZsYl3gSnb:`L8n#a((a>!dcb}zÁ8|!.MI%v:LˡĄb"@7B "vV9dG,-W#77W&yzzɩ^X7E0&e5T0W|';*Lìv?LgN.2!ͮ ­odp(E?TiՖ"6:m7|.L.V-g⸝' B\DX+j m1E) G6d2i:V+5EEM!Hxd2iu:V++ݵE=8lL&]${Fi d2b4atԥCv+/ ʚ9kvbRӧH8jMJd9x"k@`2E'@(f gRJ-ob)J{J)˧I屵 A+@yDѡ]v]&~r *o#A< xyjuvZJ&"P'~~rz:;vJL2|m3)z}vNNhhR`U$_E"@(3 ƌ jٳdZZbY9/ !/k<39JnVnqȳ)f[09ro(e ?7HS6-bSAʵ){6*P'nۑ ]6]q]n~r(nnX ŻZ6#3q2\EUuF`@GZMfI&Lyzz߼y#0@ps+kVR7mڔH~~^7n\ P*h44 =}>oq:norϯ/ EIKKGwsO)Z͊]Q&SzNRu֯9Iǎݹ֭[ףW/]doV|Cƺ(W/zrǎәDѳ8Ί+̷T*??|޺(:h5M5x 9]{Ϟ_9s/[Fl鲯,z枽?>=-ބ22S^7!B vK9Lp+AhdbWqbVhX-h"TӁStv{>S @0'ęQU=IJc&9gf^m63enQ RdM&jtzN|޼"ͼy-^QEtzVFQ۷mzDJ39_/^zQ7o۾n'[dbD\_CM 1Re)^}ܼyw󫞙z^܄5t֭[x8uj-65]z6|Ue 4j!f̜j?K/㏟͝ INxp-#?9Ө>I|@^^՛o$''Ӂ/_^pa:+GY?NK`! K/ua9jiQ6ݔ6y9?J?եln X~k~Re!,{dm`aWqͭLQ%㪉men5)NPrHQ]0)]`=߶(mq>kK0P.jL+t&qq%\ 3l,gJ#ɽM۞1+ m:@^OiqG j|t iulBl/ !ZLjj۶?~8VӲu=LDњ7|{1g}l!rt$EQteҔI^v-|hx^k[/610Q?7!Dשt:mĠ75ol\Iͽ%sV!4dus__wC Vm{#k}k{lbN(ƎDfˇaȱkY.Fti^k`ńbmJ)JJ91әud­YpG0Op!VmK؇y¬js:3*M-=4L!W[8!!33YӦ5BB|8^"~N~qq1äGi)O̲Mw<۵oϯ_rkC׮S3!qbW/_` Vvڥj:׮si}*3sA̙s ,W.b3~$x;,[-3M'ծ,?IJ࿧KX?Y":'p4rp^tv'm&pΟɍk/Wp 0߁nB~JoB`{’СփlO$֍[2V9v<7[NJ7nVH$H$~grοܦuG޹}$t&e)%EYR={zz({ӨnE~חH̥Y\8>DMQs9s\.52bԏa\Qi[Ydr#Nڝ!wѽGv}f͒#2yJ=ȯʌ۵m.\pJH [3?eo8z2;]pNq*Ge;8 +YfҙzYz[wQ,]עQQ25r dlOh6[ohSc !<Ǽp0f#JJ?Wyx_;2;SZj .{zy)aRR+nFgF33JT~7>}e҄Gu:ݓDmQ!CۓHTaAAfFigirIIމ?}uV7nq$ۡu%>~(H&)'[]XX@~m.H|t(젔J$=ɔ.*,ZunmJ*) EQO{)7'<}IRG`șH,q&p•E0b$\_7pdCq/^l/17.CĕRܡ'_PUט=qVNZHGlƬFCrrիW==7n zdH BP\~]ӷhѢVZR)!j4$]rãqL]ꚷh^fmL\(E2$']zӳ K4mk֪-R2 AM&o~7|x_=7û;wk;.V&Ky JЂL9JBlUt-b1P7p.,-|L¹EGrJVh^Di7D%sBGD&;/5ۙϵRL{ORխS'(8XѺ>LHP7lBhhm\qwәܽZSNe&7l(vmy99^OLJ{NZ]n]"=xϏHr3mzzFnn𡖁_y;?]żϪU}vn߾Yh6?. X&LRz$`?020 b16ÑyL|$b+ֳm"0hV`jan- kP22V,O6v~VY[4c[l#vۍ6'\̴T&w\.vhGMwQ浣YҜl0웷]U"ԶC.?\WԴd( ħZ^zVZ~2υzy{=I~dIML\njPo/')ii"yҋ5k88/fo9"ZRj+uZmMUCB ZءӁ$敄gfQreB1^t^VhC 8/|Bn?AOm|-u\PONHc2G,Wm^/(((h zL&pwe|s$&:|F72{q&r慺LΫP)*)'c,mnf,~MR-FwppK/{Ǯu" ij;IxR!ˏ ieulF0UfO%  QpHbvͲ#κ<`:P-2mes0)hvkӎs;Yܾ۲cxwp !eƈnYh owN6q|2Q2lF68OfWb6#+:Ҋ7^d"| o %ṪȋAOY:Ku6h?-gf:_Fb?_?;!V ad:oUkGkfH8:!gG/C1rĹw#O' 3i0-_2 Ttڭ2=̑% k|ۚ Vd[kN(۽n=ҕL{̺Q!=6SD,i3IAYj|8(MqDQ|L1"%-QND=ោOLq' +dvR'8'Wu8-oYļNi6IFd]->``vV{Y"PvoZM1"ة#xaGKg(,K{CW}ѰMX)sF`81V⑪ qcO@q[Lo-bC,cSrd/R+tos=iŭ@XXXOLq| AO⌳[mH(>KPe[UB.u 2UMQ)+a35;8EqTiJb/-_%6٬OG$bjɉh9oe[WCXPC9Z 윰$rMD(O#_~;XxuyvD#.\FYYϒ3K)͎}~ժ 2RlUB /1}D=4tMno0y ہklq$"֏P3+VDF)f ˺LZnUE au ?fH cqBy˩|tx{wO!?աTWfSx-43<;۬^Њ0E54ɫ.ۺkњ-6CI>5y xv3xG 2āܦ`(0^Rr&.9969uAow &!]AHhzyjXÚt Z ecО=p1&`E`Qm#w:-nRPCq6ZN[&]cz9D5tbz\sNͅiOsI}ۥe^;OͬOY)8o Xxa6"hFU&^/(6ׁo6OR)^v6ٲUc͡N1Dx4 [SԺ?5A3&y<uw,N.ۉHbVnL p X4 mb4ˁu64/)WjGkd23zlgdzƱI)GB#3i7 ~*˖6H(a>򊘬fޯ .Lދ˟]X1|,r1V Qm mT$vf=5~xL*$gI~R=.&FɜA1E/<=YK!h^F&zNlVB!+S-UFȅ臃 B.[H!H Tz pG|/ik5d:OUM﫮&DV8uVĴ# Z @o' kjlnz^^fH(+EM$8j秧ɤ\R{52]URUevAz,'WɵuzC@@gEUnWzن `ڏMS;\ߨazK}6tлoߣ(/cjm&#Gsէ.e$L+_~bzEoTiܸCHTn2yv]5ߜi'Bú+7r黀[~uDo\kڴ3PfcVʕuYlݻw>ڼja싧7g@9;Acw"p`ۘKDod,dUj>S_ &;r9| 旱MȕD.z .͐^QR嚞yJJʞx"2رrb;6y/"ܸq36nwrro{w8a@ zӅ[޽Ɵ8I{_5rı'Tjݻz}9*,Zһg-[{tFNfժqՕ }K)ce"L"qj^;w\.]u/u: m۶s΄]?k׬ٻwAߺe g ;x``` \|yM_QQQǏoժՊ]^f͚}esa׫wjjMnݺܹkV~c0?hn^6OlТEmv>tEz lPpڵy}e-ZlݶEY˖,^p7/.9뇷[7<<<66h0 Ƙ]qFqPPOy}v*ѴwAp 'nk}͛^~Ŗm郬\K߮Z'n{A]xѢeKnXzm.76j={P:{}TTؐ!k֩Uuk 80&v@[vl޽Wr!J:u1߼}{래xŋ>NH8tjaѻv&k„ڶi}槳t7njժU;#~=Wl#rUgz3ڲJ vTnq9;|F6lx)SᓧL>}4wGMR#{ĉΝwʫ(^cǍ믿,Q(F`7wawܡOV1cz#  ~Õ~JQ#U]E>GIz֫W?>sy5jְ,ƌ 9bMQ=~?Ǿ7_tq&^Æž'2zTD?@9*FGRo#G(cF:ote"F+ŕ,P0f(_"$eK5m5,<ի H$a<ڿVՆ Do'&%P*Vr&?BXu0 >3&8>&rߏ_3jT?P?&r_PPn:u7kZFH=~'b2J(pbb(%e< IYTVߣi.ʽO:٭[7z[nNzXfMzVZ$ii##mDwqƻw9-pD7ݵ%23jծes.leJ31sss9y vB,No)VT z;$yDMB@z;((88؆Vo;~V;g6cN3fb<Һt: (xA\ܞW4 BӶkHHJ2w(*:8\!*XrGѽ t)"=,R./o S-z=a𠷷wdd+/'/b2]}{w3[- RB?CjT*zVoj?;PԠW6oܼ1PU]]܀Ӟ`?nZ} eRZ'u֥7ÃWXbsrԨȯ;??W|("qD-6!T^=+`)#KAߟ0;{v`NpdBYv-HOϰfa/#3V͚fx?qW:cMҒ|6LO%mk0cGǎ.Pڵk8eddUZ:X,9*I\:j3>VR)tu5ʢ7ޮ_YL|ʆ lm{dbZe#]8~d^=Zݑ#>{ǎA5rSsX_dZ>I:,{E t]v3EEȌZשSgs cx߾}.]cN//*xzz{._lzAP4ݻw_jurܼue-][z.//ׯGwiӖ-I>!1aڵ,նMtlJRT;cbwm۶UUj*fW,eMR%ZOn޾N]t~QBb"P'99ɜyΝ6lޜ7'$ZPPAI??Z]qsM|sΘ,uVZ3&*.>ۣc2ULjGt[mЧ1l:[ϝ."#3cӖʹbC^:5kF8`\UQmv,UVjΝom 7o~C]:?|0!!6h vov;~b"\m`&\G9gϸ-C͒ שS&Ol޵k׵k<^}ձc ;11E}g)))>k֬J2,,ܹs|,3ϰ)Sh42Gj]:w_zqĉtݻK%oVNȨQ#d!v3&YȤ>{]~>>cAl=c'2[7nܔ0:,<!CYѳkӹټ/ =wH$+VJOϨQ#dhhMIr??>{ߒhWf͚~2{`|m t>x]qs6[0}i3fdݺ]q1_ ]j5]?1\ͪڵkM2a&pbaO֞ =giz&J`t]q}:uM3l3 b\H9hHO#2twykT;=?S5Zn_R 8!ao֭]c޸?>U j?PKio]$$c xz]ˑ ݿ7UulQk¹*hOuQcηo\s̙ÇziϜiB#BQfr]ZUz~ThD\*Q˄ޭf$-*@lMJJtLL>}CLL-[r;*5r쌎׷^oylwήcbV. ;ylY[ܤ?gfLpf&7O?-q-"٧-u'惏URWVO;ի81jԱB*rw/h 鍼ªxyyy Tn^H#zS "* 4E+t amDy<#U\.Ey_mJNwN]&'b Bd2PFUXuT䧦<.G*s#ח*j|cTEͽ^wMQ Pg'η(b-`]YEd֨]Jns~̏ @y[^M75>A)&SFc2 -]AA !Dfe+# RX\ -GAmgAB\hAATU;AU-LOAA ʍ  *7 <TnAr67OAۄ 2" /AA\8) <ՠr# *7  eOIyvtw ~8}/[,s8  A=∓gffFG\x177ǧ~-y{e\{F]v%"s?UT|}΄G/ qU)6 3+'Ot+gxpƍ/h4~Wz߾}袠"T[cbbU*ɓZnuԙ={v!G=zXZZZPPP^CQ {4ڤT۷ݺuÇ }Ӧ вk܆l !N:|pJJj@@@߾}{E`0l޼inqƥ73.nǓ'OFSvm۶믿.]믿W.]Q0VQ5`yd2Y:u&Mظqcs8Z P#.\o?~q >""Z. - K.q̙ <|ÇKe~@ÖW_ݻڵ{{'NwݻÝ:{o>}<бc?7x_M6lɏ9`z]m8 qQN:?I#vןݿwɒΝ; ?={//$P^W_y }BCCGi [~-[rrr .}aO]}צxu@˳9ZN]ovpp0M6:/d˗8vm%Xls㢰Qlgj Ip%)偁k׬]zunn?O2x0rO8FxFӭ{۶2yǍ3֭_t23y~|}}HhҤ]C9㏇}9rȑ#G3d)~7m|fo,Zh_D[WPP`  """&66rh8} !NOK%F:ݻwWFܼysHZH IDAT۷;g SI9yaÆ \*  7$T*պ)ի'V2 Ӌ\2Jh 6ZjӧOkެV bHeB*>uAq  v\AA=  bt67 T5mA:fyl!j! 2,BO?1rd@Az﹉atwlhG8 0 ?=k5JQ#===;vhFAo?z޻-Z4W(^^^F]xT]t9qx'OuN:5i!!!Ǝr-T T@)JRtDABGo+t:jY*UpHg5̻- Cdr^ܽ{w۶D¶)x;;v%\ti) --m!BQcuq-y>߽{O\n>e˖ll'bYQ!!tē'O N e@OSSS{9x$ȦyxÇ}\//!C82z7Μ9Cy7 ((hΜ[& 47sBȅ V\{w[ ۉ ⎈ ?uvaM7nС|4{zzڵkժUKLLߥK'O:uK.tHϞ=׬Yh0=zx`dɒ F69NC7oڼy#v~nAZ;<|mۧLon0qL[-Z7p@sw!CM^PPp{_~`0@-萾}H$ RSSkժ!lnj顡3gd;7n 2wv TTZj2x&wڽGGX}O>z۷cU '=}D  9$R$ 8 {FٴyZNOO߼eK֭BA "f?- 2u`hժըx5A*1e׳I} Rt ԃʍ   AAMਖ਼AAj1+M*L T,2H\$GB"UeS=kA"A CbCSമʝg<.EKj*Q+;AXB :TG߂lu('wP RTQ};~=FA*Bӷ )(= OWk{`𨾤mNtx  KtIٿjDQV1PR6VSd2vAA*ɤ3&yOR $8~ZV?3Uhd[)2ག T`ᖬw+4T~L&"W_~+W,7gƍw]7"eo1m /8y@ D*3T|Æoߞ HUWnBL&N|ٲvoCm:O] iJ"ؑ;v PΖAA۷?q0/AN ҆i&JުU?# _غuÇ wh?sLF[EEEpҵɓ ŀV^UN={?q<00ѣGӧMw8#FZ;v ݺN6M.Ųz~ʕ?A&1²t|goC} 0j!":-f‡vlAٱ}>س{ϥ6lp!ްqF:9yc?{.I6/^H9w\.??Cd⏦}TV蘯& ѹsիVt.ZsNtxonݲ-rt$!x=zgqcצMgnMsȚk~:ҵ Qҥ9ի,/g۶ioA'{0vm!d„ G s2;”jXxT! ;'O<\رڢ7FED| ;AzUk^oْ-[_7ߴ?\nÇHk# Nލ9(bDDDYvL~E:<##_'NoAgmUzJW֎;ݻpႲO?kذAdd$>0 UwK[X.zϟ:~A gTReP3UQeW $ Lq"r sIxP$*|oSZl He@(DzP&i8RPPtnPὂ T\-{ҝRa~őwj "_5(/l2_VS\ٕ[N|f/e T,~eyM/E*ʕ`w yy|.زy`۽?x𻛷n.\`YYrʽA1%[AVW^>sƏ P?/̻F ١CF3l0z֮iެB9r?cNw⒜eqJeqI?L`oo1cFt?5BBǎ}OAyf{rrr6**88ޮQFJe 'ټyFwގ<DbYzMY%a<'NO(xݔ,$b;G͌ 7k5j⥋ݺv KKK ?9m˖-:4l'< >,\ƚ /lԩk TQ!VDoqq/M&%%u͚(:6oޚyv1qQV斞nzonmYYYY[lcݻEEOLL2 =^lnǎ6mNMIߺuNw~s-?__A]^)S&.Y<000l`C =m x뭶r 0ym۶/Y߿~ 0x[M2U*ի5ӫW/,Z$--f͚# _̙;WՆ >SFA- 2SSF#z޽{{yt.V: 4M4>+Wڲy)-߮۳gҥK7nڀ ȳC^^^J`uJ;.I$]IwYm)Ȟ""K-e/ET_.DEM[((hKދ 6IIy='wξI:Ѣ"J-gb቟N#sQow}ODgϞ9c3SNDKMDo/w',z3YfE4w{'99Dt1"ճ[__xFFwy+SDR{N OF[hq3O v< -o.رcG2-1n??>Ṱ '3UN^^t&<=sܸ(6V?8ݝ8q⫯ܣG\q%ou `/y>0ɍ)7l\3UfO5-Y c3#E v)70Gȸ樂<WXxXHH…MG<$Gsӛ5k:u[Sȹv15b~S'X,F?+>qqFHOŞ?mZ|@&0{Vwݪy hoA p'<1qbV?-/,AhR8 'yE-'`\\䙙Q0ba ǻ*PJ8g[ky/ؾb&NO|lόKy#Nз_Ji&i+*.o=hXnJ?RYKfDLj8۫*r~Or97#VH]jvR9H^˨de<0;y VGOy>#u{>Oޭ|[K ƭMj8򝞞3"i`Ο;m]aȸ$ݶ<}-merK q?7cp\vN6 p }][n,`4Z?fg6r8 gdo?ã0x*JJKlYLJ)K P)7j<HZchk\L=U.\bLָoMѩsY=6*))nݺ=!r2"JJJ=6jw\&##O4H=6J 94w됐'N\GP_jDt܅ݺ^|Y@yklKS𙙙DԬi:Xj5L>-N+'N\|'~ӓ~?s[/!N <&2EYӦNmCD$ J`bۿ999^^|@믷ޙ-??|ڌDz gg7~Tiɓvޕ2z~5UD3\\MA6ltqu1qL w'Y~=q?ar\?j6}{6ˆX֭ի={lG=wVW^%!]}zZjgIJJvro߳w_^=׬Z9sٻwþfIxxؚK|3%N'?^j 699E-4{޽_|R.8F4xK;u86;ѽۚU+?֯JpWm+OWn,.ÍFs1՗^* 0:|ţl:_#sR|ۄ㸐VO5~D"  8d۾#V'Z-늅yyyDADgT*'7WSΜ=Ѿi"~U}ѹyDkaflJxAmIJJ.)){oL5:?_6CuH\Ҧu뢢"" 61u~U+o//жmry}%%%aaaa%{mV_,6RĪtb IDATW.^g6o\~jˣl90[s!n#Ē#Ē?k{$;wرGUJ#"e2YCZ dII#"i6~ "ZnCnNnIq ofzw"ڹ+l_ѩSm5W!# B.NFDY`a9}hy  rqq)//q;`waͺAAEEGOسWÆa=v^&7:uɓzɉz?/ѩcGK4p /_\>zaC;&V7VzAj[n?>ѣ??E"٪{HHK3h4kׯ1 Oii3<==-]2Y$_`วƑѲ+njmu xYGw-s?BZ͝^~~Q#>jIӻW޽`*E[>,fD $&2"s3+n I7@mnfM&F2h 5;rxlPHa_oזGFDZ6lGGXR_RXh?qT3^B=3blAB۶9}J"ڱk N׽[׉㣥Rity¸h4ͱ?JOO߾cٍN?~<翟rc/^ͷO zysͰ7!Sх }˖F _j\4_[o ^=ڴi#sr+cnj>w~'T*J5q„'N4'~y *ZVO4O?$??kUZB&Zh6":e!'%5HOb;ȦYvͱIIɥDw=盗otv导wo{WWIGkgI MFD∳See8S-k0wܱŽ{rg6[lNQUFg7:Jҗgdf˃^y~3q|+TqE "#.(PN.99+V6oFh6o ݻu>l'm}DԵK秆/i$pg *dD4lй+++ٸްTmzYИrm9|=f Πh_Ozr?Οu? 46:l$,E"6GY{KQidUcj4-4,L*L3Ƭ kZV*sz0R ,ZMTa" ۴kW~{ 4,T& H?rinXQqqxo Z*ԔJx3\7<.޹܎n]QQR,).¾vݽM*ιe,c AcL*1#[">%޾k˩-8NGD>XI>jvqjt/_qppȭ1%fŊUG!Gydƌi28}m w֬}3r3X%6mNNJZk"Zg7m8q8|d1}7L fۚ!qKMDf={p;B?3kKEDO?3c޼S_l%3vy)cƌ.7s~)~acWN4z#Ĭ}UI=-tK,Qii͛7#7ozyS L6l(cl=eđ#G "̆}饷kMawF#n;UmybI޽-_hٲ}zO|~{;T2cӦV'?pS5 ރgp͌\[^s'@זsKv98>';Y./u4ȳr8W|;31zxSrE} l+<ާNy1Ƒr0㻹9wwwϿkcag;~#|- I@@zfbT(}| y}.a8CVWcT*r9Kw8"\PKwˆ8H}]avFmxuQA7s#p{fDD<:Ȟ(Gmy| 4P薒ז#ImU&\[ jj42T*q3fE)VʜZjP|gYYYkMT*ŦGɺ1 q|aZme^nAl6q _i3|Ej_癳g_~XzcRrcE%-[i*+iʊ¼E%1%uߎc>kW{?FK1kzDM E 2?'Ɖ+++EnnJiד0+vrbCd72''e:|;Ef/=)oc]avZ:VQQ]4NWQQt,{i3׮ZNDZ6&v˩_OK$A&;w';~V٭ڏ\XUFff\M6[O4U8aϾ kQcGr5nK|Zz!i"LZ =VeS&;=Ry򴙓&DJ[TTԼY)'4mDx&‹繻\m}o49_{xzzg|7c?_Pf2dFolfcFL>= Yj9܉ J Jڽ'#3swօz5W_ Z;Tvr"ZrڕŒ%,׷~*O˺yfddڽG,_bO,]՛ϵk{؂Îo{yu#5u/]~W0<,tMr\ѥs#G%W$>Vjk쫰+W$FgϝJ_ FW&_\bszc͊el2N6t[ʚs 0`e0'r;Af`*>p>'OEGFTj*:*R_~| EQ?ScK?7uH+''\.S/]%.B9瓧noK:i }s_##*~5ixoo/ggA$$5cG/]ֲ*<441O":w|~;w&&_\tXOOO 7_5ujfVL2:ܵ:[)&>>⸟<7/͹I?|-RRRJʈB/'@3vھsR  v mf"pG*+5s<|߻ttjbԘ1ƾ iǰ鯽VeegLb~qjZdFfntYY3}PK6>}z'c6J!(GTY9D/W^yq83,\lCfzZ.ߺu9//"+;G)7o2.\j/?jjmLAy|M^^^|@$cƾ9|188HPhqL.ahfntY=5b4~ sT~k1qq1qGvtAze+ꚞgEeB.wqv]~.".[.bW#8U;m׵KgWRdwֵZWaamm+aOxhm3ɌN\c'Yѭfje} lpOMؿ 2xSlΓH$Gy[divN߈'WwL<&?mq[|cmӺ BΝ~B,7Ksss>ͶoDԹSG}͖x|bBZ}Uxh覘ضmZQh6q[vq6Q5vj,@Iqh)ɣz~hR2<3#Ւ&!yLgZ#Gsrƌ0jU.c6hh%H4IssdN5*99gfËG,s֭}] +y^//-b妦tvqQܿ_P^ fIƏR<u= wϗ8U8qpwG_32xdn>>>~  q2ZhR!q:x)rәy\8H2.Jbo`ȹ_ @ ;Gz #j2L*!jZ遇R()++MINVVJRlZhh :iV4yYAЄ q T;yLc\662r匱⒠- ++*iEyA-KؽO>p-J8Fq\銋rE^nJJJ~}Z?P\\*$kW.ձfl`-L**u:3}yEEż>HL<YR﾿r5Qڴn=y7WW"ոiÆ ӫ8GڳyfS&MhڤamK/<___~xG'O)<}j1q[NzZ" __VԯkNcFJeaLclc'N*ա}"ʹJ*ituZbz*~}hO~am=pʌU*܆SFo5+AaΟ~>y|ؐo3?xw,ljSͷ_=i&Fg1}‘ 3u\}բ?h1lpj^tY},PyzoN,_rO,]՛ϵk/^k.raxX z%O":{T*=w]ZeJJؓ9޻y¥Kw}3-m;o{;w'X'3ڒ}^ML|W>G | {:-\ 1]\}6vȘ- :]LqcV(SPbszc͊ef'a?^ؙ͚5U(W&UBѬiSSC~hodaæ?hN55̛:L.|ꩋ.]#yS'MO?ixoo/ggA$$W-<441O":w|~;wALªLiOT<*UtT~⓿V~|Y5Nf%G=[PDu3uZcUyfA[8tmڴgm(:j9E(qcؙDԻg#ǎGճYL!pp+))ȱGrss 8e2ْ:K[&6o]OJ-%%x9a׮;w*H} .899UVV]bHV7ǔWTϵgfL퍷*++]>c*S'[u -/(|Y5Nf%yoΝ?!˵T ;vW_~6Vk\z^~ᆫ3[.}_\RB]|y ff1"=FOZŋV\MD?׫ȶ.[>|萈YO[n͞XޢEf?pҪk3Kjsr:cppBjÁ2̒U9D/4(RyzZ,ۚV{oo:܈F봼yU?pp {M2FY 1tZUܿT(O31.<\P ;=t\<3ٞݻ 5WTVrgg57܍Wws}+aOh۶Dڶͮ=ᡡ۵Kqqcw)66/??/?SL\.Z Mz>k֯OKOj7.[QhN ꚖnEzt#I)ɩ7hԺ}Ҳq[,^={=v{4?=scfv5SL?}"zb 3nިM&Ouɷ<=< ۝""finnn`@ӧYCC7ĶmӚB۴fi6dظߝ'H p+m>:w8tV-ˆ&(q,oDSuZؼ񂲲2܇ڶ9)ȱq[_yiNvsZ'XYY'UTT :l:D+huH+C>}̴>t4mrJs&j4ڤǟJDR/`WDD%,IO ){v5 TSllѼJ"4qqqSeEF[n?#-<%;'$^<s<+.g~MLi5Yi)}JaNNJW~Up_И8@󼇻Gaa];E[Jw"FĉGwJ<qFn <0?#3KJLM竐˱i9w8C&sRT&svqV*r7B.wqqa:ixǕi#7sG 6ܷp"7 r"7rn@1xn9 p ȹ~ s"7"88rusG=+3x#7 M[{ ͂[tB!yS?.󔖕ݸJigFF_Nq5kTPX%Ԇ < ?33kzB.av)շq.T*UEE9圝]J\.lԶrD ŅtVP4Üf<ǑDmPop?7"7 r1Dn <^  DnDn@DnDnp op(Rt{Ih5ZM&*>yIDATc]AT&I9DnhZ遇Z)ƺee)׵R1`Aq|۶ee%u5%RIHЋ HsCbFD Zmc>PcҠ/p8lfxn9e­+F:M{qqlڍ5ֱrA1}d :]Ee912{>eAٳ˱z?}omHq;2rlau8"w/ɺ~/zg#"" b<Ѻ97=tNccDҹ3y9}FYv'w'OdDtk֥;f`eKʺv...x)έ_wؾz-[SR.dO'%mٲU,|cFټ_ML ⥋o%ZfӦ͵o!\>{snV!??ͽz#GM6URUӧ9z\,H$^^^%w`>>> r?|-Y|<ܵA,,,2Uy^^8+mu:'_xc1#ws?زoпjUzzzM(fZ,jk0Μ9h+%"ow~ק[h9{W#F<_NJKX*G{jպU],SRnh4Zc<lj<)7R++5II)/ G ZnѼ٬Y3cb>+oo#)1|ƘߛDԽ[O ;ug s6iϊqg #ǎϣKr2u=FMJIziI6 ڛ3yLfȹSn"7}趟\v$99.F.ryvv6I̾[܌B&g'$\s|>wԒ3)FK8U7<MfBbC%%RZ<5JrmRB8E*U( 1Ż0d'>[|Lѱ $vU\8]:\9qFoM7Q)J\`(E F9EqoNuԀb'%9D3wr<@ TZ(As<=vtZTٲpp'`oC,:W,Z\SaWy]-U>-Z'<#^OL̶/ \.7+dj zi(Tik}Q"jQēVCgF9CW8( (.Ev2‰P-9K>[0\,c Qa1hI}XgDwS)(S93S(Unn_qmT4%cg#1Q?b=Fr<8ع8YN ϐ mbgk ~Iα@^\!>9On%SSEtrBRzɤT20/Ţu:BPLDD9WOOFcfVV,QԔ@>Bј]9rj3HNxx(JKx09UT b)##=111sZ dfszz`{S.]ZU?ӲEKeoѼ-jfo;CBw&SI_U+tB$9;[KQ C;I. v4}|2'M\zyyy*JP UXP+Je^S>/iZv$UuD陗'ap^^7]Ӧ}lA a}'cERk4"iNMME=zNNQeKoZJRoۺb`,֭\ t[ lt4[ .ӇGy; bGIcz`2RPݤu6rY ̕al6g V\P`ӯ‚gI^W,$$$##Dj23ӃLչs}BtBCC32̈́l6gdfEϊoM6ܱ"ef vߓ'-?lwB8^z:uK#GBGQն Flނyۢy͛#jxY8Ue\d6ۼysw{{qEkNIinnܸ9:-ZV7k矷izׯ]4jqÆvmtStCn٢QP1ËĚ6)":a  bwN^19XvlY7h!d;o:[oXrsr<<im[[M<ǀ6>xxC3NƝ+V_~|y]]qh39v !C?ٸiU=ll6 Fq#50c[2.ݺ]~]v~iE2هQ V6͍7N4B~[.&~ƶjd;~fm_Wn*UΞSJu8XSN)IOB_0$FjvHɓ'Q4/***)1ܹsiSieÎ{zzinW_={:{1}*3B9ʠ+l޼gc).^pb0l 11tNLQGQ9(#!di2( N[vh LNө1mGS=rе8>+3v( ͲŜNM,:pas|mOsLFуv)p$1$=I^ojFnظ `t"!֮Y}?l:y(J&N@g!psʕp}4{z^jucft}y޽G?:6bdz.b`dKINLF`=W΄Ra1mg9t9s|2ӬSCM#HȽ} lSE^ `!2PIpQkJFQY; KMMo1({”IS"%O|BhQX\po0N}\|f郇RQh5&`Л~ 7dg ʔOCgOƖɘqc-]P5"_4e;l(t{'=<<:|}}zJmJJVxx`>'$ddd% Tǣdr2 EsuV%ѻ5,4;!8UV=~N۹sy{{kZ|IDmr"_BeVsgyk/}(v;9ٽ2mٳg[7g;_oN7jx mۺxέo|a\3?s8<}m}tz`9s,st9_s~tX%l"CXA|"dT@@rW.;+3)Cdeс22m(@7L߹uMwܸFgr "ܸz.RHHXZyuQsժEv?{^{vԧyc;zXNG>>m4]!4e+W|F>0Ƅ|?qfq3~9t>>>=:գ"VOz'j !OO_@ EQ||*WQLJdڤ'U̾?+W&'RU\%%9!Rm}Tm2Y)*qJb@*8$43=N%}||r^Wde{zA\ Zދg[+zgbv{h|xΝ/VTԔԪ]j*݅ryPp}hpޝ\6o^;V^Vq zux}jRy#cУv= D 0Ok%Oc6+(V4ǘ 1G[F~=tć6(;%*}RP'0*C|O- F EսRR˗}|}_}~D*AA KQj5o/䤤dLQ>Ջ T(e`=<hh4yx(JO Pb H,\|$A)7KpKsu)VKޒI$RW=ĻBs}AQL2E8z>0'Ȋ8`(+!_:|. Z f-D9,I9zy0Kqȉ[iYK)2+BnK7d"]xRW"3!XMJ>Rq|g)JVD͹$(A )Dqh(f[6 ;ծh@4kzqS LP#[ZS !RXkb %.ytqXDBV{4.d.k==G/JIQwel9 t,ݬsW'ܙO9$$GK2ۛ==Sr^sz|fKa 2'QȾˆKO Q\$'*2on?pvmޜXCnyB,p@#8hH8)ñsG&vn;.ssDr s1C b)QXz-\.`fWbb9AS.}ž hU@8BƊб6cΒؿN%.5$eNӥXٳV0O?%jQ4wq ,ÒۏaQ+|;MZ)ynA KH")ZI}Xɝ;ED,2(MyO4ţRc#s֎voN"hٛ2` $_X7Ql{yĻ o1Kȸ#6כ/"$H(<*]*)s=WF%zrѢ`~,{1ڗ^Hl 4p3AgLArT:%Y`^wq'Ka!=)ʌ3Ŏq U(wK}1F )|wmH'`.^%I>n[|%:.0{ qK+G?/ɭlo(Ì0ڱ֩srF08~1PCǛ=P\u)ҥPT7D/2#;&fbϸ q,ez} ]`aoo^_gcDM(Dٳ]e9oMqRf<;EHй%puٱ:HE%#q5Y$J.fӑ""<߿)zCRLze}.0杄rkb55ŕqd>d1^b[( !,}AĚB$|}CXo^1iJg_j\B%śdF6MNkE$11E -;+iѦ8f8q.,`ÌQI,>'[ 9l3Pa X]|%n/ YԦRT#演 jƥtG8Ur<|"E }v:q;b) iĵ a =N'>c+ RpXŘRk!չ-HUIp]# 1&r@,-`e .OP]b]o 2|aܦM:B|QFo>::Cb[mZM֭[?e۶]v]hNW0ϝ{/^8eVZ!ZjժU+{Bjْkղ/ӷ;3zZh0n٢Be-Z+[ha˓/fܩSgL@ IDATȂQz׹SܜFsNYٙ[U˂5Kh_؞JAR/\̗w&FȎIuȎ0װÞ÷Am VZb:ʌ"3ykk!p4Dc # ]ƍwe˖n۶d2mٲ}Ͳq~-}'O7lXfsα?FV/_~nܸ2~60h?x[qM_#GDNݻK˗cvɴi&Zd2MU+W;豣ǎ=vE5_ϟ;wL:ß~iJ|||F$&Tg߾}޽Kƍ  7nx &YgO.efddeeN4 wCMlBpo19v8Bf͚j޷oO?kذa*6}(Jaa*~ݹsK#͛77h@Ryyy9ٳm)~Ɉ>~{g+Ԓ5VHh ,!qD\j%M8ǪzNk#uZ ww/ҲJs.i_@@ 'Lk׮oA 6]vJG{Y٘7o޶m~aϸq4nXxKjj!CE&פUVctK,qx@Nk@r8S wݾu{ڵw})BH&0֭{vǏ7ĉMrNx+GSe: *l'?K \/ -N<?&VsϽGd:l{ŋSv) CCC/^PfB{vӷ^߹sה)k\[c[sf2t9]t7(젂[]X+UJlV\Qmމ+.AbÒ$|b0R?¨ȋ"y1c/_1 9۷]6ޭke˾Ix`2>x8oWΞvmۮ^&#=##=cժ՜MxNkw-[WzdF*45n8{<ޭҥ?zl20w<:н[;wܿcD' ulqbb>HG uFNѦ,]&`0WB.YȂZh=o3-l~oq,/?ON|BcB<:¼3yF*vpQ` t҃E ӂ' Q q!Pn6o|-FO:)l֗_TR?q>8p#F}g4O>4?? !d!լ٬/LMMVO>1B=zˬjVJy? 6(ƎvE?`ܸq9B$b,>>;6??ѣLkbɫV={vPPP~ǎìB5~~8e bƽ% FZiؕ`ɥZOYR;fn xB#gORe**>-Iz;߄Sq;VhhiWNʲKDbJ.9I%% !˂B[Eoa+;t.Ή9cA`Ϟ== ˱wdKSW5#L% DI"|ƖT*P;9*"[d~ippϝl*b"|X" f`Uls> a;ƸB ±f*IJRAUTx"cQqd=0g ~:rXps`*E") r?r\Һ&Rj# BILBg9# ߞi#% O\uEpő-K21.AqI&ѺtѸssoBcQ"9⎤ rK**BR{^SKXK-+uU;ڇ칅l܃CB>A$TC)% sIݞAWL1[7zo9gZaRF) ]Rim' KҕϛC{䷟RPk6eV.Q9'Yw z%M*e72nNEä\͞$E{CU=(oTX,{tSkI:H(n|ﶵ-2  Ǎ b 4:w J@@q` h}}}J0 a"P?*{}%}#Lͣ}| {hh@>6PaP-oĬ#>>N/} ^>/x vnse:p_̀=*`.-}\ڈa"wD[pG*-PT$< }~:b-g`.-}"v~'ݤ { hh}}3m#؛ljX|!&'\lݻ ǐ̢2~+]ѣݻ.Sf'F&I%|934N\>\L2O\ȑ3عs;}||>5ꭷafffJaR:dee1ːI^ ŬCj$,^q> %!~aT*Q̝37,,ԅ_|1c}bŏ۶aPPPJJjjUBڔ8*ڹkZ@{ڠ 9G);%,kױln! ѿRܩSɓ'&ѣG-&Oh񒄄'fޤfغUgfffffĬɓ9wif7ЁZ\.&Ur*SvJYLY<׮co!JRu*1F5mҫV2ieد_ߘP{ҥK8}|gϞ Q$ճ^2uNMFi>ChѢ_߾ev*SvJYLY<׮cB@*egei- L& d]V=}^?*- >ڇ16В'Oscdy RP?X6r!T4 [Ib&BR//(xGCl*3T*TVfF6~\d5h`IPJ P(ʉ\?ReRB>pOL X^yʥ>7傰TNeO5͹9^^pb1rsr|} R1!@d[0t؂1_2Ο; QTӦOڭ۬tA"r>@11ݻwo%es?:uF ,N‡sfzvQ,"VÆJ"{TbSssscccwIF[Fo5:,ɓЯ__kNcpBq^ũSVZᣰÇwjm(\*L#@IyС6m۾?}]\W(8$E˖k N1Ƌ-V*tqVL*wޝ3{δ7nyN]:2`Ig>L3Bs|䩁2ONڪeKzCn[Brʿ !{;Cjڤ)5++vӦODY,pVZ}>sZMgئMݱ{ +FsrU*ձX,.ԩ捛Fٲe PD_'$$Y… fQFSMc;wLOO;GX*&2\ܽ{+mB5jhذ={m!͛7?`͛lw-mΜ9z=**jEt]._Xj徟Lu1ԩSΝ;Wɶkv;G?f*7nh֬8|-}z:p/  ^j-7m<wZjvYx+l1|Ĉ;w%ߗ,Y SL1|xQĉNGoݺ- T !4n#F~8:ӧO140OmFFF?g-}hJF8[&& tE0FK~9 dFֽ-[ƎkK^9~_9""==ݖa@` ^Rz}JJʀmL&"4P<~'[;\gfeknZz͝;w>}b*@Hhhq3H2A+&F֌uVTTSZB}:Þ=߷'%%K'O2tʙlJᕜBnެU&7b냱| +ZNXSE[ᐹx{{wԅQ NWW|}^$asNTӦǎmڤ Î![c yv+]1m4ЊoWkΖS=/Zh+W~֭fpرfL˗?Sha{qL*}0q feeo۶uԩ$-Px<5k2h.J9~ڷo?pÆ}]{ ڵFj۶͠AЌ_hڪU>8q1j_,GF֘2eа95|>eUV}젠~ǎS PI{w3-%3[~ysj͚9f͚ \M#G0˗. GۯϘ1cB"SH 6rQʆ\. `#I-<4s.@&1!捛խ'B1*ڣD(J&RSS*OW"1hPGT))2*s *S}n3~eܙ3^>~*?ƬQFPPJ={洗K.ʉ\i(LOKMN2[7h^p7)K2Y_Y(rA^*LAe&'YV&'%}wXhX~~#\F&GHڃB]!n=ZTbR.KŤhzҁ^xi<՞9!Ed2D85BZ+Mq-F n^T!$|/> %p/q= lӾ2G^No/$('EOFًr@xvru@i_OO\v1My1OTݢq^8O{7?履srr^~VB(99;^f_1cF8e?vܸl6>8Kp~$1߿O!1޻w[PI#FT d2mڴɓ {zg/}?8 &!ggϙ׽{ov/\p]O]tys ֬,YֱcbǬ  7o_^VV->C}޽{mq_ϻsxkׯϝ3{&y]ۻofE_pf%\0 9,( 0(0haܧ?rfeY0 9K/xơC_Y/xKd +)uwJGT*"ߺLJ?CժUt\\߾vڰC0m{=bذ7lJOOtd<3g233+ O3+ WfQQ۶ot_Κ)*@cK3}73y`^Q޽ƍBBB^yR)g5N1~ժ7 BgsONRRSVҦpƑ _2+CujqcǺPEk֣GtZR^V fZ ۷nղWwֲ˟$&;+ گ^611d2=~k٢M326m'11QsL C2_~=';]6: |5}^ӏq17d鲀ݻŝ9Îo{ӽ[6>_45ZhqZzz*U&өSG.^Vrxhs->L.Wt+c3={Ӿ=YpL C20?%(D 6t֭f- .@$%Y_ǟiii}Pؚ:@ ")*ED :4wl[1~ڻJŊ^P5r@"ϫMIJ4ao+Uax\wqp#`5#1rrsݹ[Pxk֮Ͽ +_fVfjzFƍ}} IDAT(o޾ul6u HJJnаK5jjeJ ~ j>>>PC|||V~r<ح a bjF @Eh2-c9.0  ~T }#2)F"@0% @qzKqr+8/n>Q渀^ X~an3 6~(`6*5a{,< Zive@E|^ [} dEN/u64wDQ@EH >#210ApK`z8w2td>/'B25܊ s\p/_Y798ۺ;/GFS^zd Y}۾Rd #1xNjPZjJ^67_Rt`Pal?AZmRͰq]aPҥՇy^yT1EQ)1e31BC,^C0eC)z#L! ۷B1(#C^d-Lt tq8.z(y>Ⱥ*,UQk1^B}sPoGD(BtEQۚoBQ!\( Q}ڎbC1s"vK(D7DWqxl/̖5FQEѥUt>Ӱ;(0%c9Vj^E]}n1`{LSkfY?#kr^Sf>ۅYLkim'*CًT"Vvr(QLF1w@>l?Ef$0ypK}?[.אa#%KSگ┡<^/~R:Wy}^b&O1y!G`4I1qHz.;c|<6qHr}L{~H!k8ٲq=C뎋Cu|K$! 5J/LTOp;#͛5:g>ɴsWsry":|5qCWjAǡ#ܸy3vd׷[έZd2޳̹Vÿ?q7|0?ui6[6iܿ__p|iM&ΝO.wx{e# B… gUQ̊*#KIMݻ率n[,zu 2!dX8xB[gs"z psd?& QQMEEpd2՜ٳg}q5[|pBe׮OU׶kf%,YwOE?v)&.Y +;뇯HCY2\+ժWVKt3g 8-gpV!Tʎ{)L. 6thqgMy~qgθ\cǏHpFݷ Yѧ7qqiΞ߯߀辌 (G$417gV:( ڳ=^F_0~~E)Jq?x~Wsq(Cvve̜>s6O c;\hHp|ių!@rDwv=޽w_g!!y?Q/֖1`>A7//W\]~#"r|}}2*WG۲ gRɸFժ}:c6n޲bR eHMM w A'.=-v8*+Z!B\HRi\wvkt±?F@jjGwɐi^,9}lT&[6^͚Eŝ=jڤbmI™x{{'ke]>9Yk6B%ͰiFw޾3i.mVnMjM&SbbҚuS=մpڦݝ3vw\l#TI zZR2337of߼YwJOOVPtΚHCG>ANؿ3vn]:oŗ7v. gҹc,*((زy7[&33rxG#fحKؽf!Ը[];wr k+WIȨT)gխyfIF֥3f͖k{֭Ҿ$G$4>tȎ=֮.:7 /ݺv)$XC=7cuyՋίGb)U}`G:L]lU/ AAsd25hF{T#@yaf>S`'nF>p$q{h*OGuؠ B|}JQso5i@y //g,S@iiV(ZV(R;]'WkDF@uPNY3YIuh<//k//4gTa9.%}PVPi.}b|it]}O(WKҴOT&< @{JRR%791Q讀}( <]&%}==2YbTm2;rJ=@R\HN+ ? XO>> 1JR8s,C_Ri_e}Sf|1eeɛ m;wx-b}~ߗQ2%wAYq͛EnuFo5De䄄a|YWQ*c?/zyy ~Wsq,CvNeʜ>k6a)b'Ù'II=2<|x} B2cYٜ%RuQ<>b˻~WmHe<__ʕBi$|L8Dի}:c6nٲbR eHMK w A'*f&$UDr $eX.{.oHV5~@jZ@w^Z-P|gF5mBw0ѯf͢ΞC5mxGllvvNvvΎ]$|LZ򲮉Y5!fشqveeggego۴Icжu[&k&)11iͺaBRE$@RAVU*Uffl7k] v.;H>qc}׮ӭKbr\.7n™t ݟ7xk233+4bhݺtݻoBյs'n2~՚JzZ&$UDr $e>tȎ=֮n:7 /ݺv);Lj@@=s[@S\^ < ;jb{afxQHM4=#C(UR(A0N_PSڗMMIS__?wyy=ceSiޮ+jj@aa!RO'WkDF@uPNY3YIuh<//k//4gT6hh@>>>>>>>>+a*euI?\.I>R>T4)JII]盜PRZ> xn~Gj||%%}jOOL8U @yh4zzJ^(=T* i5pK*FQ4=#C(UE516u`?_}zKvN65&M}}V$//g,S]p `iޮ+jn2N )ǝ탻 >>S#fPpwHNyx5^^p{Ԓ,,7t('ƫ7/~z@Van֬:b=ab!VV[RT!*uYBf16Bf$ɇpss=998rTxeq)ouЁOSd=4-j؅x%mB?scfUdgbV->09WG ֤#}?0d;-]h 8|hI;yM?J$YDBa~ץs؊mnC˳Mƹҙ/wGLڶu%wc'N޾tɢ >~҅G-Q*V,OXط͕_q%?߲)҅O<,+[*aׯkR&LZY`HٷLjK:uoґ:t*,v9{\$_~]0o\&CD_ ?JX!oܘ1WB :d݆đÇ8~ҥ9eXdW~Guum2-N:*&ƶbk5p\UVVzyzN2}~Bh3[8T;ƌߚ!Ftgξ7T*?XE0ieхeҪYfɲc_q,Z--bqP]- ]!$ ^1*t44V&*EQtAFfVaa!A.;\/8VnĨ(k Eʊ q*̝s$;cD"QlLLKYFVpu:\Fx{ku:[> uԇI+.Ĥ-VVRPT\U2y׿-ʂaq@(UW/ar$P?D>w.|dk{ d2/&ᤝɣ#F͞%?~]ڿ?dg  ̹pIG:bP``}Sgr8{n%:> 7C`ضI*g웣8}ꔃS1bXz}>,ԴVf ÇGE[ʶq*^ lGFi߮ݬ6r0Q̬"BFdo1rTxjU 8v-Mä Yf:oΜ2|Al`09k/]V;^DHZ .6,SUjuqLEEc߂b8Fcf?wّ~sXQq9HmW s?~|K/z.9`GfdKX|9o25~&aq&I, I灉t`Ɩ>RUwqub7fӁw9=|~ύ[<V]6'b=1<\/*}AҒw]րݹuTZh4<\"uuu|>>.@+yr.&&f9xx5@N!@b>jV@G 7mB:SW<.b`]&L&ҭPGAhr`b✗j΂A$޳A=Ҕ3{$alq6Kdi[Ø׌.EUvi3ʊGVꫨ>+Vy+>o-NZsޙIo{ Ah뱏 I^/%-&IDATlDn"^O0l'?M٣{ZݵKPyhS4c="Zc Iuv# XCu4EƂs;oOQԱoo _yI1v`LSgFwwILxUd2)2Ξq|D)I{XVy<$z1u[nn j:{.!5~݊dJMW9Y?L2i)q'NVVV=孎:4hbGLV,M:iNwܼ:SYZ*#GlPAa9I3O~Md#N>7/oE}L#Gi1rЍ7W\&aòO4n"eekV%X~ۓv8p*H258mRbyŠEǾ=n.h4kWp7oݲAs4g7_-_@Cþ/n\~JrwDȤm[-]r=nrPNQU/9NʁiS&e'_'Nd"0&j|΅ؘT"J&D~l&~?sJc'4(ae/<@0n̘ko48ǹؘO?$D"mL2i)qq2ˈaa  =,-Xxd(u:]ee)mSAa:3ɩo%%'/Y}v!#Ͳ tÞT˟Mo\5nBәe| /xUXXXm0 8Rk Vt:9jo4Бư4is1HRonrPN`KZ7u-xS'OO-ɼ1#T*57U*R"H2*Ucɣ#F͞%?~cM  ~!#W9*<5]G qS*NLjaaUkPdf%|!J4 810aJwuQUcAEFEEFISdrxp9/ ]/?7p*Jka仸?M$ʣ}!Zfdzqc>EU EEu'GN׀oYYٕ˗\O$hks |*&1w77\-!aX=ښZ&1WH$`R }CH(R  0AQ>3 C8Nb>},y>} \0`PLu:G V@Ʉ](9NjC&Ak b`Ab^z UMwKA{A `KQAA5jdrHRdu@7^x 8GGz^$VUU:|g:X׻q20>9>5INL$k5I! bA؜b)EYFuD6M>ak{]tnƏv{<srH.D2Me}T L6&n-"(7//+Ppp߶^+xMΟ?'((Hե+2 d/gS`+-Xݺ^={ZٓNo0BC͚ODD3̬,N׹sv2L믿8w̛[JV0HzzF줉BBB>> ޝGSRL9յk'pbAg CtLf|.ߴOڵJA7G^~m;LurK?^W+w$_|uM_RQY³w}qOׇwϮ=wzzJ?n̬C7nX&aWZݤ[ G-YOSi1ژEߝ:=s \.NYfdr>?:2{t??}T*zΈR͹tk[Z]ܸ|^zqBhS4c+YfWTT:|$qӖ5% UG(0ܜCL(R_\R"7\-vobv0uv abJkkjw"iAXyCH(:MX݀A2@![UqR QcIBIrH v$>'C$ lH bN;p:pGpH >0:/( 8:|8uG'CT\י84'!OOH["O-FћYq0WWW]_.FnA-0IENDB`kildclient-3.2.0/doc/C/images/pref_progs.png0000644000175000017500000003753413217677314015656 00000000000000PNG  IHDR pHYsktIME  09fiTXtCommentCreated with GIMPd.e IDATxg|EٻKOHT:)ޫ c{A@ AMTiRHU@ $jzOHKyqcA}?{3埙Iw?cuGSP (rD 8ˋZ'!2@&]XAl Y*1pS%ވwjbBR[沂$WJTk .R\SYXgz5%& Q.T8ҥ @N$!j鼬&B**o'(;߯KIJ$+ͭҗz}ݿ2#A{rrj&x . QI&뼓[MzSb4'1{Jg;ydJR&2q~v=<;R&6vB4v !w&;UiTዩe!Hnmb;,2)~&)K5BsuQIiсuL 5wru_,ZZ5i,,ġ0H> ܿ.Y'*< tO38V':dدF͔R)>+6O%LrĄ !f{|hC[Bֻo[c uf6b~x, !YuWb.+1 Õ/~]u;Yq%ߛ+]v];I"us|SW65Z.oϱg˓ !]$[/uH!6Bd!F)Bhtr R=GY!,R|T\i%녴'X:-*״en!/ TyS1TY,]]&M??PժGBiC3Z oU`"tWV*$IB,d ZHJ{Ta4M>x!!ٮT!h*O?N{rb_1DAw)Z,E!i/zEϘ4ʺU֒W.ǘVcUǰ]z{^ҧR-0u0LBeX#es,!~.%% YWp0}VZqq潤,?IVr2iᄆ7Vؙ)+rh  KB!-?#*ۉAR֭KwG_K md"͖LhMc\^e$ªa5Y}͓MDV,%$%AH*x ! s]-dY'3gcn!=iw <&*8OJI8ͳ~6o'EbR@>1MX(߻Bؘ*4:I/(,%/FoBN{[m6_Zp;^[Hb;3-%'PYژJ_Memc[8Bē]X !B&i- Y:!&ɲpiI)ŬjR^jŒ}\ɺ??#)%PH,g(0=}B"M/Gj !Qؙ !sP%Ϻ% !.E?y{+.MY~.B4wyE3=ڸR/?%L{rz-9_*-m}P|u_!Woi[^[Ida/$'dkzл6nNVn%6BRr$>U>/%30UHiMG6 'ю^kS$RRd=#iKJ]q}i xT059 R®=$7 (L8z$7   HnHnPX_U josxyz ! oBаؘ4Deog"r:O_–wGD:Jm2NivHz+III411zxRSS? /PUa %:$4-m!Rttt +ފؘE=06)V#&&W (|cnVKl 3C HMM# Nx -P$7$7^>}!~ɍd֜ygΞʯ8{}Q:> ۞{:tkYL>?jMKfϘZz?pHZlE,\;B333wyyy-dY>s|zuO9Cr/ZSR%Ǎianqx(SҥSqiҭk甔]{.iw~cccC$ueϞݿ8)88Ͱ|Y+{ޓ G.eJeFٵk׮')SWB˖ޔ$Ak)Iҳr*xѣ}¥?sZR=zd[ĶG.ʕB޻II5WڥiNu0R|BBDd}z !ʕ)WRN%T6߽{ƍw1kμ5_/mcco|/𞝝]F l>{4kk9~(BQV͝h3@O=zh u-555 x{yl񮝝_׮<&6k?y""#CBBQhѦM_~#};M.]*w!dZMJ(ajjڤQÄ蘘7|?C7WW WX!:IaCٮ^˰gϝkBKZȻFԱCgPny/0GNN;}#}f-ۤBԨ^[`ђoƎvϺaDd3gGjiiٯA!<4ڱ} ˥.:133оmlllTTtCYSvgϝϳڶZeNϜʹko Z=x /EEG޼5x;[[77׾LͩV;򴰰hnh{UB(UJJeiiijjZ\}?+.%%{LK** ۳{7[[[{{]޼e8pe}|7knO)"033SSgiii_4xgΞ4Ǧ|^:ӗ;99<**J1fOF{_ׁ5Z0>0ȘvaP(2V0S;;۞ݻ.^ZrWC)R.%gSX3Sj'Gnkf>7bG6۵maӯ˕VJ !8°ҥJ !\3u3SS!FB8yj-! S߹ssssDijoI]xDRtuq1Mh-,,lmkb36Z>kyu¸?XWt.:dczuܺu{Ck@d8Hs&.˼D2m椉WjanccOY1ï !!!ɴ;gZӅG8;A!BZolkbʨ^:֑eȱ? fffU lgz ?C~}75lTbgϝ_T\]K,qſ][M|/;[~mş3(8$(8SMI>z,66j9-w\_6kڇ-[2---U*˲JcdzeWXaaɧϜ{3:!qK-矔|R%K&&m+/od߁111ޟoԤQCG޿ߐrms:}¿g2UJשg 3 ߵ'AAj O>ڷ%kBR9::t~IIIŊZCZF]{.XDV^K9yƻ68tGz>,%'LlFޟmشy¤lׯCRwھsWGeE 晛WRgnL[GssݻΙ]</?fu7?!&&Ta7{ʴ O<5lpԦU;~~&&|U*+ܽ7fȨȢE'~3U\}zuB*_l.Gp3SSo/ϖ6_r# PTRy˶^^XRLl:rDUZ(,/D>z$xy-|oZg g*+oAݻu6KpҴwZrJKK3nB  17a̍+W Ee#"wڝB?NT*5kV YM=meS&&9=o_߸Դj*r2!jT%shnnިa}|ԋgӀΖ lyx3feSr  Hn x<:*FeO, {k#ZlB?TmK źϟܦu.:(v?ட[ly/}} !7jB}eZALK|3տvÜYe[rZZvY&6oYƯ[,9UٳGݷO'N>L+Xء}GvrBlϧNBtNq鄄!O!jլaii9Qw֤qmחYӊEKe,鳃}vbPГ;0;MDɓNvƓ'ABݺX[[u9/yÇ$ʪgB[޼S}ZYRRJz]M$77ך5 !Μ;/(j>*-7tJ*?ءbKk߮M%8.g? ptt\$Iŋ{VX1#"fffB BXXX !mSۧNͿn=tXxxDrraaDDN͘=w>>waߺ]rt:]XxDzZ;88pn ArkڣGBDEE5'Ne+++BR11+8BFlia᥌\B䔔ss蘘g;;TubbbKHwXXX,^0D?.?7IDATZ{zjw/[G/[.hܨ33=;T*!)gO>š}gx^=v\QWlݞaʕ<݅[n4qٖ_fŋɲ׭lBXBNU:pPxDoJMMB( G'OI !-73ԡTvIIIG1qL—܆gjժ>$^BB jHҥ<ף+V(_>U*oݾs}|"P~;cvGѥLJ/ٽkYӿ[M1{7zO8L_mܰA ŠWYgx;7<4XJgu7{..\ワrޟ~H1qFz*+e[)g7|oֵ_ޜ1|\ !$$޽@J~V܌0K..}?;xr fxc$7$7  ]?coUcblE1p0Wxtr:Rmr@/S^=6;;5^q$#K .޺}{_VXsFЬe._9pKxS3{ ԭg?xr ;y G6+4cx 5(WކeƑ.: Џ[𶉌Zˆ% 燆M5g BcWL7j@ O Om.ַzu޼0d5O:?9g͙_󓓓W^wĤJ+ auj޼paCPl 9&㎄9QRRҪ5=wiw7_ssEK_rUHRZ5PjUܽ5b ߛvLJJnNCKdj&L:$I.mZag7!DTt _V;uh.kg활0ee=bxՄ=>dV9*m1vlSo 2MVqͯS ߛzx8bm}޳rR:O? kW8?)K52mRjl[5g7jm_dέmmd?r:@Ɯ .Y{RRrRRV]~sgf\mom-&6sЗ<=3zԙWYjb՚_oܴa*77wFkJ25ÇK-d[ۜNŜvWhzg(;[ ߄ b KLLL9j9]D^7a-8~ʷ%4a\%n9mn0~LPppZlaXgZvE[q)/0)<4y7()lw$IR.%6sNBB';::?yԞtssN9g >svŊz,\lqM6YӒyz&ڴ)z^゚ڼ;4gۮ_2))yʴY{;kҐ2?43wsmgo={Mo/]{~3~+lmۻ͛*ߛ wYntȸɰmwS;׭JNJ2mfNBl䉝ۃBBBC,--,--gᓏ?K_ɓeWΛ=ȔժU >8<rLFQ*Դ|~kko/W&%%=|W/_B\WjU_K-Y[cvc"ks:_Me\ײ1loSzv(s= !4ZMBCCz}qaXXXR%.FV 뎢s) ۿ<"BT&ptpB=355533377OVOYS7oy$(%%Eq6ks"#1nyI ~h>W6+90nN77H#֡]~ ŅK*zu)S57ɩEֶۺtpsd#O/t(2l936nXw׭K Fbe\\\ҥtPtLT^򕿊Plڵ-_|})k~tgm rjlϺlOWt~ff-'o6̖gK뿋$I;n*RHv]BN(Y!^ pwO_Vt:ĝ"(8DVbbbL9iժZعlRRRbcc WcHHh= ffZsllkf[cz C׫cdJ(^ρCGN9۪e J§tnՐhQJJJrrr\\!3H /W{Otl¢v͚w !խSnYcQ`ffqժN1uUHŋdeRcn 96K#cm!ܻ2sȩٞد&l ڜ\N{cvtp |Μ=ɓ F?qҔTKȉ1%;;թ=k=NLL}߁s.VTDž#".^ZVͬjdY2Qn߾uwwwXŅX&Ϟyx)O—յm1a|ww-[GDD6lPvuhvm7onS/vJY\Z^|87^̙rzIII-m&(V/]RhWjMPppZZ^jz>*VHJJ:tazzjlQ\eYԘSms4(Brwez)s4vY~E7ac_Nr!Ħ[>4(c;wmӀF 9ݻΙ]</?fu7?!&&T_d*!Ռ)yܘ?Z;z7))4n4Y!o.YO/%!ժY_{{ʴ O<5lp78~?~Ioâwh}zϘ=[\;kd6F6W^{/𾇻3={6h鲪U*gyS:jޢaGvrrjӪ??U><%<}b93ASժoFRܽ7fȨȢE'~3"S &&&+TxTBիm[j^VviGJJ6K#r*${WrڝOc.\κlOWt6d[ۜN{#cb\U*Wַ:h6OMM󣡃'^}52pҴw ˯]/VI,{iㆯ#G8qRP֬Y=$$dϫ6mpbHnhݮըeF?.\2w60b-5{(LHnHn@rdYIp| jS~WkNj劦cD 4|G_~yͳQQeJ7rYtTtt[M5#o(33|;'(LHnHn@r5vHn@rTnѢM;1}?\=wkҼQcCBXɝ"""\jcFM:ݰ&&f41|۱ֹG[S 1s$th~}l>A]pXQÇV\ɘmܵuyI^mK<)]DŊz$%%%&&jڟWiɂo޺}-11e}jHYLtiii^fff֮W6g Osf!z}{cݽUw /عkxm۹kףwnhog維[\ko~oԮ1E=<?  2mV?uO_?.\l=xh633Y/q^%8̖+ oݺ<}&}aNjTjee>pV;?qʘm--,ڴj}n!65uϾڷʹg~}?cq\լ^}4o5r7)))*DeeeejjZBd,-- 8`W7n24yv7s}5?z899EqJ-FnۭsǏ>WϞ?T*5uztգ"..Oz%ϝ5mwW]hil\gҽztXBll܆MزGOS{RJr䎎?qiծYbmK58$$ƍmR%+V(g'NkZʭf}];YZZ֫[Q;`ȁ=;7LMM))ÚS8fv~9xw\Ȳlmm21yk_ݾs%%%߸9,<&߶[玿to,S8u:11MBŋ9{.)9K%JpV<~tzF۪NժVnꌀwSRR,-,\]BBCMLL8ou'NNHxZ۫;oLsvK~9 nѢ?̝ܷ}I9?,YZ9=>!aђ,og|4~Vm;֪YK*?`ŋ$K L%̙+1&&&DbݺtrV;Uzu9/F3rGѵ7?GZNu=⫖6 RϞ3=+aߺObey붝ff* 8nLϦ@r盍Vg />odrhZhMMMߨvtp{7P!o`l߽萿žV"##2YLMMި$IVj0 5Hn@r$7   HnHn@r$7   HnHn@r$7   HnHn@r$7   HnHn@r$7   HnHn@r$7   HnHn@r$7   HnHn@r$7   HnHn@r$7   HnHn@r$7   HnHn@r$7   HnHn@r$7   HnHn@r$7   HnHn@r$7   HnHn@r$7   HnHn@r$7   HnHn@r$7   HnHn@rD\k_~.5bb f  HnHn@rDE YCCbbcSSSߞV۹Hd&| @ դh+jbb:55fffnF7cn@RdY~{ZR-PƘMxP@Fioh;IjZZrr~za:( ުyƘs_wA?ٗ <-Or@wo{FpwoެiL߀3Χr.yy¤)۷s)8$^NF#Ge?,X6,)U~g山r/!IkV__!Ď]YfЀ~^e)֬;}\bbR Z:'h>~f9= 3Zp#"Ϛ+ 8(ƎzM>va> 7kƦ_V+VtzY 5c'prp̾gi)^~JG{!Ġ_0(:*JPT*KK Sr>>||,GDF>{k_|Y=7Hn@a n<cn^`l9cnHn򟉉*---lxjj9-!.c>BCìmJAؘԷimRYXX[[[[[BމziB$Kzt$7  Hn@r@r/f0zEHX(@#UdD^/{)U|'w#?amj&(IENDB`kildclient-3.2.0/doc/C/images/we_macros.png0000644000175000017500000011715613215302470015450 00000000000000PNG  IHDRzM pHYsktIME / ^_tEXtCommentCreated with GIMPW IDATxw\Gg *l` bDޑXLL4"hc,* KD{E.;qz\z_x~{qW*))--%X\KgʱŒ܌9mr&ƄF6b Ȣ b˜P2R_+ֿg;^+YJ-֙1!R5ː2w0D&K)+FrZ8b#-J1[~F#Oi2eTaxE44.+ǡ?0ѽft㽄 [1|=ňjmšGp3)N !94\Yf=KUkUjKfOVX | "[݅r.AUMd,<jkc>RJaL,Tu;KJ?^PP+77uײ;[jl-{*56T3וKi?PE TX[6]Huڔ꧳~RB_&Si'Ծc)AhM eHi͒ZE@ImLU*fBDzHq,*(770¢ܢ"JU΅TuU%%\={v|ډ3&9%9h F($#_+5 H g$VHIˈΪ$Sij^4eY_}/P+F7뫋QuwO^2jn 'B?ե!x\ :y-'-avhimt1a!MM1oEVd|(gnn ÔfefԬYֶ| 뒗WZZ,{_c$cTȲDմQouEKJgd GAW韄-[@&eh'K5fj VRZ猌ē6CT\8x@uu銓A,Q/l% (.Rp0Os嶶 Tnn.JKUbQQ!ϟ7g/*訐!CLtP`P쯃L&"j5ÉX̣{]RRk!33.]tIвNɩޫa٠+\-|@$ؤ@x,Ѭ6e|\kfXYkBY&/{a ,g-2ݚh;~:D[y0i)6 FO1Zh[,PT)&{DWDV)A?, &Ei^0GT=ϝ]lB9xJɩ]_Yi4;B,w]up~}W8mG} flab[~)KxatVvl;Ttg]2b#-_+Wiw,Ze?Zzu vec}?>g0J's`5bVl@]T>2s[$erOO4eB%7r(Fy`nUeggծ]0O(NM}RPP‚) EqQAgvvViJvx٭I/Ģ>y'V⢟~ڴ}ێ/gNNN&/ߗ~7QNR5:%55u 57"lAAzFkʔ)gϞWmDÏRS!SL߯234]v>{PwX,po@5h{QEk͹Lpt.U[SNSnښm.yM%2.k ۇK:ij#Y5&b #r6(FH|^3]Ò6QZ950]޾FhJUֶHPDEE曂|BQ\XhѢW("{;*U`!JS-o֬=x:^Wm:}:.|vmǎ TSU߻~b؄FlݺRT\ILp*UF3ʩ%P^fm`Pj64liPR?~DYr¼ BVZǷk~͚5<~{AvQbիoy/r L(0['+Wn߾ݽ;7|lӡC uBE3a$ZoW?}uz?|!My*JJUl B^ܸiӳ!vviir[[*TȄ*}!$QB&f~{ u:tY{>>L&())++:^^q4VPm޲O#СΝ; on9550 {1#F͚woA];:v9u k |QV _WyO>je&y4.ODh9@([زWݮxa9]p9p)saa(g=<qL/xȻQ=x< .Y55׸a$Aܺ~Ҕ5@A[QX |h9){?A-%$5 d5k޸vSnc~y8zivf:Qfcs5kd2Bܽ-J" b}N'G{o*ݰAC*KV5)/BNe0 ulꔙ_uÆ31ƎӛbHi޼M^= !{Uj77o6twf~5}* $,|>(-lI֔;"Ʀl:rqS5X-FdJn>c* Vv4(lw#CZS ѹybysDOp6ZLc)ot<g4Oh1z;h5τ JEcw1$5ڪqU+;:9?:w"=-U_89;ժecc#XHQQB"B,z]m6I œ¼a#FT)(Л8mgϝb&emRRN?йs׹Ij:l7\.wmkkk4R^K2LuγN')I*J&խX!.ky+3KKJ ԄR'˭?°'63_ a {1i Geۋ#@V; OpZ"].!P2L$v*!HQ_wA"D7"rdtb%;ᝓ CT&ܻ{YNNÆ ====״w.JemŌϟډ޼kWz?mv֭w*@Q$*Yf<4LX&4c/bԩ1KYTG=Π59R{ @Okjcʦ1@ɫYR[g_4ܯlAt4Nғؔ.>iS7ؓ[LIJЖIn!2K h&s6N[\O?1V&Js5'SRRJ]\Zh^NZ\ry9b%ge{֨2X<ϕԺ]Z7!DQ> b5gD3ݚX-BXlZ|JT`oҜVn'iLJ,MHib gD Im4T* %%rcjNW4K!~]J.'mm#6v</E@UwS3I?ԈEih"JpFLKSsi5<41%yw"?=:8qyy躇|"6ˆ~@Zgҏ]pgU:."WOc;plCŒ֙(]/#)chyBEr*P>EŴ\q&*!Aj1OXbJ1Q#Vc$FNu ʎZB~'r榆ˆ{0 XrL{Fv^JujɈ ka1l/~mpu,KM-Y?8T8'5qF: m"WKMkJq|^$JiPq TRg1OVºH4l'zfi 3%Z~F@dVA,{O7z:3*TZ#1x(Y/C;Rc$^r}%qEJSH'FFg 5RV7QL!Eg iPTц9iHdPtT_?(0zLWXh CVzֻf鴬'#yXf,` kImc \)`F2aɵbP)%0bF#N-ƑA77#!;+C20lc+!TX'j +1zRb!-h)#FLeT1U @k\!$h+ZFYce7`s}lʩ?m_*ls^J %8jb _S]S7"(æ ;1oGYurkp?F@ٰN(4F쫝35Hc)νPDHw1(O R!,1 .#ڑHMF\:wAOS}Z5>ɐJB%ۡ٦1~bM3] "v#XDO (:0Џps󲽗x[prq%f6 0Bu~eHf!,i ܇i!l? aJ;_BbyӠj'+m662+ҝC$+AB!,*Ed8/nlʣ gO1"[_3  T=_y}+ c&,RXۢb_,4/pFɏ] Re4y{Y\tIJQRdo 18UOsrn߼_PVTsrj޲e-WJVo#8[_ۅA 6\ؐ{AGL%܏u9 Vu,%Mw$*M^P\eR`lPbY>ZIZjӰqcGGGý7ӨqcfەRUlƈЍ6`lI^ ~,V@r;p=/ Xĩ~Q lt㦦Kφ4n-6]W IDATZXF 4,Z`|m dr9U\\\4HHo00諭rjki*Y[+K(f!ራ'BdJrʮ  d0/@Zo30#_+ϷzLK3 f,ZқpSqJ?>Ayj1ɩZqjF`U %BXE#Fg3@SJmʫ FP0"1D ֔"RS 3Ԙ*">VLPHh4Tk6zOLNABၭ%$[Q(2^GjZJc _ h~j HJhNijJFjDQVzF,y"&*iAMtf{k0nyLhڪ˾ץJcDžNdKyKHJ3c6+#-#R6knmP8btv妕R EbY+WwdSM[5k^vPzu.2Kps C݊V"9e8$˜ %)oc7>mX5ڳļX+X-icĢYF5!!3~„O>ioo߮}6wTիVӹs7f~ex oݲKN|s`M6tء7!aB„qm[h:OybSQZ*@J(%*2AI=&LzPB+fO&*γZKŴgM ī%`RlJm~_Ox |B=jhЏ*ݚp7rړ}U\U+#BQQ<#ad/s?Lic y%%/_s׮+W͞`0)2a|解>煋|4"tQڋm]$@4x j1RаC!\Wg,jM@ a-*Aa #,:(=j"䲢 FkǩF#WB YazGڅHbB-A`ЪBM7&?//3#MUXֽރ sx n޹koo6*ճ{nظq&A_Wgt!0u?!^g{ѫ{ /VB;yW;Xi+[րdl%z$L_UEWIaF/HFrqްIy6`K6"]ac:()U)KJb9l~aMW5kfffԯm8%WJJZRB׭WOիK,qznn.! ,-D%KhdB ,n)R)B8X-IH ͈7bMƖG-x05Hj0qZwڀI>4UKU۪zc1GGᮺj-BfR؄SEEwqqyEVlPQ":XfB*,c O'oЄŃH-n؄\lkC%My_ ŴՓL]vm۲2 ϝ=5O)۷o%2AAǏg}z/⏭}jԬIGbN:ڎz $l~&y R1R&0ob."%g/wyVf yR-pn |j[ty=xܙY[9EkѲ妟6 #SJ[imN>\&Ըq/g/JdX "lڞB9|X!({6e3"3h2Xg$.#Rk䣢kʘ߸k6'+3r-Z+a`^dfJKݿ[FVBwl[ )"P l:1@4hLLhv+UWr *-sBT[xE %*e^\]JU .5ڪ 2#p4Rf:CQSisje H[ Hg6kWhVU*6Emmr[ xAZF&iVES>3PUjVsn"*ΆRB^* gN-P>44P:HM#qK yak>m7k[#Wiy&gR ªda*~^/yfYT&Dwm\P6Ӄ1WaErw%-vj3 xTETUʳYP(f)g^>{ԊlٲǎBƢ+\gskAS12ۘ'C8]T,cޭ()M}WLzhT5n@̳'N///BHjj'0_msvM|tƲ,c1H.d T Dj,mۦONٶmkVVv{[aWWN::99w޽;99O>߿^8pk4hА!C֭[6lHHH())6lX#=[D 1YQ~-[~rkVǤ,sjVGCݴiD);vlttvϞDEE5hs+VI !_6]v6hgg[5;,lBjZ駟/QQQ!Ԉڵ{ΝoZnz}0r8.ͭXG+< j,ãw\f~~Jm۾mjժ ?`Fkgg׻w/BH||:}Ϟ 5jԘ81LsȘ1U| !Çwvv1b8!]/^dgϞjjѢky8QX!F7*jmL$PωA<@"ͭ]ǷhBν{艪CHȐm۶B>#o޼gddB\]kB\]]5)1cƬ_~uN0SNJ& kƒozvL<1Gy޽ׯm[->9tt@HH!Cv-Z3f8|Ё-]BHZZgBHڵջwk|gOޱ}v'<ԱZZBJJJ:Vvv6:bqvv>p~wvvۥRBUP(iC#DE|Y ӧ7!d׮]2h@#qbAAȣwgΘ1>,˗nkϟ;:0!a)neL<#Ϝ;wOO˗WQc;wPgoݺ:j5kVƍgΜ~]C ={v~~_7.LJ#F|g/^|k,۸q!!|M6mf xF,?ԥ ?'M4y2k=颢7۶y]|E^ԩ}#G|}} ! ?> ፝7_g?92 \>;8- B|&h A^V4a+WL ѳ/$;rX5yD__ͮ BǵmߢE/>}gcn]-]:wj$$x;w |!iii| !|1(9gm> `}:M by,?OP 3}.U՟~6*:j-?=zfׄ񡟎,ҟ.^HvuٳWAA.B;q8!…?wSի>L=~ӧNi2Yݻ>x[֮^-\Ya%*?ym|NJJ;vܕ+ʿ#Ԍ=FA RFކ14q+WU{{49rxllMWWm[u̱o2N6<|qddNNNB_v@Uw'|c !.uSξ{EDxyyթSgQNu}{% shfm+?z0^縸8tqjnܸ1o3 hyL&dnݒz@KOSiƍ>˖-3aD|VL뭹8#,f櫯uW^]dsss !km<<^Fvtt,**۩sysϿr5kvy+bIKKiܰaCMtt s'OcgϞ5ixԩIIyy4 )SkԨ>vٳ4((044T.PJooO@)))>}:N.ʲ8SjCOcǎ]`a.]NU>}5jϞ=SLyݻVZH!.į_>"b~ d6lTw\IIG}k֬5cGի'$66Eҭ[/((6&}UP*6m:}:m̘1<$(!5jT>#甶PE9sF.{6m! {(ѢgBEXnF eEEEv>)laΝkKKKVaFs6mWުUۼWdd//GϏ=Ҥ{zzjL??Z|ٮ]uaժE Zf5n߾۷hҤmۖ~}ڵko8`dYSObF;dzʸGYݵ[WBȻݺFY-%#xHȂiiiiii Ӥ1o^jjjjjjļ~.~W=y$OOOaÆݿOM6vժU.]S?,lۄ ?a{yy9;;;s'N:=,la >}|y9j(''=}'ωR︕+WN6MrᒒBjގpႯ{&M.\W;;qbX:uǏ/SaaԅM8y$=7 Si̘1=9s2O::͍kcp W,\6~|mOq>l7wB}ED>yry}zڎ =w:}Ҕ) ߟ2pɓM?WEbeİIךv wnUL&RU';;\B2ǎGRJQgggk[ɩaܿRZӵ۷yB(jV*R)'G.Yu4ksݺ? vD^={[W^]}UN]֦,}(O,8Ƥk~ N3a%Z y5Aݻk2ZZF4-Z#X%=:~,ĒȑժU6|fWZZZ!Qŋ===44/Ej|{&L}?.^VZÆ=w&[۶m&NXRRmH`,X0--~zF}NEW 6l+W4t/3@=uUO 1fܹΚÆ ]6MvDlll؄ڭڳgu{/dEE3f,**yĴn}M'M"t~ <';w֬Y#.kqr|AX`T QEېy<7#-U%FAqyp\H * Bq*>>>WT":>fh4@*>یJ2))ɢ `*{ 'z|hKN X)}cf0777 ]x<=='M.))ܹӨQpCB B*+(P(!$0dȐ!C 2BI@UB&Fcfv P(XnBUL{66hR墪+tf~~wÈ134]pت`F cG-*ldVo!A[գ޽{1j IDATբWMr|ɓ/͛/ P.*jԩ={rrr׿ bE]:wҹE qeh7w{MB.GHppk]!Ve:?禸"LJUWٷoϾ}w܉^N|/ڳݻ3f ۶UBRnJKK>}:3303ggj׮,3ӳ֭xRruuU*fepmJEkVVRD`4oܱ bVBD;v0kz~<<<>}套!##[٧Atԭvݺk׬^]fkn U Jivvg9%%|rYP}0)Yv]z-0(how8~|',\x1jknbrƬ]U޽{Ⴧߺuk՚33f|Քs.L6maD^) Ë2񡟎,ҟ.^H1 {|UU}aasffJB&M:lxܹ}:<įXwg<دiӇ 'OϿf;[TַoBE4dĉwQ*ߛM,M#Գ̟gJQuٹ{;֬t!楦F̛;8xU`֭\]PP_ Z48;99=~x_aP!FFAUP;_״ÇLC ^_@MFfc>mۀYCXɓ}c@vjbi;w޻wϪ?Hx2wPoڴiɦq8rSZ`ĈnAM^pfW,l٬#թ3(sqq3[O_sVL{Lldv{mliSA ^1[  k+;8h{GIEw}KfS+02,--N(.UP%u#п >--M&aaE f+*M5n޸\ΎRZZZ(*4xPqQJҬckgTk5װA8hP%UGzzzl챦M֩SWN qV];gZZ׮U T5fkH6~ڙ3grumРa&MWF 0 ,^PyL&ppp[^~~Wj՜k֬j ̌\3mNУgO2jB^:(t)S܏;v/gu/*`U?NaggVNwл&Ä ڶo"tO>eͦs̷IΝvlZuQڶm?J%y%oڰs|*[ZډjwDŽ񡟎,ҟ.^Hl\L29|k7oڽˬyΝ={HLLk׬90)CRheIÇjbʤtl1b;̯;}ZYl쬬k2<""ΏطgyGDxzzbV+6xpA!C=/\$2;+k]T;w6եK߸~=77"5V\?Y漈AAy||?4h --MuèxTuR#>mTlR؄SEEwqqyEV  !tV~ܸRzə_Nta5U?뀕zl㋋>}f*V鮵jݿOdzJU?.((HNNDĉ-))!dM`~DZZZZZڂCB?/"F~eZlѳ{Pbb+W&N|/8X+FFlYs^őKO:к#Ft dݧwر-XUYk.ӳG &N^z>IXRKHHѧރH֏B8qHƍ# : @À kHćH@e6U`*2.(MEk>j@ja g/*P("_5PX+&jJ(t5&򠙟j.gf~~;o lդoܰN:o "BTj?,*TuٳnKv6w\MsC&$)ν{?`R\DDDԫWq17oФϞ3}~M#fTXbtF;r5wz)EEEtooot@4 l C,d___OOOu}aa#!$+3Sa `%XQ ŋ#/4x: 6m*,,LII3g&Zo9k׮BC?11@5 }@ &}ڶo.JcJu˖.;5m<Ν;`>UM+f55Vݽ{uիW|rC11ϝJ&..n]W^ =` ;/"N:uԙ`}{7g;t} T:adg>N.-UÇ} c{p b}1ct (6jԨ?S^JwkbA)) DG00 w+P*{=cWFDt:+F"F3zFyTKnEjaZuSuqQ!Ure(.*DkV% L2XZ"U54G'Mһ_Rxpd)czջW/19Y&z[tjc_c62Lvkk;a(U3fX\Rܷo_{ ٿw&ffBXhQΝtx"Bա].o}ĉ۷ҥK Nؾ}srrXs۷{wb]UM_ot_ݳ{wĉ\Q(GcbQ-wӘEEݿwoϾ}{sNu̙M6}ڴOOdzɓ?9̹sϜ\|9kxNt_nߥK]u;w08hmNȤk֜8~|ƍ\yN?oxyyyyylZQ>gΜhvM6ypppaa)Sԟ5թ˴Ϟ9c"""ի8z̘7n`AWFM+W&s_h9vP޾{'> kvըQbggYc ~ڲen޼<7bccc=<00S#,Ld,Y|ٲ6m>9Cǎ\k0Dux${ݗB8yXF & #~yWMM\TML蓢P鄍 Ti5q@{Cj@oU`*W`$r'2SܷgPP4lT5 `tHU M ac)}=;] uStx3i#=qczחA0?>ecǮߺ̙nE)%5?\ں?NaggVN~KJJ|۝jF ?W'6iÆ;4&ZE h۶S* kg|غeKΝ6 |uBDzlX\6›BOj_KңE];;DžTMz||}ٳOHxvj2j۹kוfFz))G8syGw|Sofm[dJ2DQf᪀ޫ@A (C"ʮOȺ"{etdcoiKM|I7O96-ym-[>nh$_6ykaӓF뙖6uzrʆ }Ys~g)Nf4F4j@)wQ8}"Φ7Cf~}/]dQk֭Bdgg]{Lj W+/\ zD^6L11VAW P߂N6_,ozaöug6lc\\m#\3(96232fH ʪs;QQѽ{t7[,]v}{fs@T햡N:laè=B5 TE#2|gNWZR,mUzCuqfAp!H@S y sYQ! l'nח_n֤ P3=#=ݺ)Sc'NPO7U~n)ljΫ>vı'F6J 5]ϏqСr如8SML}eh/O;wtGBc8~\nyξIIw$$tiڵTn$U .t-Z8řYY_nޜ?Ya۷{vqԩrK/ȑO~*S_=Nz?(]6 w}o'iӦw- B2yrnݮ퓜":lػsu \ܹsfϦ2LgRulw_ok四 ^cttt}H-%%%K,^֢E)Stؑ jIH||lz9^^^z^h ȸۄί0>>~%$mݺW^#`s]2R#g^ϞL8aɓ'VBPPvNWgb3mzO6OܡCG#{tާw֭[Nqҥ#[j7ΛGyT6ޤi59ڟ8P^1s挙3ǎݰ~};[j={IA&(ofϚ?CisA\z7-**~,K?az`噴,-_}O;~n˗O׮Nܹ¸nj=xȺOT-]=&^NMON6?,թӌFh:}u?䓙͊1 _}7W~Zm2GDFkϭ.-9@6lWG+KDd䵍&):&F^n{fFC]BHdەJeo ,x󍀀i3:uW PςN\BqmhLOKkԸ"-u#"#?\***'le$?ĽPBI}fH6L&ifru?ɓ',ѣGGYjnjuq*({<8UKBHR}:fܸ]Émڨ۟2>7|x|fnjNTj>no>o ylq0l]y.wjU//KqȑukVݮT*2!C*{ YIz'Q|pjg$OȘ9##_#-Mݜݣbڵ/ҫgF]߇gaC s8@e*-)*nuQo3lqnFTjpޞNA[a^5aY&f U߀=pT-Ikd=JT)c'NURg~޼ׯO߾mxcթgΌ=mbbVFu;&%ݑйSukʍv}ɒ%t&1q/WR]]Ϭ' ɉK-2~M襤>};vmFqܹrK/ȑO~qٽUlbZ̟_Eg8U5qoEUo-ZeKe=شvt:߄o&\ܹsfϖ׮Y3m(/VpN7W޵[wyA!//eGu.<8gΜÇ_tIRK.YE SLб"++GnBIvR3ҩڑ+c? /-**???88Ə5zE|}} &&,$i֭O;w !×XYn%v3@6}E襤c'N8.}rӦ ;W'OvO0ɓVUT(ƁM4ԩScƏ3$.wڅ)Smӷ﬙32γg~}qcdž61UK.GjԨyO>P(Fװ?Ru')3Μ٬UKKKWVxw_ozRMwF]1͛?OMKK* MʚOj4بcz9ݙQi>%C R5PSr/33x7 Kmb³J,6;M]Ѩ  jgYsBnAI`VkSW?+[?5lNI:'6ӪU6;Ѫhժ{ j(chPT))֨΃VSRT8@vvs)G]嵰22UK6k8;'=ן3aȪ]gxj`MՒ$8)R%_;BN RlB87{VfcHӻ/?G itt.VS 9f}Oc!PaپX7\)b_n{l̔,gZb^_{lBk5Z!đ\ԓA=ݡcj"p5l(U_jnIM 㷭vM>_O ![Lթ?70-ժ‚g|ncUz坍l;i/VyeO^y#V.7cbF.旗Z}ѓ/vͩ @ ֙V 4F5ߨ4ZۄRx6qӏ?mABGGMvjWB嫻|70 !:vۓ1dBR3]<>|iR#Buͩo+nJP->8kK>οB{ roڱ3'ᢂKB/\sâA1M-_X0`tҩWG+lw?hF !]~r3||KN(礟 oشjmĿA)3=,"'!(7Q%$ٽuտ_nW1;ף•P㰴.}_]eKKz_VzdG{_4#73ōg[|iչƷf7e7eo|kf=:sb%I(e U8sJWl_XL?|m_PhC~a%E'2=8xTz`ycT?!ĝu~ywY1}ԅ,cL'^kwTT. H Q+JVΛQ5ӣ;LX~OW;+U>=JOv4ȷ&tС{FOPE)_Wnk2fo+*ZN:7NՒp*T"T*1p#nxfht>fUR-ͦyˌsڥ~.6,(RGu1n/-`8F~y- 2.mRw7mHr'Kv[Ъ*lHCZ^:g6]EMծqf=x':* Oa2@ LA/:@Rz͚4؉͚49v5Qk~-N.h"5\q Y&K,iӺ}Ö-vN:ݻW`ۗ,Y@Nm'rqqX7m*yξIIw$$tiڵTn:UKyu &NÏ?3ٳ[W~ݻ?\j˖-u;ٳg݆ GBϏo?_~Yz ǎ'/8~\u5ӦO7~SL jutܹY$rFͼ\a{nݝ\`BhڲfY5++GnBIvR燇K,^֢E)Stؑ@IΧ|ŊkoR(g||%K$Iںu+Νn{ ALt)rر Wm 'OZBS&r?B=rdFFF\Æ+I]t=rdVVVFΛG5 SuT;VvkDzR|򩧞|ꩪWأg={R&%CNՒT~\pTj9@tz +Vл8R 8c UjW OLFa1Heӧ%jتՌfs֮M˗ !~ڱGG5nt_v?:g.<~͛7m|ȑŋU.O?Y&0n1c>nSpTUh,e3f~v!ć+??V-*d2Ϗל9C]')eC>XNM({1..''v!IJw}t;޲ ,XӒgtܙR@=Ke2iig4i*HMM ]f':`0<%ew-$~&RMS !կg;OiӦNSu"<<| kV^[r˘QN8nZJ%'B@uSu=3fܸƍ޽WM6=vl2Ѹf7,\0_ p{ys_:@u]iT]kg,סvCBB^zN-T R5@P=7pҒbnZCf3$UjT fMP;PRիǏwmc׬^] X\ w޽e333o_}Yñ'x]Pxyy=1p>(O 5v趉[=jԅ [5i￿yӦ̱3g*/X{k61qFrb)v%KԩMb⤗_..zw월tGBBN֭]KESbA_}eAA|_}AƎ;hm;vmh7w.{Yaˮ?ؑ盾v'U[lX ϗ_zGܷǟ|/P=pTP׮k֬]~i=t:?? 'n߶q)S[O'h4Lq5ӦO7~ܮVsMsEDD̚=ՠX'כ+lڭ0dg~zȐ!$}j~(9s>|KBJcxDĵkttc21++GnBIvRyK,^֢E)Stؑ@ݤjGtBlll||毾$)>!!66V1aQG/\׷mbBv%UOOOoܸ`41<<|/Y"I֭[_y啟v \|Æ {/6lRT\볲^l6?Tˇ{UMaZߘ;vwߩO;vHƍknRpT}ŋwڵM_IKBp7m޼i#G,^H!8-ߥnB.ٳgknsvvv՝&;z؃[\7Uޜhl4R6NKN>cg)+\Ue֯]PׇbVfVؿ_T0pT]+RRRקo6nt4Z,&&׾e˄G}$jҗ$8vh3cGnغUѣF]pAЬI՟~ڹS;0rf[0~۴nrn_d:ILŕ= Rloz'%%78΅ҥgl ))۶nB4o?~gYcǎ4x;~ܶh4Λ;ױ۷{vqԩrSo߾}rrrƕ|gWڲej]0~eOpTZhÖ-r>WFcXXث*7>ڿ5k5W_ŦMk&L}6ʓ###za:$7l8uԘar5kMo0嗿*$Zw_okrK~R6n|[7!dcbc^{1oޅ $Iڱ}^B~9s>|%!Jr++?ftT_~3fHOO|YƁM4ԩScƏ+{ꔔ~L7eF!Ĉ#{7)wth߾lڷ[fϞ=wΜVwmڶm{]t?]9zz)W4g(Ξ>jYZ!fyӆQ=I[lQ% :OT3U Uu~K CT1NX5@H U UjT R5@<:UKBbjj UjT R5@HH UjjS LH UjjT R5jjWT R5@@H U UjT R5PS LHpTj UjT MH U"PTjT O|]n@H U UjT R5@HHǩZbjjjT R5R5@H UjSIDATT T U$^fR5@H+MH UjjT R5R5@Hp .Hp9 _T עjNb-tIV[fR YjM|}J>$텅'OdgfI zNTf5eg1,NűjxV[u*IP.K6; Rsd3HIvn=g TZZ( R5<~wޣwM|snٖ_}Y!7jm{Sڹk׽UR5xwt+>>[nxN`:!{IQO)ʡC?۵qy%IZvw]{{o:FN:922ܹsC`Ų3gp-zpBgh4r _;w^~!6}'.7Xe}1QQ٦I bck{j=`-j_ݫ&63eW}!ϴo ߵ{F޽g]Z#܀[7reΟ}K}gO;^l-w8p7ߘ+XpڵB5k֝MK9ᚵ>AAAB>~OzԜk7roBNMʊ gq )N/>c_l"}g-4$ڹsdꮃ={}Ϟ~w˽G c[xLu/%%OF]Tv0n⮻\v}G;hag?֟ 7Rqe+>99yﯔۗXy}+\_zzzdd$633""R9#++(y!L;H`xov7g~!s  Ww\-v{˄V}rwCH $v߽zxe}{] zXvKXU"PB~CS(T0+BT;*-)a<ഗNw.?_T9\RH,a:7coށQ+O[*j$%U:Joo5x g۷[T*  |C~9p[wF X5\KvN/l_cB+cgZrδԸ~6.]/Psv_5 Bܜ;Ҩ`0\t"!>$4T!$I(}zVڳW Oռahj+9uxnN% JfϋS4V3#rL۷Xp@~>!!aPoسsgA!yrmaL\ʖ`PjlXsUx+#р3 A2 KֆjKJ 0H磌+-#B 8u:?lhQKo^ 7\JP1 nR*6P5դ+\$bX- Ҩ5jZAm,[n ժP#cc#egfI6Z6@m@MfYmRKp$R5ir!ͦ*3j0Hp$].(lԬYɕ"ʀx&^d/9uX_PP6@mVf\.,hx2_PpWRQ6@mVAKv|V!v{M*--PQ^  Upsܵ\˽U1;w;8 7(Bh"#"|||Ԇ7?T8BCB.^ܠ {DG9&V\C;gi !,F}c(]6b )-5T*l6:rD!9r QOCXIBZ]viVʕؘC1rO5{  mԨ5%%:D Or_o7 Z=p*Fmm17%S1TH${Gk{HE/B/Wn^^PܼVAr+p1h 76 c U"( ( MõQa7jGØ6zQW_A0Ca0chUQ7w ZnjkUQ_)BT;g3ytJJqXF Q2p)J[u/A:gP:?0zP6@mF X5\.U K.Z$ć !$ =_!rv٫j CwGjڠ6{U[aa)S; f _ͥ6@m-) R5>z^Am( R5<&X t:NDK%Am-) R5 ^z酦M蓩9so.3f]wuk>ecի׬cm[ ![?ck֬K/8z=˗2啘^d굃>qO۶B1tz23>hm6w1z!D}Gx~ /^lذѣbcc6m[~зO׮]/**jNBb9@$^sOiqmǏ~݊+g̘UOC7'N&&wxrGٳfhew/^Tn_aCf6wˍ}z-w[?ıZR5R].\yYxۣG xr[s^||Zshڤ޽N:-oBC>C<#7~><$$癧i.Jja@a@"ˀnR*858 @HTmل8HՒ$ b5PTmWjjI8R ۷C$a(LAQթS!L=g OQUZOҪҪv{oUߊV+@Td^p3_ce};lkZ"IENDB`kildclient-3.2.0/doc/C/images/we_logging.png0000644000175000017500000015760113215302470015611 00000000000000PNG  IHDRzM pHYsktIME -vtEXtCommentCreated with GIMPW IDATxu|g/O J$&H--Rڢ8wBSxim` '䲷:{\~mf|g=3C)i6tzt*LYʼn( ҚP(3lxS!ʂ1ƶefˌ-oTq*%dyjsی !9%eBm`AD ū*)*Yoc0\yylJY-=%+Rx^J,fQ%ʑqE|>)cK(@/JLQDM E7eڛ!9ZPOcS=,.$eIjBlXpFxSI#3" {[ FaFb@b XY ڡ*U풙VGuaR<ĪW+9>E%)JHsj˄H/EY-@HL $ -GR[EUcMzZJxR2VDJ-ĵO1EQfB=:7.---++7*55<0ikͷDrxBG.L\ԀJ "x2aima"LU 6Scv1bn|R2ɋ1Ƙhc $vgڳsȺ$52GRӔ|{ BOY:? m`PT*5*ujjJ2 y\HҠ (lݬi˗1M&sp%y$Ef@ 曖"NJ(P Q:3{@f6#7<ܙVK/A+4}΋5`gihMcpMh|R<{1ư3!$ d$$M|?n f\Vؒ+"*#+ VMIM (Jo c/yS=R:+WN1CrJ}bbe..ĉմ QQ&y5% DǮ/\X@睰F1D'[[ hV7USPRڤF+='q]z:$u~ [zT [Kİ\s28JZ!$$Dh"(ǣG~ζ.NK!TJBx{}7{Ci4M6tF5 ˛(jd2C'R 斴+"HmECS-67\Ra17)>cK6u`9s`l4s81 (9' /u,l$iJۧˇ߭r&Ʋ\&Ӽ֝8`-<<<JU6.h>rH^5g[;`giRּ? u M\Ƃ>!mM5m!yY\a5SW$!$4@,jWCs6"Ul11\`C1Fr 'sX2}<<&UR}c yA6y 4GGGUJlذa̙YZFp+Vj5Z䜚f0% j4W._Ypь37[Stx!6=b~z1c:`& gQQcFZ$\۷!$ )ׯ[,,w\]x-\vZ_xi0.]U쌌2eBk׬ߠ[ԭn:cwoߝ嗧_0EY@0"65HT@31H[Mln<¶c"[8-rM\2"^曨y6ǐ%IjLPĵ)qfQ|%K1_/;H1=0by>:A^33fG'l 9hڍkcΙV{D!I7(K2˞U_phWU^; KHbr@, \]EH<-/DPaf+0XfB90煏*VicZg:dh"^HOj4 Q4~6-m̻k֭[ٓ+V(uӧ.ĖDžڴqϧNص{u(JIJ׷xQAE٭ajBR݀ޠ?DHOsss`^X& 5j<} FOǎpbjU?)*==-33Dz9M7H<  ϤF$)iidzS:1Mh=SM14 XsQ "9m2OZ~9gv5eM1q1_97 XO631_b^ĘwELqu|f$`dD V@`L%KBh6?Ež-aG'Y6Y Y'd\[I-W"cή<ē_90`i0g;{ŇEr_Pt,D<8issMOk; 74r WE([$$PXE(p| Mh֒$uA@Pxyy_#!9mSNKINJ>R(<ZgO{$YM߿؁C\=GU8rLp&cH|zBˣF(SqÚ7:dڌgN2|pCP*UZjjݺC fϿ={|ɴ3#^;PpH ian,$[kX8"ƧlN>k^'lRM"[Kn2,Osf|˘[d.oS\ӼXlH-Y~=-25 6D-2`c?FC$p _g7rvugsNNJq׸.n| YJҘR$ quQFy&Fѳwo&QYY1&O2;7oa-L`f3RdYهL&h~7`,qBQ$&LDcFMq yPq` +gEq 4]]ryLm|IUm+?),&JʉbD`,$&Y5WWe,s6 %D17kkN,ILqX-@q?Sq`YRxLДNh0Y#){0r\(XN }QAJP $0MMI;JJaߵ-I J-?VDfbEQ#i y'bfiUP~+ ״!ֹ2]ي"Q.[@`cA}Lqem?*lrscxB[jj{S|* s6KgcNrę טuQh駝 36;}B#ҹ;u]Haџ*b),%ݑrYĬfY= 䟪mLc22 |\?8"O.ԋ"Vp֟25#Ѧ?a <&{ʕ\mwh^5S")Bx0dPByi-hFs/s PA6Wg81ctcΫYNH_yA2K[8 U *P56͙"f8ʖO2VA)W]ňGalJثu)ǥ3D~BYoFJtag B2=bVwl~If/,kel,gJALr eí0 񉖹F^<4PU5\@AW2Co%Dby917=KIgt9_|%"®rČX#)JTR.%l)YH|29m0λ"#XM:!&<0.*R0& 1 TU I9YjAaZsrugO]̤rD6붘";zlMN OySC~YTp#DbF<RmSkfŚ[(2gEI\5C:=4:#@PU'MffeAzܪT]mfC[M]n|H1† :"!d,c ~ Q/?@xCՎeO/r#Y|#ZV&#nu@(éYůCJIl;5K= VV Ϟ=\Z"Eׯ$f!--*V_%d)[dcYE,F|E:"j8kWz$l6TuI$bUפv]suyв;_H=YbiT5ѯCCk)WՕÿ˖+YhvrtzqTռ"2c-t <"`Qt1+GJ^an1c6RyiJm7%;Y l6tƖ%gzɷ[MFcy=f\f9YxTtT{zz* &+G0Zi[Q^D5KhJZ$:X}5<&hUyſ|һwj!!Æh׾=D,lъHhܡ<36⳿Rr 1RdUʕHf̯E7h2b&V:z`qNJn|8oشyM(Xͪذ*,p!tzVwaWc.啐_tQL7oZh "Wђ!R$ӗ,Uʸd=JMME988l-/"̥g8+`-"5q5&orJX8SgoXސE[ m=afliafk$Y64.3I@R \8wCQ%Kڽw/-II2F?q҆MBCd%͞Wd.d3A|JSrU!sI$[jjBr@-#6ИbiWV:$-2 mw FlY=~ؿ?11!;;~3F}ՀӧGE=j?;zxQ鳲<==޾};kt8>x*ئާfq$kt|ey+y2@-@fR1ʒty'60RhBomYY$CiS *YyMf9wg9Ó#2e?/IV:K Zȇ[JY߸k5';3<-۪ua`HO3颢6oihEh]sT*`bܛ.K#) HsgdEk[^W@>Tc+t Rk+:O ZY ]{T`_lluVm])Yäg3[\Om mm TU?9@Fݪj ȶDm#`9%Jtm-̸p]yVS>gU @mZM7"g[Nj u/fMgmP>hhU }lm&ȼ%_Ą\[ zmə] Hg(Ī`aL<>-y>VY6l !tE8o! ݵ X@p[sB\OʷЧFڬj0?w"O@DU'UA/ Yh4 v-tĉf'Nر(~VN8>mϟ%n>>}ڱcGmxB pc└6l嗟|̙m۶ '<[c!XZ6Zbqfp1sB\xcl>,ѐoRer2Ճ @ސG vppS#VjzOxBJLLD |}}D!J%b,0dȐy!J,9jȆ |;?Fג`F)`B*-_*z`oܸqYO=|hUV|@+VJJJ⍒Ud ;v8~ݻ5k \pџ9u3gN:uzSe07F@T[h:s0X® @VՖ{B gϞ9⯿"o쌌]_~y_J9sկߡcG8ٲh4n(_|6###[>>>$pYUc{c[l9dPcg7K||<87޺ukέ[~1!Áԫ[rŊujצ֨q9[Zl gov~1)1)3#s=MDY^8lly /_0nܠ'MP}k3u8+\T^} k׮͚5111:&&& kĉcƎ]vGFFFb K,YvmP&%''+VlW_1pTU;;;/_mv$z۷oϞ9m֝wb'O4z̘`1oE,w:uʕݻKk֬tta1ci.pnժ5c}D( HUKJиqcš*WS^={VREcG~]W\i oݺtt:t 2YxqƏ/VC?5dȐoNy~B>V4p/`Nh4 z`;vؽgcT9TXQP̞3;TU_8{F|1VAtڵznݺ 3gQb&?UdgW*>qSvp/Quy-ٌBm^6DEE-ZxǎVcStSQ;ŬZduHw9r_СC)o۶̙3; <(fK 2eÇB gO?{ (0/1 .<^8:%,$>>B t.6)֭ 4Jc2/7a{ibYa+5?;֫gϐZk˖3֯G-Kk،mxE==ip +<~jWZmۮ^j֬!C7^~]T}m oݦqgR|I')SF$momYx%gϝlcƌqqqv۷|5۴4pcǜ'L#G̜1#44N0tȐǎ#F(Jft\y7fY^w߾/fee߿g?ar4j^'}GKJJ:܃lտvqɒpzua7/^!4xРZh6##cKÿ2DB 39|9s<̙fѣnݺ##9r~DjW֯[~ݺ/^8p߷\|戈 ?/czp&[b#GիzŒȸpQm7 F9~ߑ˗-۽kNߵ{77MJJ۷oCBB @%%'ݳgРAK$%%ٽ/aL@S#6mzsAVt5/3gMJBpG.[l] gG%\fsBK-ׯ߉W\Ǽ'WU\9zו*U+Ukfl۾K.K~f7o,'~ :4""B#G , `;._JK,D'%% /Q>na!1Ƙ(n onР@;:*Z֘%[[ܮfdɒiӦzye%pCK,-Ju*L+2/gܟ?o}9zz<\t٬3ʗ/Gtuu,ZB(33͍Sɟ6m2e2E&+~]oo@ m߾CR/^Ǯطw>gشqdkIav}z/f"3 #a EQm!b/b.*A=믱b7}l,BV jV;.Z}3'_vҔ)uܷu붱c!4iү_?:~7n>|Rܹ_-. I>}L49##CBm#k. `K8p +۷ׯ/jժ5fN׬Y~rdfr .Z%"yޫWOZ5u4J_XL5j43K͛BÆ 7 WWۿ~̘۷mۆuJ/TP8Bh߾{yT3sϞ= +FuEq!*=--!SyyXBZ؅$1<믻g]{;gdj杻]&?#k},+Ǐ[nݠ_URٳv;zT}6k&YN5޺cGŊBOkn Fs҅˗ߵk'a=_=oPцc`a3`W䏭xYj{Q5}Lfxddŋy(55!dfBKaJb6lh233u4<;;qI9AA?^qqqXYurٴ)OZ6""? 7|dmP ؛Ƅ+[BBV#h҄>n'm陞^+4Dn\\\ʔ-{׮5k)R$4;*TLxѯi4sڀcW!, ! `q:QF 7@z$U]sn`VV۷o-4faX|ĉ/6Yzi vmWD-7޹Ks._Bh9t.@nݺv֕< .r-|=E蹜0f7,[rIxxʕՠa#sUuXzz_4A}EfaayǎԦe2&LPB;o_R[^W~a 6` 6`#ڨA\_=z{P$UؠUthYcjZpttttt(~f^UQޯhZJ(\vdfeu IDAT{ GGG +f&e{-I؇;CiuUY6JU=(RIܰFVl$''GYMNъ}1NMM *S&+3SvV*S&55KbӰjJa۠4jara|b<{ 7λ^O4Ϣ)R)*n)))* t))MTpV|y%Fӽ{w8[AR064`R a06sIؑ6Y?9c ~޸qbbAU8*5jJJ0︸8F[J%J"9ܳWoE dB8G'%%qխ[7ӫ 8&MBծVypUoܰaĉ-[rss _h4.lܨQF-\ȝM(Aw/Tݺtّ֬Ç:G9 vm'g-[vڵZjϣpfK~>wyxCݽ[fB۴7~ݰzu?~޽:M۶&O2Φ vjNHH|Էg/^xg)}-BJ2>..))dɒ/ƹ:ѣt]vEuڵk׮t[ʕ-ۦM6۸ 6a9 ^gL>cv6n܈L J,A.]*>>k /U$3I Z[Ff_/]ʊfL:cN>66666v…;vdeL@3yҤ(NR06`?88::VX1%%J k߾}֭1Ƽɸ%ծ^^^C}cOo޼ccn7o ?T8<|7*֭Gn+V9z4W'iѢѣԮW\ ׁbt{NRR^SUQQϊ-J;99zA2###% I?X̚c)S}ZÇ;vT\/Z˗/Zj?Z2ֻjժUVi&mM5kڬ+ٳ=n\XQ2M;;8H``'OSSSJwtTreo޼ڶm ?|\lXc TXS^]7Glkժ5gl:ꫯ>lDFFƍ#~A5o|֩3h`Nײep .+6!B8w?_??_?$   6ƹɂ6[3*+͉5plبQFL0Fӧw>?&N0q+B_g`BA::;Uٶ566N$) )(*.6YY~O(pX > w{oj6-5YmCaY⹳^^ vΝmRhԶhk׼l  ;99O'j֪]d BB}.N^^ aNTf%JZxƾ'Iؗ=0(훷ׯ^NKK]EEx(^TR2+Wl$"ŋ*E$ vvqurrUtC)jrvrVeٮ"W7OO777B܆٪ar@Sw]]]m$ EQr,l03jn%_a`djռ ,*ͧpa`?d'$$L8g+/׻G_/]2\B5 U |}^SMۻg7*U5M<ɩAÆ;vF92/^1VhHHժ# MNNM2]ڵ\|F 8ےM7ԩ]VhȜj"%o۲Qze a 6` 6`tK zH2ebްG1wWj+-[$|ɲdBL0~ [lzժqoϞCMȯ٪gT0YlJEۡC1c9r$%%\rǏ .]5++o߾ݻwc:xLt7o~СC.\lԨȑ#]\\С#X3g ,ηoڵ;22R׬UsqEA۷o۷O6mx ~=zd遁AӦ[wNwȃn*_رڵM <ёk:tĺk{;աCaÆ8SRR/fֽl9r؉'z}ӦM T*E Ǩ ѣG.Y[ ه44BBn޼~wpp֭ێ;N@lՀ=f1&ş_$uYn}d|0<|m[u:޽{Y'ӿ0 ,Ixxxǎv޵s?_ߝ;w+WӧÇ-[5k5jx \ [ѫWZz˗:,rXvmG?)y,ă֬Y~7o>|X"xsΜ9sGŕBCVte]~ 'lذ~5ܶvh9`/d7a3zL@gݺGEE.^5rd%<= [ڕ+WF 7rcsFP,c!7n!$ц*ju5Bk89:jp"9)9%% ͳ2iBHѢpOb<(WfM(聃Hkۇ`lW\1|}k_zU⮱6Ԉ}}Hء\>Ç|D_~eukؠ!o"85 g vzQ,t.^:lPooaCOsrduQUIm?}gg'FC'&%(Q5BIIIŋ%J7Ǐ=%@Q@י6LVQϞEع!4{wܷ֭Cv#ĺ RSIkGHrr2NJJ~XvmH;)S =@j?O-[TP"84 aGйHNN(F/j#c*"Л +??߳\899jgggЇιqAA9km"_0A@@1 ' )e;kLww̾˗o1[z=%*U*Wӻo_ɜ*s}L|||ro}}}+6^Ym63zվtIYxxxѝǩfil(:>>>qqqK3n%D>-[ظ)"666##c˖ ?~BRŭex5kt˖-IIIIII7o1o~ڵ111:իWK.XHɆeDRǯ]GG_! 0ңG˗DDXgpUv{G0iڴI͉77mD"+μm@fk˖-͚5t />rǩUf`Gйhڴɖ[l whG ]دL=wW3fRT8VcƬY#^^^={}6ާO͛3Vtޭ_}}ҹS'E-\8..TR_}%^zN:-33PL0~֭K,ѽۍ6XxQ||B``iSj_~ݡm[}e2>w}l߱sI/OooH+μm@暵j0A7mĘR"RϒY| EqjgQ,t.y˨cJ;FFFMZR?|} 5/h{Co&4oW+W.j:t!)$S'+T3`/^hٶm h.;/^z ouaFAѧB trWOP`׼y [lC||-[5jRUu^PbE;/<<޺,\ܼ]g9z (6qI'/^|W_AnO=WRrO'ժY%Bc?ѩBCoZM<BIΝt <TXqIUV]hQJiӧo߶Mui7Ы}VXɳgO= @=((۷._NOOJYDRJTV9!.HQ/ 9 *l߶mΜ9rV'ND͜>=bӦ @ kӅEyyy999gg \]]==<(pqJc@.ЫUq'{{{CPTK}ϟzȐog@}wGQ@^w +*pIQ>VMp}.))z33UmΞ θGKjJ2;AAAqqH^칅 gg'ggY9g(LR,:&&B mF9;;ggg"rg/ߦM_(......|ѢN9fl߶-;;͛7g6&~9?T >[.;t 9j`׮5W/lҤ1# V!9[wqQl_. %)SAA31h1'&l)m*v#!؊HHEm0?FuYfi|?3{gfw־bCqrxGKf߼~cG=p@0Z@=jU0hx^S.{VUך:An'&0"etl#E(ëw ę 64"eՍxG҂*R,pw}]t_U7|,MWUlցUC]4ƞ;[Y^grᡷ֕XKW#1Nc=XͮԭjNDʪ-wx^5

@Q\Q](H%ߑQPm8Uh z}}emc' 9}*"`\hYuC$΁T~?!>SVY5?'K]3B(/냼VY5?'[M#B(?'(H%'( 1@ w8X.%n\FAzpel 7#b Zp#B(.d#QJNQHA@5yk[;lO1+gΞWVV;f,H@KϪj5`b0ӁF\{륗&:{ol{P 6lҬS!Nd8yxK=QHA@5j?={yƸ'd2F#@Ϫ1c /j $,Yi_!<_y/\.xϏT]}i~Μ9rr/--mkcs3g!5dՍd2Xθ8o \Mݍũu6&<' IDAT??!,OBGZCVM+c&dŶU{#߀Cũu688B0DII)??~MU7md.)BE,B|$$ @E5'FU5CVwӧ?{<50(F{\QG])sn`Ue:}36>.}W~†y&CL -Kg!sL*+H֓@H|ݺ`0 @\?ԬAz ~13\{fԐTЀ0q29|H:ݺtiԖo?Ο}&d0}cBq8RP5saăΙ3|i \bgog4)((utC!<'{O={gɬsExJ3B2 ziV|9Cm-eeZp.p,inz׮]?wԩ^ 2?}^QQQRbb-%L&HEEERRBJJ !TTXH輪jVV~ 9555Z`9AA߾}odDjGhd|4o] &Ϭ,mp,qNݺH4}#>{YƮHJJ -[ɿ+Vw:{xoXPPTT|mNVV֭۴e Bh4W^Q!+++%%G?'sEo[?7XLrrr^OӅ܃rջ)b].jĚaV刋1..6!vڛ c9ӊ;v|Zg̏iʆkf O\nVV+o_2mǟlgBc;H07;qK/4eIz\Lج?)w+%$L2Ȍt_~5b䤤f4^I._D_|i tSL[ ~VcՕUXuo55j[QSDҐMNN155i+_zʰ#fMy<5/^r\F\\;w/  ݧO3e˽׬9v%oLz6s"nk=L133Y>H&0~U1߯Φ_eJT.3001'oTgg-[|111q.SggV?,OʪW}$nCji٣_/_ co<4Ba}Y(n6p7H6} y4##c=$##!N\|iׂ}ݧϐAf޾Eiko|͐Af7rMճ}{EmsCCv7B7TUzC1zJ{SH2ḯP[n5COLbXxؕWf̜s"Z(eSTӤ4 m rmƌu`}{(+)EDDJ?ݳ{ĉ;v,--ٳ;dCCg>}'$dNj>rۏsvE⢢0\?˶ %-mҥOuk:__B!)1 ._y z*ܹs?+rP@@Nv+W^\::II)ɺ>} XSSHt "v2th[+/IHH\r!tVao!gwiG%ͭC/[  \t):v+ݸ~}HXr:__.r׭]C*s2MuTtwE٧wo?\rH֗r,ٷw#"#j!z  gΞ++<;KHHHKKO4ÇġI&HKI=xPeU''|?3+ ?zʕӧȸJMC_f6hS,w(//Z뫮7.&F͓q޾>kםNƭ^㭦ǻf}}W,[bRoߵ-- 3ϛqV,[OKK8dTЕ˗{\r!z֐o!t1uuttxԡݺuع}{uF1B|5Bzo迃 ӃO3ݺuݽ{wfV#G޿?0(\.g}!$\!,<ÇAO/(ƪBIɉIɉ(~N-FJ$])#>.b#`6c #GuuB߾}oee!UdeeBXbhQXX8B0 È5bOߤW ~I7B:N^^.-`Anݾzٳg^hoafϚ._6n23<*KޫW=?0x`Sn۱=l]\]]]*lKLNAc!// X -7! :th&&ƞTTTBOoܸA]M !9sٳ=R)?wnÆ 54Bs&*jӂY5PW~_3BkђcFm;vwdBiir7wDd~;իV$nr䤤6~}xA]]M555B9##WY?3?k>|4x0af N4IB\|xaamڴ ջO۶m z>tsΒ$:Go>##\6kkk/E!Չp`igTTTٽo۶ @+HjUZZ6 !?e+S]]`0"BAAa e @=u}^ms&X" IeedAaaȞFQCpvƓ5$RS;v꤬TTRz浈ٛo^^^^^Z_[;6 ml}ssssss}Xuk}gl < włSЯu}}Lt]АB=!4!A?c|xի233?קm[cc֎oԼI n:?ɓ/^-TZo@^Mw n./^?FFE\v+o\z *UUլ,bbbjiE2,/78sVxDdg5޾={og1;Oq hffJիW N|=F;Z=jpsִI0wΝ;[k5vl׮]̛G۷oo>|ѣ#p6[??{X@fӖnICAB 됡CY9sljҡ}),̙7O[G{ԈcF[Hر}%KL&ݸ~]Bރ߮XჇUJK##v˭3gpoޮ]+"¨Qsr| ˷xW7aYx!O3~RVw UTIHH 8Ph.']MWKik!gH#]؉ 75حs';/_Z״~QO*ĉ ;<ܴe\楢LH`HˤJiԦHI*($H0bBf Cof7wy:m ;wԓg !/kaFV) GWRR޿oO!5B.S!B#@JnNW!//_ZZzdl>i@!Mo^nkי&ўƀKQkTٳc ʆ x|ر iR !NwxæMڵC͘]pᩓqBpk|Gd?+(抳X5e=CYy BEi>~̽zׯeMT99v;n쬆E7knІŐʉw۰qӆv̛3z:$]NxJk]ߪ?g)))SXPPi#%))QbHLJesLnFJVVFZJJ 5vVb諝_M~K@RBBmF i&]3IjӦY &&??w7״Ԫ@|cDNj.hD_jM;V`0&K߽5y6? 0`g@ .9kVyE8yj_ЎXY ڡ}Ο|0[Jrs Z+Used|o]k+6.Κvl6X]]8Ijw#ק0';ִj<iukO.2nZp@R @huY59;wttH?m;"l5=%%eڌ鷔[<i4v] hF%7v/luDx_Ue&h}akƭYyG+VZ[=ݻ֮xpY|ŋnGSϝPVV560ex07}"W4,X-3U֔.jf:CZ2))I'c&MCOAAa.]H?Jys@Gee%F1j7=EEED퍚ABǁ&.ZSL߶~,/p"SB&Γ&?K aq'^^^^޿_?w7IIIt޽z=|XQAQGGPh@-x*8<DL썄Vܨ#O>x̘.''[>S>}՝9sV͟?y `o?|PY&L9slII) :gΈK̜>-+;tIIysg]H`me;atWRY uE2_"tOּ1[˳( 5q5pxoeׇĤ$7W%%%%%n7H3+WyOm*-#39--: FBZZZJNPVQҢY 7ݧIȸB[z).!!%-=qÇ <# !`0y|_RRfS4ҥ;sBVFŰO!燴`ZT~`ۃAgs8\m222߾}'̕}r* =u ~*1"(dԄF󂟒j Bs~}Ǝ4,ҙ(ԽGK.E l^x/Pup/MZRv**>ܙ e!BD]Ba^uC'XdITttc,]>z9!QRT/SRRbbb$"*+W,o׮TUj\, IDAT'}Ԏr^^֯ws_5_ZZ} TOOoɢ=xp}8iAJkm:޽74եo"1ĈT/QET#`=Ty_]ֱ *'t&q/h l^xiHWRT,(,о=r:ZΗA(E4l0ZiEEfz)ll6g͚FF';GK_WVJM/}C?v fGBBb8裄PhhqIIqIɡaf&\NN.''P39rϾ999\.733kg@| Ϝ*((ܷ i!CPh~AAYYYhX8.,,*ڻHN4 0(;;_:iA Tm>okݾ_-Hԁ /))))) dfZx*j3SC?uSkxu쨂"tK'ZDBF:kq.iMMM"JKKKKKCItj-H˂ "L U^u=h޵+3!V,[Fk֬>r!dC-**8~<͎ vQWD6֫x;3zN"%U-3yٷ?)yy,kmeYYY㳶j.5sFhxVii7R### 4;t7g6.q҂}M8ʔܽ{y2} =u {.[/351CBDQFMP煽EKL++1c|xVQE:鸗N] 6Q/tS4]$ҷݡá /e1Gzp9Z 9蜆ܜ<.W^Ƈc-$$$H^:|XUQ&n-_ZG ̓&>6l߁;vDybn]$kؿtА=M1r]K+FxL̇z!`ߔ ?qұ(Z>23m )An4ϽKϑ̈́.(( k9IG)))J|!v+(ZjCp@@5OhX gԯVy  UckolS!))YQQ!%%**,$䪪ꬬ,{+$ð+V$@p xS9qܨkb*.kdd4M^g@dVZ{w𠻇Gqq զ7l܈ڴq#} ӳa۶Ad4&N'lo-ؑNarBlFV~PM&]v=z'O߸1q$B.))vݺ;w捻>\]]]e⣅K?ywԀ!2^x-j$O>=sܧOǏ{-=Yx)ǫo܆[tٛo}.>m%Лo,]@G@֌|V{qƏ996m1r$qիW `j{6}P L/_m9k~O411>$/  zht$8lZ04559#x+A3MNHH{\Ii NvFyyy?##w7W|DI'OxY^uˏĈfqR?kӧ?}3st--MIяKG"lK@!tUBA`jlrd&+Ν:x[i׭T9DTp[LXKBG=}1mxYq gJJJΝMISkGC</&6.!fEyw0xOZA!.k*u싐B05Z&M&Q湀[&ښΧ{qƐe~+5dZ-8~@cޫvquMHLLIM]~=pndf6hYZZP 9t`Ϛ5_q'Oeegoڰ~ӆ23O:- 5U'O>}L]]۷oq']8TvzdTԪWjӧϳgBwcX<@=}mgϟoX>{֬Zs;v8=}ƍ~7f:I G{^up>}z?x;I|5y>Yi׮tW/W5 ue!Srss6o޴aÇGur> t\ZZs}Xxn 7NژZ;REŚ+v7 KT5ZͺjEHIé NvnҌa5/řJ9¢"-lܐItUc_'|[XowURRTRRս{.G?`2KJK?4c4\:/꒘, W){{'Pt֜s=}n߁3fLkNݿ?f{c{Y޽#\((*^>խ];iiSo&\](*)(*)8LJ8>U  )5fLL[[7o`dfj*d@C'1)w&B[7oѣGmژTUUggeg㤍#u^ a 7JHLqn%k*5#௢٣dy.&/sqy"S('%8OVPTPPTp\>~[cl,͛<(f/􊍋usҧOoPii*VRR" }@PvvvZj6>{#mݲ W: z~(47s̞`aUwY2_TTx2/񽷑h/mSBRPw$%%l6gHm Ԭf}hFFbƇ=&|@CPRR¯/Rk߽{񡬬 !` ,B2ON7'mL["KJxa.Q?Tjt%ͤ\BH';sAH@u.Oo,G"jU.--mc6BAF{d)kIh̦Ϗ<|k7.a2?'tt-0G{ !_P'yyJJJt /(000,7/8:|PnKJHH]|S2zz/]С=ALe˗_ m/(o3~R(NjS>t!''׭[Ȩ=#zt!J%%).//6tST;"Rc^^٥ 8EEMR#K/B,&-UUlII ЧOv\Tp)չ̟LתXXXؾ}{jY>4 prHJN1359Al%'e`ЮElbb844pX퐚ܽwӧÇ_=xM_z2^'O]ܑ#G0'#  &GGTBJmsr> :tSO!ԳGONP*LM gEuUURRREEE0N7E5N#u!>ZPPPVVFLm:J.z^4Wt;slUUUAa!T`N "u\R651,----- q h0 7\W:,4,|1DkEE:t9 FFGX!d{O8\ m۱PC]}8~Ϟ+]LmILUBori-RS >+--ݭkWu&##ǻ,DP !ll#,[b2--,ҟ/.*jߡ??7:` (Y5jq1r!okc]~󵴿M[[VyNvBUWWo;+((x2t(IIוUSSԹ3B(3C:EDhjj o` î_d;@Bh+[خ[뛟׷VKyxb'ٹg~"g), ! kk̝?{a,qqW7drS ӳ23;vhRgNݹKAlp}xq}iԒW,tĔr@8l6}rd'glvUպ|7e4^ijjY[es8拗,USCZ BVZqp/^pU@sâbUeVr~")F0 ȜO+b-_" W XVݭK3j09|HH.n]4XB+p>@=xPׯaZ 'b?k۶r압ȰCZzV+0dllͬ[.xbmRSSy<ɺBRRn[eOOOB{9qoF[JJJhʋb6k.]:~f}?^C'efw4i&f/^p*>!dcerj Ry\r?ٹc66 ,^{СEEED9iiam֭[s+a/_Ouee`И<BήS eYSIL&!wvqCE"} î\v굢"eÇ!&&&`djv2K7oF=u:f(aΫzJϞ={qU*lӦ…7o~bo~ƍѣ>>m-_~E!@8 BOބO'j#G ߷{˗Ϟ;OϥWB# {u~3S}w͜>Cf[ٽW3gL߳++0F֬sObcL=IOwuqgdԭK|ݩ#GLH?~3׽[7Sc\!@W\[9B_b1I~z]3(xu~'Gii!ruYy9@ux#Yj53VѢĄ7/ZKLfQQJMe fϙ$++۷FFgϞBB0 KHHXbErJ BHCCC:t0B 4r?嫒".+BHNN_MA^!$߶-Bb|[ .!g3Lc*#;Bj'M˰ %?}fkgw&>TBVVVJJǏW$ ޼yrB 11\8iU[K ( >BGG!̟>F}!H2r '$x}~AAhX8 UW*ckgG5 dƍ~~{8;ߟ>|g_CÀ;mÅS >|_},ZR2 8?8=qz񘘶m:9{Qmff dB?f0xBDÆڞZZ=B0Fx{ajLqsG|@.Ȫa ~@X{.DW-FiEH-1 RV!pCN`?UCN :;1@dYftTZ0`@K̪1 kS@##y<q-fպ5)<}N;޿{7k>ݻϜ>s&cPWKik!lZo#CC#Cõ>l6WKNJ3[NDGCdapTƚllaSU:mT[;;11۷ g@u͛6og߾}BԓgB^?w!p]AA^!]~E;wN8r} eIҽ NwoU, @߫nywֹp˗U_tĤM6rrrK-Mq8vwzyy5>/R#Nzjhhhhh]w2.3Y⢢:lh;\czq9%T٫`ry?W4ժVF'l 5ӊq1ԩA;wl6_Iz޽֬}~~~!yyySǎ5tׯCJݜ<}SΟ?U5lvRΝ|-Xtʥ+Vҩ}ZvJ~cW=m7s~{E΁٠AUUUAzΚ+d^99_1=o$v IDATѭ[7;bbbľZf.]"222q0 ~ڒE \𪫿|*##S\TP2]W999U_y`!޼}۹S@s.n\Fr۸\NNVZZ:''gӆ|xիoع߶!_563ٳ-b05 V]]U讗^]ͫbc׬:)9aXRr UOO=_(=zDZmЀS]ݧ9ٞxI\\|딜.\gƴn]">񢺺GS\dek'>utRJJEEQTFz]VVlſ6x o\m[9BٳG+߶߃l U]&MppROKB4.u$9z'' 縺Osuq>{/_\5;tR`PW/--Zt6?ܼ[7oD]qY ϜMHL(pIB!S8 "RTrլRrQGf1GeH b͛6ux Y9sljҡ}ҲsܹرVcvuμy|o "m a m'˹{ノwr9|,XBo?.?&''{3g O?m`o{Omdkcu({CvnEQQRD3Ξ;KoTZR"ȯG22Rq#<񼣞^۶ۻŞ]._[Җ˗ޫ=|pY}(i㋊6Y>ɓ+- ~zB؃Y,Gpe K||"͛x<^ɓ›(0(ZjVZsƟ=aǏ4l;l r&$#+[pan$y6u*!gXK.uΣ'O=O'5%))v>xv~!demsF7oϞ`lbtɊU(~C]mm%E%EmR'$Դ'ŝ'MHIM%lmHXUUeocgg }wTqvOכ2eDvd'Mpk!#G\{`b

Bzeo}!foܼ2yR;ei ޽/8 "r"6RoPM:yEmTl-8c.)%#3[jvji'␌ Ggd;CfYy9D%jBFڵkױޝˉNN >xi{xf]JJ"i>}jN'w$$$l͂-<*wfL__6Bڛ9<~($ 0J*[ZKjPX(V7c4j{/_}ScZS{@8s\/f r(4cn.ٽw&cfH+) :rSi駨#p?, nQ-8[TGFe>3ηmb cǬ߸!kKO]҂fnQGڽWA^~Qw'O0v(vUզ-~UUUV2zԨȨ[C]\\^CctҖЬP9"2LsİaϞ.:{DFg=z=v€l ?#c ),,RWWrX(0JF,Uk,Q~< py\zYY&Mn^Uh.lp--ͦf|`e됟EG_MC3d EEǵs*+;;0(oF:&F, 9*)p}Ϫb0Jʒm2 G ***.^lɢΨ#,ƌr9GWZu6͝Uv&LӃb ))۩o㢪?vdQrp-4o;nu0]Ss=EM\RZ\VZ& 3sܚɒ:;g{3zs9wt?n^JecxCjR|G*:9:gwQ#:Y=w7 ǝT*32۴ƻtf s5Ue^oveo  UZpO֤8v4~VIll]]]jZ mjJ% %ybRM1:D'RffzhB97nPʕ+/tر՟}߿ͫ?^`0V\Z6Mc| Z3 !ࠠ mfgd${*ԔoN4i;&?qbN6no)WG2bHt/3˷N{wO׽%IR&?MiiΨMqݚ D}[֭g+#'HըCffu:33s߾޹ckk7 g5׭pk^1OozW<>?]Դqc05嘍jR2,rқ8qmZ2Hy\PsAyyya^B JI7d;[ۀ.]&t}{yѻ֮$)Sgd<߬ـ~}Cdn\f%:o'CL _i<ր}u=o/!o ]؍ !~{]II][򟂫BV ˯Ů,5,eU!]tḡߟ=׿Og''?-+.݃jKZ ow?<L:Ugee}sd֯ɍG~bŪϬ,9%^ͺY;ޙ6+̘޸]Q{{gb?`ii旾 c|h}<-xA_l˻q㏷G tV͛# "/nފw?;[TKxYjXʪ^IC*8:}BCb\tO׫vl|tէNY~ѣtk !ftsʼWD5ޛ8ťFYx;j6 62v$I.~ƥ |ͭl[_D\jG;\{2qM%\Cҥ&5bWTs-w偟)~xb)coݼ{`IzXҕDu YMsiVѼ' 2m<ڍo|҈CG=zaߞ93o׮Чo_vBZm[ǟuqj5݇ |ڵMX"v\nkao3ƌM)&]ebbb>xʕ++//]v8s&4!d˿]ٹ+Njob)Rafai)I;M7r&1N ƇejZRacsr]al߻gwhxG]zbӦLްis3ssFs'-ͳVg?0RT[w$Iڔĸm_MIKYZZ9\8wVm* yb ):D^h4>5&''.XfM7hҤe˖.]xch6m۲+TvwȈݸiSwBI(rssն !IB!$8uޝT T]IEݪW"66ݽv!DĮo0rKF֬['I7Ǐ;/Ȯ`RjOdMʙdfeݭZMMRq`P  !Cgu/]+o7:qǎ 8)Q-) {{ Kg'ܼYlllj5scOU >;[.BnBBJoEշ:.d;1vBBz,[~`ZkZRIC}J%g)S.Ԯ1^Ya@H Ur\Y//7G2Ky\&NR?U{iiV֖V*ٮ$Ieg8QxtMҤށjTe\8srt*SBS 0007Qj")IӼ4PTQqʒu:XXS ȾwN57YHզAzW]+{;PyffOשcgDŽj:u/?zޠP5ɾI*c_?(drرc E'DQ ScR[PjXIef֩s?KJ ?,kx37233m23Fe233l9\ $ܱj++mڸ` 뗔2n\ 57vݻwWԫqÆ֯L؛7/XvK-[_!rڴi?mʔw5nذm6;##{L# >F+UZ4ӧNy?EwETuAqǎ]J?ʻr͕ @.~ؿ?3 ;CBBp̙N-\s팊=&zJ3{2 `ƍΞݼucuKc\xq_O=&b5Gpجs?hܹaf !t:fYXXmVWu ?|Ya S TF?N֬Y7uW N0mxS""".бӾhJ;];w6eƌ5k,RO9M1mƌ1o=noXgkBL2^L*077Ohܹ9w<"wEpeo)_:`}{yѻ֮<|dA_9jaa>xۉ5|Xͮ{~`?쳃 TV,ƾ꫒$=Zuww;˖,ٵkgVf F%h׶MΝ;uܨQc* !233`?~[,K_Bԯ_[1꟪:Xl{]!C~!CHm֍7 !~|y۽ !D3=<=^^^򂷷F)D9Kd0ʿXj._8cƌW[f2M6sbϣ  _z5fӌt…֮{| GD]ju>G{[6[3xȂy!ozzeKGP٪Νtbqђ_:8aN:uٿys.P%hU $I9jiS||| TTBnÇ ;wЭ"zߞ\7:}F+?OtIDAT}yp G(:lJ%oB7zߞ۷7ozeФIqcG SIHեERc$IkG1iı-[6++w+|||ݺuuA7l(xoʕ$>>//_Ɏlذa_Æ [srlmmjubbR8wFh4Ν-0?cڴ7n\:iDI_J8m2ΫNOOwuujּn,g#!^hlGQ5'nxh?;Cy"))׷5(BPb>)wr ޳=$ȑ#G bcm=xРA2ڽ#>z%W;|`'GGӒ+҉4bؐ'O}ˉ'(1߻dт~YU}^c0>-P2ӽ L矷y}8oބ5k6å^z)8((_ڵۣGz、 Ÿ1c|zjߩ]vƌILLS΂ {LcjjBTഢ<Z&[@ѣjuNN *R 0֭fZqwOO ҥС܎;ΜڼE fT !IFӕ7npq:~$w$I `x?/oEzFQ# C=1="5k-nnnwYwq ƸpnͬJiE9J Tϫ׵nӦu6Ƨ  ]G(9JAt `1}-[4߶cǰ!۶G|E֓SVVVw܉elMLJ𐟖w^)M?gZ˯zЙ3>Ya$IB:vdƍ9[$Ce77׉N:Q#?3tu-Z ͎FVK؞. E-T%gg$EX'))ɸRc\Xhox o !daa#:IOO/R>&%>o Gubl|Bl|±'֫΄(U?ZcǏ_䧾^ׯ]۪E󧼽ZvvXf͚ jn]vBtE ~ϭ]Fߞ9ӵsuܪ'`?\|s~~Ɩ~aoqBO->x0+WX\!~uo)U+ϝ;="w'%%h҄qC.ve箨/^dj`k_Yx=,fAAkm/՗_YF:v5bDgY`e'P^?nߺJЫ'3@`Zm[@0 UjT TN9#J5VKʈc@S$$T*USZ1 Kӡ}StTTHfVxRiT.U?{ ѣ{pݻaa-_njݺuB^$Iy3dܸ/4k6nػwԫcm4nذo\z%Kڶn>_^n4 +W|MӦL)iɥjV{wꫯBlժ؛7ڳɓBgyᅲ;| y&$$Μ9qꔛ +?}mΞ?jֳf͒׬^}…M[;~<99Ynܴq㹳g7ozر|n%% 0T}ݟ{ǎr̙nnn3gΔ{!/GѫW/!ľ[TTvvvySƕתUKV6_=k,ooo{iӧˍaak׶wp$w[կ_c j*Թae(fDt5{ph!D@nΝh4ͼ9so;##{%dڪę(E=fϞ/#cܹrcgLvƍW'M(4 TR={z=C=8xBcxyyt+;j*_j[j%̛7o͚44`@-#F<k׮8`ڵ7fMr{IBq z~ zdOV˫6x %%HcOE*ǫwRȓC4eıjT R5@@H U UjT <ѩZU*)@H U UjT R5@HHcLE*R5@HH UjH7W*)@H U UjT R5@HH©Z@%S5R5@Cfn5PT T R5@PT@ʦjjT ';Us"PTM R5@H9]l@H U UjT R5@HH©Z @%S5R5@H UjT T R5@@W$T.UST R5@tE UjT T R5@@H U UjT R5@T-I\ UjT T R5@PTʦjjT R5R5@H UjT T R5@@Hx2S$QrjT R5+MH UjjT R5R5@H UU6UKd@HxS@%S5%H UjjT R5JjnT6U UjT R5@HH Ujjqj"LH UjJ*)@H Ud0P'_7CIYY jKK˸?nP'ǭ---@Y}bBߺlmJ&dWO{ZLjLLIJj^~~Jeűj9U !,--YO+++PvLH UjjT Tm(I].__]?T jtfOo`mc]]?c[7uZ9)oAR\RjƠ zhԴi^n^Wm3O? affFA^R5HqaӦfJNW?y~K?;:+ R Oo0dffX[geݫ֐̴5/,!UdzA2HOoy\ 3 R (B-H%UC2<y 7ݾX![4ۻt }zI}="O(.\Iq͛7/Y6aF ~ŋΝ;)_߂+/}wׯPP rE?iӦwwDD0Uٯo/!_ۧwDqgϝ[nÌS C-Ȏ}E ![ !ܾy˗/&M;^-0xwEE?SǍB;"&;;w792rב_gggl⨑U*#!Iּ Ƨ-Z#/ !9aæٳCj?aH*]Oz}I.6|6mb/Λ;{M/]Q׹s֮Y&7r_.ϝf .۶/+y!U< =ݻwOyW^BXٸc\]]{)I%[T52(ۍǎ1bX͚n6C >:rWWWkko +y) Ő%/]\jOӝ[ ] 䘑^FBoؼy͛7 !Jq򲥥VCJjBI$IR(#b @0'֭S:u;wn:-ޮrVhiS~*]u\pCXpɛo|݉ك7І..5o'z{{|e挩5kļjSP]#r?W5(W\3@zcGٳ糳sLnSMUk/!ӶmZ]!)IMrc\&.>A͏[h)3@LCB5zԈ-۾HJJpB^zټ>ygRHF hA|F}{K]\j,g#6m޺p''n]8{n]sssgJ:wP zxcKi)^@~.6.Sn Oh_o_ s RcEIp RKq RUp"S(BafRWRSSS 3 j2d#Zu]wRj\pZT*)H RPxAjܸIMBBn$OfJo//kk RL{5)iǴuuuqwiog(u) VBao`aa䔗W]?FV+(H9 B([ZVT RY#T PAJBQ RPT R5j^/$T"UK$@eR*LՒ$qT6\ T&U3lfPTͱjZ *9[lΑ̨PT @Ru ; TRbث{?/❟ ݻwe}ϻw,\~oFtungm$hidT`:>+/=9#]va2Cp<  ,ZY`MM  (I?QAY6YF9 ZE2iR0Aɒe9 Ndɓ'AޗCPYU)ҁlΝ{6~S`]W_bة''MT_ߐiTE10vR;^֑9k5kZY-1YytjK"4S$Щ]֡u1Ut9A [ZZ/YRUUΞ=S ;Ѝv3B~QsՁ#B0F\lœnO'bh~u]B.Ѱ" As'O>h[ÍLkk' n,(e2Y[F9NJF Ο;7cڴqVZVxyWd02y%I3gȌ#1f7mÈZE,&qhinEqلljl$iΜ92x;:EY$(c4:@ScӼy.\82VWW@2hE,gʕ;+V2DtdYHޗ{8[oY={ Ƞ,АujO<1w޼Dΰ/\Q aU,k avD0j D{̈́&gBD[텘f5,sٍoWlP/2WumP?Ҋ#!1xAsytAIdDIy(?^Ƌxlᢅ$(,˺ޑH$M$MK.|iK-ommI}JPAAEkk'`$$ 5IRAQ={ ocǎ{Sv_t٤ꖎwY4wi-)H0ye4/A09qX:y3bfًD@1!bz X #; ܌JC`v_fbYp&f<b9ya훏ӳXR, C\i'QŘ%1yٖ0 ^( $ɒ$!@"_b}N>qU"(IQEI4KI<_re˖&#EI,?4A$hx+:~h"{^~3YŰ:I+VdYvŊe kdD" ]KsIQLڒ3&Z'<N:u'OUVVKޞ>s欙/^ ,bϛ]ѣ==]]*ߙ,8>жsm{Bs_đh;{4N.fGsNZ6u=?[oq ? .^s?7Җ:<}hjGiu :Bo ؆6i:;XEI׬ pD dZ5W!|v%.DQz{z:;H}^~%Ļ\+VL+Wyd|L`̾Q!2ӧ_~eAOdדN6ɓ 7~(:x`%%%ojjܿoSjjMq;wI á\.v0Qzv8 $sC鐭wuKGfϞ}wz=oupB}ZYYl0 SRgY6{<%\.Vx,H$Rh x}>1 B***Ӯq{`[8:r8D" ø=nI U7b*QBwq<;;:=%` |]]}eEkԲhNTp8٩ܗ*I--M`h7 cUԁgl~رs޽ ϟ\ScJFSc<0gYw`g$XEa|HڇjCTfҏƈVr˹?E7%[JaQaNN'sX+T˛N+&VUUݞ@`  @<^O]]]EeEa넳H\@  z<)%%%, ˰n; B}=)uS*+|%>6kw.$J٦Ɓ`DqFCCeY98_QYO'>pܤyJʁ$cQNl{ulw+q9"R4鎗$) AeaxvY5}C "LE"$1,fY63"ov'AdeX]n˲8biv Dz gqn{e ah]:1 G.̺\Zަglnr\%|.Frhf \ 2|~A \ #,| ) 8,gI2W1b͗vfSS$d%؝!X8ԌC6"Bip>h,|yA{,Ѷ7`U~lۍE(ykAZbFμMiD :M.I,XH,3LV#jg"5yrgp-Hߡ!hsU=tXo =֩2!sGl1A%\hbDL׎AE,xc w,kGg3A,t~ 8^/]$r 669MP̭F+C3uwJ4 23YBO)2ʑ?tvvB ?(E0?sBESɲb~rFVQ>GN{S D愍II64,͵2BB\LgTW{PКF<<(Jѱ!RT@,m9$I=Nz0{.1 qH)|Dq|/&Jfk<&_bzhkCv1"m'Ռ|ĜX$NlYf;$QEFxhs`{OcAa"=Vgb |{wE[g.<,|ZtfB^W):"+c%Rڻи5Wz:EpĜERXb_C2!m LHo!8cgNmo30Ӂ^rbMxFl[a[en#VP/Koaf!&V QyYXgu,ޡQB ~vYù+vF% cMzDN` H' e,B8t~ hbL/Y|-4|F*cAXe :^CF~y9;8]pwS kSOSO=ѝ]?]O>,%Mnw408{}b4/K>$f L-o~ %gXbTB7Gc[(,7ZVĖo'Z-za8 \h 4O^S{75^y'7I|ɯ_I 'xg ?lxކ 6~e-ʾu֛n 32Ս8NSO#? (Ӧ]vG~!ea6)ܯ6|?]"+**oѩEg8QTwƟ] .\ĉ xwww]8q 5^;nRE::{8K.{D{;gU(פ-=:{.7XQQNzn)S٘xv^US,zBy92nbҼ/ {e ^y믿ave)SȲ|̙;C{pe]wu2O?_H$eY޾}ӧXꪫLMDMLl+P^łTܤVwJbzM6ٻghphҤI7pCMMuq݁dY^`딛'xR1@QK^zC^x۷/w{9O͝i&qPew}x<66<? Bݻv=z4͟7_  xG|Ahljܶu[oooII5h~uݳGEoܸ1l$̙3oFay/~^O)>/|>kf T^xqΝϿx>o=~={Ȓx⍛6Y,X3H#W+Jɨ+擨Qȥ}R+ʛf͚޾dɒ+t箝}}}w|x7ݳvZ;D={> oia~ڹwށ"om>*8̣766z>oo߮756}ӟ7xc=k׮5Uad4Jht߾}'MNy~?|mo[~7vn-o{׭OF|wKK---v޲e{￷~%q/^}>߾}?}Oݻ[Z[ov׻s߷nx@ϋ/u~Νץy HxiWPOZQ=c'Ҳp“'O@GGǪի:;;䉓 .S'O[_Z/]n'[N@8y~r$>FJ'֯_KKK7P6nTVV+jÆ ~oذĉGO#ܝ<'x'}޾oU9iӦ2۽nݺ3gΤoGټiSyyYnݙg2Qmܨ>Dx֭_>l 9_reWWģǎnڴqoؘÇoasyE^~ӧ40 G"eee{1L_[c񘞛 G"dNgM~߿qӦcǏκgLq믿p \СC$ӧ/Yb,=t>lܰ͛³icǎbZ\v92ddl5ɓPLJ{/F f2:aD~QSRiIIIwOwccƍ ;qTTVD"eٱ鎷Dŭ!4UT1GJ|>!qTW!@iW_kqc|;ʥW^e[e ,9&Keeez>3 jk o1ɳa7d/ϛ* W`_hƞ(,Xeڴi [ZZ.\˶oÑs]p;߉D"Hd;[8on𾾾"Զm"p$޶m… Oɓ/B0|뭷L3K!bIt?O}}}$>gٲeӟ$Qk]'S1J|ɒ-[X,3zt$kO7B,o\%Yصk={֮^{WdvzÑp8z-^q" ryzaپ}vGPX~xO߽x{p8ŋ#:>yM-F#:``Ef%Zꭷޚ6mE C*Bo~k%GW̘1SfK9wX>߶CL"/4+kԔy8"EkDu}OC!_SC9ԊKzr(_!Av =?=O%Cu wI|Gxa+Y߶hSسc$0./ϮmMbC-h_fx,onʋ7/I唻fB(%u狓{gޗ8Z1(B_w7gv4G4Ȧswb$ EpA?.Yqxhb8y0M(H hYh ;)vIo1)seG!7f$twEJEQG#bP(N-b@l,~0.ɱ,ɯ> ˜+-$giOU0Mrih_,8>P[#ߢsy hHRd3hG9l΍Ţ֔|VӯGX Y-є_)^oLaQD >G4h$I ,Dzl~KlcFtz޵)hkG5JqQgbbh$IP^^v'Z^`0HaY^4zGS(<0zYY9^Jqv3 w1 a,ɢ('X,:!̤I: eed4m \|^Y zDZa! *TCѡIx\Fy慌r"*,;$j5?Xx娫yIqLp`KTš "Ȳzx<>aCFvG>`~@:`5:FO}ES f b̖qiS2Aq1?6fE((|hTƞ? /YzS*Neh<#{iٛJ KJi:ϗ% kLnݺ CIy睓N zxǟUUUH?ᗿe ?~nz)eVXi`0 KiXpE9? uaq;\(#{= JAWkjO~СVPk׮|3_ߵk5^>q֬Y͕UUgϝcYK.mjn=k6Z;ݻ>*[$0$Z3u_:{5#@{+a~V*uA.,T(j1k=p@<K'6l~ N<;w֬Y--xܹsqJ\`mԢR٨_,˜}nfz>CqLAb|%+^{tD"veee8֝;}ΎNA;W_]ӧ[PVVKp,Ҵ}.X D/cz.հ2SXA'-?uTE )~ՕW=w6 C~=00u,[YYy)S\ɓ'[SQQQD}Gᐐ-Z]_/Y ,!c@%'x˪Z?8v---+;qI9.ALEEE5Al-/<|YYuhP****1hsK]xq(\xmni ]`jc˯bhheyhh+X;}@gҡj ʒ (Xlʕ(DAhVRQQQQu%DQ****dY6ܟ 7ai^RQQQQ9["bkRQQQQQNG x qAGjRj#JRQQQQr8ڂ !E }KHf=, ҉(' Ih/0!"BA8FztCJ @ŸDmH} *#PMCT  }&I&ˢH= ߈($&(~N)qHT $@;PM@c0E@QjBwpV~mA@4E6ο(S HcwpRp[*&M@Q ZBjA%E2!Hd kAP Qi;3 )ǵ/@meID)&Π ʐz3ҮQͻFA8>mlb'  aR԰0zҦAd:`k "LAY$ʿz*FULKX7́LdXe;EuQ*_c"2dI)d0Y @x \3"Rx<$c1aSd @C@5QH2 ,#Hd$eP  ʚ Tc`j;c*#a 2LI(d} FAYD`d"KH$$D&'e ( L.*a!5G3u"Jg7B! 0,aY9 C! K0 ADY$7EbA 2e"=oS g7 A.- d9rbIE5(K̡$$[ m*DbrdC FgdOWaKa$yð0RjHeee"K02ˢ@B{A 2/>F!H=!isQbX\ dz,O80 uRMeEQ`X2i $A cS[pb*C d¤a b9x°˸\ cXڂT$EFDBLDYB$@$q6A fa%Ԕ `f"P!HR*.egXu{9݄sgyP(D0dYH(gԥ d 2 1>vR 9Q.}cPHutIOF9r ò0,rn2nr.eiRSdA1!MYr2"Kd  Ut.i>fޘn3J( L0J 0,rn7r^_R|.eIlDX2"`"B$rBH:EU%2/&mqsE\L5ʤ0 2ϸ\,f>?nx7E(xAEA~HiedI$F@aH'/&Z%ycYt@͔/ETQHϝͰ0,3,G8>e|OmX\_,I-_O>D@r]Xire$ݒ\H.n,=v'X~G#XV-l~|[}[챛Uj'oeY A`2HeFSߔ++ɦAZY g7|3?2E 2; #Gxsy8_; jf?9Wz 7QGdm7 1Lz,Lf%"+SX 0|U ̐0}tf+c^-'/ǶeIJrŰa^ſȝEQ#Q"p ^TȇfTもIE"*nQe ˲<<ûX;֓h8 SЈz 85qIųڋ$8LaMs2:*o=MZ;)oS"2*rYAe)z^kn$(KB)(Iqso01,,K! eRBZ:C'KG[eh@id 94! CXaX; # BǕd! VH+}ZfpАK6R{.zc5fj֢&RY !]B"^v1 9|$62,v$I^v1h>YD<yGcp.gLp|jfAt%$_ , ꕕ2v4' oܼzq)}}@sK-6IڈRQ#$+Hw>F>ӡO:@x<3#*3`j3=w?U ԆճIimmH&I[)i{x.N1%4) ļҍ(.J$$G5nv <Գt6)h&xO&')}I@g`&W3cCg_jbY3gO$=/-x.sY;͝IiY;s̔ɓnW1e`<_h$WT|ǎTޗ$1A5daGAl)@eU3 }_sw}>H|vC3'yAE9S5L0l22 ƬML LLOІ&V@ֶ)uh4'Ҋc(74hc(b[[۴f3fhkKEbbY tR9 BthH IDAT!0w}g /&YR@O*˯b݆M/5k׼6ol3z3w~zúͭ7S\Z<DXt5f=P@^t'I  Q @4SsQCUg@  aED"/:4ıC`(d_(Vz,'yMM7<!駞|Njc_44Hĕ`{[k" VWWtw&ׁ(I==UUJ$ߖ-o}#'%/N$IJO+/kݧ$iɽ}$;Q{[PyYT{Z&~s8k3_[_xۿ/Y$KJJxGgWgƍ_]]]k^OyӦ馝;w*\zO}vӆ7};wPڽǏ+5gwW=_5kV\y%(^|"\tW @G{wݵvﺫC?,Onk첌\U!j-BZ:hpEAa@D)0q|,=ࠐHģ|DžD"]@ r d$B"mo7x|ה@%` ˲o\P4u,`0I5꿷o__bƌ$AY0'^Fu Ƙ}cSQu9}WأK/@48tӧ%Y,bpe%qD$1PJ~zU;v򪫾U12y۪*O+=ԓ7~#{7>/胳. 셋Fڲф#>#WX˗_أXYv BTgjg մjhp д BBD<8.ƾo#o=pccpBHD". $ kD"$1;nᇿg?g?t$(%qCwsCT ȲNRg?zMǏظqceeyoow:I$ @#m @S2*?Y8~5W?p}'ׯ[7߸?qq9suókn7nɪmB^In3gJWk֮mmmM# _B<:x5פq=_% |?/&b@   5CH(뮻XwEөMoL7նڄKRget\'cHJuã&OAAH$ />盚Z^/PH$$QH$Bݝ"b"HG}oŊΞ>1o<.m$zdcvm[-Dpe Mαu ߲:4r͛wpBРР2@DQQN$,$ʈرkbϝ>wShTFTUAU\ǦʱB1g@)4ҟ *LM?򴦛٩ 0/à |j:Pd1:ۚK&O~}=D\䮮.y5p8vuu(|,_D9%N˻tVgVg.=^ogg2Io_{/ŋ^ův /d{gJ;VQQdzwUկ1KEuݷ.|I:+w/%KN:ZSZj[t+k_wokY{׿~豛nɓ<X,˞[쁇bY}KЍJC__+sw}*?wݷz˖?˿|p9g6UhUEշ9 =m;ڀ =- YrxWslsD"F>yCޒ*RJ%.{J;vեC.V]߾=SZZj4Jfx,~tr$E"KϿ"ϻ! H ^١}ŞN@8{bOw {{ǰ>FYq XZ /(e !@ 'E/~KJx(z%)!I[3u%'5k3LMF!ߐrͪ'^,3J3ŗ߷# \&daXŹ\.ZTZZ@feees>t/\ ;|T$Zư_ CM_:kE ,JJGK(%j,}fNNA:Uɲ{ZR|֜-;'◟~Kϳ 5aY& :4/HۣY ɗe3=KYow2:f,KPPFhz:4X<SeYDtk4_g2`fbn-VO/܄N^t- hC_tى'iS'֊ضI.ʲMeӧNӦO4ifɢHl,/`]!˲uS3o{g'OVvjSԱ 8WL9NPQ*{Bߦq{ϝr-++{}WuOS3˕IK&6i`JmP- =S+xt'TSY,L"4ԪPh`M hrf̘[Z[:ۏ?yYYҥKU+aqϘ1qQ$@Kʖ\~ԆjাPS;:DOwwv@,-+[pa}}CUU%qGx3Ma6ڂT94e{wqor۟fu̚4Őx[|p%]:{vwby)B_@mɢKQ_ aCݼ87ߴbʓi5aG ČeBP-nBc#QegB_ZcPg܋9qc]u݊J].WUUUց>A=)a..2vD+Bn[k;BrU.Ƚ<8[dFPQQUMY&jhh B0qBjw(~BPXh'"AMGhJKf MqfHkG6Z;IڂTTlhvrf#)DG*)4Xbs33koתDDU6*p6p(C35KCK2<bDc:ZކaR#`ai狭PT@h`f5Y-lIR}팝Y=C mH3?ӕOu1U$,$mG-_x4sϊY84%QO&aE 8C u M_0EAt"֥.: 2OhLiؐd체GtpiDgR&?ggȄxt('֎ 4zjVgr&%F&=*Q$Ayrd%MЬCӑ ut}>ڂTBcq3!$z7'j\ɀºS5U"cf䟪 S սC{HH>/ZhQ!l. rDEGVV ӣU+I,3U;SLMDt\y0L4a-IRb)r :DLK~ 2e[6451~ǔQH!5z}|YӿdVoB'󶛆b-cjՑX#/(S[*U)84Rԃ%S ռe*cpdBCd0Ei FH ,W:ۍf'̀vhȏ#@Dj8/9TG3w5SPp u,48U-hC3"CьyrĈff r`gE>NOkQ+jl⽑TT9@; Y AӃ԰4&?uk sێMhї,Ak HHg4,!HR '!0T# -Y:jAGA'T5#" QEc{\D l,is,5 !:8뤔%Z.QhBSFGNp ]ZؑNv!9jlC}G8pb>}h)t UUp ׏)@*Z-AP DuP}! 0tАa^474lQFa\ʻIVj6pCyk[I3-vf`~ʺѱjC+@;p͛7x/^߿Jz1v*)r~GEh*b^RU_kh$n~`^OnOp@=@ ,6ۈ Ŋ&&&,6[(*ٳcZXXGGG56x׮]F:t+B!賫w5r˖ ^J;v>|8 WKKK??b 7PV˶L0o>~xRSGD 4s+(,LzSt'/Ƙ><+$w׷|3pߗ. e=ɫW8p```{RGw#Fbsrz葛0JMI: \vD,oQ?lذ={VFի440p=HCנ|nhJV!cV&j%PO-H*hߍKKJlb=z8ݻ0e"ƶD-ؾ}{FFB·WZK?S(СC?^jծ]Hܱc}l=O|ŷ Fxο޼}e-[&''o>~iӦ˗/W Fڵ+--;vlٺΝ;߳gC&*)VQ ůQ5bK*@jMFҢ"K++R"ϛ;/++ !9ﷹpR".*."I|&HR:s%K{K8q"44Ą7yW!ĉaavvΜ9`og3(ABo߶C.h„ wU(&gkc3k,2*0Ν;ө;6`@ӧٙxWhq3aVVVVVӦOCHa ܹǏ07n6l͛7Ə=ҹ3ܹsaVVӦ;{r ];sаP++KkkJѥ_أ0<+\AU|(u9 T1d5Qw3JH$bba9*--̔E())166FQeD"ŴiӦMVPPo%WBegg?A֬S~'(dx999U,2H`BB[^zU\\b0o/^s?444s͛7'%%"u붂B{~3FH |ttqrssB::8(>[fMyyϏ1bPXŋ~!L'88:[(w:ӧptt|?kzmLAOyF .466.--2$bŠ!h";w-[~aPddpBϸtȐ!cq.]N:1B66+VVTBVVVnnnL<t$.UV<#G\]]VHaeeUmjۅeff"223Pr--ezA*{1@-[X bgdd0̊O(uNNN!W7?֬ŕy1460FtyO<Ņ{pzTT͛ŋc4dU",Z>_Ĭ**.ް!NbffZw ׍' `U#E-JyBJI cBЀ\RV?9 \|E۷u(:>}lX!7'77'7&&Fe?tgλwFuiݝ;w;{.&';;';;&f]޽ӡ}Ya}NnnNnտT-jTZǷ;re̦ ahd%b:UW(--566.+- p&*ԄC ޱϗ/_o~Μ9txPPX`!wrr73:t(A/0>ߖ ÅBѣinĈ%%%/^Pf96vcTd'|2|Wb^S?u.ٳgoذ!ra'U B^;J$RP//: ""gee9;;#}1cFĬ7n>| ;wF{{qΝ}*ٴiO?MB3ZmoFѣG_q?2jOϧ*=<2^K~^D"?+S!Reֵ,D7#|b "$` d2,` _cن&S3O L-V'sr$9y~~/|[[[ b1,R*%IiESɽ}z6-,>iAd*&R׵!iҩMQʇO'ɴ1Q~(_X'.*KJ)P"bJ0)P$"10E Bf[;5hݑQ"gϟ$Ћʖ:!d``pά>qÿ1j gbcc{rɦ;!H(JO&]Z&|Ἅ-gҀ Xi,71OhM剽'TM guTe^SbBEO~&+1PbZ[>xWS$Iy'L"/^ttpfbĕiH (_[.s&ڥjݞ5*LRL  3f-[:;;s"0---eBqQ31T-I "8UP t[ZOyrq>l]ocR[K0f,6gb7_JI36O\]Z[Y,KOy!jgVy簶‡h(D)\kB0:P7xXʅRRbFFFFKI|||MYރځJ):#7XiI, O6 M#QuTA/$#PAh ]l+h GsP(l9M^7FaݞVnQ؈Q7 rhR4̗ ֺGhd* q1F`a%t& pE3!SHd&e}q  ~jh$^4im8ԁ|4)1ݣ%JyNeO)ՆqAAy+XiZ`*ԆCY6/xN<(%q1aSu(B >}4%%յ]vp\ujӳt $Ý xlOT*.xZ)Ty۷)))777]z ʺ PW PlD)@3@3;;ACٳgpmGT~|n:h7g={洯Od| >|hjf/sÇJ˾ b^ii飇׭ïkyyGW!$|x֍W(J*UXlZ` Xe%T-UNcV;\zŋB++,Vnnuhᱛ6whYh;;ww4BYڵsǎ-\.BV۷vvv;E=~JJ @Bykپ=Lh=@O\\`P޾ѸBeee&&<##_.AQ #|>ϏZ@+v}L=B{]Cw"\ ++++++r!CA4v<{ΝbA0A` `;O?դAwraի.)JC~ͷ!þ)|ߗ.moW]!aa.._={S{ wQ\\@ 6E <`GHX<&L$gϝx̏Zys )ۥڨzD1N=ҹKSg"zt0n0tD/YbSf͚bnF>]H6F,m\HTaQTVzc 6md jszJ*J%j4ծI0TXL'48l022*))(,OQАdr9-L azD"QėvQ@U4@L$J++a0nuɪ~lV V[DȠ6114 @V l^RD, )BՂ"a9DX"*f!BmV{OPNqwȡ]z 4M{?{MJ_j b% ;X4WiD%~j&U>vZMj0J`NH ts!t9@ݽCXWO+d_0sCO>--7߿pr׮]۵{{z9|:0,,lW_|+;;wpD*]f@co铫fGU:`@Up|۶mڴis… ȑ绸6w,~dd?<߹K3]Jؿ…NNNff̙s1}6|fR T`@S'U?Uv!A_}wȗ#|r*+kkzP(OoŊϟ?/*,D1L:<33s`!1EQ Cs|q'VVc5eCP XŇQaN%ׯ]r3g!L&377>5%CSO>5$d]L +))e|iTSuP50:x;6$00!)I :ꫯҊ DGkΧfffFu5jo%''K$Ą5bQp]u/*Ci90qbǎGٻwo,Yd^}6vN>>c;$8c3g4h@Sʭ2ǰ̱x!>cFGT_>f؊1fXOMBpS JT*@1NBUd eGЧjJvМ˫ 6lRh曎@I`y@@ehR:T&ЇTBx@cv*e"_=C*А.bs\.50T*Gn&+k@KL KC# *ٔU(𾪅R =m6e@K"S3X͂3.ԠFBel68ְY,[KYbW=m/FFĨj5,/c2Y$61ɢ& rȚ?: êl@C08hL"%ԸT0H ZPu%t_h[ F ֈ(S:Xc bԩ #JQ5^jV*ŵkW VN` A$1-_I_Plb3\%UX\!sj<kH( f"[޶z$IQ_:q>ȑ"$ m= $K:,DGH0BI] fNLнB振?e1D_JvAdʺ2;L9DZ 3IQJ<\XX,(ڛ,Je%~Z.а*HQr+փP}cBӷ'N*՚u댍3̈́?Y[݌@GtcH Z3Qbjވz(DMh:Vߊw)ƾUsksF!Bǖ/YR*^`,WX,_8G`/},Dsb4c,WX&E#['J9Ѐ**Jw#IaȌWzXi盶l9w͛U51Ias/H +l]IwB4qO{˜%_JR kW8-v%0+bd&(B$[EIb_[,*bÞWXPFğ[1K!l aQܠҗƺJ`i֯T&S~_L4Iwb0 )\ (Od9e8܊y[ meؕ($)d%$=Lf)ie*ǿCqHDѿ*(e"#}k0*^Z0"a\PV*рq@APeUN PZxܹɓO^P( 'R-U| ('ފǴSIPB"ʊKЯy"0Bu!q9P+քS9"[VEFQuZ<\* рSAUƩ ?0;mpX9Ab|\/k& m HIB%H}ӂ{%SBȒi5f\blK D`a,-fdA[rWfpϳivFA`Gc"R[m_JTrt AoJ]ji@#ܴ|A>޽G `l\!u8YHV~%ۡ9Z8tvpLK]B7ć^ i/@23#kC"Zo,'<nd'fV8 D m Y$ե hF ; x0t}@qh尓 !Z$+ TDmʶ=+Sv-Ct-C|da\PYx#Yb]5MOKjQ:l2fIbL Mu8XXlX]qM60"%Y GsX|Dd4I _J괮Vcu6<.cr O(Dhkj].%{k@/+<IRhie +^du^a N! oZYԚ`WfHT"TQ鈄*S1ТFMGHWRNaVOUߝ cD4T$ 6 IjAp%`u%| i @#AzO66">_sZ7{n]ԩ 7YĨbQ -$,C~PAp=۴ۻ#GҥtwWE vwĂܜٳfuڮmQ#F\tIsr믢&P7%#7n8}T^|9_B޿}ǎ{w4Do u矸~_|accC=kc4pРсon߾WII%$$lڸ0'p=?M_;z4ĉ7_o޴I~ڵ]w߹wGϞϧϻwܵ… t5 z9:%Q.|M۶WJIIQ.\%/^h=QO>T~oۦ.NNNCͣ{~7n}R!t!cFDEDD;FbXw,67"y,<22?{Fؿ…NNNff̙sRiuI[fffk֭J$cF35̬h2}W:D*GBCBz3~YS'imm2ܮ}ӧOco߾ݻOPvv3U 6n}!C{YnU]\dBV􎡡PXR`ff۴jպeK?__~Vr4GS$ꊭA jaTϜ;gem=3<\s6x@u IDATj ԔQ~n^O.^8-4qg`͗D\mݺu=> ZrW\9n ϗ6gh}^jUСtȠ-|>Ń gz>eՆK@ X=xͅ9jԼ~KNNH$ ӧ%6IT"99Ye>&N{H$9\%gϜh KTn>y|sӲMHa_iUVK.]jմ0)b?>*2ҧsg|X|XPB+;$8833y+W%5(0P"8p)K5z Bݚ5F޴MiҤHyLW_G0}:׎5jf7Q\=H;c4QET&Q!|šܳ\ L dTȤUyy nAm)">vFƆRA *D@9l&E$3(j8.d21A Za2L¸Y]A|A+>"ܜ:+]OQExnNS`Xlސ׺ Pzߦ}>h +*| dy4xn`Mx_W,>@/_(*fny5sfYY̭~]Zh8$!!Aզ{usyDDo^2<=[4ql_D1wnv^^7mWW-}ߘuk۷mө׹sgcׯӷ;w7_˖-vٷw撸9;i4q

FDS&Oݿuߗbb޼y}'/_$ڐ-ȾyϳgO oݚ(2>>-,$4/:C%8?vc> V >^tsv};|={vp={-vvv133qIYK~4DF_wBN=۵ɬ_f_|;rNhoo0j,hYx<ϜI'$2Y,@.7qيKR㥁B@ǩ w4ߗ!\trPFzz޽BcGZ[[;BPJ︺|-,,D1L:k(:sssÑѭ۶[vDFы+IY 4Rу  Lji޽<1ݧ)Bq]NN瓚A) 6=6>|=vwt1c̞UD"yeHppD-|>?jaР222~e,Tf|/-`HXܴUA w SSVx⧉?jݷߞ9sݧzLssrfϚ׵kmGqrܖ-۴joi/^ϐ:w4et0&c{lW 2FHJJ?n3g=x˜9ǎ5ƻ~su֭ٳfYZZ=vG#;]{nzϞ>?t͛Ϯ @_|A]ך'ݰ~Geccr:v\a}H,G/^xlZDpm~}y!$Zyxdgg#^~ݯO7oBB|? :5??_rcG[yx nݼ3:]ω˗/7S١YYYq8-rbX&OO*])S?{8? c;^Ɲ۷K6ƾJJ:w8..!!aƍt߾yḸWЁ=zsB ŋt={D=뗯^]r,w=xDЬ|{<~X 5z-[辗11cAvsU *ecƵWe7o-޽{dN|ً/* YN*5ʻcǟg̠Tellld?[E߾-_~TgX~fpI@:::"ܘlgggzU @>yQTTYYǏW^ݧW'K[bϋ BLd6nݰa}LyhGV6 ;vŲeA̘9S>jaT¨wmݲefx߻w+'633Ty TǴکSNϝ^P7JKKkѢB(5%֖ OM \vվ];SSSOO]ݼE . >}jHȺWRR-;mn_r_qB4+S׮]E"Bȯ[7,--C|}U=urn*ꄆ~yӦ斗ߔAG/Z|ŋ $ _-ŋe{y&ZuۼiSʵysrrHOۻBcLQQD{K=}ZXXb2ٚ#8>ݱںmk|Ad@Br@Z!nn|>_ffPWy]]]e@E @4ej \]]ԭ[7Gǝv99) 6=RvRSS=Bo߾):uʫPWySSSd ?;# (y GN>>Ggsf~*I"|2$8PVVfb322ٵ8EԩIIR!$s84r&[T~͛¦U sUw0CKtq`&L Jo<9r;~`L81-5O?9k}tU"'OiS'O/M81#=u1*drڴы4xPHXXy9;1LKKKΝ8تuk:qT^2uKD2xHd0NF\d`8.W")[H'''ggI+sbb "$` d2,` _cن&S3O L-V&gd xk=EW{#OJkJ֦GDH<ͬ/WЁW\fA0N9:wќ9ɲup(?WX/,Jʋ%eX( XHI%PR EJ(RISRLS"iw"macܣo7+qI UZZ;`!cckWXlWVW.n߻ - Aƿ[Gs ^Y DTpB/,0v)J""*Dr@}!"D,!ڨTqzȡGzh Ƭo:ʕŪ`mKp Z Pqd1Ld1R_Z7Zf+&?+KZdI@VAhM%7'gY~]kvԈ.]zJ߾Ӧ)O ۿoa#Lccqccc#ɓsss/ٳfYZZ=vGC'$% ^FF|`FFƃiN h-="1EQ"f[8b0wf[ *r i> p8>>>[nUpZvs]/^y&oo=ݻ'm֮]x{GEFJ&y(*66'o)/1r_)#F +d|u`Kw}{7ItX,^7zbb-ܱg<#<<;;!K,Eqzѣ'NyzM ϻwܵ… t5 FubgQQщG6jׯ_zvʕ yڵ]w߹wGϞϧ7ƾJJ:w8..!!aƍw=xJjP;~ٳ=zϿ_~={w&''[J'm2՗R i(\nT"3jwǎ?Ϙgzx8X^^6m$s#"lmmmmm7?($? L~3̙3 ,,,~Y~_|aaaq,>s.&&&3f\zUÅDFF:::8~gcFDEDD;&?o<0z1NR*VyHKٿwf͡GT/%) ?!dee0*jaTԻwn23<ݻb!8w!L︸䙙Ga)RǍ1޽kן;w"ߊ+?^TXb25w B!]U6WW;8m|lsj:C]XZZiii-Zwlmmo߱QCm۶=yƸ+B(|!!bbx<^II-5%EljDqq{^>z&Mx]H16ӳ,`it!C5jo%''K$ĄUf2~mǏOx?6QVR UoQ.OƵkWO?!a_}Ν4{wke{P0şgK$˖(*,B-[B,u"Bh˗.btE~+`6RK$O%͸*&)ѭQ=bԨݺ_u@->d^#{ގfS'/8ʶkߛYet`RbEGKS!ǎcQ::fVYvv7ssrD"BkI'7h󼜃+2g4/qSB$âئ,~K, 'W%(ԶPqf rO{rG4%Y4m=þ{'HywB\[ӓ󳳤`G!A A &A0`&d1lMr ǀmd64ᘚb`jC4"k<@:Y`F́q mYR qx&%EdGu]+,䉋 %ŒRJ,X,LJ("%)$))H)Lc1ELZ;,6ީG{nV$I U\\˜!kWXlW)[/[t;C-$@`5@mh DTQ c g64'y@S:ˁoBH 5J/{oR*HT>V-}Ax@,J%i+9bXS6녋#JYG+kG|䔖M~%X,V^X@DP`%@-!I̶u73ux|I 6녋PA@;@ c\XTwyi )6 RRY 'i@k [M(Z9EƼҢ{X35-..21i=k  "/#TU 5%0EQ4KŘ͗>g+W/7m 7*ԱU߿W֭6n|GRUQwYdwnK\,}QL&¼]vFlѢEs]J .\__~{ymr/^}ʕ=<3MZu c$nl]Jrė|vq.K|ހm1tPݕuժv%!K/Xfgw|iDtw<ȣŇXL|ɧK/~ 97tC9 ^8s~Сny a(ᚦw˯WG .~F$rٲk-'J!)wަ33 HAhoBZ]I~)cΜ1_Zs߯x1]{1yuu_o6l 8߶u[Mu@Cz3qO?s7})>7_'|7_ȫ2ڹ%oovLâRNA|}1J'ZzM7/LJp_}o~.o[{\ٳܹs'|ƍ]tÆ\;v̮=0;kwY\RTRR|J93e"?CS>Fܙ3]cDw`"1'yA>̳Uu1iSݟ?Wn B{;}>577[Gb_lhMMyyyI>ħ9%h0c9} h:/[o|{KC~QQQ8MQF\fͩNr9'V1cFE ~A.JJjƎCDjG0ѕ&nSCL|]7tzx=QEEk{K.^?СÚWu53XofϚ5sʿy퀑tҗjlllll˃G?xÂ1;VbkN!)wF1K+aQ}sV~9>dK/~Q#Gxu3gzΜ1]p>sGy3fee0Z_׼<]sՕo|_dYKoѥf+k6\&IRaASN6n)?>?.d:a@[\K/J|o~+JE -ZQND#*+^zq)l&n~[wu]wn 첥x,]x2T1sqh8HockoTUG$u8] Lb}^p9 3ĄIXIb.k KJNWf(ť7r$ebfqDR:4 $Y1ɓyfUVVfܜխ] 1),gbfCf٦|O.sT֛ ޿;]^Z:b(˙@ cy<j+..v:)9 D!N!2.IRN !ei"$F$Nl:Oo)YU lN3[H/X-@ jA@`4RgHC+^h! <{ !cĈǞO !B!XN;kME_:'(_?%>ZtT5;F_B`O5͈Ytg݂Y7FLDL"?#FѢc ^1MY1bL؈(6ibb&1Dl'P W-?wԂV1c+%$ZEW]_y߈IHPr|]X|DXAt]b+HL Qw:^11El3z$Hpt<7NDģ[ڢ "[*c(q['=z/ROqkC&[o0a$~I7uppLbw? >~JL"݇`ԠU @J `HAd d1DboŕzLB@B  A^`a.ٴ̣P  B)[ۧB GE(.Ԃ ;6 GGr9 r*܆0h8s08$)"I$aK NgJ ap/ *+* mF[x;0mӦt9ᴟ6/L V;2tY3M3 Ϫ#RKSC(0t`A5si=NaΝ=?w]YmX=ްԂp !Zڦ̘GߦEBSOomk~}#G>W_y⯏>vn "v\MIF󷷕V8]H$p8W/[dD4s˖.~vܹkx-CTr5 .^p|"2 c6nLDskJEQr /z[[1crMGJ2\W׽^(:c֬_f{|Q mamO>|o={~_4MVV={,^~?{v~Qm8|]5_wgq@0 zDaҲ3#piYI 09Oxz<_kkK_V^Vvk6ݰlYqQQqQ -۰xciin >|u|enk5WmpkMb7,[VTThI_um;k\,}B(YhM1MCGdMUe .Zފ.}>_YYTP ZUU5MO>?*v-_4 o838-++0~?S]=]s ABnւ* $.D(bq&I, ru?nܶ;/<b5pnM˗x-^Ϯ;uy_z'j 8zy(ɋ8sjYyg׭0^UϿp*R[;>۳/}1 &Yu8>l貙6v̘rU7TT֛ǎK_˚D"K,.]hŪ/zEo_x@cSӈW\vi]tŸ`{ŋ^߽,_{h^w+N隫DSHFuŖ) ZV=Ԯ\ ZXhanԹsS!LSpCpS.IBXsIA<2F~fW:usJ5o>4?V_)xwZE=e"˝Ǎ߲yzDnWIq?~Sv!xn7%En vBB7 /DS[? s/kɊ](%šP^@-p7SA/ dE (#!P \cR>S@e)f" wkA5qmw9X R 9 3 c6nLDskJEQݟ۪ں:dzt/{UZ>t0P [+jk=#GyUk}xɢKۿ?|x(Q\;Juy-6|fqQpݲ?/t)IJzhhȸe2%=O]0J^z/K/5ne˦O4N4 Ʀ#+~)c !voҿ-@})^$t[S-^o+Ω?Cuicyyyuu J]o P  Xܽ?T^k3g477Y]u0D_( !ctvunnYTϩ2p O2Y @J/Z9G#H%S!h|ISGGAfPU}hlrh窪`PkO# S=zTQ8)//I~?;vSJՂ鍏t8dI:zP}]-Z# pQ n$Li)DUU4nG#Ik@M),[)5/] .ֶƦ&˥E/dBhp$,+--A`QZ^qOZ# n`#FQaZ1=idӉPmް)'R2с%'TMܺ4D8:2thLncT8A(kA|%=n=0 v /=i][VZqg]8 `@k_͇~?W du`Χ @-|֯a\MhnM5W](U]w5o.zkU`P$j0Zp1֯_~Xm?z5zK?ٳP I~ϐU̹IUU+ lY\TDD7\x pݵV !X|a2^/&6 "bOYM/8f\ #f8D -sk^mz~v95=W[W5~@?S0&# 'ŋVzޟjg/YtI-x`0P8)0 fe7^, _`~S@ E[)xsF lJS2ߎF ~mTU=!hJq|Beh1OQE2n⤼|&a.c1Vw옧N" d !KÇjY@uÎZRU+ͬap*Xiډ  {B0 ŋ` . gA,v GDXC R)=C8Fa@ D xD~pd Ԃ},zΠM)6A RraN8uy 04MQ4H - 4MΤ)SF`)+iSھ4MY 7d;WԂ݋m3g0ոq>޹z9 \Mr伽r|Jv IDATmY?\~g$Kw}?'П~k{zMMMB/=GD_znKϥE:Rf*_o% }GKqq?o ;+AUfׂ"כ>w~WY52UU/]d߾ɇ[w~{YY_W\~DR|Aow)S(ppnݖzslClfm`*JJJ oii(&2bDEsss|뱪4MK>['`YÛG&O\5ӿ)>O8p$IۡqNh;@ά B dw Klٺ`~ƌMDjKJ2JK?*//2Xرc'lX[+\`0x%o緷ơ# /lbW\|> jOg ?~y윳걳.ko,ۡq=0P BTL2vw+~?/--˭'^yťO>ۏys:x7}CCcee^m _dQ8G2_i ۊOV>wuO<WTTtɢlJ=ooCX,ͤ׻Z[[ ]oni]]}.#5;7wt^oCha$H"c1$1I2&˒HMRlWuT:l.͙z O+76s̸u /YR{`.|#G{5Ǝ4H* YK+|~gn}-Z[j׃u-,07taйs)!)$!=$  i6rtթS0}y-Dd:eI"¢w׭USvqlބZ ( ROV,=v%d, 4v_<SG@l2&765άYȘd 9*H"D B$rlpsAqYvd˖M.C$4H S Z?)~AȞ,ӧ( "bD"m8WlT< HA!.sd }=w畕(w9hrD Bnby<6Z\T Gu6v: f@?t8Y|`$$)9)9Gb:A$S*s$?dLMZ,)V8:/@zk+M0ԂЉi,Z " Kpx$pw7ť}B(t{vC..aΫD BnUDD ft(F9V eN+ 's# ,="n- `r~GH AkcDsjA蜂c bPpD3d_-"# i(ӊ>!CD%=d( q+6!|3sn qBŵ;& >*ħ5icG !H .8i:ukf$ڰ] 9dOx@ s]n:7M9\k#2}=YE_ L|V a!!Hpa0Z؈pPӺl7Ј h>OpЈ -,t^$f4b_x""1Y'}W` .8gws%B2I""a/РC7_PH7 ԉsk{QpNFdVt!z0 'u1f}WPmI M2ti,$VruM $-!qnr]3"a=<64n蜛s [- i'b^0YQuq|e^gBV19Iq.LCHIHgrιC٘&uC HȈD -D!L:FFpߩx_K\b@ f&`ĺdlLHBp!8`e2413N붐lYYuL=bD"f$$isؚGk&ASHA`$uF{A91.$&cB81t"aNsӔd e9sMk7s&O ;I dAdE N`M`IC3ಢꑠdlc$ZrsasC' 4Mat@S*hhQ,^[ '眙Rt8T qKi$B(F)'s Xh4797DKuӎ$2 G4my`.BĎ!b`r0wNĈL!+s!IL21 6uj䋦`j2fl\twPԂ0lXu)9#"豠qg7cLKrdQP@b}֕cr0]Kê"aHlBx,vduʹ,4Pr!d%L&IXWeN=_0"^u.qth R0+AaE_,yta LM 8'I"cD iȡ/OفV'hө| #z)S /*Dtgd]S !$&c㌘ĬcG JrP.Mh;@ۊ`WD vf_9ؽ_ BF$,>*Ea*C-9"QR3!9~z E!`V]E %&I!8c`1ֱS Waǿ Y%v>TAB vBQzSAĘ ֱS)5gǬΡ-~`xHwo fm& A=X $$X, 1FB1=G%D\rmL`a]n<ȘU*2Ƙ8.r~ԝ:A"V"[ rn2Ƅs]ȹ&R0g+h(Q,E`2 _j(,01Qmu5nD"x%v{03)fRE!%hNt;HPR׳À(# ޽N?#F, ݻGeî(i=L)6c!ut?9Ixk N֭ۘu ̪GYYYoVp Ž }EtG`Kr5a+WVT[SSiΉ)JqIqii%qXF+$|\t$v_aqZ\TT^^>I|EzHAȝYHS)bq/8:{ ?|=+~?׎,%EG$Nu+9 o>ȿL4826dK=1v|#B?(<=XPy<gعcSdtY d5{[N&=|hiNg%bU~"+SNi7M~)OD(dɧfכIDi459H$Ѐlzaćva! }`b(gJ@)@ d0s$i&R;^`$jχ,7qD"jln6MND!<`GPxʔ)n44&oni6tcʔ)P8ڽ\.g 6>8YnWpHVS'wϞںZ":ud]P)(R@cN;r'x̄I 0hѵǎ5Z>oʫ!Ý?缋, ܈cv0{QQQYY)8olOe)"B=tTMONn]p:}L/ ,0`xP(q. '@@R᝕BpoSmbiA2 ]<ӑ9)8B0 ?p`,pBp˕)`OMӺJMdYdҮm܄ by,{LCeE.+P饔ZZMÔdHTVV@!GYY>>>ٽNN` rΉшʑiHZϕ$iDcGp%9l2n<ݛ7o!"4MSU #e)di%%p':>HD[nG'$pXi$6_9İ;p  GatΔ0 Emkm/ c . T ɦS|txQ*]:F4lnE 自L)LCon:(6٦" _ WO55HC1 J'5A!#jFcaF$L&8'ƈH #`~Y)>~ONIzʄnFwml qh۶13g>xc 맟~{s9f1$)؏nn%b nB06 d,-*76r ܎N1}4"s̙5s& Ii#)9MӬ=tfaƘH%K 9 r<iSoHYf Yd ~ld?5z$nW\8_%8)SL6Uڰa̩9sP@ϔ6yB0 S5pRM p_{OO6:Heڴii%`DӒ5(T [D,6as5*#%0kj:GcMZGSNO߷o_׎!3Θu#>vkScsˈ2]ts;l63iPd]ڡ}a8ZPUU"6 ($KMtCuZus=vgUƦ_18G`<S|[b3t]m%#B6n ILVGVMh:yw 6Umoo gt~ uí]BaZ$UURJ6tnUUĒo-`܊HkzGk>đs:P];Gx/Rm߾$9N%Kp$>ݮ64nk46g{_;ݞ䫶d*Ԕ% 576*2? cp:eYq]nY*vnSmw :+KRiy` {2" 754|>11)hjٔtaif0֊ iE= s6E9.M MMzNf+-)uv V <HC0lhltܞN4Mo//+s\`(nE>pؔ6 I.: .oJ\ZDl6Y.E,+ O2`-:)}_Z]Ww|ųW|uksz;ן{9e|Sjig͝W92 عkĪR 7{?[WWx""z睵:ibo#~)xȑ-[\pVw䛷l9p$ISs׮Y3f;l}VMkRB]>3MǎS3ƺ O<9wΜ]}:k^QaAa۽Yٳg'`omʭmm۶m;.1o}z8!)?~]jkk[t {MճLU>I} iӦwğxvO>dƍ/\x7uOD.r&ڵ몫gs9m۷mݺyz?n޽ӧM#JK>_kiiK*WIVޜѣG¡;wV J)5aÆΚGﯩv\n&>< 9ΔvgsjUu:Ӽsl2eʔTVS]mE`)/]rEU6kcj_8}8Dt '`u=~ք_P{ok&`(n\Zp޼ֽ; z' Gc2.3 S81z5u3EML=>[[ZZ4M#5^{Ғ7ճgcl[{4MKW콭/8;wرS5գG$nxqI$]xaIIq\v%%ǎ;I.[&^)[n}K6զk+˔ӧlڼ9/]VV_QaaASSKMI W%%tر_s|VޥqĪG?~-` ܴyK|iӶm~0}o/1y7l&z}k׽-v_kJнM0 զ*6l缔Ju붪*tUMڶm{o۶j@{z[]]j"{3)DDDLo5pܸS~_⹉cZMy˖իHt_uּm۶]vO6N|~OgLu)i7tco۔͛eˇ[rN? N>/Dt_شisEyE7AD&Mj_~":uҤUUIrѣ;@sNHI M-Gnoo7tevu'g@`ZZ<,i('7~MJ M=Qs=Eh%Zp8>|3JNE.>Y #(]UMpS!`Pu$fh4ȖX&1ѱںѣF Kc+ȘHAIcQnIENDB`kildclient-3.2.0/doc/C/images/we_plugins.png0000644000175000017500000015113313215302470015636 00000000000000PNG  IHDR pHYsktIME 1 QtEXtCommentCreated with GIMPW IDATx]w\IQ)*؍bEw&4*$_1b&T`kbWRs}~{{[f Mc) g!]NNe\3Gvvv~~>穬,C]E侅Io/LRMz|-4R? S |F@,0 ț!}霿0˜-m2F̃QN1Be1fd0PYNbwfQ&R.IX#S) "D]u EVVVB(YBP(t:vjv:qٶ}61uڌĤأG`>lD32aL҈+SYYy*!gbH,Fs6ٜcgX9gDrOP=^57zͬ 3o/i}g؅.m09p>ҳp7ō$9a:͹"w"dAVgfeyx(Jr1N*))l2Rڅi4vZSV}ZcpԩSxҥK`>Lbb'e.Llj9jo :A 433'(ԻؕphkTH3I_Lc3l.M톜b2 16PH=iG%!"̮~f ȚV„"v%jZj+CTf~hgoTW#(7{x8::Z[HiVU(rqW#GTkW|CClG٬,#Hӯ #g#j U{8y`CB{Ɔy sz5:0*Q 6Cft &4Wc#<18k;{C"#Fk%J̾h !6VMIM^:HQPR*Uz(BkLNIAg!kWA~>K|QDgff"4={۫W>mŋ|}}M`NIt6E٣߻ZIO=CҜe||Fl^#5k96oeƑC9fF,Asea6b+4X|b|-hǢXI(Yq[5u1EUJ`+k,%pmz!k 0 q&SpST.l$B^gd bv͞5g'Џ?o*ڭSSBϞ=ԥیgR˲mXӈTg9Zɲ5cRMђK Kfi2a8%zv:J&%ܼZ:.R1ce),b642k`51eًE<9$d1Prp- ;f۪ٿ?yO MR*EZ8!+6cco1cW V(U/T*%}HJT֭[T}kĉ'_J͛vDU։?n}葝݁%)SǎۥsUzg a]6i$PfffΝi?OJLBN4kS&OIKMw=p!m8kXEy3mbלOq{Lʰ1ُacCGnI7l,̳ )s#B̚ɤ97"l!JD'16Cª1FRYM'sa2=p&+&zI&m B4iYYZZz3fU*eA .]VJcVVNVN|M Ř@ ;yĄG|wZjk5j͛7d:lX:UTJXv5Ea,ep:^SOh.zZQwbJ;9"Da)5*K12cbz+`89w120%;u6,𮉆HQ@vw7 Z(S00EqQ@X2 E-yK@#u.+HA,psB$I OK4FMG1_a>K ډMG#"8d$YČR2`+JZQ1*rC?<2tde#vRT2R*t ~6"+V4n(ժnܴСB.58ϭ3}$\/)U c.ݼ9xgtzuz-?C}Z#N+D#L!윟˜Rt?t(#gqdvvvaxg*q5w߯N.pC kLYzc%fѦXH1?2.~5C9Iy6 6&BnX4|gi̛:!XB4o<Vx\MԜYh-{ZnV-UymlXȁ1hb5u\.(WڍK9џ_g;LTήrQ! BeB!*Ī٫V+UJdr;n)U+19[DHi\.(u:]fAM4Y0+87"]Q}ɎmN@!Dak2i6fL\N)`|Oa894Q4Z^5f 3LiaJ-ģ̣ԢڜdHI;\ 0 j:1))7o*WT(SSR<^ݽz~RDEsk}^egg>x3KO<~xٳWt[X;C6u`nPgC>"rX'.83X>-q4ИC6\g30N2e_U rڈޭadSK&1*Ȳ57|²6OɖXD#+sgV{cO īDX"$΋Sj$!|n V~~./_&%%!Bծ]bJʹ@HjU ;R>ߍ'yʖ~  @; YȆ(LA$ld1[hĶ"Ҋhєdw\iǞ1Li!5BEU#Rj ĺѰZW( S)g{{{=-"佷K.{@1f&x`ۈa¿Ev!Hc<;HKeLҋIio.2Zț+F`D:`w@} rI&1)saDG 'vՌ1 ș02qyqXCS,Pmƌ,k6lF_(7E^Q(Ĝ^uL}#eʒO1]Bj&$d9s=SJٓLJTݺ2h+jN b;3t8["E^¤A ,_aAd |ET %2#NP"3v"Aʤ0ʸ0UN"DhY`bd%bzx)X Z+ x28%fsPkn 9x?a$ Z8c@d,$2<1W"H.wQDrkl1Bl^KԂ(/1sfc^L~ucc"NqZ8554{sLր).7mc(XC1)~R-(<+glrI넬,F<Ha XIdKqѭzĺ\R?"iQ܄j0Ea#)vޙX"XMk3 3Y#OEYl!Ȼ(1|`^a7Ƅ٘mf 7i\v3YD.bd̠D 9 F> 䛞i$O䉘,Z:K&{B7]̰[\ v-~mH%8`6 yPEg<1;pga(íPمpa6wc)<=&`n 7{2׋/odIj(V\.@ƄmRwNƄRJx3'뾔8<\K\"F2qDX5X'PT6{"w%3|,+!6uYiXzsb= "ՐocDĿ[9Ϡc(s{"N=o-.ƨ-ad$̘,F#| S!ڄjj{[LIf]ӑ7csa.t2OoRcΕ]}]9OK u:ݮk~ }Glيdc[҅Ii/lßG 7LW]NpcA&a=<) 5nEnl~]8,Gt˱4cf08mT6H<ϡ*j_3P|Yj}Eq/.BΕYg bDj s˜ IDAT!Br.݀ b gA:ǵ\JG/\N [O y&&,n#7Ͷ :ӝ=')ڒ}Ìl6!'w`{jE ۦxgSWn,( JP,!(K5b^^lpUDN @Y d~!+>KL d*$-$$-WlG̼><ti.(D(!sa 5EW"$!()K:Scs2bDIF QEx`֚@4ݾwyOW._QUuG}=K׮0"G%},e40l!\J؏6MFVLg|Gum3,n&Ʀ*d'b5`lĭ>|8tLYe޾ukEa#SFK'x8.1_'`|F cJĿMaH[.gUykRFiòDQEL#8L^"‡yXۯcƎ:lcƍmHt+iPP:S6??N}۶AkVڧWߴaCP&!>y2v ֮=zׯ_`ƅ¤1!ۃT#Kf WSo\29Eq((>A ]%BGr +J׌1^G&wC/aA,h4P#ԟ XPcj!gpe[Ku5pz󦍗.^ܹ+ K"wqVpHgtҾ?MHD3z//]ze KOjmaȔ$dpQXdrBh,Ę)P4%l"M33R c=^`ˆ ׮]Sa_;vܷ/:6g_VuV+V8t萰Qcľ۬YӼɓ'B-Z}W\٨Q5Zz5oV^Gi&:="b}ڷowL.pv:+K0q{Hܺ:u;[Syy`o8 {,B;vjcWzu **""!ԢE)c>uРAµ|WW֭[ӆ^:1''G&a233֭`|QQ{Baac===˔)3n\V4BCrqqKٷo?Bh!...G۷OT[ 066kڸ-[9xoBd(U:vt;fUJF ~gÄ=,&aFlhyǚIf4%lBSa\ѨqcԮ][A|>>tKINNF >ŋ ^z5jx-[={^\Zj IKKCESB߲Ǐgggӵӝsf)F 2Gk7w(|9ٝt >^ѼxÆ ?0 %zW^NDQ:cLQMј˗˗0ݻuӧW^ݲWskOOϔHᑒsC[ Xpad.PA ˗/ŋ7o2==˿y!EZ`ajj7nV{t3K4JECN B9BR9-]ĉ]@@1cF}UDw U/00$8x]7lhѼyƍ͝VY2=}:q7jpqo޼j޴Ѯh53l???Й3grsslyS={EDD |Μ?R'4B988ׯ/Bh5^YnV$۷BhYYY/_1{ReʔAhݺ7E۽{w^^ޮ]B=ztOtZJ޼y TXH%PE O|sm۶_Ǝ}eweMĩ}!!!V0p ~ܹB3M[v &N8s%K~uҥ .ֽ{dDĘcB.]W/oYb?ij8033رX%teƍ߷__ݻwٲQQ{F?E2o>k֬uvvnذb3f~r媩SjZVgffFGG7Jܜ,fuyî_5ގ;s?a„9 ' ܽy*uБ#wPBfCWV !6fLK;77[.qg&&&2$ ;;9f5iڴ[0؄PhLTeԣ 5EJ>}+W.22;wL<%8̙3aPD <}٭wƍ Ƿk>tH}1"iiio&VYzժ+V)[_6mtZHT116SΪի1qqq Dn4cƏ_bknnnwbCG\8~6l#]8yʔׯ_{yy :T4_IVlРҥKՃ@I֎?/]J'f/^8i?nefʔqB2F -^Lѳ'T~AkR^|O?ׯogo˲eƏa.ءCG]?LcǠ(Z2_-[Tzu\^\Ml믚Fqy۵k7>,˗UV]l>=E>z5nݺXhQE&N*4ѣSmڬ iev-(P #Ͽz0gg;N, {ll\./cWRe˖۶HlɭkV.~5x#P1ALi!:At͛7σ`>\]jծn n1B(Қё+NS)2Ԟ޽*U`>rrܹ[V=Ƞ0F[`s@&ڶ0y#t?P*]'v](Z/_E= .J\~+_Я 2]dgxNv_,\e(zaxףܾuK>{\YsFGEX8z(j=KO\⊂>oNMMe޾}} U{ݻ2L&ݻw.9Ï=rKZiwIX|lG~OϷQK*P(􏀀 :u=;u<|({{I&=|Ϟ=NNNӧO[t-:zߘ1)ݻw߱cN:uTތ#G߸ƍ˖-wҙC3ZiӦӧBmBCCbcwcm3i'm?{!Te.11BUXqР( m߾cΜs"i۷w944u-O''H !L0zyKHHxCvtt,((zJ(<W-]ݻ4i|[o cã-_jժk&&&EDD}Kh[;wF$%Xvʕ+\©Inn+W_Xz~m/r[9dȐu )O=N>{{yDsɒ%޻7jٲﳭ;w|ʕ+V\ӝ;#jsڵk׾}gcpfQ/U l/p3ѺuwOTΉk׮[nә_Jks?9"zޜ))))))ݧ/X^'&&0}>{r ~P8qSb5wttpqq1+W󇅍-_ޣ|yc?~UÇǏ:jԨg'NxW|XXc# /77(Ý۵kP( J~왰)Se˖11oiJLO?LzxxпryFFFffה)SXO<6|t/x1B={ϙ={m1M4a9L$о=C[➟{rV-* WWW9+Vh!YMP+znm0 336l0V5kF/>d0Q_5͜⒗1k…ެt}dJsss\\S۷رc{I0$ѧbŊիUUVbŊ.XժU=kʕ+~%bN^z$/o޼v+W~ZNo޼qwwwppP*t6Nm *IQ,ĝ9XDH/_4vwk/9{J& Sjjo\A PrPsKKK>m*+mܴi ֭[ < 6666lfۭYo>'#"#˖-/]})L!RTϨN;de䧏>Hx^qN)NU(_|἖&ɓ Jc1FTNvVZJN:g[TpQIv0:JRH@QBV^HΏfC=k? ʰ IDATЩsCV'$$TZzUrO Xo}BE)L(w  qBZT*tcRQV2bJh+@l&d#|!l(jRKARDh5EGG,VZچBxvkJ:y 6K&kV^$uߗA|< qcT* Z Z`Jҧϙ5i-6nؠ7K3D\/0>. . Je6?J%89;^z]mU/^;&&z.Igٳmϕ+۴5kyA@JzVuV}XrGo90?O:sέTRR {yA@ɃZNOOwwwWJVӊ#*#E\j0.΃/ZZ? 55Uvҙ(I(UB /(agddegQTj*;덛[FFŝC7ۆ?wɓ]:u^6ܳ{BSv~`ͻM1[wɁըZiOfJz+ή[hQ:p>!ccEɴsfS8E'\|'=xuET]2ڧإ++11>=)) . H&5h2]\\j!b+r3#=]cmޯ^2ꫯkrfʔow\x !ԫwQt۷neeeݾusoTT>}BWc#G]喝3Ǐ7γss:rÇϞ9aZYb(W۵ZϵkVN~Ji߻{x>>KY\X56Cپy{X8~JJJJJʂ wO_(------|"f~tL+(tX'O^lّG0:v6o`~]N]\\ Bg^fW^z p{2l߶ePժ_N;.]u䨯o\ngϞMiH<փZqu7ln>ϧOuk5 6lj#?*jޜٍ6lܰ9\5o~`~'VF8%44q>>}1B(%%#?G[}:\.kV2yΝoݺټI͛6 ۓ8qt4(~`~/04tu/|Ņ@wtբW ?ӵkV7jؠAY'o+7]9]zO!i)2gi<BRhY487YOa]>sP=۴N}f|Xw kV?BcªV֯O~}T^}LXmlXX uڻgF 䂀9-?;={^;w/\Ν5j@m۵c pڜ9pРW URbJqqqw߸y+8$d3L*??ha|Ⴧק׫W!3$jŊO=~0&Sw1 ҕ/_dqԥKiBؕ˗?|`L{Za__z|U(ϩdpHȥBc9888~!t⅐mBS&M?a⭻vbe8~|С.*4To9qn޴ŋ;wE9AQt@ikK_q&X/?qȑu@~f3%#Bٳ9{ɓǫV̺MWξh[*8DkJ" 0_f9zE o}٠uR3>6zPege>Gp䣕R&ef) Yǁ{?qef& yd]M\y-58İs(˗h4)/9?ά_?;R^h4˗Q(آT)ի|ٺ1>, cܴ'/_hָxر۷mӋHKK׬V|+}ҠӧO~V:UMcctz->|@>gXōed7oX!)1QOlA-[p19bD̡Cǎ SBXCTɓƍ:$|¯17vS0͛6ٲy/Xǖ>{Rx>mpǏѿ_JkѼaÅs6V-ӿ>|'{3I}~\kv,1{Cg]߽xg"NIIxMreQ!7o|gT ];--MMOljj*3=%%#F\_ 9|JkH8J6 yyy7_?իyPBhMΟڹSHVL Pw agV߾HJЮmU7l򥤆ks׽mkU^yY_qW!ѱUa acwgu␢(QgϞ~RU+RP(ZnM>%5$NNN?h֫ߠtuc˖jի9::"]qn8{oы|.,gVVT)ܹϞ?y,13 k[f@R˗8*%$<+il-+g_2Rt'I`) Is@@z ]Ez6hkmC=dIaqg^tiJM7Y 1{^'O'p굙?TcƆuY(Y 0{_|~&ti챣yyyϟ?ʰtPΟݧe5fG5M˗?Doa.ׯҟ$&&$&&,yIz7g. zޜ_6???11nn/^~4b{=w乳g[@'O?yJΜ OWhݦ5BU֫Wy:aܸ ZRB=QWW`>31dӦ=zV߿?+Qhq&0eRǑ1Wx }E.)dj*IOּ"צ瀀R z6n}Ǚ?؆Ȑ=>nzO>4iRnnnnƌSѳWOKrxFF˖lYÇ|Ѽys}:5n!Ԥi2eʴѲjka|XX֨w<Ҳ:wֹsV>4ȴ<g|'wj߮[L ŧOjXۄӗ,]8<5 Ь97b>&MVZ]{tZF'ZvJ;{PC!!!999ZFj:'''8$|8zԨڵ-+X{Zocė#FqQuj՜Ӥi3#:/o_ͭcNrUPր?T_JUy.Ƶ?~]Q*7o'R^$"d2aؐ/7hpM9>_V^}ox{BC^PDkNc3J֙Ju葪UX \SAB@:㋧Z`-wŷ Edd{JicCv뚟_kSRRd2 x(c9cƩv :2@Ƀ\./S;w]K;8`ZJߣg"_#;88ݹ}L2r(I٭k: : dr򞞩jԨQBE:#Tʥ43gJJ {zJ RPvYK^\.}֙3gsw\jҥKC0#LrݣO?ϒ9I2ɩbJyy|\\\˖-16 i !tYќ^aʒkK$(*]4 rgdgewڙkWrk>iԨH",Je 1u>tHՁ"?KLқW._Ã11cbݻjELiii&zS跷;f_^r>>,甯@Eqqqw߸y+8$d3`cs3IFkׯ=vtúu|y=XB *T{오*E=w.]|μO};u[|-#bZprrrss:}Z&W0pЌ\A u6{GWgϜ{WԾ^}ѷ_Bu[nm~~~bbӧ닸+QϞzϝ=;99999yY={&T/??ŋO'Eׯ_uw|V0?*Uv֛_.!|=sfa?mb?dffrvK4iԨI˖.<i8(ual6n\^;<Z]ڵF'N$Toe?Yc͚E uFZ-DwEHOwuuyhJvlټ944˧Oj'22 Gwܹ=w"xz !Tf9̛-@art Ͽs@@^Tu^m'Nd={_۷sJ6mf͚E'N8!CΜ;wooeKsְ^xVZuգ֭^<5k=}zС3qq9;˗wGEP@իGEGGEG?x`5|1di+V K>}vڵ䧟gwJ@CcpNN%[i?Tɓ.]jӦ Bhwߍ z;_fN:{ΜaÇ 7i$'n8g_8qBo|#g˔ֽ{dDҥzg88?Ae,hZ+8?ujU.ujGUVQa@8iHBPFϻys=w\{'ϵjU^=ysiBTQYMJ)[7o>{ oۦ( k9 u[ӄ`aPѭi5umW\522 ׯBN:tRcKӗ/_ޠAo'Lx)xo:t`Ƌ;o^yٳgA˗ ##8X*[;{vI`u```hذ=ܒ@kkk&s*bgggoo}USS[iST6ҥ Iիnj)ҵ+!dٶ!!<4 `Ν=zm3332\ݭ=evvv&&åK4?#Lߢ˼֦hيm7u+Jfee8 3PCig08RO2CQD/Ĥl}܁\nضm[H*mtGs|?k׮}YvE~{w.u64o޼fff|ʕBiW kck[f|>_݂Fvj͟>A+V̝3gϾ}NNNU6l7+ÇoУ{Ǐ^uSӀ&&ݳOf*kcjj!̷S2۷lŋwabi!ڷ"MJ){)^|PC唹>gs%.߸i:ROC7@YŒ"RI&-3ϝ3+W=~2Nj8.̟7oKh_2?#!'U]`SyDy„Y z۰JV]߼RW1wwwPXTTԱS' :lyƎ䮤jIe%6}E+%%%k,(,[Ajjjwfff/_ݳg5o߻?矓7yO~|>YRu݅ɊmX-/xŊ+Wh)ȋ |/Yq?x} 5oҵmۘXcN۷mҥ ּs㙞, [[[<|ıc{֖6MW~M $&&. o:#F X˗bEl9s4_r bVi!hyt[)mUpp5a-Tuu9H%H(,QlgaWg X$֎hZ_OocF{bلSN)ϫO4pԈӧk*$dYN 8yʔCZҷOyߏ*6|xRbǩ7OP8CVr8NS2>tPPP%۷mga1yWhްDN_f __BW߾S+dռ}|zz'O޴y5㪬d.]Wر#[YZsjjj&M֭_tCcFJmfBVڰ~Ylmmq>/= 5S<5,w„ A˗ҋPK.GwD=u4EiX |bj7*/'R淐Ӟdd/[+\Fl㊤t|_x" U􄄄<> BɓOM&XlWǫqq[ٵg]b~k[wo#III .wqv*] ~1R?Ͷ`[C-d(' 2 -pw_^ zztU=*((ػw)#:SCfMİWOiT"*OX$>.oVbX66jYǰiݺu*  <9k^wɤKM7ztu۶{vf]۵sfMq\wޡCv킖/w8q$"£[VÆ {ID˖.m߮]G7];wT2Qedddoo̥k޷vuuݰ~1c۷߿LMLn*Ow'---ʹug !?,\}۶3giXiy;ZZZ&''3IJJBXY)&ݻwO(䄇2~~~AAAIIIyy!e*8Ug^|}e|[*$Tu4ȑ~W_'͛51'MꫯFi"7ww|N$N2eС1ƻo߁mۖ@*7-?5E*joNFxN\}rHy+󧨌>?m"t|_x" *^zB«^}1NT Ht9*qF6mec"414CYB23SSRVZգgOlPDӄ2;;A~~bسG9sb@iZ"@9ЄZ[.Bދ|َ?ƱXr6<..BʼnBο/V' !E^ut)MT6,@"#LF8%1TROT/G_y2ڔG SKU[TۡPFX??*Ho`Cwb lg[iqBvqBҫg~ToX%+ej~ȤeC&Q̂GB, X+3!Oa!EHk ockfPupt*)JZrT//DL_~+M<)oBBHb9JfT0] .3ix2&cuq8 ([i<LFD0``B+a&x|ѷ ֹו9tJ%3}iX߀J~'轺n5n[@pl >g\Ơ_K/.b&2:BۣRJ%#EG .e4srPLl; O1 S/8,2H>"ifaS#?<;F'P.*JHv2R__6 )MSTZ[tk|kT,؟T3g |>$RMPغ8׍{v2l^ F&EVƆ"ܶZo[3Oѭ߻_gLX"A-bQ9K@9(&&J$bPX$*F>&,CB cQ z[@mQiBЭb|{0MyckDP#5"TRQaGg҉qqЅН5bhoޮ;7kڔ(D˖.m߮]G7];w.ºwuvPecb| hѭcJ,4!4Ijw޽'O>B11<44%5gގ)3}ݽ+W%M7,wMÇ>|*ԸKUKKK/Zrђ%e;zeMLK.,dٶ!!hQ6LT˫YllmK'fdd1ez{yBhd,Kea[l115 ҵ+#zCCQ*niiܸqcBHRRR666mР[hF7-ZtKWxWITSaF~.O~BB222222V)tP>bȀŋ_|)_Ν3Ge΍H$@ElM4]coNw`m۶p8GsW[ϟ?Ge3۶i׭_V15MqVZ'4Xcƌ3F݂>>jn5 kjժ={:\@%5e,;;A~~bسG9s疙PIg 4f1cj&6ba#T`li}dpz<>V13O@%+3Tu\=#Ŧ6"([נ%gЕ[g5 D-#@4kx醆vgpW/0.2]:{t jB}BfUI؁SX n}O 4ĉߕ߷~0m-]]72i۷o[7oz{qqjѭÑ&Q&mټۗ-̟/4dzClM^<#"#uH$Rs)cƎY[۬i>w3g'Ng;oG;Da:  iB%u^bK-mlllllZ^Vbe7ww}}}##/q:p|~vVm׮e#^2dI``TT@SF@TSaiU*b&N8>hfz!'OQ9Ǐ ~I^^!f3;w޼iӦ7<!$%9gwBM2bi U0gוS-&U߯]:gZr8YYKg?m֜a۶nʤlc.]`?Mm`vvJ P.0^9}zdo೧Ϩ,,~ᇘ{"?=j.ϟ?!3hBh˖) !E?ԤF³ctQNүnٲfڈYf-Ydͺubx?_nep0!dS[ʋw'--- !aaqq'O&,\`[xٳ ! .=<aooL;8:|f:4<<,4t-&]vECrtC. !;uRL;g36oRnw޵o׎II|ƹiSr(C---!oXYY1-Z iƍ-AtxxkMX=v@-b9l6S|@KFX nGM4!4GǃȋK' ֭k``vjy_PPPȪU&[nU"ӯ_V&\LJI7w鎎 ?:GHeRgԊؚ612104r !E¢O"mة&nU!!gͲv„K.1'M*,,5bp*v͚A}3鞞3SSS4inzoQPPԤ1W7\ׯӭmlzJ~ **]B HH>b",JEiM4M˘X&4]<;0llmY\G>洋KS.T+UrSR"/S3VLUYQguFQgu׹8."hbA9ً,!7W_WPE5yW߬Y3?~\?ZG~A+I?|D/J.K4!DV.iE3?SBQ%EQ%uFQguFQRu.p\Xe zmFFF@R/>I&Zes8\=Oc/#˕^iV#uOŨ>kB>)9( E}T{LV{피B Wr]Վ:Ψ3:Ψ3Sg*_V*ZesckA#33s˄"..UXӄ4[HO557w;1\==y:WL 1T@EQaݼoUj$kryFu2Sr]8mW`*7;[,ye|x.W8Ozꕮ][XR,<Ɔ2Y~nލW9.Wfi!EU$*e[CCSsx]8Aǽ/({WiӦϟ={pV<!L&+*6lDCZ:H`B}@~ˈԶ]#xWдYs.Uu*P\.WOO(HDaYM  IDATmdkP)P4+:)d;rMo>.NM:u8&ψ{ gϘo޾=g˗3ٽǎ~+F"oXN>;wΜUb!dY3fٿOؚ.!c/XP @0w|f:69n+V;, ϸlr+++f, V]֠^x^xᅗj'*ҲSSSBH$bMINٝBӴL&c) ~l۠|zݛ7mSSu@,*y.1DZm`vv*~'!ז-wEW̟烿"Χٍ=懅 bg6sƒphBh}?nx5eҤƍ_@e^{M4)%9y-h GVQMM8\EZ>bƍ?nx?_h P!8ſlIP} MUDW8![ }8Q*EBabSjre*&bX*MMX>=&%ЄF * 5.֥b5M&D~ߚ.;D"Qʕ:\)4=}KNr;&wVݺ?v AC# / /KhCkpaaqq'O&,\`[xٳ53]V{AYw?ᑕu됡CF 6w$id >]sammM 6եB<-<|Ν-[*p2l[[t[GGELW>2Ȱg|tB={|5!$4<<,4t-&]vES[+eiiDI|Js:!cF2618q"ҢEа0oܸhѢ[11h ijc| ^"=====}ʕ>>> !>qmۘysK$Bq!5k ik׬KwtCƌ-JOڤIuף' *A*hμ8qq+)W|7:*Rn UHJ'C`5l)# 04 m&&Ɔ %X"+p8.zζltD"6cX{/_JDB!l[Kζ8ΑJ4ˢBں6ŗ_>T*em-8rtFt~A_+,|/_QBd^P8-M]lxlh_T2CUoRbst-/Sw~Seu q8u 8-8x¶(BL*<ڤL& LZ5mmenWޟW]PZ&ҽ{WU!ٶOp n]ݳG+EfjV WSpm:28NHC{IڧC ¿lk)UbÇܺ5,\)};u1rG^I+%ws BHn]'NBS#TڦM9gB$Iׯp8ܷm+Ii:"HK߿>}4}}} z{M퉓RGS&܇?h֩N!wnrrbbrrҟ .NM:u8\VӋTUWM2y=sS'_zI ܪ+140;f1W\:eVr}O^xW>2g>}_.NjeYĉ޼yKMaNffS&OrjUz|t1c{yzΝ7ȈW>e޴Y,[fO~ZΝ;gjeeXδS.B77t9s'߽ǎ,[aݺK !sgZbgY6n}u5۷VLuvv63wラ/޽{GaXLzvvb~R0P-!…sz{g3L'4M4EQ'Z+k+&m*:|!knn~12A__ {v.eJ5!DC/g˖OvRlq]!Klgge6hzЫTfkss4{{BHjJjzLիo_XŤ׫g.ϟZuCh lK_yЏVs'>jx~OTw31q>a$B_~9|(!??}$//Px J!#3蘞4cJrrOՕL&c߹kM6A<da~P1Mn|C s- t>x3wӚufͤkf߁>z\ug[1)^"!V6#GOS>ѪRINZfbk6zKh^2IFFu SRRV, -_~=31OiQpᲠ Gdž/_ܺyְ0Bg͙ݰa#Bf6TڕtŴ3+p&N?qxe}զW[t3u򤩓'1Ԏ-sU*M1Ki| 02*Vu}k]ٶ];L0)k֭_TK+SFEFj.AC:z{>sҌƏgXS&MJJLlܸ ^{M4)%9y-AW-W}~%q ٶkRg[|Sg*ѽǍ/4ONWZ|F5nxy~~?;`l4njPmm+&UxE-EXTVVA_YafV&Egr=yRg[Nhe2vK={!9EuՋh`hHX8gZpyNaX&yΟkekkkںiqȤVXٶvm9 &= լkX;pg[&Ň4*EQؘ嚛 jשch``@Uvζ4ф"H"HFUB)-IuB(0ζlcAֆ"ayp)g[ "x5@)~5P6@ycL~ն풀;;;?^ ݤI `@틭k33Ӧ={y޽];wnִ)!D$\ͭ[ʕ"vqvV"J7mѵmٽ[sf11ruchѱu/);~/!aaqq'O>ytllpB̢2!d+Wk,>D]Ͻ{[f<= Ғ>ܒ@kkkkkΩ,J]ӧN-]d%Zp2l[[ 8*(:*Rez/̄#ʧ322iGG>ru,uSӀ.]Y@u(QZZZ&%%999B߼*GC6k7o6&\-BhqƢEnĠYGЭgbEzzzzzʕ+}||t33/_/((()))?//$8XsfysK$BH?qjZbiMuvvϤO2eСqBe8iW_}5jOOOے&2yzzoۦͦ^~=|*ͫĄ][  q6`s2곕oFGE~t5ER:>W|/<Kl2q8FY5@4]f56bkRgǰ9U 7֬h)c9Rl r}k[Wv .G]:cbO,6f?/lw@lN8>xA8q\(,iҵ]6۷B}KGw.~X$M]:?W ӦLnյy)&}Ё:85?66IH$֭sM_ܱId[6ok u(bkH9wР D"e˫W /v>2k_|albs͛&&͚76uʘy{6k~Z%/ƍG?<<,Iv݈$ٽǎ~+F"oXN]5ʫbK\][شpuͤ>u˭mll`q3q!/-~Zeggohh8y'$8vl&&&K\VR+LLLFEEj@p*OL;rAC0)9y⸷!$==Ioذ!31oO߾}KhV!<~OBl|g& 鴴4yr)==Bhd,VjTCldee׮^3kfR9L ։oB޼yükllc4M{466&6kܰmۍ Zt\%[[ׯ_'A+eVY raBW2Μ>=uR7hg!-[G,C 8|HDaÙ@`dT0%%e \!C HLL ZI5z ljϟgU\u;q!CS .-dƬY{xz{ܥ?-%m6bkO>!PM!l(ԴMCcڷkGPkR9ƦJoX| QcTTض bcc5T.Bſ>"cUT*=zĭw޿U+fSJfڎ5©IB˄O&%'Kν{l٢4}׮geg37ѭGww/v1ZanK҈co߹XOyqիYfff===wa.-ayuT_P+gS{ofqt@-Х[5TߑȃW%/EvCC7oE":m8II{g".n҄[7nە |-ظnM_8kw :?yI52+W;uۼgw}׭i߮C̹Wr##}v(~ n:o٤8v%Gw:|sȋp\@  [F*b82"!M/[߼Cէ 544][BHZz:(xb4u;kB]Aӻa޽!W]?_GG.ݍ#&Vm@v@?>zB._R\WI݊+*FPw >2ѷOoZ܌ @U7q2EQ&Ck޷99SBffM(<ȱC!>_j($m6!ؘbllL~ye«Sg$&&{)!$'7Wi.LB)|~FsiY% +X덠a̾h&&&o5D?:(J&4MQTNN[ff33ܼXG.;'%{n% XZ5JoWvZC= *!uT"ќ/06Myl +/ cG}K{`9&&ƛ֯Þq8c#o/sss Ϟ;Oi߮ bM95yy [|NnA8![#TLl t_ի¢"l t5216Bl ~VQ]+KKl tBAzfL&135?e]ƯgQHO' ޥ+; ֠[qݺP! lB99U,twBq\C}5bk@K&NF|z ^U'"P]}MR:ppbk %,m6m:d/77fQݺqTC IDAT' p127ztJjjԥh7e΄_BAWmڌ1)z./W]lO_/Ν0kbii}vDdgϝsw^=oKїsrs>nd4?n䡃]-:oaC8=6y6fB";qν? !=t fӍ8y쨑F]w?v]h`Hskyv4Mߊ=gJvFa*hEJ{GO >!P5hܥٕkוC÷{zxv͆5LMO<%+//o mu?'1K{w"JO=WzY|muqݱkw?[6-~˄&12⋸_SۜcƾXdQg˗\c:?(yo׎ҷz!%5uYeK_ӧ|uV-]9pBk-:|ϿH$ QCU/ W]-h@l 5ѿ]+-mEOk``0'O00ww  }gSRwoǘ#[X14>t=PZ 6351J],6;777??c07oŌ1ܲ~:# 8LMMK/hffff#}Gsn߽7rps33s3~][cGzzMih-~G>*o*`i8[V'AYu|B!副^9vdbb{b}bS!\>-k6{ei(JiqkXbgO?gΟS[t%ɱ,]կoLX֯[Frss,-3zzz"Mih-7cnwrwc;݌]rriؿ#e~b wϞ˗!O ߾c@?ӦN=Wˢ}7gE= y2ZtNutt5ݟ<ٽoߦ!fݝ՝33lmm 232p#l-O>}?wfR,V~~1Dzzz2a'>!PqwiyP$400x{оݺݿ?5-M"$'oߩ>!R,#3ȨK}5cgjjT*%PT#%58|hNNnNNG:wPnԴҙ;Б#osr8h?G]ks׭7Liv=BHCGǨKB03+k߁MW}TQ&MW0nCm751֝ {zvgQԖ̬,kk+2hy,ȨiS̷\W[o ζ2qطOoHj:PؿOuyVHoϻ/g@K>GO\"vPԵ[1GobJG7CGc{9kdWy?lu;T oE Po߼j:!$06Myl|XIo1i#]Qe/=))Zi=Gs#H$t{{[i}Bw|SꂖE2TE ^!22)"R٠e@74ir?!IiIr}9|zI 5@*n"dkIc:mt/GL-]BFe::O1[,#5N~rxdZdq92dkl ^Y~` L'{+酇g7ԶP=zU7k0%w~-WUBUg5PVߺ6n75߹CU+Wې<2쓧Q-Ǜ/i/b8ߛp%_ؾv}*4pN%C]d >==lȐ)S˻7lXwhԹ]k#:G婽xoHPHW3S'Onfo;S%o憱>|غ#G kڤɭ6ܹsm=u3ƍ ??nݲnwq(SRHx֍[?/k_+fU§]1үޗy",gL:T`1uj[ƛEv6ԠbHڷ;rClk?8l[.;f}ޮ͝KWm#??_J+/k_ձ][vj߮,SxlR^`S=>|ضGgr1B۱7&)EpYwu塃u?l1uj׫[g׮f8<i1FI)xN4dRQ#e&)e;n_`3g og hr޽+ir#`lϟ?/˳|S[~.ZDJ_unnMWwY z.;p0۵=v#‡&//oɂyeamZQ>^-%%^zGDDXZ߿w&uŋ25"j֬YvCJMM.GsBԪ]tK!TUUѸ.]aqqqkw۶x맥ُ055d븨I{\cLLm6bSdr w=]d_ guX<1xLRŗ^v1w{O/˛njT>wxM۶x=''={f|q\ϽS}(;oӧOZZ&v͛7w7_fPfUZ5!sdmm78kh)} u+;;L.;GYysQvp1`g,3;g ](w3N[T=!U֩S\y#<[?7Yxj㏖-[HO:UxqX8-hۣM3679;~~~W\>( Tf9^V:vة?/# &5!55555u[ҿ{_%%%%%e7-%qX8kvuз_כr1 )9M5'F199՗^*ܬ;fM7n*G>8~[?~l]5룙:wBtiG3\{3jѣGOj֬|˖#;ݹcGXWkl%k;uN'R:V/MѮIGcFD{w^p}jw}İao1ƻ(jDRbbm S3 6ݳg=5j4zX'5'y,Mʵǽww5fMll!{lԢYӇzs.Ev*}}!زy#t,d]vرcNٶ_vaÚz˔pW\1C;ݰa&3}oةv*0Rֹ|]zif0ٟn#|(ŀ]% W" p3ԪU{ztަMEP;xb):Y֮f`0?"r-ȹm)eϽ]x9=9zz"Ӓŋ_~ :zux`<x:~4kv&M|~ܵ R\ S롃=mJ<&"%^r1=3Kѵ[#fB(bQUUnl"PPPEvRm,!TS yT%:*R!-2f̘3cf:fŬ؅Ȑ`{Ř|?ڹ ︽M rTZ_ &{)k UvW"Uv(PUXהרֳɏσzyP\;ٟm۴? !e")3cf̌13f/rvOFJދ 6Ο?qAZl}"ԥnjtsHH~=rDlz~v UrW`BEhE^۵ׯ.s/qKQ,x΃yPQ?*.1̘3cf̌ٻ|5{=!z!?fHIKO:}FFFon'.1N9\n}=;~sXkrBQ4}cWSE_ڨn3o(1umss˜3cf̌1{5W}\N֮CUff}ߔ?o_nl v69zD~vf:t|ј[Vx `0\1 WϿIӦ<|Aw69+jY&S^׮ݎ*`_@`,6nOgPU/]u:ޠj7r0RhÐ`>c̤Dz25]ŋ† c=fWD>2<QUܼz.~;0$!r8\N|RF7D)Yz`0(g2ݨ1(M "j9S~,{PX,gjժ]Ak<퍾RXƜ3-\5`fsFZ*u^Wdkl 5@ |0#PJRp5@R![dkl 5@$ 5@;I!|s><:NSh=Pl-%e1ZAFa1&%4L:bq&yFce Ryhu[7Ibjh( [×I)/e_nḵR1Tԫ}BE=@{@>΢A/_oR%8;;j*Bhڃ>N2ϔkR옟uӧ!yfܰzbŊgΜ1}rڴ"8[N{,ڷokK^mI8g%K2d8\5fj׫=Sے?B\r#?ӊO+N@1mڌ+V>íZ؟PV͝;w]v{=oݪIC^dzf$4?;vm ,4,,4A;v.oC6l[-?= ̢ZМZ7|ذAO+RJ)E V.V=|VϿ1fYnwҨI2\?;w:g+WGyO{ѣόe]ZH7LMɐ c…{?}8yjBWKII["lΖ4-[z%oJt(tԈ8|vGlrRrdd ܯ4RRW4j끳gZ{@լv ccbcuji֯*Pچl ڏ5ҶdOۼ^=;o`FB_Vgibܶm7~7׬Y DTdٳ)sώV|N֕]l;w3oOFEE͝KNN ~ޱCNN#ڷ?ѨB_Y[-[UU6ol&Cې[|WQϮs ?WlƽikBu5gih4!!r[_Ew5`[>/kc\|>o|o)uz.;6M+f}42/Bvmo]׼ق5k,ڴi/iMeKJ9zzod>|kX ay\޶㲃ޮ~o>tGgOXTNq:G |K jQ5n o' Q*P7z%=@{P*wQ(ڌL?Q ddd(VQh%hnӞF!a+?+0_=@{{'^CC.^5k^#2R!!$o^ rH{=EFdk釗 U3*5-}d\ Gՠ*Q5h=P>uk8EQCzCXhh^n<hWoQ rwF+MhڃFQVK@{ `LH [dkdkl 55pC55!dkl 55@(gRH5dkl _֒" [ [e%ox$[Sl 5Rgkɫ+7@1_d2 $ȵ|der ëP})tk2=2?PgQU Pj盤4LRO5#eRgںѡ?T_{TuCjhn PZQCkz,8H{A [p@O![I!|sNP: dkfР́A:Gc1)dtqbq&yFce_VqZ,VKA/l k/75Xf٤J5^ؿ( q dkwYT5;;;(0K>?Y5TJpvvvժUtNR5@ IUr-UYr*U5@R w?|wCvMp@e%wڽEgΜ]uy^}~qRRwe62/ݿ/Z8)99""sw7>|:OpN<9<3i5mI&֯W~}pڴ/0Q[pɩӦt\\܅-_qw*#[Z׭-_#ooJѺuG|_g][DGGZq lي=ȝw!9s_$$$X,jF,ݧ#Zz ׯ?fh!bYlņFo +Vyzئ͝#/yj9r;Z9rX?/\hu)aB]™=ֺu{^={,\0wOB-ZlϞ?3ijYW_5?o͝3+33Ӻ5$H s>l_KFʡ dkw,?ϟZ5תUϟ;o},OFz:""L`]Lm>6q:?_>Ǟ?m1bxxx`6l65" d]O4ǷnaH9! p@bVpBxxu_/\jȧO̊,01cBH)V7]Mt|9(Y76ݽkwݭݵkwXUռ9~믾ܠA ]=dʔzp 4j~Y^왳u)"<_Q# %[x2Vڽ,__x:w4'=.[bF㕳)3?ĺ<77?@7e̚=Ƕ;ks/LIIξ`"5{NRi)ԩ)SsO7*ӛ bb1l/SRRk֌԰gh׮V}nlM*hAb9|SM>?vF>5l_Lahh>{عֿ+77ͷ&=0F]Q'OMOϨY3{BCg BSIz}0Zuzzq h5"n Pk QOl  eNQh323|~U nAng#&0C"|;MV]Y"~6㵌rƤd*5k^#B(BH_ozj}{ZMtݺA8d}-#/gddf\iV Y#j ~浌(Jpp^o i(qSP"0 ߇Ch4n_ n"[8QR RQl 5ZX@I)TUH)(U T-FJUkZI@){B҇kP X,FJ @)ZF#ZǞeZM6B PR ҵ!ǵ54zղP6#^DD|B! *?hDD x܈h/A N>>j0[, DP1`1eu"5GBBhs "GH,(OX%}$yQ+qa$kOģ< pX " r![@B_1@aT0I`P*d6x{{{{d2 "I`0(JooAo6)&q}$IFTzz奤ʅ劈Xi6l=t厁OM8rO[ [ozj 7 @਴,b LFnwΙc+o7w W~=Ad}dGuC{DۗB`Q۲QY ~)6G!K<$Md2ԬU  2!fCCBJ%/?TXXDfgeP*f~h"eff֨-,b2X,yyy&1L^XXY-BJD#@fS8tМl)cX,jNL֫fe]?~?УGw^Fh B#>"[wtQD!;;gee͚5>}tqNKH.9>^%%%{*--ٳ{kբ@Qp@}9X=u1t%&E,""8Btx+zH 2bRȢ ҃b`Gt |lXăGyYGuk`:{p\p)V W+tFA.//3 UQ^a4eZmlaaXZmxx8ń9+}yYDdVed./1eYIm6<*҇'=rtʯ nٵsSR"EFFk-R"fddᄏwB/ ]ܾ}{)gz啾_9Z\Z{_j￟`aƍJ }/YB<gkĈnޢ;vm۶޽{4̙3бCJMdhOݯ+@ZJ 4l-Tx:Q%$lۺgrĉo|۫GWrmׯ]׭KOvv6}Nxj.]rFc!CO$I C %jݪUVٳ4:AЪE͛ڹ+}R-V7N:{JҲyӲysQ} ."!6."g l*# q## YRpH Z ӄʏtM RrpaF~g +:/-)*V* h\~3LFbѢE+V|a2 wqQ1Ib$"x}6}ƌkؿ 2)3q^{[$i))+"\k'N~8~={w]V-JH"SK椤Pa4&? Iq&O8ce:k֬ҵs}||liii/ԯg0Bmz>;//N=5ktԴ8'L[oMdPJ6(w̘:]BB[8f؊2]BB̌/aԗ929srtܹY3f4n{cܿ߱#F0||={4nCdke27nX}[wKPs–#]vm;oSKQ?^<0}@ ^+>rIZ*::6-/ӕWׯڵ é3g#"#ά h4P/$I8vb}mZ&;qg@YN.MhۡcCfBh0FbNeZQV_^VFJI˩ @M53-`aΝfs# Di6يOJE  Yٕ8;N;i!PylEe,l }>= @NiǴ).r/\D3mF6Dp]^%S8#A}<+N 6\2#6܊RѨ&h0ۿO6d-[ %Eh4>~ )B1xD:udL|j _Tj4f{"##v2|;o{)7C$.iGZƍQQ>xO&aHqbj=]QF=xG>]ѨUֻw.//߹3V{U.^YK.eˢS ͽyKjfCGMv&NdڥKKKJr4Ima6dH"8bȹ~:|H BY"?p 9eVI_V^wߵjQ(|u3%s3́;ǡ.kB; o ffԺVSq\8s.v,)s 3 b3"!8(,ngaos3}a eb/.;ad!!Rn)JJ*,z`oR2Fʍ!2d2YH[)7)&޾mwoPLRRn԰2aZU#uHJ}bCZ"]OQ<"^8^z-$N;6nx^P򖥤xȑ8mK/ 8HPF?M4W^JW>v:UԴiJ!C'Nлo_!ѣ3jmG#q#e˖^={[W^⫯W&x_K.M>tr7`ܸ}`gXvVwOfΞ* X7{w͚3ի}zrc欙E Wb]R%܄F줣PtLn2ś@]3 x8,"/9jetƵ ;XB%Bm6eՐ6'[[.]r׏ڭW=uhFM|9/?,,L.\. |劷^7:^r܄&R"z^JZJF1;3P{㭷||.]N D˴U7|?.?k ò _'$@n3P\ڙRDEfe@l|-FP+J]ii`P@ Ţ+).//ٙod2YpPoD%rO+ Bd0}|J%Bd2JJfDF樳 2:&GMŎը5Ohwu_?\R\DYS#r5@dA^^$u:aNrjR?~~<Sh T^a a|- rl.+QKBB ]@pzPb_y<ѸlGb"h{P?Bo$`5.{qiUI`XYYW\iذ`4"ɽ^^S f͚bX,̬W4luԴXBfeg^z׷Q#H׮_ M6;r#@߸dȸ{NaAAZ""Lr4> q Ѯ-̐;ǠDJ{vڑ"8f(DĜWRR2d;}^n~ݣׯ͛;'((ۭݣsjv4$J$ӡ桘od9gnbr/5AF?~pGp>|)qV'=wNy"&4: g[T;%FBڸ$s#} ":!.=Z'=CBH @\#:ȝ@ȋ(UNMT֬Y3 +++GFA ԰aPBRY3> ?+;+G6&1rIUMPԌVghr233)4x1&:644Y.)ٓdjrZ:&4h0oHxV/1eQPBZ@ Ϋĩū"FG7w惀3!5?bN1>"Ai]teGA.uzJ BZ lR(>JqBFL l2+ _DwЩ\&SYY^_a2 \ iY6/{_U..uLՁ&V|Rxbt.:Q~:ݵ Lz$Iś̮NOT š)_KCR Z0UsCU~v FTIOTx+(36D&U[h@PgEZINw8̪ Ua&V&h"LJDDUfL7;>v) (y ^%(X@ȫi ;BI,HQ:<W>|' jGCxapսS)铗ٱc_0@|Y"s*/KAފΝF!l%p6e%ΝS@H|GsvW\*#Xk_#\F^m3SZ^U kcl)խjKQ_*Xq#OI=]D`i & c]OUFzv9b?ZK"6͂ p@rm?XA Գ3ȭI ~;m!ޛ o*PQZ+@Ha$V{,f&eQ|·a“ܑ8tnH< R؀ؐ"}:D ꈁz(8qF,1"DpOr & ) KpD< VR3wXsp 55h'}gK~C ms(D7dB)-:q"'* KDR",E5| EP$!d3@<|Gv=%^_)XAYdӖ1`0/A+$`DkMJةBޕ"P !Sr|'UBQ:"|B 8ןpjH@ ΕQ[ub=SaIQ]X D pKV|^ n"!@˺DIˢhGB,m0f BQ,``t㺜ާ ,"ٳ ?V>$X*^e-BPTT 6r9UtEgaJMHP 0^ 4}_:-@e1 hΙ#A3plkM,V)!Milhp1׈"\EUUR ;@!"qat" Y$$80x-A]BTߒ?Ka^=0S*$l+eX41N[0p$N,|7vX9@t݈xlv'e#ޅk5؆ W(V!c~)ݦ%@JpDnR\8O,)! LJ#Yr-%ko itʥЛ=dc8xgEβb7V_'N IDAT8``vm8}d"8z98^'+#*O1& bIYFq& o N/ݻwKKKSSS4hNL^ET,xM' ݠ)9')hfŻv^֭[_j4ƍ#8k"Eܲu$صLw.O`mp9ٜ=zq֮[/Οg5bL<>580KG#to7fQ6U{܋ۆPPXE] s<&\6VL 6ڵۉ'f BrCP@fɓ'uf4֮]ok׮3MTnILN 7̫V믿{4HۅX&yUРAw&ҥ+ b.]tc"QΝzG}s+WsΎ<;uL:uԩ}Mb$쳊 D"]ByA]:w;f)fM У{I;RX,o8g-*//"_pa:u/w.2^j@.W 1wݲy MTϿ;tZ_bئuݳW˗n0h:bzzӻ'&ve'ѣ֐zYPP`};We ^@8 MX,-7ݺu[`lZl={Lm"̋D$N$ʊǦKb@R7֍+%w~〉V21|HZ3rnXĖTlaOX"CPBQ5YUX.Dd sTTTLLŋ %%O>)))p…nذaÆ iiiIII׮][nݑ#G&%%eddl޼yÆ 穁UH;)))33s˖-7n7آ=wnڵGBB˗Sb|cǕW׬]Ï?R_֞ݻ/_f~l6o* Fyȑ 7Hp= zq[bk!X0Q=))mU~vHڹ3==}mh3x֭  ѳ/?DqtbÆ CBBMN21vt gƯiܹs;~mꑏ9a]f3fɆwgNG%$zEiFQvILL<|0ܺukСnÇw9G%?~|XX_RQ NTÇm&L,1k뻙aJR&Lp!zʳsN;u6tf͚eK5q0}ɓ'GGE?ɓ )8?y-&TTO2Շ'}2ujTt;߹sj2yJlLl``Ix?T Wyyڂșf舶TRX򼼼+[ۧ4y*\ A3v !:@0:OBx'l.]l޼޽{셅ݻw… }GGGS1cccZ-aDDVu/\>G bl z{{ [xtL uXXsKi.myDd-yNNép$e2ԩfh4SJy"#"lsaðBCèh>>>"f!Zt鶭[vKPPG}6!V4?T *j6T.[ۭnټ9((h) lcccdy6֭[׭s 6=ue 'ji(@p\Qn/qɁ ^zz!b/SLL[nk׮[n͞jZVծ[M֮]tvc\Zv6/ʮ{ToٳBWՎιYt |&)--m)8,_<=dLy g XlCz4̂NJ}|՗YY%%Wx8pe<4Lߟ7w.y޼>0M!Ȁ˂l2[̙m߾3)iQ=9O>xDX}H!Xjen^nn^ʕ+{弪z:[t[5jP(6_߻O>"c;™-{ϙ=9rsrsV~U^e7r'mgou0qH59{DM 5byEEsXF۷o߸q#KR1 iӦq@.;:tȺunj#z˗/ $&&:Q`!D:|pB?rHIvvv͚5njCEСì35MڵΛ6qn%ڷk'BBB6kfz9|$tay۬-[9blѣLj#!5k֪U̞6dǏ# )UyȐ!_|/̽GxoLF̘>`iٲRB9!c6"S_j*H^,z2,n&{'8A"LH :B(7]DXb8"TSB/5AE3:RX$BN}yG[BM,* Q D#UWo%wӓ^PrgrtSB+%rdqwI cTb0!N"P֮s|ybOn<=!qWi]w!4?eC?7 P((?= 8OO"9uY%ϸ7\PSq\&A Uab.KTpiS:@$_o GWׯ"2L"PjMࢱo_ dO,"P.vӽ?7EHgvD22LFI{@GtR*Jg,FHd2F0qU6xK{@bTȞS豎=ػ}sگ'"ԫU#L&AdtlT5O2hrT*_DQB^TWQQe$uO8ùUzS('Ӏf`4AaPԕ޵z6B^`|AÊ2 C!³쪟ry:u޾WY!$II媈HhbhJy ~9RMUxQQa@R߻Pao=V:sAc1E5jP(gU꜅b!$+"$-$I;s{t ]i)z  lߥ #F$P7$pTDP+,ǂ#D֪;#T+,$)GhEtFU_¿*ʩ^nTia _Xɩ{VZ 0#ZHHHh{Yl:>aH6wρ@jXh fE\MݕH_y01YeYKj3 PާeYK@^\ڹ;z[u!GsQfg6l\_@J:њ<ذA._I&J툉jM&#xyyTٙLF R{VS ,[֭oHIJJj6)tי;ѻw͛ΊjW̝)B$K$BN@o/BIS~笥!~/-="d2@$b]D~pN娨}5;v ;T~St;=2GtXJZH1\#ؑI˄YڹJ>Ȥ]σsK5֬y=jW齌n}P#1sHl^j.+>2t`ŢͽeKN[ -:ds7X,=gLJ"L@I2CƤ x]<(b$PTLLzGĦ\IMI2;#Dl0_ rTYzׯ/^5k֬Y3j!OСرcw5mڴڵgy͚50]wY,{L0'Yv|otN:M<&R9p}{N8&՞{Qk6~e˖ӧODD۷?uu'ر~3f̨SL9rwPo~ĉwˣT3J$۾olPB?M|:_BVzwP( D6K,I lH }da^p"0buXL{/]+w&*NYs4$CauhL@ooƘ1uW]ٳ;sȸk_Kf|x")(vuۓ'O~7B?ʕ+۷ooܰ155lkJ VVl###9+J2Bt$,6,OF);)>TYz%*6nñne Ct77a/ud`_|ŀP3g,]ve/4aLP IDAT*FSQ6dMXl ;qikXJ&=_Ɩ",Ph%//FM@-o\b41dp,\cȑaްgefծ]QTyTT111?z(B矏A$?oȑ#,X^}Ub h&@RefeRedfUdJJ+y@HԐhSQkvηTaHWTAY DO<"/##uM:;p@e}&s[9+,__/]HqY=\+7+7U=OwVVv9 d+ xyůZ߳ Tee N]8uLRٹiƌW\1;vxW]Vjڵkу˗/OOO7Liii ,2ywٳgϞwy ~~~fŊ"f*WZzii2W2<֨^Q򏌚Lex_Hj'"Y-rjP"^Gtnln[ެ9Y<5#~ں3i 9qҖy/Ա9^v2EҌn}c0f,gGjվ!!͚Y^]*^cK&Ci˖F!]+2I(bj(QLBNE⊈y\lr-&M̚= ٗ#f*}njc6u6a $dĜ9sju||ѣg5jˋ"L>mݺu {Ocfe}M$HBOJDI${hGIf#TZZueeu D#•"DO9y)Jߦ#"d4bbz*ho ԰KcP(%馲2&;dw]h5X,EխJ%D4Rg>*A" ynnPXv1ҕըQ#/Gm0ʒH"$&A/*.Vr<2"h0H5%DI$3OF! b8$IzK$DI$B4I5"DI$D(mFH"$_L!@g9H$DI$ѿuDTVVv#DRk_B"Jeew\μ*G"K!$/GЧvG!Aw6" 0PWRH"KRt|#~>>QNI~n#DRkn6SxXXXxr$H"$zbCBBqq$D=$Ziݳgii3ZOn.TEH"U(++ךL1d,V>Vx}Xd2ʂ5@..exMA61:ivmd6あ%%p̙W g*Zsܳl["^ZS(Hܹ [K[AAJvBǙ@GD"DId2͌l6";(DǏV ?e5k֧Y AAacSa'niiСSȡC0~}zL<ӧCp0LJr0eKW2s@60e 3zf-B^x{ç#3+ٝ ۷P6gy'5p+EJ$DO*!]vtԩ`(p.?nǏ{f̀wߵΘM@f&4j3g:9~ɩ3Ov/=4,rbKDҥp+=ip!2&0> T*x%(-f6б#24o]kD+<[F0|ie /<*ARm{>Qy9.)).wVʕ+޼A8GWC916%)Šѣ\3qHQrbU+|US !tm7OnC u܆9bj)?@: oydy|N32Cz-wZB~ l( e /V]=ԛذO̩#h4m"L+!o}&N#4l~~xxwu||@RS! h $_ l$wS,"1S,ͧ9iōév m= ߣUss1zrשmʰN1'ɑ#\BfTC?N$B6$8h4smy}ҵ+5  ?O!(n]r3Oߑ}O->yiڝ;閧p5t ??@4EjyF"n?b^g~D][#7ϞO/sU٥k @@nvH4ǹ5 ~Nj#VUQ@.]  v9@8 ֚JV'8sU٥k P ?H0 v_lgII!G&N$;^HV!Vuf@rk@AT[x]ڊ m!wUT{ij? !~DvϹ"T@AGd){_~XGGDPETu=E pgdBeG.Qc݈nDG&3:<:]N"qך$mL{D4>" ]Yy}Z xEd_0aG C="U,"EE^('0 Ca 3{wH CqL[GTFpY-a5*0m_E* Ċ5ء>"ܜ*0)C_}_e̢ swOp'E_p)uYx #(VF^ %jaҶFwo߾`4sRRRo>iҤsA<ͬ?sDeˋGx$vP,&mHLL 鰻BҴU[DATW\y1^g4m" #f%3x{{iӦL&:wrg@*TŪU6oެׯߏ?ΕFiFa8p;w㢦OqFtT@!7oFqjh&qqZS "C5e7f5*8(W:X˷؀oļYfzhm.w/_j4Z ba8'O~'fΜ+ 4hĉh\~pnٲfC7EEo =zÆ ׮]z Ǝ6KLLLKKsrIt]N5mϳ/>. O>",2H >lgi.o&Mpۓ#<<|ԨQk֬蹦a?r3j8 !$))cǎp_͛nݺ[n么F!!L~)--ӧw߾}KKK&qqq_~ L&vŦ+ۄj>"[D<ۻw/d2fAT(`4 5 -!g׮]>u!wF ĬKa>裏>M "A؇]Qlܹs>bĎ}<^${alf qf>"Lpx `w[6k ,FX^GޞNϩSԩSV*//~*Fꫯ?f?UTZ Xccc=xq!h ɽ lC\F IDAT/7Bڵ$YyVMWit@FQb Csom UUUmݺ5<<\(h\lY~~~BB pH&(-00^$/̘18**, 5=~C}@&Q0)"}$;IVVf @mܛ6eeet)715ba6A8 F7k,v$/֍>WbP2y'xb̙ʠA&N62:!#id_ - bSSSۗlV&:=$cGѣ7lpڵWnذaرvjy=)'QȺ;N~w[6ߺy ,>۳2Z[7ܖ-[ =eʔ%K$νvIXrgϞoѸ{n"0ksoXGndѯ\[ ~J/?gN`?׫W/|K w͌-}s~_elt=+-"^߻wm[kD%mCt:BHJJN;x i= Gνa="fFJEݺu3c˦c|ZDء{6nesC1\$ $X__ownۣ]1++ONSD^$b,H裏|IC\RGtȹ7,|D]vM m]SSMf_R5Kǵ{H=Y guNqqq_|Z޹{Þ!bvnzWZyf~ʲ[(t{\$ڣ rbwKTv[Ϯ?###QÞ!#=C\٢F1*GskJ).~:mqpIii /1O<遥{hdg*j9B)qΜ[55斖>!? `}^7?۾w^> L57oǖ!!fK#$؞V.݃:#5\p$ͅ:(ͨC6{#]n.<<$D{@U>FB}߈JZL}Ho4-Zg͞=|#&xϩ⫢UǵKO4cǎEusBƒHoZ_yҥ$m[UbK᷉7ɫ4R/`YDU#=9sjkk_|ŗ_~h4N2EAqO?<`Fټy?qՐ׮]KJJ/Mc~i1V/ӹ:ʶ#Gd,d1T%=O>vڛ7oVUU\g[_bb"k8~К[nɪ㩪ںukxx8n+cNK+ݑj[Y%*xȟciE4KdaITzy_~%44TDz)ӧ>}i2fΜꫯnڴ'`g9dUK\@cNi1Y#/JJ)))۷o4iRAAܹsuO<"KF!h@:gMo߾mחMIIIXTTo4g͚#tNjbxxQ֬YåL/cƌ9p,JV^Dmƍu떚js:=cI7W?Y܂l;>W=66!//~q]tw 0*=^{m۶m ;v`g8&Λ7oݺu!})--miiyG?CUe% ޴NOtXMŕ%. ێO~N'BBqqq_KKKݷoR?3uԪ3g/X[f͚'|d2cϞ=Ց^%+]n=D%T\yXrdr _BYP\o޼s='֔G9ϲ ,XйsgQF%$$dddiȑ#ZjjjNNZQVv8v_P;N7W?Y܂l;>WoVϞ=z .^h*DC̳P ~rYFdDq_~Xf`8|JJO?de:O>??g[%caeĿ2-և+#Bޱt4~TZr_K&? ^ZZ_RwDfBilj4uԪU,& jp6K\oڻ=Y:;<$(EnXePY>a``}VQe\Sƭg b@hB5cIx J'4{ 7[:we) qMU?-PTA M`,yH鄦֚[zC:$ӶE_dԲYBE 8(4[%Un! ֚[zHg!.3֚:7>UĀ MKPnX+om+i ؟ O1/>5%)⢾D:(QCC1jKPnX+om+i smHjސFr !$..n޽BӪKPzddŋsssuֻwիWֶ60HDDվ@8y`҅T\Q[߰V*C:HGoW.j_Lu^Afo/4}yW֡CBH'c }1|-/+7}K0,c\ 9SF< ?]QLj/2귖ڶ%T!0~[>F(0mg U79`7s#Z>Yv#ݗaױdqXoR)|xFYFOQ __(5$оPXr 8KDA <<x7^Ť?fB9' /FepK8r,٣졁@-H\A Gdo ?lbKO6Ծ1cFqqqTT?0L:lGCZHABm/]/pvJ"qcG/=>?s;h_ 2$''6;;#ǒ=]Pl]/ĀldkG_7ômg3ԘS<=~kƪ*Bȍ7pc8r,٣졁@-E,A LXmB(fKptDF+kbKOh4Bp8r,٣졁@-] ???J]/CE{DǬ/=>?qVN:5==}ԩ%9G@N-護O~ &\x.B'M1,-P~֟_~…;v-ȱ$]A@N-(99988|ͤcPX vƔ^r;w-)ԿtG]s/ N@1Z6s˦Ʀ_f/j!NDY hӾ6) ~ܑ+,ǷGX>HXSw\X3bĈ2 Z"X8.Qww)ǭ0LK,KU H3[ @^"wǒs!nhfBI~ ܛSהQko@tD,hf͚xseo)ao:kB銻X-" Op@V߁dOh[{ 85xez2n} wB>"? `X#/]_+bwސq;(H_00Z-\a( 3820B\t]. :f1?,sԪpDkff"l|}BHRRRǎ]VJTp!.[.v~+iE+k"Q1Ttqw;$h\}ZS3T10 "l|ุ/N;\&v_(b~w)&p\ KgP|~㏪vLOƭ/ A~%!h~Tj_>sxaee^'O2@n۴վhjjoj_T 477t:BH@`}1tk_<1dGNfXho^uwbSn˼ypuBBj葾 w{jPhv fK ظ{jPy58ؾ")pW(ޏC۹5Ce)Fꫯ?faL& -KcuuSVZU^^m$S]f5\j)ˈHnO?p_=G 222222>>ڵkIII *ý/ш^sfZD??Ĵ4.E6UUUup IK7͚b1}ӧOs)Ծ`}S-b```tt4w@5pA)Yjg5j͚5}97n֭[jj*ƃpk (!`e[2o޼uݺu<IJJ2jվ X v#s7NZ< ,^zP=n}g8F~XR!lEwv8+W!qqq{?:6fArx뭷>}„ /^DǹȽGE!!{⽡#$`,P5]P(99988|7p- >J{Tc*裏>#!oҜӧoܸ-.Pq ^"zC6@9z)Vx(n1bĈ2t-@80LK,ASl >z/=)@dJk8D#lm"ԙi ciJhWDJ.O]'T/nVkf8!>ڐ"# PPZK?Mwo߾`V&e˖'$$x&.}.b;; 05UDA )))۷o4iRAAܹs2qƌQQQl ZV QmHĐXА׿V&2$''6;;[,l:\Pn?C'ntA !!!:ݽ:V&ƪ*Bȍ7RQQ(\P.kdBִp bHO?͛׿>s\AV&VWWFBHPP(l(\P2.5Z73`z.!=ۻFO6;SNMOO:u*(l j_*G5qժU^^^7oie.\cz ZѾGd6A>!˥%eNYti 3[[[\Vuڞ={B-8Ԕ8gNJBHss]OE1u^cOFt7??$4$קg#Hv_w}J45 pp:PA63 aZ#w>fM rDౘ/h4yyyyyyfh4aٱcǢEvj[|R$=c&Q!GnXDk!$sjM_v-))UrA`(*E8y ".4QUUupGVJ `\D!װ8lg#" MFGGsدJCJ ygxJP5%BB+qnݺ:J.mGRjJ8,!&cY!!2 G\K@RC`pMXุ/5$=EĬ)pA!+5dQwFsײо8 N @:BU`iZBH`?HӾcq8#FP0_zDL&SEEŒ%K`:p` n?\g/΄/4>"϶J3"Pa΄/4>¸`aGBpaG"P\D2'"PA kM!@=(^k]P(lYS>"XDېzEEKK ,"ĶTΝ;WU] 9*2C!j5Gz߯^Q 9w\uu5v_P(? fM"MJ6k w_``!fP7rTdX7kj2h^]']x;vșxX;OW#|DkM[nX#rM|SNZڵkk\?b/ddd=zd2Xb׮]ɓ'ϙ3'22=~ʕ /J衇n矻ŚW_g7|ԩ?o^۷o/|ɉ'>w|_~ǎnݲi-8QᬑL}Ta6@gV6 >[ok,XP^^xh92f"3;ϯW^uuuBիׂ N:/EtG[-رcۊ vر ,׿?8}$;ׯcǎݾ})sQG*\ cY۷o޽o߾ݻ۷/---88=`k֬ٻwoffD?sl"5h\lY~~~BBWh``|gϞ> 00Ps=k׮!Cqʦ3gμ;lzCCChhhhhhmm-wΞ={sڴi7n\dY Nm:j#{yyM>=333//oʔ)mwީS p)%-[f4ųd=]bO=_mX[[[PPrʘޤVIHիWԻzPzY曧zʆ>wu$SI},]4???..QI:>-OwjeFƐ0 aJkuEBHJJ'MTPP0w\͛7O8q޼y `_~円™3g3f(.. 1cFIIItttYYٌ3) IDATkسg^xa˖-.\xWzƎ;nܸ?t?~ĉs>#78騍ϛ7/666(($~cbb;X\jyoo﨨ӧݢJ#ߥ4H{RݻsuԩGyD7U9r„ ƍ[`$4Dvm(,gϞ}衇lxQG2GP|||YYŵ[BԖ;TYl>">F-,,lhh~\~Fy溺;wr}Ȑ!999\扃gfff]]݁ǁ-jiiIKK۵kܹs;uĦ>|g>|#G tǏߟ;w*jQyܸq+VzjUUڵkO|˗/WWWJ999Æ k7*٤ߥ.ҞBO@wfA7U:rӦM?~MMov]|([:vhg;NzRAÆ ʪ͵գREmyjS+mN܌y'&&!!!:ݽ/\^OUSS%* dܴiӧ~ʥ$%%YKܯ/^577Bt:{ϟ4hw\MGmׯw֭: } y'#"rذߥ.ҞT~cǎ}&ԛ* 9k֬wy;s挲,6^y~XdP)cniij"#ZO#*((\TG%ImyjS+PsDk'߳>[VVFӦMxw{ 3gڵo&RN:`0/**2 QQQEEEr,={JJ C@@i~ +W+WdqΜ9/vԉΎ3f<޽{]iԦ6gϞl4= ZY-9eʔ&g%V.==:rHw8|LޔW.^^YV#k$Sކ+Ͳ~wES;k'xB|$S>h[SyG%ImyjS+/>YSG6lXJJ !dժUəÇy={İBl啞bŊ'Oׯmhh׭[׻w˭yBBŽ;6m՟[/?Э[\jٳ.\l26W~~v+Om:j#gee;w֭[7 -#ddd,]K͹ܑVvH/ ۓ/1bD.]O=eʔK[/)߹czz~#zPz !]v_'J8/^,>PA6l ͭ7;W֓:>-OwjnmkZ \EF)RI;eSbq{K.OKi1DZZZzzzOwŷ;؇z۴ɼ{.\زes[߰n]yVuڞ={B-8Ԕ8gNrBgZ-!sV~Ɉ{Y>pO3?  qM]yTd.\c~֬Y'N4476W$@ ڧ2##cذaCG LjU Q.l[uoi]ta V_/Z)S-zQ|,j*l;3 SUUuիW@wSd52Lj+kۣG˗/H}-z:WPkDFFj4$w_DϚ _$j5bJ'`k HW %ڵzر#00PRPx_|1???-- I%]t5ԦX#𡊫HM6`r˖-lsjo qq6a#V^;͟!jEk5TZ ϟz)ǢHHVB>qABFYPP~sL= F}}ꩧJJJ+E`sO"'Ԃ-XbA ㋁X#𡊫M?&u6a#_;_WŬaCʊ/~C{6fMY|m\nrz޽{E|Ĭ6ӧϚ5on,?z}l FqΜ9999[ne=?~-4f̘ŋB/_=SZSNرcrrĉ !l]T>'';|e إK.{FF#`0qBG*Q}D=Ԧ3oNqޤݵkW |DtСL˗ ޤyaChdÆV^d>|xFFS{8ߙjm\Cy~kׯ^)d' Oe?׫W/|ϳ0p7kj6P/_yKNjˎ;6nܸm6n>Pt~$~!C>qٳgw9,,㎬oٽ{~aÇ:tDRPx~N" MyB-H؂(j:Mn *{z_Xj2z:҇y#K6BnSPl Q+_YC ԡC&ՠ7L4ItΏvXk HW?z(7ez|ǎ1cƏ?Bҕ"s\v'Ԃ-X?1.j:Mn *{z.]/MOY,}XB.WEhejK.=|! UAhJɓ'nDN81nܸoez~555͛79,])B(<SSSnnn>}6nȦH<"Kl b5_ V79TqI=zsMOY,}.EZBӆe/R΍G=jԨ~.Z+] NGXww'{sh_t sݷ;tJ\  շ V;\B4{DkB߿aC)k(5> b@GTI(v;?Rjjd+kh}ݗ^z3ۯYl{fU8q}g-jccҾQ$fm Sc 9}lqCYUdF2_} ._Ŷݻ-[Ɔܳ&>4ydnQ"Y&R)Yĭ;a8lmJv jAҳ\2&&1Mj{BBCCCCCkkk.k07 bHGH?~PeKLaOh) 2-)~z̘1N񇨸tb{(2 QĀ@^D-GڋL2dC ~z+ᇽ㰲@(QDT,$=9Nb%DDboLcǎ7nrK_yC tdCQUXky..]2zNO}ݦ&*_t" T0Gnk-wW˗/|ruuoA9r͛vS[[#~644ߟM2d)# !wosaa!" 4|iӦ͟? zi=uuu&ƍ[bիW֮]kI-ȼ BGeذaYYYB-Hzv _`0?$ÇyÇ9rVSnaÆ{7ȽIaaa!!!ׯ_,Z%--\XFA֖rҟ G,^z%zH2cevWԠ#J1%͢CS#܋%X H *Ǐ7{1n1PAԸV{/"a[BH&*0:'In`}{֭[%%%ׯ_ollni;\nT1<pCQUXFJO{lB~G}7HHH`t!t qZ"|Vœ~F__n$~ *uuu/ŋ3^Dâ%VDU.M@U`Quw 0`ٳgEH{&%%tl0*N*.Pސ.!I ? p47TҭLnqˈdzʢȑ#ӧO_z5iO݂85fP{ZիWx +5;5½ "+oQTT4ydsv}E#SEK, "M`UJ9l቉"{Sz{9s_ԩOb ZWސ{R.I!]*}nȆHv[Fd$[SbŊ1cưEZ>YS{5%VU %[n9ߩW\yC ;t`)HbzkZ^Dâ%VDUv ҳΞ2eҥK" bћnݺ5===$$*1+oȺvH@laXtJ DDuuG}4|N'# KK\J)X(0x2E e*:tcǪ鄴/*'yyyBUEHީ@.#F(++U \G!~ V_}dߢkH!ʳP`PLRQmݥ.YJeP*&EFѺ-$4~XsZkvP=STz,鿣h 8~Ƚ"{?v1$}\D'Ŭq.%4=lxOsqzD-4Bv/4J ڵk/A/KB"ԂL&SVVVll%K@.A^&U@zR}e! ~ $BUKj~ei I( 6_+Fj婭$]B:BGD}ZDɓ'Yԑ#GM:_̅Ddm{ȑѣG;d ]*# t|]Nf lKW Z@"@EeJ"@md갡Vz!e.#tN}OG@^bG/4q 6O?W_q| jtY28t!]t?_AUF@2* $/]^j VJ 7OP.s!Jt>'ڣgD}a!4qٳgw9,,a| jt2R`6@.AL ,"$/]^j VJ 7OMJBt>'ڣnGdNh!4QYYYSSQnʔФ3\HA%>2Lj=lX WBp@s+DUrE"ΒPV\OF^k,&N81nܸot5H0{K&#@Oa"R.SZ4~$B #PYD}Y Vӹc)C7ۡo.4N666Ot5P0{q5>UF@Vk:QDdCeJBUKz!H?+FQo>۞֓e Pк%߿av5p *5ucEXD#dmTTXDj2"PEԶ͚6@50ED-@u~Ґe[a!*$# ֶYSL XDꂛ4YSd#UG],p0ځ-m!H(e4L&ɴ{e˖ 4RĽYo2-ZdZvΜ9w޽{ٳ a۶m:R7N[f ҥ !K.owl߾} XI߾}{a2eʔ^z'?~8hРǏ  *:"nڴi֬YYfmܸkkk V\9?R.]H.|||>Ν;T&00>سg|(3۵kWNNΐ!CDL%Kɭh\lY~~~BBz8p͚5{?~H-)#d2%$$/[h4_dڻwԩS$tF޽{jj}҂EFeC:BۣSy晵kז]/ k#"""""N8!t,ߛFБ|O7esRomUj1H 2>=ۼG圞:uGaFlI|||YYYTT?K4ߗ_~!::p̙"՘1cFIIItttYYٌ3ܳg^xa˖-xm۶9rd T\\lq뙔y'Λ7¥.wTTTqq=_C UI}I&̝;WdUґ5B~O=SgϞ%%%%%%!!!'N 0@h4zG~oRڛ"GZϛ7/666((H[[zd!}0xԘW]1..nՄ5kKU[[k0wذaYYY 4r͛7ܹMeȐ!999ك?mfff]]݁."<11133S.::`0H\GWSSӷo_ÇgΜߵk7|S$cQQQTT`***{-ҳKRaaԩS }޽{t:N*ҥKGXA-}ʔ)+VIy{{iӦUb(ZOYM'>/7yd/rƌ]tҥˌ3}O?---ݴiӦMJJJv߾}{ ttImdA%++ܹsnz-֖^H}cд!;cWJKܹSZV:%'?uyZLF@@EXqy#$---=="ܛh%<9sZk{AijjhSSS9ׯac_v ~p}O>ѡ<4АP_=C]Qb֬Y:u8q"y7519w|uAyʌaÆ)F L+j_*یlkNa7J6G Ļ@ \Dx`GT$"E$W T#VYD̚cVB#s̚PYTf1k ")U,"ІwL&SNZ|DevZRRYCBi_aYnNIJJ;wlPFEEeeeݻwԩYf޽Ǐg ry{]v 2M޽{jj}҂ĀKq.,J&)+++66vɒ%qqq2r'GK/tyB/]XX8sL :y'Λ7o13f()).++1cgϞ/–-[^y6%%%e&M*((;w._VVҶmbcc92zhzr#"L&ɴqnݺBFy溺;wFDD|˗/WWWְׯ/Y=fȐ!999كfff8pGlJlllaaaCCC^^^aÆeeeryt!Bt^UwOZHΝ;gggk4FcQk̿.\^DUq˖-^^^+V8y|w&[w999aaaׯɾjժLM6l ͭomm[%j5DͯRٝ;wJJ,t򴄙qA֯_nzZk{AijjhSSS9_Biiia"<Э轟|2Cyi'!>>ztoYfuiĉ'N`2##cذa⓮@w\͈sv_g4 6"bXxf@h@>"Vy>","uYĶrW*-<ԅ"u~EI2 Śtx@U~"вG@}UED>"5zr*=Dk`YP)lfMeD5#P(`C#,"DXD곅\o"/"?x֚ b"ʛ>E.>","5@"5JD,"p̚PgMa"YS>"G,"E$,"pϷĬ)4B!ܬ찈e Bֶ2AP0#|DrN"v_OT6ZS5}D,65,"TVĪ5 xG> h4 5#PEdXD*3mkM*TjefE*m+kZI ,"EpL"!ie̿J @]fiU,",#,"UѪ""@!:pI5̚PAl[Y#wc"fM#!7t ,"uYDnYSXD*ue|Dp#CXD&@u XYGBQ@50/|DaE$Lkk(s ,"5{Mn€E* hT#VYD̚NB` ̚Pܬ),"XDEQiF}T#"+kSȣ_:KKGp.MMMz#?)@d H/p0j/B[[P^w'Lg_EWF2Bdpg͞># ܝ3 ]7$tSwF >bss^߻~?YnוبcLJuѱF;!Z[[tNtFU}~M w3}ߩ'ZZZ{ı񳪻+Y 6$C Mn܄% ɽݐ`ZPL/I%$fld$[Vva,dHsffSvf25 GvksOlL NjR_?"RȲl}NFzaYUٗ/ؗؒAm9t 8n0FB:ַ,J5MPTPg ! "ٴe+ĺ#2dZe}.MaA)Q"bCضc ͦ5qAiX"RUk"a|/l  M]kYDgQAQA#ѣgT+bnyAvlCAV%4][IygTEyaQN% HWDJP"Rf5A/dAicDUڜ55 o]%|Rˍ W"xa[W Edd4nAA"M_V5J b>,2RIy (".J~Noq0L Hh*T߯6͢Rl...  RMD~kw:֚>u1)6F,.G0Bم`Mt,ka 99>}>>XXf7zꥺ" *[ryTdZyOCdviAYtLhXH(O Mf3)&Jovi""|\NZHrR ,=NY H@H,HHTq&3fWfm޽w߲+-v}M[@<,(pfM/_m箢P|DrR=pׯYoIDT T;]6nIx2 2bp}i^u7%4a1RZ\ǰ,mΣO/3v(ۙ,2N++M.2iO>4?MSn-AQdڲ7HmNZ V]?svVTTl@EDF,p̙:w eeɢO[N:ջgOyN2g1LvYv;oZ\c?}{:y4+T.cg ߯~*ѵ6~[7Tm~v{33GN@FD̚9nXnqЭˋǎ6O@EEEӧ6o"e}YO~ʤTX VٳwߩgÈ䤡Ji+#esֳq]tTM˝jr \qo^XT$F$'1jVNyaP0cůzgq to~~Ӗ~v!ϲ}ׅBrrڮmӦIN/E8aCUj+ :֩D\F5=&%%"<Ƥ̲+V۵{Ϝwj'>q1_^|qƬWƏXA5˳{2r<=4;Uoj9*φ5ۆuwtLR32.7wἹ2Oedg8o_ a}޻K?jڳa;7>@K57#kqI Λ{UIpYg.p]IҖخRFyy?|LJʊkjW/I9}:ro\\,MS9yrr%4mߗK yH;]MOy8]?j"X4]d gdwm oٲ''G(_6&iڹ:/,oeߪin߱sўI.o޽|*pj/5oL.t֛>T}Xs }smU kVd23~*'9{)Sbqwu~i'EKh:u_x8sI4aS۸>svrj\b͓pNUꊊ>3F(GnFqﻎ>z=~є޽z۶yN$R5fԨ+W]d0y;gu"JVryȤ Ϝum Z] :lJZTh4=s+ƽ{ޏ7OV;`0ߒCӴQ7o/?٥4SyUA2<(NTA<lOgMCB+4PܡRQ*WpD&uxك/ YoxDZvIDATR}W\ՓyF9ݩS5=H$SS:wkD"T{]n߹KSY ,{5;{洩pݭwܻwօ~ W@hhc"NE"^=Ȉ-hZӓ 68w_ 4Nu'jW:EXzۼN#9=3^Iઠe+We2YϓNەQ雃n#lX=UV._R>P(5RyHo944콷 sVvbsŕWTp>~2eo~eW~~c^! M&H$ icNvLHmL[jNJQ^;МNk!Q(n-wM5ke/G۶i:\=wmo~xNiެwl';w7kf qևU6zۼl?[j fdL7Yp3NOpON[o편ʳa`Y#v{EXP|{[x./nܲJ@ڸ9[.y~bO[ޫG7mQ(Znӣ#TZXT6n]6TjJiK|%Uw⦭Z]XXdZ xNV-[?xh4*6<6ߪ{JO@}b:W\sRx1uZXn KR+p3NOpONխRz }smwU k)ܫ%Fc'Nk-x#߲{[Yw- $h!8mi_B;$A8|mq)$DpP(-8+N\vcD& қ#g3UzMjzR؉ g6{"l+9GCOS FEc#&!fPy}Vy l-:d#ݷP}i?.MޑvX"(+!5zBwB:3-U:̆l 1%hb ~y* #h 8'agfwfCp"86f u¼4Y $i9s.;=mtm"62) ψ &1" Au(yX݁FXG:ci3+ [Ě`*loY*ŮbqH#OTĭ~2ZH%an:ق3'bfW`nZw3Pܶ7C 'or/j e"Z+mw>mFTE4܈X_27bJd !d@ ,"#!ܶ8Hptt*pp'4ZmfZ "Ydҝ_a2+B|R2:on%j"TҰA8jӦMa7ӔW&7]lZ>͜Aԍ)y6 b}CzjYNSJf̬TGz6bnl@<~+%ɞZ}Y8B(`bۺda(ؘv9ж}msK]HeNzEy..d+rY$Nyy]]"߂^'O!{]"oߺfZم:_"J/_}ӵ?U{H$<qZڝVv2Pym6JF"u6ӗY#*w.C;DWpyXmsD+ULc5STc&5P6N0)4ʵ3Je(x3mq,@kCmdH[LtxO[_fPmNEz}B*.hiiEE$'i4jUQBֱ:R] ;wlotQx+ P ATx{{"M:s[FVر}_t3JEQRZv~D"9zP~} ;G_*2ӻv횘hT _@NNu6j䨇@ǀ]<7Cȇ! ..n@F?sڥȐd$Сî]ݺtЯCF9s|MȈÆŗ <~p<}Mi`'oھƎOof߈Veodnoj{9t: G4ex&}N֌\rrՔU4xqv+-N;xm g0JRUJlܸq9EZF]\hѢU~j4jA搗7P`3Fh.xsl\ѣ#I~^La0"y{y㏋'MSI)Ee'O:88L8aŲ:.**[/QjN`eR֯蒚zϞqƍsWRM'%ևxXX))G #  ֽϪMC,_?.XN:[ifo&#ݻ_qsy+W c_|/ݹw_lܣ2S!B*^ryYF4!+d|87 n5R(N,,YLPsfЛVF|9ZIשfɭ#(K })霞9ITS9-73j W)-uXPmZKV5Fh5 U ,x]zҥ/_&.^Dը5jFZuߦj ,tҵaa#BFFl߱~'ODb0D\+'j"eg+eRq^W_P(2iU6ύMCyF l۾ĉc%nc1!Jm 6ox艝vϙ5cR] H21iJ$ܽH/]x`womݮq-&zs#ZMRѨKl :Ԭ.}h]I+&ZBT*` y ...@jrL:5hp~۱}lj'~G#8p2'MbdNZEX"h,e#6?72Gi&pZtAPN$;M?rRjKtc2cNז W`b !WaͽmJ LJذӖݺ,0!E^ykW¬3y9YVS[Vѹ%RSzzNh:fިmߞT$JL<`@/=W77sgO8#)?HNN驮.:ĉG񎊉 8@$ʤt EM?|}M ;sVѐ?lܼv=f^HN|jmr! ?&ܽ}cX! 7K< c$~[7Fu{j07- Efϝ{5x/ YĔ;xeYCo"CT[nJ-V}e4IT o̽vڵU;mbμljTGFlHLh9~s*3>5Y|]p־Q@FH3C?wCYY#2) vr{T^{$b)9LI|qleV&(ݻ_]$Y $DggO?W=72R/6I}V/~:uKDJF)$]5k:.??adr7Ajl̙3Raÿmnݨ<̒JdÇ ̃ tYtaӦNJIYß5gΓOu!|7k,T:tЩSvڝgwh~Xt唈0e㨙7ؖQT|[(rR+s!rkZgF\7uNl/j {iVL] &lJfZFI9jdX,I [p6l`Ua B׼r0PF#r۷J勿g::9߸yE!r[U**ĉD,.W.ƭNνzJĉ/_h4$uqAJL'QTXʴXt+F&'&~h6#6oFu%z(=N!/7Ul.NNB(hD5=S\T5τX,ve2 Rk;8:!!?/]\]Uz.??O*AGsʩbfNV7זL.#aȥx>tGSWek,s/WP]8b9GE|nNaoXŅܺFmְ )u)))wqvrlܸVi5z^$d2Lh[hQb1"RRܾԸ E$wjMkW2;vHCjJ;w]ЈR[h^Zbs[,=(`0|6}馍덎G}Ȏ_w &6?#J! x]hL[czc[evo$ [(p7(]iÙىМ~%n q fUM?'Nجmvl(YmZmRRdg׭SGR;8:dHL{x4j-TкH<7';N:>zkղ>'ajIO?ɩ[H_pwdnfff2u={{[0z;vFn̿]94g1)>>w` ,1M2cSBn~6^̟tz5j4T'A4K2<ZI; K"YvnFҔ}[0n1q3r;S eq9^U'Cl]A5)i6XY.wb*j!JkwuuIIMHHNIUG|D"anRԿKjJjFFzrri$DbwUB.i)F\UcOV{έiy5juMyWGB𺅘ɢ3P9!Y/'p)iA.Xg8'ĩXn-m;8Is7mjvfR*< 㕗nV-,,,RtZD"qrttqqJ%\#cD2JcI$RꋺˍURL)Mܕ\T< aw`ۻP8˟Łm|/^3z+#s(0(fP+ aTlP| ti_Z+J/psAl,4,c6s`~P%ӖOACgNX~٨N)/̚؁u!1˻A-"vO6bO\غ U w>mJLFHvTZ3`:TyPEI\|J{Y.& fJpkvE'嗦#`gGLJ ^ TU;ٺy+XyK8[WqU6LVBLPUtHjen5E`l4K(ZT[(nkҢ%[מJw*vH+=-I2iF0f5 6YMbU kH/AdXfl660z-gY6q6Uq:G-l VURk$x8~\Ulw[08p6r4rM.x 5a SKɻlھZUR@fRXxTKטzuZdX.\Cg A&~h6WbK̴VKz i &4~PqUŒ6`S_BC&v~nJ c9\x8[w j`eƏYcS͟v_9tI߼tos2aBdsRV`B4 -/j}l9f 8u.JK]0ŭbbuf--l3iIuNFT(k‘6I2ħEL b7op;,x,؎J9[|^gWAUۚ2Jvt|A-SYb[qF2N5J7zf:45j`5-Yk^FOs5 K!t_;i4AXiqۧI8 ٕQ.\߂=^Jsor6\Aܙ ੂ\:-T`7[- NqDa饳#: bIŭX #V"W:u-\9cf8t1L}IEOvsYyQ9Y7)D-N; Um .'5roA/5R,va/;+>y,,nZG}bWs'l^ ^an;gMJ65s3cp,nnq(m׉U (m9h"9A?N,0Jp  ϶=^dk) XW>F|jZ|ᅬI1!.Zp/ 6Zjݏjۮ ϏF!G._LE1ݴ%#*kJ]LGYWB3ha'j%K+B(Ƀ #G\rL$q##g0AjoȮ";+S& Y… ?_~zca8i0ڶi=lr ;BVii1qq̘9c̮_>hukם?^"nڸLkxݻhmɨdI:|'OeD {NIIqQ_>_} vpΎ}z=yJ!# =~dvNNl^Ve!ARtђe=wkѢ90&6.5-m+Iz]FT"1B(B; OsZvڷk?W{OHHXxKҎ9~Ο7o_u:}|}mXם:m[~Zw}1qx>|矢fv?u-o߾t?zGΟ7/lj2Y%u>-7''%Yݺy3lݺXVmVZsO8ѺuU+W{vNJJܶmە+WiG \'<<ɓ[^b%_]wo߱&2"PY$Fw|e֪:Q# 1Q{c'N[F7@@>xh_E%s7aEliٲ;DV ׇoswkT ݄KX,55F#IIK/ZxѫW%s,be˗,NwϔFmYQ춍?B51J#DƭՕ{zu޼}t#rLj|?F v:l]#W,[ڴiGWAw52b܃ۘѣ}{K?2ǵCe0[~N:uj.]~,E~׵I.^h388:>~tߦN9m40zDH+}I@Y`PǏIΞ=;ydOS.2e -&"G@.hP!"ի[^ӿv͚G !".5eW^% ?nj@)K5i suq4Ν;1S)1KȺ!#䟗/_2S)5r]Çy=<!Ç5r\!"e͚6qttpuuxD"..N۩A ܜ^ƅRoѫS <'''O8>*dÝҥˣF{x=Fe֩_ӧvy5|{tvߑA/""GD 虊YV|ⴈ /.ʳ`_/wɃOvv1B1s6iF^?"j߾/_HTf3 OaV|ppςVfgZ񡓁/=ܧO>}_~%,< 23N1 BzxxEXYYY\VMʴL:j {~P4[?UUΡ)K>seIzi;88h4}/^4fYTB6fSn|)ixƆU ɲ"?x3R"r$2V%=̚puu -9ԊIUYqєVS!sr}?}|ottZaDwÆ 矶mܻ`;,h | s n^a"_רQ23j$<<<)==*CX~@~gg碢cCDb.,.IN.$gUHFF ws92OUVR!LMI[.$'S 陖ZvmHMId0]FG@Jpt~W*60d ȤDP^Y3f nݺiӖ[63r[Db  33JHN8ճGwZs@=w~d8,$ҊY!~ﲵ܆cҥ۵euh˗ɶk]{v+tܩӖ[SRu:mbR⺰0]V;9;:8ȲY[Yut7vDFfdfڽYfj8{[n՚ܼݻ|{޽/_+F~rgNge)aaFw?+c7X Y:m6Ud(U rrםxVZJJiSDDrJV}f]""Htj'g',SyVc=2';r?/. kyv+;w][2>okܜܜ]{e} DAدߞQsm ׏cgwgJ$]$ܻgb/ >q¸]{VYKt埫ެ?_deeժUsS0޺"(ginLgoԜsm6%(`dȈ={0zmǎMSlƄ.wB4V18uY_}{UA-ϝ9Mn['E^~EG[{ZdWBWhRc^%&XjCx?!l+6?}eݵk !C0$ʍ+* N.ɽ|$|[+6Pʌeh+6lj7lЮ];k!3bW "B\ܵO^Zn׮ݟ}ڊ!2{ +**:vO EmrUjEϸ(H*&:źJ+4N8|Xr{r--F1d?·eb? R|v cZ|C:cJ܈E:NKs;ׯ_TPTPr$JiF^~]TT? C`0T;`l(FeBHbs+h)BJrBa Aȹ|```````б*_>v)qS<ύQ37fn w37Fӹ>!@wЍa76Ƨb`````̍| ST9' vs&d7 wBTȍ#Zy7o:;;{{{oذ}G_di\\<i8G޽{ŋ7nDFZ~fn w" ף#?A3f^bNvNѿ[n/.*vڼy?X>t+0>~Og?8PXPk'Qr^..ZvHW?oC:m֘/?@& +v??t?LJS:\VޣG!!䫾}*bzw\ FU=CKnS&Oͭ_Ӧխ[Kn+c=}Laaa۶m&NH {!Ry h-b'NZ$)t:-/^HĦQ%ڭ;tJJ;w-[~;mjIL;D?7};zԨƅJ$`H˴>Rl)^%?pq͚֬6eίʺ}mۓwEMQn߱ŋ0z(T2~٬!C.Vݼe˟%}zd.pT*t>R\d)V^}ܹ¢1Z>^ (0M.5qbc>Uxx:}ꤱ:tw/[sN߽g1xBBºk,>o(bوؔ͛6]~N"E3j=wyzw]˱7oڰ>|)1%3eZJ ޔٻw 1|lȝC _bࠠW\#UbxXXxX؋/b4dltU܀ z_LfFMׇ߾} ܖFBB!6*Vq_lYdNBk 3{`Xx5ʢ G]T7+Ժtf3O2q@O> {ɓ&3ҥWƏ\L!f#~?~qrs \2b -Z4d...!#F\~.I#Ǐ iÇ9;;*jС˗{ebe277o1 Ə$ 2~(]ճ?.\ KѸqtb.p^MTٳ&Nj,XxXK«j2[~\30N>4 Ɠv9AƷ^^>L!QRKg!ɓ'۷xYAAD"U5)JĖi)1xsV HRgV=+kEEEW:~VZ1Ԡ2;۴ Yfh3F<語 KW. ¥2'#bbժP(Ca-af  CYN{r"Z&k S L^hOVw 0l\.OOO]6 t!C<AIwLV ''FyӍ ]Z1xVV*aÆ vk0f955T+(Tg)?YG¾[ e t.6*P^^i2xlߏjտV^=))g׭ KJJt/_\t%/eKRT*[D R333LTp_0Q$e%-[IU9;n޼EP(͛7wؑUZ6$gEǎ#"#" li$-ĖJ@`bکSM6kD@<ck0EsckyѢbj2hРֻw/XpQzzz͚5ΚE tsPPЖ-[Ə Hw-aۈK,p߿q pʔ)֭sss4h+Wx߲eɓt@8 6mZ/\(33̙Im߾cԩо}c@?߆DWڼ$`Ϟ=ܹ#P^͞;bcb:`@Z5s,J5xpx8B`xvwD^NvfFAo@>y䛮ݒ_Wе[S'*/^p;p x+QN3N6jH&r "<}| [""rrr233#nmӦ . yu9k{i:u#*-8ޫ%үwS`TBݻO޸```Ѝ*37fn ̍QtnooGT}%DA&='t`0ԭ[ -'*q)P(x޸IkԯKBRRrk `K%axsWWl.߼DRnjժᢰժU]&S pS * g'ggg\ 6S7L]aݺ($! U@Ҹ.o7D|ح{u[m;g+>{6fl(x,3_\8~Ѐ7'O;" wFU׿.JW ?Z2x` uaz? 7k زyoݾpڵkO< F%GX[>f腋mF"X(4g[Ç =pL&2er:::̜1iӦ|nBҥKvlߦkpo͚ 1֭ [ŋqn7o,_4f_tV,̪_ rG%sssSR4i߿w%;wlW( rr,+fK.٣ݻvE;#w1+66.%%ea^~2_& "es K`SPs3`R jˋ0+}QQ6mn*0w?tذG-,,/PTC !_ze0n\\.塡_ O>=q_WW1cF_?B ]ǸqƏr7y$GG=}YX6mj}Ӓ;wn„~~~cDzZV6_߼ysL2b7n0 dᓒ=S\J2NZ%) AbPV+C^m?\/rg{t.o BU$77]Ď=r*i~4>kZ___WT'L$!S!hlQ񂻻;hZqZW}٧B]Nֲbɓ;#={VPP"9_JTg|1UK2NZ%) AbPV+]^x\Pz[Yӧ8G !Wnn2>}L4GFLR ''hT|NKO]6 Iwoo_~LJ",APUjZ1*A ӠA#_f{t۷oO8陚FN1Ils縸3K.Hΐ/r#̫!GFPP˼6]!4͆WaVAYյژб[6WeRrI* fЊDUdڵҰaÃTbۺuRT*[nر#ح[$N˗eKBP([D+t,_"11QדݯU[:uڴiszzzAA֭[[NJ蘙ɥ:v 0~DD:_^zRRo- ̥,dPV+]^iO>ti+hݦ L10]nG5L4),<<..mwESNt:DSD-ȨY氡CYoF ܱsi@Qٮt ӦuŋdffϜ1\zO?5Fҿ_?J5{JDs=mڴm۶-[ݽ~/_fW'I$~}޾}._8p3 O?ΒRPɣ6]!X, jb_}թ=}ŗ_^w5& U2+#K@>}K/2 :n Eϟ?ԥL&E fkF9wd>qa2Mt^>{}*ɶ;fϚчRPyTͳgϖ\y;TB˗.KCg͞cڜ*eR2SAiG Aߘ#) =F;zDgef^|y?,ZaZR>g#k?z"ྨK:q4L7NA/j-~~~ y$H4nM7T^tz}H k0rC :=Z"%׳Wo =vHǚ5k*ʑFGᑜE[6 L޳W&?p 77^zS&OS~C:dz}LLۧϩSj[mtX,ӧwdcGB=Je#Zmd? :o2B*ގ?{2º-,^%OlLS,IһsΎnnn}ug2kׯ>>tȐCdI&&&&:tq6i]mKmݶ%*fw?c,0ca֬-Ub=||>rh½{K/EGEG[x^|y"wܱcCknWW۟>spY6ܾu{5aa))##CO>IH\*J^wZA`ܼukQ{ )ta^2(9p/ڶ5BPrO(6..33k}xkܹk*޽_W:z0'&&Yz/_gS6e% ҕk ltKIImܤ ]12=;'gmÆYle[m߾ڤW\||jJJxXؚիoܸaL/r }ܼE yK#E]TNw^ֳGW@B½O>!'NطogϞYH2pDž3{B/9f(& tCCzz==塡c/qN)KeJO$+򼼼LL:^~e:dsǎU*W9zM|qTIITⅢBR5j?F~쎸82\00ވĢvuu%333'N ۬W<}ۻ<{o4)}nD"Ϊ #3GGPla3zqaDGg:(":+xl9`iVo$!7 mn~L&{K'{{v㦯St3{ݩS66~N|Aii=B3fu@>e7/Zݽw;~u{-r~~p֍B_VVvvNBf<0EZ/f;~-[m޼%;;{ ^=4c=La<< .ӌ_Q3\Ç?:2niŽ;<0q+..BXry{OVȑk[`WHd??ݓ}飆8¤[$wBHte/kk+.5B_XG-r2V5k"ϟyhͦ=_xaW\_Wo//| vlqƎݱ}qo;ck/k׵xu'BӦNoomO^[Wok[_7m4^x1p4mYtգv"ی%j+knjCBQ!'R1|xnNnfL}3Xfi[u}}KH1Y'ܹ׬Zi ?ܸ$Kg^=KUܳ>롇1b3fPGz GeҥoxtŊٳf_" ̞5kuu/soN]קNRSsM;w{ָq֭;\)Ĺcnظqqp X9sf/_76Y_W˥i6+[[[qӦ;\&2H-Y5kܹs2nk׊;vM4G|C ]&|+USSSWWmk6{b.Xt ![`^J7eG /xt]Op`0_\1_|nzOz7\=ߛd"Ï_Y/4/s]#Gj}|FFF?ZVUUWx㕗GeqIi2oK/Ϝ1)u &O4?c6{"] ),W]=KQ[-*,,;`JIqewCɓ&-Xp 2dPp&Bz}ti* ~h3gΈM֩8zXG[+Kc,g3G8NǑhxrh8#D$&<6 @,yyy^n+-/t_+ehA%7Gϣ ˥jAֈ't:$JcW@tqhB^%Pn0x8+DXSr0 457c܅)Hmmf Ar-ZѦ'5U@r8a* R^%0 IDATP|L una3 HKSK'۷`[0kIjTùHUĨ0`xngҿDRHf2}꧉FSZ[. `, XMr9 *`sKaD7@ jhyQa6C +IjTU@d͑o,C%PnlaO 6q9XX\J>|I  %vyzѥUf::1khlcTpѥU\ryj~Z;ˇXBcC,XE>Zda3yji]G:mv'MQIa,6UR,䖦J,X N.۱47_C9m,k 7"ҷ\ bns`-*3*UR Ijyj*Z5Qa D-MbTn!8Z0* +XJfT s`[,#KJnZuK3,5%57VԌ#- 5tr3pDH=Pt$0q 5,Sq3k!f`=\.Rʤst rJlc\1}[Rs`X*6Br}ˉnڂ r$7Knz`6yl,Qa w-/Q,d7=%7)T&*-ƵON|moo9}Los}ˍt" ivf  E9l>mԠS[ s!yn09c @BHXXӹDpdT`47T 2IOrrrҟB 8EHo9 @BF`BC kQP&s0@mI-'HIm*}Hp !،657V¨0TۄB-@JLJ)$=F]JUF0Jk9<=v%%^7X ŒPs jn@rf\jn@r@r܂Xz57 @1'$7$7  Hjnp[2f~n $7CPsS\jn@r0[rjn@r@r(BQa94I*(>UUuyggEU\Z[YUη]./}ţzjn> TuĉeBE=s='pҲ*RVVVd\篦i2[?\NgYY}ɯ'=l]RZr:X&aas82\NSIbe)lɽ"̔0&2TUֻN(B 7$7C@ezn -9\57   Hn:MHaR{)2+IIrZPhvHu mCZ@ E`aG`Fv,S=YJXV fΒEc/{z0eڄU8$i]}ݓ!wvuOl1?.3JjnńmHyN=; G nMa&$-](zeVI])ֽ2+ "~ra&B E.u$7 #<||3xUk Hw2޵kM757EϻKR' .Y[K.;vnٺK.NƩp-[]w?O8QQRR|mFi<7>wӦN_v!DCCg78М7fˌ߶mǛ߮ɓ'ݲhaff 6g@>~ń |d[miWطmۍ[5s7G~>3|?Cv5PcߡL\ʘ0@ܲl^xӍ7/i~)x Rb<9}z]S󁞞M~*|,*/^ypّmι|}˅?sf_m< VZU t+.(bխjhƶVoXfGP{fn=2|T/.V]{^78Q'4]L Hɱz!is4@5@:҄tP~@@ud:ff:*aiq` )!iWY|o2_:<̱tUl*8ZmϷXsK!0 iȦTv{=,jO6KB}]ʚ=`˾19"[zZFrStҎ]\ZH=U-C#þ*-js[n? m sr|>{$2Xw3+Cq.ծdҦu*n@VފV:+"4UIxXm2Lpҝ*ڐo)R uw,Ru5L eۨu] St`a5s'aX$ap 5tIM=-W}ß ݵj_jZ?9, lb?|j/ 0xIENDB`kildclient-3.2.0/doc/C/images/we_colors.png0000644000175000017500000015166113215302470015464 00000000000000PNG  IHDR pHYsktIME %.7tEXtCommentCreated with GIMPW IDATxw|UlɦBz$%/tPDP,tA PYA4)4i"!ҳ lfwn&9(;̜i9{j 2^o0A)0%>7ȶDّF3rΥ@Xċʎ !κ%g+L+Cjܶ3q`.)q%J\îth|avCMPr۬W)姄Vyj/Kqų[+m9JqH]}>)cO8N(1b;_ߙDY[ݔ5 bT\s hIšJKO;A?+)L. ՞C-%:EFFDvجμqǫe hCz}|0|ӣhe\8XրcbYvi珈G<DzV<Nq@9I59Myo#7 |tȠ` F"QܜtJ5q F^a0Y+5 999:֣G}G-''+D""hM-A[v30&&eFq$XYmze#l2u*d30x%U9K&)wʀֶf-RBOZQ= Wו+OX,i/o%\PCŝ%1h4-[T(6(v@իT*+q22zj5}鬱'hĕÆ{6kXMEkiAOo>#Y^ynBX% *@/g_Ku4Y1 k ,]&+|,hw߇ PE2?b8( F1\ļ~,j'D)&' A0EW)8AXI&E)_78(|} oNUz}jT$YCNF~K/}7~w7࣏gRE~ArǴgkeg>Ǥ%38O ]5`Tw(L'l]f eDbfζ jdm`yHo"j5kg4KOMV~pgkZqAVh blj./j5JZ fiuYiXXX^^`^ЀvnJĩ5u^ooy{/K:-- ~dBg_&u<{Ň~k֬1ei{mz-(((xi+^IOKz΃&GmF4O>̪X[G"ChQek֟ѹ_OأUL ۏKa@vBE7&B_gWH6|ʚwUI[kn-Ch$5XnjĨjB@!B,J֢>҉NjWG~w6FCaaRTuZʕ+?裲RV)/7oޢEuZFVy F`%:董V._w:WhHێ;>uʔ[yswS[JNVTSb|~lN;JJjߡMg7o0iqwYX6xy-85avʡ8v`"5\m1m 6"ʞĭήQ38D^qyEk[WbK/>wcpB£<$0 nN]mEsLjlO"DOX;a@kpM4Jlit:BZZjuOg*+WϚ5xABBj huZVj NY7ǬY+'XS+??C)8xk>sshο^ڵˌ^^'N߉{v@FIm:w Ug*9 oƷWK?@QWF_눣5E"epBDGSK *>qєEۊ}SxlY-ELضҗUY,7)fde,G[l(~@tL, <>Ds3RT/27̿Z(M`>0E~Q--|jSKV@#.*C@`A³B1w#%)%\#)E|aO&#M$f2[^DtzNGj4?mWF7V-[Zj4:z k;Wvɲe:߿1э׭v߾•8 qʽ{}Ïxcޤ(s Y |yȗ_zs̎uDD$<٬h?4+Ly{{0}}m۷;~P'?z%STqqwii1- 97mqE)"p&J^SԖNPӌq\Cm9UGAb6CED0f*H+XmSٷŸ˘/\|g늎%c." Lj?3Ԗ35MHV"B-(SPnʎ^,PHnWKQizDa (3-zs{/J[KR2 kP*U^^YY}}}:V?l8Q֯/x[TXJ̬,B$BNb4;o)7`Ƈoĩǵo=yKXX[G4\2.DŽܽw/77U˖u7Q&VjD먆RwcN[l)++۴iV__L-[//QTT҈{vnҴ)Ct7oԩ9#R'#=쿷"$*=A5:8@h*AgN;c?`).ZFT5pcg('K]VyE:J g4ֹ Wa.Bh#%*.B+-3s+zg k(aMPXWd2+*J:*a~^ƽ;{~WTNW\dܾytAVzW+qqnڲ֍kzӶ 7>.֪ϝ=Z4<(.GM(*ϏcZ>q _TzX3v -: @fry߾>+ˣM3>kq}0Co:򚧟&3Io7Y-'q[a|Da;[#Yl1RZx%[zEIgq"9607#pP,Y%2_[:n쪚g1+jfw5OGBDw55[!˃Uޞ_G=upvV&.zzrJjZ-XSk!J^V{?=MS^2|]Js<λ8y$Sʜm?_OOM:kO׮]$֑ͼt|B U*=jժM'FoHԪWL&&Q*=Og4e2Y݈ :~\PxTZ&//Ǡ3+4 O눳`Ϙ/^b+'63_o1JTnF/ab B1R<{#%xaPH)_(3r; )9ĐjlJl 6jpI `4H>-ZPBR Y`Q"e6WJ\.%1JҗE%HnAb5"bZPOKj>eT _LU NjT2+܁&b:.-=͛6h ,,L֨5拏Hzfm}-%SX5Zo7ZJm!Dd4Z'6:Nl,fIJЯI!lrQ ͼh CxvT;]UDV# J2*2~fFvVvzz:P׼y *qJKss,cB k׶\OŔ̺AZ-ᅅ5!bKyS"9ȇ [bE@'luf)DLi%<. iIƕ٩s );ĴsQFR3?WUjq* kwuNWZZVzBT*9J*ryPpF*mv¶E *l 1| $/EJ"홤wQJZwnHji[nTU F#V!W~ aC"Vc<8q}J a&!|jFKcjWYuYЈ PZ#jZiKhRѰ_ݔ%vʠLPeyD""L *= ;-Dh}w!&9%DUTA5Ri>8%o4X,^|koG1"6=[90G^/.!Pպq֦ *c1`2D _ψҺvJrD0۽TU-u"wɣ8ĺm*SWK *[\bs6ye%!R%Ėń'QZt NފjkqĶō-9PP6;9Pg#(` Wm BJXd9~mUny٭?Qly]b:jSH/a[\vjtT#UL[T9-Zg Mk)$̣.Q4p@Y1Xm6=`ޣx06mq)ʅ23u\3tXXq^ +!&R߿BsE8gO?z/\l #RGcw,xD['-Hgk';_[OL- 4$E 3R0'&Bj 2z "L;W B_2w ٣顤F, [BȖ."q 5$+3' [EqJmKeNqm꧸;qV3aX ,X#ܩ i7؝!^lO8\M3 :i=cϨ U5RSoh՟~0"Xϳ(lK,gٿwh5;-E{2H[&;WFCá HDUEn$7vI>DﲄCl )!! m7uQFTiiInvhwjDz뭛4i֬6S>iStEI/bJ_l$DO JI9OI] AUU6d-3$ii܇vF6{\KtrYPHX x"H|_%r[7ڴ4[37@\|GRW%EXslO(37(o14%A!&MoKRd4H;LLisVA,;bjD3_e@uS IDAT5 zC]}+FYRdΈc>RWvg9^6W!C&9~7?3!JGT4wav<,n"ͷ^r։HEm>ّ6,#5FcMqc+%n)i?=(N+ r.(ACPDgXGYM{*Ԗ]/EƁYP4A?=5AdDjZ:~|l 6ImqM(483g j'2Gpz+je_9Q(?%RPB== &d$6T%i~^%lD)vN=-q8B;پlZ4Reڵ_~q9Nۢe 'vR[rNJ1CV6KIǕKkR1VU+pzGXuW 2,w&Z\D%^Fpyk_}w>r+W֬NDm®PGčXϗVCqh\z]BWSd$m  aUsS?$%z*J;%VbwD1 U"},ɱFXXJjߡMFq%Ovڦe{No񧟺w4!?׮کcèH;ibV-[6o>i|<6zkb$b" BhZ%-b+adXV½cVۘ{blN֪XvQ.O(X/&%1Y vvX/KŞ>>B;h^0 ZG7|OM!|sY= ]o䪄b3WT¸H .jYS\i OR~]ҙ3ni^բEMǏ߲mWz='%%{i;yotg (^̕Ă (P9^L !FZWb8$ Kz;Y'fmAXJЙIq"qk`eO=SsEUVWGW#WBӺBqgr?H9Xy;piK͑tliiII΃,A`qd#t ndSqwSRf:St^k׭oԸ1 4ԙ$:۹ CBB]V7n%?u&^Du%%}9s`_F ftf "&1/.1*HgJ2P^ʆ2RCЇp 30m+QA`q>1AlB.9,z ""$M ;#=}b4e2,-KV [i˟/Bx'+ HжqF!yUdK&Xb3U甴rAh#6^y {$N?D=;ޓdGF0mܹ;~a-)gN۶j',m#fc'0y B-<9nWvpA K>Qĥ5KؚSvgY:97#7snnNyy'LFG3f$'t7nܘ_eee~~8ϴO`\6JO%K^@ef@ED -–jWdE }0. -2[Ruy{:앸 P,;gͬvXtz[\әEc5~?ҺM7o79fL&4aBڽ{5zE?7yrhXIߏ2qOMmP'pxj)$N"#k#raanF$.8k'"8Fʅ*-)ym4 /#R0h@Tֽ)bf$ev)o**ARANۡIQ(A{G}Dw22Zr6["f7_¡ɔ-ӄGNϕ p ٴC?FbBqԶGs3Ĭ+n΂q&лQ gR?Ud7qaԏA(inzտmcDp.VJj3O sX'N4F*m3m2`D1|rG:Nۯ +y}vٲRx#ε䙾}Cܤ( f>vDUT5iA\d1¦ 5O5 DڠHY>u9z1VgVF3˽oۦRn¸ n3hʼnPN<%˯먡yrHQ^P^^~̙^z\աCxeϯ9M$}Bw;T8_rnUBuHZ/4AAǑ#G :::99&mݷoߊ Q_iZhׯ__vmJJ^oٲ;t`*r-۷oOKKzOٳgϞ={CCC 4tPkYȓt\;VÄhAQv+`5¯h]' ~ FŌ s5>\(+?h„ϟ/..3e۷o\\ٳg>ꫯ֯_ sڷo-[vОgvڵbۯ]cÆd׮+W6l믿?\ jQ`g}6..b7ru+,m<#(B{_wӘoeǎ_ ..6$$vS޽K/;bKw^벂ƍcێ!܂a_sob!qIgNxA\]%<ѬSݻ[ׯ_G\C8|yi8r03Cpp0( `7cΜ9Go&%%񷒓ua&>x b`@ΖcctTpzY*v3܊ H֧N:xݺu ?ܼyGv)OCu׮] lBp5VdcŊcƼyK ,ka<|BCCˊfێ!\W9KŨڞ'F/Zd43&MM63g?СCgΜYZZ2~'EEE#ƌyٳ/QN6mtMcbjڶ ^=z?}Ù8 n݊<Ҕ iii}aB1g֬: 8OH\KH.^NAAD&y<?]xqԩO?̸MO!ڵk[$Xj˗-'ٓNW-J]re…oQa!rH֭<8`E[xAADc1Gykڴ7njyweQjƍ-ZXr?tzZZNKK (oO:ue%%%W;n}VnvyzzFAA*jE>SXsa0ݻ:1quqSXl}wz=%̟0-Jzyyݿә3MmڴQ(_-^<;vAAA#/\w.11r<00Cǎ?mдY3 O?Ը7nxŦݺ 2D0`rlE $,X顡cǍLƍ77>Sxm# HQ_Fo%p΃ϢH6oڔx%a˸=x][AAD\ZGQ]L#  zj112Y>"  [kfl yAA#C   jkAAq#Q# JRޝ; {MQz C%!:Ns@%JR(Ɲh0 8 @09R/iV%Yme1*ʚsb  hZE:V89GLf׮\(JP b3o '`k !ha0  @ȈԴtC0 >>jvvEקvR>&QJ9SMwv˗-uO OwRt p7ωxS#Lm^Τ _|9WL)ǎ}%4.je0FZ]N!#$F FV9z^jڴ)qQQQYrn:0MQQ={V'bd#)qcAgM7xek8qJ"(+QǍ75Do|׮]_|peUOYs?we ܥKG <$ 5ܥ˞ݻ#76m;ibV-[6o>i|:AdieO?uڥitaCzɔ۷ ++aTdvv6NNԓbtΜٶUڭN\eVΝ3Cvڵ;gVl .&6WjC^^^C{Ezzzg>a^;wnaan0~^{رâԭ[^}՝;w]lg>dwf֭^~y/XBכnđ#G9*11Qg5d^_|/9j۶MO=dR_x/#v ^ĕ+W򒯿;viSIfҹgΞS'?~|˶m/_ջ̏?ֽ{'93{#˖ݹr{?v)Ko޼w_~}ŲeB+//߳gO&1?!!""{W\}CƌwCtL}Գԩ>gg̻v2;>><ӤIpX׷8 RNz%<<pm5ge=zzX| !C͝5wlS!Cǧ=kUsOnؐF=p`ddEZ%}X233$1q)=88xѢܼy Zԩɓ')ssrsWyW^+W]*w^TpժD榓'Ou eA N|h O4m2rKګw⧞O=գW"N>=~s<=LފԿ4i2ut۪l[I˽wh?q{ᄏ~C1֭Z_>OofhHTP`Т >qha[3}Ϝ9g߶m)SL4)<<|ȑt+FEEEM:mi5r^9N:&M2eJM鹹ygΜyӕv .څ~9PE2҄/7 $P),ݹ: Iף6әe[n<\ZֵZ[T uF8Ŭ|pޘ}~-,3 6lHII5k3*;wnƍ_yAjZ. s#1wU7BZfZxΫIAqsts}ۣ(dTvVN 9!DᑝEj~/Ai<ˈ4rsTJ(=>5F@ # s zNѨ8!Q+s.#B.*[V d*rg7m1z5-  Nmz'+I+T7 Uy(TZE힢(/// 1AQT T@ # !WF7V*F?WJ",vjf6ng( Rp/mm(/# H\0ur%  bv5kil˺*t6 1@Aښ|2L -dCaTH7$=0 *B<քAAJԽe oC-ߘ^`GOe !F8T[[  "&`0ݩsPo{CU`xCe91lMȓamu}#*je)ýeEZD/3mm4 " Tem FO:̣2ܛ{A yTNՙ!ڲyZylLg7PDיּc  R5!jt U|}E[n 7[~Iқ<6EZJG95xik F#`4  HֿϾ%r#|WQYZs/5d0G;CNYEDm1Wl'kk7pZBt:NuvCJRSAښ]ϚղcF#ۅA#=UTFBe`Wx20;;TN Vo9x ^ mM]t:J&hmf^AAIڍ<'e ~ICjPxNe^kZuM 7U)̃@3/)2!fB IDATWQ V-ZiF<<<6KE)p  EY5%}W^)\qm5-YZSτ.>p:S=Y͈ l6!^Tzq?MHjkBHQaa4X^%~]XC <̇$WB8gkg[Fjdݵu,_Pd؅[[ P3`xXX)/nqRCVpWʶ-\\yްacjj'̴,p7ϝYttW^y v3B[rY\FQՄ?%ݐZm4Q'Zj5klĉ֕fVXh޽+WD qSN2x>7AsmPr%N@E*y7\5yO+ݻw/^ŋ>|pn݂t\]:w>|A /=\m(9vdmmd e%]52"ֹ j>;vB-[~n]N^z͚T/b5gϝ{۶o嗝WϞ'NSt:ݷ~wqٳرcw{ϞsA;ZM`0Ke-zASyU416T\\m ]._yBw߮?γy˖U+W,]nU-|Νƍ)/^\l骕+3ҷl[޻t钥Kܹsg-$&%%_$ Ɂ^:jN,2*&;&ڟ "@~xKJJ|}})'ML81~g 9z4~`s?{mhf)|}KJpt|Ag+JS  zcJFm 753*[wk}_}}vJXXXvIcJ!ԩC wna__⒒SHxxx^^Ϭʔnb+ Fw~FW :.!gi׮mhh憅Yd ʊLpXaÆɷnuєb*ehJi[7o5joWAĄ M&5U iѢѣ dҴ4^t޽z^6/////o5hJpO:LaYۻw/:WW&&իE=3nU:]QM0=pdGA4no[oo~OU dYYJˢJlQZ-  kk">xxxt~;ibV-[6o>i|l?O<9MweM{jevm۶j9Ot:Ot׮کcèjrW/r_g=}|ѷOIܺ}p!kO;<ΉFºr񉌊HѢbg7W/,,^D=0ZAA֕{w`M72A yV>uʖmۭ_|]ZXXr\n]~%Kv^{[牊z4Bۭ[^Uv"GHhHy*jL,0ZAA+o-iw}cx7O;+WmՒ5J*//SzV֬[G9z{EwnLLz41WM#AQ :Q%haA7}}󍿒4M~~eK[jE&'2e+++tlZ^:,->BOrM^\sⳲΉ:v_2dهFAGBU[~ z3}z~d)7e Crhd䈗:wj*nm~ǎm׺#z>}I&ll,]ƺ'ݟ>=tL.  R f0 xQ2"nټ-   d[-  8ݧǛEX AADO"  "Y[BP\# 8H[ cuZFm,ӣhh@tZAdQONinHT(j?haALm .C {8{wzRD Afjk z#iݺVv!f-Z^t Z-  6Eꃏ¢Zk +H ]r9 0ڇ.A)oښAu ׷:łOzoAQAڵcηpAհƟNM;W|Yy7nxԨx#T_qMe1!Mcbu˝+D#!j#!FWF #wfJJʏ?tz}F^6{nha{]b5cǎWmټiGC W >|{nwѣxk#To.i?wիrs7o>o&Mfvz^?pР?zH 4gӘz{]mk6m/ПylN8h;wuBȖ-[?{iiY.]&O \2%n۶5>mZ.s^xa3e;w4={0~<ʢ ={3MOzk\.aYݻw۳gF2'Nذq_s֬YS'Oܽ{}wRRV'&@nBa]1%^U ]|{\[\Wݻv}ʕ ֯[76lHJ _>>'ĉ&NpQ:c'N  4qcMe8z.Hg`oIIieS .8 Yӟ"%8$^RզHz%***;;uQ - 1nÂa@{OllZA\\]3!(zW:*Vu,-))7 թGM7K^^3&*))QOA7'ZCK%---::^ U*Uyy2҆O-$ 2u+ OkD&\hawp ;t`JΎWq 4gffMUdbnu+aFxk#Toh󳳳4E˖߮__^^駟2ܾ}_5 m~Fs?\9lٲ4^z/򧣅;v8u43euyyyyyyk׮ճسG5kYgTpڵMϜԱ# [$]u6dN0`X:qܹ̜:11(8xĉG'N4rĈ"XmM#q6l駟k׭'̟?5A) !;;^GOG gɣ_ Sڶi[o =1%:G|o.<ԓt/f)S)a/ 3}!%%5nXA7TS]%L[c~`1!86]Rf{r%.n]%''<4A&D,uoS 84==̇T~XZ8W5,Mw2: 5j8j$ˈ Rmau@\ץ Actei?Z؂WFr^N @q7(Rzx櫏Peegd5,ZAAM€F.z/Z* ZT<}|&ha0 㾌 CFQk޽M9>)v23/:kזQT,-pskA8!+QoȈǎ)..rvs~~BCիSCn0 8W[AP(=T*OJ3BkV=m J\aQGpHZ]<=|}k΄DhaAqF_^PvEd20ZAA<(ZAA&@@FPZ#  (AAF 2"5-jՌFAE[W]5  Pi=Z9;kס]sfkZS}ܶU%Z 2?񧟺w4!?  hmM*gRK޼ys{~eeKd}:yʔ+Ƿlv^{#AA.J[9s?۵:}Κ6klS~t&"""'N|AA~D݁{w`M4E쨨z LQQ)O:zKV/UNÄzV<< NFAj&qB44aaaݍiu1ݻ8:ݻϚ.! "(uz\lmtJX0 8EeCϞpW?{!CM͍b",>5]LCD* ^o$Ъe+F./wvsJZ]7+jC # xoMiaZ`[oEGGPM4:}:m[oխ[٧;\\sa8|1RPTԠqLً^S7lSPTd$TQq\p/4ǚ4(Po~Y@p&*Oeޝ;Ƅƍ;qt+D ftfٖ5)tK5--J`fnq_###2t];+nfZ? - 5#' :3"URVZwBqɌ W_ݾmض}gޫW͛zJwqMo a6_+*8QVF{ֽ[lQGUET{"G li"KkB ^'߻ yr|s'+3폍e_Vٷ/jPGЍ77oC2 ĸըwjի߼yX){3$$]+}[|0a„jO[#h'Bȉrvlii7ԩ~3xa׮]+i/5r/]"?|n޼յkכ7oÇ4 k89ƪ1FYZ,-EG:b)p-njqNN^uN^e2@s‚|dj(3RT.Qōf*bB8pߍ}(9%e¤ʓñLzz;ogoyzznڼ%gӦMϞ?4y k6FFFYʈrmvJ_@u;sr?!">|vR0&;*Ogʟ ̷)s) HDDI"KK"w?v츻ѣ=@]]]_|z>[6qRzQ%TiЋ/W5.O~mG4'uԱ냂e2ׯWZUR˖-Zlٺ5-----m˖-[`ED^^^ԯ k> 4(2dҷU˖flVՇE5jj]q+G-4Vc[0DԵKg.?_"ӷ;ϘID͛7ݧ_{˖%bn߱~}o$m[7a@ZKKWδrW_5ݻg{mݺm)<G{7n >ft'=5%1>N.n &>ws=[CQ g^dJą_dupRū{%'&Q uwf;sᦧQHZ!111~Pի[6o_͑O<ۡ:}̖<<>-)~uw@gUapuސ\M%;h+[_ziymrܹm@aE8.+' 4ve}@$r 0'㾯?Qaa3V\Yk{ejWOd%͛6m޴%K$}PPP 7kv7nlܰa-o޼64aB x{O?>##mZٯOϞQkdhtZ@= ͮ_jdhrad0D m۶;w?v˗/WZehhXl3DrĉCD׭KZϋ p"~̍6L<}(%9ŋ'6uj޽]p˖'I&͝;+R_]r咥K?\y:|ݻE"[.X x^9F4嚙gd:^{Xc"1jxY.cV͌V0_?YNM׭ IOMI+.R׭[ 0qI]cBCؾF ֯:Q㞋۷mq&Jh; IDATwww"zٸcO=6q떙D"SrGlCNNNN.^\Jtt52ښ}7AU=0T˸=L|6!!!999+[w351qpp073ƈd?s ڵo?J6cg|;uB؈Ϟu9%''wd "gX|̌سyXXYošBaAA p8ffVVVߧP(ԝPܹs'N>biӸ*#)ْz.̘>}]KMMBRSRTU{cO'Ǿ~޶z֩T/ UN[[|'' a~+k/]'D` ,ga{!{\=}./S&IRuwu0|c%w©k(84L͍yR*-ug"(Y@*dr r_YέRnEe-&++˭G~^L"a uO2$?/ͣfVV002 ~bP.g}kddMD;cZ0Djdb #-7l_h%ڥdZNц 9c'O+VԨ^O뵵v)))˗.|۷o;]\1&. l-aLlG `-bg 0, [VfK/wtt244>x `킀uT>8vĔIէ1_3?Hg΍=h!Qׯk'kpnn#G ,DÇ_x_|e"KK#._\K. T7('''m0a„IZ+o9"2WyF++˖/]<-5uCPФ C'DWWt(;O.쌋KRRRf BNEVCuD(?4$SعHA)!] QJJʔӉ*p8 Nf(;;Leڦʸ2+ T7)''\qsjiWC;8ԪUHnã&;cǾܸ$qnzphTv7H\OOP Qff2nee5o_.e..ί^bGGGvR$b"HOLJR )I˗/]]]q;2rQQ鿭[Yݧbcc߾}(0, LJJJJJZÿ'^x^c@X,ь]H$3gVP$Vለ7mVƿqod_WA5GE]Wl۱#=====}ێ-Z`_5oǶiiiiii۶mEW_]~Ax0EjŊw4idl۱c7i2]:uIݺ8 ?_VVV97q |۵ >& ̳ļ3~qMpRh}_[#峮D?ԭFu== Sֆ k݊\]]Ex<3irX0vxIaEFB4i W dJbR8::uY"Θ=sp98I k)2 0I,r8T2 ںJ}!#G9j?08\(*2S G" 8\n/auxmr2c2yo3Am Z 2 P"c O`P!3s<ZV5}uB4]C34;o#rTL{G[>}'Nrss~6lPsmhI Ǝ}Qv_%I6l޴͛qՙmZٯOϞk~~u==۴n/4G|[FF r߰~#ǎ:t-26/_޵{7[j`68sƌƍu={޽>Q) {̬~?s9شe ͞;KN &Fmwⴴ4˖ m=0^O?VlܷSgNNNV~ɩ6laMDB_aC[gfn>o޼Zઞad2T*UwGzzz|>_o f4~ >|PHD))ʸM|||5(..+] a.^8{%'ѹd|}G/B>_n |!b|ežl:rԨK(]u[l;c 6u]\\lZ]rr*~ϗ<~/;7o2>52 Nj-tbF ܲeKe|q]:wѽ{ ]vƍk_WZ#jyr#J'JrsjԬ0 2 |2>6.i2QfȾ}@hEӿۿȂE֬K׮]vQryvVqvV&ߣ&TH$&YY&&U~B ;Ą}bOBD ]eKj\K^=gr`J{޺˖.MMIIxf;td%* Q0B#=*FP( K9oΫF޽o ͤ3v  gS A/_닿Fr*Æ 6 P/w52W_;w98<~}(1118$rgoF611!"T?E]x];wg71 ~й 5l8r0@@D=rÇ3߾uuqv''~xI!Úwu9qѣryCfGH={^FD͛68R2lǟ"]x]JM7:~$jkJKO\>!SZ2uP0)؎/v8` 1k"Y>践׭سw/?p`JjꊟlɃG?]\. ٷO˽̟eF/zneٻgݳk]w k2ñqիn/[Rna\|򥋗/]:6VWnjC?|wSR_Ǽ!&L0a{ vTHkk7ou?eR__аwgWFS1<>_O_ 0x\Y` ,4}Zsy|yZQǯ}wP~}U^EyKDjkcl:cD0 0,477{2K$b7aMf(''LQnmzzr q;J .@K("m@[OFJ%DTNu?ua^^oc)))WqrY+2axI!Ṵ́ӫho//eDX;#['%q%Hςbq *J] b&X(K!bh?gqTB@_yVey;ܝ矻oڼM|L*["M|2^RwȰ&3\ڹsWzzFzzΝjL;v}Mywܥ׍7{yW&L0}DDvX(ɷckk-ͻv۳G;,>Gxǯ}9ΪիSRR]u[wRC5-ZL>OFo={\\ެiݻ+pwpy󉨩O~E]3vC6q믿$qĉ 2YmwaMa{ۏj W gF&+U W'1q T*rU-?wwU&ܵapUpouj*@Mwed=usI54 kM%, 5@h$&.8_ 6hзo!j+*]nܴqNrb["̝3۫gCoʌ+uk|մi=3O+vW\ҩc-wM}P$.kdhtZ@h f"kW >bva#p0Js Glmuukּ?y,͘6[D]bjj`/+W[O<)pvۧY8P4Yf=|0˻AD!b3))… LlQiy՝ᬤ\075 ,RXѡvd vh۶x=lurr&u리UbqZjCj?XHEFBCĤ3N䨻;ccc+k;;#\2PSį*" @ 462 9ґQ"j**fL'\]XqnD̸Cj;wrtt*}ulڲa͜>;8R4_5p@rad࿫cX(P,Łe:_x.J ډ?L&VO>d3D SYM;q |۵ >_͉6d೾1'|[ L& jz222Rw_ѯ^$|>F>edA &p`r[ ??7'[|ϺuK.x<]ث0zk@ۊy&+;^FyyuSH% FQ[ffU~2 >s*L.Wdged%"ǐ1_oDblbmblt+Njp\Ve8,`\\ܔIhwn/%W]ťg?P[k(u( Q(4ԣB,(,dQ{CKHHzuo+de8''3?.]';lt`hh32<.޹sGQXWy B⯜is/߃~O|j ,,dE"QWF% s"yk-{dEUeժ(\޴YKXXXѵȟ˗VVƍӷ/q99ڷpP(,1TȁQgU>ܫW 7cF~?.311!"\>qҔ/ ٷ'r_9m0xÇE9m# lܻץS'm8z iSA3d{CBǧzdvGEEΝ:&QÆ'OС= .fʚ4K"~q@ ظÇ#K00G$%%._xq@{U]uWױs1a”"R IDAT SELޗ3k׶/ϝ=[RM|| LLLNv%6ⴴ4˖Аff?̚uRC PhC]9;455-/r"͚Ѳ% }}}Co^ddd0n2:~ظo ; 3:VX㬷oHy6_ۺufk٪%$$ta{0 *֪ͳE" ՠ[7ni''ׯcKy;_cae(''"ƚI`323WJPm=7OwJMMr fLFx<^jjՇN2~„4nؐ׮]{}P0/^={H"ߺm[jՊPQ޿׶u".:ܽ]__~ ߣׄBa^~w& ړa''zujŻ\q%? UvqvK@'18&$~~O?WN=DD8/?X(&$$̟;W6u/d2q߫bAyT*})SJi \i~4pu ;;M[q7|/t5c#B@ HMKvdX2U[]{322222v n֬)lݻ33vԧI4mς>t_^M\"JHxxxBX=(eVX]5nkn¸q U!Cڶk7aܸ^^ӧOڵk)?)4trv4fԨOy/?C;u''ŻȘQ#7.B*-j;*cws=^3+}'7+3/2QϳivR4&u^a6DT0WW==]sRRSS)o k K2|ظ)2Vg\{t_]]k2 }c*GO͏fS.89?̬,/"dO}Qtjb+l$ p) _#@h(NNpm?dH3t  l@r oD]؉2R4УPhnayq#CCիǟ@a֠if#'&&\tV~U!qjpvNetf:! sgN䨻;ccck++{;CC!2 |"<>_O_ 0xŌ|ĻG5MrFO+j8HTPP Bݹ92 &we6s`p  \r9"F rzw޺̷<'Qpx<>bϝ=|(ի~U/3:==d_VlӤn/7o :9nݼiF՝H", Xۻmvʕ.:rwkgop0a &L0a„ >lczahͯ9J:lx[nܰs7n\ y-11Q>**`đ8"mgϞE;qؓ'O֯[Ƕ:y҄<~o؝۷QSƄ &L0a}ΟUfffkV:,D_ W.]>~)]]~W$\Nޗud%en%yI!2 P5筙5畫/ w6|cc+//o).;qKtܙv:a$6cƼwXv&ao#Wp"RH E;LUQ5(2 _ATbK i۶/#>?f~C),Z\dݺuKkYYن9D;;*$cӬlccX6j̎ɰ_/ks3qO袤߂zt%:@ˊyP`F0 M(F`.xdq'+ol*:znqTˬ"3Ȱd8''̹C Ps  ōΟ6;cdzF X 5fGaZ8zy{8@  :uU;~ĩSr§I6dGݸID>ӻ5Od2Yސ7y<^† >s528i ZIPhjy:~=W͟?AD>f>Z玝TV{۷n~xg3gr\~2 ǻ=ǁ , HJJ:r8<|蛄̋qX9z,I,^`UW4@Vw›'a(CD Fh`RrS&W]#b^֥ӫWDL䵨>M[>l ++@ߩ~FEW~ҥX[Y }Ȱ3kd$TMΠ-,,,yu}Ѐ" sEE12*]m%< &L0DG dRIaa+Z_G5 +3RT3Wg+숅25np؁ױ" Hdnnwá*ۘ3͙@D 0 +!DdhdkjjX[[36|ff2nkc+edCyyyFF#|]ި5M"g??`bd7dj$WVpȾZ5kQI߃w6,gLleel#*ļ[2`X+bq2\Jվ_;;9o,5@[zB3'VߑOOU7i\mjΝ 2,>͆7#Úpuou[5'$$##3##sOHHS&6q{gdgdi-g!ݺ}۫n]tzapV Q DTw=wԥS%۾euhז[!%5ζg?dXY0g#_~Eryƍuw?,`R"jܨ2Խk{C- `6y} #8cb_5vA[S[O?۩s9ƠyrE4J\y"˗]*ľCDQdb@DvG:UE2\aSux5mqƍU ׭+Tyz|SuwormڲZ܄<<>=^#۩lQjSdXZoH>Q=%;h-mǧMګws.8~|eÉh7_߹kŋ׬^=klv7n !3f_M6O߾8 335}Qϫ#q5L'^rK֪~\ө jgԩΙ3idv>0 }44$$hFGGG"a֬>{+kyټO.[AK vI g樻;c#ck+K;[[CF*_m}b~K$ф.:0 BTr~ AnyZjBp8SS3==}@  B2 TZ೷ߺm[jՊ*k^0ŋgϞ}52DBnnruv0:Tͱ 7g˗/R鳧ONRliSxB&px˻yCp8 ǻV>ں]vƍKHHpss[j/.rAk%]Z9r :dWإk.]q4Ǘ#P[@m]:9b7(5jk$H,l{QBDRz\>u+]rKݚ7+ֿ]ٳc"{uJΞ93lȐK5N4avm iom:), X`Ds9~ضcg߯iժbkDxXn1qEJmvF,;; &%%'-6ӧ^z-[׮Y_.jݦ j lmmcc_{x$;;D?l@>fff~7x֩iaΟ;7sP6w  MIMefM᣿!O^B f*wpUQz'"{{a&L O2յ:qX5([ZZ֫[KNFe.kOpZzEP @e+'/_[DԵ[ &gچ?__\6i߯}3M|p۶Ϳgff޺}'t_̛I鋤*t.2Z5"-XHϜ;w׭v&oF";pа!aK>w.%%¢C6m[p89fS p8&^ >8!]bWXčN:d` ѭ[-9{¹R,EmZoۆYf~Y۷lzUȾx\Vkuj5jP?t؝{ !":]5Osw0kӪ->,sp~c|ȠCֻEBUgΞ׳K8BDϞ۳7ķ}ݻ8txw^"ЮmelUf Dq֔Iy~Y;:&؉ 5277'leEKD~ݺ Žٳ%-ۻ^fM{ʇʬt"ؿH$216uƉyBj~[S[|;u.g4@μȔF =Zl (Ш֗1&'LOCm _=}433SkZ(]m]ki]mwɓ?O4)dR:1!vmV[7oyF5͛n_5<}{4IKDŽؾ]5}۶&&$L0qÆ '|<\[)흜gggX\d.:0 } d AnyZja*.M]\\j׮}Qaj{z)SOv:cc㜜 *s8܆qqq쌭mnVZ"ڵk bŋgϾCZeFZ0€6oll, VSk(K#;ӭ{" 4hޜ9,pvv~jÆ ^MDӦN7~<[s~#T&Iݑ_ʵwa#˖-[lIlllF]R7mO*u廱c,8x3aܸxէL۵k7aܸ77VQLׯQ͋}-H|>2_p_ƼdVng+zcBy){7@.ˉS˫ ?#Bw=(wʏ;T3hasj{yht#"D`\=̔>;\a#U EvvaN["KHVwN6 iYvv77 IDAT1_gN-qU[#u읒{w{P[C(BIB` M`BI`Wb]n(ڿw ի4smCpq}憗'J]Gs~ڿw N=i~mHMMuQ;P[7v$BEݸID>݋ 60Lc\˯=x`82lސ7oxBbKEW:|7:rDVVӈaCUc  quP%A9ZR݃=#>b̷l{>mW׉i 9MVrr$+v3M0GIH`OnGc~.sgg~ w~p}Җ.$-۶YuRz)ɃGfϜabb|;{":rxX$`!CTɽSPPp.e V9پejE{_[=[yVX+\")0? iQ!lu',,hЀk R@c$"x 㬭ށKֵ7M6دߜ W]^J2l`33S"`䵨)'XX뙷0J`3˙͉q(m^鹅<[WcCf>oo˕LJ333y[LC"H96gA1 0BrlED|x)-H___"ywČJDz…Y3g'u-BpՕCr .yJJ=-ޟw$"+1D3L,fT{;;"JIIU}HuzӓH$DmV[k䔔*wڴjy2wЧDg8Wp[ @0 QhyG>޻7=##=#cwpO6kۺն;e2Y| oV.?y0%5uM ܳ7JDz{;r͉q('_'D0 ]!kjnQ~I?mӥ'qjxP|ZS)[w%dXDԸQn]:۬C\g )voã8%MR) 6,WA(AH I$ EDЫ"jz ݝ4$!$ϓ'ٙ3M~ ԡ዗ 9Z7 y^^c7nX,[8˱vqh؈Qz}g8{imrP~}zpn&evDs7u(^ogS넬[mι>p|%!>ǏF|hEKtzJs?O[T1=3z&LVm/?#"IiE>ݤl޸JP\_}3mJs#URYo|*jFFWjăxOFedkm(TJڣrmjejRg:wF]:t`oN-֫%Kmם>osBnߒ+W- zwO2:8fy+^OQJ|_רuvWD<]]'Ί* _Za ߈*OFOFjʵdcN˗oo|eƟO|p_^_[DD;uDEE:9by?jWM111W}ʕ3nq|}};wP^a7^Okgdǔn[j´>"Ƈcg;njiղq_ TYD^`Tbcc+ 9sբyt..##b.-p㾙`jǞlB;uPyX<\q:uVQ4ߣ/GݷyXJGz+E=:I)i,fx\yU*jȅ}Ud}x^_8{jn?Ǝ.ը<oCeIMGs]ޕ\Իswu s1P"u^:cnsA.dDOF?Ӻ?Wz͞WG7`?2Ǝ]2oT(LGk᝛ܪ(a4:y{yMήfY@ 7_ iy~6^}{Lf7s@0\ %*bʹfZ3zGF`4f[Fi(V{sq-JMI<{ښa0r`t-%}5j篿Fg.8vڵԔ䤢ޝ`\/Gm6^mlݼY3ٺmuG^TU\޵d8OiȸfWTvcp{ٺXf\=rDӉѣG|AJ\$W+"Rf_fLwwHJJrww3̛=Dmt}27bؐ:2jwn&[UVuIU+W:uff7_o4+"Ǡ^۶cvJUf!!Nl 5;nWƘ?1cF\llZƍ_{Ef}׫WJNNk/+"v[ܬiӏF2͹vwjW36jZjLHS " sժU{^>0atȪev۷aO?s VZ"RfMr`~-լox'Mrl|Ϟ=/9"ƍG-9cơC/\c˗/k ϛw,ZcǎL˩S8n/w}Gͼ3͞9uk՜9{F b:ocwѢeKYf3E䣏>jӺt~HXhs='"k׭6e2~-[:6>f__yoߙ3fh W\iAAA"i}WbEy<Æ V2wd25 Y~vrT~?vZz&"6}u?--]-7˺3g~ͷ-}yպ84`!^ߢy+7{lݖ8w |Ł"Ҡ?YtF;7{ߴիA*yg Dj. ?p0B׷^ɫh[6ojԯ߽km#esŔnژ-[ɿB%;uZr*U-\YѶ]/&ONHHPUu=cǍߎ8qɓ'^""Yk1iiiˎ :\xQ 媪vi\;KUՒ?Z3^u@߾6uŪWR/ٸiw]]]׬[u 뜹zDd qqqnjsem9r0OOOمG4\Df~݆۷˿O6=ww[_xCEdMƍ:k{tnXVɓcF~$"]qSvm#[k:/{ٽk{ᆱ->>>Ν^DFFjk-O?r UI&ED~ ܒ?H]  <{V{8g *dkk7pg3Y':D=v;w8|(ޟ ~}yFvú ysp*U%>ΛB׮ѽ\kA^^"ң{vÀҋ/zxXD7lڤ-ܷ[yyyj1jL)ѭn][-[͡Gߺk۵og9|8luzӦmOƏ"2a8G]=ZDF-Ivl6_xqbMSNO>XmZ =z#GӧO:UDb~\Ahpܹk'"Ϝ _"222%5UD OH˹[?Ѩ#]Hbbv'kcookZ?vXKW"䔑q3;{tnXVױ9{WZ !;ZRDZJڴnݱ}ǟ|ѠaÆ 6ԖL0aĉ֭_;׿C= //_^[bϞτ z{w۴i-ϫrdlNN1F ?d3)My{{EEG|E:iOOϘXvLLlY/XIMxs+Wo,ۉ)ݣWn611͡lvݺ=uI׬[S;p_~OCTe];wriӛn=?ݳW/Glk0~{D:ԻOGkӖ-OX~}HӦS;vwU^w{xKH7qqqs,t4{QEKBcbbRRS;{{y ?x? ?4,<11111qi4K-oٌO>ޮm6&MڴnצaGMC9]aW;^D?HRs/\qbiݲ_ڴ^6bh^'N^G'l5Ukcm6cull= >v/(Z=&=;\Կ3D/ry3gZj{yQcľ"RbU b4?8ϝ?7&~:d>773Z^yNYz  AUtR @juP_r5..niXCctJ09!(YEEdJOV/j2cbbEܡ+7fx:w蔨aGFɢ\\LGG4yٕ⸔l*cv72jŬyӐMC9: =H`0:9;o]6lw*yX<\q:u""ZTߣ/GݷyXJez+b6 gޝOL(UEX^D +X5S`hcs/tDUݶsgLLW&p쨑";頻:unnn9+"YΎg]GkUUî?슍+L>DxV6mi~NIIɶ*Q%mݶ}IX({u?d2pCntܡmO=Y̧Y"ϛ=?-[qyzo6o@p0Ou(rVu"rZڒv`F  -[.^4~^:>^D|}|no,k)4|WN?_=_n]lbٿow~q֧?(gLl씉{yyfm5lqdff>ިNR\uU)K3O蘘Ͳ*`ϜδZ_}}EDQݮ( v,11YR,X3MO=xs/vĊU,^Jq|v b[灘GH!"lYRrrZZگ4eRsD;E$9HLLL>Ѩl޲ڵklz66̡ݳ"b6gff._*8t855uշvt6k*"KBSRRB× LUX!Z"b4:w!>rt֭ߥyf..1!ǧ믽@nM/Fykp\jTTL;uꔏO蘘o-"EQvOc tqԩ,Z|))"Nsy^mm>ȧA}0tȲ+BÖ}C ܥ(dk_So>z`F|뛵ܹrq1=ז#E땛m˗*V("/^,弽m.]i>qܘ.]:Λ.../鯭2iiלE$111c9r/^ ua>HWU+򎪪Gͷ̚3 [@kּ={m2}̗xҊU~s4y9D>ڣj~ܹ *{U?h_̙;|?D.|?wc_LZzd2QQы/uvO5k׵mʕs/9?5{܁pss]|ez ڍ6L:w Wgܥٚ9 [e5%៌X8ijtLt`@`_jV6˵eͶof)aKf{U:[8a#Da:vh%ߡ} MVy~ .bW^^m۴:AmU}f̚rZOv:t$c9mZ=6-=sZ| 4}ߥǖ;U{̴<ӢU N3UtU1pʆ`X9!(a)(X''Sz5 nlQR,'uT%Nsq19l2Sp˜MfWCtȽF+WnܰN~""w|;~sߣ/GݷyX(\ޕLAqwu s1? \$%(啞NAq69bykx-b6L&>ztJ^lK(SpפJy'#P8ٚdkl 䑭y3#PT[l 5@@J  [dkl l 5@pZ mRU[l 5@@ [ [N%[l 5P R05% [+[fFp55@ [dkdkl JU@!![dkl J%[l 5P R05% [ [dkl ;`F6yk5@rdk5@ [dkdkl ܥT5P8 [0[*E #[Sl 55of '[ [dkl l l 5@@.TQ@ [dkl 䕭UJ@@Z͌@dkJ5@@ [ [w$[R9o 5@ [dkl l 3UT5P8 [1[(l l 55PZB!@dkJ5@pZ]e p o!*"i6RW闑A$[W1lFʂə.%U1 [pXqo;99PIU322]N'Ug,(l]>ܖrOK C 8?= [>%r\(dkl 5\dka9"Lk5`4 Ղ jꝜ>Wz)gO[32 ق䝭Uf+i)ɥ0}9jz=)xAWk׫bZKZ3=Jj'~=aQ dkIII..WK33,IIInݺum4D흝'[ZjO27@~;1eʗ\J>y)S2{ﭡ ZN>Ŕ/~^z aMCۇl psEy:4l ݻ>"#w5,l!:vsf1bXPPn{ կ/"~o1H΅ ,\tq^nAX,"Ҷ]|ŊĪUzA"bBCw!55k.;tx۶6h+Lb|PU{}_>nmٲuܹ?xTJL#Gy0O?us^/t#h~iӵW (YvWq0E݃#WcӐ&zn1#>{^ڡCG7~mɓ>ߥwrqqIMMջcv)wŠJYW|4boN̷(9t&FB×GDNII8t$,|yghS}^5f]='S?z_<--d2NQQ1Ӧtl?ێw##̙_|ɜH'T\i+.^r\R 5>ߨ@ * 8`ҰS)׹SGm;_?_Ll׶5Cۮm봴Ǥ?FZh(2q1ݺvsB?~56:n̴<ӢUۋϔ-_U1  ɋ^/ykԒq-C-KOl w?"u6K昘E+ )hAF:oҝ&MfWCt:)`Ane*%559]S"їŨUBA ^\ie$[UU&]\Z'nQAA y/#Qb0Ka:]]]fBAn Bȑ&E\fT/t DȝNQD&JD 5@rvMT:UݮSUUvOdnjurpڵ֤k6fcNp9!tyklv9q &JV6=nW]mQܩp.W:S3z4HQZ}-Nx2A*l/IENDB`kildclient-3.2.0/doc/C/images/we_macro_edit.png0000644000175000017500000005001213215302470016255 00000000000000PNG  IHDRj7͉ pHYsktIME .%tEXtCommentCreated with GIMPW IDATxw|Eg].R4қRTU@]* Ht. "==ޓreR w3g*^kjD6jE^{lXG8qxa6 WNQF+c@̄z?"3&O_t+1sFTqߞxBbJv`w$R)A8|"CHj$Yr3ҲE=z=$5+Gla1K\˜<,BY c;_3;fyBf_NaA-@A9;&;A≈ 'q>nw6!!<?1 bN<&ΗX\/)HQ{+XcJ$JA%>{S(|3\h4*'X3WL5*w1p3wb ʑ+(G>gu޴ GEX@)BchW0].aEȤW'q>!^$|z&`!Z|B9Ep$ɎR*RcɜOal-((JjP~~+ʓO!(M,\qs'G}H5e<$(yuT-lq *kL+[cUrӓE.@o6h4FT&W*bV( (6Sf3MFQ*) `1 B!ws$"-JBf3FQ&W(J`6 \rT" 'Evѽ'蘝άII?:S'R{޼E&ȱb^]2xƘ84=rkܭߓ.{)I nvb+׆S,01Ee8DםAݘo$sBNL\L7'aB[ )O:vﱣczǩM8Uczu.;*չ1\vG.ʡG`gS7tvU tc lbE+r eo! PYA ԉ%x\nX324mj(-Zm~~~R%'''8$jܹ}G뫕H$v^fVVfHh_u~c }ח#;Viz衇$xI&X-ik׮lڼd2Z-а7nj|%È-$;BRoꅅ!z>mEC hڨᙳgzt?sK3'|{w8p@P̚5.Iޭ8,,쭷~#˖_|l6ۯn]Θ9s޽YYYgU/[ƍ= :V9 QR.sNȱ?1"=ngp2%{'[Uc ð%Lf(2wr:&L:P(jtӑ3ؔ?Ea)#<__Z+Q8Ek'3`隸*NDfϗd%EE/ZH&٬~XRRdUjM~~fcO!bŊwg^z5"O>!:|FE]jؓgQÇ]z5))y}AyoZQl߾}GP2m+[,ݻ Jͦݼc2d'֭YɞsNR1+Y EI~E?`?`uwnO֬YC[ju֭/\q2~;wBW~s?CNkV^@B<|*Z5:[XKGd)L΄}% uDff2Lfl7~IaE˖/O\ll2&jfrg/_ǎqk}w;H*u$de zZ^2ʓd_|^vǺzÇˍ_=}ꝝ[RYƍom2-tT˱#G*,;ng6%)ސX&LP۹#&i„ v~$99w…gzjC/0&9)rҥ'L(IKIwf,dP/4qccbb*ؐBuWGK#'l"z\l+&tq=XF*gGquSo|dh* "#J+2,{xM8l]!ka [@bk !!b4fl6L&qݥ&&$$ٷ!b6d2LlIJR5k:uxƵMoڼEO/h|= I2LXpw-_n2'h4] kQ#Gߗ/[:lCwyExBC- AVԹ~[UqQZ.afk6zu$SwW|`nݻ[v[¸Gqjэc\R\VK8΀`sbR LM"|f5::w6=νLbG[bo172w:t;!y%3Ul.J5"!xZd2J||d2Z̦_zaM7f!2^TgIڣd*Uy$fLȽ;B w5nάwO.zJ%*[;eRRS}|4N;z|}!5yJ*5r\&O*O YYY[ dJ"vP6 K3!|N<*q hs=)u:Fu1&FRӳ"s8S>T/^hu: E9ʼn"DBQ:Rx)FR 3AR{? E N K*志b*eRIb=ɔd,-z~pJŋj:0N%EY6Ӵ7z_v\ONIJǺtٸaVeHXЩ!7BH*Cd2yQa/9!akR[}DF^0jEwbGD&% _BHIQ?5)!$Hr859!T?<2-9D"rɔmZYw)hx$|%,*:%]̦-}\<ľ-Cs.÷ w*x X"=9 4R@1qA\nxgv"rd%VjMIIQ-Z0MjRD.K8ܮm 8uj&_VZd`4m۶ApWY$-5%rlFnɔظXԶM ]RI`P.vOֹ:?ivc=9;};vR},/T`+$cc~0Qa f,JݯLL΂rpf%-kسc#񼈈JV _ ^먧[!3A hڴixx{ǧD" aHhFffAA#k-֭Tn#oEKuX_]qaXW7e_Ҭ Iq_~a0!onk:b-ۢcQ¡U@"|rWS֣"U @2?ٸr؍p+sQjִČI#"#"}4>))z}rJ mt:T=L&EFFhRRS31!D> 2NN"""4>>)IIISش=ܼ~$1X|???Ftl̝:xV C_ m>7v 1&4D8V؆g[1Fmΐ,o88*Ї/b<ʶ7IXauiBcr)G-{+b ' Q/M$6\\\\j0XLR*5L&t Y/{$fE&*t$R!B{Q;ݒTb0,T*S*Z&%IxeDD=hV"y.'TGU-TO[1[iV[aJ{XVdWMM^<JFDIO:/+A8=0{ӖܷBj"ɐK }Ly[ |1 A:5!?cڒa8K}ʶ:=/p'T O+Z| |>da1+ꪀp&M!v(#/6y87 )F _qy3 Dqʼn(s%dz]T~M䲒*voi.PR;v+~Y.[J8.#-G" pivj:JYu]8F's["4UT((B#D||%^QM䅁N+[8jg Ҫ֛upo(n%(z$PD\ p,:긙fQf:R0f?J9؄ҶˮJ(3h*)+rۺC1 K#pkuUXE\VbbiqfNNRYb4ˤ"a]S-W(!WE|c3F}8<.13,Wv)lQ'B;C"vӥaNŒ!q7qC"bne1=Ȯ[12I0E$ڬ_a&\ #|)DPN6ݔcM!Oƌ;z| sf,+ O7fo+j3YjY>;1jO@XEJuۺdQgI\3iWU2s؝fv0檦\ME}DL-\f+oA:*ҟB p>j$i&V,B yUSn8k"́H4:y['^=X\JEĴ+Qd< jබ8IHX 3Kz97޺>\aZY.;Y0̕;nF="u׈QVW9NPPhoozYU?p=D4k#.G)dV5kX NmgJRl EcY]F︌e{dT926bciY.ӟ W+h׫ dK!B %.kDnmw@8kP;- RaOy0=5bE9rÅ0oa_35bW%,HUcMy1~ĥy>$mL9(aTܕ(l3 ^kP=^Z 8&89a: 鹚0RBFB" \G84hIE(3D|\}"ݾDK晰* zdg H&G]ܖ ¼ʭ?d^hdv`z-K+$zrBF5Tw )]˸Ǩ|p--X@\ŎH c IDATkHig N+YhD g 24tiSOGͻ{ D*b. DZ-7RP}WēyZBxFAA׮5m$8(XbY#ILLjݶ]FT*~3JKKe23';R4IeȨ(V Vu-"FL\Qj5xjJͤt HAX(˳zz̙..}@P›e}|gΜ<r"+ 0e =Rx-[Xۿ~~~y:nܸ_->>JrΜ٭[FBv?3fLW*pcꭟ}OFGEkcN}ٽ{]AAA7o{ƍ[lyvv;w_|p7/_waXoN?\!x40PsJtqCƎ{ᢢ"G/7lh׶Bh4/yqƩ޽z /D8qb̙aaa>>>S&O5O%/JD{vO4͛6m}6-EcD2wL{Ș8q"BBO"TɰHʐ!CN6`@˲eƌya޼5MqqС *88xep%}*_|a-vѨJezzUGտs+WLLLX,[t3yO>|7ܰ%Kt߄va4cjѢz><<|رp?`|"\'6RE&j>ѝwz~J.Í*d:4vqXmfM%w25) +),.fyK:DȎ+=<5 n<PLFgC+«ճVPdgfj}!+3SPeffJҠPB1b42ӳ23t:Qak|jjD@~{?ٛTuHN5j?"H*7g!@Md6*q]{ }zǕQcnUsiZ3<*TA' }5J%hEH+0qTc쩜ZIx%>$JDZ,W _/A9W-aBw r%[A+E]b+ߞQ+`{^Z/rLMoVe^Q"+;@E4OXeV֤ @ >0J+PgV"PlO>:#VAfZ7`Au)j撷ދ'KRXub`BFG)2*eyYYkѲ/,{ xJAAW4jrHJa)%aS;T;ڶkװQc F@2kWC2idTV{xV}?Q;dBҨj@EEV4L8zmMP* xQS !!Jgk8y򔘘juG >]駟͚Nͫ'% t@9YA'|:޼͚ٳgq 򳕆RCQaш# eQyy{ JzPZ_9c-]JOϘ2uBB kּѽ{˱'OwUv=lݜrM6Y/X7 "O>Rl9/nҤqHHȒx{~/6|srrPܟ)k)޵˽+>}6k\*n۶gϞg{ÆfN~ |wz-> &tM*.Xpw1,Yק7hॗ^:t_iEg}m挻wԫW3_{ Pqp^NvFfy1'N_?R~^V@Md2tdFxH0J)..:|+s L8zW{cW? "^O }hvK! U vW@;@iR@@>Ox*NLu~]!U $5ҟc^Xdizzz՜zfEYQ=oKj&TQ\8s(qǏVf*|:ڑ ]@"DZ{>}}} {~&9z$;;#ᇒ.]2yRD]|ym#]wOrD.OJbbÇ [o٪eKQ6w9d.YřvE%OK8[Fe|k62m%WF. ,/|Za@ϟ'T="卷ԤOY 8аaC{ܕ+~#!Gl_}jڵg+G w˖޸sG=b?K/]kN;[vR?w~ᢅӦLs}4n]OLL\٧+?4>>~icLDȡC^t6~vFGk4˱˗}4(7^Vsrsl1c>ӜM79rbs mrx]Ų3ڙKs0p֌r+aK s~VB. ,ǍݴybZ,6o8eZa@iPСA8AS'M?Oa)!ן_$윜3fp8紩SCBJAܹ}Rߞ8vu~Q 8yj%=zt,U^պuk\V_xaŋ?:tr tw9Pܕ;8B,(&u'N3'mb3gN4-?Ϝ=;i gΞu–?ɓ4>>&Lฐ޽{<}v9yt޽#r"eu̘1*{aQDr mrx]Ų3MxIpΖQ.a?2l)a+ZaÆ7>~}׮mzNbs31r:ji ¥Npp{FF3Qٸb !9߳wV4qbǎ ( }R=ڳgϦMr6,,YӦg׮OMg};޽[TT(!c[rFpͷzk)F[J E0&srr W/LH99AivnrglgѽΝ_.]4c+gWAѭfٳp|Bys2^4%=OK8GF9Ȉ+ZB{lǎq9l(6rO5ok )88x!!!.~7n ˖-{}|4C8x_m ~rܳT}'#GxYd̘݉Mh4M|w &===""g\.7 !}"tzA4 ̠4}TT$ h4:u駟 "th#!ݲYb 涷ag㵳iS3pM6oq g rرo93yXe{䢠hC}rguIII9!>??䓤Dłs8:~|ڤ$9x/]?v'uG-[y694ˍqfΘy?X 4Ͽ ޱC6mj׶-B]v[mء[жm|jv}a?/<^6mu:tȹs8n[Ç=i景.Hte >l|m?>a3sq FøsM6f!ԦukQHHyzPs!rXřxlE.$D\R˜tĉn۾p|4098[<+COZmuΏx?/?P.dffPxm?RYd뿈OJS jl6O5l܄BaJtM(q:Me)99CǎʎR3֓Y$˙=wޭ/g-랽LҸ4ta#A1[n0q򄉓ln2Na+3F~aEfk׺UEHG+:"|Ν?֥yƃqKvyӖ͛]302%rɴxNwj~&j۴lH?pzڵZzs#BFI{w)۵nᇧL#$lx1YYTʃluڽ[׿l6G _&''!tp>ᤤW,p򄄄ohm[6onƯh燏~֬w~<~ę_~q<9$ gϞwظO>ޜَ~DZ/ҥ/On'% 5~͛78qĉׯ[0#=y{֬fHOO^-bsDȆEy)/ ;V˅ zm&B>_8ߨat`.0P0:… /gNxy|XhF7%^INJ^?ov'M R(?w=x?shEaaa[C - uς˗GS^ؾmwncG`Ѣzi8ryG;xВ7z~ܑsDE9rJRվgx@m?~RIIq!Ey̯=wٳzaakWzaaem!B7QܿWu({tt 0 T*`wߴqaڶm+伎;A׻\\.wnR68"d=rDV-#[=pFFgE]6)N~~؋.^vH$yy~~~AAiȈGc:]^JMt:7F@XXXbbBӦB .55|ߔx=;FjOC||| 6"T(rKʴW_c/Zmaaa֭yDAL߻>ā}{ݺ{lٲ5==xV?u윭۶=6b+8h⅋z^_pAE2^zڷwkE0pТ -?` N[i %%%IIs}7[%%%ZZNII,xlDI-BHP癳g{ҽ[׳g"Dxyf ->ՠ@ޛ7o؈.]ܠAwywΜCq&jfjdT3{{On*n;po}zP3_{I&߷offj+K6G2}k?˗hlavy bYk܅'<7x(ݛc2=|(::Jg % W_z_IalOIjeTXP,SV-).V(pPR\,v5u?`rEZr"u%'*䂍1Ϛ>-U*6Vk4b'wuBHIqqJb>-OT@)n .HIR3ӡa6JB.;tQ#pr\.{xB@kp'<-O0@@6z'K } }%Fy $0>@I! X2? !l6ydRpjIߧb7h4l~ZLFT >{l NՆ-[[tjjѲ S=ꅗDmO)qEHRPPئCd44l$.梿c+h7gQK@Dߧb-((Ш5Y\kOzjԤ@҄{'LP)!،FfC쭽Fq_!4>h$9C/}ycǿϏ4pP^okׯ[V-[L|yVN٬ cB{lIDATF94m#ǎ9sS^zQP ,]oD>x2q`>?`hcc{o/ֵkfm>ݻի֬Zw˖,^lijZߺSׯ_U~lZv?zxZ~ŲK/x ^6*Þ5{=^z1}jAgμkAѣF_xQ7_}w' Ɔ,:$N? !?sϞ=}}e}du6h*рXs׎"erD{}BECCrrsBB(++{v[cL uLCQ>[_lr'O}b˗ׯ߀ZxqTx" }L!v:sZ*)-2m[FFF/䬟wy;8(%B]@=`zFkr<$6m,!!scb.dl:ݻWg4U*B޼e㡝vܵ=wϞ6oMIMX,IIk}A. %)o}bmǎu朹!7~ج =o1/sk6ϓ&Nz׮s/jbV.%3O?)j5a† B8`׻ޝD"+WB!Ĩ Bᄻ)V׿lO?x>5 !$J~ƾt֭v4Ga#&::J&AnDZ@1FBrh0X悼;>u3};6* L!t.IQZ矿4Z\yO?+/+fKBhOZMQ'PIQon^ߴ1,Bad2[UZDˆ?--ǟ~H_h'PO$e[ŒZjP^O?y  UUr 6}O3Z?L 'RhTJ3$ $kb*R$( Y VPPFH=!DL'~y = Jn+[ "DOa~J $ @;@r"D:} \? ">@40qD#%@8bB'OB`'x { "!'@0x P% 'xh} $ '|'`[$0',' P 'T W@ QGʌ8RPXԪ];CIq]Ȑ膍^ؓv\)Eo{X6*hB֢BS]0Bt1|+bOVXXQ Bj>R P'u%!d!bF_5"؈dZmu%Cl6@lij1 t!>@N @]*W-Ν;u ?#h=11iӦNn׮m]ggoߙ4r䈧zַT$/ 'u^>I%U޻wo_{mfV-\rK7va>I*j9wкufL%88R`?]f˕?V~ڲeKTTƌKL29((X.ΝO??~$yc'edd֫6rİxKq5.3]oZ`FԕR*RԅKxoV*ef%>1Ou"C£O8-$%I`H(XyHdu\.l-dh`u " d $(RUWT%@kY$,1FK2DTK<k:iFlckTkToknF"EʋnU(U.SWb33au 3+ ãj#DjJY!-a7DS\Rd6mچ@˗cd*2"BD]NRd*,$w|^1-7J}$\=!@UX\T[3D  b0ʏ Y[25r)汔0ƾ~2\`4kk( FRp"N#$ZCEBb$1BjJT񷘢(+H(,\pI K8A'> @!"6iY)mbfQ6,U|mK֧ ,'B6b`_7f!- '|PӓC Ob#6 "0bu5VCw n U7wsr?9?DtLYt_IENDB`kildclient-3.2.0/doc/C/images/we_trigger_highlight.png0000644000175000017500000007706613215302470017663 00000000000000PNG  IHDR@Rd pHYsktIME /EtEXtCommentCreated with GIMPW IDATx]w|?,$QF*{Bޅ-d $@+ao(P.{ϲgrv![D|IsB?Z!t(p8#( R^DJDPDT.i"Ȟ )GגCKA"۩˹ bt+,MɫDKZ'#*V,ǔ' j4[k1 bV|@#!ߔ ,u¬1p+wep <0JXd@!AH/xC t΀CS{ a ϬZ Jeed }xk C9ȇyP \C:|p~S<<2 2Vk_`aF6vF "\p"pQ,HKADdb""5A C%+˃"r$ -"; # ڱ} _dD= ! A? B6 !e- B'!B,ڭ@hA@NN_vv_EJ\A(:P_|9ِcIDVE 1Ar8 XxF)/ZQ %E0|maN4PpFe/CW=Bdf2CǭVbQJeZvZRT2LՉbX(T*Պ1JRd2lHsqjZ Z6-fST*R&G *Q8׳ЩKv7.50dͷqqǎ*{p+VOG E%v] 1X70ͩ.!L,t<+ D(!{aY`A!BdG9~.^L̆BbWr ed2$z^R0 \Ĥ$B(`h0EJOOb/ᰳ6sÑf;'NŇ RU!K=Tq Y((XAH+-]DD))!lH@ ؟$_! bА0=%3jMIMS\lDA<<=4UTH^;FRbjp82 ['~ϟk٢"#D|iٶmӶt(b>PE "b AtJ!UTx#E%e|POcPc TЩ"s`o7 E/nOHLC`1mVb6#ZZBbnhݑTj5ȭzbǮ651HNNY&\P@+A@ڵ$R 7mЩ˺Zjy`.]:G1sN >px"@7Y-؜ P@..3לN@LnXN9胆T\+@I^db ЧD"(-4ӗ=QTr 0y P9T*srr!G+qss)IIJ)Q999t\rrrZQͷYDaVXID4"1aJJ ]? 7[i._<*꧟g\v=z۷[.@>{>卉Q3+nIi 0`G"(s |@VcatPd p4Hzt(pzA%  iTzzhl6kRRbAAf%sA~bBf24H(!G|;vl'C,iDX8#ݔCi_;zlVeU6n믉"Liqqq5k?~ݻBE-is}7_VA F=s,[ӣ{~!Οxa6iۦ.]Do1ݻw׷sǎ۹SȥjMfef~3}zΝG ~ BxĉCkӶ'ٽزy $lbAĬ={őoqfFӾЮsǹ7uJۣ:WI6:'|!ŠWJ,FXxTX48 + J=;2E|@qvY8=XNdz+8Z(Bbxq q~@)8!R ϫ-8,Ba1[0mҥ]A~>fY?cyfZTJUvVpxQb%v?[x={@'%Ӎr- 8ÑM)qm'O}ZVMقCh33Mk"g_9>}vBL.?{?\Ѿcs/nd.\=/]ϙ3̨g?ooӖ߇rV/^d}JAiAm\ pE0){N:y{{Er hYP.Jz-[L5ܠޙ} (wnۼg)جc3&7;E{rʒ0 ḏcdhu֜s rGjJ"G8#ZWuhh?z:vd$R?N;#e-":߉/^>cg.f4 qoEQt'M#и{SLiݲ?D1cFѪEK$zyyݫҷ/GMЭ{\ y"{"\ 1g\ +Y>A? - "4JȀBgשPH \Đ{ȠnfLnt7n4( SSRj7͵7: c̦\.7jڍ*7b9bQi]i \.coBh&"\.7轕ko4Ql6[b|՜@ƠS]sNTw:g^tu8]\lbE2wwwGh=<(p8rs *'57 ?3)!PrqRt@QKZɓ .drOOJ !ɶZ̴ 4V'G~^.Vhu$c_3H܇/=5 Ad:wwRxA~j-R51Op ۄ?a5p,ý ŏJctE )9o4ሏ~Z|;fl!ɕJ%T޾s7nX9P..`w8o\VcWrj7nܨrL)[4$N :͚YȥW.m<}Nlٹy˖oӆBAQʎ OxBQmF&ըYsپ>.}҆[l%~㏮]C^&a9kRfW9.AT,2BnRaH7W Z**5%Yl`SnppB"aLJ`__B%b }ui:1~!(*R\|22TWX/^载kծt r%ORSSsrr H Ѩ޺ˌ= b2@P,q/ t.zK]pdli n6 Q@m b~\)]E)ʚxX2=Щ0)?(KcΌP i SKS*5mWXhACF Wd&&/By4<&t\`[@R^`]rK?B?"F!"BmYUJ)74CDPE\`a"sB@@:Fqh32A ,_"zȏ ]AW)a@!_ \VpYɜ9ZĹԇ*!6'́4b[Fq/R_= cBvIɿiZgw !CYEXE39@)L?zuY;ŝ]Kt ŲG_tiz\ ɪӺ_S'2ɚE)ZZN|K2j\y8񑧣 .tD e ~&3X;-އIUd<&iU;IQ7,c}@a>zpt\A'ŻIs-0acLyKL2/Kp `);!UU< ()!1_ dx@,o6'O- Y;~"p=Q, aeW8#0 3`vs#*߈` a<: % g,G"t %/ )I8t1Y>:%q)+(k#%bޫrucDMx LVFB gd*,̈1: a ;_z1BgHj+X̵FR#, |BW@ 6~=3wX Box(ti<mdİ|0h9uDI`tٗ[f xnMsڨĜ:+5S !@7kmjo7 BEe.!]A~t ]p+߉ldNX>D^o'A&ftad[ËFف 28#f"a9'`fu#lc y!L~.,Y7 [s ]0,v{7r/G\#@D30SⰣ-ba! `ُ揄AvȂtːFV|?0ݸzmVy|3] // 1&J@ ]".@a9PŠ(-:5)섑F5-Y!J[hiÿYfʜ8е|,7 E0zެlXQ j10 2N5e'5cKiF ߙu(|9!BުxA^E- )nR.d[uc\gqCX!H$4Q`t7H8!nnn#\mfUuտs79oמYSN9EMcTLaA#.ugϝu~K]&54A^Yys' s zLuA1FPp. *nb8n2eԩJlTŢR׬ܱ'O$8tCzȍlq0,82ol_# J|!\2򦏂GJ(N?,S*AP! b#aX"B[hESsDX,rTj3Z:w\nݻ 0K.aaaϞ=%|횵 qٳf-ZN }@֮mt@Am߿&S.0(O>}z _a6 ZY?G3g2-Gq!|Cb1[]!!;t?nܓOĄv}̙f]zA)o 6v<8'`T9Cp$͠UP #v_^ XRh,~QE##a^^_%",6/77Ϲp_K/- _g-۷ݸq}6mt8V-Z\qxYBq9kZhQҥy'b5Ϟ=[rŊ+?yvZHb۶n~z-[1l)⅋oѢżm[l~zxx֭[v+4AKW | G>z*v ?:\C1:Gk+ Q[Z7 {8pp 9ٹF17'nw87 ^9iS>zw?SLӹM>F)_N9rO̞={N&Mt)n^T3-:*ՠA>|Hhۻw/mĉ'O&I,7\F2 IWY$*r?IIz!o 2q18p \8˾nwܹdBZR ܹkWu5:]ڵwYJRINBFcBBbժU Fz8߼y!~͛?_jDI^L\e2& tŕK~ad T L&S(Ž̴~g$Nz3/^OۯLKy6lhִ)if6lysSNiiii:u3o_`6铧+)7ig9/?lO/٧B` 5+q*SŮADS_S\Ԭs`e "C fO,=zƀ֪Ɲ@׷ Af̘4LU|,""i6}oٲ|L裲 ,jܸq: > :?D;f̧,#i0ھ"2䧟HmcqXiJAKzɖqܽ1F;V5 33{-[11P_8{~zz߮ MNe0CRK%?"fwJ(@e >~ kıf\`rE~c~:)eC̔g c;Y6cc2浍KU Q܀8Yc6nv A"2oCÚP(|} wlڱcq'VeǟF2W"`I%E V,,9\gR6Yͼ0W>RyTpحVJF7]D$v|7˭.!ˁr:n׮G.wz]ȗUP d2߽{޻Ww6K9#3^ǭ k٬Rժ[wv&kvyrh+7I9ҥK#GH@ڭ1cp8:t0axqF+<== 5xȐ˗{yyQ VZuI@ǎûzBًbU(Z./ Ann{q4sBX۷e̬5jL2XBiӦnjҤIjj{```zza6n`0~1#&:K`5 KSñ~Æ#G 2$4$b#-;y$&7˪ iڴ)[۷mx-$oD:0v̙Ν:v,]tɒe6m$i۷k~"u$:| 𡃇$B6n%#,xMںvr6TJH=?}vzyF{~^.8ǂQN?\2۶6ktQx8sΛnΛ;gþf5y& 7o|A3\HJ0_")ô~QF͚=d2[faˢG޽6nذa::z53ݲu˝۷ΝvMLzZZ*dӦM Q˖-Yqe̗UgcDEEaZ6axfBx =w|͚5 FhQƹHa Fh6cۿ!gΞة?l?~"lbĉaǎgVN5v #IIIğ coN^Cs_??Z#"|'Ot}ghz6kz- ? !7oj֬Zj̗2qJ*iuƗB;V'N ">AרQVͿw{&MT.@p*҉}ȑ.]:uJv9rH۶m.B*U2Ldp"N:Oi߾͛7Ǐϟd":r>3gARV\y޽utjڽ{wppRQ+X3g 6~jYObb%)|Uܹ_~Vum_}5 q$O?ѱcCGΝO8A\],*=ݔnZ,cǎd*pB֭N:1s%o~e:'»u2H&SL^(;/XRꂅ 2y\\UfvϞ=,Xk۟={>s,ff͚m޼{7oi֬)Zjt)_PFVSRR.\LtdҤeˢJV!;v _eiiuVFFfn]{gϞ3JK\f!.sACJΝ###hܸIv{D ŋ4jԈyiSN#!C\jm۶CV_OX,C)Y <82rQ ~ĪjݺuF$YX؄+W矴hHNvVjJrWֽŇSe߾}cƌuy޽Vm zQEQݎv"DTLw!}aH"k`,eF_?٫s>|ZTN=~bEvL!P-Gt: DNdzb8ֽ &M4ZQ c.(ؾmKN+Tvwݔ2\&''8~4RBJKxJ"k'HNVVjj2|k7-8dg&Ǿ]NPPZXqq?\9ӳ|׼DId}$@t SvȤ1ywݓDI*4 ħNRz\`X\.Wnnƍ-U$"-z$HeȢT,|9DEBhU7M$ Oի_S @NNԬQhqd8$ߨqjkI0 TqF(RD.W$" R\[.U>~@ ,SEBEPX`6n>~^zb׽LSjjA~MEI^h4F:h4nMj.ayy5jթN=j1d[-fNWz5jsm׽=>wZʂ*lTT"n5iwYdvbQW/y{vc}ћwbjP q<.2G EZ0#3qb614ߩ-(!L{;竕 aQр"vǎjo7hs-Ѹq/ãGHz~ظqѣG үQQO:rbLuƍ+Wyyy <{n]mwp8ڷo7n8t30Gƍl]&i}=>#rIAGuSYnsoH\!!J]Ђ<᭣pCTX-VCZu&BTJf#SRRƏ;ñr׹zaѣGV~Iw *1T0OTF獛6mذ]0a+@hHbͷev\4h`T aQ u-ZǟAAAӧO'soٺk@ .7n4/v{v[V%;rU,*jBXzy<,G(nʜCقdefH+f HfV{[`"w"e3T̳N}'Ϟ=ߣW~JNݺ+ʷyýf;v`E'M%:C U(Xܠ f=v䰏N+:IWlٲT!})n]X-[B\}RXO/OTn\zvEQV_AuOW#**-5SZ.XRSTj׾lNSzolZvTj7ƭp=2%y坖%ZbXRRS2D2TsivݓQW#\.KMN0Il6ZR*%lQuOf5T7Q"$H"I!J"$H"$"#5K"$%DI$fH"$z IDATQBDI$m7ْH"$H̒H"$4YA: !fc6THRET*Pd0L>jڐD//p;&rqRXv;}jZRH"IRQ~[7#v{2TB6 P2-wk8g$18xjݾi;/#+;KY ڐD qVEN{^h8B\7ir2/pԲe?7~ O5mZݺu?7NjEajxQ|旞zQwQY" 8`WA}aݺt=|[4iW]-7o޺̚<|3} twwZ$o& ٻ˛QW@!{W{999kР`?tуF+WpOc5p'}||۶kHMH7 )pREi@۶mFEp{1d2ݳBe#hbqjH|3g|C`.-9O.T&{İmwdeeUV'WR`WXroO\ݺ5z)r s8GYCD۱}5kL&S:5j>h˗>hYӦK/pٽ{w^~^v-3O>֮Y~zѭ[)SubG,>|0k׮?L\N0l_ >aC̱cl?TjCR*[n]௅ z֭Kwn ؽ{wfs}ɷlMKM]8"|7oR5S%W]5k o%K[%$&,_௫WRT3Bx͛7{uM烃1Lϟ\yV-[͞5HK(x"⥋/]$7mtեKweۣEA<~N:Oŋ׭[q/^Dѫ>}f5k~pӿ&z\RYV2yHNN>/3yJJJ`` 9%z+RiZm233Kk0INN.݆Mk!&5n#BׂQ1#\flْ IZ*qC$1dx\\,N!#QwnZ\DW$ 6uel}1Kvm,_<=====}ڶeG="""vs%\*#ÔaZr%%K5veSR/Y•ٮ]+VL&S+z}CҹիWk&M^ڵK*-2<|9oOfϚsѓ?59qlT.Z޵ka]t^`aJrjJr ;wL˺K.d… QzĩVZ1騀G?|2&L:tk4qVB11kLh'P# ȟ3gT6l(qu+V8s\޳ǷnbMΕĉal۶+$ŋX?bIq&W|ֻ)۴j 6!݆ZFTOd谡&L)@~}IIAAAc?3>tݺw2d觩ON:>H2|ȥƎСhY1,< eR$H" (e,I$Dd.ZO I$&@TDI$)f8JQI$y9"^DI$)TZВH"$o/$J3UDWv݆aRUH"IB؉EB(`v;PTSWJ!$_ c=0LAi/a86XfsT!HRE6~nGEa"@"rvNλ_Ppإ DBp܆CzZ]!n2%A"8lV+Ն$N ܳ=<őė۩7$t׎qhXq.;д٥+ $gX!.  iߐPDVתUk1oW⅀\{7jx䨑k.|⥋%+$H⒠bLl6ۿaxs߲OM1\xn''';v|bXX∺u뾜#$օn\z~mffbb o߹w6a;plݶĉfsА>{SN8q9ߺy8~U+WZjL2 /8p`-ΙÓ3gϜ={jڵ7߈߾}[jj !_޵s4?~III֭^}l|ڵm۶1+(#';`47MB6bc>M.k~ JF2t7ONt(RɁEE|ЌѣFzOGQsh޻0ڿnjm0 1=`ǏGRӧD3f^'zC\o/>F)_>|<_}R8hҲ2uJJZvGD7nXThƍpÇL|ޠ1,ƞ={Ni'NxIJ<ߣGݻ`7Ckjܾ `:~d2BUTɿSힽth߾f䥌 __⧿0F׏YɿɔQ h4~hiUVM_~e䨑Nݫ7< OH }|͛ϕ$@,^Jbq TWhOVClG# `XT*UZZZ(2ZWZ:&Gرc;v"B|::fMFFfFFft||zhd2VEGC"FZ)QQoa蘌U_}v K_n[F\رcDxxjJJjJJN:Yr|9н{E %&$dg/X̯bh*erRyp,Y$=--=-m%dx޽͝sf{ɯ*q~&N #8Ӹ>4x k4d/11nw JzjOH$<1,:fI^/\ ?b4KP_f+; Y:zԩrG۷o6chȚu-UV!}tٲ;wzyyW-wut̔(ڧw[nqǧnSuI&y{{5lW^:tWh߾ݐ!q!@<󼼼cǎm_~9b16T˪믿\믿y|gw4G4i҃BA "^z@}"*% .)\ Ch iIfwc!ISM|?ӝggfvgժ#G(^d䀋/r鑑BfR۶m;r=DGGqbLL͛.Km%E%"eZ,5WL7oE Rv;֭[fٸ1:!X|}kǎ/ͰzE|1-=#*rdJK|-jܰY ]..6dZfm^;&Ui5ՕMTi~ M=BE|S^^^Li^1b(b._Əs u+4MʻBWH8 B䙟Ovnh$` IB,򿟥2O! <>)KHhj4<mHJʾ߱s}LSR>|"ol+/ŅwKTE À1(RjuUu5Z>n^^^m|}R=[M1wz1!B*OO!\fU"xOjpՉX$b p>k\y$r7-/$lB GlTlFH2xh)a ` "0_~U"!]fi6L h|g !M_]]]A򩮮.ȻEj4 ڐaXDtҵƠUW@_/K׋ ã&a0mxʕ]W34 ,Ջe!0_uњyHWVVH$ 8&UZYYj㌛eKHݜ:,Dbe˯t@1,k0*fTMz4]_}7B(L3] 7y_}ɓ'YSp i%!bW'4]RRrwޙ4iOtjM `OlV}M!J9w_eKPqcƸYjܸ\Na5訨PхمY"623!d2֭[Лo1~8>_>}xٛ{3 VO7B:vH]wa2228˥~gܹҥ ә.O*W% NtݙB}ee޽_v[vڵoܸB̙3IIK~GϞ/Yd#BG:rP7]reɒojgϞ?77''gbd322SR6_ ޺uŋ,fLSRRYxTؤ^w.xƜ=.v̋-"| ..a+?{ӽBÆi:Bj.СPx"L4k֜Ç֯sڴwrB(6v9V\̝;!4ixsON^G5jY`>iQq{⋹>>^N΄ Xf]$cnjOZrsV^:!dc{||$l(Yf˸FSʥz{pq___Vܴ FceMpk4Z__G?LNNqFuu52o.cnFIzԨ1!1Ƙ GZQQQk1G߮>X,cMVӳ߿CC4Ǐ;ԙK @޽lp·NAX5V*woޞ[8$fJ$N30֜Z{TEE"sR\`@%uQbc[{R!D0rss+[dN7 "Eh79;ҧw uZW%C!XrhSaQ朜۶իר5jFzf.Uxʺԯor¢ʪ5kٮ`8irs]^jڵkיC&-/(5ʻ5BƏQFi0}&} #DϚ3Gdg!Ə1{ي2_Μmh#"C FÜ/ƘH+c-v!;(88$IOhA``{h|\lJj)B~5>nO_ۻN=1QÌ -ᄈ>yÂ2YLLԩS?v]y<*""+\zp/W\\7l"G,FEFybGEwY6dˏ)B)~ _wl l_\]g3`>D;gœ7 6䔗^|ÇMYC/rL4 =Xps omLA%BPwkx]8BHQA oX$b+\D"!p?$IvhIDAT4p$IԽ|u{96 hTO|Ga,H]_ XE,)V>t-W7W/ҧX,kQ!F&U T==8"rE"q!TG'"$." ǰcH$jқ6o$@˧j 7(Dae0lЈ8;$hB.I2=D|v D;d2 h<O4|.hH\A iS-gàa;պ*|(t˗.2 CQ"I +>14 ^]-gu;t~咇TJ0y4b#![YY%+A@Unn<^F"Fen=6|eMȔe FYGل7>|G b06 ,\s0;XQQ9wu:]BCֵQM|zj!( ꜐߱c;o4 {rD,q8hGleGӴZ>qjќ9@!7׍ӦN ]BO>ēO>i97tĨĄ}gԷܯv>vdMMM6$!Dtӧ(*$$AyBG۵{OEee#Gmh{df%)'6nFhcٳ?GLǏ#^{ѣG:M:97wkyyy}Y+/!dgo>t^OHw]´˗0 ӭ[w}v{֮]IJII1ݿNI&BHbiāmݶ21+=!b?,3mEkָK_/I14_߷g~4cE l;.w̛ŜYW\y\'Yg22k9tĨF7l,8fW_u\|󦜂˓V,OʻyseNss/janN=X񭍲Bۻk]ڒڵkOKݠhm?oނЍY OԔ47m\RRfoW,xw+OKMi:3#~ @hPUYi#n{NZ(S&Mf'NYv}YY*o1dpLQ(BIK`}KV  ***2OԭeɓO?"T*?BH.78['vY +ESW$bNOLff=PJ2+ʹs>T &"< c6%%ݬ/oE0ieTU]îܸ;BյHe2O>:~='x"Mw]fҋ/do)+++++۸is^Kڷow~Ѩh22fӖ\M*U֭v|36v wW_YjZM޽_o[VeZYw7;wn7='UUUU6ڮh4DBD]jjsjKKR!}]Ν&Sm~~⯗чQsC4Iꐳ(xݼ'|ӄc"a!__36JBX!񌅋av@oAhʕ'&:< "l㦜Ϣ(*4_߼&ל4rԴ]{JB.\`fa@@$RO?59۵"^k`Le) ilttԇ}߱N=Qj 3g2 m)'e,^D.EFm40fCJwS/,4ʕ\zXhA ~]Vi;8!kf¸^f&MpB» À|d2?@uiPPp{W_Y-cӶv ٶ'UӍgFE7={8VӅTq<8ԁROi~GA0yn0|1BѸEFCS]{hhphh0"5E/J!l@H,:w指\"MP."mDpCb8"q{&D@<>Š킦iJ D ^]GxMr+=v" 1e\J8tm{UU+#?MFa}o. Zðl 4Zf1oBj9#(v~s\ܠ:4yCBϚ @p%hCF{@ӌZ>u?d/{Gs&B1f! 9|h[??Mӛs>so[tWkNk{!]\\zb<-y]} ډUbM;˲$Ix޴)>AL'N"z~ua|>N='Mغm{yyES'k`lxD$B(4?Bh 9'z>>.6*jgeff]zaخ]:eON9uE"gp nC:_0~P(~7U^ɌV.[Ll.q}%%̞W]3g>_h0|?'ОYpĘqr2Y^/o\<7w킂_'-:?//7weNs..evVFϮ\F];w vܱkUm۶_ϛaVc IOݐS.OOϴ?'gZ^bo.]ly&[ƍ7  U6B֤^(C(...!.xC.%&ě3?qrX`B!c=|(1!ã'Qi!b8L&t\رcƌr|ǎi.>a8R)p [9e8tqɨQ#m׿|Ҡ<>_$%&&pvO9C&FinƁ?7V%HF<#:rt nMs,B$M54M[uJݹ@ r[YyR^^̥JgΚ9_cArv3< G˧eT[*H{yy)QRw.]6ZڃT[]h߸y33s㭼jB$IsAQ* Z3e4KiN$",aV^Æ$FE wc BU\߶-S*V*<<4m6!Fc7RSmo0EBWWYgNўҴLsz~o^Ν;%KGBG ™PC"D4Xva!+W++d/z)4$va9͞CQTHK7HvV9_Bkcx̠$R|rڵ Dfm4㣙^^lpNQg~:Koݲ g5Fmedd}tL&vcb"S2ޝ>ǣ]zKj'>. pw^Xhuv]*b &;?84BUXB(}oVHp,|߻}@{>A|{N7R?"M=ztgah>`o@l{t6vP4z@!66@ 4Zhqk7__'8BHeS1X,pTt@ E2sΈBKaBl\!Jݥ{~普^!D _mէ~çH !?Q"Q_Ǫ` p$JK,jcb.rh0@\fD"hNDH, Bxoϒ$WBl$A 9@ P)DU@,Dp@!B(ڗUX\fK"Dk:s1T3V"H)ZN| üB#V#Vv{_&H ~Z A7#Dhmj<>N"$!Yh\3J ~a"([E!(`mۉ4MSANO%*N Ww+`7.|A_gZ*x.W&)E{Sr2 dAF^z7 xԓ^0 A!4u(fh_,]bV719F%E48ǂ1͠9@v~岇ԝmH'A%X-`j[TƔ`W0aȰlUUD,tWUUl01F1,¬S,`Wݰ1bcaXgk ŶBM3bGHHH}~ p6{#3gΦg9rD{pa߾}gE'֭k3vfٳ22n߹T*~O 9-Ĝܭ!ԣGܭx|_ΜIِg,ْ88ᅞ=B^ޙSXXի v̔B&MmS&kb&'g#Gz}\ܠ۲e_|a1B|p> m=|wϞ=\!t/߶Y2,=z<[?}WBRSS岌,s{.\`2wn5\;_>ޜZ-^:VѴ);{(D,D|ͽ^GZvIJY`>] Εò%;wB(q.3~8B)y~cG{yyŒQ#Gp8nXR)KF ϧ͕4@eBle2r“Y^^.g8a7,=3.̣ӳN733u!${Hݹ@Zmw65c p3ω`Jp.؜Pux3g>ֱo:Efl::@ܹ }߮;dɲA13W,a#Ƙs"BYTXoyHP|'^^02GGElvyN܅-ۢ"X{=r_?e/g"UrQ(59}^KNISJS2ľ}Zf;wkkM,].38ܮc7Tž>'mο׫׋Zh{yK ]ĉ6o]\8alF%Kd#Nrƚf0f͙k0ܯ$$/AYVk|}}=2e*@kńk5\W]ntKnqIc0Hdh `&;?84nSm{wh7lR "d". P,  L aD{2w PW(ݮ!~BUw~̷m-S'ou>$bgre։.Bܹ3b$!ZI5cBUĹJ'0 ĖTÝ~ SE߾sf3tj@b˗/[}%T./W8کf?-RY"o)5j:\)[ƸDhZ*nWRfk;Yb)MlIENDB`kildclient-3.2.0/doc/C/images/we_trigger_edit.png0000644000175000017500000007354313215302470016635 00000000000000PNG  IHDRm pHYsktIME :kXttEXtCommentCreated with GIMPW IDATxw|Ǐcg;0cW@ٛ2ʆBBnJ=ZF-t)dYNCıeI@|?$]ZrAk/%bPP~P0%0 UD(\@/aPe=e^>}Y%<dBK}DUWMꡮH6X6Eܵ:{(t#wTʥJ~xqI6屈sH6Ԭt{4!Bou*-!qEܻ TNmW]Ⱥpw"ڀ)]Vb%PEQG"N_ΈՖH8qmf;8!)>E>jI YZU$Rt5777 *_Mʖؓ&B(Q#Yӌe!c\l8PIf%8.gB< f zy`ٮ;ą謥s(wʼ2A󻌄]ǽj5 z^,r`6r\.DHsHǫuHVcp8)'˜AoH#J F#}M@Q>>ʿ*y4 gI$0G{nX/ۺ ,aFE  R*}ܾVrs A@Pp0;h4n\_>Ӿ]m'XwmǾK 6I SR- vEbBNpR$No0~۰v`lW`>lU؄BQ<#W=c6S5Qфh0m bjlh4Z5k$RNTM{z;hӴuj%E*.*(SF*@jf}{Ő/>}^ OоCҾCI-KFfFHh9C=>d eff,_O¢X,̬аPHSM̏V0۶mݷ7v;E ʴXΩpZIIIs׮8DccF8&':DL0^޸a-ZZ5mxvڗݥfxJVؿ_~NKRRRƍ׵K׷} orJ1ct~ݺ6/H2''g9]t1|ݻwxֱbb'"IXFw$gU['.՜ dgK 1Y՛>g2vN$>vգ1YY.ל N&͕Jbh\n{[TXh2 .rh02ynNju>=k^Ni"&Og?[w]o|H- Z,yv ws?O2{cc슔gZpXhQ||/2h4X,|bM&bK_-Zhգi붵k:y}"& <G؊eɤzsn.]23ӝ$ݻZ~a;ةc 7][ebIڵ43m`ÝL; ܸqc谡omB4ɉIN$'٧IImJ6%;s٤MI ܼy_/.ȷO͛Ç/.mxҥ{QN7Ç2̞3"֌4 ߣ3Oj:q wG NδM 0. -YZp5iS똢࠰%bF9|$'4&g֎{ڗ矀Cws01r.01ҫFi|p6v0vWw .~,^t,=،1ܱd2M&h4v-.֏;.!!id4Z&hxJ`K$%)u՚5-[xݺujoٺMM%b43zbWs7 d`H 6We6O>t$$&fff6nԈ>ޜ U߆j`ĤUccc uW8wߖ7hTw^[h-ٲ#оCO?_woݸ>yVsf`o]7)*wv #ۇGN/SKW43؟{}($єlz]+vN6}ݽSq:΄C[L~s= wcpH$ _XuY)>q*/GN;wD"k&ȽD{q)ܿ{I"&"%2^woݥo~_w,&"ݾu;00mRv|24nv\~4y =??ڱCGB̙;+e}icnjо;v1N^pOFd2g.\ݫT8wbt!SLֽБ*cxFRzv8sNƭjTm'G9xiG,Nfa~|jS8vs9<! ~NǏjs-NP p"EjZ᧼vGIeeiZ Q^󺯯ZΧX,Vr_:^otD+|׮ODOH2ϵ?}zJĉFcjr`A k*}`^E錇oϜo_t}?u6ơjV= \+b$X*J Sj?__?J$*ϏDȪi/9MdꚔdH$->wntvAjBȶ-ϝ;rJ @$ BHA^P Uҵ̍3=霄 8&*㚗}9'|t<\3=oQ\o<X@w }> mO,k X,S!7hPd0MF"e2D&uhjڬiK$_~CPp$r`05mڴJժbXhHKeMIMyǧAEy^ox&UV;ZbX"VZ?ߪukm/_ϣ;u9H-Z4G"Y{3<5!KډDu,Z8,,mExx(Tp穔SH9R s :qmNUgx Ô{Wh7sz*ɔtYYQQQaaaAi'&uիKR5LII$qbZ\W.up<-/-Rrst"i֫WZ5]h8痞7ln͚_~xǛ7kC5 -&jJ*)9ch2rstAtd6LNcFx ~G,"R8+s,e pj0 s5w%6S|sZ/s3bTbK8%<5 wGA;_Bymv.|oRI*_UJjrFJ7lؠJj`D#HkԨ뛒MIM%EנA*UKA.dFJ5WU%''E!~~Jd DiڰSXg5LQJh0mظfXC[v~q`Qys'@a.m^=`d79q ~6pv6oXoA0*d4&DQTRrs%Lt"z$H}|JJ*:݊iTPfDPTJTuqS"h^Tu\ʵJI9ŗRn~MB޻Ps>O'_}*xB<6tt);j{"ܜrL\i{gog]PkϦ#[:婀B0d=0,<*BEq̫?9NsFW$#zZ^,8Φ#K'R V]rAU.r{rzڮN|n7@h{'n7zd,P*ο/^LM38ل"N2,&%a W(73rpsebwnkk@xb15xL:%do/2. Lq(qR#KY"n qY 9qf'|Nw`v⩂?ّݺ-Icrڜ19pfNN&z5z]-q| i8RØ?{c3O!,n*ðx-x:VΒ"' Uᕃ/D 7m@Dz!v~eoWWd $s&ғrr]qLnĤؤ{ Υ-pOhbHMd'Ev}qao, c'ٔplʈSn|g 6^ܧK$[(n|,iGXN9g&&(VtŜIUL)G\ŤʮgKkOLZl ۜil2#G'w4 @q8m3PcEN)$8Q(g5LJr8ƥ=*e9( \aB\"}D .l?Z{= "bYHH9}ZC)wcqpF&L˅$;v`8:K/<H(g)n.V(9i(g @}۽[i:¿?Iqa"d UB\pGQ#./on(.w]rU/1B.DS]Y뉃K9(A)Rt%`B$l=Q΃^aq>[)VkޱRlWNu$Qvл`|&\9n>qW9x|k<վ {޲dspYЎ5g1y\O;9mnkT'mY ^rkPPpi NA]A,_]֍4n-I_E)g3pyܕw++@wim ؍fبv)3sR'; qNB!6;τwxq!ή :{Iy 7nog%I+?/Y(lsG^f~-b;*s;uqw6As"]QHLFwc8v5܅m]vwyʷ*Vݕr,9N8_fݶ͹7gs̗ri _w@Ρ(4ń'7$[j4 O+ q9s;[p/rW+|;3}8d7Wωp6w^7N5B'G812J@q(s.qu{ʅibZ7/_= q;qwIJr,>!hwޅ7>[>'߹//=/'`& pĮ;Ylјnq%:i tn cByT9Yi&;pfSRFv)}.G ۍ Ta'B*](;)z7 TblstqqqbE1FCX,"jש䮈U[wn3##`@ċ˽w^zuCCB=+ۜP":ZBBRMj֪}A/X*=/;w.fA#MbIQQ~~~!.jDE=~'Q*@>qjg%*RTbo@Q**7L}$vKǖ:İKSLeT9'CAP{ܹ h/+!'dIkۦDWrr֭[~b4o|o@]G}AL P(^&MhC:fӧOi歩S BP@5ڵ%NJ_ ::iӦǎ+?Wޱ ٲu-BVV޽{GgeeČ9r tC_~}ҥv2wût<(AŕoqȑM65mT.T1c\|ѣJe׮]zQǏӿ;w>zms֬Y6lX`appA#Q}jU6ze*cA{[(TA~~fFbйL&Î a4L:uD0ڮ ^j[olzMNA5U Eh4`W@+|I=k ";+{ ^.+S!}ۉ7NE^'33$b:4L&dxb42ҳ22ݲ%B{ qP8=--';ۋ_~#)7@n1HeA 2b4J\.wH*"ev%i鯝>mmrRbR֬U ^DqqT*Mą(sIURq(???x~~~5U]l|TJ{ ވRT2`+蔕˗O0^H ƭZհ{!R*/ 0p޼OZ-dgIvv/X^/Xc۶yB "u5ޑC^-<dO\.ǎ7~ddddd'.8vt… pF;uDYj/x/P(fϝsr11{f3|}* .epk}[ @$IOO7~<}!a)^?Oʆ@@NNvOK/W"##-_Qr%5jD+QQQiiih:֭}aaa׮^U6/_+`󖭫WZby``vԉ͛7ٝ۷iX,o5j4m={>}<`xv L/|чT8;(7CCC}9r~nޢ07olР!kĄu+t`xx-<>>W(5kڹsM7nc:urhԸ-[!gi7'O 6nq&LɼVּy BU0rX\\LΚ' x;"aV;C׫> <-MrJ[[4f^[bEbblzgB0%/pJ]N:etӧtӧjZOۏջy4F?^;u^vM]֮})֔)ܧ.EEE~~J2%%役sJKifR/ߟ`4ٴqCQQQRRs Oy.oϜe}Ξ3qƶ8̗_yuw/~a zŝ:utC9J%:ZGiӶMnҵKTTԔzӧשSg=wWiJDS~~~v]6˯+]H$`% "n4q l^ h4M ˳p IVF6(!@Heă322$IHx\ol"R! ̌`dmV)8-=-;[=A/h2)>82 %dp]-2\& wq)ΈA A% " G"N*kV+"LzpƍWDܷom۶>} u>uԪUkQtm۶СC1cnݺO0ȑYYYN$ _|ɓ #kŲw3g :~cǎ7nZ,MN>_e֤C+M .cǎ?jժeee1r]j:))OoݺN<\GdĞnݺ92lڴ>P(̙ݨQ# v֝ޗVd*pn]5֣ ^|J;N2\xٷ/6--}uk֬~OW^/mժ5k؄իW^DZmoݺrSNѣn޼x۷͖ݻw;g}۷,^xǎ홙tg}k=ٽkΐ%K2СK,믿@l͛pTz%yfVxȓ,k|:n׮F/u;M6TӧOٴq5QFr8"gϞ0aZV'N魷+с?tvҤ!!!!!!&M>{-Ij5NfDDq~wɓ###}}}mY[s5d*jԨQW\bN:ctj֭p޽{]x-[ԑ'Y FT*;wN'WPH)k N!x{aIGEGrh4:ǯej[OKK8qJCQs333DF2ET* D"( F+OADF7 @ AGA-qA䙊8Z =w Z lc x>Ao8 W[8Aky2Nۅ윜$ N HŇb6j , .^%+Y=nب A;oժU3D%6K,M׬] ^DqqT"{VRfRyf1,X*AϯFtu˪lST>JRAoDT|SJ>0z5TbDĝ)'L?ah=^ɳY/ի v,A6]K޽{"H$_nt7~>wMSvǏ㓒㓒o!,qCSS.]t|meϞ7F4xȑGmvwz pۊdڴiG>|ĦMM&-©ӧG۷_Y3P5ܰ~]fM6nr4~2ef-5yF:kCj5kTOKKqq۵uN|bضs׹?aOB䙛N1L{N;woС÷Yg۶n̲'O|l !1qVxO׮^[hѾ1-[\W / ~ÙG~v vs7Nݻw5kcNΟ3?|/~dÇcG̛??22222O;z:v|8njpXD|AÇ o>nZ'!O _ʏ?إKzkg~|@ʊN###l?+rvn@99kԈWZ-f _h? vͩS^R\\|/n ~`!޹Ӱ'! hkyʕK!b8;''000$$$UOQ#Az388XMQ:j4j8FM̐Pn=z%""  "f];w6yMvl^n\ΚlݱUfؓ)w(a;ٳ;v8׶sNΝBvaFFSyf:Rbbi %wh~Ӧ6nо=#cz̶%YK~|Vj?d~^̟7Oh4>ջޱSuk״uhnV_ |Yp0mp98/.;OЯ_{?!44u̞Z^tTzoϜQ5 X~UKmzt{]uٽ{ի7uڴ߮]{h׮}~~~NX3lڬY^`?bL q- HTAŘ4bKݺdg]tj80Ah4pTZ5D!eA/8y ?+_Pb x|-_"lMק\.( ]dir!@5APPPFzD* T76BiZMFzGT6W*b8MĞ a2}||.t!Qr P8[DR8+[AD88NAEXAAV!( ^,GALIY xNAn'h#x!pAopj8 jxX އ 'fA&J$Aiw5d6%TJW¢x$HA 14V 5%';kAFVBfҾ_|Qi.Zx?]xqq΄ ?!D뚄ܼkL&>kd˭YNn^$\yk5m+W&< Ǘo3M0' ھm?v2^Nj ^!)%/7Wk2+LF7/7b'8>~5#G ߽kȑ#V^/Bٳ[\mVs~v)-=?v'ABU-rX?tАCZj Z2dCf3 zǎ-Iߜ<911 b36l@G8~H>lcG^rO޶M&Ӗ~wDһwϝ;wӻs-ڤI)oN/~ĉ=zts[@oǎ=l2v믿@vmG!JԔq[Õ}w~F8vkҾ}cFK$#R)v %{[m>ߪՃqla˖7o0d۶D#pG8_V-23֬Zbқ7nيŗKw}떭7ջvԮcFvܾ}g_;rqw0ǹlζaJcz~!zbb61cF3jŊƍd2R9a׮|}} \`ܸ6g?2~XZVǏ/xPSD2~X:X7fY6 NqM2[Boiu |U@zSӅhqqwcZE"|(((\8U˖n}v[n,Ly IDATڲekvrNڴ@||s0-^>/YAcЈHw6(H*2W&WiD"r 7'Rĉ㓒\>m[ ԧ#:`8GW]ի-Gɴ}?8/_ڞ=1.޽n߾cX4n;0 3`7FINw@dڳgmڴ>|T*RSfKԅ552n1['8!ǟ ոcr9!Z6w;7D=kѢme˖l)dgoX!W\^ځعЁpC;X+m#˗-/nݺe+Ҳe_}Mo\.88xO^@v 옅s?;?>|4))ŋX(!!ȑcBkMJ΅)8qΝ;x5%6ުK_dIqa'`!Nd6mCi߮`Wj*|mAʸm(JT* EpA>v/D@Agmt J. 8!n͝ T,s "N GBZ ^^AB%A mCqAAoqB GBAKAī-qlAE(wǣB1&+T*H$8- ӄ=:(n62Y:Uܟ),,Lxl4J$lfA%6w ,+E5hb62ӹԠq+E,"8q\yFV6+lȨ[F3ȳ& O p!Jwk̞vj!G?{碢V-[~c\.c 2lCN7QQƏ^L]pQ,mXsd2 b "JOSfTZǴU\Kr={ۧsh߹{b4jp¸~~~t>Qi浵=AٸQAxCtLpu?r"MsaCw-eמQÇ',] "bcaFy?زqC۲u~%-loS;hE $&&d͋5 ֻ{>onXSvYRHs ,umO>8Yj/nV  Ql*K#6v.:'=']j~f# p;pws?bp n0~\XhٳcF QÇ x289<8(08(pԈs.FGըY3w~5_~0J9rcG eq|<>,((0((pY5rxppPppF\yfzoa1&+\`Ibqv.//7DW^"NܩD"Y٢sީV;wNhh^tMOr. ׾'OѭhɉT՚ժ'+JF\&\[dS+AAAUTh9((VMMZqڷk7r}q]l޲%%%l6'%%^+veg벳wiۦs޽w/7'C/uq|RRO.ڷ۱cWzzzaa1t`5O8i032lf7%%Uxy={ኳknNvbnz\L\KfW))X&b1 G.Wdffnk|*tر7ozoz|ktx=?d~QQۻ&drL6iz_ zPn]E*7 EO>$oygM;ofNuh{&m޲瞧(QgϝoN^Z6l{&j]?o%\jj\+,x䑭ewqcssZ܅7hwBhi통񷽒m*((p@6Dٵ+!!^^͜0\jN,(2DF# ŒRh\AI[>ʲX֭YY ;@p:r'Ia=nsՔHe } !I.C_|y ˲xkm|PA(.,04+**byp?)2..NdLN!@0QQ|uQ믚B0#d :n *CBC[N32СZ=Ő 0R뛬C$od!ѵZnI A61]\~ A 8{:Ct<;@W8w &1AQ XabA8#N'ޚkcXeUi4БoeYJ,N$+թ5H$[U8L}S5*&.rI(^Ҋ)cxKq7s{mU';53n.~o]n6n̜3ѝo ̈́OK}}r-_xDa M!eٍ>uJԴ.~ɖh\Bw[Vz-vKp~v/o~|hVC ?~-D}}3z\.6uJ^qPZZ|S2F|aH^5C 鏷~D;o [6v<|;jRPzt]yNYa@|xpeLUeE=nwNp8JHhqqɆ7͝=o>v}}] ]k6q-E\6htK$訨0 -MJ<E¯2֌c=.1(s9qa}4q@tT77>v=6&fYQQryO/\yo>g) acgY6+;'78EQ3Fɦ 녯{?Ϝ>U"4.|dRTǏ~۟^zp租]bYo*-p59\NLHPT^/[RVׅuu{< #!6oeoi>SgΝ{JŁC7ozo"֬]7}?q'~]sn*++W._ڰq񃇿O1 -wOn3o`ij~v(IDAT۟6mX9ok)C ".\OLW)ZqA4:2JV#b:1>^xǸ !MBX񄸸2˲ #Kd#?kAB#EFcUU5AD(?w\#=s\?;mʃFL2WofϘ 3~rT8Zɓ)Y8W֩U 9IIIINL(Gjjz/MRRXy~!7_n;o>I5v4|I yd*Iܒ|qIIn4r3qFmw8BRwXxeE;v~b4NP6M zreU K 1nrۓ}wg{S4~q.O{3kz){+zH"PLt_~i!d 3}6lD_YU}KDJ$BEGG՜7YØhTX=i1/_~_) ϜvIƧ/\ ?>$45"<!dX}!!OI]CqqO,^1>}6~Fx۲u={$tçYDjJӴrC^B5^o|yoxpkufʾ"wpC~ @WNiC@ƁirىlS\nwͯqd2DRYYqmؐsvl6Ͷ=g;oܲdbYtX~YI-!)B(3|uz$&PsקC)F&\?Ah%wiHvڈWNDz}o龽{OKn017wǻ>}!!ƏkÙs|uz[h8~\,(j䈻_(qIYkZ 3eݵ =,3{to;㣬I{7ZR©G[P4lߔd}Xň _,sgJtl,|оA2DF&A*!ZY"e212YdDx"OtF&Wv)BL&JK0ZM!ZcAJ*@  \j]x@iݩhAǁE@t@Aq 2q8 ␊dn6]c!zY "8t β,%'0ru:cQ!Dp-@N8'Ȥ筪w8oR `PdΛߪֶAU5jiT'8w'7Wh>hnڰ^hVq\TUV4S_cDáT*D=S6Dm yx v-%?BĬxDžyAsf3wά(Pټsק.<׷Oٳ }LV__ɿXFhЧNڨ\XTc4wϗ.-] Bhqf(/-nqFSśqpm9yoFswkC},] qC 0nlG$w֬X{zuqY9/-]FQԘ3Νo@".?k)7J-4;l*ADt!bnfNO5 i=3XDqj.ۼeˡFe*/36H (΃S Id V, Yx睷Wy5%rxn.H'оZ$VkjIn0^&W!"f#߈EZA:6>"#_5B aL] rv A*!ZWM"rLx8BL&J1C$.$A G8ƋBLjE!G\$D.*Dnm'J8q:,*9zwۓUD)2g 劢=rm>F^];"Zt߼D98Yu˱Rb ){ZmqXB b|eYJ,N՛3ݵCuNcQDmϧ!Uq"+u/nu=ՉRjj5P59 299r:jkP"*)9̩Qm <q:Ku3]ZeβuT,;n=E4yclwԦuOqOh) Й8D0iruxcPrf,w59w8r:DP9R!jS2A7!Tuy8tϻ=.K @׉0.X;d̘_|SV Asܼ6EEEΝ9d |츉+_G秧;yVcq^:uʨ#w#70 @ G V'|<5%sV^rEB||U?aժh([Q"굿׿<ps\Z B; }d|mV3q¸ N0r-YrFƌ UQa:NN!ϞTy!n>/"Ks>MRf{|"/M< GPVRtjB eq8@z2As@ tt" a bC9{He~RR~NB (bE*m0;NMҸYW%1xg2Fo/JK=I #=c:D߽D*SiCe)I1ϞM:qH`(p7[$vA*6Ifi,.fy/MUW)"ccbL?|IHwM*R(E 1; Tz.Rl0;BAq)jRKsNs[]wS.& Ő4BHJiqVvpD.d2 @@8^NN6"/@ dRQ!H$UH^h$DA1N`.:#cGM6!cyQ0 KildClient Manual Version 3.2.0 Eduardo M Kalinowski 2004-2017Eduardo 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: 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, SOCKS5 or HTTP 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, Scrolling, 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 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. The last group, 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.
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. Select the language used for spelling from the list of available choices. 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.) Parent directories are created automatically if necessary when opening log files. 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.
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, some behaviours regarding how KildClient treats input can be configured. 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. You can also change the character that is used to run Perl commands (see ), instead of using the default /. As noted in the warning on the screen, this is not recommended. If a non-standard character is used, code (such as plugins) may stop working if that code uses / to run Perl commands.
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 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. Previously it was also possible to define a command to run a web browser. This option has been removed, and the default browser is now used instead.
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, SOCKS5 or HTTP 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 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. To send a line that starts with a / to the MUD, use two slases: typing //info sends /info to the MUD. 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. Fractions of seconds are allowed: an interval of 0.5 means a timer that fires each half-second. 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. OnServerData: Executed when out-of-band server data is received. See . 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 sec_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 gtk3-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 sec_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, . The serverdatadumper is a plugin to help develop or debug plugins that use out-of-band server data. See .
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 Gtk3 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, download them here. 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. Out-of-band server data KildClient support some protocols that allow the server to send data to the client in a way that can be easily parsed (unlike prompts, for example) and that is not directly visible to the user. We call this out-of-band data. For example, the server could send your character stats (hp, mana, etc), so that a plugin can display this data in a more convenient form. Currently, two such protocols are supported: MSDP and GMCP (sometimes called ATCP2). By default, nothing is done with the data that is received. A hook must be bound to the OnServerData event to handle the data that is received. Even so, KildClient does nothing with the data (other than to parse it in a form that's easy to be used in Perl scripts and protocol-independent): it's up to your code to do anything with it. For example, KildClient does not store any previous values of any variable, it is up to you to store what you want. Receiving server data As mentinoed previously, to receive server data, bind a hook to the OnServerData event. See . Inside the hook, the %::server_data variable holds the data received. The elements of the hash can vary depending on the protocol and what was received. To view what is received in each message, you can use the serverdatadumper plugin. Just load it, and whenever a server data message is received, the contents of the %::server_data will be displayed. Here's a general description of the elements, followed by specifics to each protocol if appropriate: $::server_data{'protocol'} hold the protocol used to send the data. It will be MSDP or GMCP. $::server_data{'data'} holds the data received. The actual contents vary depending on what has been received, but in most cases it will be a reference to a hash with entries for each variable sent by the server. If the value is undef, that means that the server sent the null/undefined object (this is not possible in all protocols). If this key does not exist in the hash, the server did not send any variables at all (again, not possible in all protocols). $::server_data{'error'} is set in case KildClient could not parse the data sent by the server. In this case, this variable holds the error message, and $::server_data{'data'} contains the raw data received. GMCP data The GMCP protocol has the concept of packages (with optional subpackages) and message names. These are stored in $::server_data{'package'}, $::server_data{'subpackage'} and $::server_data{'message'} if they are included in the message. The actual data in this protocol is sent using the JSON format. The Perl module JSON is used to parse the data, see its documentation if you want specific details on how objects are represented. Sending server data The protocols also support sending data from the client to the server in a similar way. Usually this is used for the client to request data from the server. To send data to the server, use the $world->sendserverdata function. This function takes one argument, which must be a hash reference pointing to a hash similar to %::server_data. The entries in the hash specify what is sent to the server: the protocol, the package/message (when supported by the protocol) and the data to send, which is encoded to the appropriate format. For example, this is an example of sending a request over GMCP: A GMCP request $world->sendserverdata({ protocol => 'GMCP', package => 'Core', subpackage => 'Supports', message => 'Set', data => [ "Char 1", "Char.Skills 1", "Char.Items 1" ] }); MSDP data It is possible to send data using the MSDP protocol with $world->sendserverdata, but it might not do what the server expects. MSDP has two ways of sending arrays: one is an explicit array delimited by MSDP_ARRAY_OPEN and MSDP_ARRAY_CLOSE, and another where multiple values are sent for the same variable (in the specification, this way is only demonstrated in data sent by the client). In my opinion that second way should not exist, as it is unnecessary and possibly confusing. When receiving data, both formats are converted to a Perl list. When sending data with $world->sendserverdata, lists are always sent as an explicit array. Servers, however, seem to want multi-valued variables, so there is a function specific to MSDP, shown in the example below: A MSDP request $world->sendmsdpcommand('SEND', 'HEALTH', 'HEALTH_MAX', 'MANA', 'MANA_MAX'); The first argument is the name of the variable, the other arguments are values to be sent. This gets converted to the following message: Message sent via MSDP MSDP_VAR SEND MSDP_VAL HEALTH MSDP_VAL HEALTH_MAX MSDP_VAL MANA MDSP_VAL MANA_MAX KildClient Programmer's Reference Global Function Reference <function>colorize</function> colorize function: COLORIZEs a string $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>getclientname</function> getclientname function: GETs the CLIENT's NAME $name = getclientname This function returns the name of the client, that is, "KildClient". <function>getversion</function> getversion function: GETs the KildClient VERSION number $version = getversion This function returns the version number of KildClient. <function>getworld</function> getworld function: GETs a pointer to a WORLD $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> gotow function: GOes TO a World 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> help function: displays 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. <function>play</function> play function: PLAYs a sound file void play file This function plays a sound file. The argument is the path to the file. <function>quit</function> quit function: QUITs the program void quit Disconnects and closes all Worlds and KildClient exits. <function>stripansi</function> stripansi function: STRIPs ANSI sequences from the string $stripped = stripansi str Returns the string stripped of any ANSI sequences that it had. <function>stripcolorize</function> stripcolorize function: STRIPs COLORIZE sequences from the string $stripped = stripcolorize str Returns the string stripped of any sequences used by to add color to it. $window Reference $window 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>$window->getsize</function> $window->getsize function: GETs the current window SIZE ($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. <function>$window->minimize</function> $window->minimize function: MINIMIZEs the window void $window->minimize This function minimized KildClient's main window. Called from a macro, it makes a nice boss key. :-) <function>$window->settitle</function> $window->settitle function: SETs the window TITLE void $window->settitle new title Sets the title of the window to the given string. <function>$window->seturgencyhint</function> $window->seturgencyhint function: SETs the URGENCY window HINT 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 only exception is the variable. 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> $world->alias function: creates an 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", "substitution", { 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->aliasenabled</function> $world->aliasenabled function: checks whether a ALIAS is ENABLED $result = $world->aliasenabled name $result = $world->aliasenabled 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. <function>$world->close</function> $world->close function: CLOSEs the current world void $world->close Disconnects and closes the current world, immediately. <function>$world->cmdseparator</function> $world->cmdseparator function: sets or gets the CoMmanD SEPARATOR void $world->cmdseparator string When called with an argument, this sets the command separator for the current world to the given value. For more details of the command separator, see and . $separator = $world->cmdseparator When called without arguments, it returns its current value of the command separator. <function>$world->commandecho</function> $world->commandecho function: sets or gets the status of the COMMAND ECHO feature void $world->commandecho boolean When called 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 . $status = $world->commandecho When called without arguments, it returns its current value of the command echo option. <function>$world->connectother</function> $world->connectother function: CONNECTS to anOTHER world 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> $world->dc function: DisConnects from world void $world->dc Disconnects from the current world. <function>$world->delalias</function> $world->delalias function: DELETEs an ALIAS $n = $world->delalias name $n = $world->delalias number 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> $world->delhook function: DELetes a HOOK $n = $world->delhook event name $n = $world->delhook event number 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> $world->delmacro function: DELETEs a MACRO $n = $world->delmacro name $n = $world->delmacro number 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> $world->deltimer function: DELETEs a TIMER $n = $world->deltimer name $n = $world->deltimer number 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> $world->deltrigger function: DELETEs a TRIGGER $n = $world->deltrigger name $n = $world->deltrigger number 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> $world->disalias function: DISables an ALIAS void $world->disalias name/number ... 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> $world->dishook function: DISables a HOOK void $world->dishook event name/number ... 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> $world->dismacro function: DISables a MACRO void $world->dismacro name/number ... 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> $world->displugin: DISables a PLUGIN void $world->displugin name Disables the specified plugin. <function>$world->distimer</function> $world->distimer function: DISables a TIMER void $world->distimer name/number ... 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> $world->distrigger function: DISables a TRIGGER void $world->distrigger name/number ... 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> $world->echo function: ECHOes something to the terminal window void $world->echo str ... Prints the strings in the terminal window. They are not sent to the world. See also , . <function>$world->echonl</function> $world->echonl function: ECHOes to the terminal window, followed by NewLine 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> $world->echonlandlog function: calls ECHONL and writetoLOG 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> $world->enaalias function: ENAbles an ALIAS void $world->enaalias name/number ... 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> $world->enahook function: ENAbles a HOOK void $world->enahook event name/number ... 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> $world->enamacro function: ENAbles a MACRO void $world->enamacro name/number ... 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> $world->enaplugin: ENAbles a PLUGIN void $world->enaplugin name Enables the specified plugin. <function>$world->enatimer</function> $world->enatimer function: ENAbles a TIMER void $world->enatimer name/number ... 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> $world->enatrigger function: ENAbles a TRIGGER void $world->enatrigger name/number ... 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> $world->expandalias function: EXPANDs ALIASes in a string $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> $world->gag function: adds a simple GAG 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> $world->getaliasnumber function: GETs an ALIAS's NUMBER @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> $world->getcharacter function: GETs the name of the connected CHARACTER $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> $world->getconntime function: GETs the CONNection TIME $seconds = $world->getconntime This function returns the time spent connected to the world, in seconds. <function>$world->getentryfont</function> $world->getentryfont function: GETs the command ENTRY box FONT $font = $world->getentryfont This function returns the name of the font used in the command entry box. <function>$world->gethooknumber</function> $world->gethooknumber function: GETs a HOOK's NUMBER @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> $world->getidletime function: GETs the IDLE TIME $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->getinput</function> $world->getinput function: GETs INPUT text $text = $world->getline This function returns the current text in the command entry box. <function>$world->getkeycode</function> $world->getkeycode function: GETs the KEYCODE for a key combination $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> $world->getline function: GETs a LINE from the scrollback buffer $text = $world->getline line ($text, $time) = $world->getline line This function 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> $world->getlogfile: GETs name of LOGging FILE $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> $world->getmacronumber function: GETs a MACRO's NUMBER @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> $world->getname function: GETs the MAIN window FONT $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> $world->getname function: GETs the NAME of the world $name = $world->getname This function returns the name of the world. <function>$world->getpluginversion</function> $world->getpluginversion function: GETs a PLUGIN's VERSION $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. <function>$world->gettimernumber</function> $world->gettimernumber function: GETs a TIMER's NUMBER @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> $world->gettriggernumber function: GETs a TRIGGER's NUMBER @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> $world->hook function: connects a 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 function 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> $world->hookenabled function: checks whether a HOOK is ENABLED $result = $world->hookenabled event name $result = $world->hookenabled event 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. <function>$world->interpret</function> $world->interpret function: INTERPRETs a string as if typed in the input box void $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> $world->ispermanent function: checks wheter a variable IS PERMANENT $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> $world->listalias function: LISTs one or all ALIASes void $world->listalias Briefly lists all defined aliases. void $world->listalias name/number ... 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> $world->listhook function: LISTs connected HOOKs void $world->listhook event This function briefly lists all hooks connected to the given event. void $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. Several arguments can be passed at once. <function>$world->listmacro</function> $world->listmacro function: LISTs one or all MACROs void $world->listmacro Briefly lists all defined macros. void $world->listmacro name/number ... 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> $world->listpermanent function: LISTs PERMANENT variables 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> $world->listplugin function: LISTs loaded PLUGINs void $world->listplugin Briefly lists all loaded plugins. void $world->listplugin name void $world->listplugin number Gives detailed information on the given plugin. <function>$world->listtimer</function> $world->listimer function: LISTs one or all TIMERs void $world->listtimer Briefly lists all defined timers. void $world->listtimer name/number ... 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> $world->listtrigger function: LISTs one or all TRIGGERs void $world->listtrigger Briefly lists all defined triggers. void $world->listtrigger name/number ... 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> $world->loadplugin function: LOADs a PLUGIN $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> logfile function: enables or disables LOGging the output to a FILE 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> $world->macro function: creates a 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 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> $world->macroenabled function: checks whether a MACRO is ENABLED $result = $world->macroenabled name $result = $world->macroenabled 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. <function>$world->makepermanent</function> $world->makepermanent function: MAKEs variables PERMANENT 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> $world->maketemporary function: MAKEs variables TEMPORARY 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> $world->mlsend function: Multi-Line SEND $success = $world->mlsend attributes This function 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> $world->movealias function: MOVEs an ALIAS to another position void $world->movealias name new_pos void $world->movealias number 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> $world->movehook function: MOVEs a HOOK to another position void $world->movehook event name new_pos void $world->movehook event number 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> $world->movemacro function: MOVEs a MACRO to another position void $world->movemacro name new_pos void $world->movemacro number 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->movetimer</function> $world->movetimer function: MOVEs a TIMER to another position void $world->movetimer name new_pos void $world->movetimer number 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->movetrigger</function> $world->movetrigger function: MOVEs a TRIGGER to another position void $world->movetrigger name new_pos void $world->movetrigger number 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> $world->next function: goes to the NEXT world void $world->next When called without arguments, this function focuses the next open World. void $world->next number When called with a numeric argument X, it focuses the Xth World after the current one. <function>$world->path</function> $world->path function: generate sequences of directions forming a 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 sent using the settings in the Sending tab of the Preferences dialog (see ). <function>$world->prev</function> $world->prev function: goes to the PREVious world void $world->prev When called without arguments, this function focuses the previous open world. void $world->prev number When called with a numeric argument X, it focuses the Xth world before the current one. <function>$world->reconnect</function> $world->reconnect function: RECONNECTs to the world void $world->reconnect When in offline mode, this function will attempt to reconnect to the mud. <function>$world->requireplugin</function> $world->requireplugin function: REQUIREs a PLUGIN to be loaded $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> $world->save function: SAVEs the current world void $world->save Saves the current World. <function>$world->send</function> $world->send function: SENDs something to the world 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> $world->sendecho function: SENDs something to the world, with ECHO 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> $world->sendfile function: SENDs a FILE to the world $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> $world->sendlines function: SENDs several LINES to the world $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->sendmsdpcommand</function> $world->sendmsdpcommand function: SENDs an MSDP protocol COMMAND void $world->sendmsdpcommand command argument1 ... Sends a specific type of data to the server using MSDP. See . <function>$world->sendnoecho</function> $world->sendnoecho function: SENDs something to the world, with NO ECHO 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->sendserverdata</function> $world->sendserverdata function: SENDs out-of-band DATA to the SERVER void $world->sendserverdata hash_reference Sens out-of-band data to the server. See for details. <function>$world->setinput</function> $world->setinput function: SETs INPUT text void $world->setinput text Sets the text in command entry box to the given text. <function>$world->setstatus</function> $world->setstatus function: SETs the STATUS bar text void $world->setstatus text Sets the text in the main window status bar to the given text. <function>$world->silentdisalias</function> $world->silentdisalias function: SILENTly DISables an ALIAS void $world->silentdisalias name/number ... 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. Does not print a message in the screen in case of success. <function>$world->silentdishook</function> $world->silentdishook function: SILENTly DISables a HOOK void $world->silentdishook event name/number ... 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. Does not print a message in the screen in case of success. <function>$world->silentdismacro</function> $world->silentdismacro function: SILENTly DISables a MACRO void $world->silentdismacro name/number ... 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. Does not print a message in the screen in case of success. <function>$world->silentdistimer</function> $world->silentdistimer function: SILENTly DISables a TIMER void $world->silentdistimer name/number ... 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. Does not print a message in the screen in case of success. <function>$world->silentdistrigger</function> $world->silentdistrigger function: SILENTly DISables a TRIGGER void $world->silentdistrigger name/number ... 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. Does not print a message in the screen in case of success. <function>$world->silentenaalias</function> $world->silentenaalias function: SILENTly ENAbles an ALIAS void $world->silentenaalias name/number ... 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. Does not print a message in the screen in case of success. <function>$world->silentenahook</function> $world->silentenahook function: SILENTly ENAbles a HOOK void $world->silentenahook event name/number ... 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. Does not print a message in the screen in case of success. <function>$world->silentenamacro</function> $world->silentenamacro function: SILENTly ENAbles a MACRO void $world->silentenamacro name/number ... 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. Does not print a message in the screen in case of success. <function>$world->silentenatimer</function> $world->silentenatimer function: SILENTly ENAbles a TIMER void $world->silentenatimer name/number ... 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. Does not print a message in the screen in case of success. <function>$world->silentenatrigger</function> $world->silentenatrigger function: SILENTly ENAbles a TRIGGER void $world->silentenatrigger name/number ... 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. Does not print a message in the screen in case of success. <function>$world->timer</function> $world->timer function: creates a 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. Fractions of seconds (such as 1.5) are allowed. 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> $world->timerenabled function: checks whether a TIMER is ENABLED $result = $world->timerenabled name $result = $world->timerenabled 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. <function>$world->trigger</function> $world->trigger function: creates a 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 . 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> $world->triggerenabled function: checks whether a TRIGGER is ENABLED $result = $world->triggerenabled name $result = $world->triggerenabled 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. <function>$world->writetolog</function> $world->writetolog function: WRITEs something TO the LOG file 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 gtk3-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 Gtk3::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}, Gtk3::Box, the vertical box that contains the output and input areas. $kcw->{SCROLLWIN}, Gtk3::ScrolledWindow, this holds the TextView that is used for output. $kcw->{TEXTVIEW}, Gtk3::TextView, is the widget used for output. $kcw->{TEXTBUFFER}, Gtk3::TextBuffer, for convenience, the TextBuffer displayed in the window. $kcw->{CMDAREA}, Gtk3::HBox, a box that holds a button to clear the input area, and the input area itself. $kcw->{BTNCLEAR}, Gtk3::Button, a button that clears the input entry widget when clicked. $kcw->{ENTRY}, Gtk3::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 2.x was based on the gtk2-perl bindings, for GTK+ 2.x. KCWin 3.x is based on gtk3-perl, just as KildClient 3.x uses GTK+ 3.x. If your plugin uses GTK+ functions directly, you'll have to convert it to use gtk3-perl. <function>KCWin::get_text</function> KCWin::get_text function: GETs TEXT in the entry box $text = KCWin::get_text Returns the text in the entry box. <function>KCWin::set_text</function> KCWin::set_text function: SETs TEXT in the entry box void KCWin::set_text $ext Sets the text in the entry box. <function>KCWin::feed</function> KCWin::feed function: FEEDs TEXT to the window 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 sec_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 gtk3-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 gtk3-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 Gtk3 -init;". Create windows and display them as usual. The biggest difference is that you must not call Gtk3->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 Gtk3->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 gtk3-modules (this includes modules for the base libraries Glib and GDK, and also for other libraries such as the Gnome ones). Notably, Gtk3::Builder is supported, which allows you to create complex user interfaces visually and load them from the .ui file in the plugin. Note that having the gtk3-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 Gtk3 -init;" line). The example below shows a very simple (and not very useful) plugin using gtk3-perl. It should show how simple it is to use the gtk3-perl bindings in KildClient plugin. A plugin that uses gtk3-perl package gtksample; #: Version: 1.0.0 #: Description: A Plugin Using gtk3-perl #: Author: Eduardo M Kalinowski use Gtk3 -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 gtk3-perl under KildClient.", "It does nothing really useful.", "", "Enter /gtksample::run to try it."); } sub run { return if $window_displayed; $window = Gtk3::Window->new(); $window->set_title("gtk3-perl test"); $window->signal_connect(delete_event => sub { $window_displayed = 0; return 0; }); my $vbox = Gtk3::Box->new('vertical', 8); $entry = Gtk3::Entry->new(); $entry->set_text("Type something here"); $vbox->pack_start($entry, 0, 1, 0); $button = Gtk3::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 gtk3-perl, see https://metacpan.org/release/Gtk3/. 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-3.2.0/doc/C/Makefile.in0000644000175000017500000005176113217705331013567 00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc/C ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(manualdir)" DATA = $(manual_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs 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@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ 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@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ 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@ 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@ runstatedir = @runstatedir@ 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 manual_DATA = $(wildcard kildclient/*.xhtml) \ $(wildcard kildclient/*.css) \ ../kildclient.css 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) --foreign doc/C/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/C/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) @list='$(manual_DATA)'; test -n "$(manualdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(manualdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(manualdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(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|^.*/||'`; \ dir='$(DESTDIR)$(manualdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic 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: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-manualDATA .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ 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-am uninstall uninstall-am uninstall-manualDATA .PRECIOUS: Makefile dist-hook: html verify: xmllint --relaxng /usr/share/xml/docbook/schema/rng/5.0/docbook.rng --noout kildclient.xml html: kildclient.xml ../kildclient-html.xsl ../kildclient.css rm -rf kildclient xsltproc ../kildclient-html.xsl kildclient.xml .PHONY: verify html # 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-3.2.0/doc/Makefile.in0000644000175000017500000004443413217705331013404 00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = doc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs 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@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ 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@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ 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@ 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@ runstatedir = @runstatedir@ 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 EXTRA_DIST = kildclient-html.xsl \ kildclient.css 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) --foreign doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/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. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic 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: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ 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-am uninstall uninstall-am .PRECIOUS: Makefile # 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-3.2.0/doc/kildclient.css0000644000175000017500000000005213215302470014152 00000000000000div.abstract-title { display: none; } kildclient-3.2.0/compile0000755000175000017500000001624513157351331012147 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2014 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: kildclient-3.2.0/mkinstalldirs0000744000175000017500000000672212073641104013370 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2009-04-28.21; # UTC # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' IFS=" "" $nl" errstatus=0 dirmode= usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit $? ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit $? ;; --) # 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 # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do case $file in /*) pathcomp=/ ;; *) pathcomp= ;; esac oIFS=$IFS IFS=/ set fnord $file shift IFS=$oIFS for d do test "x$d" = x && continue 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 # 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-3.2.0/configure0000744000175000017500000064567513217705331012515 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for kildclient 3.2.0. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" 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='3.2.0' PACKAGE_STRING='kildclient 3.2.0' 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 WINDOWS_FALSE WINDOWS_TRUE WINDRES BUILD_DOCS_FALSE BUILD_DOCS_TRUE KILDCLIENT_PERL_LIBS KILDCLIENT_PERL_CFLAGS PERL LIBGNUTLS_LIBS LIBGNUTLS_CFLAGS GTKSPELL_LIBS GTKSPELL_CFLAGS 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 INTL_MACOSX_LIBS USE_NLS EGREP GREP CPP GETTEXT_PACKAGE am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM 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 runstatedir 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_silent_rules enable_maintainer_mode enable_dependency_tracking 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' runstatedir='${localstatedir}/run' 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 ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -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 runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures kildclient 3.2.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --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 3.2.0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --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 3.2.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile 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 3.2.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$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.15' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='kildclient' VERSION='3.2.0' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi 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 as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi 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="de eo es pt_BR sv" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done 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= { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5 $as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; } if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFPreferencesCopyAppValue=yes else gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 $as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then $as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5 $as_echo_n "checking for CFLocaleCopyCurrent... " >&6; } if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then : $as_echo_n "(cached) " >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_CFLocaleCopyCurrent=yes else gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 $as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then $as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi 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 $INTL_MACOSX_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 as_fn_executable_p "$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 ;; *-*-openbsd*) CATOBJEXT=.mo DATADIRNAME=share ;; *) 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 if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 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.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.22.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.22.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.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.22.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes 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.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.22.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.22.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.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.22.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= 2.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.22.0" 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= 2.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.22.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.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.22.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 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 \"gtkspell3-3.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtkspell3-3.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 "gtkspell3-3.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes 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 \"gtkspell3-3.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtkspell3-3.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 "gtkspell3-3.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTKSPELL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtkspell3-3.0" 2>&1` else GTKSPELL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtkspell3-3.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTKSPELL_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gtkspell3-3.0) were not met: $GTKSPELL_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 GTKSPELL_CFLAGS and GTKSPELL_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 GTKSPELL_CFLAGS and GTKSPELL_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 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 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` test "x$?" != "x0" && pkg_failed=yes 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` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBGNUTLS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gnutls" 2>&1` else LIBGNUTLS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gnutls" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBGNUTLS_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (gnutls) were not met: $LIBGNUTLS_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 LIBGNUTLS_CFLAGS and LIBGNUTLS_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 LIBGNUTLS_CFLAGS and LIBGNUTLS_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 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 case $host in *-*-mingw32*) ;; *) # 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 as_fn_executable_p "$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 as_fn_executable_p "$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 -MExtUtils::Embed -e ccopts` KILDCLIENT_PERL_LIBS=`$PERL -MExtUtils::Embed -e 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 ;; esac 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*) 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 as_fn_executable_p "$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 as_fn_executable_p "$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 windows=true ;; *) windows=false ;; esac if test x$windows = xtrue; then WINDOWS_TRUE= WINDOWS_FALSE='#' else WINDOWS_TRUE='#' WINDOWS_FALSE= fi case $host in *-*-mingw32*) LIBS="$LIBS -mwindows -lregex -lws2_32 -lwinmm" ;; 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${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 if test -z "${WINDOWS_TRUE}" && test -z "${WINDOWS_FALSE}"; then as_fn_error $? "conditional \"WINDOWS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by kildclient $as_me 3.2.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to 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 3.2.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _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"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "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-3.2.0/share/0000755000175000017500000000000013220232034011730 500000000000000kildclient-3.2.0/share/plugins/0000755000175000017500000000000013220232034013411 500000000000000kildclient-3.2.0/share/plugins/easypath.pl0000644000175000017500000000052011715757621015526 00000000000000package easypath; #: Version: 1.0.1 #: Description: Adds a shortcut to paths: # #: Author: Eduardo M Kalinowski $::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-3.2.0/share/plugins/channels.pl0000644000175000017500000000536711715757602015520 00000000000000package channels; #: Version: 0.2 #: Description: Separates out regex-matching lines into a new window #: Author: Jakykong # 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-3.2.0/share/plugins/Makefile.am0000644000175000017500000000013411744137121015375 00000000000000pkgplugindir = $(pkgdatadir)/plugins pkgplugin_DATA = *.pl EXTRA_DIST = $(pkgplugin_DATA) kildclient-3.2.0/share/plugins/KCWin.pl0000644000175000017500000000605012367156733014670 00000000000000package KCWin; #: Version: 3.0.0 #: Description: Creates general-purpose windows with an input and output area #: Author: Eduardo M Kalinowski BEGIN { eval "use Gtk3"; die "This plugin requires the gtk3-perl bindings" if $@; } use base 'Gtk3::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 Gtk3::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}, Gtk3::Box, the vertical box that contains the output and input areas. - $kcw->{SCROLLWIN}, Gtk3::ScrolledWindow, this holds the TextView that is used for output. - $kcw->{TEXTVIEW}, Gtk3::TextView, is the widget used for output. - $kcw->{TEXTBUFFER}, Gtk3::TextBuffer, for convenience, the TextBuffer displayed in the window. - $kcw->{CMDAREA}, Gtk3::Box, a box that holds a button to clear the input area, and the input area itself. - $kcw->{BTNCLEAR}, Gtk3::Button, a button that clears the input entry widget when clicked. - $kcw->{ENTRY}, Gtk3::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-3.2.0/share/plugins/notes.pl0000644000175000017500000000475412367156733015056 00000000000000package notes; #: Version: 2.0.0 #: Description: Assign notes to worlds #: Author: Eduardo M Kalinowski BEGIN { eval "use Gtk3 -init;"; die "This plugin requires the gtk3-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 = Gtk3::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 = Gtk3::VBox->new; my $scroll_win = Gtk3::ScrolledWindow->new; $scroll_win->set_policy('never', 'always'); my $text_view = Gtk3::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 = Gtk3::Button->new_with_mnemonic('_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-3.2.0/share/plugins/Makefile.in0000644000175000017500000003451213217705331015416 00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = share/plugins ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgplugindir)" DATA = $(pkgplugin_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ 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@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ 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@ 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@ runstatedir = @runstatedir@ 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 = *.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) --foreign share/plugins/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/plugins/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) @list='$(pkgplugin_DATA)'; test -n "$(pkgplugindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgplugindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgplugindir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(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|^.*/||'`; \ dir='$(DESTDIR)$(pkgplugindir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic 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 cscopelist-am \ ctags-am 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 tags-am uninstall uninstall-am \ uninstall-pkgpluginDATA .PRECIOUS: Makefile # 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-3.2.0/share/plugins/keypad.pl0000644000175000017500000000247111715757634015200 00000000000000package keypad; #: Version: 1.0 #: Description: Allows use of the keypad for moving #: Author: Eduardo M Kalinowski $::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-3.2.0/share/plugins/serverdatadumper.pl0000644000175000017500000000114311715757645017275 00000000000000package serverdatadumper; #: Version: 1.0.0 #: Description: Dumps server data #: Author: Eduardo M Kalinowski use Data::Dumper; $::world->hook('OnServerData', '/serverdatadumper::dump()', { name => 'serverdatadump:dump' }); sub help { $::world->echonl("Dumps server data received via out-of-band protocols such as GMCP and MSDP."); $::world->echonl("Just load the plugin and whenever data is received, it will be"); $::world->echonl("displayed (using Data::Dumper)."); } sub dump { $::world->echonl("Got server data:"); $::world->echo(Data::Dumper->Dump([\%::server_data], ['%::server_data'])); } kildclient-3.2.0/share/plugins/chat.pl0000644000175000017500000014136412367156733014644 00000000000000package chat; #: Version: 2.0.0 #: Description: Chat directly to other people #: Author: Eduardo M Kalinowski 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 = Gtk3::FileChooserDialog->new('Select file', undef, 'open', '_Cancel' => 'cancel', '_Open' => '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 = Gtk3::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 = Gtk3::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 = Gtk3::FileChooserDialog->new('Save file as', undef, 'save', '_Cancel' => 'cancel', '_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-3.2.0/share/plugins/kc256.pl0000644000175000017500000000422411715757627014555 00000000000000package kc256; #: Version: 1.0.0 #: Description: Demonstrates the 256 color mode supported by KildClient #: Author: Eduardo M Kalinowski 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-3.2.0/share/kildclient.png0000644000175000017500000000312611715730227014520 00000000000000PNG  IHDR00WbKGD pHYs  tIME 0L{(tEXtCommentCreated with The GIMPd%nIDAThklU(ےgA  j0Q֨hDI1|jQ1 HPH}@1Z(-Þ><$;3wyϹ?X*pv, 08\̓>~`P42yP 'ہٹd~ l9LUExḍ9]lV (0{5_6q e`Z&? ܙK/3C^L\ A\(.8(n4¶>Uj5ץ+$_Ygk/O&u 8 L:WzL#S]@gہ5K4JOKIO4דoF$@H]| /+%.z>W IxD_UO[!Υ:ГA*\)SnX_i9%3ۚw=qR㱚g >?JS)`"qp0#0- EPT -*`CV)5ҕa.*l CGmr![lVv`fm/`|/04̀X ,lBrJa<)_vP Ԅ~ u:%J,1fcWp0df}=i;kUYhZI+8X$G:kP ٤QC?45kS^E5竰XbI0< Ԁ4Nm0v"Am_ia`9 H>Jcnj'Xl8I`[%ʳ.UNPP=Gt]injd"Ʈw:ѧPxp9 Zx ζаuǥHGT-t9N\%"D"@0=_x4>Յ!Ejc.pl (1S y$N_j,Ày4`rj(KNh>pWoِ^of}g܎\\8nL$gfN ȀY5߻cC'tz< q@+(Ā\a|ٚ;D.Mw:-ƀD}L25QSctm^/=0 3Kf,M}4,jXmD70,)kT(?Q\рw Fz&ZD*0J}V4_nWTei`>W~/LсEFni3kljҨ7t Jo;{|-#P ' B#h.7/if%~[)*.oXdoAA)B:t^0%>N̩^) 5@1bkZ~wrAV2|IENDB`kildclient-3.2.0/share/Makefile.am0000644000175000017500000000066513215302470013721 00000000000000SUBDIRS = plugins pkgdata_DATA = kildclient.pl \ MSDP.pm \ 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 \ helpmaker.pl dist-hook: kildclient.hlp kildclient.hlp: ../doc/C/kildclient.xml helpmaker.pl perl helpmaker.pl > kildclient.hlp kildclient-3.2.0/share/kcworld.dtd0000644000175000017500000001345213215302470014025 00000000000000 kildclient-3.2.0/share/Makefile.in0000644000175000017500000005720113217705331013735 00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = share ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/kcconfig.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } 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_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/mkinstalldirs 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@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ 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@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ 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@ 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@ runstatedir = @runstatedir@ 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 \ MSDP.pm \ 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 \ helpmaker.pl 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) --foreign share/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign share/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) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man6dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man6dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man6dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.6[a-z]*$$/p'; \ fi; \ } | 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,.,'`; \ dir='$(DESTDIR)$(man6dir)'; $(am__uninstall_files_from_dir) install-pixmapDATA: $(pixmap_DATA) @$(NORMAL_INSTALL) @list='$(pixmap_DATA)'; test -n "$(pixmapdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pixmapdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pixmapdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(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|^.*/||'`; \ dir='$(DESTDIR)$(pixmapdir)'; $(am__uninstall_files_from_dir) install-pkgdataDATA: $(pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(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|^.*/||'`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook 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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic 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: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic cscopelist-am ctags ctags-am \ 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-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-am uninstall \ uninstall-am uninstall-man uninstall-man6 uninstall-pixmapDATA \ uninstall-pkgdataDATA .PRECIOUS: Makefile dist-hook: kildclient.hlp kildclient.hlp: ../doc/C/kildclient.xml helpmaker.pl perl helpmaker.pl > kildclient.hlp # 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-3.2.0/share/kildclient.xcf0000644000175000017500000001056411715730227014520 00000000000000gimp xcf file``BB / 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) 1C ...     ';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) 11} @7 @m @f $$ (R֩n+dU ߌ2>dar7 (\q'7d2Ed r (d  d d Ud dPV d<dd+Odddqd" `"N C" -" " " " " " " " " #" 8"` Q"$ q"##.#>#G#p)GnCPV  ^ '^ 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$;6U=4644# "6  } ! _B *!4f > Ipm ZV-k; V |Z 0 6 za;YL(;-2g3)R(>pZ(m1 S""#?:"d"H! y4 f ;{k7 G  02P cf Hc *=mPOJ{ S8jrW5  CMzBX1 XK@v  y  k P|d I>b _ e  mG wz F  W"/#Bw$T'D%el&t()KV*+,1o-~/33355"?7*,5   *8@@9 '  Fw `C$k 69'G#kildclient-3.2.0/share/kildclient.60000644000175000017500000000732113215302470014072 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 https://www.kildclient.org for the latest information on KildClient. kildclient-3.2.0/share/kildclient.hlp0000644000175000017500000015671713220026463014527 00000000000000[index] Use help 'functionname' to get help on that function. The quotes are necessary. [colorize] &Dcolorize function: COLORIZEs a string &cSyntax: $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 'kc256' in the Manual) plugin to display all the colors for you to choose from. [getclientname] &Dgetclientname function: GETs the CLIENT's NAME &cSyntax: $name = getclientname() This function returns the name of the client, that is, "KildClient". [getversion] &Dgetversion function: GETs the KildClient VERSION number &cSyntax: $version = getversion() This function returns the version number of KildClient. [getworld] &Dgetworld function: GETs a pointer to a WORLD &cSyntax: $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. [gotow] &Dgotow function: GOes TO a World &cSyntax: gotow(number) &c 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. [help] &Dhelp function: displays HELP &cSyntax: help('function') Displays help for the given function. The name of the function is passed as a string, so it must be in quotes. [play] &Dplay function: PLAYs a sound file &cSyntax: play(file) This function plays a sound file. The argument is the path to the file. [quit] &Dquit function: QUITs the program &cSyntax: quit() Disconnects and closes all Worlds and KildClient exits. [stripansi] &Dstripansi function: STRIPs ANSI sequences from the string &cSyntax: $stripped = stripansi(str) Returns the string stripped of any ANSI sequences that it had. [stripcolorize] &Dstripcolorize function: STRIPs COLORIZE sequences from the string &cSyntax: $stripped = stripcolorize(str) Returns the string stripped of any sequences used by colorize() to add color to it. [$window->getsize] [getsize] &D$window->getsize function: GETs the current window SIZE &cSyntax: ($lines, $columns) = $window->getsize() &c $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. [$window->minimize] [minimize] &D$window->minimize function: MINIMIZEs the window &cSyntax: $window->minimize() This function minimized KildClient's main window. Called from a macro, it makes a nice boss key. :-) [$window->settitle] [settitle] &D$window->settitle function: SETs the window TITLE &cSyntax: $window->settitle(newtitle) Sets the title of the window to the given string. [$window->seturgencyhint] [seturgencyhint] &D$window->seturgencyhint function: SETs the URGENCY window HINT &cSyntax: $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->alias] [alias] &D$world->alias function: creates an ALIAS &cSyntax: $world->alias(pattern, substitution, [attributes]) &c $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", "substitution", { 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. [$world->aliasenabled] [aliasenabled] &D$world->aliasenabled function: checks whether a ALIAS is ENABLED &cSyntax: $result = $world->aliasenabled(name) &c $result = $world->aliasenabled(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. [$world->close] [close] &D$world->close function: CLOSEs the current world &cSyntax: $world->close() Disconnects and closes the current world, immediately. [$world->cmdseparator] [cmdseparator] &D$world->cmdseparator function: sets or gets the CoMmanD SEPARATOR &cSyntax: $world->cmdseparator(string) When called with an argument, this sets the command separator for the current world to the given value. For more details of the command separator, see section 'Interacting with the MUD' in the Manual and section 'Input' in the Manual. &cSyntax: $separator = $world->cmdseparator() When called without arguments, it returns its current value of the command separator. [$world->commandecho] [commandecho] &D$world->commandecho function: sets or gets the status of the COMMAND ECHO feature &cSyntax: $world->commandecho(boolean) When called 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 'Input' in the Manual. &cSyntax: $status = $world->commandecho() When called without arguments, it returns its current value of the command echo option. [$world->connectother] [connectother] &D$world->connectother function: CONNECTS to anOTHER world &cSyntax: $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. [$world->dc] [dc] &D$world->dc function: DisConnects from world &cSyntax: $world->dc() Disconnects from the current world. [$world->delalias] [delalias] &D$world->delalias function: DELETEs an ALIAS &cSyntax: $n = $world->delalias(name) &c $n = $world->delalias(number) 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. [$world->delhook] [delhook] &D$world->delhook function: DELetes a HOOK &cSyntax: $n = $world->delhook(event, name) &c $n = $world->delhook(event, number) 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. [$world->delmacro] [delmacro] &D$world->delmacro function: DELETEs a MACRO &cSyntax: $n = $world->delmacro(name) &c $n = $world->delmacro(number) 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. [$world->deltimer] [deltimer] &D$world->deltimer function: DELETEs a TIMER &cSyntax: $n = $world->deltimer(name) &c $n = $world->deltimer(number) 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. [$world->deltrigger] [deltrigger] &D$world->deltrigger function: DELETEs a TRIGGER &cSyntax: $n = $world->deltrigger(name) &c $n = $world->deltrigger(number) 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. [$world->disalias] [disalias] &D$world->disalias function: DISables an ALIAS &cSyntax: $world->disalias(name/number, ...) 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. [$world->dishook] [dishook] &D$world->dishook function: DISables a HOOK &cSyntax: $world->dishook(event, name/number, ...) 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. [$world->dismacro] [dismacro] &D$world->dismacro function: DISables a MACRO &cSyntax: $world->dismacro(name/number, ...) 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. [$world->displugin] [displugin] &D$world->displugin: DISables a PLUGIN &cSyntax: $world->displugin(name) Disables the specified plugin. [$world->distimer] [distimer] &D$world->distimer function: DISables a TIMER &cSyntax: $world->distimer(name/number, ...) 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. [$world->distrigger] [distrigger] &D$world->distrigger function: DISables a TRIGGER &cSyntax: $world->distrigger(name/number, ...) 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. [$world->echo] [echo] &D$world->echo function: ECHOes something to the terminal window &cSyntax: $world->echo(str, ...) Prints the strings in the terminal window. They are not sent to the world. See also world_echonl(), world_send(). [$world->echonl] [echonl] &D$world->echonl function: ECHOes to the terminal window, followed by NewLine &cSyntax: $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(). [$world->echonlandlog] [echonlandlog] &D$world->echonlandlog function: calls ECHONL and writetoLOG &cSyntax: $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. [$world->enaalias] [enaalias] &D$world->enaalias function: ENAbles an ALIAS &cSyntax: $world->enaalias(name/number, ...) 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. [$world->enahook] [enahook] &D$world->enahook function: ENAbles a HOOK &cSyntax: $world->enahook(event, name/number, ...) 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. [$world->enamacro] [enamacro] &D$world->enamacro function: ENAbles a MACRO &cSyntax: $world->enamacro(name/number, ...) 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. [$world->enaplugin] [enaplugin] &D$world->enaplugin: ENAbles a PLUGIN &cSyntax: $world->enaplugin(name) Enables the specified plugin. [$world->enatimer] [enatimer] &D$world->enatimer function: ENAbles a TIMER &cSyntax: $world->enatimer(name/number, ...) 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. [$world->enatrigger] [enatrigger] &D$world->enatrigger function: ENAbles a TRIGGER &cSyntax: $world->enatrigger(name/number, ...) 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. [$world->expandalias] [expandalias] &D$world->expandalias function: EXPANDs ALIASes in a string &cSyntax: $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). [$world->gag] [gag] &D$world->gag function: adds a simple GAG &cSyntax: $world->gag(pattern) Adds a gag that prevents lines matching pattern from being shown. See the world_trigger() function for more advanced options. [$world->getaliasnumber] [getaliasnumber] &D$world->getaliasnumber function: GETs an ALIAS's NUMBER &cSyntax: @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. [$world->getcharacter] [getcharacter] &D$world->getcharacter function: GETs the name of the connected CHARACTER &cSyntax: $name = $world->getcharacter() If autologin was used (see section 'General' in the Manual), this function returns the name of the character used to log in to the mud. If autologin is disabled, this function returns undef. [$world->getconntime] [getconntime] &D$world->getconntime function: GETs the CONNection TIME &cSyntax: $seconds = $world->getconntime() This function returns the time spent connected to the world, in seconds. [$world->getentryfont] [getentryfont] &D$world->getentryfont function: GETs the command ENTRY box FONT &cSyntax: $font = $world->getentryfont() This function returns the name of the font used in the command entry box. [$world->gethooknumber] [gethooknumber] &D$world->gethooknumber function: GETs a HOOK's NUMBER &cSyntax: @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. [$world->getidletime] [getidletime] &D$world->getidletime function: GETs the IDLE TIME &cSyntax: $seconds = $world->getidletime() This function returns the idle time, that is, the time elapsed since the last command was sent, in seconds. See section 'Status Bar' in the Manual for information on how that time is calculated and how to configure it. [$world->getinput] [getinput] &D$world->getinput function: GETs INPUT text &cSyntax: $text = $world->getline() This function returns the current text in the command entry box. [$world->getkeycode] [getkeycode] &D$world->getkeycode function: GETs the KEYCODE for a key combination &cSyntax: $keycode = $world->getkeycode() 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. [$world->getline] [getline] &D$world->getline function: GETs a LINE from the scrollback buffer &cSyntax: $text = $world->getline(line) &c ($text, $time) = $world->getline(line) This function 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. [$world->getlogfile] [getlogfile] &D$world->getlogfile: GETs name of LOGging FILE &cSyntax: $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. [$world->getmacronumber] [getmacronumber] &D$world->getmacronumber function: GETs a MACRO's NUMBER &cSyntax: @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. [$world->getmainfont] [getmainfont] &D$world->getname function: GETs the MAIN window FONT &cSyntax: $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. [$world->getname] [getname] &D$world->getname function: GETs the NAME of the world &cSyntax: $name = $world->getname() This function returns the name of the world. [$world->getpluginversion] [getpluginversion] &D$world->getpluginversion function: GETs a PLUGIN's VERSION &cSyntax: $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. [$world->gettimernumber] [gettimernumber] &D$world->gettimernumber function: GETs a TIMER's NUMBER &cSyntax: @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. [$world->gettriggernumber] [gettriggernumber] &D$world->gettriggernumber function: GETs a TRIGGER's NUMBER &cSyntax: @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. [$world->hook] [hook] &D$world->hook function: connects a HOOK &cSyntax: $world->hook(event, action, [attributes]) &c $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 function 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. [$world->hookenabled] [hookenabled] &D$world->hookenabled function: checks whether a HOOK is ENABLED &cSyntax: $result = $world->hookenabled(event, name) &c $result = $world->hookenabled(event, 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. [$world->interpret] [interpret] &D$world->interpret function: INTERPRETs a string as if typed in the input box &cSyntax: $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. [$world->ispermanent] [ispermanent] &D$world->ispermanent function: checks wheter a variable IS PERMANENT &cSyntax: $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. [$world->listalias] [listalias] &D$world->listalias function: LISTs one or all ALIASes &cSyntax: $world->listalias() Briefly lists all defined aliases. &cSyntax: $world->listalias(name/number, ...) 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. [$world->listhook] [listhook] &D$world->listhook function: LISTs connected HOOKs &cSyntax: $world->listhook(event) This function briefly lists all hooks connected to the given event. &cSyntax: $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. Several arguments can be passed at once. [$world->listmacro] [listmacro] &D$world->listmacro function: LISTs one or all MACROs &cSyntax: $world->listmacro() Briefly lists all defined macros. &cSyntax: $world->listmacro(name/number, ...) 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. [$world->listpermanent] [listpermanent] &D$world->listpermanent function: LISTs PERMANENT variables &cSyntax: $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. [$world->listplugin] [listplugin] &D$world->listplugin function: LISTs loaded PLUGINs &cSyntax: $world->listplugin() Briefly lists all loaded plugins. &cSyntax: $world->listplugin(name) &c $world->listplugin(number) Gives detailed information on the given plugin. [$world->listtimer] [listtimer] &D$world->listimer function: LISTs one or all TIMERs &cSyntax: $world->listtimer() Briefly lists all defined timers. &cSyntax: $world->listtimer(name/number, ...) 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. [$world->listtrigger] [listtrigger] &D$world->listtrigger function: LISTs one or all TRIGGERs &cSyntax: $world->listtrigger() Briefly lists all defined triggers. &cSyntax: $world->listtrigger(name/number, ...) 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. [$world->loadplugin] [loadplugin] &D$world->loadplugin function: LOADs a PLUGIN &cSyntax: $success = $world->loadplugin(name) &c $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. [$world->logfile] [logfile] &Dlogfile function: enables or disables LOGging the output to a FILE &cSyntax: $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. &cSyntax: $world->logfile() With no arguments, this function stops logging output. [$world->macro] [macro] &D$world->macro function: creates a MACRO &cSyntax: $world->macro(keycode, action, [attributes]) &c $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 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. [$world->macroenabled] [macroenabled] &D$world->macroenabled function: checks whether a MACRO is ENABLED &cSyntax: $result = $world->macroenabled(name) &c $result = $world->macroenabled(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. [$world->makepermanent] [makepermanent] &D$world->makepermanent function: MAKEs variables PERMANENT &cSyntax: $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. [$world->maketemporary] [maketemporary] &D$world->maketemporary function: MAKEs variables TEMPORARY &cSyntax: $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. [$world->mlsend] [mlsend] &D$world->mlsend function: Multi-Line SEND &cSyntax: $success = $world->mlsend(attributes) This function emulates the Multi-line Send feature (see section 'Multi-line Send' in the Manual) 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 'Sending' in the Manual). * linesatime: The number of lines to be sent at a time. If not given, the value is taken from the Global Preferences (see section 'Sending' in the Manual). 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. [$world->movealias] [movealias] &D$world->movealias function: MOVEs an ALIAS to another position &cSyntax: $world->movealias(name, new_pos) &c $world->movealias(number, 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. [$world->movehook] [movehook] &D$world->movehook function: MOVEs a HOOK to another position &cSyntax: $world->movehook(event, name, new_pos) &c $world->movehook(event, number, 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. [$world->movemacro] [movemacro] &D$world->movemacro function: MOVEs a MACRO to another position &cSyntax: $world->movemacro(name, new_pos) &c $world->movemacro(number, 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. [$world->movetimer] [movetimer] &D$world->movetimer function: MOVEs a TIMER to another position &cSyntax: $world->movetimer(name, new_pos) &c $world->movetimer(number, 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. [$world->movetrigger] [movetrigger] &D$world->movetrigger function: MOVEs a TRIGGER to another position &cSyntax: $world->movetrigger(name, new_pos) &c $world->movetrigger(number, 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. [$world->next] [next] &D$world->next function: goes to the NEXT world &cSyntax: $world->next() When called without arguments, this function focuses the next open World. &cSyntax: $world->next(number) When called with a numeric argument X, it focuses the Xth World after the current one. [$world->path] [path] &D$world->path function: generate sequences of directions forming a PATH &cSyntax: $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 The commands are sent using the settings in the Sending tab of the Preferences dialog (see section 'Sending' in the Manual). [$world->prev] [prev] &D$world->prev function: goes to the PREVious world &cSyntax: $world->prev() When called without arguments, this function focuses the previous open world. &cSyntax: $world->prev(number) When called with a numeric argument X, it focuses the Xth world before the current one. [$world->reconnect] [reconnect] &D$world->reconnect function: RECONNECTs to the world &cSyntax: $world->reconnect() When in offline mode, this function will attempt to reconnect to the mud. [$world->requireplugin] [requireplugin] &D$world->requireplugin function: REQUIREs a PLUGIN to be loaded &cSyntax: $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. [$world->save] [save] &D$world->save function: SAVEs the current world &cSyntax: $world->save() Saves the current World. [$world->send] [send] &D$world->send function: SENDs something to the world &cSyntax: $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(). [$world->sendecho] [sendecho] &D$world->sendecho function: SENDs something to the world, with ECHO &cSyntax: $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 'Input' in the Manual). See also world_send() and world_sendnoecho(). [$world->sendfile] [sendfile] &D$world->sendfile function: SENDs a FILE to the world &cSyntax: $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 'Sending' in the Manual). 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. [$world->sendlines] [sendlines] &D$world->sendlines function: SENDs several LINES to the world &cSyntax: $success = $world->sendlines(multi-linestring, [delay, [n-lines]]) &c $success = $world->sendlines([line1,line2,...], [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 'Sending' in the Manual). 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. [$world->sendmsdpcommand] [sendmsdpcommand] &D$world->sendmsdpcommand function: SENDs an MSDP protocol COMMAND &cSyntax: $world->sendmsdpcommand(command, argument1, ...) Sends a specific type of data to the server using MSDP. See section 'MSDP data' in the Manual. [$world->sendnoecho] [sendnoecho] &D$world->sendnoecho function: SENDs something to the world, with NO ECHO &cSyntax: $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 'Input' in the Manual). See also world_send() and world_sendecho() . [$world->sendserverdata] [sendserverdata] &D$world->sendserverdata function: SENDs out-of-band DATA to the SERVER &cSyntax: $world->sendserverdata(hash_reference) Sens out-of-band data to the server. See section 'Sending server data' in the Manual for details. [$world->setinput] [setinput] &D$world->setinput function: SETs INPUT text &cSyntax: $world->setinput(text) Sets the text in command entry box to the given text. [$world->setstatus] [setstatus] &D$world->setstatus function: SETs the STATUS bar text &cSyntax: $world->setstatus(text) Sets the text in the main window status bar to the given text. [$world->silentdisalias] [silentdisalias] &D$world->silentdisalias function: SILENTly DISables an ALIAS &cSyntax: $world->silentdisalias(name/number, ...) 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. Does not print a message in the screen in case of success. [$world->silentdishook] [silentdishook] &D$world->silentdishook function: SILENTly DISables a HOOK &cSyntax: $world->silentdishook(event, name/number, ...) 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. Does not print a message in the screen in case of success. [$world->silentdismacro] [silentdismacro] &D$world->silentdismacro function: SILENTly DISables a MACRO &cSyntax: $world->silentdismacro(name/number, ...) 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. Does not print a message in the screen in case of success. [$world->silentdistimer] [silentdistimer] &D$world->silentdistimer function: SILENTly DISables a TIMER &cSyntax: $world->silentdistimer(name/number, ...) 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. Does not print a message in the screen in case of success. [$world->silentdistrigger] [silentdistrigger] &D$world->silentdistrigger function: SILENTly DISables a TRIGGER &cSyntax: $world->silentdistrigger(name/number, ...) 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. Does not print a message in the screen in case of success. [$world->silentenaalias] [silentenaalias] &D$world->silentenaalias function: SILENTly ENAbles an ALIAS &cSyntax: $world->silentenaalias(name/number, ...) 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. Does not print a message in the screen in case of success. [$world->silentenahook] [silentenahook] &D$world->silentenahook function: SILENTly ENAbles a HOOK &cSyntax: $world->silentenahook(event, name/number, ...) 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. Does not print a message in the screen in case of success. [$world->silentenamacro] [silentenamacro] &D$world->silentenamacro function: SILENTly ENAbles a MACRO &cSyntax: $world->silentenamacro(name/number, ...) 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. Does not print a message in the screen in case of success. [$world->silentenatimer] [silentenatimer] &D$world->silentenatimer function: SILENTly ENAbles a TIMER &cSyntax: $world->silentenatimer(name/number, ...) 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. Does not print a message in the screen in case of success. [$world->silentenatrigger] [silentenatrigger] &D$world->silentenatrigger function: SILENTly ENAbles a TRIGGER &cSyntax: $world->silentenatrigger(name/number, ...) 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. Does not print a message in the screen in case of success. [$world->timer] [timer] &D$world->timer function: creates a TIMER &cSyntax: $world->timer(attributes) &c $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. Fractions of seconds (such as 1.5) are allowed. 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. [$world->timerenabled] [timerenabled] &D$world->timerenabled function: checks whether a TIMER is ENABLED &cSyntax: $result = $world->timerenabled(name) &c $result = $world->timerenabled(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. [$world->trigger] [trigger] &D$world->trigger function: creates a TRIGGER &cSyntax: $world->trigger(pattern, action, [attributes]) &c $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 'Rewriter Triggers' in the Manual. * 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: $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. [$world->triggerenabled] [triggerenabled] &D$world->triggerenabled function: checks whether a TRIGGER is ENABLED &cSyntax: $result = $world->triggerenabled(name) &c $result = $world->triggerenabled(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. [$world->writetolog] [writetolog] &D$world->writetolog function: WRITEs something TO the LOG file &cSyntax: $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(). [KCWin::get_text] [get_text] &DKCWin::get_text function: GETs TEXT in the entry box &cSyntax: $text = KCWin::get_text() Returns the text in the entry box. [KCWin::set_text] [set_text] &DKCWin::set_text function: SETs TEXT in the entry box &cSyntax: KCWin::set_text($ext) Sets the text in the entry box. [KCWin::feed] [feed] &DKCWin::feed function: FEEDs TEXT to the window &cSyntax: 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-3.2.0/share/kildclient.pl0000644000175000017500000007612013217710132014343 00000000000000### Copyright (C) 2004-2017 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 JSON; use MSDP; 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, $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($self->_getnosuchmsg($objnum)); } 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); } } else { $self->_listobject(undef, '_listtrigger', 0); } } sub listalias { my $self = shift; if (@_) { foreach (@_) { $self->_listobject($_, '_listalias', 1); } } else { $self->_listobject(undef, '_listalias', 1); } } sub listmacro { my $self = shift; if (@_) { foreach (@_) { $self->_listobject($_, '_listmacro', 2); } } else { $self->_listobject(undef, '_listmacro', 2); } } sub listtimer { my $self = shift; if (@_) { foreach (@_) { $self->_listobject($_, '_listtimer', 3); } } else { $self->_listobject(undef, '_listtimer', 3); } } sub listhook { my $self = shift; my $event = shift; if (@_) { foreach (@_) { $self->_listobject($_, '_listhook', 4, $event); } } else { $self->_listobject(undef, '_listhook', 4, $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, # Hook 0, # By name $event); return @found; } sub _delobject { my $self = shift; my ($target, $function, $objnum, $extrafirstarg) = @_; my $deleted = 0; if (!defined($target)) { $self->echonl(sprintf(_('%s: Too few arguments.'), $function)); return undef; } if ($target =~ /^\d+$/) { if ($extrafirstarg) { eval("\$deleted += \$self->_$function(\$extrafirstarg, $target)"); } else { eval("\$deleted += \$self->_$function($target)"); } } else { my @found = reverse($self->_getobjectnumber($target, $objnum, 0, $extrafirstarg)); foreach (@found) { if ($extrafirstarg) { eval("\$deleted += \$self->_$function(\$extrafirstarg, $_)"); } else { eval("\$deleted += \$self->_$function($_)"); } } } unless ($self->{SILENT}) { $self->echonl($self->_getdelmsg($deleted, $objnum)); } return $deleted; } sub deltrigger { my $self = shift; return $self->_delobject($_[0], 'deltrigger', 0); } sub delalias { my $self = shift; return $self->_delobject($_[0], 'delalias', 1); } sub delmacro { my $self = shift; return $self->_delobject($_[0], 'delmacro', 2); } sub deltimer { my $self = shift; return $self->_delobject($_[0], 'deltimer', 3); } sub delhook { my $self = shift; return $self->_delobject($_[1], 'delhook', 4, $_[0]); } sub _moveobject { my $self = shift; my ($old, $new_pos, $function, $objnum, $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($self->_getnosuchmsg($objnum)); } } else { my @found = $self->_getobjectnumber($old, $objnum, 0, $extrafirstarg); if (scalar @found == 0) { $self->echonl($self->_getnosuchmsg($objnum)); } 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(_('Successfully moved.')); } } } } else { $self->echonl(sprintf(_('%s: Too few arguments.'), $function)); } } sub movetrigger { my $self = shift; $self->_moveobject($_[0], $_[1], 'movetrigger', 0); } sub movealias { my $self = shift; $self->_moveobject($_[0], $_[1], 'movealias', 1); } sub movemacro { my $self = shift; $self->_moveobject($_[0], $_[1], 'movemacro', 2); } sub movetimer { my $self = shift; $self->_moveobject($_[0], $_[1], 'movetimer', 3); } sub movehook { my $self = shift; my $event = shift; $self->_moveobject($_[0], $_[1], 'movehook', 4, $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($self->_getnosuchmsg($objnumber)); } 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 silentenatrigger { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->enatrigger(@_); $self->{SILENT} = $silent; } sub silentdistrigger { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->distrigger(@_); $self->{SILENT} = $silent; } sub silentenaalias { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->enaalias(@_); $self->{SILENT} = $silent; } sub silentdisalias { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->disalias(@_); $self->{SILENT} = $silent; } sub silentenamacro { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->enamacro(@_); $self->{SILENT} = $silent; } sub silentdismacro { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->dismacro(@_); $self->{SILENT} = $silent; } sub silentenatimer { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->enatimer(@_); $self->{SILENT} = $silent; } sub silentdistimer { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->distimer(@_); $self->{SILENT} = $silent; } sub silentenahook { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->enahook(@_); $self->{SILENT} = $silent; } sub silentdishook { my $self = shift; my $silent = $self->{SILENT}; $self->{SILENT} = 1; $self->dishook(@_); $self->{SILENT} = $silent; } 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 _getdelmsg { my $self = shift; my ($deleted, $objnum) = @_; my $msg; if (!$deleted) { return $self->_getnosuchmsg($objnum); } else { my $objname; if ($objnum == 0) { $objname = ::ngettext('trigger', 'triggers', $deleted); } if ($objnum == 1) { $objname = ::ngettext('alias', 'aliases', $deleted); } if ($objnum == 2) { $objname = ::ngettext('macro', 'macros', $deleted); } if ($objnum == 3) { $objname = ::ngettext('timer', 'timers', $deleted); } if ($objnum == 4) { $objname = ::ngettext('hook', 'hooks', $deleted); } return sprintf(::ngettext('One %1$s deleted', '%2$d %1$s deleted', $deleted), $objname, $deleted); } } sub _getnosuchmsg { my $self = shift; my ($objnum) = @_; if ($objnum == 0) { return _('No such trigger'); } if ($objnum == 1) { return _('No such alias'); } if ($objnum == 2) { return _('No such macro'); } if ($objnum == 3) { return _('No such timer'); } if ($objnum == 4) { return _('No such hook'); } } 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 sendserverdata { my $self = shift; my ($data) = @_; my $protocol = $data->{'protocol'}; my $converted; if ($protocol eq "GMCP") { $converted = ::_preparegmcpdata($data); } elsif ($protocol eq "MSDP") { $converted = ::_preparemsdpdata($data); } else { $self->echonl(_('Unknown protocol')); return; } $self->_sendserverdata($protocol, $converted); } sub sendmsdpcommand { my $self = shift; my $msdp = MSDP->new(); my $converted = $msdp->encode_command(@_); $self->_sendserverdata('MSDP', $converted); } } 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 { my ($topic) = @_; $topic ||= "index"; $topic =~ s/\$/\\\$/; open(HFILE, "<$__helpfile") or die(_('Cannot open help file.')); my $outputting = 0; while () { chomp; if (!$outputting) { next if ($_ !~ "\\[$topic\\]"); $outputting = 1; } else { if ($_ =~ /^\[/) { close(HFILE); return; } if ($_ =~ /^[&^]/) { $::world->echonl(::colorize($_)); } else { $::world->echonl($_); } } } close(HFILE); $::world->echonl(_('Help topic not found.')); } sub _parseserverdata { if (scalar @_ < 1) { $::world->echonl(sprintf(_('%s: This is an internal function, do not call directly.'), '_parseserverdata')); return; } # Clear previous data %::server_data = (); $::server_data{'protocol'} = $_[0]; if ($::server_data{'protocol'} eq "GMCP") { _parsegmcpserverdata(); } elsif ($::server_data{'protocol'} eq "MSDP") { _parsemsdpserverdata(); } else { $::server_data{'error'} = "Unknown protocol"; $::server_data{'data'} = $::_serverdata; } } sub _parsegmcpserverdata { my ($namespace, $data) = split(/\s+/, $::_serverdata, 2); my ($p1, $p2, $p3) = split(/\./, $namespace, 3); if (defined $p3) { $::server_data{'package'} = $p1; $::server_data{'subpackage'} = $p2; $::server_data{'message'} = $p3; } else { $::server_data{'package'} = $p1; $::server_data{'message'} = $p2; } if (defined $data) { eval { my $json = JSON->new->allow_nonref; $::server_data{'data'} = $json->decode($data); 1; } or do { $::server_data{'error'} = $@; $::server_data{'data'} = $::_serverdata; } } } sub _parsemsdpserverdata { eval { my $msdp = MSDP->new(); $::server_data{'data'} = $msdp->decode($::_serverdata); 1; } or do { $::server_data{'error'} = $@; $::server_data{'data'} = $::_serverdata; } } sub _preparegmcpdata { my ($data) = @_; my $converted = $data->{'package'}; if (defined $data->{'subpackage'}) { $converted .= "."; $converted .= $data->{'subpackage'}; } if (defined $data->{'message'}) { $converted .= "."; $converted .= $data->{'message'}; } if (exists $data->{'data'}) { my $json = JSON->new->allow_nonref; $converted .= " "; $converted .= $json->encode($data->{'data'}); } return $converted; } sub _preparemsdpdata { my ($data) = @_; my $msdp = MSDP->new(); return $msdp->encode($data->{'data'}); } kildclient-3.2.0/share/kildclient.ico0000744000175000017500000000427611715730227014516 00000000000000 ( @    %'-003BG$CG$U[.dk6el6fm7      ?`?@p<??????????kildclient-3.2.0/share/helpmaker.pl0000744000175000017500000001254313217710066014177 00000000000000#!/usr/bin/perl # Copyright (C) 2004-2017 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. use strict; use warnings; use XML::LibXML::Reader; use Text::Wrap; # Global variables my $document; my $xpc; main(); sub main { print <<'EOF'; [index] Use help 'functionname' to get help on that function. The quotes are necessary. EOF $document = XML::LibXML->load_xml(location => "../doc/C/kildclient.xml", no_blanks => 1); $xpc = XML::LibXML::XPathContext->new(); $xpc->registerNs('db', 'http://docbook.org/ns/docbook'); my @functions = $xpc->findnodes('//db:sect1[starts-with(@xml:id, "func_")]', $document); for my $function (@functions) { write_function($function); } } sub write_function { my ($root) = @_; write_title($root); my $description_start = $root->firstChild()->nextSibling(); write_description($description_start); } sub write_title { my ($root) = @_; my $function = $xpc->findvalue("db:info/db:title/db:function", $root); print "[$function]"; my $shortened = $function; $shortened =~ s/.*(::|>)//; if ($shortened ne $function) { print " [$shortened]"; } print "\n"; } sub write_description { my ($start) = @_; print get_texts($start); } sub get_texts { my ($start) = @_; my $i = $start; my $result = ""; while (defined $i) { my $text = get_text($i); $result .= $text; $i = $i->nextNonBlankSibling(); } return $result; } sub get_text { my ($node) = @_; my $nodename = $node->nodeName(); if ($nodename eq "para") { return n_paragraph($node); } elsif ($nodename eq "abstract") { return n_abstract($node); } elsif ($nodename eq "funcsynopsis") { return n_funcsynopsis($node); } elsif ($nodename eq "itemizedlist") { return n_list($node); } elsif ($nodename eq "screen") { return n_code($node); } elsif ($nodename eq "programlisting") { return n_code($node); } elsif ($nodename eq "example") { return n_example($node); } else { return "Unknown element " . $node->nodeName() . "\n\n"; } } sub n_paragraph { my ($node) = @_; for my $xref ($xpc->findnodes('db:xref', $node)) { my $new_text = XML::LibXML::Text->new( get_xref_text($xref->getAttribute('linkend'))); $xref->replaceNode($new_text); } for my $menuchoice ($xpc->findnodes('db:menuchoice', $node)) { my $guimenu = $menuchoice->firstChild(); my $guimenuitem = $guimenu->nextSibling(); my $new_text = XML::LibXML::Text->new($guimenu->textContent() . '->' . $guimenuitem->textContent()); $menuchoice->replaceNode($new_text); } return wrap_text($node->textContent()) . "\n\n"; } sub get_xref_text { my ($xref) = @_; if ($xref =~ /^func_/) { $xref =~ s/^func_//; $xref =~ s/$/()/; } else { my $sect = ($xpc->findnodes("//*[\@xml:id = '$xref']", $document))[0]; my $title = $sect->firstChild->textContent(); $xref = "section '$title' in the Manual"; } return $xref; } sub wrap_text { my ($text) = @_; $text =~ s#\n\s+# #g; return fill("", "", $text) } sub n_abstract { my ($node) = @_; return "&D" . $node->firstChild()->textContent() . "\n\n"; } sub n_funcsynopsis { my ($node) = @_; my $result = ""; my $first = 1; foreach my $prototype ($xpc->findnodes('db:funcprototype', $node)) { my $funcdef = $prototype->firstChild(); my $returnType = $funcdef->firstChild(); if ($returnType->nodeValue() eq "void ") { $funcdef->removeChild($returnType); } $result .= $first ? "&cSyntax: " : "&c "; my $func_call = $funcdef->textContent(); $func_call =~ s/\n\s+/ /g; $result .= $func_call; $first = 0; my @parameters = $xpc->findnodes("db:paramdef", $prototype); $result .= "(" . join(', ', map { get_parameter($_) } @parameters) . ")\n"; } $result .= "\n"; return $result; } sub get_parameter { my ($node) = @_; my $parameter = $_->textContent(); $parameter =~ s/\s//g; return $parameter; } sub n_list { my ($node) = @_; local $Text::Wrap::columns = $Text::Wrap::columns - 4; my $result; for my $item ($xpc->findnodes('db:listitem', $node)) { my $text = get_texts($item->firstNonBlankChild()); $text =~ s#\n(.)#\n $1#g; $result .= " * $text"; } return $result; } sub n_code { my ($node) = @_; my $text = remove_initial_nl($node->textContent()); return $text . "\n"; } sub n_example { my ($node) = @_; my $text = remove_initial_nl($xpc->findvalue('db:programlisting', $node)); return $text . "\n"; } sub remove_initial_nl { my ($str) = @_; $str =~ s/^\n//; return $str; } kildclient-3.2.0/share/MSDP.pm0000644000175000017500000001457611715730227013004 00000000000000package MSDP; use strict; use warnings; use Carp; use constant { MSDP_VAR => chr(1), MSDP_VAL => chr(2), MSDP_TABLE_OPEN => chr(3), MSDP_TABLE_CLOSE => chr(4), MSDP_ARRAY_OPEN => chr(5), MSDP_ARRAY_CLOSE => chr(6), EOF => chr(0), }; ####################################################################### # Public functions # ####################################################################### sub new { my $self = shift; my $class = ref($self) || $self; my $data = shift; return bless { }, $class; } sub decode { my $self = shift; my ($data) = (@_); $self->{'data'} = $data; $self->{'current_pos'} = 0; my %variables; my $next_tok = $self->_get_next_token_or_eof(); while ($next_tok ne EOF) { $self->_put_back($next_tok); my ($name, $value) = $self->_get_var(); $variables{$name} = $value; $next_tok = $self->_get_next_token_or_eof(); } return \%variables; } sub encode { my $self = shift; my ($data) = (@_); if (ref($data) ne 'HASH') { Carp::croak("Invalid data type, expecting hash reference"); } my $encoded = ""; while (my ($key, $value) = each(%$data)) { $encoded .= _encode_var($key, $value); } return $encoded; } sub encode_command { my $self = shift; if (scalar @_ < 1) { Carp::croak("Command not specified"); } my $command = shift; my $encoded = MSDP_VAR . $command; foreach my $arg (@_) { $encoded .= MSDP_VAL . _encode_value($arg); } return $encoded; } ####################################################################### # Private functions # ####################################################################### ####################################################################### # Decoding # ####################################################################### sub _get_var { my $self = shift; $self->_expect(MSDP_VAR); my $name = $self->_get_textual_token(); $self->_expect(MSDP_VAL); my $value = $self->_get_value(); # Handle the case of a multi-valued variable (which becomes an array) # eg: MSDP_VAR variable MSDP_VAL value1 MSDP_VAL value2 my $token = $self->_get_next_token_or_eof(); while ($token eq MSDP_VAL) { unless (ref($value)) { $value = [ $value ]; } my $next_value = $self->_get_value(); push(@$value, $next_value); $token = $self->_get_next_token_or_eof(); } $self->_put_back($token); return ($name, $value); } sub _get_value { my $self = shift; my $token = $self->_get_next_token(); if ($token eq MSDP_ARRAY_OPEN) { return $self->_get_array() } elsif ($token eq MSDP_TABLE_OPEN) { return $self->_get_table(); } return $token; } sub _get_array { my $self = shift; my @values; while (1) { my $token = $self->_get_next_token(); if ($token eq MSDP_ARRAY_CLOSE) { return \@values; } elsif ($token eq MSDP_VAL) { push (@values, $self->_get_value()); } else { # FIXME: Better reporting Carp::croak("Got unexpected token, expecting MSDP_VAL or MSDP_ARRAY_CLOSE"); } } } sub _get_table { my $self = shift; my %values; while (1) { my $token = $self->_get_next_token(); if ($token eq MSDP_TABLE_CLOSE) { return \%values; } elsif ($token eq MSDP_VAR) { $self->_put_back($token); my ($name, $value) = $self->_get_var(); $values{$name} = $value; } else { # FIXME: Better reporting Carp::croak("Got unexpected token, expecting MSDP_VAR or MSDP_TABLE_CLOSE"); } } } sub _expect { my $self = shift; my ($expected_token) = @_; if ($self->_get_next_token_or_eof() ne $expected_token) { # FIXME: Describe better the problem: what we got, and what should # have been found Carp::croak("Got unexpected token"); } } sub _get_textual_token { my $self = shift; my $token = $self->_get_next_token(); if (_is_special_char($token)) { # FIXME: Better reporting Carp::croak("Expecting a string, got a control token"); } return $token; } sub _get_next_token { my $self = shift; my $token = $self->_get_next_token_or_eof(); if ($token eq EOF) { Carp::croak("Unexpected end of string"); } return $token; } sub _put_back { my $self = shift; my ($token) = @_; $self->{'next_token'} = $token; } sub _get_next_token_or_eof { my $self = shift; if (defined $self->{'next_token'}) { my $token = $self->{'next_token'}; $self->{'next_token'} = undef; return $token; } my $char = $self->_get_next_char(); if ($char eq EOF) { return EOF; } if (_is_special_char($char)) { return $char; } my $name = $char; while (1) { $char = $self->_get_next_char(); if ($char eq EOF) { return $name; } if (_is_special_char($char)) { --$self->{'current_pos'}; return $name; } $name .= $char; } } sub _get_next_char { my $self = shift; if ($self->{'current_pos'} == length($self->{'data'})) { return EOF; } my $char = substr($self->{'data'}, $self->{'current_pos'}++, 1); return $char; } sub _is_special_char { my ($char) = @_; return (($char ge MSDP_VAR && $char le MSDP_ARRAY_CLOSE) || $char eq EOF); } ####################################################################### # Encoding # ####################################################################### sub _encode_var { my ($key, $value) = @_; return MSDP_VAR . $key . MSDP_VAL . _encode_value($value); } sub _encode_value { my ($value) = @_; my $type = ref($value); if ($type eq '') { return $value; } elsif ($type eq 'SCALAR') { return $$value; } elsif ($type eq 'ARRAY') { return _encode_array($value); } elsif ($type eq 'HASH') { return _encode_table($value); } else { Carp::croak("Unsupported type $type"); } } sub _encode_array { my ($array) = @_; my $encoded = MSDP_ARRAY_OPEN; foreach my $element (@$array) { $encoded .= MSDP_VAL . _encode_value($element); } $encoded .= MSDP_ARRAY_CLOSE; return $encoded; } sub _encode_table { my ($hash) = @_; my $encoded = MSDP_TABLE_OPEN; while (my ($key, $value) = each(%$hash)) { $encoded .= MSDP_VAR . $key . MSDP_VAL . _encode_value($value); } $encoded .= MSDP_TABLE_CLOSE; return $encoded; } 1; kildclient-3.2.0/share/kildclient.xpm0000644000175000017500000000311611715730227014537 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-3.2.0/install-sh0000755000175000017500000003546313157351331012600 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2014-09-12.12; # 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. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # 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_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 is_target_a_directory=possibly 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 *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else dstdir=`dirname "$dst"` 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. ;; *) # $RANDOM is not portable (e.g. dash); use it when possible to # lower collision chance tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # As "mkdir -p" follows symlinks and we work in /tmp possibly; so # create the $tmpdir first (and fail if unsuccessful) to make sure # that nobody tries to guess the $tmpdir name. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 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 oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && 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-3.2.0/config.guess0000755000175000017500000012544713215233062013111 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2017 Free Software Foundation, Inc. timestamp='2017-11-07' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess # # Please send patches to . me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /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 ;; earmv*) arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-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) and ABI. case "${UNAME_MACHINE_ARCH}" in earm*) os=netbsdelf ;; 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 # Determine ABI tags. case "${UNAME_MACHINE_ARCH}" in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` ;; 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/[-_].*//' | cut -d. -f1,2` ;; 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}${abi}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} exit ;; *:MidnightBSD:*:*) echo ${UNAME_MACHINE}-unknown-midnightbsd${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 ;; *:Sortix:*:*) echo ${UNAME_MACHINE}-unknown-sortix exit ;; *:Redox:*:*) echo ${UNAME_MACHINE}-unknown-redox exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` 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:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = hppa2.0w ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; *:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys 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 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; e2k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; k1om:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; mips64el:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; openrisc*:Linux:*:*) echo or1k-unknown-linux-${LIBC} exit ;; or32:Linux:*:* | or1k*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; riscv32:Linux:*:* | riscv64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:*) 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 configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; SX-ACE:SUPER-UX:*:*) echo sxace-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi fi elif test "$UNAME_PROCESSOR" = i386 ; then # Avoid executing cc on OS X 10.9, as it ships with a stub # that puts up a graphical alert prompting to install # developer tools. Any system running Mac OS X 10.7 or # later (Darwin 11 and later) is required to have a 64-bit # processor. This is not true of the ARM version of Darwin # that Apple uses in portable devices. UNAME_PROCESSOR=x86_64 fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-*:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-*:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; NSX-*:NONSTOP_KERNEL:*:*) echo nsx-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; amd64:Isilon\ OneFS:*:*) echo x86_64-unknown-onefs exit ;; esac echo "$0: unable to guess system type" >&2 case "${UNAME_MACHINE}:${UNAME_SYSTEM}" in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&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-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: kildclient-3.2.0/Makefile.in0000644000175000017500000007074413217705331012642 00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) 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 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(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_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = po src share doc am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in AUTHORS \ COPYING NEWS README compile config.guess config.sub depcomp \ install-sh missing mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ 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@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ 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@ 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@ runstatedir = @runstatedir@ 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 = kildclient.spec \ kildclient.desktop \ win32/* all: kcconfig.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(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) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile 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 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status 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) @list='$(apps_DATA)'; test -n "$(appsdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(appsdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(appsdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(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|^.*/||'`; \ dir='$(DESTDIR)$(appsdir)'; $(am__uninstall_files_from_dir) install-pkgdocDATA: $(pkgdoc_DATA) @$(NORMAL_INSTALL) @list='$(pkgdoc_DATA)'; test -n "$(pkgdocdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdocdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdocdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(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|^.*/||'`; \ dir='$(DESTDIR)$(pkgdocdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -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) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(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/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: 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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic 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: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip 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-am uninstall uninstall-am \ uninstall-appsDATA uninstall-pkgdocDATA .PRECIOUS: Makefile # 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-3.2.0/src/0000755000175000017500000000000013220232034011415 500000000000000kildclient-3.2.0/src/ansitextview.c0000644000175000017500000005310713217707706014264 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include #include "kcircularqueue.h" #include "ansi.h" #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static void ansitextview_append_string_internal(WorldGUI *gui, const gchar *str, gboolean add_nl); static void ansitextview_append_formatted(WorldGUI *gui, GtkTextIter *iter, const gchar *text, TAState *ta_state, GtkTextTag *extra_tag); void queue_ansiparse_operation(World *world, AnsiParseOperation *operation) { g_async_queue_push(world->ansiparse_operations, operation); } 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); } void ansitextview_append_stringf_nl(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, TRUE); g_free(str); } 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. */ MainThreadOperation *operation; operation = g_new(MainThreadOperation, 1); operation->action = INSERT_AT_END; operation->text_insert.use_ta = FALSE; operation->text_insert.extra_tag = gui->ta.ansi_fore_tags[fg_color]; operation->text_insert.text = g_strdup(str); queue_mainthread_operation(gui->world, operation); operation = g_new(MainThreadOperation, 1); operation->action = MOVE_LINESTART_MARK; queue_mainthread_operation(gui->world, operation); operation = g_new(MainThreadOperation, 1); operation->action = TEXT_ADDED; queue_mainthread_operation(gui->world, operation); } void ansitextview_append_ansi_string_immediately(WorldGUI *gui, gchar *str, gsize len) { /* For KCWin: Appends the string without queueing the operations, * but rather executing them immediately. */ insert_ansi_string(gui, str, len, INSERT_AT_END, process_mainthread_operation); } 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-rgba", &world->ansicolors[i], NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[i]), "background-rgba", &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-rgba", &world->ansicolors[i - ANSI_TABLE_OFFSET], NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[i]), "background-rgba", &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-rgba", world->deffore, NULL); g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[ANSI_BOLD_BASE_IDX + ANSI_DEFAULT_COLOR_IDX]), "foreground-rgba", world->defbold, NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[ANSI_DEFAULT_COLOR_IDX]), "background-rgba", world->defback, NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[ANSI_BOLD_BASE_IDX + ANSI_DEFAULT_COLOR_IDX]), "background-rgba", world->defboldback, NULL); /* Update default colors for reverse video */ g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[ANSI_REVERSE_DEFAULT_IDX]), "foreground-rgba", world->defback, NULL); g_object_set(G_OBJECT(gui->ta.ansi_fore_tags[ANSI_REVERSE_BOLD_DEFAULT_IDX]), "foreground-rgba", world->defboldback, NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[ANSI_REVERSE_DEFAULT_IDX]), "background-rgba", world->deffore, NULL); g_object_set(G_OBJECT(gui->ta.ansi_back_tags[ANSI_REVERSE_BOLD_DEFAULT_IDX]), "background-rgba", 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 colors */ configure_css(gui, world); } 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; } gchar * strip_ansi(const gchar *original, gsize len) { /* This is to be called on complete strings, so parsing always starts in DATA mode */ ANSIFSMState state = ANSIFSM_DATA; gchar *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; } void ansitextview_op_insert_at_end(WorldGUI *gui, MainThreadOperation *operation) { GtkTextIter end_iter; TAState *ta = NULL; if (operation->text_insert.use_ta) { ta = &operation->text_insert.ta_state; } gtk_text_buffer_get_iter_at_offset(gui->txtBuffer, &end_iter, -1); ansitextview_append_formatted(gui, &end_iter, operation->text_insert.text, ta, operation->text_insert.extra_tag); } void ansitextview_op_insert_at_mark(WorldGUI *gui, MainThreadOperation *operation) { GtkTextIter iter; TAState *ta = NULL; if (operation->text_insert.use_ta) { ta = &operation->text_insert.ta_state; } gtk_text_buffer_get_iter_at_mark(gui->txtBuffer, &iter, gui->txtmark_linestart); ansitextview_append_formatted(gui, &iter, operation->text_insert.text, ta, operation->text_insert.extra_tag); gtk_text_buffer_move_mark(gui->txtBuffer, gui->txtmark_linestart, &iter); } void ansitextview_op_text_added(WorldGUI *gui, MainThreadOperation *operation) { 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; sprintf(msg, ngettext("%d line", "%d lines", totallines), 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); } } /* Adjust unread markers */ if (!gui->world->has_focus && !gui->world->has_unread_text) { gui->world->has_unread_text = TRUE; gtk_label_set_markup(gui->lblNotebook, gui->world->new_text_name); if (worlds_with_new_text != -1) { ++worlds_with_new_text; if (!window_has_focus) { adjust_window_title(); } } } /* Scroll to end if option is marked or we are at the bottom */ adjustment = gtk_scrolled_window_get_vadjustment(gui->scrolled_win); if ((gui->world && gui->world->scrollOutput) || gtk_adjustment_get_value(adjustment) == gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment)) { gtk_text_view_scroll_to_mark(gui->txtView, gui->txtmark_end, 0, TRUE, 0.5, 1); } } void ansitextview_op_clear_pending_line(WorldGUI *gui, MainThreadOperation *operation) { GtkTextIter line_start; GtkTextIter line_end; gtk_text_buffer_get_iter_at_mark(gui->txtBuffer, &line_start, gui->txtmark_linestart); gtk_text_buffer_get_iter_at_mark(gui->txtBuffer, &line_end, gui->txtmark_end); gtk_text_buffer_delete(gui->txtBuffer, &line_start, &line_end); } void ansitextview_op_move_linestart_mark(WorldGUI *gui, MainThreadOperation *operation) { GtkTextIter end; gtk_text_buffer_get_iter_at_offset(gui->txtBuffer, &end, -1); gtk_text_buffer_move_mark(gui->txtBuffer, gui->txtmark_linestart, &end); } void ansitextview_op_apply_highlight(WorldGUI *gui, MainThreadOperation *operation) { Trigger *trigger; GtkTextIter start; GtkTextIter end; int i; trigger = operation->highlight->trigger; gtk_text_buffer_get_iter_at_offset(gui->txtBuffer, &end, -1); gtk_text_iter_backward_line(&end); start = end; if (trigger->high_target != -1) { gtk_text_iter_set_line_offset(&start, operation->highlight->match_start); gtk_text_iter_set_line_offset(&end, operation->highlight->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(gui->txtBuffer, gui->ta.ansi_fore_tags[i], &start, &end); } gtk_text_buffer_apply_tag(gui->txtBuffer, 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(gui->txtBuffer, gui->ta.ansi_back_tags[i], &start, &end); } gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.ansi_back_tags[trigger->high_bg_color], &start, &end); } if (trigger->high_italic != -1) { gtk_text_buffer_remove_tag(gui->txtBuffer, gui->ta.italics_tag, &start, &end); if (trigger->high_italic) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.italics_tag, &start, &end); } } if (trigger->high_strike != -1) { gtk_text_buffer_remove_tag(gui->txtBuffer, gui->ta.strike_tag, &start, &end); if (trigger->high_strike) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.strike_tag, &start, &end); } } if (trigger->high_underline != -1) { gtk_text_buffer_remove_tag(gui->txtBuffer, gui->ta.underline_tag, &start, &end); gtk_text_buffer_remove_tag(gui->txtBuffer, gui->ta.dblunderline_tag, &start, &end); if (trigger->high_underline == 1) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.underline_tag, &start, &end); } if (trigger->high_underline == 2) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.dblunderline_tag, &start, &end); } } } 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. */ int str_length; MainThreadOperation *operation; operation = g_new(MainThreadOperation, 1); operation->action = INSERT_AT_MARK; operation->text_insert.use_ta = FALSE; operation->text_insert.extra_tag = NULL; str_length = strlen(str); operation->text_insert.text = g_strndup(str, str_length + 1); if (add_nl) { operation->text_insert.text[str_length] = '\n'; } queue_mainthread_operation(gui->world, operation); operation = g_new(MainThreadOperation, 1); operation->action = TEXT_ADDED; queue_mainthread_operation(gui->world, operation); } static void ansitextview_append_formatted(WorldGUI *gui, GtkTextIter *iter, const gchar *text, TAState *ta_state, 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(gui->txtBuffer, iter, text, -1); gtk_text_buffer_get_iter_at_offset(gui->txtBuffer, &start_iter, start_offset); /* Any extra tag passed. */ if (extra_tag) { gtk_text_buffer_apply_tag(gui->txtBuffer, extra_tag, &start_iter, iter); } if (ta_state == NULL) { return; } /* 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(gui->txtBuffer, 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(gui->txtBuffer, gui->ta.ansi_fore_tags[idx_to_use], &start_iter, iter); } if (ta_state->background_color_tag) { gtk_text_buffer_apply_tag(gui->txtBuffer, 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(gui->txtBuffer, gui->ta.ansi_back_tags[idx_to_use], &start_iter, iter); } /* Special attributes */ if (ta_state->underline == PANGO_UNDERLINE_SINGLE) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.underline_tag, &start_iter, iter); } else if (ta_state->underline == PANGO_UNDERLINE_DOUBLE) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.dblunderline_tag, &start_iter, iter); } if (ta_state->strike) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.strike_tag, &start_iter, iter); } if (ta_state->italics) { gtk_text_buffer_apply_tag(gui->txtBuffer, gui->ta.italics_tag, &start_iter, iter); } } kildclient-3.2.0/src/sound.c0000644000175000017500000000277113217707706012663 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include #include #include #ifdef __MINGW32__ # include #endif #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ #ifndef __MINGW32__ 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 __MINGW32__ */ void play_sound(const gchar *file) { PlaySound(file, NULL, SND_FILENAME | SND_ASYNC); } #endif /* defined __MINGW32__ */ kildclient-3.2.0/src/proxy.c0000644000175000017500000005701413217707706012714 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include #include #include #ifndef __MINGW32__ # include # include # include # include # include #else /* defined __MINGW32__ */ # 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); static gboolean proxy_http_data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data); static gchar *proxy_http_get_connection_string(World *world); #define HAS_PROXY_HTTP_RESPONSE(w) ((w)->pbuf_size >= 4 && memcmp((w)->inbuffer + (w)->pbuf_size - 4, "\r\n\r\n", 4) == 0) /*************************** * 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; GThread *resolver_thread; 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); 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; resolver_thread = g_thread_new("resolver", resolve_name_thread, resolve_data); g_thread_unref(resolver_thread); 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; } /******** * HTTP * ********/ gboolean proxy_http_connected_to(World *world) { gchar *msg; gchar *request; 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); request = proxy_http_get_connection_string(world); /* We do not use kc_send because TLS is never used at this point */ send(world->sock, request, strlen(request), 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_http_data_ready_cb, world, NULL); return TRUE; } static gboolean proxy_http_data_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data) { World *world; ssize_t nread; world = (World *) data; /* Since there is no way to know how long the proxy response will be, we must read 1 byte at a time and check if it is complete in order not to read the contents of the actual connection. */ nread = recv(world->sock, world->inbuffer + world->pbuf_size, 1, 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; if (!HAS_PROXY_HTTP_RESPONSE(world)) { /* Continue reading... */ return TRUE; } gchar *code_start = memchr(world->inbuffer, ' ', world->pbuf_size); if (code_start == NULL || memcmp(code_start, " 200", 4) != 0) { gchar *line_end = memchr(world->inbuffer, '\r', world->pbuf_size); *line_end = '\0'; world->errmsg = g_strdup_printf(_("Proxy request failed: %s."), code_start + 1); world->pbuf_size = 0; disconnect_world(world, FALSE); return FALSE; } world->pbuf_size = 0; perform_tls_handshake(world); /* Not to be called again. */ return FALSE; } static gchar * proxy_http_get_connection_string(World *world) { if (strcmp(world->proxy_used.user, "") == 0) { return g_strdup_printf("CONNECT %s:%s HTTP/1.0\r\n\r\n", world->host, world->port); } else { gchar *auth_string = g_strdup_printf("%s:%s", world->proxy_used.user, world->proxy_used.password); gchar *basic_auth_data = g_base64_encode((guchar *) auth_string, strlen(auth_string)); g_free(auth_string); gchar *result = g_strdup_printf("CONNECT %s:%s HTTP/1.0\r\n" "Proxy-Authorization: Basic %s\r\n" "\r\n", world->host, world->port, basic_auth_data); g_free(basic_auth_data); return result; } } kildclient-3.2.0/src/we_generic_guied.c0000644000175000017500000007364513217707706015027 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Save"), GTK_RESPONSE_YES, NULL); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(filechooser), ExtraFilechooser); gtk_widget_show_all(GTK_WIDGET(filechooser)); 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); we_guied_export_selected_hooks(file_contents, world->selected_OnServerData_hooks, "OnServerData", GTK_TREE_MODEL(world->hooks.OnServerData_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)) { kc_error_dialog(GTK_WINDOW(world->dlgEditWorld), _("Could not open file '%s': %s"), file, error->message); } 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, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_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) { kc_error_dialog(GTK_WINDOW(world->dlgEditWorld), _("Could not import file '%s': %s"), filename, error->message); 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"); we_guied_try_import(&world->hooks.OnServerData, newworld->hooks.OnServerData, &world->hooks.OnServerData_pos, (UpdateFunc) we_hook_insert_hook, world, "OnServerData"); /* 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. */ if (world->connected_at_least_once) { 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; newworld->hooks.OnServerData = 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, "%.3f", ((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) { GRAB_PERL(world); if (trigger->pattern_re) { SvREFCNT_dec(trigger->pattern_re); } trigger->pattern_re = precompute_re(trigger->pattern, trigger->ignore_case); RELEASE_PERL(world); } } if (column == ALIAS_ICASE) { World *world = g_object_get_data(G_OBJECT(view), "forworld"); Alias *alias = (Alias *) object; if (world->perl_interpreter) { GRAB_PERL(world); if (alias->pattern_re) { SvREFCNT_dec(alias->pattern_re); } alias->pattern_re = precompute_re(alias->pattern, alias->ignore_case); RELEASE_PERL(world); } } /* 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, const gchar *objname, int n) { GtkWidget *msgdlg; msgdlg = gtk_message_dialog_new(parent, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, ngettext("Do you really want to delete the %1$s?", "Do you really want to delete %2$d %1$s?", n), objname, n); gtk_window_set_title(GTK_WINDOW(msgdlg), _("Confirm deletion")); gtk_dialog_add_buttons(GTK_DIALOG(msgdlg), _("Do _not delete"), GTK_RESPONSE_NO, _("_Delete"), GTK_RESPONSE_YES, NULL); return msgdlg; } kildclient-3.2.0/src/dlgEditWorld.ui0000644000175000017500000070031413217707706014310 00000000000000 1 10000 50 1 10 100 1 10 1000000 1 1 10 1 9999 3 1 10 2 10 2 1 3 40 1000 40 1 10 5000 1 10 100000 4 1 10 No auto-login diku (char, pass) lp (CONNECT char pass) Use global settings No proxy SOCKS4 SOCKS5 HTTP False 8 Edit world dialog False vertical False 8 end _Cancel True True True True False False 0 _OK True True True True True False False 1 False True end 0 False True never in 150 400 True False False False True 0 True True False 12 vertical 6 False <b>Connection</b> True 0 0 False True 0 False start 16 6 6 True False _Name: True txtName 1 0 0 False _Host: True txtHost 1 0 1 False _Port: True txtPort 1 0 2 True Enter a descriptive name for the world True 50 1 0 True Enter the host to connect to True 50 1 1 True Enter the port used when connecting True 50 1 2 Use _SSL True False True True 1 3 False True 1 False 12 <b>Proxy</b> True 0 0 False True 2 False 16 vertical 6 False 4 False Proxy _type: True False False 0 False modelProxyType 0 False True 1 False True 0 False 6 6 True False Server _address: True txtProxyServer 1 0 0 True 1 0 False Server _port: True txtProxyPort 1 2 0 True 3 0 True 1 1 False _Username: True txtProxyUser 1 0 1 False Pass_word: True txtProxyPassword 1 2 1 True False 3 1 False True 1 False True 3 False 12 <b>Auto-login</b> True 0 0 False True 4 False 16 vertical 6 False 4 False Connection _style: True cmbConnStyle 1 False False 0 False modelAutoLoginStyle 0 True True 1 False True 0 False Ch_aracters in this mud: True viewCharacters 0 False False 1 True in True True True 2 False _New True True True True False False 0 _Edit True True True True False False 1 _Delete True True True True False False 2 _Up True True True True False False 3 Do_wn True True True True False False 4 False False 3 True True 5 we_panel_general False 12 vertical 6 False <b>Font</b> True 0 0 False True 0 False 16 vertical 6 False Select the font used in the _main screen: True terminalfont_btn 0 False False 0 True True True Select the font used in the main output screen Sans 12 False False 1 Use _bold font for highlighted colors (instead of just highlighting) True False True Check if you want the highlighted ANSI colors to be displayed in bold also True True False False 2 False True 1 False 12 <b>Word wrap</b> True 0 0 False True 2 False 16 vertical 6 _Wrap lines at word boundaries True False True Check if you want lines to be wrapped at word boundaries True True False False 0 False 4 False _Indent wrapped lines by True spnWrapIndent 0 0 False False 0 True 0 adjSpnWrapIndent True False False 1 False pixels 0 0 False False 2 False False 1 Wrap lines at full _screen width True False True True True True True 2 False 4 Maximum line width in _characters: True False True True radWrapFullWidth False False 0 True 40 adjSpnWrapColumn True 40 False False 1 False False 3 False True 3 False 12 <b>Scrolling</b> True 0 0 False True 4 False 16 vertical 6 Sc_roll on output True False True Check to have the main window scroll to the end whenever new output comes True True True True 0 False 8 False _Lines to save in scrollback buffer: True txtBufferLines False False 0 True Specify the number of lines of output that can be seen with by scrolling the window 4 adjTxtBufferLines 1 4 False False 1 True True 1 False True 5 False 12 <b>Tooltips</b> True 0 0 False True 6 False 16 vertical 6 Display _tooltips with the time when the line was received 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 False True 7 False 12 <b>Name display</b> True 0 0 False True 8 False 16 vertical 6 I_dentify as 'World name' True False True True True True True 0 I_dentify as 'World name - Character' True False True True radNameDisplayWorld True True 1 I_dentify as 'Character - World name' True False True True radNameDisplayWorld True True 2 False 4 C_ustom: True False True True radNameDisplayWorld False False 0 True False False 1 True True 3 False Use %Kw to represent the world's name, and %Kc to represent the auto-logon character name True start 30 0 True True 4 False True 9 we_panel_mainwindow 1 False 12 vertical 6 False <b>Ansi colors</b> True 0 0 False True 0 False start 16 6 6 True True True 0 0 True True 0 1 True True 0 2 True True 0 3 True True 0 4 True True 0 5 True True 0 6 True True 0 7 False Blac_k True colorBtnAnsi[0] 0 1 0 False _Red True colorBtnAnsi[1] 0 1 1 False _Green True colorBtnAnsi[2] 0 1 2 False _Yellow True colorBtnAnsi[3] 0 1 3 False _Blue True colorBtnAnsi[4] 0 1 4 False _Magenta True colorBtnAnsi[5] 0 1 5 False Cy_an True colorBtnAnsi[6] 0 1 6 False _White True colorBtnAnsi[7] 0 1 7 False Blac_k (bold) True colorBtnAnsi[8] 0 4 0 False _Red (bold) True colorBtnAnsi[9] 0 4 1 False _Green (bold) True colorBtnAnsi[10] 0 4 2 False _Yellow (bold) True colorBtnAnsi[11] 0 4 3 False _Blue (bold) True colorBtnAnsi[12] 0 4 4 False _Magenta (bold) True colorBtnAnsi[13] 0 4 5 False Cy_an (bold) True colorBtnAnsi[14] 0 4 6 False _White (bold) True colorBtnAnsi[15] 0 4 7 True True 3 0 True True 3 1 True True 3 2 True True 3 3 True True 3 4 True True 3 5 True True 3 6 True True 3 7 False 2 0 False True 1 False 12 <b>Default colors</b> True 0 0 False True 2 False start 16 6 6 True True True 0 0 True True 3 0 False _Foreground True colorBtnDeffore 0 1 0 False Bold _foreground True colorBtnDefbold 0 4 0 True True 0 1 False Backgroun_d True colorBtnDefback 0 1 1 True True 3 1 False Bold backgroun_d True colorBtnDefboldback 0 4 1 False 2 0 False True 3 False 12 <b>Revert to default colors</b> True 0 0 False False 4 False 16 vertical 6 Re_vert to default colors True True True Click to revert all colors to their built-in defaults True False False 0 False True 5 we_panel_colors 2 False 12 vertical 6 False <b>Font</b> True 0 0 False True 0 False 16 vertical 6 False _Select the font used in the status bar: True statusfont_btn 0 False False 0 True True Sans 12 False False 1 False True 1 False 12 <b>Time display</b> True 0 0 False True 2 False 16 vertical 6 False Co_nnected time: True radCTime_no 0 False True 4 0 False 16 vertical 6 Do not display 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 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 False True Select if you want the connection time to be displayed in seconds True True radCTime_no False False 2 False True 1 False 12 _Idle time: True radITime_no 0 False False 2 False 16 vertical 6 Do not display 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 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 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 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 False True 3 False True 3 we_panel_statusbar 3 False 12 vertical 6 False <b>Command entry</b> True 0 0 False True 0 False 16 vertical 6 _Keep last typed command in command entry box 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 False True Check to have the sent commands echoed in the main output window True True False False 1 Store commands _between sessions 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 False True Check this if the text you type is displayed as black dots in the input box. True True True True 3 False 4 False _Number of commands to save in history: True spnCommandsToSave 0 False False 0 True Specify the number of commands that are saved and can be later recalled 50 adjSpnCommandsToSave 1 50 False False 1 True True 4 False 4 False Co_mmand separator: True txtCommandSeparator False False 0 True Specify the separator for commands typed in the command entry box 9 True 8 False True 1 True True 5 Use single-_line input bar True False True True True False False 6 False 16 vertical 6 Enable _auto-completion True False True Check to enable command auto-completion (based on previous commands) True True False False 0 False 4 False Acti_vate auto-completion only after True spnMinPrefix 0 False False 0 True Specify the number of characters that must be typed for command completion to start 3 adjSpnMinPrefix 1 3 False False 1 False characters have been entered False False 2 True True 1 False True 7 Use mul_ti-line input bar True False True True radSingleLine False False 8 False 16 vertical 6 False 4 False N_umber of lines: True spnNLines False False 0 True 2 adjSpnNLines 1 2 False False 1 True True 0 S_pell check typed text True False True True False True 1 False 16 4 False Lan_guage: True cmbSpellLanguage False False 1 False False True 2 True True 2 False True 9 False True 1 False 12 <b>Font</b> True 0 0 False True 2 False 16 vertical 6 False Select the _font used in the command entry box: True entryfont_btn 0 False False 0 True True Sans 12 False False 1 False True 3 False 12 <b>Flood prevention</b> True 0 0 False True 4 False 16 vertical 6 False 4 _Do not allow the same command to be sent 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 Specify the maximum number of equal commands that can be sent in a row 1 adjSpnMaxCommands 1 1 False False 1 False times in a _row True spnMaxCommands False False 2 False False 0 False 4 False _Send this command: True txtPreventionCommand False False 0 True Enter a command to be sent whenever the specified maximum number of equal commands would be sent True False False 1 True True 1 False True 5 we_panel_input 4 False 12 vertical 6 False <b>Logging status</b> True 0 0 False True 0 False 16 vertical 6 False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK <Filled by the program> 0 False True 0 False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 8 _Start True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 _Stop True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False True 1 False True 1 False 4 _Include the last True False True Select to include lines from the main window in the log file. True True False True 0 True Inform number of lines to include in the log. 5 0 adjSpnLogPreviousLines True False True 1 False _lines of the scrollback buffer in the log True spnLogPreviousLines False True 2 False True 2 False True 1 False 12 <b>File</b> True 0 0 False True 2 False 16 vertical 6 False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 4 False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Name: True txtLogFile False True 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True 1 S_elect True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False True 2 True True 0 False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 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 30 0 True True 1 False True 3 False 12 <b>Options</b> True 0 0 False True 4 False 16 vertical 6 A_utomatically start logging when connected 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 False True 0 Prefix lines with _date and/or time 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 False True 1 False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 16 6 False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK _Format: True txtLogTimeFormat False True 1 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. False True 2 _Revert to default True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False True 3 False True 2 False True 5 we_panel_logging 5 False 12 vertical 6 False <b>Scripting</b> True 0 0 False True 0 False 16 vertical 6 True False 6 False _Perl file to load: True txtScriptFile False True 0 False False True True 1 C_lear True True True False True 2 False True 0 False True 1 we_panel_scripting 6 False 12 vertical 6 False <b>Plugins currently loaded</b> True 0 0 False True 0 False 16 vertical 4 True in True True True 0 False _Load True True True True False False 0 _Help True True True True False False 1 False True 24 1 True True 1 False 12 <b>Plugins loaded on startup</b> True 0 0 False True 2 False 16 vertical 4 True in True True True 0 False 4 True expand _Add True True True True True True 0 _Delete True True True True True True 1 _Up True True True True True True 2 Do_wn True True True True True True 3 False True 24 1 True True 3 we_panel_plugins 7 False 12 vertical 6 False <b>MCCP (for compression)</b> True 0 0 False True 0 False 16 vertical 6 _Enable if server proposes after connecting True False True True True False True 0 Enable if server proposes at _any time True False True True radMCCPAfterConnect False True 1 _Disable True False True True radMCCPAfterConnect False True 2 False True 1 we_panel_protocols 8 False 12 vertical 6 False <b>File</b> True 0 0 False True 0 False 16 vertical 6 False 6 False _File: True txtWorldFile False True 2 0 True True 50 True True 2 1 True True 0 False 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 30 0 True True 1 False True 1 False 12 <b>Character set</b> True 0 0 False True 2 False 16 vertical 6 False 6 False C_haracter set: True cmbCharset False True 2 0 False True True 1 False True 0 False True 3 False 12 <b>Graphical editors</b> True 0 0 False True 4 False 16 vertical 6 _Ask for confirmation before deleting triggers, aliases, etc. 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 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 True 5 False 12 <b>TCP keep alive</b> True 0 0 False True 6 False 16 vertical 6 Enable TCP _keep alive packets 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 False (You must reconnect for changes in this setting to take effect) 0 True True 1 False True 7 False 12 <b>Input</b> True 0 0 False True 8 False 16 vertical 6 _Disable up and down arrow keys for history navigation 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 6 False Character to run _Perl commands: True txtWorldFile False True 2 0 True 1 True 2 False False 2 1 True True 1 False Warning: Changing the character to run Perl commands from the default '/' is not recommended, because doing so might prevent plugins or other code from working, if they use '/' to run Perl commands. True 30 0 True True 2 False True 9 we_panel_advanced 9 True True 1 True True 1 cancelbutton1 okbutton2 kildclient-3.2.0/src/wndmain.ui0000644000175000017500000006375213217707706013371 00000000000000 False KildClient False vertical False False _World True False False _Open... True False _Reconnect True False _Disconnect True False Connect to _another... True False _Close True False False _Edit... True False _Save True False S_tatistics... True False False _Previous True False _Next True False False _Quit True False _Edit True False False Cu_t True False _Copy True False _Paste True False _Delete True False False _Find True False Find n_ext True False _Input True False False C_lear True False _Previous True False _Next True False Find p_revious True False Find n_ext True False Command _history... True False False _Multi-line send... True False False _Test triggers... True False _Preferences True False False Disable _triggers True False Disable _aliases True False Disable _macros True False Disable t_imers True False False _Debug matches True False False _Preferences... True False Edit default _world... True False _Display True False False _Split window True False _Help True False False _Manual True False _About True False True 0 True True True 2 kildclient-3.2.0/src/kildclient.ui0000644000175000017500000031071213217707706014045 00000000000000 1 100 1 1 10 -1 1000000 1 1 10 1 1000000 1 0.10000000000000001 1 False 8 Edit timer True dialog False 8 8 vertical False 8 end _Cancel True True False True False False 0 _OK True True False True False False 1 False True end 0 False 8 2 True False _Name: True txtTimerName 0 0 0 True Enter optionally a descriptive name for the timer True 50 1 0 False _Interval: True spnTimerInterval 0 0 1 False 6 True Specify the interval, in seconds, between timer activations 1.000 adjSpnTimerInterval 1 3 1 False True 0 False seconds 0 True True 1 1 1 False _Repeat count: True spnTimerCount 0 0 2 False 6 True Specify how many times this timer should run before being disabled or deleted 1 adjSpnTimerCount 1 1 False True 0 False (-1 to repeat indefinitely) 0 True True 1 1 2 False _Action: True txtTimerAction 0 0 3 True Enter the action to be executed whenever the timer fires True 1 3 _Temporary (will be deleted automatically when its repeat count reaches 0) True False Check to have the timer deleted after its repeat count has reached 0 True True 0 4 2 _Enabled True False Check to make the timer enabled; only enabled timers are run True True 0 5 2 False <b>Note:</b> True 0 0 6 False This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 0 1 6 False True 1 button3 button4 False 8 Edit alias True dialog False 8 8 vertical False 8 end _Cancel True True False True False False 0 _OK True True False True False False 1 False True end 1 False 8 4 True False _Name: True txtAliasName 0 0 0 True Enter optionally a descriptive name for the alias True 50 1 0 False _Pattern: True txtAliasPattern 0 0 1 True Enter the pattern to match against typed commands True 1 1 _Ignore case when matching True False True True 1 2 False _Substitution: True txtAliasSubstitution 0 0 3 True Enter the substitution to be executed True 1 3 E_val substitution as Perl statement True False Check to have the substitution be executed in a s///e construction True True 0 4 2 _Enabled True False Check to make the alias enabled; only enabled aliases are tried True True 0 5 2 False <b>Note:</b> True 0 0 6 False This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 0 1 6 False True 0 cancelbutton2 okbutton3 False 8 Edit character information True dialog False 8 8 vertical False 8 end _Cancel True True False True False False 0 _OK True True False True False False 1 False True end 0 False 8 4 True False _Name: True txtCharName 1 0 0 True Enter the character's name for automatic login True 35 1 0 False _Password: True txtCharPassword 0 0 1 True Enter the character's password for automatic login False True 1 1 False True 1 button11 button12 False 8 Edit hook True dialog False 8 8 vertical False 8 end _Cancel True True False True False False 0 _OK True True False True False False 1 False True end 0 False 8 4 True False Event: 0 0 0 False <Set by the program> 0 1 0 False _Name: True txtHookName 0 0 1 True Enter optionally a descriptive name for the hook True 50 1 1 False _Action: True txtHookAction 0 0 2 True Enter the action to be run when the event happens True 1 2 _Enabled True False Check to make the hook enabled; only enabled hooks are run True True 0 3 2 False <b>Note:</b> True 0 0 4 False This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 0 1 4 False True 1 button7 button8 False 8 Edit macro True dialog False 8 8 vertical False end _Cancel True True False True False False 0 _OK True True False True False False 1 False True end 0 False 8 4 True False _Name: True txtMacroName 0 0 0 True Enter optionally a descriptive name for the macro True 50 1 0 False _Key: True txtMacroKey 0 0 1 True Press the key that will be used to run the macro True 1 1 False Press the key that will be used to activate the macro while the cursor is in the text box. True 0 1 2 False _Action: True txtMacroAction 0 0 3 True Enter the action to be run when the key is pressed True 1 3 _Enabled True False Check to make the macro enabled; only enabled macros are run True True 0 4 2 False <b>Note:</b> True 0 0 5 False This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 0 1 5 False True 1 button5 button6 False Enter optionally a descriptive name for the trigger 8 Edit trigger True dialog 8 False 8 8 vertical False 8 end _Cancel True True False True False False 0 _OK True True False True False False 1 False True end 0 False 8 4 True False _Name: True txtTriggerName 0 0 0 True True 50 1 0 False _Pattern: True txtTriggerPattern 0 0 1 True Enter the pattern to match against received lines True 1 1 _Ignore case when matching True False True True 1 2 False _Action: True txtTriggerAction 0 0 3 True Enter the action that will be run when a match happens True 1 3 Omit (_gag) from output True False Check to make the matched line not be printed in the main output window True True 0 4 2 Omit (gag) from _log file True False Check to make the matched line not be printed in the log file True True 0 5 2 _Keep executing other triggers after this this one matches True False Check to make this trigger not prevent further triggers from being tried, if it matches True True 0 6 2 _Rewriter trigger True False Check to make this trigger a rewriter trigger True True 0 7 2 False 8 C_hange style True False True True False False 0 C_onfigure... False True False True False False 1 0 8 2 _Enabled True False Check to make the trigger enabled; only enabled triggers are tried True True 0 9 2 False <b>Note:</b> True 0 0 10 False This object belongs to a plugin. Changes made here <b>will not</b> be saved in the plugin. True True 0 1 10 False True 1 button1 button2 False 8 Permenent variable True dialog False vertical False 8 end _Cancel True True False True False False 0 _OK True True False True False False 1 False True end 0 False vertical 8 False _Name of variable to make permanent: True txtVarName 0 False False 0 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 False True 2 button9 button10 False window2 True False 8 8 8 8 8 True True _Triggers True False True True 0 0 _Aliases True False True True 0 1 _Macros True False True True 0 2 T_imers True False True True 0 3 _Permanent variables True False True True 0 4 OnCo_nnect hooks True False True True 1 0 On_Disconnect hooks True False True True 1 1 On_ReceivedText hooks True False True True 1 2 On_SentCommand hooks True False True True 1 3 On_GetFocus hooks True False True True 1 4 On_LoseFocus hooks True False True True 1 5 OnClos_eConnected hooks True False True True 1 6 OnSer_verData hooks True False True True 1 7 False Items to e_xport True False window3 False 12 vertical 6 False <Set by the program> 0 0 False True 0 False 16 vertical 33 True in True True True 0 False True True _New True True False True 0 0 _Edit False True True False True 0 1 _Delete False True True False True 1 1 _Import True False True 2 0 E_xport False True False True 2 1 _Up False True True False True 3 0 Do_wn False True True False True 3 1 False True 1 True True 1 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 None Single Double Do not change No Yes False Enter optionally a descriptive name for the trigger 8 Change style True dialog False vertical False 8 end _Cancel True True False True False False 0 _OK True True False True False False 1 False True end 0 False 8 8 8 4 False Apply to: 0 0 0 False _Foreground: True 0 0 1 False modelColors 0 1 1 False _Background: True 0 0 2 False modelColors 0 1 2 False _Italic: True 0 0 3 False modelYesNo 0 1 3 False _Striked-thru: True 0 0 4 False modelYesNo 0 1 4 False _Underline: True 0 0 5 False modelUnderline 0 1 5 False vertical The whole _line True False True True False True 0 The whole matched _text True False True True radTargetLine False True 1 False 4 The _matched substring number True False True True True radTargetLine False False 0 True 1 adjSpnTarget 1 1 True True 1 False True 2 1 0 False True 1 button13 button14 kildclient-3.2.0/src/dlgTestTriggers.ui0000644000175000017500000002740613217707706015045 00000000000000 False 8 Test triggers dialog False vertical False 8 end _Close True True True True False False 0 False True end 0 False vertical 6 False Enter _line to be matched against the triggers: True txtLine 0 False False 0 False 4 True The text entered here will be matched against triggers as if it were a line coming from the MUD 70 True True 0 _Send True True True Click the run the triggers against the line. True False False 1 False False 1 False False True 4 2 False 4 False Number of triggers that matched: False False 0 False False False 1 False False 3 False Commands that would be sent: 0 False False 4 True in True False False True True 5 False This is what would be printed in the main screen: 0 False False 6 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 False 4 False Would this line be included in the log file? False False 0 False False False 1 False True 8 True True 2 btnTTClose kildclient-3.2.0/src/prefs.c0000644000175000017500000004156113217707706012652 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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(GtkMenuItem *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 __MINGW32__ 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")); gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(wndMain)); 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_set_active(cmbProxyType, globalPrefs.proxy.type); #ifndef __MINGW32__ /* Load commands */ 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 __MINGW32__ */ 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.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, "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)) { kc_error_dialog(GTK_WINDOW(wndMain), _("Could not open file '%s': %s"), filepath, error->message); } 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, "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) { kc_error_dialog(GTK_WINDOW(wndMain), _("Could not create directory '%s': %s"), kilddir, g_strerror(errno)); return NULL; } } return kilddir; } kildclient-3.2.0/src/we_advanced.c0000644000175000017500000002736613217707706014002 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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; panel = gtk_builder_get_object(ui_builder, "we_panel_advanced"); if (world == default_world) { // These components don't make sense for the default world GtkWidget *widget; widget = GTK_WIDGET(gtk_builder_get_object(ui_builder, "label_file")); gtk_widget_destroy(widget); widget = GTK_WIDGET(gtk_builder_get_object(ui_builder, "vbox_int_file")); gtk_widget_destroy(widget); } 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; GtkEntryBuffer *txtPerlCharacter; 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")); txtPerlCharacter = gtk_entry_get_buffer(GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtPerlChar"))); 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); gtk_entry_buffer_set_text(txtPerlCharacter, &world->perl_character, 1); } 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; GtkEntry *txtPerlCharacter; 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")); txtPerlCharacter = GTK_ENTRY(gtk_builder_get_object(ui_builder, "txtPerlChar")); 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); world->perl_character = gtk_entry_get_text(txtPerlCharacter)[0]; } 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); gtk_tree_model_filter_refilter(world->hooks.OnServerData_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-3.2.0/src/we_general.c0000644000175000017500000003737413217707706013652 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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); } gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chkTLS), world->use_tls); /* 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; GtkToggleButton *chkTLS; 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); chkTLS = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkTLS")); world->use_tls = gtk_toggle_button_get_active(chkTLS); } 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_window_set_transient_for(GTK_WINDOW(dlgEditChar), GTK_WINDOW(world->dlgEditWorld)); 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) { kc_error_dialog(GTK_WINDOW(dlgEditChar), _("You must specify the name.")); continue; } newpassword = gtk_entry_get_text(txtPassword); if (strcmp(newpassword, "") == 0) { kc_error_dialog(GTK_WINDOW(dlgEditChar), _("You must specify the password.")); 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), _("character"), 1); 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_KEY_Delete || evt->keyval == GDK_KEY_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-3.2.0/src/Makefile.am0000644000175000017500000000461013215302470013400 00000000000000bin_PROGRAMS = kildclient kildclient_SOURCES = main.c \ net.c \ telnet.c \ proxy.c \ mainwindow.c \ worldgui.c \ mainthread_operations.c \ process_line_thread.c \ ansiparse_thread.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_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 \ util.c \ perlscript.c \ kcwin.c \ simocombobox.c \ kcircularqueue.c if WINDOWS kildclient_SOURCES += wresources.rc endif noinst_HEADERS = kildclient.h \ net.h \ ansi.h \ perlscript.h \ libintl-wrapper.h \ simocombobox.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 uifiles = kildclient.ui \ wndmain.ui \ dlgSelectWorld.ui \ dlgPreferences.ui \ dlgStatistics.ui \ dlgAbout.ui \ dlgEditWorld.ui \ dlgTestTriggers.ui \ dlgMLSend.ui \ dlgCmdHistory.ui \ mnuPopupURL.ui EXTRA_DIST = $(pkgdata_DATA) $(uifiles) pkgdocdir = $(datadir)/doc/kildclient manualdir = $(pkgdocdir)/html localedir = $(datadir)/locale kildclient_LDADD = $(GTK_LIBS) $(KILDCLIENT_PERL_LIBS) $(GTKSPELL_LIBS) $(LIBGNUTLS_LIBS) $(INTLLIBS) -lz kildclient_CPPFLAGS = -DLOCALEDIR=\"$(localedir)\" \ -DPKGDATADIR=\"$(pkgdatadir)\" \ -DSYSDATADIR=\"$(datadir)\" \ -DMANUALDIR=\"$(manualdir)\" \ -DG_LOG_DOMAIN=\"kildclient\" \ $(GTK_CFLAGS) $(KILDCLIENT_PERL_CFLAGS) $(GTKSPELL_CFLAGS) $(LIBGNUTLS_CFLAGS) .rc.o: $(WINDRES) -i $< -o $@ $(RESFLAGS) kildclient-3.2.0/src/worldeditor.c0000644000175000017500000003643013217707706014070 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include "kildclient.h" #include "perlscript.h" /******************** * Type definitions * ********************/ enum { COLUMN_NAME, COLUMN_WIDGET, N_COLUMNS, }; /*********************** * Function prototypes * ***********************/ static void create_edit_world_dialog(World *world, GtkWindow *parent); static GtkTreeStore *create_model(GtkStack *stack, 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)) { 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_mainwindow_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); 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_advanced_tab(world, ui_builder); } gtk_widget_hide(dialog); } static void create_edit_world_dialog(World *world, GtkWindow *parent) { GError *error = NULL; GtkTreeView *treeView; GtkStack *stack; 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); } world->dlgEditWorld = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "dlgEditWorld")); gtk_window_set_transient_for(GTK_WINDOW(world->dlgEditWorld), GTK_WINDOW(wndMain)); gtk_dialog_set_default_response(GTK_DIALOG(world->dlgEditWorld), GTK_RESPONSE_OK); stack = GTK_STACK(gtk_builder_get_object(world->ui_builder, "stackWEPanel")); model = create_model(stack, world, world->ui_builder); g_object_set_data(G_OBJECT(model), "stackptr", stack); 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); } static GtkTreeStore * create_model(GtkStack *stack, 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_stack_add_named(stack, display_panel, "we_panel_display"); 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_stack_add_named(stack, display_panel, "we_panel_automation"); 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_stack_add_named(stack, GTK_WIDGET(panel), "we_panel_triggers"); /* Let the stack 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_stack_add_named(stack, GTK_WIDGET(panel), "we_panel_aliases"); /* Let the stack 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_stack_add_named(stack, GTK_WIDGET(panel), "we_panel_macros"); /* Let the stack 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_stack_add_named(stack, GTK_WIDGET(panel), "we_panel_timers"); /* Let the stack 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_stack_add_named(stack, GTK_WIDGET(panel), "we_panel_hooks"); /* Let the stack 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_stack_add_named(stack, GTK_WIDGET(panel), "we_panel_vars"); /* Let the stack 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_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; GtkStack *stack; if (gtk_tree_selection_get_selected(selection, &model, &iter)) { GtkTreePath *path; GtkWidget *panel; stack = g_object_get_data(G_OBJECT(model), "stackptr"); 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); gtk_stack_set_visible_child(stack, panel); } } static GtkWidget * new_descriptive_panel(const char *title, const char *message) { GtkWidget *vbox; GtkWidget *label; gchar *temp; vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); gtk_container_set_border_width(GTK_CONTAINER(vbox), 12); temp = g_strdup_printf("%s", title); label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), temp); g_free(temp); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_widget_set_valign(label, GTK_ALIGN_START); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); label = gtk_label_new(message); gtk_widget_set_margin_start(label, 16); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_widget_set_valign(label, GTK_ALIGN_START); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); return vbox; } kildclient-3.2.0/src/we_scripting.c0000644000175000017500000000435713217707706014232 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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-3.2.0/src/worldselector.c0000644000175000017500000005740213217707706014424 00000000000000/* * Copyright (C) 2004-2017 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 __MINGW32__ # include #else # include #endif #include "libintl-wrapper.h" #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) { kc_error_dialog(GTK_WINDOW(wndMain), _("Could not load world from file '%s': %s"), file, error->message); 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 __MINGW32__ 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, NULL, &globbuf) == 0) { int i; for (i = 0; i < globbuf.gl_pathc; ++i) { add_saved_worlds_model_entry_from_file(model, globbuf.gl_pathv[i], 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) { fputs(error->message, stderr); } } 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 __MINGW32__ 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) { int i; for (i = 0; !result && i < globbuf.gl_pathc; ++i) { result = compare_world_from_name(globbuf.gl_pathv[i], 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)) { kc_error_dialog(GTK_WINDOW(wndMain), _("Could not load world from file '%s': %s"), file, error->message); 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), msg, 1); 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, "%s", 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, _("_Close"),GTK_RESPONSE_CLOSE, NULL); } else { gtk_dialog_add_buttons(GTK_DIALOG(dlg), _("_Reconnect"), RESP_RECONNECT, _("Connect to _another world"), RESP_OTHER, _("_Close"), GTK_RESPONSE_CLOSE, NULL); } gtk_widget_show_all(dlg); resp = gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); return resp; } kildclient-3.2.0/src/multilinesend.c0000644000175000017500000003456313217707706014413 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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(GtkMenuItem *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(GtkMenuItem *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; 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")); gtk_window_set_transient_for(GTK_WINDOW(dlg), GTK_WINDOW(wndMain)); /* Configure widgets to use input font */ txtInitial = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "txtInitial")); add_css_provider_and_class(txtInitial, world->gui->css_provider, "input"); text = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "txtFinal")); add_css_provider_and_class(text, world->gui->css_provider, "input"); text = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "txtStart")); add_css_provider_and_class(text, world->gui->css_provider, "input"); text = GTK_WIDGET(gtk_builder_get_object(world->ui_builder, "txtEnd")); add_css_provider_and_class(text, world->gui->css_provider, "input"); /* 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_get_preferred_size(dlg, NULL, &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-3.2.0/src/kcwin.c0000644000175000017500000000602113217707706012636 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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); /* TODO - KCWin is not working - this requires an operation Queue, which it does not have. Add string directly. */ ansitextview_append_ansi_string_immediately(gui, str, len); XSRETURN_EMPTY; } void XS_KCWin__destroy(pTHX_ CV *perlcv) { FETCHGUIVARS; dMARK; dAX; FETCHGUI; free_world_gui(gui); XSRETURN_EMPTY; } kildclient-3.2.0/src/dlgCmdHistory.ui0000644000175000017500000005574613217707706014514 00000000000000 100 0.10000000000000001 1 1 100000 1 1 10 False 8 Command history dialog False 8 8 vertical 8 False 8 end _Recall True True True True Put the selected command in the command entry box half True False False 0 Reca_ll and close 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 Send the selected command(s) to the mud True False False 2 Se_nd and close True True True True Send the selected command(s) to the mud and close the dialog True False False 3 _Close True True True True False False 4 False True end 0 False 8 650 200 True in True False True True 0 False vertical _Find True True True True Find a command containing a given search term True False False 0 Find n_ext True True True True Find the next command with the same match text True False False 1 False True 1 True True 0 False Newest commands are on the top 0 False True 2 False False True 4 False 4 False _Delay True spnCHDelay False False 0 True Specify the delay between sending the group of commands 0.0 adjSpnCHDelay 0.10000000149 1 False False 1 False seconds e_ach True spnNCommands False False 2 True Specify how many commands are sent at once 1 adjSpnNCommands 1 1 False False 3 False commands(s) False False 4 False True 5 btnCHClose False 8 Find command dialog False vertical False 8 end _Cancel True True True True False False 0 _OK True True True True False False 1 False True end 0 False vertical 8 False _Text to find: True txtSearchText 0 False False 0 True Enter the text to search for True False False 1 False 4 False Search direction: 0 0 False False 0 False vertical _Downwards True False True True True False False 0 _Upwards True False True True radDownwards False False 1 True True 1 True True 2 False True 2 cancelbutton3 okbutton4 kildclient-3.2.0/src/simocombobox.h0000644000175000017500000001573213215302470014224 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_IS_COMBO_BOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\ SIMO_TYPE_COMBO_BOX)) #define SIMO_COMBO_BOX_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST((vtable), \ SIMO_TYPE_COMBO_BOX,\ SimoComboBoxClass)) #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 { GtkBox parent_instance; /*< private >*/ SimoComboBoxPrivate *priv; }; struct _SimoComboBoxClass { GtkBoxClass 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); void (* mark_set) (SimoComboBox *combo_box, GtkTextMark *mark); }; /* 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); GtkTreeModel *simo_combo_box_get_model(SimoComboBox *combo_box); void simo_combo_box_set_model(SimoComboBox *combo_box, GtkTreeModel *model); void simo_combo_box_set_combo_column(SimoComboBox *combo_box, GtkTreeViewColumn *column); 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_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_insert_seperator(SimoComboBox *combo_box, GtkTreeIter *iter); gboolean simo_combo_box_get_active_iter(SimoComboBox *combo_box, GtkTreeIter *iter); void simo_combo_box_set_active_iter(SimoComboBox *combo_box, GtkTreeIter *iter); gboolean simo_combo_box_get_n_lines(SimoComboBox *combo_box); void simo_combo_box_set_n_lines(SimoComboBox *combo_box, gint n_lines); void simo_combo_box_set_visibility(SimoComboBox *combo_box, gboolean visible); GtkWidget *simo_combo_box_get_single_line_widget(SimoComboBox *combo); GtkWidget *simo_combo_box_get_multi_line_widget(SimoComboBox *combo); /* Spell checking */ gboolean simo_combo_box_set_spell(SimoComboBox *combo_box, gboolean use_spell, gchar *language, GError **error); /* For completion: Either set_completion_text_column to get an automatic renderer, or set_completion_renderer to create your own. */ GtkEntryCompletion *simo_combo_box_get_completion(SimoComboBox *combo_box); void simo_combo_box_set_completion_text_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); /* programmatic control */ void simo_combo_box_popup(SimoComboBox *combo_box); G_END_DECLS #endif /* __SIMO_COMBO_BOX_H__ */ kildclient-3.2.0/src/simocombobox.c0000644000175000017500000014107413217704416014226 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) */ #include #include #include #include #include "simocombobox.h" enum { CLICKED, POPUP_DISPLAYED, POPUP_CLOSED, CHANGED, ACTIVATE, SIZE_CHANGED, MARK_SET, LAST_SIGNAL, }; enum { PROP_0, PROP_MODEL, PROP_MAX_LINES, }; struct _SimoComboBoxPrivate { /*** Model with the stored lines ***/ GtkTreeModel *model; /*** Main widget - Single line Entry ***/ GtkWidget *entry; GtkEntryCompletion *completion; /*** Main widget - Multi line Entry ***/ GtkWidget *scrolled_window; /* holds TextView */ GtkWidget *txtview; GtkTextBuffer *txtbuffer; GtkSpellChecker *gtkspell; /* Return value of get_text for multi line widget - so that the user does not need to free it. */ gchar *ml_text; /*** Main widget - Popup button and height arrows ***/ GtkWidget *popup_button; /* button to display popup window */ GtkWidget *vbox_arrows; /*** Popup window ***/ GtkWidget *popup_window; /* the window that is dropped down when the button is clicked */ GdkCursor *hand; GtkTreeView *treeview; GtkTreeViewColumn *column; gint visible_column; GtkTreePath *current_path; /* path to the active cell, can be NULL if no items are currently selected */ /*** Properties ***/ gint n_lines; gint max_lines; /*** IDs of signal handlers ***/ gulong arrow_sig; /* arrow button sig */ gulong single_changed_id; gulong multi_changed_id; /*** Size calculation ***/ /* 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_create_model(SimoComboBox *combo_box); static void simo_combo_box_create_widget(SimoComboBox *combo_box); static void simo_combo_box_create_popup_window(SimoComboBox *combo_box); 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_get_preferred_height(GtkWidget *widget, gint *minimum_height, gint *natural_height); static void simo_combo_box_get_preferred_width(GtkWidget *widget, gint *minimum_width, gint *natural_width); static void simo_combo_box_size_request(GtkWidget *widget, GtkRequisition *requisition); static gint simo_combo_box_get_line_height(SimoComboBox *combo_box); static void simo_combo_box_size_allocate(GtkWidget *widget, GtkAllocation *allocation); static void simo_combo_box_grab_focus_signal(GtkWidget *widget); 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 void simo_combo_box_row_deleted(GtkTreeModel *model, GtkTreePath *path, SimoComboBox *combo); static gboolean simo_combo_box_treeview_release_event(GtkWidget *widget, GdkEventButton *event, SimoComboBox *combo_box); static gboolean simo_combo_box_treeview_motion_event(GtkWidget *widget, GdkEventMotion *event, SimoComboBox *combo_box); static gboolean simo_combo_box_key_release_event(GtkWidget *widget, GdkEventKey *event, SimoComboBox *combo_box); 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); static void simo_combo_box_text_changed_cb(GtkEditable *editable, gpointer data); static void simo_combo_box_mark_set_cb(GtkTextBuffer *textbuffer, GtkTextIter *location, GtkTextMark *mark, 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 int get_screen_height(GtkWidget *widget); static void simo_combo_box_popup_close(SimoComboBox *combo_box); static gchar *get_gvalue_as_string(GValue *value); 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_BOX, "SimoComboBox", &combo_box_info, (GTypeFlags) 0); } return combo_box_type; } static void simo_combo_box_class_init(SimoComboBoxClass *klass) { GObjectClass *g_object_class; GtkWidgetClass *widget_class; g_object_class = G_OBJECT_CLASS (klass); widget_class = (GtkWidgetClass *) klass; parent_class = g_type_class_peek_parent((GObjectClass *) klass); g_object_class->finalize = simo_combo_box_finalize; 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->get_preferred_height = simo_combo_box_get_preferred_height; widget_class->get_preferred_width = simo_combo_box_get_preferred_width; 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(widget_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(widget_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(widget_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(widget_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(widget_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(widget_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); combo_box_signals[MARK_SET] = g_signal_new("mark_set", G_OBJECT_CLASS_TYPE(widget_class), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(SimoComboBoxClass, mark_set), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, GTK_TYPE_TEXT_MARK); /* 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_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 void simo_combo_box_init(SimoComboBox *combo_box) { SimoComboBoxPrivate *mthis; mthis = g_new0(SimoComboBoxPrivate, 1); combo_box->priv = mthis; mthis->n_lines = 1; mthis->max_lines = 10; simo_combo_box_create_model(combo_box); simo_combo_box_create_widget(combo_box); simo_combo_box_create_popup_window(combo_box); } static void simo_combo_box_create_model(SimoComboBox *combo_box) { SimoComboBoxPrivate *mthis = combo_box->priv; mthis->model = GTK_TREE_MODEL(gtk_tree_store_new(1, G_TYPE_STRING)); } static void simo_combo_box_create_widget(SimoComboBox *combo_box) { SimoComboBoxPrivate *mthis = combo_box->priv; GtkWidget *arrow; GtkWidget *arrow_evtbox; /* Single line input box */ mthis->entry = gtk_entry_new(); gtk_widget_set_name(mthis->entry, "combo_entry"); mthis->single_changed_id = g_signal_connect(G_OBJECT(mthis->entry), "changed", G_CALLBACK(simo_combo_box_text_changed_cb), combo_box); g_signal_connect(G_OBJECT(mthis->entry), "activate", G_CALLBACK(simo_combo_box_entry_activate_cb), combo_box); mthis->completion = gtk_entry_completion_new(); gtk_entry_set_completion(GTK_ENTRY(mthis->entry), mthis->completion); g_object_unref(mthis->completion); gtk_entry_completion_set_model(mthis->completion, mthis->model); /* Multi line input box */ mthis->txtview = gtk_text_view_new(); gtk_text_view_set_pixels_above_lines(GTK_TEXT_VIEW(mthis->txtview), 2); gtk_text_view_set_left_margin(GTK_TEXT_VIEW(mthis->txtview), 2); gtk_text_view_set_right_margin(GTK_TEXT_VIEW(mthis->txtview), 2); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(mthis->txtview), GTK_WRAP_WORD_CHAR); g_signal_connect(G_OBJECT(mthis->txtview), "key-press-event", G_CALLBACK(simo_combo_box_txtview_keypress_cb), combo_box); mthis->txtbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(mthis->txtview)); mthis->multi_changed_id = g_signal_connect(G_OBJECT(mthis->txtbuffer), "changed", G_CALLBACK(simo_combo_box_text_changed_cb), combo_box); g_signal_connect(G_OBJECT(mthis->txtbuffer), "mark-set", G_CALLBACK(simo_combo_box_mark_set_cb), combo_box); 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); g_object_set(G_OBJECT(mthis->scrolled_window), "no-show-all", TRUE, NULL); gtk_container_add(GTK_CONTAINER(mthis->scrolled_window), mthis->txtview); /* Popup button */ arrow = gtk_image_new_from_icon_name("pan-down-symbolic", GTK_ICON_SIZE_BUTTON); gtk_widget_set_name(arrow, "combo_arrow"); mthis->popup_button = gtk_toggle_button_new(); gtk_widget_set_name(mthis->popup_button, "combo_button"); gtk_widget_set_focus_on_click(mthis->popup_button, FALSE); mthis->arrow_sig = g_signal_connect_swapped(G_OBJECT(mthis->popup_button), "toggled", G_CALLBACK(simo_combo_box_popup), combo_box); gtk_container_add(GTK_CONTAINER(mthis->popup_button), arrow); /* Arrows for changing size */ mthis->vbox_arrows = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_box_set_homogeneous(GTK_BOX(mthis->vbox_arrows), TRUE); arrow = gtk_image_new_from_icon_name("pan-up-symbolic", GTK_ICON_SIZE_BUTTON); gtk_widget_set_valign(arrow, GTK_ALIGN_START); 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_image_new_from_icon_name("pan-down-symbolic", GTK_ICON_SIZE_BUTTON); gtk_widget_set_valign(arrow, GTK_ALIGN_END); 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_start(GTK_BOX(combo_box), mthis->entry, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(combo_box), mthis->scrolled_window, TRUE, TRUE, 0); gtk_box_pack_end(GTK_BOX(combo_box), mthis->vbox_arrows, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(combo_box), mthis->popup_button, FALSE, FALSE, 0); } static void simo_combo_box_create_popup_window(SimoComboBox *combo_box) { SimoComboBoxPrivate *mthis = combo_box->priv; GtkCellRenderer *cell; GtkWidget *frame; GtkWidget *popup_scroll; int mask; mthis->hand = gdk_cursor_new_for_display(gdk_display_get_default(), GDK_HAND2); mthis->visible_column = 0; /* Build the Tree View */ mthis->treeview = GTK_TREE_VIEW(gtk_tree_view_new_with_model(mthis->model)); g_object_set(G_OBJECT(mthis->treeview), "fixed-height-mode", FALSE, "headers-visible", FALSE, "reorderable", FALSE, NULL); g_signal_connect(G_OBJECT(mthis->treeview), "row-activated", G_CALLBACK(simo_combo_box_row_activated), combo_box); g_signal_connect(G_OBJECT(mthis->treeview), "button-release-event", G_CALLBACK(simo_combo_box_treeview_release_event), combo_box); g_signal_connect(G_OBJECT(mthis->treeview), "key-release-event", G_CALLBACK(simo_combo_box_key_release_event), combo_box); g_signal_connect(G_OBJECT(mthis->treeview), "motion-notify-event", G_CALLBACK(simo_combo_box_treeview_motion_event), combo_box); mthis->column = gtk_tree_view_column_new(); cell = gtk_cell_renderer_text_new(); g_object_set(cell, "ellipsize", PANGO_ELLIPSIZE_END, NULL); gtk_tree_view_column_pack_start(mthis->column, cell, TRUE); gtk_tree_view_column_add_attribute(mthis->column, cell, "text", 0); gtk_tree_view_column_set_expand(mthis->column, TRUE); gtk_tree_view_column_set_sizing(mthis->column, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_append_column(mthis->treeview, mthis->column); popup_scroll = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(popup_scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_set_border_width(GTK_CONTAINER(popup_scroll), 0); gtk_container_add(GTK_CONTAINER(popup_scroll), GTK_WIDGET(mthis->treeview)); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT); gtk_container_add(GTK_CONTAINER(frame), popup_scroll); // build the popup window mthis->popup_window = gtk_window_new(GTK_WINDOW_POPUP); gtk_widget_set_name(mthis->popup_window, "white"); // 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_container_set_border_width(GTK_CONTAINER(mthis->popup_window), 0); gtk_widget_realize(mthis->popup_window); gdk_window_set_cursor(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); } 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); return (GtkWidget *) cb; } static void simo_combo_box_finalize(GObject *object) { SimoComboBoxPrivate *mthis; mthis = SIMO_COMBO_BOX(object)->priv; // run parent finalize G_OBJECT_CLASS(parent_class)->finalize(object); if (mthis->current_path) { gtk_tree_path_free(mthis->current_path); } g_object_unref(mthis->hand); g_free(mthis->ml_text); g_free(mthis); } 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->priv->model); 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); } break; case PROP_MAX_LINES: combo_box->priv->max_lines = g_value_get_int(value); break; default: break; } } static void simo_combo_box_get_preferred_height(GtkWidget *widget, gint *minimum_height, gint *natural_height) { GtkRequisition req; simo_combo_box_size_request(widget, &req); *minimum_height = req.height; *natural_height = req.height; } static void simo_combo_box_get_preferred_width(GtkWidget *widget, gint *minimum_width, gint *natural_width) { GtkRequisition req; simo_combo_box_size_request(widget, &req); *minimum_width = req.width; *natural_width = req.width; } static void simo_combo_box_size_request(GtkWidget *widget, GtkRequisition *req) { SimoComboBox *combo_box = SIMO_COMBO_BOX(widget); GtkRequisition breq, ereq, areq; if (combo_box->priv->n_lines > 1) { gtk_widget_get_preferred_size(combo_box->priv->scrolled_window, NULL, &ereq); } else { gtk_widget_get_preferred_size(combo_box->priv->entry, NULL, &ereq); } gtk_widget_get_preferred_size(combo_box->priv->popup_button, NULL, &breq); gtk_widget_get_preferred_size(combo_box->priv->vbox_arrows, NULL, &areq); 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; gtk_widget_set_size_request(combo_box->priv->entry, ereq.width, ereq.height); gtk_widget_set_size_request(combo_box->priv->scrolled_window, ereq.width, ereq.height); } 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->priv->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; } static void simo_combo_box_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { SimoComboBox *combo; GtkAllocation ealloc; GtkAllocation combobtnAlloc; GtkAllocation vboxarrowsAlloc; g_return_if_fail(SIMO_IS_COMBO_BOX(widget)); g_return_if_fail(allocation != NULL); combo = SIMO_COMBO_BOX(widget); GTK_WIDGET_CLASS(parent_class)->size_allocate(widget, allocation); gtk_widget_get_allocation(combo->priv->popup_button, &combobtnAlloc); gtk_widget_get_allocation(combo->priv->vbox_arrows, &vboxarrowsAlloc); 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->priv->entry, &ealloc); } } 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->priv->txtview); } else { gtk_widget_grab_focus(combo_box->priv->entry); } } GtkTreeModel * simo_combo_box_get_model(SimoComboBox *combo_box) { return combo_box->priv->model; } void simo_combo_box_set_model(SimoComboBox *combo_box, GtkTreeModel *model) { if (combo_box->priv->model) { g_object_unref(combo_box->priv->model); } combo_box->priv->model = model; gtk_tree_view_set_model(combo_box->priv->treeview, combo_box->priv->model); if (combo_box->priv->model) { g_object_ref(combo_box->priv->model); g_signal_connect(combo_box->priv->model, "row-deleted", G_CALLBACK(simo_combo_box_row_deleted), combo_box); gtk_entry_completion_set_model(combo_box->priv->completion, combo_box->priv->model); } } void simo_combo_box_set_combo_column(SimoComboBox *combo_box, GtkTreeViewColumn *column) { gtk_tree_view_remove_column(combo_box->priv->treeview, combo_box->priv->column); gtk_tree_view_append_column(combo_box->priv->treeview, column); combo_box->priv->column = column; } 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->priv->txtbuffer, &start, &end); combo_box->priv->ml_text = gtk_text_buffer_get_text(combo_box->priv->txtbuffer, &start, &end, FALSE); return combo_box->priv->ml_text; } else { return gtk_entry_get_text(GTK_ENTRY(combo_box->priv->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->priv->txtbuffer, text, -1); } else { gtk_entry_set_text(GTK_ENTRY(combo_box->priv->entry), text); } } 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->priv->txtbuffer, &iter, position); gtk_text_buffer_place_cursor(combo_box->priv->txtbuffer, &iter); } else { gtk_editable_set_position(GTK_EDITABLE(combo_box->priv->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->priv->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->priv->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->priv->txtbuffer, &start_iter, start); gtk_text_buffer_get_iter_at_offset(combo_box->priv->txtbuffer, &end_iter, end); gtk_text_buffer_select_range(combo_box->priv->txtbuffer, &start_iter, &end_iter); } else { gtk_editable_select_region(GTK_EDITABLE(combo_box->priv->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->priv->txtbuffer, FALSE, TRUE); } else { gtk_editable_delete_selection(GTK_EDITABLE(combo_box->priv->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->priv->txtbuffer, clipboard, TRUE); } else { gtk_editable_cut_clipboard(GTK_EDITABLE(combo_box->priv->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->priv->txtbuffer, clipboard); } else { gtk_editable_copy_clipboard(GTK_EDITABLE(combo_box->priv->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->priv->txtbuffer, clipboard, NULL, TRUE); } else { gtk_editable_paste_clipboard(GTK_EDITABLE(combo_box->priv->entry)); } } 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->priv->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 = NULL; if (mthis->current_path) { gtk_tree_path_free(mthis->current_path); } mthis->current_path = gtk_tree_model_get_path(mthis->model, iter); if (mthis->current_path) { gtk_tree_model_get_value(mthis->model, iter, mthis->visible_column, &value); } if (G_IS_VALUE(&value)) { text = get_gvalue_as_string(&value); } if (text) { gtk_entry_set_text(GTK_ENTRY(mthis->entry), text); g_free(text); } else { gtk_entry_set_text(GTK_ENTRY(mthis->entry), ""); } g_value_unset(&value); } 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->priv->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->priv->entry); gtk_widget_show_all(combo_box->priv->scrolled_window); /* Copy text and selected part */ g_signal_handler_block(G_OBJECT(combo_box->priv->entry), combo_box->priv->single_changed_id); gtk_text_buffer_set_text(combo_box->priv->txtbuffer, gtk_entry_get_text(GTK_ENTRY(combo_box->priv->entry)), -1); gtk_editable_get_selection_bounds(GTK_EDITABLE(combo_box->priv->entry), &start, &end); gtk_text_buffer_get_iter_at_offset(combo_box->priv->txtbuffer, &start_iter, start); gtk_text_buffer_get_iter_at_offset(combo_box->priv->txtbuffer, &end_iter, end); gtk_text_buffer_select_range(combo_box->priv->txtbuffer, &start_iter, &end_iter); g_signal_handler_unblock(G_OBJECT(combo_box->priv->entry), combo_box->priv->single_changed_id); } else { gchar *text; g_object_set(G_OBJECT(combo_box->priv->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->priv->entry); /* Copy text and selected part */ g_signal_handler_block(G_OBJECT(combo_box->priv->txtbuffer), combo_box->priv->multi_changed_id); gtk_text_buffer_get_bounds(combo_box->priv->txtbuffer, &start_iter, &end_iter); text = gtk_text_buffer_get_text(combo_box->priv->txtbuffer, &start_iter, &end_iter, FALSE); gtk_entry_set_text(GTK_ENTRY(combo_box->priv->entry), text); g_free(text); gtk_text_buffer_get_selection_bounds(combo_box->priv->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->priv->entry), start, end); g_signal_handler_unblock(G_OBJECT(combo_box->priv->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); } void simo_combo_box_set_visibility(SimoComboBox *combo_box, gboolean visible) { gtk_entry_set_visibility(GTK_ENTRY(combo_box->priv->entry), visible); } GtkWidget * simo_combo_box_get_single_line_widget(SimoComboBox *combo) { return combo->priv->entry; } GtkWidget * simo_combo_box_get_multi_line_widget(SimoComboBox *combo) { return combo->priv->txtview; } gboolean simo_combo_box_set_spell(SimoComboBox *combo, gboolean use_spell, gchar *language, GError **error) { if (combo->priv->gtkspell) { /* We already have one */ if (!use_spell) { gtk_spell_checker_detach(combo->priv->gtkspell); combo->priv->gtkspell = NULL; return TRUE; } else { return gtk_spell_checker_set_language(combo->priv->gtkspell, language, error); } } else { /* We don't have one */ if (use_spell) { gboolean success; combo->priv->gtkspell = gtk_spell_checker_new(); gtk_spell_checker_attach(combo->priv->gtkspell, GTK_TEXT_VIEW(combo->priv->txtview)); success = gtk_spell_checker_set_language(combo->priv->gtkspell, language, error); if (!success) { return FALSE; } return TRUE; } else { return TRUE; } } } GtkEntryCompletion * simo_combo_box_get_completion(SimoComboBox *combo_box) { return combo_box->priv->completion; } void simo_combo_box_set_completion_text_column(SimoComboBox *combo_box, int col_id) { combo_box->priv->visible_column = col_id; gtk_entry_completion_set_text_column(combo_box->priv->completion, col_id); } 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); } 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; 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); gtk_widget_get_allocation(widget, &alloc); 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_row_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, SimoComboBox *combo) { GtkTreeIter iter; gtk_tree_model_get_iter(combo->priv->model, &iter, path); simo_combo_box_set_active_iter(combo, &iter); simo_combo_box_popup_close(combo); } 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_treeview_release_event(GtkWidget *widget, GdkEventButton *event, SimoComboBox *combo_box) { GtkTreePath *path; GtkTreeViewColumn *col; GtkAllocation alloc; gtk_widget_get_allocation(widget, &alloc); 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->priv->treeview, (gint) event->x, (gint) event->y, &path, &col, NULL, NULL)) { gtk_tree_view_row_activated(combo_box->priv->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->priv->treeview, (gint) event->x, (gint) event->y, &path, NULL, NULL, NULL)) { GtkTreeIter iter; if (gtk_tree_model_get_iter(combo->priv->model, &iter, path)) { GtkTreeSelection *selection = gtk_tree_view_get_selection(combo->priv->treeview); gtk_tree_selection_select_iter(selection, &iter); } gtk_tree_path_free(path); } return FALSE; } static gboolean simo_combo_box_key_release_event(GtkWidget *widget, GdkEventKey *event, SimoComboBox *combo_box) { if(event->keyval == GDK_KEY_Escape) { simo_combo_box_popup_close(combo_box); } 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->priv->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->priv->entry); } return TRUE; } 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_mark_set_cb(GtkTextBuffer *textbuffer, GtkTextIter *location, GtkTextMark *mark, gpointer data) { g_signal_emit(SIMO_COMBO_BOX(data), combo_box_signals[MARK_SET], 0, mark); } 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_KEY_Return || evt->keyval == GDK_KEY_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; } void simo_combo_box_popup(SimoComboBox *combo_box) { gint bx, by; gint width, height; gint screen_height; GtkWidget *widget; GtkAllocation alloc; SimoComboBoxPrivate *mthis; g_return_if_fail(SIMO_IS_COMBO_BOX(combo_box)); widget = GTK_WIDGET(combo_box); mthis = combo_box->priv; 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); // Determine size of popup window if (mthis->n_lines > 1) { width = gtk_widget_get_allocated_width(mthis->scrolled_window); } else { width = gtk_widget_get_allocated_width(mthis->entry); } gtk_widget_get_allocation(mthis->popup_button, &alloc); width += alloc.width; height = 130; // Arbitrary // Determine popup window position gtk_widget_get_allocation(widget, &alloc); gdk_window_get_origin(gtk_widget_get_window(widget), &bx, &by); bx += alloc.x; by += alloc.y + alloc.height; // Display above the text box if there isn't space below screen_height = get_screen_height(widget); if (by + height > screen_height) { by -= (alloc.height + height); } gtk_tree_view_column_set_max_width(mthis->column, width); gtk_window_resize(GTK_WINDOW(mthis->popup_window), width, height); gtk_window_move(GTK_WINDOW(mthis->popup_window), bx, by); gtk_widget_show_all(mthis->popup_window); g_signal_handler_block(G_OBJECT(mthis->popup_button), mthis->arrow_sig); if (!gtk_widget_has_focus(GTK_WIDGET(mthis->treeview))) { gtk_widget_set_can_default(GTK_WIDGET(mthis->treeview), TRUE); gtk_widget_grab_focus(GTK_WIDGET(mthis->treeview)); } gtk_grab_add(mthis->popup_window); // set toggle state on buttons gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mthis->popup_button), TRUE); } static int get_screen_height(GtkWidget *widget) { GdkWindow *window; GdkDisplay *display; GdkMonitor *monitor; GdkRectangle rectangle; window = gtk_widget_get_window(widget); display = gdk_display_get_default(); monitor = gdk_display_get_monitor_at_window(display, window); gdk_monitor_get_geometry(monitor, &rectangle); return rectangle.height; } 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); g_signal_handlers_disconnect_by_func(G_OBJECT(combo_box->priv->popup_window), G_CALLBACK(simo_combo_box_update_pressed), combo_box); // set toggle state on buttons gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(combo_box->priv->popup_button), FALSE); g_signal_handler_unblock(G_OBJECT(combo_box->priv->popup_button), combo_box->priv->arrow_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_widget_get_can_focus(GTK_WIDGET(combo_box))) { if (gtk_widget_get_can_focus(combo_box->priv->entry)) { gtk_widget_grab_focus(GTK_WIDGET(combo_box->priv->entry)); } } } 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; } return NULL; } kildclient-3.2.0/src/plugins.c0000644000175000017500000001165013217707706013210 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.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; GRAB_PERL(world); 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)); RELEASE_PERL(world); return FALSE; } RELEASE_PERL(world); return TRUE; } /* Startup plugins support */ void load_startup_plugins(World *world) { GSList *pluginitem; pluginitem = world->startup_plugin_files; while (pluginitem) { GError *error = NULL; add_startup_plugin(world, pluginitem->data, &error); if (error) { fputs(error->message, stderr); 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; GRAB_PERL(world); 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)); RELEASE_PERL(world); 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); RELEASE_PERL(world); 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-3.2.0/src/we_logging.c0000644000175000017500000002132613217707706013651 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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; panel = gtk_builder_get_object(ui_builder, "we_panel_logging"); if (world == default_world) { /* These parts make no sense for the default world, so let's hide them */ GObject *component; component = gtk_builder_get_object(ui_builder, "label_log_status"); g_object_set(component, "no-show-all", TRUE, NULL); component = gtk_builder_get_object(ui_builder, "vbox_int_log_status"); g_object_set(component, "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 { kc_error_dialog_with_title(GTK_WINDOW(world->dlgEditWorld), _("Logging not started"), "%s", errmsg); 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, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_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-3.2.0/src/we_vars.c0000644000175000017500000004266613217707706013210 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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; gint n; n = gtk_tree_selection_count_selected_rows(selection); msgdlg = gtk_message_dialog_new(GTK_WINDOW(world->dlgEditWorld), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, ngettext("Do you really want to make the variable temporary?", "Do you really want to make %d variables temporary?", n), n); gtk_window_set_title(GTK_WINDOW(msgdlg), _("Confirm deletion")); gtk_dialog_add_buttons(GTK_DIALOG(msgdlg), _("Keep _permanent"), GTK_RESPONSE_NO, _("Make _temporary"), GTK_RESPONSE_YES, NULL); 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_window_set_transient_for(GTK_WINDOW(dlgEditVar), GTK_WINDOW(world->dlgEditWorld)); 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) { kc_error_dialog(GTK_WINDOW(dlgEditVar), _("You must specify a variable name.")); continue; } if (givenname[0] != '$' && givenname[0] != '@' && givenname[0] != '%') { kc_error_dialog(GTK_WINDOW(dlgEditVar), _("Only scalar ($), array (@) and hash (%%) variables can be made permanent.")); 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)) { kc_error_dialog(GTK_WINDOW(dlgEditVar), _("%s is already permanent."), givenname); 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_KEY_Delete || evt->keyval == GDK_KEY_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-3.2.0/src/mainwindow.c0000644000175000017500000012721013220155631013667 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include #include #ifndef __MINGW32__ # include # include #else # include #endif #include #include #include #include "kildclient.h" #include "perlscript.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 void restore_main_window_size(int x, int y, int width, int height, WorldGUI *gui); static void set_initial_window_size(WorldGUI *gui); static gboolean update_world_with_focus(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, gpointer *page, guint page_num, gpointer data); G_MODULE_EXPORT void notebook_page_reordered_cb(GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer data); G_MODULE_EXPORT gboolean about_dlg_url_hook(GtkAboutDialog *about, gchar *link, gpointer data); /* Menus */ G_MODULE_EXPORT void menu_world_open_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void open_new_world_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void edit_this_world_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_statistics_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_edit_open_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_cut_activate_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_copy_activate_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_paste_activate_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_delete_activate_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_find_activate_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_input_clear_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_input_prev_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_input_next_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_input_find_prev_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_input_find_next_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_preferences_open_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_disable_triggers_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_disable_aliases_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_disable_macros_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_disable_timers_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_debug_matches_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_edit_default_world_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_display_open_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_split_screen_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_manual_cb(GtkMenuItem *widget, gpointer data); G_MODULE_EXPORT void menu_about_cb(GtkMenuItem *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 __MINGW32__ gtk_window_set_default_icon_from_file(SYSDATADIR "/pixmaps/kildclient.png", NULL); #else /* defined __MINGW32__ */ gtk_window_set_default_icon_from_file(get_kildclient_installed_file("kildclient.png"), NULL); #endif /* __MINGW32__ */ /* 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; } void set_main_window_size(int x, int y, int width, int height, WorldGUI *gui) { if (x != -1) { restore_main_window_size(x, y, width, height, gui); } else { set_initial_window_size(gui); } } static void restore_main_window_size(int x, int y, int width, int height, WorldGUI *gui) { gtk_window_move(GTK_WINDOW(wndMain), x, y); gtk_window_resize(GTK_WINDOW(wndMain), width, height); } static void set_initial_window_size(WorldGUI *gui) { PangoLayout *layout; PangoFontDescription *font; PangoRectangle logical_rect; gint char_width, char_height; gint tv_width, tv_height; GtkRequisition window_size; /* At this moment, calling ansitextview_get_char_size() results in an invalid value, probably because the GtkTextView is not yet display on screen. So we set the default font manually. */ layout = gtk_widget_create_pango_layout(GTK_WIDGET(gui->txtView), "W"); font = pango_font_description_from_string(DEFAULT_TERMINAL_FONT); pango_layout_set_font_description(layout, font); pango_layout_get_pixel_extents(layout, NULL, &logical_rect); pango_font_description_free(font); g_object_unref(layout); char_width = logical_rect.width; char_height = logical_rect.height; #ifndef __MINGW32__ /* On Linux, I observed the result to be 1 pixel larger than the actual size, but this didn't happen under Window. */ char_width -= 1; char_height -= 1; #endif /* Set a minimum size of 80x24 for the main MUD area */ tv_width = 80 * char_width + 1; tv_height = 24 * char_height + 1; gtk_scrolled_window_set_min_content_width(gui->scrolled_win, tv_width); gtk_scrolled_window_set_min_content_height(gui->scrolled_win, tv_height); /* Find out what size the window would be with a MUD area that size */ gtk_widget_get_preferred_size(wndMain, &window_size, NULL); /* Remove the constraint on the MUD area size, so that the user can shrink it if he wishes */ gtk_scrolled_window_set_min_content_width(gui->scrolled_win, tv_width / 3); gtk_scrolled_window_set_min_content_height(gui->scrolled_win, tv_height / 3); /* But make the window start at the size it would have for a 80x24 area, with a little extra width (without it the size would be a couple pixels smaller than necessary_. */ gtk_window_set_default_size(GTK_WINDOW(wndMain), window_size.width + char_width, window_size.height); } void add_global_css() { GtkCssProvider *provider; GdkDisplay *display; GdkScreen *screen; gchar *css = "menu {" /* Use system font in popup menus, */ " font: initial;" /* instead of the mud output font. */ "}"; provider = gtk_css_provider_new(); gtk_css_provider_load_from_data(provider, css, -1, NULL); display = gdk_display_get_default(); screen = gdk_display_get_default_screen(display); gtk_style_context_add_provider_for_screen(screen, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); } 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, gpointer *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; } adjust_window_title(); if (currentWorld->connected) { execute_hook(currentWorld, "OnGetFocus", NULL); } } /* Do not run again */ return FALSE; } void open_new_world_cb(GtkMenuItem *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(GtkMenuItem *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(GtkMenuItem *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; 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")); gtk_window_set_transient_for(GTK_WINDOW(dlgStatistics), GTK_WINDOW(wndMain)); 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")); /* 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 */ if (currentWorld->use_tls) { GtkLabel *lblTLS; GtkLabel *lblTLSCipher; GtkLabel *lblTLSMAC; GtkLabel *lblTLSKX; GtkLabel *lblTLSComp; GtkLabel *lblTLSCertType; GtkLabel *lblTLSCertHostname; GtkLabel *lblTLSCertActivation; GtkLabel *lblTLSCertExpiration; GtkLabel *lblTLSCertFingerprint; gnutls_certificate_type_t cert_type; const gnutls_datum_t *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; lblTLS = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLS")); 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_t 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 { GtkLabel *lblTLS; lblTLS = GTK_LABEL(gtk_builder_get_object(ui_builder, "lblTLS")); gtk_label_set_text(lblTLS, _("None")); } /* Run the dialog */ gtk_widget_show_all(dlgStatistics); gtk_dialog_run(GTK_DIALOG(dlgStatistics)); gtk_widget_destroy(dlgStatistics); g_object_unref(ui_builder); } void menu_edit_default_world_cb(GtkMenuItem *widget, gpointer data) { gboolean dummy; edit_world(&default_world, GTK_WINDOW(wndMain), &dummy, FALSE); } void menu_manual_cb(GtkMenuItem *widget, gpointer data) { gchar *manualurl; #ifndef __MINGW32__ manualurl = g_strdup_printf("file://%s", MANUALDIR "/index.xhtml"); #else manualurl = g_strdup_printf(get_kildclient_installed_file("manual\\html\\index.xhtml")); #endif menu_url_open(NULL, manualurl); } void menu_about_cb(GtkMenuItem *widget, gpointer data) { GError *error = NULL; static GtkAboutDialog *dlgAbout = NULL; if (!dlgAbout) { 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_ABOUT_DIALOG(gtk_builder_get_object(main_builder, "dlgAbout")); gtk_window_set_transient_for(GTK_WINDOW(dlgAbout), GTK_WINDOW(wndMain)); gtk_about_dialog_set_version(dlgAbout, VERSION); /* TODO: Will not be necessary if future glade versions do not insist on setting this property. */ gtk_about_dialog_set_logo(dlgAbout, NULL); gtk_builder_connect_signals(main_builder, NULL); } gtk_widget_show_all(GTK_WIDGET(dlgAbout)); gtk_window_present(GTK_WINDOW(dlgAbout)); } gboolean about_dlg_url_hook(GtkAboutDialog *about, gchar *link, gpointer data) { gchar *url = g_strdup(link); menu_url_open(NULL, url); return TRUE; } 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(GtkMenuItem *widget, gpointer data) { GtkWidget *mnuDisconnect = GTK_WIDGET(data); if (currentWorld && (currentWorld->connected || currentWorld->connecting)) { gtk_widget_set_sensitive(mnuDisconnect, TRUE); } else { gtk_widget_set_sensitive(mnuDisconnect, FALSE); } } void menu_edit_open_cb(GtkMenuItem *widget, gpointer data) { GtkWidget *mnuCut; GtkWidget *mnuCopy; GtkWidget *mnuPaste; GtkWidget *mnuDelete; GdkDisplay *display; GtkClipboard *clipboard; gboolean input_selected; gboolean output_selected; /* Safety check */ if (!currentWorld || !currentWorld->gui->cmbEntry || !currentWorld->gui->txtBuffer) { return; } mnuCut = GTK_WIDGET(gtk_builder_get_object(main_builder, "mnuCut")); mnuCopy = GTK_WIDGET(gtk_builder_get_object(main_builder, "mnuCopy")); mnuPaste = GTK_WIDGET(gtk_builder_get_object(main_builder, "mnuPaste")); mnuDelete = GTK_WIDGET(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_widget_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_widget_set_sensitive(mnuCut, input_selected); gtk_widget_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_widget_set_sensitive(mnuCopy, input_selected || output_selected); } void menu_cut_activate_cb(GtkMenuItem *widget, gpointer data) { simo_combo_box_cut_clipboard(currentWorld->gui->cmbEntry); } void menu_copy_activate_cb(GtkMenuItem *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(GtkMenuItem *widget, gpointer data) { simo_combo_box_paste_clipboard(currentWorld->gui->cmbEntry); } void menu_delete_activate_cb(GtkMenuItem *widget, gpointer data) { simo_combo_box_delete_selection(currentWorld->gui->cmbEntry); } void menu_find_activate_cb(GtkMenuItem *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(GtkMenuItem *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(GtkMenuItem *widget, gpointer data) { if (currentWorld) { clear_button_cb(NULL, currentWorld->gui); } } void menu_input_prev_cb(GtkMenuItem *widget, gpointer data) { if (currentWorld) { prev_or_next_command(currentWorld, FALSE); } } void menu_input_next_cb(GtkMenuItem *widget, gpointer data) { if (currentWorld) { prev_or_next_command(currentWorld, TRUE); } } void menu_input_find_prev_cb(GtkMenuItem *widget, gpointer data) { if (currentWorld) { find_prev_or_next_command(currentWorld, FALSE); } } void menu_input_find_next_cb(GtkMenuItem *widget, gpointer data) { if (currentWorld) { find_prev_or_next_command(currentWorld, TRUE); } } void menu_preferences_open_cb(GtkMenuItem *widget, gpointer data) { GtkCheckMenuItem *mnuDisableTriggers; GtkCheckMenuItem *mnuDisableAliases; GtkCheckMenuItem *mnuDisableMacros; GtkCheckMenuItem *mnuDisableTimers; if (!currentWorld) { return; } mnuDisableTriggers = GTK_CHECK_MENU_ITEM(gtk_builder_get_object(main_builder, "mnuDisTriggers")); mnuDisableAliases = GTK_CHECK_MENU_ITEM(gtk_builder_get_object(main_builder, "mnuDisAliases")); mnuDisableMacros = GTK_CHECK_MENU_ITEM(gtk_builder_get_object(main_builder, "mnuDisMacros")); mnuDisableTimers = GTK_CHECK_MENU_ITEM(gtk_builder_get_object(main_builder, "mnuDisTimers")); gtk_check_menu_item_set_active(mnuDisableTriggers, currentWorld->disable_triggers); gtk_check_menu_item_set_active(mnuDisableAliases, currentWorld->disable_aliases); gtk_check_menu_item_set_active(mnuDisableMacros, currentWorld->disable_macros); gtk_check_menu_item_set_active(mnuDisableTimers, currentWorld->disable_timers); } void menu_disable_triggers_cb(GtkMenuItem *widget, gpointer data) { currentWorld->disable_triggers = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); } void menu_disable_aliases_cb(GtkMenuItem *widget, gpointer data) { currentWorld->disable_aliases = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); } void menu_disable_macros_cb(GtkMenuItem *widget, gpointer data) { currentWorld->disable_macros = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); } void menu_disable_timers_cb(GtkMenuItem *widget, gpointer data) { currentWorld->disable_timers = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); } void menu_debug_matches_cb(GtkMenuItem *widget, gpointer data) { debug_matches = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)); } void menu_display_open_cb(GtkMenuItem *widget, gpointer data) { GtkCheckMenuItem *mnuSplitWindow; if (!currentWorld) { return; } mnuSplitWindow = GTK_CHECK_MENU_ITEM(gtk_builder_get_object(main_builder, "mnuSplitWindow")); g_signal_handlers_block_by_func(G_OBJECT(mnuSplitWindow), menu_split_screen_cb, NULL); gtk_check_menu_item_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(GtkMenuItem *widget, gpointer data) { if (gtk_paned_get_position(currentWorld->gui->split_pane) == 0) { if (currentWorld->gui->last_split_position == 0) { GtkAllocation allocation; gtk_widget_get_allocation(GTK_WIDGET(currentWorld->gui->split_pane), &allocation); 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-3.2.0/src/we_statusbar.c0000644000175000017500000001260113217707706014227 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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) { 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) { configure_css(gui, world); } } 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-3.2.0/src/we_input.c0000644000175000017500000003540713217707706013367 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include #include #include "simocombobox.h" #include "kildclient.h" #include "perlscript.h" /*********************** * Function prototypes * ***********************/ static void fill_spell_languages_combo(GtkBuilder *ui_builder); static void fill_spell_checking(World *world, GtkBuilder *ui_builder); /* 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"); fill_spell_languages_combo(ui_builder); return panel; } static void fill_spell_languages_combo(GtkBuilder *ui_builder) { GtkComboBoxText *cmbSpellLanguage; GList *languages; GList *i; cmbSpellLanguage = GTK_COMBO_BOX_TEXT(gtk_builder_get_object(ui_builder, "cmbSpellLanguage")); languages = gtk_spell_checker_get_language_list(); for (i = languages; i != NULL; i = i->next) { gtk_combo_box_text_append_text(cmbSpellLanguage, i->data); } g_list_free(languages); } 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; 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")); 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); fill_spell_checking(world, ui_builder); 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, ""); } } static void fill_spell_checking(World *world, GtkBuilder *ui_builder) { GtkToggleButton *chkSpell; GtkComboBox *cmbSpellLanguage; chkSpell = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkSpell")); cmbSpellLanguage = GTK_COMBO_BOX(gtk_builder_get_object(ui_builder, "cmbSpellLanguage")); gtk_toggle_button_set_active(chkSpell, world->spell); if (world->spell_language) { GtkTreeModel *model; GtkTreeIter i; gboolean has_more; gboolean found; gint index; model = gtk_combo_box_get_model(cmbSpellLanguage); index = 0; has_more = gtk_tree_model_get_iter_first(model, &i); while (has_more) { gchar *language; gtk_tree_model_get(model, &i, 0, &language, -1); if (strcmp(language, world->spell_language) == 0) { g_free(language); found = TRUE; break; } g_free(language); ++index; has_more = gtk_tree_model_iter_next(model, &i); } if (found) { gtk_combo_box_set_active(cmbSpellLanguage, index); } else { gtk_combo_box_set_active(cmbSpellLanguage, -1); } } else { gtk_combo_box_set_active(cmbSpellLanguage, -1); } } 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; GtkComboBoxText *cmbSpellLanguage; GtkEntry *txtCommandSeparator; GtkEntryCompletion *completion; gchar *new_language; const gchar *new_separator; /* 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")); cmbSpellLanguage = GTK_COMBO_BOX_TEXT(gtk_builder_get_object(ui_builder, "cmbSpellLanguage")); 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); new_language = gtk_combo_box_text_get_active_text(cmbSpellLanguage); if (new_language != NULL && strcmp(new_language, "") != 0) { world->spell_language = new_language; } else { g_free(new_language); world->spell_language = NULL; } if (world->gui) { worldgui_configure_spell(world->gui); } g_strlcpy(world->command_separator, gtk_entry_get_text(txtCommandSeparator), sizeof(world->command_separator)); world->flood_prevention = gtk_toggle_button_get_active(chkFloodPrevention); world->max_equal_commands = gtk_spin_button_get_value_as_int(spnMaxCommands); new_separator = gtk_entry_get_text(txtPreventionCommand); if (!world->flood_prevention_command || strcmp(world->flood_prevention_command, new_separator) != 0) { g_free(world->flood_prevention_command); world->flood_prevention_command = g_strdup(new_separator); } } 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) { 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) { configure_css(gui, world); } } 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-3.2.0/src/mnuPopupURL.ui0000644000175000017500000000324513217707706014131 00000000000000 False False _Open link True False _Copy link address True kildclient-3.2.0/src/parser.c0000644000175000017500000001441313217707706013023 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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) { parse_commands_full(world, cmdline, NULL, NULL, FALSE); } void parse_commands_with_matches_and_notify(World *world, const char *cmdline, AV *matches) { parse_commands_full(world, cmdline, matches, NULL, TRUE); } void parse_commands_full(World *world, const gchar *cmdline, AV *matches, const gchar *colorline, gboolean notify) { MainThreadOperation *operation = g_new0(MainThreadOperation, 1); operation->action = PARSE_COMMANDS; operation->commands.commands = g_strdup(cmdline); operation->commands.matches = matches; operation->commands.colorline = g_strdup(colorline); operation->commands.notify = notify; queue_mainthread_operation(world, operation); } void mainthread_op_parse_commands(World *world, MainThreadOperation *operation) { gboolean needs_perl = operation->commands.colorline || operation->commands.matches; if (needs_perl) { GRAB_PERL(world); } if (operation->commands.colorline) { SV *Pcolorline; Pcolorline = get_sv("colorline", TRUE); SvUTF8_on(Pcolorline); sv_setpv(Pcolorline, operation->commands.colorline); } if (operation->commands.matches) { perl_set_arg_array(operation->commands.matches); } parse_command_line_immediately(world, operation->commands.commands); if (needs_perl) { RELEASE_PERL(world); } /* Notify waiting match trigger thread */ if (operation->commands.notify) { g_mutex_lock(&world->wait_command_mutex); world->command_executed = TRUE; g_cond_signal(&world->wait_command_cond); g_mutex_unlock(&world->wait_command_mutex); } } void parse_command_line_immediately(World *world, const char *cmdline) { int totallen; int seppos; int start; int end; gboolean quit; int cmdseplen; totallen = strlen(cmdline); cmdseplen = strlen(world->command_separator); start = 0; 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] == world->perl_character && len > 1 && cmdline[1] != world->perl_character) { 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_command_line_immediately(world, result); g_free(result); } else { process_command(world, cmd, len); } } static void process_command(World *world, const char *cmd, int len) { if (*cmd != world->perl_character) { send_to_world(world, cmd, len); } else { if (*(cmd + 1) == world->perl_character) { send_to_world(world, cmd + 1, len - 1); } else { SV *commands; SV *error; GRAB_PERL(world); commands = newSVpv(cmd + 1, len - 1); SvUTF8_on(commands); eval_sv(commands, TRUE | G_EVAL); error = get_sv("@", TRUE); if (SvTRUE(error)) { ansitextview_append_stringf(world->gui, "Perl Error: %s", SvPV_nolen(error)); } RELEASE_PERL(world); } } } kildclient-3.2.0/src/net.h0000644000175000017500000000621613217707706012324 00000000000000/* * Copyright (C) 2004-2017 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 /*************************** * 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" */ #define TELNET_OPT_GMCP 201 /* 0xC9, 0311 */ #define TELNET_OPT_MSDP 69 /* 0x45, 0105, "E" */ /************** * 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); void process_telnet_iac(World *world, int pos, int end); void start_mccp(World *world, int pos, int end); void end_mccp(World *world); /* Send and receive data */ ssize_t kc_recv(World *world, void *buf, size_t s); ssize_t kc_send(World *world, const void *buf, size_t s); /******************************* * 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); gboolean proxy_http_connected_to(World *world); #endif kildclient-3.2.0/src/kcircularqueue.c0000644000175000017500000000662013217707706014554 00000000000000/* * Copyright (C) 2004-2017 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); } 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-3.2.0/src/we_timers.c0000644000175000017500000006061313217707706013530 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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), ngettext("timer", "timers", n), n); 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", "adjSpnTimerInterval", "adjSpnTimerCount", 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; gdouble 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_window_set_transient_for(GTK_WINDOW(dlgEditTimer), GTK_WINDOW(world->dlgEditWorld)); 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(spnInterval); if (newinterval <= 0) { kc_error_dialog(GTK_WINDOW(dlgEditTimer), _("The interval must be positive.")); continue; } newaction = gtk_entry_get_text(txtAction); if (strcmp(newaction, "") == 0) { kc_error_dialog(GTK_WINDOW(dlgEditTimer), _("You must specify the action.")); 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_KEY_Delete || evt->keyval == GDK_KEY_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-3.2.0/src/process_line_thread.c0000644000175000017500000003364613217707706015554 00000000000000/* * Copyright (C) 2004-2017 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 "kildclient.h" #include "perlscript.h" /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ static void do_process_line_operation(World *world, ProcessLineOperation *operation); static void process_recv_complete_line(World *world, ProcessLineOperation *operation); static void process_recv_incomplete_line(World *world, ProcessLineOperation *operation); static void match_rewriter_trigger(World *world, Trigger *trigger, gchar **line, gchar **colorline, gsize *output_len, SV *Pcolorline, gint *n_matches, gint trigger_number); static gboolean verify_gag_trigger(Trigger *trigger, const gchar *line, gboolean *gag_output, gboolean *gag_log, GSList **highlights); static gboolean match_normal_trigger(World *world, Trigger *trigger, const gchar *colorline, const gchar *line, gint *n_matches, gint trigger_number, GSList **trigger_response); static void output_line(World *world, gboolean gag_output, gboolean gag_log, const gchar *colorline, const gchar *line, gsize len, GSList *highlights); gpointer process_line_thread(gpointer data) { World *world = (World *) data; g_async_queue_ref(world->process_line_operations); g_async_queue_ref(world->ansiparse_operations); g_async_queue_ref(world->mainthread_operations); while (1) { ProcessLineOperation *operation = (ProcessLineOperation *) g_async_queue_pop(world->process_line_operations); if (world->to_be_destructed) { g_async_queue_unref(world->process_line_operations); g_async_queue_unref(world->ansiparse_operations); g_async_queue_unref(world->mainthread_operations); free_process_line_operation(operation); return NULL; } do_process_line_operation(world, operation); free_process_line_operation(operation); } } void queue_process_line_operation(World *world, ProcessLineOperation *operation) { g_async_queue_push(world->process_line_operations, operation); } void free_process_line_operation(gpointer data) { ProcessLineOperation *operation = (ProcessLineOperation *) data; if (operation->action != DUMMY_PROCESS_LINE) { g_free(operation->line); } g_free(operation); } static void do_process_line_operation(World *world, ProcessLineOperation *operation) { switch (operation->action) { case PROCESS_COMPLETE_LINE: process_recv_complete_line(world, operation); break; case PROCESS_INCOMPLETE_LINE: process_recv_incomplete_line(world, operation); break; case DUMMY_PROCESS_LINE: /* Do nothing */ break; } } static void process_recv_complete_line(World *world, ProcessLineOperation *operation) { gchar *stripped; gint dummy; gboolean gag_output = FALSE; gboolean gag_log = FALSE; AnsiParseOperation *ansi_operation; stripped = strip_ansi(operation->line, operation->len); match_triggers(world, &stripped, &operation->line, &operation->len, &gag_output, &gag_log, &dummy, NULL); g_free(stripped); /* The line is printed and written to the log file in match_triggers. */ if (!gag_output) { MainThreadOperation *mainthread_op = g_new(MainThreadOperation, 1); mainthread_op->action = EXECUTE_ON_RECEIVED_TEXT; mainthread_op->hook_execution = g_new(HookExecution, 1); mainthread_op->hook_execution->world = world; mainthread_op->hook_execution->data = g_strdup(operation->line); queue_mainthread_operation(world, mainthread_op); } /* Final actions after line is parsed. */ ansi_operation = g_new(AnsiParseOperation, 1); ansi_operation->action = FINALIZE_LINE; queue_ansiparse_operation(world, ansi_operation); } static void process_recv_incomplete_line(World *world, ProcessLineOperation *operation) { AnsiParseOperation *ansi_operation = g_new(AnsiParseOperation, 1); ansi_operation->action = APPEND_LINE; ansi_operation->line.line = g_strdup(operation->line); ansi_operation->line.line_len = operation->len; queue_ansiparse_operation(world, ansi_operation); /* Final actions after line is parsed. */ ansi_operation = g_new(AnsiParseOperation, 1); ansi_operation->action = FINALIZE_LINE; queue_ansiparse_operation(world, ansi_operation); } void match_triggers(World *world, gchar **line, gchar **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; int i; GSList *highlights = NULL; *n_matches = 0; if (world->disable_triggers) { if (!trigger_response) { AnsiParseOperation *operation = g_new(AnsiParseOperation, 1); operation->action = APPEND_LINE; operation->line.line = g_strdup(*colorline); operation->line.line_len = *output_len; queue_ansiparse_operation(world, operation); write_log_line(world, *line, NULL); } return; } GRAB_PERL(world); /* * First pass: rewriter triggers */ Pcolorline = get_sv("colorline", TRUE); SvUTF8_on(Pcolorline); trigptr = world->triggers; i = 0; while (trigptr) { trigger = (Trigger *) trigptr->data; if (trigger->rewriter) { match_rewriter_trigger(world, trigger, line, colorline, output_len, Pcolorline, n_matches, i); } 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) { if (verify_gag_trigger(trigger, *line, gag_output, gag_log, &highlights) && !trigger->keepexecuting) { break; } } trigptr = trigptr->next; } if (!trigger_response) { output_line(world, *gag_output, *gag_log, *colorline, *line, *output_len, highlights); } /* * Third pass: run normal triggers */ world_for_perl = world; trigptr = world->triggers; i = 0; while (trigptr) { trigger = (Trigger *) trigptr->data; if (!trigger->rewriter) { if (match_normal_trigger(world, trigger, *colorline, *line, n_matches, i, trigger_response) && !trigger->keepexecuting) { break; } } trigptr = trigptr->next; ++i; } world_for_perl = currentWorld; RELEASE_PERL(world); } static void match_rewriter_trigger(World *world, Trigger *trigger, gchar **line, gchar **colorline, gsize *output_len, SV *Pcolorline, gint *n_matches, gint trigger_number) { AV *matches; gchar *tmp; if (!trigger->enabled || !perl_match(*line, trigger->pattern_re, NULL, NULL, 0, &matches)) { return; } ++(*n_matches); if (debug_matches) { fprintf(stderr, "**Trigger %d '%s' (rewriter) matched for world %s\n" " Line: %s" " Pattern: %s\n" " Action: %s\n", trigger_number, trigger->name ? trigger->name : "", world->name, *line, trigger->pattern, trigger->action); } if (trigger->action) { parse_commands_full(world, trigger->action, matches, *colorline, TRUE); } /* We need to wait for the command to finish so we can get the new line. */ RELEASE_PERL(world); g_mutex_lock(&world->wait_command_mutex); while (!world->command_executed) { g_cond_wait(&world->wait_command_cond, &world->wait_command_mutex); } g_free(*colorline); tmp = SvPV(Pcolorline, *output_len); *colorline = g_strdup(tmp); g_free(*line); *line = strip_ansi(*colorline, *output_len); world->command_executed = FALSE; g_mutex_unlock(&world->wait_command_mutex); GRAB_PERL(world); } static gboolean verify_gag_trigger(Trigger *trigger, const gchar *line, gboolean *gag_output, gboolean *gag_log, GSList **highlights) { gint match_start; gint match_end; if (!trigger->enabled || !perl_match(line, trigger->pattern_re, &match_start, &match_end, trigger->high_target, NULL)) { return FALSE; } *gag_output |= trigger->gag_output; *gag_log |= trigger->gag_log; if (*gag_output && *gag_log) { return TRUE; } if (trigger->highlight) { HighlightApplication *highlight = g_new(HighlightApplication, 1); highlight->trigger = trigger; highlight->match_start = match_start; highlight->match_end = match_end; *highlights = g_slist_append(*highlights, highlight); } return TRUE; } static gboolean match_normal_trigger(World *world, Trigger *trigger, const gchar *colorline, const gchar *line, gint *n_matches, gint trigger_number, GSList **trigger_response) { AV *matches; if (!trigger->enabled || !perl_match(line, trigger->pattern_re, NULL, NULL, 0, &matches)) { return FALSE; } ++(*n_matches); if (debug_matches) { fprintf(stderr, "**Trigger %d '%s' matched for world %s\n" " Line: %s" " Pattern: %s\n" " Action: %s\n", trigger_number, 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(trigger->action, world->trigger_action_re, "$__M[$1]", FALSE, TRUE); if (!trigger_response) { if (action) { parse_commands_full(world, action, matches, colorline, FALSE); g_free(action); } else { parse_commands_full(world, trigger->action, matches, colorline, FALSE); } } else { if (action) { *trigger_response = g_slist_append(*trigger_response, action); } else { *trigger_response = g_slist_append(*trigger_response, g_strdup(trigger->action)); } } } return TRUE; } static void output_line(World *world, gboolean gag_output, gboolean gag_log, const gchar *colorline, const gchar *line, gsize len, GSList *highlights) { if (!gag_output) { AnsiParseOperation *operation = g_new(AnsiParseOperation, 1); operation->action = APPEND_LINE; operation->line.line = g_strdup(colorline); operation->line.line_len = len; queue_ansiparse_operation(world, operation); operation = g_new(AnsiParseOperation, 1); operation->action = APPLY_HIGHLIGHTS_AND_MOVE_MARK; operation->highlights = highlights; queue_ansiparse_operation(world, operation); } if (!gag_log) { write_log_line(world, line, NULL); } } kildclient-3.2.0/src/worlds.c0000644000175000017500000024071313217707706013045 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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_PERL_CHARACTER, 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_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; GdkRGBA *currColor; GtkTreeIter curr_logon_iter; }; }; typedef struct WorldParser_s WorldParser; /*********************** * Function prototypes * ***********************/ 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(GdkRGBA *color, const char *text, gsize text_len, GError **error); static void write_color(GString *str, char *name, int idx, GdkRGBA *color); /******************** * Global variables * ********************/ World *default_world = NULL; GdkRGBA deffore = { 0.74509804, 0.74509804, 0.74509804, 1 }; GdkRGBA defbold = { 1, 1, 1, 1 }; GdkRGBA defback = { 0, 0, 0 , 1 }; GdkRGBA defboldback = { 0.37254902, 0.37254902, 0.37254902, 1 }; GdkRGBA defansi[] = { { 0, 0, 0, 1 }, /* Black */ { 0.54509804, 0, 0, 1 }, /* Red */ { 0, 0.45098039, 0, 1 }, /* Green */ { 0.54509804, 0.41176471, 0.07843137, 1 }, /* Yellow */ { 0, 0, 0.54509804, 1 }, /* Blue */ { 0.54509804, 0, 0.54509804, 1 }, /* Magenta */ { 0, 0.54509804, 0.54509804, 1 }, /* Cyan */ { 0.74509804, 0.74509804, 0.74509804, 1 }, /* White */ { 0.37254902, 0.37254902, 0.37254902, 1 }, /* Bold Black */ { 1, 0, 0, 1 }, /* Bold Red */ { 0, 1, 0, 1 }, /* Bold Green */ { 1, 1, 0, 1 }, /* Bold Yellow */ { 0, 0, 1, 1 }, /* Bold Blue */ { 1, 0, 1, 1 }, /* Bold Magenta */ { 0, 1, 1, 1 }, /* Bold Cyan */ { 1, 1, 1, 1 }, /* 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; g_rec_mutex_init(&world->perl_mutex); if (!load_defaults) { return 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(GdkRGBA)); memcpy(world->defbold, default_world->defbold, sizeof(GdkRGBA)); memcpy(world->defback, default_world->defback, sizeof(GdkRGBA)); memcpy(world->defboldback, default_world->defboldback, sizeof(GdkRGBA)); memcpy(world->ansicolors, default_world->ansicolors, 16*sizeof(GdkRGBA)); 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->perl_character = default_world->perl_character; 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_file_name = g_strdup(default_world->log_file_name); 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; } 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(GdkRGBA)); memcpy(default_world->defbold, &defbold, sizeof(GdkRGBA)); memcpy(default_world->defback, &defback, sizeof(GdkRGBA)); memcpy(default_world->defboldback, &defboldback, sizeof(GdkRGBA)); memcpy(default_world->ansicolors, &defansi, 16*sizeof(GdkRGBA)); 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->perl_character = '/'; 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(GdkRGBA, 1); world->defbold = g_new0(GdkRGBA, 1); world->defback = g_new0(GdkRGBA, 1); world->defboldback = g_new0(GdkRGBA, 1); world->ansicolors = g_new0(GdkRGBA, 16); } void init_threads(World *world) { g_mutex_init(&world->write_log_line_mutex); g_mutex_init(&world->wait_command_mutex); g_cond_init(&world->wait_command_cond); world->process_line_operations = g_async_queue_new_full(free_process_line_operation); world->process_line_thread = g_thread_new("process_line", process_line_thread, world); world->ansiparse_operations = g_async_queue_new_full(free_ansiparse_operation); world->ansiparse_thread = g_thread_new("ansiparse", ansiparse_thread, world); world->mainthread_operations = g_async_queue_new_full(free_mainthread_operation); world->mainthread_operations_idle_id = g_timeout_add(100, mainthread_operations_idle_cb, world); } void free_world(World *world) { if (world->has_unread_text) { --worlds_with_new_text; adjust_window_title(); } if (world->ansiparse_thread) { AnsiParseOperation *ansi_op; ProcessLineOperation *process_line_op; g_source_remove(world->mainthread_operations_idle_id); g_async_queue_unref(world->mainthread_operations); g_async_queue_unref(world->ansiparse_operations); g_async_queue_unref(world->process_line_operations); world->to_be_destructed = TRUE; /* We add an operation so that the threads wakes up (if the queue is empty, it might never notice that it should be destroyed). */ ansi_op = g_new(AnsiParseOperation, 1); ansi_op->action = DUMMY_ANSIPARSE; g_async_queue_push(world->ansiparse_operations, ansi_op); /* Wait for the thread to exit. */ g_thread_join(world->ansiparse_thread); /* The same, for process_line_thread */ process_line_op = g_new(ProcessLineOperation, 1); process_line_op->action = DUMMY_PROCESS_LINE; g_async_queue_push(world->process_line_operations, process_line_op); /* Notify a possibly waiting match trigger thread */ g_mutex_lock(&world->wait_command_mutex); world->command_executed = TRUE; g_cond_signal(&world->wait_command_cond); g_mutex_unlock(&world->wait_command_mutex); /* Wait for the thread to exit */ g_thread_join(world->process_line_thread); g_mutex_clear(&world->write_log_line_mutex); g_cond_clear(&world->wait_command_cond); g_mutex_clear(&world->wait_command_mutex); } 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); g_free(world->server_data_buffer); 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) { GRAB_PERL(world); } 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->hooks.OnServerData, (GFunc) free_hook, NULL); g_slist_free(world->hooks.OnServerData); g_slist_foreach(world->permanent_variables, (GFunc) free_permanent_variable, NULL); g_slist_free(world->permanent_variables); if (world->perl_interpreter) { RELEASE_PERL(world); } 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_object_unref(world->hooks.OnServerData_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); g_slist_foreach(world->selected_OnServerData_hooks, (GFunc) gtk_tree_row_reference_free, NULL); g_slist_free(world->selected_OnServerData_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_rec_mutex_clear(&world->perl_mutex); 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); } } for (iter = world->hooks.OnServerData; 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, "OnServerData", 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': %s"), file, 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, "perl-character") == 0) { parser->state = KC_PERL_CHARACTER; if (parser->forWorldSelector) { break; } while (*attribute_names) { if (strcmp(*attribute_names, "char") == 0) { parser->world->perl_character = *attribute_values[0]; } 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, "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 = strtod(*attribute_values, NULL); } 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_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_PERL_CHARACTER: 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_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_HOOKV2: if (!parser->forWorldSelector) { connect_hook(parser->world, parser->currHookTrigger, -1, parser->currHookAction, parser->currHookName, parser->currHookEnabled); 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_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" " \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->perl_character, 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)) { kc_error_dialog(GTK_WINDOW(wndMain), _("Could not open file '%s': %s"), world->file, error->message); } 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(GdkRGBA *color, const char *text, gsize text_len, GError **error) { gchar *colordesc; int idx; guint16 red, green, blue; copy_text(&colordesc, text, text_len); if (sscanf(colordesc, "%d %hu %hu %hu", &idx, &red, &green, &blue) != 4) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, "Invalid color specification in config file."); } color[idx].alpha = 1.0; color[idx].red = red / 65535.0; color[idx].green = green / 65535.0; color[idx].blue = blue / 65535.0; g_free(colordesc); } static void write_color(GString *str, char *name, int idx, GdkRGBA *color) { g_string_append_printf(str, " <%s>%d %d %d %d\n", name, idx, (int) (color[idx].red * 65535), (int) (color[idx].green * 65535), (int) (color[idx].blue * 65535), 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-3.2.0/src/we_colors.c0000644000175000017500000001217313217707706013524 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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; 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 */ for (i = 0; i < 16; ++i) { sprintf(btnname, "colorBtnAnsi[%d]", i); colorBtnAnsi = gtk_builder_get_object(ui_builder, btnname); gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(colorBtnAnsi), &world->ansicolors[i]); g_object_set_data(colorBtnAnsi, "colorptr", &world->ansicolors[i]); } /* Default colors category */ colorBtnDeffore = gtk_builder_get_object(ui_builder, "colorBtnDeffore"); gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(colorBtnDeffore), world->deffore); g_object_set_data(colorBtnDeffore, "colorptr", world->deffore); colorBtnDefbold = gtk_builder_get_object(ui_builder, "colorBtnDefbold"); gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(colorBtnDefbold), world->defbold); g_object_set_data(colorBtnDefbold, "colorptr", world->defbold); colorBtnDefback = gtk_builder_get_object(ui_builder, "colorBtnDefback"); gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(colorBtnDefback), world->defback); g_object_set_data(colorBtnDefback, "colorptr", world->defback); colorBtnDefboldback = gtk_builder_get_object(ui_builder, "colorBtnDefboldback"); gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(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; GdkRGBA *color = (GdkRGBA *) g_object_get_data(G_OBJECT(btn), "colorptr"); gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(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; GtkColorChooser *colorBtnAnsi; GtkColorChooser *colorBtnDeffore; GtkColorChooser *colorBtnDefbold; GtkColorChooser *colorBtnDefback; GtkColorChooser *colorBtnDefboldback; gchar btnname[18]; /* 18 is enough to hold the button names */ int i; ui_builder = world->ui_builder; colorBtnDeffore = GTK_COLOR_CHOOSER(gtk_builder_get_object(ui_builder, "colorBtnDeffore")); colorBtnDefbold = GTK_COLOR_CHOOSER(gtk_builder_get_object(ui_builder, "colorBtnDefbold")); colorBtnDefback = GTK_COLOR_CHOOSER(gtk_builder_get_object(ui_builder, "colorBtnDefback")); colorBtnDefboldback = GTK_COLOR_CHOOSER(gtk_builder_get_object(ui_builder, "colorBtnDefboldback")); memcpy(world->deffore, &deffore, sizeof(GdkRGBA)); gtk_color_chooser_set_rgba(colorBtnDeffore, world->deffore); memcpy(world->defbold, &defbold, sizeof(GdkRGBA)); gtk_color_chooser_set_rgba(colorBtnDefbold, world->defbold); memcpy(world->defback, &defback, sizeof(GdkRGBA)); gtk_color_chooser_set_rgba(colorBtnDefback, world->defback); memcpy(world->defboldback, &defboldback, sizeof(GdkRGBA)); gtk_color_chooser_set_rgba(colorBtnDefboldback, world->defboldback); memcpy(world->ansicolors, &defansi, 16*sizeof(GdkRGBA)); for (i = 0; i < 16; ++i) { sprintf(btnname, "colorBtnAnsi[%d]", i); colorBtnAnsi = GTK_COLOR_CHOOSER(gtk_builder_get_object(ui_builder, btnname)); gtk_color_chooser_set_rgba(colorBtnAnsi, &world->ansicolors[i]); } if (gui) { ansitextview_update_color_tags(gui, gui->world); } } kildclient-3.2.0/src/we_macros.c0000644000175000017500000005407413217707706013515 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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), ngettext("macro", "macros", n), n); 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); gtk_window_set_transient_for(GTK_WINDOW(dlgEditMacro), GTK_WINDOW(world->dlgEditWorld)); 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) { kc_error_dialog(GTK_WINDOW(dlgEditMacro), _("You must specify the key.")); continue; } gtk_accelerator_parse(newkey, &newkeyval, &newmodifiers); /* Shouldn't really happen if key codes are gotten from key press evt. */ if (!newkeyval) { kc_error_dialog(GTK_WINDOW(dlgEditMacro), _("Invalid key code.")); continue; } newaction = gtk_entry_get_text(txtAction); if (strcmp(newaction, "") == 0) { kc_error_dialog(GTK_WINDOW(dlgEditMacro), _("You must specify the action.")); 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_KEY_Delete || evt->keyval == GDK_KEY_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-3.2.0/src/timers.c0000644000175000017500000001441713217707706013036 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.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); 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 = 5; 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) + 5; 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 %*.3f %*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=\"%f\" 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-3.2.0/src/wresources.rc0000644000175000017500000000005411715730227014101 00000000000000kildclient ICON "../share/kildclient.ico" kildclient-3.2.0/src/dlgSelectWorld.ui0000644000175000017500000002710113217707706014636 00000000000000 False 8 Connect to True True normal False vertical 2 False 8 end _Cancel True True True False False 0 C_onnect True True True True False False 1 False True end 0 _Select a saved world: True False True True True False False 4 1 230 175 True never in True True False True True 4 2 False 8 True _New True True True True True 0 _Edit True True True True True 1 _Delete True True True True True 2 False True 3 False False True 8 4 Or connect d_irectly: True False True True True radFromList False False 4 5 False 4 4 False _Host: True txtHost 1 0 0 False _Port: True txtPort 1 0 1 True True 1 0 True True 1 1 False True 4 6 btnCancel btnConnect kildclient-3.2.0/src/we_mainwindow.c0000644000175000017500000002745613217707706014411 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include "kildclient.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 scroll_output_changed_cb(GtkToggleButton *widget, gpointer data); G_MODULE_EXPORT void use_tooltips_changed_cb(GtkToggleButton *widget, gpointer data); static void fill_font_section(World *world, GtkBuilder *ui_builder); static void fill_word_wrap_section(World *world, GtkBuilder *ui_builder); static void fill_scrolling_section(World *world, GtkBuilder *ui_builder); static void fill_tooltip_section(World *world, GtkBuilder *ui_builder); static void fill_name_display_section(World *world, GtkBuilder *ui_builder); static void update_scrolling_parameters(World *world, GtkBuilder *ui_builder); static void update_name_display_parameters(World *world, GtkBuilder *ui_builder); /************************* * 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) { fill_font_section(world, ui_builder); fill_word_wrap_section(world, ui_builder); fill_scrolling_section(world, ui_builder); fill_tooltip_section(world, ui_builder); fill_name_display_section(world, ui_builder); } static void fill_font_section(World *world, GtkBuilder *ui_builder) { GtkFontButton *terminalfont_btn; GtkToggleButton *chkUseBold; terminalfont_btn = GTK_FONT_BUTTON(gtk_builder_get_object(ui_builder, "terminalfont_btn")); chkUseBold = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkUseBold")); gtk_font_button_set_font_name(terminalfont_btn, world->terminalfont); gtk_toggle_button_set_active(chkUseBold, world->usebold); } static void fill_word_wrap_section(World *world, GtkBuilder *ui_builder) { GtkToggleButton *chkUseWrap; GtkSpinButton *spnWrapIndent; GtkToggleButton *radWrapFullWidth; GtkToggleButton *radWrapColumn; GtkSpinButton *spnWrapColumn; 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")); 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); } static void fill_scrolling_section(World *world, GtkBuilder *ui_builder) { GtkToggleButton *chkScrollOutput; GtkSpinButton *txtBufferLines; chkScrollOutput = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkScrollOutput")); txtBufferLines = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "txtBufferLines")); gtk_toggle_button_set_active(chkScrollOutput, world->scrollOutput); gtk_spin_button_set_value(txtBufferLines, world->buffer_lines); } static void fill_tooltip_section(World *world, GtkBuilder *ui_builder) { GtkToggleButton *chkUseTooltips; chkUseTooltips = GTK_TOGGLE_BUTTON(gtk_builder_get_object(ui_builder, "chkUseTooltips")); gtk_toggle_button_set_active(chkUseTooltips, world->use_tooltips); } static void fill_name_display_section(World *world, GtkBuilder *ui_builder) { GtkToggleButton *radNameDisplayWorld; GtkToggleButton *radNameDisplayWorldChar; GtkToggleButton *radNameDisplayCharWorld; GtkToggleButton *radNameDisplayCustom; GtkEntry *txtNameDisplayCustom; 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")); 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 terminalfont_set_cb(GtkFontButton *font_btn, gpointer data) { 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) { configure_css(gui, world); /* 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 scroll_output_changed_cb(GtkToggleButton *widget, gpointer data) { World *world = (World *) data; world->scrollOutput = gtk_toggle_button_get_active(widget); } 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); } } void update_we_mainwindow_parameters(World *world, GtkBuilder *ui_builder) { update_scrolling_parameters(world, ui_builder); update_name_display_parameters(world, ui_builder); } static void update_scrolling_parameters(World *world, GtkBuilder *ui_builder) { GtkSpinButton *txtBufferLines; txtBufferLines = GTK_SPIN_BUTTON(gtk_builder_get_object(ui_builder, "txtBufferLines")); world->buffer_lines = gtk_spin_button_get_value_as_int(txtBufferLines); } static void update_name_display_parameters(World *world, GtkBuilder *ui_builder) { GtkToggleButton *radNameDisplayWorld; GtkToggleButton *radNameDisplayWorldChar; GtkToggleButton *radNameDisplayCharWorld; GtkToggleButton *radNameDisplayCustom; GtkEntry *txtNameDisplayCustom; const gchar *newval; 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")); 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-3.2.0/src/we_protocols.c0000644000175000017500000000500413217707706014242 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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-3.2.0/src/perlscript.h0000644000175000017500000000735613217707706013733 00000000000000/* * Copyright (C) 2004-2017 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; /********** * Macros * **********/ #define GRAB_PERL(w) g_rec_mutex_lock(&w->perl_mutex); \ PERL_SET_CONTEXT(w->perl_interpreter) #define RELEASE_PERL(w) g_rec_mutex_unlock(&w->perl_mutex) /*********************** * 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(const char *file); int perl_match(const char *line, SV *pattern_re, int *match_start, int *match_end, int substring, AV **matches); char *perl_substitute(const char *line, SV *pattern_re, const char *substitution, int perl_eval, int global); SV *precompute_re(const char *re_string, int ignore_case); void perl_set_arg_array(AV *array); void parse_server_data(char *protocol, char *data); 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-3.2.0/src/Makefile.in0000644000175000017500000035352313217705331013430 00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = kildclient$(EXEEXT) @WINDOWS_TRUE@am__append_1 = wresources.rc subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) 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_SOURCES_DIST = main.c net.c telnet.c proxy.c \ mainwindow.c worldgui.c mainthread_operations.c \ process_line_thread.c ansiparse_thread.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_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 \ util.c perlscript.c kcwin.c simocombobox.c kcircularqueue.c \ wresources.rc @WINDOWS_TRUE@am__objects_1 = wresources.$(OBJEXT) am_kildclient_OBJECTS = kildclient-main.$(OBJEXT) \ kildclient-net.$(OBJEXT) kildclient-telnet.$(OBJEXT) \ kildclient-proxy.$(OBJEXT) kildclient-mainwindow.$(OBJEXT) \ kildclient-worldgui.$(OBJEXT) \ kildclient-mainthread_operations.$(OBJEXT) \ kildclient-process_line_thread.$(OBJEXT) \ kildclient-ansiparse_thread.$(OBJEXT) \ kildclient-ansitextview.$(OBJEXT) \ kildclient-worldselector.$(OBJEXT) kildclient-worlds.$(OBJEXT) \ kildclient-worldeditor.$(OBJEXT) \ kildclient-we_general.$(OBJEXT) \ kildclient-we_mainwindow.$(OBJEXT) \ kildclient-we_colors.$(OBJEXT) \ kildclient-we_statusbar.$(OBJEXT) \ kildclient-we_input.$(OBJEXT) kildclient-we_logging.$(OBJEXT) \ kildclient-we_scripting.$(OBJEXT) \ kildclient-we_plugins.$(OBJEXT) \ kildclient-we_generic_guied.$(OBJEXT) \ kildclient-we_triggers.$(OBJEXT) \ kildclient-we_aliases.$(OBJEXT) kildclient-we_macros.$(OBJEXT) \ kildclient-we_timers.$(OBJEXT) kildclient-we_hooks.$(OBJEXT) \ kildclient-we_vars.$(OBJEXT) kildclient-we_protocols.$(OBJEXT) \ kildclient-we_advanced.$(OBJEXT) kildclient-prefs.$(OBJEXT) \ kildclient-parser.$(OBJEXT) kildclient-triggers.$(OBJEXT) \ kildclient-aliases.$(OBJEXT) kildclient-macros.$(OBJEXT) \ kildclient-timers.$(OBJEXT) \ kildclient-permanentvariables.$(OBJEXT) \ kildclient-hooks.$(OBJEXT) kildclient-log.$(OBJEXT) \ kildclient-plugins.$(OBJEXT) \ kildclient-multilinesend.$(OBJEXT) \ kildclient-cmdhistory.$(OBJEXT) kildclient-sound.$(OBJEXT) \ kildclient-util.$(OBJEXT) kildclient-perlscript.$(OBJEXT) \ kildclient-kcwin.$(OBJEXT) kildclient-simocombobox.$(OBJEXT) \ kildclient-kcircularqueue.$(OBJEXT) $(am__objects_1) 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) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(kildclient_SOURCES) DIST_SOURCES = $(am__kildclient_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(pkgdata_DATA) HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \ $(top_srcdir)/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ 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@ INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@ 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@ 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@ runstatedir = @runstatedir@ 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 telnet.c proxy.c mainwindow.c \ worldgui.c mainthread_operations.c process_line_thread.c \ ansiparse_thread.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_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 util.c perlscript.c \ kcwin.c simocombobox.c kcircularqueue.c $(am__append_1) noinst_HEADERS = kildclient.h \ net.h \ ansi.h \ perlscript.h \ libintl-wrapper.h \ simocombobox.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 uifiles = kildclient.ui \ wndmain.ui \ dlgSelectWorld.ui \ dlgPreferences.ui \ dlgStatistics.ui \ dlgAbout.ui \ dlgEditWorld.ui \ dlgTestTriggers.ui \ dlgMLSend.ui \ dlgCmdHistory.ui \ mnuPopupURL.ui EXTRA_DIST = $(pkgdata_DATA) $(uifiles) pkgdocdir = $(datadir)/doc/kildclient manualdir = $(pkgdocdir)/html kildclient_LDADD = $(GTK_LIBS) $(KILDCLIENT_PERL_LIBS) $(GTKSPELL_LIBS) $(LIBGNUTLS_LIBS) $(INTLLIBS) -lz kildclient_CPPFLAGS = -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) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/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) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; 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) $(EXTRA_kildclient_DEPENDENCIES) @rm -f kildclient$(EXEEXT) $(AM_V_CCLD)$(LINK) $(kildclient_OBJECTS) $(kildclient_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-aliases.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-ansiparse_thread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-ansitextview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-cmdhistory.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-hooks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-kcircularqueue.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-kcwin.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-log.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-macros.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-mainthread_operations.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-mainwindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-multilinesend.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-net.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-parser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-perlscript.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-permanentvariables.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-plugins.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-prefs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-process_line_thread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-proxy.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-simocombobox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-sound.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-telnet.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-timers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-triggers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_advanced.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_aliases.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_colors.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_general.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_generic_guied.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_hooks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_input.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_logging.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_macros.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_mainwindow.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_plugins.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_protocols.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_scripting.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_statusbar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_timers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_triggers.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-we_vars.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-worldeditor.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-worldgui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-worlds.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kildclient-worldselector.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` kildclient-main.o: main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-main.o -MD -MP -MF $(DEPDIR)/kildclient-main.Tpo -c -o kildclient-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-main.Tpo $(DEPDIR)/kildclient-main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main.c' object='kildclient-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c kildclient-main.obj: main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-main.obj -MD -MP -MF $(DEPDIR)/kildclient-main.Tpo -c -o kildclient-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-main.Tpo $(DEPDIR)/kildclient-main.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main.c' object='kildclient-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` kildclient-net.o: net.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-net.o -MD -MP -MF $(DEPDIR)/kildclient-net.Tpo -c -o kildclient-net.o `test -f 'net.c' || echo '$(srcdir)/'`net.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-net.Tpo $(DEPDIR)/kildclient-net.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='net.c' object='kildclient-net.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-net.o `test -f 'net.c' || echo '$(srcdir)/'`net.c kildclient-net.obj: net.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-net.obj -MD -MP -MF $(DEPDIR)/kildclient-net.Tpo -c -o kildclient-net.obj `if test -f 'net.c'; then $(CYGPATH_W) 'net.c'; else $(CYGPATH_W) '$(srcdir)/net.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-net.Tpo $(DEPDIR)/kildclient-net.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='net.c' object='kildclient-net.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-net.obj `if test -f 'net.c'; then $(CYGPATH_W) 'net.c'; else $(CYGPATH_W) '$(srcdir)/net.c'; fi` kildclient-telnet.o: telnet.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-telnet.o -MD -MP -MF $(DEPDIR)/kildclient-telnet.Tpo -c -o kildclient-telnet.o `test -f 'telnet.c' || echo '$(srcdir)/'`telnet.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-telnet.Tpo $(DEPDIR)/kildclient-telnet.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='telnet.c' object='kildclient-telnet.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-telnet.o `test -f 'telnet.c' || echo '$(srcdir)/'`telnet.c kildclient-telnet.obj: telnet.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-telnet.obj -MD -MP -MF $(DEPDIR)/kildclient-telnet.Tpo -c -o kildclient-telnet.obj `if test -f 'telnet.c'; then $(CYGPATH_W) 'telnet.c'; else $(CYGPATH_W) '$(srcdir)/telnet.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-telnet.Tpo $(DEPDIR)/kildclient-telnet.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='telnet.c' object='kildclient-telnet.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-telnet.obj `if test -f 'telnet.c'; then $(CYGPATH_W) 'telnet.c'; else $(CYGPATH_W) '$(srcdir)/telnet.c'; fi` kildclient-proxy.o: proxy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-proxy.o -MD -MP -MF $(DEPDIR)/kildclient-proxy.Tpo -c -o kildclient-proxy.o `test -f 'proxy.c' || echo '$(srcdir)/'`proxy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-proxy.Tpo $(DEPDIR)/kildclient-proxy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='proxy.c' object='kildclient-proxy.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-proxy.o `test -f 'proxy.c' || echo '$(srcdir)/'`proxy.c kildclient-proxy.obj: proxy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-proxy.obj -MD -MP -MF $(DEPDIR)/kildclient-proxy.Tpo -c -o kildclient-proxy.obj `if test -f 'proxy.c'; then $(CYGPATH_W) 'proxy.c'; else $(CYGPATH_W) '$(srcdir)/proxy.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-proxy.Tpo $(DEPDIR)/kildclient-proxy.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='proxy.c' object='kildclient-proxy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-proxy.obj `if test -f 'proxy.c'; then $(CYGPATH_W) 'proxy.c'; else $(CYGPATH_W) '$(srcdir)/proxy.c'; fi` kildclient-mainwindow.o: mainwindow.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-mainwindow.o -MD -MP -MF $(DEPDIR)/kildclient-mainwindow.Tpo -c -o kildclient-mainwindow.o `test -f 'mainwindow.c' || echo '$(srcdir)/'`mainwindow.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-mainwindow.Tpo $(DEPDIR)/kildclient-mainwindow.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mainwindow.c' object='kildclient-mainwindow.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-mainwindow.o `test -f 'mainwindow.c' || echo '$(srcdir)/'`mainwindow.c kildclient-mainwindow.obj: mainwindow.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-mainwindow.obj -MD -MP -MF $(DEPDIR)/kildclient-mainwindow.Tpo -c -o kildclient-mainwindow.obj `if test -f 'mainwindow.c'; then $(CYGPATH_W) 'mainwindow.c'; else $(CYGPATH_W) '$(srcdir)/mainwindow.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-mainwindow.Tpo $(DEPDIR)/kildclient-mainwindow.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mainwindow.c' object='kildclient-mainwindow.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-mainwindow.obj `if test -f 'mainwindow.c'; then $(CYGPATH_W) 'mainwindow.c'; else $(CYGPATH_W) '$(srcdir)/mainwindow.c'; fi` kildclient-worldgui.o: worldgui.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worldgui.o -MD -MP -MF $(DEPDIR)/kildclient-worldgui.Tpo -c -o kildclient-worldgui.o `test -f 'worldgui.c' || echo '$(srcdir)/'`worldgui.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worldgui.Tpo $(DEPDIR)/kildclient-worldgui.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worldgui.c' object='kildclient-worldgui.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worldgui.o `test -f 'worldgui.c' || echo '$(srcdir)/'`worldgui.c kildclient-worldgui.obj: worldgui.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worldgui.obj -MD -MP -MF $(DEPDIR)/kildclient-worldgui.Tpo -c -o kildclient-worldgui.obj `if test -f 'worldgui.c'; then $(CYGPATH_W) 'worldgui.c'; else $(CYGPATH_W) '$(srcdir)/worldgui.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worldgui.Tpo $(DEPDIR)/kildclient-worldgui.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worldgui.c' object='kildclient-worldgui.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worldgui.obj `if test -f 'worldgui.c'; then $(CYGPATH_W) 'worldgui.c'; else $(CYGPATH_W) '$(srcdir)/worldgui.c'; fi` kildclient-mainthread_operations.o: mainthread_operations.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-mainthread_operations.o -MD -MP -MF $(DEPDIR)/kildclient-mainthread_operations.Tpo -c -o kildclient-mainthread_operations.o `test -f 'mainthread_operations.c' || echo '$(srcdir)/'`mainthread_operations.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-mainthread_operations.Tpo $(DEPDIR)/kildclient-mainthread_operations.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mainthread_operations.c' object='kildclient-mainthread_operations.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-mainthread_operations.o `test -f 'mainthread_operations.c' || echo '$(srcdir)/'`mainthread_operations.c kildclient-mainthread_operations.obj: mainthread_operations.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-mainthread_operations.obj -MD -MP -MF $(DEPDIR)/kildclient-mainthread_operations.Tpo -c -o kildclient-mainthread_operations.obj `if test -f 'mainthread_operations.c'; then $(CYGPATH_W) 'mainthread_operations.c'; else $(CYGPATH_W) '$(srcdir)/mainthread_operations.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-mainthread_operations.Tpo $(DEPDIR)/kildclient-mainthread_operations.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mainthread_operations.c' object='kildclient-mainthread_operations.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-mainthread_operations.obj `if test -f 'mainthread_operations.c'; then $(CYGPATH_W) 'mainthread_operations.c'; else $(CYGPATH_W) '$(srcdir)/mainthread_operations.c'; fi` kildclient-process_line_thread.o: process_line_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-process_line_thread.o -MD -MP -MF $(DEPDIR)/kildclient-process_line_thread.Tpo -c -o kildclient-process_line_thread.o `test -f 'process_line_thread.c' || echo '$(srcdir)/'`process_line_thread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-process_line_thread.Tpo $(DEPDIR)/kildclient-process_line_thread.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='process_line_thread.c' object='kildclient-process_line_thread.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-process_line_thread.o `test -f 'process_line_thread.c' || echo '$(srcdir)/'`process_line_thread.c kildclient-process_line_thread.obj: process_line_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-process_line_thread.obj -MD -MP -MF $(DEPDIR)/kildclient-process_line_thread.Tpo -c -o kildclient-process_line_thread.obj `if test -f 'process_line_thread.c'; then $(CYGPATH_W) 'process_line_thread.c'; else $(CYGPATH_W) '$(srcdir)/process_line_thread.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-process_line_thread.Tpo $(DEPDIR)/kildclient-process_line_thread.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='process_line_thread.c' object='kildclient-process_line_thread.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-process_line_thread.obj `if test -f 'process_line_thread.c'; then $(CYGPATH_W) 'process_line_thread.c'; else $(CYGPATH_W) '$(srcdir)/process_line_thread.c'; fi` kildclient-ansiparse_thread.o: ansiparse_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-ansiparse_thread.o -MD -MP -MF $(DEPDIR)/kildclient-ansiparse_thread.Tpo -c -o kildclient-ansiparse_thread.o `test -f 'ansiparse_thread.c' || echo '$(srcdir)/'`ansiparse_thread.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-ansiparse_thread.Tpo $(DEPDIR)/kildclient-ansiparse_thread.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ansiparse_thread.c' object='kildclient-ansiparse_thread.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-ansiparse_thread.o `test -f 'ansiparse_thread.c' || echo '$(srcdir)/'`ansiparse_thread.c kildclient-ansiparse_thread.obj: ansiparse_thread.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-ansiparse_thread.obj -MD -MP -MF $(DEPDIR)/kildclient-ansiparse_thread.Tpo -c -o kildclient-ansiparse_thread.obj `if test -f 'ansiparse_thread.c'; then $(CYGPATH_W) 'ansiparse_thread.c'; else $(CYGPATH_W) '$(srcdir)/ansiparse_thread.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-ansiparse_thread.Tpo $(DEPDIR)/kildclient-ansiparse_thread.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ansiparse_thread.c' object='kildclient-ansiparse_thread.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-ansiparse_thread.obj `if test -f 'ansiparse_thread.c'; then $(CYGPATH_W) 'ansiparse_thread.c'; else $(CYGPATH_W) '$(srcdir)/ansiparse_thread.c'; fi` kildclient-ansitextview.o: ansitextview.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-ansitextview.o -MD -MP -MF $(DEPDIR)/kildclient-ansitextview.Tpo -c -o kildclient-ansitextview.o `test -f 'ansitextview.c' || echo '$(srcdir)/'`ansitextview.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-ansitextview.Tpo $(DEPDIR)/kildclient-ansitextview.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ansitextview.c' object='kildclient-ansitextview.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-ansitextview.o `test -f 'ansitextview.c' || echo '$(srcdir)/'`ansitextview.c kildclient-ansitextview.obj: ansitextview.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-ansitextview.obj -MD -MP -MF $(DEPDIR)/kildclient-ansitextview.Tpo -c -o kildclient-ansitextview.obj `if test -f 'ansitextview.c'; then $(CYGPATH_W) 'ansitextview.c'; else $(CYGPATH_W) '$(srcdir)/ansitextview.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-ansitextview.Tpo $(DEPDIR)/kildclient-ansitextview.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ansitextview.c' object='kildclient-ansitextview.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-ansitextview.obj `if test -f 'ansitextview.c'; then $(CYGPATH_W) 'ansitextview.c'; else $(CYGPATH_W) '$(srcdir)/ansitextview.c'; fi` kildclient-worldselector.o: worldselector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worldselector.o -MD -MP -MF $(DEPDIR)/kildclient-worldselector.Tpo -c -o kildclient-worldselector.o `test -f 'worldselector.c' || echo '$(srcdir)/'`worldselector.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worldselector.Tpo $(DEPDIR)/kildclient-worldselector.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worldselector.c' object='kildclient-worldselector.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worldselector.o `test -f 'worldselector.c' || echo '$(srcdir)/'`worldselector.c kildclient-worldselector.obj: worldselector.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worldselector.obj -MD -MP -MF $(DEPDIR)/kildclient-worldselector.Tpo -c -o kildclient-worldselector.obj `if test -f 'worldselector.c'; then $(CYGPATH_W) 'worldselector.c'; else $(CYGPATH_W) '$(srcdir)/worldselector.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worldselector.Tpo $(DEPDIR)/kildclient-worldselector.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worldselector.c' object='kildclient-worldselector.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worldselector.obj `if test -f 'worldselector.c'; then $(CYGPATH_W) 'worldselector.c'; else $(CYGPATH_W) '$(srcdir)/worldselector.c'; fi` kildclient-worlds.o: worlds.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worlds.o -MD -MP -MF $(DEPDIR)/kildclient-worlds.Tpo -c -o kildclient-worlds.o `test -f 'worlds.c' || echo '$(srcdir)/'`worlds.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worlds.Tpo $(DEPDIR)/kildclient-worlds.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worlds.c' object='kildclient-worlds.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worlds.o `test -f 'worlds.c' || echo '$(srcdir)/'`worlds.c kildclient-worlds.obj: worlds.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worlds.obj -MD -MP -MF $(DEPDIR)/kildclient-worlds.Tpo -c -o kildclient-worlds.obj `if test -f 'worlds.c'; then $(CYGPATH_W) 'worlds.c'; else $(CYGPATH_W) '$(srcdir)/worlds.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worlds.Tpo $(DEPDIR)/kildclient-worlds.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worlds.c' object='kildclient-worlds.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worlds.obj `if test -f 'worlds.c'; then $(CYGPATH_W) 'worlds.c'; else $(CYGPATH_W) '$(srcdir)/worlds.c'; fi` kildclient-worldeditor.o: worldeditor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worldeditor.o -MD -MP -MF $(DEPDIR)/kildclient-worldeditor.Tpo -c -o kildclient-worldeditor.o `test -f 'worldeditor.c' || echo '$(srcdir)/'`worldeditor.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worldeditor.Tpo $(DEPDIR)/kildclient-worldeditor.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worldeditor.c' object='kildclient-worldeditor.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worldeditor.o `test -f 'worldeditor.c' || echo '$(srcdir)/'`worldeditor.c kildclient-worldeditor.obj: worldeditor.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-worldeditor.obj -MD -MP -MF $(DEPDIR)/kildclient-worldeditor.Tpo -c -o kildclient-worldeditor.obj `if test -f 'worldeditor.c'; then $(CYGPATH_W) 'worldeditor.c'; else $(CYGPATH_W) '$(srcdir)/worldeditor.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-worldeditor.Tpo $(DEPDIR)/kildclient-worldeditor.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='worldeditor.c' object='kildclient-worldeditor.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-worldeditor.obj `if test -f 'worldeditor.c'; then $(CYGPATH_W) 'worldeditor.c'; else $(CYGPATH_W) '$(srcdir)/worldeditor.c'; fi` kildclient-we_general.o: we_general.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_general.o -MD -MP -MF $(DEPDIR)/kildclient-we_general.Tpo -c -o kildclient-we_general.o `test -f 'we_general.c' || echo '$(srcdir)/'`we_general.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_general.Tpo $(DEPDIR)/kildclient-we_general.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_general.c' object='kildclient-we_general.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_general.o `test -f 'we_general.c' || echo '$(srcdir)/'`we_general.c kildclient-we_general.obj: we_general.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_general.obj -MD -MP -MF $(DEPDIR)/kildclient-we_general.Tpo -c -o kildclient-we_general.obj `if test -f 'we_general.c'; then $(CYGPATH_W) 'we_general.c'; else $(CYGPATH_W) '$(srcdir)/we_general.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_general.Tpo $(DEPDIR)/kildclient-we_general.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_general.c' object='kildclient-we_general.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_general.obj `if test -f 'we_general.c'; then $(CYGPATH_W) 'we_general.c'; else $(CYGPATH_W) '$(srcdir)/we_general.c'; fi` kildclient-we_mainwindow.o: we_mainwindow.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_mainwindow.o -MD -MP -MF $(DEPDIR)/kildclient-we_mainwindow.Tpo -c -o kildclient-we_mainwindow.o `test -f 'we_mainwindow.c' || echo '$(srcdir)/'`we_mainwindow.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_mainwindow.Tpo $(DEPDIR)/kildclient-we_mainwindow.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_mainwindow.c' object='kildclient-we_mainwindow.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_mainwindow.o `test -f 'we_mainwindow.c' || echo '$(srcdir)/'`we_mainwindow.c kildclient-we_mainwindow.obj: we_mainwindow.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_mainwindow.obj -MD -MP -MF $(DEPDIR)/kildclient-we_mainwindow.Tpo -c -o kildclient-we_mainwindow.obj `if test -f 'we_mainwindow.c'; then $(CYGPATH_W) 'we_mainwindow.c'; else $(CYGPATH_W) '$(srcdir)/we_mainwindow.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_mainwindow.Tpo $(DEPDIR)/kildclient-we_mainwindow.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_mainwindow.c' object='kildclient-we_mainwindow.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_mainwindow.obj `if test -f 'we_mainwindow.c'; then $(CYGPATH_W) 'we_mainwindow.c'; else $(CYGPATH_W) '$(srcdir)/we_mainwindow.c'; fi` kildclient-we_colors.o: we_colors.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_colors.o -MD -MP -MF $(DEPDIR)/kildclient-we_colors.Tpo -c -o kildclient-we_colors.o `test -f 'we_colors.c' || echo '$(srcdir)/'`we_colors.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_colors.Tpo $(DEPDIR)/kildclient-we_colors.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_colors.c' object='kildclient-we_colors.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_colors.o `test -f 'we_colors.c' || echo '$(srcdir)/'`we_colors.c kildclient-we_colors.obj: we_colors.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_colors.obj -MD -MP -MF $(DEPDIR)/kildclient-we_colors.Tpo -c -o kildclient-we_colors.obj `if test -f 'we_colors.c'; then $(CYGPATH_W) 'we_colors.c'; else $(CYGPATH_W) '$(srcdir)/we_colors.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_colors.Tpo $(DEPDIR)/kildclient-we_colors.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_colors.c' object='kildclient-we_colors.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_colors.obj `if test -f 'we_colors.c'; then $(CYGPATH_W) 'we_colors.c'; else $(CYGPATH_W) '$(srcdir)/we_colors.c'; fi` kildclient-we_statusbar.o: we_statusbar.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_statusbar.o -MD -MP -MF $(DEPDIR)/kildclient-we_statusbar.Tpo -c -o kildclient-we_statusbar.o `test -f 'we_statusbar.c' || echo '$(srcdir)/'`we_statusbar.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_statusbar.Tpo $(DEPDIR)/kildclient-we_statusbar.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_statusbar.c' object='kildclient-we_statusbar.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_statusbar.o `test -f 'we_statusbar.c' || echo '$(srcdir)/'`we_statusbar.c kildclient-we_statusbar.obj: we_statusbar.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_statusbar.obj -MD -MP -MF $(DEPDIR)/kildclient-we_statusbar.Tpo -c -o kildclient-we_statusbar.obj `if test -f 'we_statusbar.c'; then $(CYGPATH_W) 'we_statusbar.c'; else $(CYGPATH_W) '$(srcdir)/we_statusbar.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_statusbar.Tpo $(DEPDIR)/kildclient-we_statusbar.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_statusbar.c' object='kildclient-we_statusbar.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_statusbar.obj `if test -f 'we_statusbar.c'; then $(CYGPATH_W) 'we_statusbar.c'; else $(CYGPATH_W) '$(srcdir)/we_statusbar.c'; fi` kildclient-we_input.o: we_input.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_input.o -MD -MP -MF $(DEPDIR)/kildclient-we_input.Tpo -c -o kildclient-we_input.o `test -f 'we_input.c' || echo '$(srcdir)/'`we_input.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_input.Tpo $(DEPDIR)/kildclient-we_input.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_input.c' object='kildclient-we_input.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_input.o `test -f 'we_input.c' || echo '$(srcdir)/'`we_input.c kildclient-we_input.obj: we_input.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_input.obj -MD -MP -MF $(DEPDIR)/kildclient-we_input.Tpo -c -o kildclient-we_input.obj `if test -f 'we_input.c'; then $(CYGPATH_W) 'we_input.c'; else $(CYGPATH_W) '$(srcdir)/we_input.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_input.Tpo $(DEPDIR)/kildclient-we_input.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_input.c' object='kildclient-we_input.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_input.obj `if test -f 'we_input.c'; then $(CYGPATH_W) 'we_input.c'; else $(CYGPATH_W) '$(srcdir)/we_input.c'; fi` kildclient-we_logging.o: we_logging.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_logging.o -MD -MP -MF $(DEPDIR)/kildclient-we_logging.Tpo -c -o kildclient-we_logging.o `test -f 'we_logging.c' || echo '$(srcdir)/'`we_logging.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_logging.Tpo $(DEPDIR)/kildclient-we_logging.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_logging.c' object='kildclient-we_logging.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_logging.o `test -f 'we_logging.c' || echo '$(srcdir)/'`we_logging.c kildclient-we_logging.obj: we_logging.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_logging.obj -MD -MP -MF $(DEPDIR)/kildclient-we_logging.Tpo -c -o kildclient-we_logging.obj `if test -f 'we_logging.c'; then $(CYGPATH_W) 'we_logging.c'; else $(CYGPATH_W) '$(srcdir)/we_logging.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_logging.Tpo $(DEPDIR)/kildclient-we_logging.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_logging.c' object='kildclient-we_logging.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_logging.obj `if test -f 'we_logging.c'; then $(CYGPATH_W) 'we_logging.c'; else $(CYGPATH_W) '$(srcdir)/we_logging.c'; fi` kildclient-we_scripting.o: we_scripting.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_scripting.o -MD -MP -MF $(DEPDIR)/kildclient-we_scripting.Tpo -c -o kildclient-we_scripting.o `test -f 'we_scripting.c' || echo '$(srcdir)/'`we_scripting.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_scripting.Tpo $(DEPDIR)/kildclient-we_scripting.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_scripting.c' object='kildclient-we_scripting.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_scripting.o `test -f 'we_scripting.c' || echo '$(srcdir)/'`we_scripting.c kildclient-we_scripting.obj: we_scripting.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_scripting.obj -MD -MP -MF $(DEPDIR)/kildclient-we_scripting.Tpo -c -o kildclient-we_scripting.obj `if test -f 'we_scripting.c'; then $(CYGPATH_W) 'we_scripting.c'; else $(CYGPATH_W) '$(srcdir)/we_scripting.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_scripting.Tpo $(DEPDIR)/kildclient-we_scripting.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_scripting.c' object='kildclient-we_scripting.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_scripting.obj `if test -f 'we_scripting.c'; then $(CYGPATH_W) 'we_scripting.c'; else $(CYGPATH_W) '$(srcdir)/we_scripting.c'; fi` kildclient-we_plugins.o: we_plugins.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_plugins.o -MD -MP -MF $(DEPDIR)/kildclient-we_plugins.Tpo -c -o kildclient-we_plugins.o `test -f 'we_plugins.c' || echo '$(srcdir)/'`we_plugins.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_plugins.Tpo $(DEPDIR)/kildclient-we_plugins.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_plugins.c' object='kildclient-we_plugins.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_plugins.o `test -f 'we_plugins.c' || echo '$(srcdir)/'`we_plugins.c kildclient-we_plugins.obj: we_plugins.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_plugins.obj -MD -MP -MF $(DEPDIR)/kildclient-we_plugins.Tpo -c -o kildclient-we_plugins.obj `if test -f 'we_plugins.c'; then $(CYGPATH_W) 'we_plugins.c'; else $(CYGPATH_W) '$(srcdir)/we_plugins.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_plugins.Tpo $(DEPDIR)/kildclient-we_plugins.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_plugins.c' object='kildclient-we_plugins.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_plugins.obj `if test -f 'we_plugins.c'; then $(CYGPATH_W) 'we_plugins.c'; else $(CYGPATH_W) '$(srcdir)/we_plugins.c'; fi` kildclient-we_generic_guied.o: we_generic_guied.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_generic_guied.o -MD -MP -MF $(DEPDIR)/kildclient-we_generic_guied.Tpo -c -o kildclient-we_generic_guied.o `test -f 'we_generic_guied.c' || echo '$(srcdir)/'`we_generic_guied.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_generic_guied.Tpo $(DEPDIR)/kildclient-we_generic_guied.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_generic_guied.c' object='kildclient-we_generic_guied.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_generic_guied.o `test -f 'we_generic_guied.c' || echo '$(srcdir)/'`we_generic_guied.c kildclient-we_generic_guied.obj: we_generic_guied.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_generic_guied.obj -MD -MP -MF $(DEPDIR)/kildclient-we_generic_guied.Tpo -c -o kildclient-we_generic_guied.obj `if test -f 'we_generic_guied.c'; then $(CYGPATH_W) 'we_generic_guied.c'; else $(CYGPATH_W) '$(srcdir)/we_generic_guied.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_generic_guied.Tpo $(DEPDIR)/kildclient-we_generic_guied.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_generic_guied.c' object='kildclient-we_generic_guied.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_generic_guied.obj `if test -f 'we_generic_guied.c'; then $(CYGPATH_W) 'we_generic_guied.c'; else $(CYGPATH_W) '$(srcdir)/we_generic_guied.c'; fi` kildclient-we_triggers.o: we_triggers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_triggers.o -MD -MP -MF $(DEPDIR)/kildclient-we_triggers.Tpo -c -o kildclient-we_triggers.o `test -f 'we_triggers.c' || echo '$(srcdir)/'`we_triggers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_triggers.Tpo $(DEPDIR)/kildclient-we_triggers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_triggers.c' object='kildclient-we_triggers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_triggers.o `test -f 'we_triggers.c' || echo '$(srcdir)/'`we_triggers.c kildclient-we_triggers.obj: we_triggers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_triggers.obj -MD -MP -MF $(DEPDIR)/kildclient-we_triggers.Tpo -c -o kildclient-we_triggers.obj `if test -f 'we_triggers.c'; then $(CYGPATH_W) 'we_triggers.c'; else $(CYGPATH_W) '$(srcdir)/we_triggers.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_triggers.Tpo $(DEPDIR)/kildclient-we_triggers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_triggers.c' object='kildclient-we_triggers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_triggers.obj `if test -f 'we_triggers.c'; then $(CYGPATH_W) 'we_triggers.c'; else $(CYGPATH_W) '$(srcdir)/we_triggers.c'; fi` kildclient-we_aliases.o: we_aliases.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_aliases.o -MD -MP -MF $(DEPDIR)/kildclient-we_aliases.Tpo -c -o kildclient-we_aliases.o `test -f 'we_aliases.c' || echo '$(srcdir)/'`we_aliases.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_aliases.Tpo $(DEPDIR)/kildclient-we_aliases.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_aliases.c' object='kildclient-we_aliases.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_aliases.o `test -f 'we_aliases.c' || echo '$(srcdir)/'`we_aliases.c kildclient-we_aliases.obj: we_aliases.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_aliases.obj -MD -MP -MF $(DEPDIR)/kildclient-we_aliases.Tpo -c -o kildclient-we_aliases.obj `if test -f 'we_aliases.c'; then $(CYGPATH_W) 'we_aliases.c'; else $(CYGPATH_W) '$(srcdir)/we_aliases.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_aliases.Tpo $(DEPDIR)/kildclient-we_aliases.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_aliases.c' object='kildclient-we_aliases.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_aliases.obj `if test -f 'we_aliases.c'; then $(CYGPATH_W) 'we_aliases.c'; else $(CYGPATH_W) '$(srcdir)/we_aliases.c'; fi` kildclient-we_macros.o: we_macros.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_macros.o -MD -MP -MF $(DEPDIR)/kildclient-we_macros.Tpo -c -o kildclient-we_macros.o `test -f 'we_macros.c' || echo '$(srcdir)/'`we_macros.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_macros.Tpo $(DEPDIR)/kildclient-we_macros.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_macros.c' object='kildclient-we_macros.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_macros.o `test -f 'we_macros.c' || echo '$(srcdir)/'`we_macros.c kildclient-we_macros.obj: we_macros.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_macros.obj -MD -MP -MF $(DEPDIR)/kildclient-we_macros.Tpo -c -o kildclient-we_macros.obj `if test -f 'we_macros.c'; then $(CYGPATH_W) 'we_macros.c'; else $(CYGPATH_W) '$(srcdir)/we_macros.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_macros.Tpo $(DEPDIR)/kildclient-we_macros.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_macros.c' object='kildclient-we_macros.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_macros.obj `if test -f 'we_macros.c'; then $(CYGPATH_W) 'we_macros.c'; else $(CYGPATH_W) '$(srcdir)/we_macros.c'; fi` kildclient-we_timers.o: we_timers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_timers.o -MD -MP -MF $(DEPDIR)/kildclient-we_timers.Tpo -c -o kildclient-we_timers.o `test -f 'we_timers.c' || echo '$(srcdir)/'`we_timers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_timers.Tpo $(DEPDIR)/kildclient-we_timers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_timers.c' object='kildclient-we_timers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_timers.o `test -f 'we_timers.c' || echo '$(srcdir)/'`we_timers.c kildclient-we_timers.obj: we_timers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_timers.obj -MD -MP -MF $(DEPDIR)/kildclient-we_timers.Tpo -c -o kildclient-we_timers.obj `if test -f 'we_timers.c'; then $(CYGPATH_W) 'we_timers.c'; else $(CYGPATH_W) '$(srcdir)/we_timers.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_timers.Tpo $(DEPDIR)/kildclient-we_timers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_timers.c' object='kildclient-we_timers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_timers.obj `if test -f 'we_timers.c'; then $(CYGPATH_W) 'we_timers.c'; else $(CYGPATH_W) '$(srcdir)/we_timers.c'; fi` kildclient-we_hooks.o: we_hooks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_hooks.o -MD -MP -MF $(DEPDIR)/kildclient-we_hooks.Tpo -c -o kildclient-we_hooks.o `test -f 'we_hooks.c' || echo '$(srcdir)/'`we_hooks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_hooks.Tpo $(DEPDIR)/kildclient-we_hooks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_hooks.c' object='kildclient-we_hooks.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_hooks.o `test -f 'we_hooks.c' || echo '$(srcdir)/'`we_hooks.c kildclient-we_hooks.obj: we_hooks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_hooks.obj -MD -MP -MF $(DEPDIR)/kildclient-we_hooks.Tpo -c -o kildclient-we_hooks.obj `if test -f 'we_hooks.c'; then $(CYGPATH_W) 'we_hooks.c'; else $(CYGPATH_W) '$(srcdir)/we_hooks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_hooks.Tpo $(DEPDIR)/kildclient-we_hooks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_hooks.c' object='kildclient-we_hooks.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_hooks.obj `if test -f 'we_hooks.c'; then $(CYGPATH_W) 'we_hooks.c'; else $(CYGPATH_W) '$(srcdir)/we_hooks.c'; fi` kildclient-we_vars.o: we_vars.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_vars.o -MD -MP -MF $(DEPDIR)/kildclient-we_vars.Tpo -c -o kildclient-we_vars.o `test -f 'we_vars.c' || echo '$(srcdir)/'`we_vars.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_vars.Tpo $(DEPDIR)/kildclient-we_vars.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_vars.c' object='kildclient-we_vars.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_vars.o `test -f 'we_vars.c' || echo '$(srcdir)/'`we_vars.c kildclient-we_vars.obj: we_vars.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_vars.obj -MD -MP -MF $(DEPDIR)/kildclient-we_vars.Tpo -c -o kildclient-we_vars.obj `if test -f 'we_vars.c'; then $(CYGPATH_W) 'we_vars.c'; else $(CYGPATH_W) '$(srcdir)/we_vars.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_vars.Tpo $(DEPDIR)/kildclient-we_vars.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_vars.c' object='kildclient-we_vars.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_vars.obj `if test -f 'we_vars.c'; then $(CYGPATH_W) 'we_vars.c'; else $(CYGPATH_W) '$(srcdir)/we_vars.c'; fi` kildclient-we_protocols.o: we_protocols.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_protocols.o -MD -MP -MF $(DEPDIR)/kildclient-we_protocols.Tpo -c -o kildclient-we_protocols.o `test -f 'we_protocols.c' || echo '$(srcdir)/'`we_protocols.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_protocols.Tpo $(DEPDIR)/kildclient-we_protocols.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_protocols.c' object='kildclient-we_protocols.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_protocols.o `test -f 'we_protocols.c' || echo '$(srcdir)/'`we_protocols.c kildclient-we_protocols.obj: we_protocols.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_protocols.obj -MD -MP -MF $(DEPDIR)/kildclient-we_protocols.Tpo -c -o kildclient-we_protocols.obj `if test -f 'we_protocols.c'; then $(CYGPATH_W) 'we_protocols.c'; else $(CYGPATH_W) '$(srcdir)/we_protocols.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_protocols.Tpo $(DEPDIR)/kildclient-we_protocols.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_protocols.c' object='kildclient-we_protocols.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_protocols.obj `if test -f 'we_protocols.c'; then $(CYGPATH_W) 'we_protocols.c'; else $(CYGPATH_W) '$(srcdir)/we_protocols.c'; fi` kildclient-we_advanced.o: we_advanced.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_advanced.o -MD -MP -MF $(DEPDIR)/kildclient-we_advanced.Tpo -c -o kildclient-we_advanced.o `test -f 'we_advanced.c' || echo '$(srcdir)/'`we_advanced.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_advanced.Tpo $(DEPDIR)/kildclient-we_advanced.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_advanced.c' object='kildclient-we_advanced.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_advanced.o `test -f 'we_advanced.c' || echo '$(srcdir)/'`we_advanced.c kildclient-we_advanced.obj: we_advanced.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-we_advanced.obj -MD -MP -MF $(DEPDIR)/kildclient-we_advanced.Tpo -c -o kildclient-we_advanced.obj `if test -f 'we_advanced.c'; then $(CYGPATH_W) 'we_advanced.c'; else $(CYGPATH_W) '$(srcdir)/we_advanced.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-we_advanced.Tpo $(DEPDIR)/kildclient-we_advanced.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='we_advanced.c' object='kildclient-we_advanced.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-we_advanced.obj `if test -f 'we_advanced.c'; then $(CYGPATH_W) 'we_advanced.c'; else $(CYGPATH_W) '$(srcdir)/we_advanced.c'; fi` kildclient-prefs.o: prefs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-prefs.o -MD -MP -MF $(DEPDIR)/kildclient-prefs.Tpo -c -o kildclient-prefs.o `test -f 'prefs.c' || echo '$(srcdir)/'`prefs.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-prefs.Tpo $(DEPDIR)/kildclient-prefs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='prefs.c' object='kildclient-prefs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-prefs.o `test -f 'prefs.c' || echo '$(srcdir)/'`prefs.c kildclient-prefs.obj: prefs.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-prefs.obj -MD -MP -MF $(DEPDIR)/kildclient-prefs.Tpo -c -o kildclient-prefs.obj `if test -f 'prefs.c'; then $(CYGPATH_W) 'prefs.c'; else $(CYGPATH_W) '$(srcdir)/prefs.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-prefs.Tpo $(DEPDIR)/kildclient-prefs.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='prefs.c' object='kildclient-prefs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-prefs.obj `if test -f 'prefs.c'; then $(CYGPATH_W) 'prefs.c'; else $(CYGPATH_W) '$(srcdir)/prefs.c'; fi` kildclient-parser.o: parser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-parser.o -MD -MP -MF $(DEPDIR)/kildclient-parser.Tpo -c -o kildclient-parser.o `test -f 'parser.c' || echo '$(srcdir)/'`parser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-parser.Tpo $(DEPDIR)/kildclient-parser.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parser.c' object='kildclient-parser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-parser.o `test -f 'parser.c' || echo '$(srcdir)/'`parser.c kildclient-parser.obj: parser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-parser.obj -MD -MP -MF $(DEPDIR)/kildclient-parser.Tpo -c -o kildclient-parser.obj `if test -f 'parser.c'; then $(CYGPATH_W) 'parser.c'; else $(CYGPATH_W) '$(srcdir)/parser.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-parser.Tpo $(DEPDIR)/kildclient-parser.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parser.c' object='kildclient-parser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-parser.obj `if test -f 'parser.c'; then $(CYGPATH_W) 'parser.c'; else $(CYGPATH_W) '$(srcdir)/parser.c'; fi` kildclient-triggers.o: triggers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-triggers.o -MD -MP -MF $(DEPDIR)/kildclient-triggers.Tpo -c -o kildclient-triggers.o `test -f 'triggers.c' || echo '$(srcdir)/'`triggers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-triggers.Tpo $(DEPDIR)/kildclient-triggers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='triggers.c' object='kildclient-triggers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-triggers.o `test -f 'triggers.c' || echo '$(srcdir)/'`triggers.c kildclient-triggers.obj: triggers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-triggers.obj -MD -MP -MF $(DEPDIR)/kildclient-triggers.Tpo -c -o kildclient-triggers.obj `if test -f 'triggers.c'; then $(CYGPATH_W) 'triggers.c'; else $(CYGPATH_W) '$(srcdir)/triggers.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-triggers.Tpo $(DEPDIR)/kildclient-triggers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='triggers.c' object='kildclient-triggers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-triggers.obj `if test -f 'triggers.c'; then $(CYGPATH_W) 'triggers.c'; else $(CYGPATH_W) '$(srcdir)/triggers.c'; fi` kildclient-aliases.o: aliases.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-aliases.o -MD -MP -MF $(DEPDIR)/kildclient-aliases.Tpo -c -o kildclient-aliases.o `test -f 'aliases.c' || echo '$(srcdir)/'`aliases.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-aliases.Tpo $(DEPDIR)/kildclient-aliases.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='aliases.c' object='kildclient-aliases.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-aliases.o `test -f 'aliases.c' || echo '$(srcdir)/'`aliases.c kildclient-aliases.obj: aliases.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-aliases.obj -MD -MP -MF $(DEPDIR)/kildclient-aliases.Tpo -c -o kildclient-aliases.obj `if test -f 'aliases.c'; then $(CYGPATH_W) 'aliases.c'; else $(CYGPATH_W) '$(srcdir)/aliases.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-aliases.Tpo $(DEPDIR)/kildclient-aliases.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='aliases.c' object='kildclient-aliases.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-aliases.obj `if test -f 'aliases.c'; then $(CYGPATH_W) 'aliases.c'; else $(CYGPATH_W) '$(srcdir)/aliases.c'; fi` kildclient-macros.o: macros.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-macros.o -MD -MP -MF $(DEPDIR)/kildclient-macros.Tpo -c -o kildclient-macros.o `test -f 'macros.c' || echo '$(srcdir)/'`macros.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-macros.Tpo $(DEPDIR)/kildclient-macros.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='macros.c' object='kildclient-macros.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-macros.o `test -f 'macros.c' || echo '$(srcdir)/'`macros.c kildclient-macros.obj: macros.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-macros.obj -MD -MP -MF $(DEPDIR)/kildclient-macros.Tpo -c -o kildclient-macros.obj `if test -f 'macros.c'; then $(CYGPATH_W) 'macros.c'; else $(CYGPATH_W) '$(srcdir)/macros.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-macros.Tpo $(DEPDIR)/kildclient-macros.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='macros.c' object='kildclient-macros.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-macros.obj `if test -f 'macros.c'; then $(CYGPATH_W) 'macros.c'; else $(CYGPATH_W) '$(srcdir)/macros.c'; fi` kildclient-timers.o: timers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-timers.o -MD -MP -MF $(DEPDIR)/kildclient-timers.Tpo -c -o kildclient-timers.o `test -f 'timers.c' || echo '$(srcdir)/'`timers.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-timers.Tpo $(DEPDIR)/kildclient-timers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='timers.c' object='kildclient-timers.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-timers.o `test -f 'timers.c' || echo '$(srcdir)/'`timers.c kildclient-timers.obj: timers.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-timers.obj -MD -MP -MF $(DEPDIR)/kildclient-timers.Tpo -c -o kildclient-timers.obj `if test -f 'timers.c'; then $(CYGPATH_W) 'timers.c'; else $(CYGPATH_W) '$(srcdir)/timers.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-timers.Tpo $(DEPDIR)/kildclient-timers.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='timers.c' object='kildclient-timers.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-timers.obj `if test -f 'timers.c'; then $(CYGPATH_W) 'timers.c'; else $(CYGPATH_W) '$(srcdir)/timers.c'; fi` kildclient-permanentvariables.o: permanentvariables.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-permanentvariables.o -MD -MP -MF $(DEPDIR)/kildclient-permanentvariables.Tpo -c -o kildclient-permanentvariables.o `test -f 'permanentvariables.c' || echo '$(srcdir)/'`permanentvariables.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-permanentvariables.Tpo $(DEPDIR)/kildclient-permanentvariables.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='permanentvariables.c' object='kildclient-permanentvariables.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-permanentvariables.o `test -f 'permanentvariables.c' || echo '$(srcdir)/'`permanentvariables.c kildclient-permanentvariables.obj: permanentvariables.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-permanentvariables.obj -MD -MP -MF $(DEPDIR)/kildclient-permanentvariables.Tpo -c -o kildclient-permanentvariables.obj `if test -f 'permanentvariables.c'; then $(CYGPATH_W) 'permanentvariables.c'; else $(CYGPATH_W) '$(srcdir)/permanentvariables.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-permanentvariables.Tpo $(DEPDIR)/kildclient-permanentvariables.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='permanentvariables.c' object='kildclient-permanentvariables.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-permanentvariables.obj `if test -f 'permanentvariables.c'; then $(CYGPATH_W) 'permanentvariables.c'; else $(CYGPATH_W) '$(srcdir)/permanentvariables.c'; fi` kildclient-hooks.o: hooks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-hooks.o -MD -MP -MF $(DEPDIR)/kildclient-hooks.Tpo -c -o kildclient-hooks.o `test -f 'hooks.c' || echo '$(srcdir)/'`hooks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-hooks.Tpo $(DEPDIR)/kildclient-hooks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hooks.c' object='kildclient-hooks.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-hooks.o `test -f 'hooks.c' || echo '$(srcdir)/'`hooks.c kildclient-hooks.obj: hooks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-hooks.obj -MD -MP -MF $(DEPDIR)/kildclient-hooks.Tpo -c -o kildclient-hooks.obj `if test -f 'hooks.c'; then $(CYGPATH_W) 'hooks.c'; else $(CYGPATH_W) '$(srcdir)/hooks.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-hooks.Tpo $(DEPDIR)/kildclient-hooks.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hooks.c' object='kildclient-hooks.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-hooks.obj `if test -f 'hooks.c'; then $(CYGPATH_W) 'hooks.c'; else $(CYGPATH_W) '$(srcdir)/hooks.c'; fi` kildclient-log.o: log.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-log.o -MD -MP -MF $(DEPDIR)/kildclient-log.Tpo -c -o kildclient-log.o `test -f 'log.c' || echo '$(srcdir)/'`log.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-log.Tpo $(DEPDIR)/kildclient-log.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log.c' object='kildclient-log.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-log.o `test -f 'log.c' || echo '$(srcdir)/'`log.c kildclient-log.obj: log.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-log.obj -MD -MP -MF $(DEPDIR)/kildclient-log.Tpo -c -o kildclient-log.obj `if test -f 'log.c'; then $(CYGPATH_W) 'log.c'; else $(CYGPATH_W) '$(srcdir)/log.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-log.Tpo $(DEPDIR)/kildclient-log.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log.c' object='kildclient-log.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-log.obj `if test -f 'log.c'; then $(CYGPATH_W) 'log.c'; else $(CYGPATH_W) '$(srcdir)/log.c'; fi` kildclient-plugins.o: plugins.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-plugins.o -MD -MP -MF $(DEPDIR)/kildclient-plugins.Tpo -c -o kildclient-plugins.o `test -f 'plugins.c' || echo '$(srcdir)/'`plugins.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-plugins.Tpo $(DEPDIR)/kildclient-plugins.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugins.c' object='kildclient-plugins.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-plugins.o `test -f 'plugins.c' || echo '$(srcdir)/'`plugins.c kildclient-plugins.obj: plugins.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-plugins.obj -MD -MP -MF $(DEPDIR)/kildclient-plugins.Tpo -c -o kildclient-plugins.obj `if test -f 'plugins.c'; then $(CYGPATH_W) 'plugins.c'; else $(CYGPATH_W) '$(srcdir)/plugins.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-plugins.Tpo $(DEPDIR)/kildclient-plugins.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugins.c' object='kildclient-plugins.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-plugins.obj `if test -f 'plugins.c'; then $(CYGPATH_W) 'plugins.c'; else $(CYGPATH_W) '$(srcdir)/plugins.c'; fi` kildclient-multilinesend.o: multilinesend.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-multilinesend.o -MD -MP -MF $(DEPDIR)/kildclient-multilinesend.Tpo -c -o kildclient-multilinesend.o `test -f 'multilinesend.c' || echo '$(srcdir)/'`multilinesend.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-multilinesend.Tpo $(DEPDIR)/kildclient-multilinesend.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='multilinesend.c' object='kildclient-multilinesend.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-multilinesend.o `test -f 'multilinesend.c' || echo '$(srcdir)/'`multilinesend.c kildclient-multilinesend.obj: multilinesend.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-multilinesend.obj -MD -MP -MF $(DEPDIR)/kildclient-multilinesend.Tpo -c -o kildclient-multilinesend.obj `if test -f 'multilinesend.c'; then $(CYGPATH_W) 'multilinesend.c'; else $(CYGPATH_W) '$(srcdir)/multilinesend.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-multilinesend.Tpo $(DEPDIR)/kildclient-multilinesend.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='multilinesend.c' object='kildclient-multilinesend.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-multilinesend.obj `if test -f 'multilinesend.c'; then $(CYGPATH_W) 'multilinesend.c'; else $(CYGPATH_W) '$(srcdir)/multilinesend.c'; fi` kildclient-cmdhistory.o: cmdhistory.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-cmdhistory.o -MD -MP -MF $(DEPDIR)/kildclient-cmdhistory.Tpo -c -o kildclient-cmdhistory.o `test -f 'cmdhistory.c' || echo '$(srcdir)/'`cmdhistory.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-cmdhistory.Tpo $(DEPDIR)/kildclient-cmdhistory.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmdhistory.c' object='kildclient-cmdhistory.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-cmdhistory.o `test -f 'cmdhistory.c' || echo '$(srcdir)/'`cmdhistory.c kildclient-cmdhistory.obj: cmdhistory.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-cmdhistory.obj -MD -MP -MF $(DEPDIR)/kildclient-cmdhistory.Tpo -c -o kildclient-cmdhistory.obj `if test -f 'cmdhistory.c'; then $(CYGPATH_W) 'cmdhistory.c'; else $(CYGPATH_W) '$(srcdir)/cmdhistory.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-cmdhistory.Tpo $(DEPDIR)/kildclient-cmdhistory.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cmdhistory.c' object='kildclient-cmdhistory.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-cmdhistory.obj `if test -f 'cmdhistory.c'; then $(CYGPATH_W) 'cmdhistory.c'; else $(CYGPATH_W) '$(srcdir)/cmdhistory.c'; fi` kildclient-sound.o: sound.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-sound.o -MD -MP -MF $(DEPDIR)/kildclient-sound.Tpo -c -o kildclient-sound.o `test -f 'sound.c' || echo '$(srcdir)/'`sound.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-sound.Tpo $(DEPDIR)/kildclient-sound.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sound.c' object='kildclient-sound.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-sound.o `test -f 'sound.c' || echo '$(srcdir)/'`sound.c kildclient-sound.obj: sound.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-sound.obj -MD -MP -MF $(DEPDIR)/kildclient-sound.Tpo -c -o kildclient-sound.obj `if test -f 'sound.c'; then $(CYGPATH_W) 'sound.c'; else $(CYGPATH_W) '$(srcdir)/sound.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-sound.Tpo $(DEPDIR)/kildclient-sound.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sound.c' object='kildclient-sound.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-sound.obj `if test -f 'sound.c'; then $(CYGPATH_W) 'sound.c'; else $(CYGPATH_W) '$(srcdir)/sound.c'; fi` kildclient-util.o: util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-util.o -MD -MP -MF $(DEPDIR)/kildclient-util.Tpo -c -o kildclient-util.o `test -f 'util.c' || echo '$(srcdir)/'`util.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-util.Tpo $(DEPDIR)/kildclient-util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util.c' object='kildclient-util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-util.o `test -f 'util.c' || echo '$(srcdir)/'`util.c kildclient-util.obj: util.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-util.obj -MD -MP -MF $(DEPDIR)/kildclient-util.Tpo -c -o kildclient-util.obj `if test -f 'util.c'; then $(CYGPATH_W) 'util.c'; else $(CYGPATH_W) '$(srcdir)/util.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-util.Tpo $(DEPDIR)/kildclient-util.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='util.c' object='kildclient-util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-util.obj `if test -f 'util.c'; then $(CYGPATH_W) 'util.c'; else $(CYGPATH_W) '$(srcdir)/util.c'; fi` kildclient-perlscript.o: perlscript.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-perlscript.o -MD -MP -MF $(DEPDIR)/kildclient-perlscript.Tpo -c -o kildclient-perlscript.o `test -f 'perlscript.c' || echo '$(srcdir)/'`perlscript.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-perlscript.Tpo $(DEPDIR)/kildclient-perlscript.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perlscript.c' object='kildclient-perlscript.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-perlscript.o `test -f 'perlscript.c' || echo '$(srcdir)/'`perlscript.c kildclient-perlscript.obj: perlscript.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-perlscript.obj -MD -MP -MF $(DEPDIR)/kildclient-perlscript.Tpo -c -o kildclient-perlscript.obj `if test -f 'perlscript.c'; then $(CYGPATH_W) 'perlscript.c'; else $(CYGPATH_W) '$(srcdir)/perlscript.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-perlscript.Tpo $(DEPDIR)/kildclient-perlscript.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='perlscript.c' object='kildclient-perlscript.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-perlscript.obj `if test -f 'perlscript.c'; then $(CYGPATH_W) 'perlscript.c'; else $(CYGPATH_W) '$(srcdir)/perlscript.c'; fi` kildclient-kcwin.o: kcwin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-kcwin.o -MD -MP -MF $(DEPDIR)/kildclient-kcwin.Tpo -c -o kildclient-kcwin.o `test -f 'kcwin.c' || echo '$(srcdir)/'`kcwin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-kcwin.Tpo $(DEPDIR)/kildclient-kcwin.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='kcwin.c' object='kildclient-kcwin.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-kcwin.o `test -f 'kcwin.c' || echo '$(srcdir)/'`kcwin.c kildclient-kcwin.obj: kcwin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-kcwin.obj -MD -MP -MF $(DEPDIR)/kildclient-kcwin.Tpo -c -o kildclient-kcwin.obj `if test -f 'kcwin.c'; then $(CYGPATH_W) 'kcwin.c'; else $(CYGPATH_W) '$(srcdir)/kcwin.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-kcwin.Tpo $(DEPDIR)/kildclient-kcwin.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='kcwin.c' object='kildclient-kcwin.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-kcwin.obj `if test -f 'kcwin.c'; then $(CYGPATH_W) 'kcwin.c'; else $(CYGPATH_W) '$(srcdir)/kcwin.c'; fi` kildclient-simocombobox.o: simocombobox.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-simocombobox.o -MD -MP -MF $(DEPDIR)/kildclient-simocombobox.Tpo -c -o kildclient-simocombobox.o `test -f 'simocombobox.c' || echo '$(srcdir)/'`simocombobox.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-simocombobox.Tpo $(DEPDIR)/kildclient-simocombobox.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simocombobox.c' object='kildclient-simocombobox.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-simocombobox.o `test -f 'simocombobox.c' || echo '$(srcdir)/'`simocombobox.c kildclient-simocombobox.obj: simocombobox.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-simocombobox.obj -MD -MP -MF $(DEPDIR)/kildclient-simocombobox.Tpo -c -o kildclient-simocombobox.obj `if test -f 'simocombobox.c'; then $(CYGPATH_W) 'simocombobox.c'; else $(CYGPATH_W) '$(srcdir)/simocombobox.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-simocombobox.Tpo $(DEPDIR)/kildclient-simocombobox.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simocombobox.c' object='kildclient-simocombobox.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-simocombobox.obj `if test -f 'simocombobox.c'; then $(CYGPATH_W) 'simocombobox.c'; else $(CYGPATH_W) '$(srcdir)/simocombobox.c'; fi` kildclient-kcircularqueue.o: kcircularqueue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-kcircularqueue.o -MD -MP -MF $(DEPDIR)/kildclient-kcircularqueue.Tpo -c -o kildclient-kcircularqueue.o `test -f 'kcircularqueue.c' || echo '$(srcdir)/'`kcircularqueue.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-kcircularqueue.Tpo $(DEPDIR)/kildclient-kcircularqueue.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='kcircularqueue.c' object='kildclient-kcircularqueue.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-kcircularqueue.o `test -f 'kcircularqueue.c' || echo '$(srcdir)/'`kcircularqueue.c kildclient-kcircularqueue.obj: kcircularqueue.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT kildclient-kcircularqueue.obj -MD -MP -MF $(DEPDIR)/kildclient-kcircularqueue.Tpo -c -o kildclient-kcircularqueue.obj `if test -f 'kcircularqueue.c'; then $(CYGPATH_W) 'kcircularqueue.c'; else $(CYGPATH_W) '$(srcdir)/kcircularqueue.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kildclient-kcircularqueue.Tpo $(DEPDIR)/kildclient-kcircularqueue.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='kcircularqueue.c' object='kildclient-kcircularqueue.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(kildclient_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o kildclient-kcircularqueue.obj `if test -f 'kcircularqueue.c'; then $(CYGPATH_W) 'kcircularqueue.c'; else $(CYGPATH_W) '$(srcdir)/kcircularqueue.c'; fi` install-pkgdataDATA: $(pkgdata_DATA) @$(NORMAL_INSTALL) @list='$(pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(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|^.*/||'`; \ dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic 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 TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ 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 tags-am uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-pkgdataDATA .PRECIOUS: Makefile .rc.o: $(WINDRES) -i $< -o $@ $(RESFLAGS) # 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-3.2.0/src/ansiparse_thread.c0000644000175000017500000006736613217707706015062 00000000000000/* * Copyright (C) 2004-2017 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" /************************* * 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 process_ansiparse_operation(AnsiParseOperation *operation, World *world); static void queue_operation_from_gui(WorldGUI *gui, MainThreadOperation *operation); static void clear_pending_line(World *world); static void parse_and_append_ansi_string(WorldGUI *gui, const gchar *string, gsize len); static void apply_highlights_and_move_mark(World *world, GSList *highlights); static void parse_and_append_echoed_string(WorldGUI *gui, const gchar *str, gsize len); static void apply_highlights(World *world, GSList *highlights); static void finalize_line(World *world); static void insert_text(WorldGUI *gui, const guchar *text, gsize len, MainThreadOperationType where, MainThreadOperationFunction operation_func); static void parse_ansi_sequence(WorldGUI *gui); static void insert_with_possible_urls(WorldGUI *gui, const guchar *text, gsize len, MainThreadOperationType where, MainThreadOperationFunction operation_func); static void reset_ansi_state(TAState *state); static gchar *convert_vt100linedraw_string(WorldGUI *gui, const guchar *text, gsize len); static GtkTextTag *get_tag_for_xterm256_color(WorldGUI *gui, gint x256idx, gint code_used); static GtkTextTag *get_tag_for_color(WorldGUI *gui, guint8 r, guint8 g, guint8 b, gboolean is_back); gpointer ansiparse_thread(gpointer data) { World *world = (World *) data; g_async_queue_ref(world->ansiparse_operations); g_async_queue_ref(world->mainthread_operations); while (1) { AnsiParseOperation *operation = (AnsiParseOperation *) g_async_queue_pop(world->ansiparse_operations); if (world->to_be_destructed) { g_async_queue_unref(world->ansiparse_operations); g_async_queue_unref(world->mainthread_operations); free_ansiparse_operation(operation); return NULL; } process_ansiparse_operation(operation, world); free_ansiparse_operation(operation); } } void free_ansiparse_operation(gpointer data) { AnsiParseOperation *operation = (AnsiParseOperation *) data; switch (operation->action) { case APPEND_LINE: case APPEND_ECHOED_LINE: g_free(operation->line.line); break; case APPLY_HIGHLIGHTS_AND_MOVE_MARK: g_slist_free(operation->highlights); break; default: /* Nothing special to free */ break; } g_free(operation); } static void process_ansiparse_operation(AnsiParseOperation *operation, World *world) { switch (operation->action) { case CLEAR_PENDING_LINE_ANSI: clear_pending_line(world); break; case APPEND_LINE: parse_and_append_ansi_string(world->gui, operation->line.line, operation->line.line_len); break; case APPEND_ECHOED_LINE: parse_and_append_echoed_string(world->gui, operation->line.line, operation->line.line_len); break; case APPLY_HIGHLIGHTS_AND_MOVE_MARK: apply_highlights_and_move_mark(world, operation->highlights); break; case FINALIZE_LINE: finalize_line(world); break; case DUMMY_ANSIPARSE: break; } } static void queue_operation_from_gui(WorldGUI *gui, MainThreadOperation *operation) { queue_mainthread_operation(gui->world, operation); } static void clear_pending_line(World *world) { MainThreadOperation *operation = g_new(MainThreadOperation, 1); operation->action = CLEAR_PENDING_LINE; queue_mainthread_operation(world, operation); /* 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->ansi_parse.ansifsm_state = ANSIFSM_DATA; world->gui->ansi_parse.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->saved_ta_state; } static void parse_and_append_ansi_string(WorldGUI *gui, const gchar *string, gsize len) { insert_ansi_string(gui, string, len, INSERT_AT_END, queue_operation_from_gui); } static void parse_and_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). */ AnsiParseState saved_ansi_parse; TAState saved_state; guint printed; guint to_print; saved_ansi_parse = gui->ansi_parse; saved_state = gui->ta_state; gui->ansi_parse.ansifsm_state = ANSIFSM_DATA; gui->ansi_parse.ansiseq_pos = 0; /* Due to static buffers, only MAX_BUFFER chars can be printed at a time. */ printed = 0; while (printed < len) { to_print = (len - printed) > MAX_BUFFER ? MAX_BUFFER : (len - printed); insert_ansi_string(gui, str + printed, to_print, INSERT_AT_MARK, queue_operation_from_gui); printed += to_print; } gui->ansi_parse = saved_ansi_parse; gui->ta_state = saved_state; } static void apply_highlights_and_move_mark(World *world, GSList *highlights) { apply_highlights(world, highlights); /* Move mark */ MainThreadOperation *operation = g_new(MainThreadOperation, 1); operation->action = MOVE_LINESTART_MARK; queue_mainthread_operation(world, operation); /* Save color at end of line */ world->gui->saved_ta_state = world->gui->ta_state; } static void apply_highlights(World *world, GSList *highlights) { GSList *cur_highlight; for (cur_highlight = highlights; cur_highlight; cur_highlight = cur_highlight->next) { MainThreadOperation *operation = g_new(MainThreadOperation, 1); operation->action = APPLY_HIGHLIGHT; operation->highlight = cur_highlight->data; queue_mainthread_operation(world, operation); } } static void finalize_line(World *world) { g_timer_start(world->last_data_written); } void insert_ansi_string(WorldGUI *gui, const gchar *str, gsize len, MainThreadOperationType where, MainThreadOperationFunction operation_func) { /* * Interprets str, possibly with ANSI color codes, and queues * operations that will insert it in the buffer, using where as the * operation (INSERT_AT_END or INSERT_AT_MARK). */ guchar text_buffer[MAX_BUFFER]; gint text_buffer_pos; guint original_pos; MainThreadOperation *operation; text_buffer_pos = 0; original_pos = 0; while (str[original_pos] && original_pos < len) { switch (gui->ansi_parse.ansifsm_state) { case ANSIFSM_DATA: if (str[original_pos] == ANSI_ESC) { gui->ansi_parse.ansifsm_state = ANSIFSM_ESC; } else { text_buffer[text_buffer_pos++] = str[original_pos]; } break; case ANSIFSM_ESC: if (str[original_pos] == '[') { gui->ansi_parse.ansifsm_state = ANSIFSM_ANSISEQ; if (text_buffer_pos) { insert_text(gui, text_buffer, text_buffer_pos, where, operation_func); text_buffer_pos = 0; } } else if (str[original_pos] == '(') { gui->ansi_parse.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->ansi_parse.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->ansi_parse.ansiseq_pos < MAX_BUFFER) { gui->ansi_parse.ansiseq_buffer[gui->ansi_parse.ansiseq_pos++] = str[original_pos]; } else { gui->ansi_parse.ansifsm_state = ANSIFSM_DATA; if (str[original_pos] == 'm') { parse_ansi_sequence(gui); } else { /* Not recognized, ignored and cleared. */ /* FIXME: Copy it back, being careful with buffer size. */ gui->ansi_parse.ansiseq_pos = 0; } } break; case ANSIFSM_ESCLEFTPAR: if (str[original_pos] == '0' || str[original_pos] == 'B') { gui->ansi_parse.ansifsm_state = ANSIFSM_DATA; if (text_buffer_pos) { insert_text(gui, text_buffer, text_buffer_pos, where, operation_func); text_buffer_pos = 0; } gui->ansi_parse.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->ansi_parse.ansifsm_state = ANSIFSM_DATA; } break; } ++original_pos; } /* Add any remaining text */ if (text_buffer_pos) { insert_text(gui, text_buffer, text_buffer_pos, where, operation_func); text_buffer_pos = 0; } /* Notify that text has been added. */ if (gui->world) { operation = g_new(MainThreadOperation, 1); operation->action = TEXT_ADDED; operation_func(gui, operation); } } static void insert_text(WorldGUI *gui, const guchar *text, gsize len, MainThreadOperationType where, MainThreadOperationFunction operation_func) { if (gui->ansi_parse.linedraw) { MainThreadOperation *operation = g_new(MainThreadOperation, 1); operation->action = where; operation->text_insert.text = convert_vt100linedraw_string(gui, text, len); operation->text_insert.use_ta = TRUE; operation->text_insert.ta_state = gui->ta_state; operation->text_insert.extra_tag = NULL; operation_func(gui, operation); } else { insert_with_possible_urls(gui, text, len, where, operation_func); } } static void insert_with_possible_urls(WorldGUI *gui, const guchar *text, gsize len, MainThreadOperationType where, MainThreadOperationFunction operation_func) { static regex_t regex; static gsize re_compiled = 0; guchar ctext[MAX_BUFFER + 1]; regmatch_t match; guint search_start; if (g_once_init_enter(&re_compiled)) { regcomp(®ex, "(((https?|ftp)://)|www\\.)[-A-Za-z0-9\\./?=&+%:#_~@,]*[-A-Za-z0-9\\/?=&+%:#_~]", REG_EXTENDED | REG_ICASE); g_once_init_leave(&re_compiled, 1); } /* 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) { MainThreadOperation *operation = g_new(MainThreadOperation, 1); /* Text before the URL */ operation->action = where; operation->text_insert.text = g_strndup((gchar *) (text + search_start), match.rm_so); operation->text_insert.use_ta = TRUE; operation->text_insert.ta_state = gui->ta_state; operation->text_insert.extra_tag = NULL; operation_func(gui, operation); /* The URL */ operation = g_new(MainThreadOperation, 1); operation->action = where; operation->text_insert.text = g_strndup((gchar *) (text + search_start + match.rm_so), match.rm_eo - match.rm_so); operation->text_insert.use_ta = TRUE; operation->text_insert.ta_state = gui->ta_state; operation->text_insert.extra_tag = gui->txttag_url; operation_func(gui, operation); /* Continue looking */ search_start += match.rm_eo; } else { MainThreadOperation *operation = g_new(MainThreadOperation, 1); /* Text after the URL */ operation->action = where; operation->text_insert.text = g_strndup((gchar *) (text + search_start), len - search_start); operation->text_insert.use_ta = TRUE; operation->text_insert.ta_state = gui->ta_state; operation->text_insert.extra_tag = NULL; operation_func(gui, operation); break; } } } static void parse_ansi_sequence(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->ansi_parse.ansiseq_pos == 0) { reset_ansi_state(&gui->ta_state); return; } /* Add NULL terminator. */ gui->ansi_parse.ansiseq_buffer[gui->ansi_parse.ansiseq_pos] = 0; sequences = g_strsplit_set((gchar *) gui->ansi_parse.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->ansi_parse.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 gchar * convert_vt100linedraw_string(WorldGUI *gui, const guchar *text, gsize len) { GString *result; guint i; // The longest sequences are three bytes; result = g_string_sized_new(len * 3 + 1); worldgui_determine_supported_chars(gui); for (i = 0; i < len; ++i) { if (text[i] < '_' || text[i] > '~') { g_string_append_c(result, text[i]); } else { switch (text[i]) { case '_': /* A blank */ g_string_append_c(result, ' '); break; /* Geometric Shapes */ case '`': g_string_append(result, gui->ta.sup_geom_shapes ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); break; /* Block elements */ case 'a': g_string_append(result, gui->ta.sup_block ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); break; /* Control Pictures */ case 'b': case 'c': case 'd': case 'e': case 'h': case 'i': g_string_append(result, gui->ta.sup_control ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); break; /* Latin-1 Supplement */ case 'f': case 'g': case '}': case '~': g_string_append(result, gui->ta.sup_l1_supplement ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); 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': g_string_append(result, gui->ta.sup_box_drawing ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); break; /* Miscellaneous Technical */ case 'o': case 'p': case 'r': case 's': g_string_append(result, gui->ta.sup_misc_tech ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); break; /* Mathematical Operators */ case 'y': case 'z': case '|': g_string_append(result, gui->ta.sup_math ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); break; /* Greek and Coptic */ case '{': g_string_append(result, gui->ta.sup_greek ? linedrawingchars[text[i] - '_' - 1] : replacingchars[text[i] - '_' - 1]); break; } } } gchar *converted_string = result->str; g_string_free(result, FALSE); return converted_string; } 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); } static GtkTextTag * get_tag_for_color(WorldGUI *gui, guint8 r, guint8 g, guint8 b, gboolean is_back) { gint rgb; GtkTextTag *tag; GHashTable *hash; GdkRGBA 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.alpha = 1.0; color.red = r / 255.0; color.green = g / 255.0; color.blue = b / 255.0; if (!is_back) { tag = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "foreground-rgba", &color, NULL); } else { tag = gtk_text_buffer_create_tag(gui->txtBuffer, NULL, "background-rgba", &color, NULL); } gtk_text_tag_set_priority(tag, 0); g_hash_table_insert(hash, GINT_TO_POINTER(rgb), tag); return tag; } kildclient-3.2.0/src/aliases.c0000644000175000017500000001466213217707706013156 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.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; } GRAB_PERL(world); aliasptr = world->aliases; i = 0; while (aliasptr) { alias = (Alias *) aliasptr->data; if (alias->enabled && (result = perl_substitute(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); } RELEASE_PERL(world); return result; } aliasptr = aliasptr->next; ++i; } RELEASE_PERL(world); 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) { GRAB_PERL(world); } 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); if (world->perl_interpreter) { RELEASE_PERL(world); } } 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; GRAB_PERL(world); 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(alias->pattern, alias->ignore_case); } aliasptr = aliasptr->next; } RELEASE_PERL(world); } 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-3.2.0/src/macros.c0000644000175000017500000001160213217707706013010 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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); 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-3.2.0/src/permanentvariables.c0000644000175000017500000000714713217707706015417 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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(variables_file); g_free(variables_file); } } void save_permanent_variables(World *world) { 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); GRAB_PERL(world); iter = world->permanent_variables; while (iter) { varname = (char *) iter->data; if (varname[0] == '$') { command = g_strdup_printf("$__serialized = Data::Dumper->Dump([%s], ['%s']);", varname, varname+1); } else { command = g_strdup_printf("$__serialized = Data::Dumper->Dump([\\%s], ['*%s']);", varname, varname+1); } eval_pv(command, TRUE); retval = get_sv("__serialized", FALSE); g_string_append(file_contents, SvPV_nolen(retval)); g_free(command); iter = iter->next; } RELEASE_PERL(world); if (!g_file_set_contents(variables_file, file_contents->str, file_contents->len, &error)) { kc_error_dialog(GTK_WINDOW(wndMain), _("Could not open file '%s': %s\n" "Variables were not saved."), variables_file, error->message); } g_free(variables_file); g_string_free(file_contents, TRUE); } 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-3.2.0/src/triggers.c0000644000175000017500000002547313217707706013365 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" /*********************************************** * Function prototypes - Test trigger function * ***********************************************/ static GtkWidget *create_test_triggers_dialog(GtkWindow *parent, World *world); /* XML UI signals */ G_MODULE_EXPORT void test_triggers_cb(GtkMenuItem *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 remove_trigger(World *world, GSList *triggeritem) { Trigger *trigger = (Trigger *) triggeritem->data; /* Necessary when free_trigger dereferences trigger->pattern_re */ if (world->perl_interpreter) { GRAB_PERL(world); } 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); if (world->perl_interpreter) { RELEASE_PERL(world); } } 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; GRAB_PERL(world); 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(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("\\$([0-9]+)", FALSE); } RELEASE_PERL(world); } 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(GtkMenuItem *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"); gtk_window_set_transient_for(GTK_WINDOW(dlg), GTK_WINDOW(wndMain)); /* 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; gchar *line; gchar *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 = g_strdup(gtk_entry_get_text(txtLine)); stripped = strip_ansi(line, strlen(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-3.2.0/src/cmdhistory.c0000644000175000017500000005336113217707706013721 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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(GtkMenuItem *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(GtkMenuItem *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", "adjSpnCHDelay", "adjSpnNCommands", 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"); gtk_window_set_transient_for(GTK_WINDOW(dlg), GTK_WINDOW(wndMain)); /* 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) { kc_error_dialog(GTK_WINDOW(world->dlgCmdHistory), _("No command selected.")); return; } else if (n_selected > 1) { kc_error_dialog(GTK_WINDOW(world->dlgCmdHistory), _("More than one command selected.")); 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); 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); 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")); gtk_window_set_transient_for(GTK_WINDOW(world->dlgCmdHistoryFind), GTK_WINDOW(world->dlgCmdHistory)); } 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); gtk_widget_show_all(world->dlgCmdHistoryFind); 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) { kc_error_dialog(GTK_WINDOW(world->dlgCmdHistory), _("Enter some text to search for.")); 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) { kc_error_dialog(GTK_WINDOW(world->dlgCmdHistory), _("Use the Find button to find the first result.")); 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) { kc_error_dialog(GTK_WINDOW(world->dlgCmdHistory), _("Command not found.")); 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-3.2.0/src/telnet.c0000644000175000017500000003301013217707706013014 00000000000000/* * Copyright (C) 2004-2017 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" #include "net.h" /************************* * File global variables * *************************/ #define MAX_US 250000 /*********************** * Function prototypes * ***********************/ static void append_to_server_data_buffer(World *world, guchar chr); static void process_server_data(World *world); 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') { --pos; /* Reprocess this character as data */ } 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; case TELNET_OPT_GMCP: world->gmcp_enabled = TRUE; iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DO; iac_response[2] = TELNET_OPT_GMCP; kc_send(world, iac_response, 3); break; case TELNET_OPT_MSDP: world->msdp_enabled = TRUE; iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DO; iac_response[2] = TELNET_OPT_MSDP; kc_send(world, iac_response, 3); break; } world->telnet_state = TELNETFSM_DATA; break; case TELNETFSM_WONT: switch (world->dbuffer[pos]) { case 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); break; case TELNET_OPT_GMCP: world->gmcp_enabled = FALSE; iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DONT; iac_response[2] = TELNET_OPT_GMCP; kc_send(world, iac_response, 3); break; case TELNET_OPT_MSDP: world->msdp_enabled = FALSE; iac_response[0] = TELNET_IAC; iac_response[1] = TELNET_DONT; iac_response[2] = TELNET_OPT_MSDP; kc_send(world, iac_response, 3); break; } 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; } else if (world->dbuffer[pos] == TELNET_OPT_GMCP || world->dbuffer[pos] == TELNET_OPT_MSDP) { world->server_data_protocol = world->dbuffer[pos]; world->telnet_state = TELNETFSM_SERVER_DATA; } 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, CLIENT_NAME, TELNET_IAC, TELNET_SE); kc_send(world, tmp, CLIENT_NAME_LEN + 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; } break; case TELNETFSM_SERVER_DATA: if (world->dbuffer[pos] == TELNET_IAC) { world->telnet_state = TELNETFSM_SERVER_DATA_IAC; } else { append_to_server_data_buffer(world, world->dbuffer[pos]); } break; case TELNETFSM_SERVER_DATA_IAC: if (world->dbuffer[pos] == TELNET_IAC) { append_to_server_data_buffer(world, TELNET_IAC); world->telnet_state = TELNETFSM_SERVER_DATA; } else if (world->dbuffer[pos] == TELNET_SE) { process_server_data(world); world->telnet_state = TELNETFSM_DATA; } break; } ++pos; } } 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); } static void append_to_server_data_buffer(World *world, guchar chr) { /* If there are no hooks, don't save the data. If there are hooks but they're disable, we save the data, because if probably is cheaper to save than to search the array to see if the hooks are enabled. */ if (world->hooks.OnServerData == NULL) { return; } /* Resize buffer if necessary. */ /* TODO: Put a maximum limit? */ if (world->server_data_size >= world->server_data_alloc_size) { world->server_data_alloc_size += MAX_BUFFER; world->server_data_buffer = realloc(world->server_data_buffer, world->server_data_alloc_size); } world->server_data_buffer[world->server_data_size++] = chr; } static void process_server_data(World *world) { /* If no hooks would be run, don't bother parsing the data */ if (!are_there_enabled_server_data_hooks(world)) { return; } char *protocol = NULL; if (world->server_data_protocol == TELNET_OPT_GMCP) { protocol = "GMCP"; } else if (world->server_data_protocol == TELNET_OPT_MSDP) { protocol = "MSDP"; } /* Shouldn't happen, but it's better to be safe */ if (!protocol) { return; } append_to_server_data_buffer(world, '\0'); GRAB_PERL(world); parse_server_data(protocol, (char *) world->server_data_buffer); RELEASE_PERL(world); execute_hook_immediately(world, "OnServerData", NULL); world->server_data_size = 0; } kildclient-3.2.0/src/we_triggers.c0000644000175000017500000010543313217707706014053 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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_mnemonic(_("_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, _("Ig. 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), ngettext("trigger", "triggers", n), n); 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_window_set_transient_for(GTK_WINDOW(dlgEditTrigger), GTK_WINDOW(world->dlgEditWorld)); 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); g_object_set_data(btnConfigH, "parent-window", dlgEditTrigger); /* 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) { kc_error_dialog(GTK_WINDOW(dlgEditTrigger), _("You must specify the pattern.")); continue; } newaction = gtk_entry_get_text(txtAction); if (strcmp(newaction, "") == 0 && !newgag && !newgaglog && !newhighlight) { kc_error_dialog(GTK_WINDOW(dlgEditTrigger), _("You must specify the action, unless the trigger is a gag or changes the style.")); 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) { GRAB_PERL(world); if (trigger->pattern_re) { SvREFCNT_dec(trigger->pattern_re); } trigger->pattern_re = precompute_re(trigger->pattern, trigger->ignore_case); RELEASE_PERL(world); } /* 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", "modelColors", "modelUnderline", "modelYesNo", "adjSpnTarget", NULL }; GError *error = NULL; GtkWidget *dlgEditHighlight; GtkWindow *parent; 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"); parent = g_object_get_data(G_OBJECT(widget), "parent-window"); 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")); gtk_window_set_transient_for(GTK_WINDOW(dlgEditHighlight), parent); 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_KEY_Delete || evt->keyval == GDK_KEY_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-3.2.0/src/mainthread_operations.c0000644000175000017500000000574113217707706016112 00000000000000/* * Copyright (C) 2004-2017 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 "kildclient.h" void queue_mainthread_operation(World *world, MainThreadOperation *operation) { g_async_queue_push(world->mainthread_operations, operation); } gboolean mainthread_operations_idle_cb(gpointer data) { World *world = (World *) data; gpointer operation = g_async_queue_try_pop(world->mainthread_operations); while (operation != NULL) { process_mainthread_operation(world->gui, (MainThreadOperation *) operation); operation = g_async_queue_try_pop(world->mainthread_operations); } return TRUE; } void free_mainthread_operation(gpointer data) { MainThreadOperation *operation = (MainThreadOperation *) data; switch (operation->action) { case INSERT_AT_END: case INSERT_AT_MARK: g_free(operation->text_insert.text); break; case APPLY_HIGHLIGHT: g_free(operation->highlight); break; case PARSE_COMMANDS: if (operation->commands.matches) { SvREFCNT_dec(operation->commands.matches); } g_free(operation->commands.commands); break; case EXECUTE_ON_RECEIVED_TEXT: g_free(operation->hook_execution->data); g_free(operation->hook_execution); break; default: /* No additional free'ing necessary. */ break; } g_free(operation); } void process_mainthread_operation(WorldGUI *gui, MainThreadOperation *operation) { switch (operation->action) { case INSERT_AT_END: ansitextview_op_insert_at_end(gui, operation); break; case INSERT_AT_MARK: ansitextview_op_insert_at_mark(gui, operation); break; case TEXT_ADDED: ansitextview_op_text_added(gui, operation); break; case CLEAR_PENDING_LINE: ansitextview_op_clear_pending_line(gui, operation); break; case MOVE_LINESTART_MARK: ansitextview_op_move_linestart_mark(gui, operation); break; case APPLY_HIGHLIGHT: ansitextview_op_apply_highlight(gui, operation); break; case PARSE_COMMANDS: mainthread_op_parse_commands(gui->world, operation); break; case EXECUTE_ON_RECEIVED_TEXT: mainthread_op_execute_on_received_text_hook(operation->hook_execution); break; } free_mainthread_operation(operation); } kildclient-3.2.0/src/libintl-wrapper.h0000644000175000017500000000174713217707706014655 00000000000000/* * Copyright (C) 2004-2017 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 __LIBINTL_WRAPPER_H #define __LIBINTL_WRAPPER_H #include #ifdef __MINGW32__ # undef printf # undef vprintf # undef vfprintf #endif /* defined __MINGW32__ */ #endif kildclient-3.2.0/src/dlgStatistics.ui0000644000175000017500000006534713217707706014557 00000000000000 False 8 Statistics dialog False vertical False 8 end _OK True True True True top False False 0 False True end 0 False 8 4 4 False N/A 0 1 7 False N/A 0 1 6 False Proxy port: 1 0 7 False Proxy host: 1 0 6 False None 0 1 5 False Proxy type: 1 0 5 False World name: 1 0 0 False Host: 1 0 1 False Port: 1 0 2 False Connection time: 1 0 3 False Idle time: 1 0 4 False 0 8 2 False Compression used: 1 0 9 False Bytes received (compressed): 1 0 10 False N/A 0 1 10 False Bytes received (decompressed): 1 0 11 False Compression ratio: 1 0 12 False Lines received: 1 0 13 False 0 1 11 False 0 1 0 False 0 1 1 False 0 1 2 False 0 1 3 False 0 1 4 False None 0 1 9 False N/A 0 1 12 False 0 1 13 False 0 14 2 False Key exchange: 1 0 18 False SSL protocol used: 1 0 15 False Compression algorithm: 1 0 19 False Certificate type: 1 0 20 False Cipher: 1 0 16 False MAC: 1 0 17 False 0 1 15 False N/A 0 1 16 False N/A 0 1 17 False N/A 0 1 18 False N/A 0 1 19 False N/A 0 1 20 False Hostname: 1 0 21 False N/A 0 1 21 False Valid since: 1 0 22 False Expiration: 1 0 23 False N/A 0 1 22 False N/A 0 1 23 False Fingerprint: 1 0 24 False N/A 0 1 24 False Subject's DN: 1 0 25 False Issuer's DN: 1 0 26 False N/A 0 1 25 False N/A 0 1 26 False True 2 okbutton5 kildclient-3.2.0/src/we_plugins.c0000644000175000017500000004727313217707706013715 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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) { kc_error_dialog_with_title(GTK_WINDOW(world->dlgEditWorld), _("Error loading plugin"), "%s", error->message); 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_KEY_Delete || evt->keyval == GDK_KEY_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); } GRAB_PERL(world); eval_pv(cmd, TRUE); RELEASE_PERL(world); 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) { kc_error_dialog_with_title(GTK_WINDOW(world->dlgEditWorld), _("Error loading plugin"), "%s", error->message); 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); GRAB_PERL(world); eval_pv(cmd, FALSE); RELEASE_PERL(world); 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, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_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 __MINGW32__ 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-3.2.0/src/dlgMLSend.ui0000644000175000017500000004050313217707706013532 00000000000000 1 100000 1 1 10 100 0.10000000149 1 False 8 Multi-line send dialog False vertical 4 False 8 end _Cancel True True True True False False 0 _Send True True True True True False False 1 False True 2 end 0 False Send this text _initially: True txtInitial 0 1 False False 2 True in True True Enter some text to be sent to the World True True 3 False Then send the c_ontents of this file: True txtFile 0 1 False False 4 False 6 False False True True 0 C_lear True True True False False 1 False False 5 False _Finally, send this text: True txtFinal 0 1 False False 6 True in True True Enter some text to be sent to the World True True 7 False False False 8 False Add this to the _beginning of each line: True txtStart 0 1 False False 2 9 True Specify some text to be prepended to each sent line False False 10 False Add this to the _end of each line: True txtEnd 0 1 False False 2 11 True Specify some text to be appended to each sent line False False 12 False 4 False _Delay True spnMLSDelay False False 0 True Specify the delay between sending the group of lines adjSpnMLSDelay 0.10000000149 1 False False 1 False seconds e_ach True spnLinesATime False False 2 True Specify how many lines are sent at once adSpnLinesATime 1 False False 3 False line(s) False False 4 False False 4 13 _Keep dialog open after sending True False True True False False 14 btnMLCancel btnMLSend kildclient-3.2.0/src/we_hooks.c0000644000175000017500000007630613217707706013356 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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(GtkComboBoxText *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; GtkComboBoxText *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_TEXT(gtk_combo_box_text_new()); 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_box_new(GTK_ORIENTATION_HORIZONTAL, 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_text_append_text(cmbWhichHook, "OnConnect"); gtk_combo_box_text_append_text(cmbWhichHook, "OnDisconnect"); gtk_combo_box_text_append_text(cmbWhichHook, "OnReceivedText"); gtk_combo_box_text_append_text(cmbWhichHook, "OnSentCommand"); gtk_combo_box_text_append_text(cmbWhichHook, "OnGetFocus"); gtk_combo_box_text_append_text(cmbWhichHook, "OnLoseFocus"); gtk_combo_box_text_append_text(cmbWhichHook, "OnCloseConnected"); gtk_combo_box_text_append_text(cmbWhichHook, "OnServerData"); 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(GTK_COMBO_BOX(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); world->hooks.OnServerData_model = create_we_hooks_model(world->hooks.OnServerData); g_object_set_data(G_OBJECT(world->hooks.OnServerData_model), "forevent", "OnServerData"); g_object_set_data(G_OBJECT(world->hooks.OnServerData_model), "selected_list", &world->selected_OnServerData_hooks); world->hooks.OnServerData_model_filter = GTK_TREE_MODEL_FILTER(gtk_tree_model_filter_new(world->hooks.OnServerData_model, NULL)); g_object_unref(G_OBJECT(world->hooks.OnServerData_model)); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(world->hooks.OnServerData_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(GtkComboBoxText *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_text_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), ngettext("hook", "hooks", n), n); 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"); get_hook_list_for_reading(world, event, &hooklist, 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_window_set_transient_for(GTK_WINDOW(dlgEditHook), GTK_WINDOW(world->dlgEditWorld)); 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) { kc_error_dialog(GTK_WINDOW(dlgEditHook), _("You must specify the action.")); 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_KEY_Delete || evt->keyval == GDK_KEY_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"); get_hook_list_for_reading(world, event, &hooklist, &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-3.2.0/src/we_aliases.c0000644000175000017500000005735413217707706013656 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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, _("Ig. 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), ngettext("alias", "aliases", n), n); 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_window_set_transient_for(GTK_WINDOW(dlgEditAlias), GTK_WINDOW(world->dlgEditWorld)); 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) { kc_error_dialog(GTK_WINDOW(dlgEditAlias), _("You must specify the pattern.")); continue; } newsubstitution = gtk_entry_get_text(txtSubstitution); if (strcmp(newsubstitution, "") == 0) { kc_error_dialog(GTK_WINDOW(dlgEditAlias), _("You must specify the substitution.")); 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) { GRAB_PERL(world); if (alias->pattern_re) { SvREFCNT_dec(alias->pattern_re); } alias->pattern_re = precompute_re(alias->pattern, FALSE); RELEASE_PERL(world); } /* 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_KEY_Delete || evt->keyval == GDK_KEY_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-3.2.0/src/util.c0000644000175000017500000001427713217707706012514 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include "kildclient.h" /*********************** * Function prototypes * ***********************/ static void kc_error_dialog_internal(GtkWindow *parent, const gchar *title, const gchar *format, va_list args); void add_css_provider_and_class(GtkWidget *widget, GtkCssProvider *provider, const gchar *class) { GtkStyleContext *context; context = gtk_widget_get_style_context(widget); gtk_style_context_add_provider(context, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); gtk_style_context_add_class(context, class); } gchar * pango_font_to_css(const gchar *pango_font) { PangoFontDescription *font; GString *s; PangoFontMask set; font = pango_font_description_from_string(pango_font); s = g_string_new (NULL); set = pango_font_description_get_set_fields(font); if (set & PANGO_FONT_MASK_FAMILY) { g_string_append(s, "font-family: "); g_string_append(s, pango_font_description_get_family(font)); g_string_append(s, "; "); } if (set & PANGO_FONT_MASK_STYLE) { switch (pango_font_description_get_style(font)) { case PANGO_STYLE_NORMAL: g_string_append(s, "font-style: normal; "); break; case PANGO_STYLE_OBLIQUE: g_string_append(s, "font-style: oblique; "); break; case PANGO_STYLE_ITALIC: g_string_append(s, "font-style: italic; "); break; } } if (set & PANGO_FONT_MASK_VARIANT) { switch (pango_font_description_get_variant(font)) { case PANGO_VARIANT_NORMAL: g_string_append(s, "font-variant: normal; "); break; case PANGO_VARIANT_SMALL_CAPS: g_string_append(s, "font-variant: small-caps; "); break; } } if (set & PANGO_FONT_MASK_WEIGHT) { switch (pango_font_description_get_weight(font)) { case PANGO_WEIGHT_THIN: g_string_append(s, "font-weight: 100; "); break; case PANGO_WEIGHT_ULTRALIGHT: g_string_append(s, "font-weight: 200; "); break; case PANGO_WEIGHT_LIGHT: case PANGO_WEIGHT_SEMILIGHT: g_string_append(s, "font-weight: 300; "); break; case PANGO_WEIGHT_BOOK: case PANGO_WEIGHT_NORMAL: g_string_append(s, "font-weight: 400; "); break; case PANGO_WEIGHT_MEDIUM: g_string_append(s, "font-weight: 500; "); break; case PANGO_WEIGHT_SEMIBOLD: g_string_append(s, "font-weight: 600; "); break; case PANGO_WEIGHT_BOLD: g_string_append(s, "font-weight: 700; "); break; case PANGO_WEIGHT_ULTRABOLD: g_string_append(s, "font-weight: 800; "); break; case PANGO_WEIGHT_HEAVY: case PANGO_WEIGHT_ULTRAHEAVY: g_string_append(s, "font-weight: 900; "); break; } } if (set & PANGO_FONT_MASK_STRETCH) { switch (pango_font_description_get_stretch(font)) { case PANGO_STRETCH_ULTRA_CONDENSED: g_string_append(s, "font-stretch: ultra-condensed; "); break; case PANGO_STRETCH_EXTRA_CONDENSED: g_string_append(s, "font-stretch: extra-condensed; "); break; case PANGO_STRETCH_CONDENSED: g_string_append(s, "font-stretch: condensed; "); break; case PANGO_STRETCH_SEMI_CONDENSED: g_string_append(s, "font-stretch: semi-condensed; "); break; case PANGO_STRETCH_NORMAL: g_string_append(s, "font-stretch: normal; "); break; case PANGO_STRETCH_SEMI_EXPANDED: g_string_append(s, "font-stretch: semi-expanded; "); break; case PANGO_STRETCH_EXPANDED: g_string_append(s, "font-stretch: expanded; "); break; case PANGO_STRETCH_EXTRA_EXPANDED: g_string_append(s, "font-stretch: extra-expanded; "); break; case PANGO_STRETCH_ULTRA_EXPANDED: g_string_append(s, "font-stretch: ultra-expanded; "); break; } } if (set & PANGO_FONT_MASK_SIZE) { g_string_append_printf(s, "font-size: %dpt", pango_font_description_get_size (font) / PANGO_SCALE); } pango_font_description_free(font); return g_string_free(s, FALSE); } void kc_error_dialog(GtkWindow *parent, const gchar *format, ...) { va_list args; va_start(args, format); kc_error_dialog_internal(parent, _("KildClient error"), format, args); va_end(args); } void kc_error_dialog_with_title(GtkWindow *parent, const gchar *title, const gchar *format, ...) { va_list args; va_start(args, format); kc_error_dialog_internal(parent, title, format, args); va_end(args); } static void kc_error_dialog_internal(GtkWindow *parent, const gchar *title, const gchar *format, va_list args) { gchar *msg; GtkWidget *dlg; msg = g_strdup_vprintf(format, args); dlg = gtk_message_dialog_new(parent, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", msg); gtk_window_set_title(GTK_WINDOW(dlg), title); gtk_dialog_run(GTK_DIALOG(dlg)); gtk_widget_destroy(dlg); g_free(msg); } kildclient-3.2.0/src/perlscript.c0000644000175000017500000024377413217707706013734 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include #include /* Perl includes */ #include #include #include #include "kildclient.h" #include "ansi.h" #include "perlscript.h" #include "net.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 AV *perl_clone_array(AV *orig); static void perl_copy_array(AV *source, AV *dest); 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 = 3; static char *my_argv_static[] = { "kildperl", "-MData::Dumper", "-w" }; void init_perl_system(void) { PERL_SYS_INIT(&my_argc_static, (char ***) &my_argv_static); } void init_perl_script(World *world) { int my_argc; char **my_argv; char *perl_cmds; char *system_plugin_dir; char *user_plugin_dir; SV *world_ref; SV *world_var; SV *window_ref; SV *window_var; my_argv = g_malloc(sizeof(char *) * (my_argc_static + 2)); for (my_argc = 0; my_argc < my_argc_static; ++my_argc) { my_argv[my_argc] = my_argv_static[my_argc]; } my_argv[my_argc++] = g_strdup_printf("-I%s", get_kildclient_installed_file("")); #ifdef __MINGW32__ my_argv[my_argc++] = g_strdup_printf("-I%s", get_kildclient_installed_file("perl")); #endif my_argv[my_argc] = g_strdup(get_kildclient_installed_file("kildclient.pl")); #ifndef __MINGW32__ 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, 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[my_argc]); g_free(my_argv[my_argc - 1]); #ifdef __MINGW32__ g_free(my_argv[my_argc - 2]); #endif 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 *silentsv; 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); silentsv = newSViv(0); (void) hv_store(world_hash, "SILENT", 6, silentsv, 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) { perl_destruct(perl_interpreter); perl_free(perl_interpreter); } void perl_script_import_file(const char *file) { char *cmd = g_strdup_printf("do '%s';", file); eval_pv(cmd, TRUE); g_free(cmd); } int perl_match(const char *line, SV *pattern_re, int *match_start, int *match_end, int substring, AV **matches) { SV *string; SV *re; SV *command; int retval; int start; int end; dSP; /* Set the string in a variable */ string = get_sv("triggerline", 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("$triggerline =~ tr/\\n\\r//d;" "my $target = %d;" "@__M = ($triggerline =~ m\x05$_re\x05);" "my $match = scalar @__M;" "if ($match) {" " unshift(@__M, $triggerline);" "}" "(defined($-[$target]) ? $-[$target] : 0," " defined($+[$target]) ? $+[$target] : 0," " $match);", (substring != -1 ? substring : 0)); SvUTF8_on(command); /* Run the command */ ENTER; SAVETMPS; PUSHMARK(SP); eval_sv(command, G_ARRAY); SPAGAIN; retval = POPi; end = POPi; start = POPi; if (matches) { if (retval) { AV *M = get_av("__M", 0); *matches = perl_clone_array(M); } else { *matches = NULL; } } PUTBACK; FREETMPS; LEAVE; SvREFCNT_dec(command); if (match_start) { *match_start = start; } if (match_end) { *match_end = end; } return retval; } char * perl_substitute(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; /* 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" : ""); SvUTF8_on(command); /* 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(const char *re_string, int ignore_case) { SV *re_int; SV *re_new; SV *command; dSP; command = newSVpvf("$_re = qr\x05%s\x05%s;", re_string, ignore_case ? "i" : ""); SvUTF8_on(command); ENTER; SAVETMPS; PUSHMARK(SP); eval_sv(command, G_SCALAR); SPAGAIN; re_int = POPs; re_new = newSVsv(re_int); PUTBACK; FREETMPS; LEAVE; SvREFCNT_dec(command); return re_new; } void perl_set_arg_array(AV *matches) { AV *args = get_av("_", 0); av_clear(args); perl_copy_array(matches, args); } static AV * perl_clone_array(AV *orig) { AV *clone; int high_elem; high_elem = av_len(orig); clone = newAV(); av_extend(clone, high_elem); perl_copy_array(orig, clone); return clone; } static void perl_copy_array(AV *source, AV *dest) { int i; int highest_elem; highest_elem = av_len(source); for (i = 0; i <= highest_elem; ++i) { SV **val = av_fetch(source, i, 0); if (val) { SvREFCNT_inc(*val); if (!av_store(dest, i, *val)) { SvREFCNT_dec(*val); } } } } void parse_server_data(char *protocol, char *data) { SV *serverdataSV; SV *command; dSP; /* Set the string in a variable */ serverdataSV = get_sv("_serverdata", TRUE); sv_setpv(serverdataSV, data); SvUTF8_on(serverdataSV); command = newSVpvf("_parseserverdata(%s)", protocol); /* Run the command */ ENTER; SAVETMPS; PUSHMARK(SP); eval_sv(command, G_VOID); SPAGAIN; PUTBACK; FREETMPS; LEAVE; SvREFCNT_dec(command); } 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; GRAB_PERL(world_for_perl); eval_pv(cmd, TRUE); RELEASE_PERL(world_for_perl); } 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_gettext(pTHX_ CV *perlcv) { dXSARGS; if (items == 0) { XSRETURN_EMPTY; } XST_mPV(0, _(SvPV_nolen(ST(0)))); XSRETURN(1); } static void XS_ngettext(pTHX_ CV *perlcv) { dXSARGS; if (items < 3) { XSRETURN_EMPTY; } XST_mPV(0, ngettext(SvPV_nolen(ST(0)), SvPV_nolen(ST(1)), SvIV(ST(2)))); XSRETURN(1); } static void XS_getclientname(pTHX_ CV *perlcv) { dMARK; dAX; XST_mPV(0, CLIENT_NAME); XSRETURN(1); } 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); SvUTF8_on(ST(0)); 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); SvUTF8_on(ST(0)); 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); SvUTF8_on(ST(0)); XSRETURN(1); } static void XS_getentryfont(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* And now return the current value */ XST_mPV(0, world->entryfont); SvUTF8_on(ST(0)); 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_cmdseparator(pTHX_ CV *perlcv) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; /* If there is an argument, set the option */ if (items == 2) { g_strlcpy(world->command_separator, SvPV_nolen(ST(1)), sizeof(world->command_separator)); } /* And now return the current value */ XST_mPV(0, world->command_separator); SvUTF8_on(ST(0)); 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) { AnsiParseOperation *operation = g_new(AnsiParseOperation, 1); operation->action = APPEND_ECHOED_LINE; operation->line.line = g_strdup(word); operation->line.line_len = len; queue_ansiparse_operation(world, operation); } else { puts(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) { FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items == 1) { warn(_("%s: Too few arguments"), "interpret"); XSRETURN_EMPTY; } parse_commands(world, SvPV_nolen(ST(1))); XSRETURN_EMPTY; } static void XS_getinput(pTHX_ CV *perlcv) { const gchar *text; FETCHWORLDVARS; dXSARGS; FETCHWORLD; text = simo_combo_box_get_text(world->gui->cmbEntry); XST_mPV(0, text); SvUTF8_on(ST(0)); XSRETURN(1); } static void XS_setinput(pTHX_ CV *perlcv) { char *input = ""; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items > 1) { input = SvPV_nolen(ST(1)); } simo_combo_box_set_text(world->gui->cmbEntry, input); 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); SvUTF8_on(ST(0)); 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__sendserverdata(pTHX_ CV *perlcv) { char *protocol; char *data; STRLEN len; unsigned char telnet_code[3]; FETCHWORLDVARS; dXSARGS; FETCHWORLD; if (items < 3) { warn(_("%s: This is an internal function, do not call directly."), "_sendserverdata"); XSRETURN_EMPTY; } protocol = SvPV_nolen(ST(1)); data = SvPV(ST(2), len); if (strcmp(protocol, "GMCP") == 0) { if (!world->gmcp_enabled) { warn(_("Protocol %s not enabled."), protocol); XSRETURN_EMPTY; } telnet_code[2] = TELNET_OPT_GMCP; } else if (strcmp(protocol, "MSDP") == 0) { if (!world->msdp_enabled) { warn(_("Protocol %s not enabled."), protocol); XSRETURN_EMPTY; } telnet_code[2] = TELNET_OPT_MSDP; } else { warn(_("Unknown protocol")); XSRETURN_EMPTY; } telnet_code[0] = TELNET_IAC; telnet_code[1] = TELNET_SB; kc_send(world, telnet_code, 3); kc_send(world, data, len); /* telnet_code[0] = TELNET_IAC; - Already set */ telnet_code[1] = TELNET_SE; kc_send(world, telnet_code, 2); XSRETURN_EMPTY; } 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) { char *original; STRLEN len; char *stripped; dXSARGS; if (items == 0) { warn(_("%s: Too few arguments"), "stripansi"); XSRETURN_EMPTY; } original = SvPV(ST(0), len); stripped = strip_ansi(original, len); XST_mPV(0, stripped); SvUTF8_on(ST(0)); 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(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_or_warn_if_nonexistent(world, SvPV_nolen(ST(4))); 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_or_warn_if_nonexistent(world, SvPV_nolen(ST(4))); 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(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); SvUTF8_on(tmp); sv_setpv(tmp, line); aliasptr = world->aliases; while (aliasptr) { SV *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 = newSVpvf("$_tmpexpalias =~ s\x05$_re\x05%s\x05%s;", alias->substitution, alias->perl_eval ? "e" : ""); SvUTF8_on(subcmd); eval_sv(subcmd, G_VOID); SvREFCNT_dec(subcmd); aliasptr = aliasptr->next; } resultline = SvPV_nolen(tmp); XST_mPV(0, resultline); SvUTF8_on(ST(0)); 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); SvUTF8_on(ST(0)); 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, _("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; gdouble 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, _("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 (!SvNIOK(*value)) { warn(_("%s: Interval must be numeric"), "timer"); if (i == -1) { g_free(timer); } XSRETURN_EMPTY; } new_interval = SvNV(*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; } if (new_interval < 0) { warn(_("%s: Cannot create timer with negative interval"), "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: %.3f\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; 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); start_log_and_display_result(world); 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); SvUTF8_on(ST(0)); 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; 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); ansitextview_append_string(world->gui, "\n"); list_hooks(world, "OnServerData", 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); } SvUTF8_on(ST(0)); 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("gettext", XS_gettext, ""); newXS("ngettext", XS_ngettext, ""); newXS("getclientname", XS_getclientname, ""); newXS("getversion", XS_getversion, ""); newXS("quit", XS_quit, ""); newXS("gotow", XS_gotow, ""); newXS("getworld", XS_getworld, ""); newXS("play", XS_play, ""); newXS("stripansi", XS_stripansi, ""); 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("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::cmdseparator", XS_cmdseparator, "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::getinput", XS_getinput, "World"); newXS("World::setinput", XS_setinput, "World"); newXS("World::getline", XS_getline, "World"); newXS("World::_sendserverdata", XS__sendserverdata, "World"); 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-3.2.0/src/ansi.h0000644000175000017500000001420013217707706012460 00000000000000/* * Copyright (C) 2004-2017 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-3.2.0/src/kildclient.h0000644000175000017500000013470013220155667013655 00000000000000/* * Copyright (C) 2004-2017 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 #include /********************** * 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> " #define CLIENT_NAME "KildClient" #define CLIENT_NAME_LEN 10 /************** * 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 */ TELNETFSM_SERVER_DATA, TELNETFSM_SERVER_DATA_IAC, }; typedef enum TelnetState_e TelnetState; enum proxy_type_e { PROXY_USE_GLOBAL = -1, PROXY_NONE, PROXY_SOCKS4, PROXY_SOCKS5, PROXY_HTTP, }; 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; GSList *OnServerData; gint OnServerData_pos; GtkTreeModel *OnServerData_model; GtkTreeModelFilter *OnServerData_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; }; 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; /* 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 AnsiParseState_s { /* For ANSI parsing */ ANSIFSMState ansifsm_state; gboolean linedraw; guchar ansiseq_buffer[MAX_BUFFER]; /* Holds incomplete ansi seqs. */ gint ansiseq_pos; }; typedef struct AnsiParseState_s AnsiParseState; struct WorldGUI_s { struct world_s *world; GtkCssProvider *css_provider; 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; AnsiParseState ansi_parse; /* The current color and attributes is determined from these variables */ TAState ta_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_ta_state; }; 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; GdkRGBA *deffore; GdkRGBA *defbold; GdkRGBA *defback; GdkRGBA *defboldback; GdkRGBA *ansicolors; NameDisplayStyle name_display_style; char *name_display_pattern; gboolean use_tooltips; /* Scrolling settings */ gboolean scrollOutput; glong buffer_lines; /* 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; /* 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]; gchar perl_character; 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; int sock; 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 */ /* Server data */ guchar server_data_protocol; /* Protocol */ guchar *server_data_buffer; /* Buffer */ guint server_data_alloc_size; /* Allocated size */ guint server_data_size; /* Current size */ gboolean gmcp_enabled; /* Is GMCP enabled? */ gboolean msdp_enabled; /* Is MSDP enabled? */ /* 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 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; GSList *selected_OnServerData_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; gnutls_session_t tls_session; int tls_handshake_dir; /* Inter-thread communication */ GRecMutex perl_mutex; GThread *process_line_thread; GAsyncQueue *process_line_operations; GThread *ansiparse_thread; GAsyncQueue *ansiparse_operations; GMutex write_log_line_mutex; GAsyncQueue *mainthread_operations; guint mainthread_operations_idle_id; GMutex wait_command_mutex; GCond wait_command_cond; gboolean command_executed; gboolean to_be_destructed; }; 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 *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; }; 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; gdouble 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; struct HighlightApplication_s { Trigger *trigger; gint match_start; gint match_end; }; typedef struct HighlightApplication_s HighlightApplication; struct HookExecution_s { World *world; gchar *data; }; typedef struct HookExecution_s HookExecution; /* Line processing operations */ enum ProcessLineOperationType_s { PROCESS_COMPLETE_LINE, PROCESS_INCOMPLETE_LINE, DUMMY_PROCESS_LINE, }; typedef enum ProcessLineOperationType_s ProcessLineOperationType; struct ProcessLineOperation_s { ProcessLineOperationType action; gchar *line; gsize len; }; typedef struct ProcessLineOperation_s ProcessLineOperation; /* Ansi parsing operation */ enum AnsiParseOperationType_s { CLEAR_PENDING_LINE_ANSI, APPEND_LINE, APPEND_ECHOED_LINE, APPLY_HIGHLIGHTS_AND_MOVE_MARK, FINALIZE_LINE, DUMMY_ANSIPARSE, }; typedef enum AnsiParseOperationType_s AnsiParseOperationType; struct AnsiParseOperation_s { AnsiParseOperationType action; union { struct { gchar *line; gsize line_len; } line; GSList *highlights; }; }; typedef struct AnsiParseOperation_s AnsiParseOperation; /* Main thread operations */ enum MainThreadOperationType_s { INSERT_AT_END, INSERT_AT_MARK, TEXT_ADDED, CLEAR_PENDING_LINE, MOVE_LINESTART_MARK, APPLY_HIGHLIGHT, PARSE_COMMANDS, EXECUTE_ON_RECEIVED_TEXT, }; typedef enum MainThreadOperationType_s MainThreadOperationType; struct MainThreadOperation_s { MainThreadOperationType action; union { /* For INSERT_AT_END and INSERT_AT_MARK */ struct { gchar *text; gboolean use_ta; TAState ta_state; GtkTextTag *extra_tag; } text_insert; /* For APPLY_HIGHLIGHT */ HighlightApplication *highlight; /* For PARSE_COMMANDS */ struct { gchar *commands; gchar *colorline; AV *matches; gboolean notify; } commands; /* For EXECUTE_ON_RECEIVED_TEXT */ HookExecution *hook_execution; }; }; typedef struct MainThreadOperation_s MainThreadOperation; /* Function that enqueues or executes a text view operation. */ typedef void (*MainThreadOperationFunction)(WorldGUI *gui, MainThreadOperation *operation); /************************************************** * 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 GdkRGBA deffore; /* Default foreground color */ extern GdkRGBA defbold; /* Default bold foreground color */ extern GdkRGBA defback; /* Default background color */ extern GdkRGBA defboldback; /* Default bold background color */ extern GdkRGBA defansi[]; /* Default ansi colors */ /* gnutls certificate credentials */ extern gnutls_certificate_credentials_t tls_certif_cred; /********************************* * Function prototypes - Main UI * *********************************/ GtkWidget* create_main_window(WorldGUI *gui); void set_main_window_size(int x, int y, int width, int height, WorldGUI *gui); void add_global_css(); 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(GtkMenuItem *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 configure_css(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(GtkMenuItem *menu, gchar *url); /************************************************ * Function prototypes - Line processing thread * ************************************************/ gpointer process_line_thread(gpointer data); void queue_process_line_operation(World *world, ProcessLineOperation *operation); void free_process_line_operation(gpointer data); void match_triggers(World *world, gchar **line, gchar **color_line, gsize *output_len, gboolean *gag_output, gboolean *gag_log, gint *n_matches, GSList **trigger_response); /************************************** * Function prototypes - ANSI parsing * **************************************/ gpointer ansiparse_thread(gpointer data); void queue_ansiparse_operation(World *gui, AnsiParseOperation *operation); void free_ansiparse_operation(gpointer data); void insert_ansi_string(WorldGUI *gui, const gchar *str, gsize len, MainThreadOperationType where, MainThreadOperationFunction operation_func); /********************************************************************* * Function prototypes - Operations that must run in the main thread * *********************************************************************/ void queue_mainthread_operation(World *world, MainThreadOperation *operation); void free_mainthread_operation(gpointer data); gboolean mainthread_operations_idle_cb(gpointer data); void process_mainthread_operation(WorldGUI *world, MainThreadOperation *operation); /*************************************************** * 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_stringf_nl(WorldGUI *gui, const gchar *format, ...); void ansitextview_append_string_with_fgcolor(WorldGUI *gui, const gchar *str, gint fg_color); void ansitextview_append_ansi_string_immediately(WorldGUI *gui, 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); gchar *strip_ansi(const gchar *original, gsize len); /* Main thread operations */ void ansitextview_op_insert_at_end(WorldGUI *gui, MainThreadOperation *operation); void ansitextview_op_insert_at_mark(WorldGUI *gui, MainThreadOperation *operation); void ansitextview_op_text_added(WorldGUI *gui, MainThreadOperation *operation); void ansitextview_op_clear_pending_line(WorldGUI *gui, MainThreadOperation *operation); void ansitextview_op_move_linestart_mark(WorldGUI *gui, MainThreadOperation *operation); void ansitextview_op_apply_highlight(WorldGUI *gui, MainThreadOperation *operation); /******************************** * Function prototypes - Worlds * ********************************/ void set_default_colors(World *world); void create_default_world(void); World *create_new_world(gboolean load_defaults); void init_threads(World *world); 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); void update_we_mainwindow_parameters(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_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, const gchar *objname, int n); 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(GtkMenuItem *widget, gpointer data); /******************************** * Function Prototypes - Parser * ********************************/ void parse_commands(World *world, const char *cmdline); void parse_commands_full(World *world, const char *cmdline, AV *matches, const gchar *colorline, gboolean notify); void mainthread_op_parse_commands(World *world, MainThreadOperation *operation); void parse_command_line_immediately(World *world, const char *cmdline); 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 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 *event, int pos, gchar *action, gchar *name, gboolean enabled); void execute_hook(World *world, const gchar *hook, const gchar *hookdata); void execute_hook_immediately(World *world, const gchar *hook, const gchar *hookdata); void list_hooks(World *world, const gchar *event, Plugin *plugin); void list_hook(World *world, const gchar *event, int pos); gboolean delete_hook(World *world, const gchar *event, int pos, GSList *hook); gboolean move_hook(World *world, const gchar *event, 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 *event, gint **poscounter); gboolean get_hook_list_for_reading(World *world, const gchar *event, GSList **list, gint *pos); GSList *get_hook_list_or_warn_if_nonexistent(World *world, const gchar *event); GtkTreeModel *get_hook_model(World *world, const gchar *event); gboolean are_there_enabled_server_data_hooks(World *world); void mainthread_op_execute_on_received_text_hook(HookExecution *hook_execution); /********************************* * Function Prototypes - Logging * *********************************/ void write_log_line(World *world, const gchar *line, time_t *line_time); void start_log_and_display_result(World *world); 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); /********************************************************* * Function prototypes - Miscellaneous utility functions * *********************************************************/ void add_css_provider_and_class(GtkWidget *widget, GtkCssProvider *provider, const gchar *class); gchar *pango_font_to_css(const gchar *pango_font); void kc_error_dialog(GtkWindow *parent, const gchar *format, ...); void kc_error_dialog_with_title(GtkWindow *parent, const gchar *title, const gchar *format, ...); #endif kildclient-3.2.0/src/main.c0000644000175000017500000002105313220155675012445 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include #include #ifdef __MINGW32__ # include # include # include #endif #include "kildclient.h" #include "perlscript.h" /******************** * Global variables * ********************/ FILE *dumpFile = NULL; FILE *rdumpFile = NULL; /************************* * File global variables * *************************/ gnutls_certificate_credentials_t tls_certif_cred; /************************ * 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 */ #ifdef __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); read_global_preferences(&x, &y, &width, &height); create_default_world(); gui = world_gui_new(TRUE); wndMain = create_main_window(gui); set_main_window_size(x, y, width, height, gui); add_global_css(); init_perl_system(); 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);*/ 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(); gnutls_certificate_free_credentials(tls_certif_cred); gnutls_global_deinit(); if (dumpFile) { fclose(dumpFile); } if (rdumpFile) { fclose(rdumpFile); } return 0; } gboolean confirm_quit(void) { GList *worldptr; int n_open; gboolean retval = FALSE; GtkWidget *msgdlg; 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; } msgdlg = gtk_message_dialog_new(GTK_WINDOW(wndMain), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, ngettext("There is one open world. Do you really want to quit?", "There are %d open worlds. Do you really want to quit?", n_open), n_open); gtk_window_set_title(GTK_WINDOW(msgdlg), _("Really quit KildClient?")); gtk_dialog_add_buttons(GTK_DIALOG(msgdlg), _("_Don't quit"), GTK_RESPONSE_NO, _("_Quit"), GTK_RESPONSE_YES, NULL); 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 __MINGW32__ #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) { /* Gets the path to a file in the data directory (typically * /usr/share/kildclient) */ static char path[PATH_MAX]; strcpy(path, PKGDATADIR "/"); strcat(path, file); return path; } #else /* __MINGW32__ */ 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) { /* Under windows, paths start at the same directory that kildclient.exe is in. file is the name of a file that should be 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-3.2.0/src/dlgAbout.ui0000644000175000017500000000610513217707706013462 00000000000000 False 8 normal KildClient Copyright © 2004-2017 Eduardo M Kalinowski A mud client with powerful features and support for Perl scripting https://www.kildclient.org Visit https://www.kildclient.org 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> Spanish: Fernando Bobbio <FBobbio@ThePCGuy.net> Swedish: Niklas Grahn <terra.unknown@yahoo.com> image-missing gpl-2-0 False vertical False 8 False True end 0 kildclient-3.2.0/src/kcircularqueue.h0000644000175000017500000000733412331157500014547 00000000000000/* * 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 #include /** 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-3.2.0/src/worldgui.c0000644000175000017500000014720613220156141013353 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include #ifdef __MINGW32__ # 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 create_css_provider(WorldGUI *gui); 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, 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, GtkWidget *widget, GdkEventButton *event); static gboolean textview_motion_notify_event(GtkWidget *widget, GdkEventMotion *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(GtkMenuItem *menu, 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 *frame; GtkAdjustment *verticalAdjust; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkTextIter end_iter; /* First, create the cursors if this is the first run */ if (!hand_cursor) { hand_cursor = gdk_cursor_new_for_display(gdk_display_get_default(), GDK_HAND2); regular_cursor = gdk_cursor_new_for_display(gdk_display_get_default(), GDK_XTERM); } gui = g_new0(WorldGUI, 1); create_css_provider(gui); gui->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 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); /* With the default (on), scroll-to-end does not work with GTK+ >= 3.13 */ g_object_set(gtk_widget_get_settings(GTK_WIDGET(gui->scrolled_win)), "gtk-enable-animations", FALSE, NULL); gui->txtView = GTK_TEXT_VIEW(gtk_text_view_new()); add_css_provider_and_class(GTK_WIDGET(gui->txtView), gui->css_provider, "mud-output"); 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)); add_css_provider_and_class(GTK_WIDGET(gui->txtViewScroll), gui->css_provider, "mud-output"); 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_paned_new(GTK_ORIENTATION_VERTICAL)); gtk_paned_pack1(gui->split_pane, GTK_WIDGET(gui->scrwinScroll), FALSE, TRUE); gtk_paned_pack2(gui->split_pane, GTK_WIDGET(gui->scrolled_win), TRUE, FALSE); /* 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 *btnClose; GtkWidget *label; gui->search_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 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_from_icon_name("window-close", GTK_ICON_SIZE_BUTTON); gtk_button_set_relief(GTK_BUTTON(btnClose), GTK_RELIEF_NONE); 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_mnemonic(_("Find n_ext")); 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_box_new(GTK_ORIENTATION_HORIZONTAL, 4); gtk_container_set_border_width(GTK_CONTAINER(gui->commandArea), 2); gui->btnClear = gtk_button_new_from_icon_name("edit-clear", GTK_ICON_SIZE_MENU); g_signal_connect(G_OBJECT(gui->btnClear), "clicked", G_CALLBACK(clear_button_cb), gui); 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()); add_css_provider_and_class(simo_combo_box_get_single_line_widget(gui->cmbEntry), gui->css_provider, "input"); add_css_provider_and_class(simo_combo_box_get_multi_line_widget(gui->cmbEntry), gui->css_provider, "input"); 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(simo_combo_box_get_multi_line_widget(SIMO_COMBO_BOX(gui->cmbEntry))), "key-press-event", G_CALLBACK(keypress_cb), gui); g_signal_connect(G_OBJECT(simo_combo_box_get_single_line_widget(SIMO_COMBO_BOX(gui->cmbEntry))), "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), "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 */ GtkWidget *widget = gtk_entry_new(); add_css_provider_and_class(widget, gui->css_provider, "input"); gtk_box_pack_start(GTK_BOX(gui->commandArea), widget, TRUE, TRUE, 0); gui->txtEntry = GTK_ENTRY(widget); } 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->saved_ta_state.fg_color = ANSI_DEFAULT_COLOR_IDX; gui->ta_state.bg_color = gui->saved_ta_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; /* Notebook tab */ gui->hboxTab = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 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_from_icon_name("window-close", GTK_ICON_SIZE_BUTTON); /* Make the button smaller. (Taken from gedit code) */ gtk_widget_set_focus_on_click(btnClose, FALSE); gtk_button_set_relief(GTK_BUTTON(btnClose), GTK_RELIEF_NONE); g_signal_connect(G_OBJECT(btnClose), "clicked", G_CALLBACK(tab_close_cb), gui); gtk_box_pack_start(GTK_BOX(gui->hboxTab), btnClose, FALSE, FALSE, 0); /* 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); /* 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_box_new(GTK_ORIENTATION_HORIZONTAL, 4)); gui->lblStatus = GTK_LABEL(gtk_label_new(_("KildClient ready"))); add_css_provider_and_class(GTK_WIDGET(gui->lblStatus), gui->css_provider, "status-bar"); gtk_widget_set_halign(GTK_WIDGET(gui->lblStatus), GTK_ALIGN_START); 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_widget_set_halign(GTK_WIDGET(gui->lblLines), GTK_ALIGN_START); 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_widget_set_halign(GTK_WIDGET(gui->lblTime), GTK_ALIGN_START); 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 create_css_provider(WorldGUI *gui) { gui->css_provider = gtk_css_provider_new(); configure_css(gui, default_world); } 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) { g_object_unref(gui->css_provider); 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); /* 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_KEY_Left: case GDK_KEY_KP_Left: if (evt->state & GDK_MOD1_MASK) { /* Alt+left */ menu_perl_run_cb(NULL, "$world->prev"); return TRUE; } break; case GDK_KEY_Right: case GDK_KEY_KP_Right: if (evt->state & GDK_MOD1_MASK) { /* Alt+right */ menu_perl_run_cb(NULL, "$world->next"); return TRUE; } break; case GDK_KEY_Tab: case GDK_KEY_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_KEY_Up: case GDK_KEY_KP_Up: direction = 0; /* Fall through */ case GDK_KEY_Down: case GDK_KEY_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_KEY_Page_Up: case GDK_KEY_KP_Page_Up: direction = -1; /* Fall through */ case GDK_KEY_Page_Down: case GDK_KEY_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); return TRUE; case GDK_KEY_End: case GDK_KEY_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)); 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, 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; 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?")); gtk_dialog_add_buttons(GTK_DIALOG(msgdlg), _("Keep _open"), GTK_RESPONSE_NO, _("_Close"), GTK_RESPONSE_YES, NULL); 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) { GtkEntryCompletion *completion; GtkCellRenderer *renderer; configure_css(gui, world); 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 configure_css(WorldGUI *gui, World *world) { gchar *terminalfont; gchar *entryfont; gchar *statusfont; terminalfont = pango_font_to_css(world->terminalfont); entryfont = pango_font_to_css(world->entryfont); statusfont = pango_font_to_css(world->statusfont); gchar *css = g_strdup_printf( ".mud-output text {" " background-color: %s;" " color: %s;" "}" ".mud-output {" " %s;" "}" ".mud-output text selection {" " background-color: #94c9ed;" " color: #000000;" "}" ".input {" " %s;" "}" ".status-bar {" " %s;" "}", gdk_rgba_to_string(world->defback), gdk_rgba_to_string(world->deffore), terminalfont, entryfont, statusfont); gtk_css_provider_load_from_data(gui->css_provider, css, -1, NULL); g_free(terminalfont); g_free(entryfont); g_free(statusfont); g_free(css); } void worldgui_configure_spell(WorldGUI *gui) { GError *error = NULL; 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); } } 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 != GDK_BUTTON_PRIMARY && event->button != GDK_BUTTON_SECONDARY) { 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, text_view, event); } static gboolean act_if_link(WorldGUI *gui, GtkTextIter *iter, GtkWidget *widget, 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 == GDK_BUTTON_PRIMARY) { 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_widget_show_all(GTK_WIDGET(mnuPopupURL)); gtk_builder_connect_signals(ui_builder, matched_url); gtk_menu_attach_to_widget(mnuPopupURL, widget, NULL); gtk_menu_popup_at_pointer(mnuPopupURL, (GdkEvent *) event); g_object_unref(ui_builder); } return TRUE; } #ifndef __MINGW32__ void menu_url_open(GtkMenuItem *menu, char *url) { GError *err = NULL; gtk_show_uri_on_window(GTK_WINDOW(wndMain), url, GDK_CURRENT_TIME, &err); if (err != NULL) { fprintf(stderr, "Error opening URL: %s\nCheck if gvfs is installed\n", err->message); g_error_free(err); } g_free(url); } #else /* defined __MINGW32__ */ void menu_url_open(GtkMenuItem *menu, char *url) { ShellExecute(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL); g_free(url); } #endif void menu_popup_url_copy(GtkMenuItem *menu, char *url) { GdkDisplay *display; GtkClipboard *clipboard; display = gtk_widget_get_display(GTK_WIDGET(menu)); 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); 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); gtk_widget_get_allocation(widget, &alloc); 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); if (text == NULL) { return FALSE; } 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; if (k_circular_queue_size(gui->line_times) == 0) { return NULL; } 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_KEY_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-3.2.0/src/hooks.c0000644000175000017500000003225413215302470012640 00000000000000/* * 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 "libintl-wrapper.h" #include #include #include "kildclient.h" #include "perlscript.h" /************************* * File global variables * *************************/ /*********************** * Function prototypes * ***********************/ static void execute_hook_full(World *world, const gchar *event, const char *hookdata, gboolean immediately); static void save_hook_list(GString *str, GSList *hookptr); gboolean connect_hook(World *world, const gchar *event, int pos, gchar *action, gchar *name, gboolean enabled) { GSList **hook_list; Hook *hook; gint *hook_pos; hook_list = get_hook_list_for_writing(world, event, &hook_pos); if (!hook_list) { ansitextview_append_stringf(world->gui, _("hook: Invalid event '%s'\n"), event); 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, event, hook, (*hook_pos)++); } else { we_hook_insert_hook(world, event, hook, g_slist_length(*hook_list)); } } else { we_hook_update_hook(world, event, hook); } return TRUE; } void execute_hook(World *world, const gchar *event, const char *hookdata) { execute_hook_full(world, event, hookdata, FALSE); } void execute_hook_immediately(World *world, const gchar *event, const char *hookdata) { execute_hook_full(world, event, hookdata, TRUE); } static void execute_hook_full(World *world, const gchar *event, const char *hookdata, gboolean immediately) { /* If immediately is true, then instead of queuing commands, they are executed immediately. This is necessary when data is passed to the hooks via variables ($hookdata and $serverdata), because if the command is not executed immediately the variable may be overwritten if more data from the server triggers another execution. However, care must be taken so that immediate execution is only requested from the main thread. */ GSList *hookptr = NULL; Hook *hook; SV *Phookdata; get_hook_list_for_reading(world, event, &hookptr, NULL); if (!hookptr) { return; } world_for_perl = world; if (hookdata) { GRAB_PERL(world); Phookdata = get_sv("hookdata", TRUE); SvUTF8_on(Phookdata); sv_setpv(Phookdata, hookdata); RELEASE_PERL(world); } while (hookptr) { hook = (Hook *) hookptr->data; if (hook->enabled) { if (immediately) { parse_command_line_immediately(world, hook->action); } else { parse_commands(world, hook->action); } } hookptr = hookptr->next; } world_for_perl = currentWorld; } void list_hooks(World *world, const gchar *event, Plugin *plugin) { GSList *hooklist; Hook *hook; guint total_width; guint field_width; guint i; hooklist = get_hook_list_or_warn_if_nonexistent(world, event); if (!hooklist) { 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"), event); 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 *event, int pos) { GSList *hooklist; Hook *hook; hooklist = get_hook_list_or_warn_if_nonexistent(world, event); 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, event, hook->name ? hook->name : _("Not set"), hook->action, hook->enabled ? _("yes") : _("no")); } gboolean delete_hook(World *world, const gchar *event, 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, event, &hook_pos); if (!hooklist) { return FALSE; } if (hook == NULL) { hook = g_slist_nth(*hooklist, pos); } if (!hook) { return FALSE; } we_hook_delete_hook(world, event, (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 *event, gint old_pos, gint new_pos) { GSList **hooklist; gint *hook_pos; GSList *hookitem; gpointer hook; hooklist = get_hook_list_for_writing(world, event, &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, event, hook); we_hook_insert_hook(world, event, 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); } if (world->hooks.OnServerData) { g_string_append_printf(str, " \n"); save_hook_list(str, world->hooks.OnServerData); } g_string_append_printf(str, " \n"); } GSList ** get_hook_list_for_writing(World *world, const gchar *event, gint **poscounter) { if (strcmp(event, "OnConnect") == 0) { *poscounter = &world->hooks.OnConnect_pos; return &world->hooks.OnConnect; } if (strcmp(event, "OnDisconnect") == 0) { *poscounter = &world->hooks.OnDisconnect_pos; return &world->hooks.OnDisconnect; } if (strcmp(event, "OnReceivedText") == 0) { *poscounter = &world->hooks.OnReceivedText_pos; return &world->hooks.OnReceivedText; } if (strcmp(event, "OnSentCommand") == 0) { *poscounter = &world->hooks.OnSentCommand_pos; return &world->hooks.OnSentCommand; } if (strcmp(event, "OnGetFocus") == 0) { *poscounter = &world->hooks.OnGetFocus_pos; return &world->hooks.OnGetFocus; } if (strcmp(event, "OnLoseFocus") == 0) { *poscounter = &world->hooks.OnGetFocus_pos; return &world->hooks.OnLoseFocus; } if (strcmp(event, "OnCloseConnected") == 0) { *poscounter = &world->hooks.OnCloseConnected_pos; return &world->hooks.OnCloseConnected; } if (strcmp(event, "OnServerData") == 0) { *poscounter = &world->hooks.OnServerData_pos; return &world->hooks.OnServerData; } return NULL; } gboolean get_hook_list_for_reading(World *world, const gchar *event, GSList **list, gint *pos) { gint *found_pos; GSList **found_list = get_hook_list_for_writing(world, event, &found_pos); if (!found_list) { *list = NULL; return FALSE; } *list = *found_list; if (pos) { *pos = *found_pos; } return TRUE; } GSList * get_hook_list_or_warn_if_nonexistent(World *world, const gchar *event) { GSList *hooklist; if (!get_hook_list_for_reading(world, event, &hooklist, NULL)) { ansitextview_append_stringf(world->gui, _("hook: Invalid event '%s'\n"), event); return NULL; } return hooklist; } GtkTreeModel * get_hook_model(World *world, const gchar *event) { if (strcmp(event, "OnConnect") == 0) { return world->hooks.OnConnect_model; } if (strcmp(event, "OnDisconnect") == 0) { return world->hooks.OnDisconnect_model; } if (strcmp(event, "OnReceivedText") == 0) { return world->hooks.OnReceivedText_model; } if (strcmp(event, "OnSentCommand") == 0) { return world->hooks.OnSentCommand_model; } if (strcmp(event, "OnGetFocus") == 0) { return world->hooks.OnGetFocus_model; } if (strcmp(event, "OnLoseFocus") == 0) { return world->hooks.OnLoseFocus_model; } if (strcmp(event, "OnCloseConnected") == 0) { return world->hooks.OnCloseConnected_model; } if (strcmp(event, "OnServerData") == 0) { return world->hooks.OnServerData_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); } gboolean are_there_enabled_server_data_hooks(World *world) { GSList *iter = world->hooks.OnServerData; while (iter != NULL) { Hook *hook = (Hook *) iter->data; if (hook->enabled) { return TRUE; } iter = iter->next; } return FALSE; } void mainthread_op_execute_on_received_text_hook(HookExecution *hook_execution) { execute_hook_immediately(hook_execution->world, "OnReceivedText", hook_execution->data); } kildclient-3.2.0/src/log.c0000644000175000017500000001477613217707706012324 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #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); static void make_directories(const gchar* path); void write_log_line(World *world, const char *line, time_t *line_time) { int len; static char timestr[MAX_TIME_STR]; if (!world->log_file) { return; } g_mutex_lock(&world->write_log_line_mutex); 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) { g_mutex_unlock(&world->write_log_line_mutex); return; } fputs(line, world->log_file); /* Finish always with a NL character */ if (line[len - 1] != '\n') { fputc('\n', world->log_file); } g_mutex_unlock(&world->write_log_line_mutex); } void start_log_and_display_result(World *world) { gchar *errmsg = NULL; if (start_log(world, 0, &errmsg)) { ansitextview_append_stringf_nl(world->gui, _("Logging to file %s."), world->log_actual_file); } else { ansitextview_append_string_nl(world->gui, errmsg); g_free(errmsg); } } 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); make_directories(actualfile); 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_printf(_("Could not open log file: %s."), g_strerror(errno)); 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("undefined"); } 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("undefined"); } 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); } static void make_directories(const gchar* path) { gchar *dir = g_path_get_dirname(path); g_mkdir_with_parents(dir, 0755); g_free(dir); } kildclient-3.2.0/src/net.c0000644000175000017500000011232513217707706012316 00000000000000/* * Copyright (C) 2004-2017 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 "libintl-wrapper.h" #include #include #include #ifndef __MINGW32__ # include # include # include # include # include #else /* ! defined __MINGW32__ */ # include # include #endif #include "kildclient.h" #include "perlscript.h" #include "net.h" /************************* * File global variables * *************************/ #define MAX_US 250000 /************** * Data types * **************/ /*********************** * Function prototypes * ***********************/ static gboolean connect_ready_cb(GIOChannel *iochan, GIOCondition cond, gpointer data); static gboolean connected_to_dispatcher(World *world); static gboolean tls_handshake_cb(GIOChannel *iochan, GIOCondition cond, gpointer data); static gboolean tls_handshake_timeout_cb(gpointer data); 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 convert_recv_line(World *world, int start, int end, gboolean incomplete); static ssize_t write_escaped(World *world, const void *buf, size_t count); #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; GThread *resolver_thread; 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); } /* 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); init_threads(world); GRAB_PERL(world); load_permanent_variables(world); load_startup_plugins(world); if (world->scriptfile) { perl_script_import_file(world->scriptfile); } RELEASE_PERL(world); 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 if (world->proxy_used.type == PROXY_HTTP) { 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; } resolver_thread = g_thread_new("resolver", resolve_name_thread, resolve_data); g_thread_unref(resolver_thread); 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 (g_list_index(open_worlds, world) == -1) { /* It could happen that the world has been closed */ g_free(resolve_data->host); g_free(resolve_data); return FALSE; } if (resolve_data->ret != 0) { 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); 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 if (world->proxy_used.type == PROXY_HTTP) { return proxy_http_connected_to(world); } else { return perform_tls_handshake(world); } } 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); gnutls_transport_set_int(world->tls_session, world->sock); /* 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 */ 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) { world->errmsg = g_strdup_printf(_("SSL handshake took too long.")); disconnect_world(world, FALSE); } /* Never called again */ return FALSE; } 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) { stop_log(world); start_log_and_display_result(world); } /* 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"); if (world->use_tls) { gnutls_bye(world->tls_session, GNUTLS_SHUT_RDWR); } #ifndef __MINGW32__ close(world->sock); #else /* defined __MINGW32__ */ closesocket(world->sock); #endif world->connected = FALSE; world->connecting = FALSE; if (world->use_tls) { gnutls_deinit(world->tls_session); } 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 */ 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 { #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 } } 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; convert_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. */ /* 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) { convert_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. */ convert_recv_line(world, world->printed_until, world->pbuf_size, TRUE); world->printed_until = world->pbuf_size; return FALSE; } static void convert_recv_line(World *world, int start, int end, gboolean incomplete) { gchar *converted; gsize output_len; GError *error = NULL; /* Clear pending line if it gets completed */ if (!incomplete && world->printed_until) { AnsiParseOperation *operation = g_new(AnsiParseOperation, 1); operation->action = CLEAR_PENDING_LINE_ANSI; queue_ansiparse_operation(world, operation); } converted = g_convert((gchar *) (world->pbuffer + start), end - start, VTE_ENC, world->charset, NULL, &output_len, &error); if (converted) { ProcessLineOperation *operation = g_new(ProcessLineOperation, 1); operation->line = converted; operation->len = output_len; operation->action = incomplete ? PROCESS_INCOMPLETE_LINE : PROCESS_COMPLETE_LINE; queue_process_line_operation(world, operation); } else { fprintf(stderr, "Error in charset conversion: %s\n", error->message); } } 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; } } } 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; 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_immediately(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; } 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); } } 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); } } kildclient-3.2.0/src/dlgPreferences.ui0000644000175000017500000011404713217707706014656 00000000000000 100 0.10000000000000001 1 100000 1 1 10 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) No proxy SOCKS4 SOCKS5 HTTP Left Right Top Bottom False 8 Preferences dialog False vertical False 8 end _Close True True True True True False False 0 False True end 0 True False 12 vertical 6 False <b>Colors used by KildClient</b> True 0 0 False True 0 False 16 vertical 6 False _Informative messages: True cmbInfoColor 0 False True 0 False modelCores 0 True True 1 False Command _echo: True cmbCmdEchoColor 0 False True 2 False modelCores 0 True True 3 False True 1 False 12 <b>Window configuration</b> True 0 0 False True 2 False 16 vertical 6 False _Tab position: True cmbTabPos 0 False True 0 False modelTabPosition 0 True True 1 _Hide tabs if only one world is open True False True If this is checked, when there is only one open world no tabs will be shown True True False True 2 _Flash window when new text is received True False True True False True 3 False True 3 False Appearance False False 12 vertical 6 False <b>Sending delays</b> True 0 0 False True 0 False 16 vertical 6 False Enter the default parameters for sending multiple lines or commands: 0 False True 0 False 4 False _Number of lines/commands to send at once: True spnGroupSize False True 0 True 1 ajdSpnGroupSize 1 1 False True 1 False True 1 False 4 False _Delay between each group of lines/commands: True spnPrefsDelay False True 0 True 0.0 adjSpnPrefsDelay 0.10000000149 1 False True 1 False True 2 False True 1 1 False Sending 1 False False 12 vertical 6 False 12 <b>Audio player</b> True 0 0 False True 2 False 16 vertical 6 False Enter the command to run an _audio player program. %s will be substituted by the file path: True True txtAudioPlayerCommand 0 False True 0 True Specify the command used to play sound files. True False True 1 False True 3 2 False External programs 2 False False 12 vertical 6 False <b>Proxy</b> True 0 0 False True 0 False 16 vertical 6 False 4 False Proxy _type: True False True 0 False modelProxyType 0 False True 1 False True 0 False 6 6 False Server _address: True txtGProxyServer 1 0 0 False _Username: True txtGProxyUser 1 0 1 True 1 0 True 1 1 False Server _port: True txtGProxyPort 1 2 0 False Pass_word: True txtGProxyPassword 1 2 1 True 3 0 True False 3 1 False True 2 False True 1 3 False Proxy 3 False False True 2 btnClose kildclient-3.2.0/configure.ac0000644000175000017500000000450513217705200013046 00000000000000AC_INIT([kildclient], [3.2.0]) AC_CONFIG_SRCDIR([src/main.c]) AC_CANONICAL_HOST AM_INIT_AUTOMAKE([foreign]) 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="de eo es pt_BR sv" AM_GLIB_GNU_GETTEXT AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", "definition of GETTEXT_PACKAGE") dnl dnl GTK+ checks dnl PKG_CHECK_MODULES(GTK, glib-2.0 >= 2.32.0 gthread-2.0 >= 2.32.0 gtk+-3.0 >= 3.22.0) AC_SUBST(GTK_CFLAGS) AC_SUBST(GTK_LIBS) dnl dnl GtkSpell check dnl PKG_CHECK_MODULES(GTKSPELL, gtkspell3-3.0) AC_SUBST(GTKSPELL_CFLAGS) AC_SUBST(GTKSPELL_LIBS) dnl dnl GnuTLS check dnl PKG_CHECK_MODULES(LIBGNUTLS, gnutls) AC_SUBST(LIBGNUTLS_CFLAGS) AC_SUBST(LIBGNUTLS_LIBS) dnl dnl Check for perl - Does not work when cross-compiling dnl case $host in *-*-mingw32*) ;; *) AC_CHECK_PROG(PERL, perl, perl) AC_PROG_PERL_MODULES([ExtUtils::Embed], [dnl KILDCLIENT_PERL_CFLAGS=`$PERL -MExtUtils::Embed -e ccopts` KILDCLIENT_PERL_LIBS=`$PERL -MExtUtils::Embed -e ldopts` AC_SUBST(KILDCLIENT_PERL_CFLAGS) AC_SUBST(KILDCLIENT_PERL_LIBS)], AC_MSG_ERROR(The perl ExtUtils::Embed module could not be found)) ;; esac 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 Resources file handling dnl case $host in *-*-mingw32*) dnl Find the windres tool and use it to compile AC_CHECK_TOOL([WINDRES], [windres]) windows=true ;; *) windows=false ;; esac AM_CONDITIONAL([WINDOWS], [test x$windows = xtrue]) dnl dnl Extra flags necessary for windows dnl case $host in *-*-mingw32*) LIBS="$LIBS -mwindows -lregex -lws2_32 -lwinmm" ;; esac 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-3.2.0/po/0000755000175000017500000000000013220232041011242 500000000000000kildclient-3.2.0/po/es.po0000644000175000017500000023523313220232041012141 00000000000000# KildClient messages in Spanish # Copyright (C) 2013-2017 Eduardo M KALINOWSKI # This file is distributed under the same license as the KildClient package. # msgid "" msgstr "" "Project-Id-Version: KildClient 3.2.0\n" "Report-Msgid-Bugs-To: eduardo@kalinowski.com.br\n" "POT-Creation-Date: 2017-12-24 09:10-0200\n" "PO-Revision-Date: 2017-12-24 09:13-0200\n" "Last-Translator: Fernando Bobbio \n" "Language-Team: Eduardo M Kalinowski \n" "Language: es\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" "X-Generator: Lokalize 1.4\n" #: ../src/main.c:63 msgid "Outputs version information and exits" msgstr "Muestra información de la versión y cierra" #: ../src/main.c:65 msgid "Directory to store settings and saved worlds" msgstr "Directorio donde se guardan configuraciones y mundos guardados" #: ../src/main.c:65 msgid "DIR" msgstr "DIR" #: ../src/main.c:67 msgid "" "Dumps all data received from (after decompression, if appropriate) to the " "file" msgstr "" "Ingresa toda la información recibida de (luego de descompresión, si es " "necesario) al archivo" #: ../src/main.c:68 ../src/main.c:71 msgid "FILE" msgstr "ARCHIVO" #: ../src/main.c:70 msgid "Dumps all data received (possibly compressed) to the file" msgstr "" "Ingresa toda la información recibida (posiblemente compresa) al archivo" #. Parse command-line options #: ../src/main.c:101 msgid "[WORLD...]" msgstr "[MUNDO...]" #: ../src/main.c:108 #, 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:113 #, fuzzy, c-format msgid "Could not open dump file %s: %s\n" msgstr "No se puede abrir el archivo %s: %s\n" #: ../src/main.c:120 #, fuzzy, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "No se puede abrir el archivo original %s: %s\n" #: ../src/main.c:240 #, c-format msgid "There is one open world. Do you really want to quit?" msgid_plural "There are %d open worlds. Do you really want to quit?" msgstr[0] "Hay un mundo abierto. ¿Realmente quiere desconectar?" msgstr[1] "Hay %d mundos abiertos. ¿Realmente quiere desconectar?" #: ../src/main.c:244 msgid "Really quit KildClient?" msgstr "¿Realmente salir de KildClient?" #: ../src/main.c:246 msgid "_Don't quit" msgstr "_No salir" #: ../src/main.c:247 ../src/wndmain.ui:146 msgid "_Quit" msgstr "_Salir" #: ../src/net.c:166 ../src/proxy.c:209 #, c-format msgid "Resolving proxy host %s..." msgstr "Resolviendo proxy %s..." #: ../src/net.c:169 #, c-format msgid "Resolving host %s..." msgstr "Resolviendo %s..." #: ../src/net.c:262 ../src/proxy.c:193 #, c-format msgid "Could not resolve host %s: %s" msgstr "No se pudo resolver %s: %s" #: ../src/net.c:290 #, c-format msgid "Attempting to connect to host %s (%s) port %s..." msgstr "Intentando conectar a %s (%s) puerto %s..." #: ../src/net.c:293 #, c-format msgid "Attempting to connect to proxy host %s (%s) port %s..." msgstr "Intentando conectar a proxy %s (%s) puerto %s..." #: ../src/net.c:309 #, c-format msgid "Could not create socket: %s" msgstr "No se pudo crear conexión: %s" #: ../src/net.c:312 #, c-format msgid "Could not create socket: error #%d" msgstr "No se pudo crear conexión: error #%d" #: ../src/net.c:332 #, c-format msgid "Could not connect to host %s port %s: %s" msgstr "No se pudo conectar a %s puerto %s: %s" #: ../src/net.c:342 #, c-format msgid "Could not connect to host %s port %s: error #%d" msgstr "No se pudo conectar a %s puerto %s: error #%d" #: ../src/net.c:398 #, c-format msgid "Unable to connect to host %s: %s." msgstr "Problemas de conexión a %s: %s." #: ../src/net.c:401 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "Problemas de conexión a proxy %s: %s." #: ../src/net.c:443 ../src/net.c:461 #, c-format msgid "Unable to connect to host %s: error #%d." msgstr "Problemas de conexión a %s: error #%d." #: ../src/net.c:446 ../src/net.c:464 #, c-format msgid "Unable to connect to proxy host %s: error #%d." msgstr "Problemas de conexión a proxy %s: error #%d." #: ../src/net.c:499 #, c-format msgid "Performing SSL handshake..." msgstr "Iniciando conexión SSL..." #. Fatal error #: ../src/net.c:542 #, c-format msgid "SSL handshake failed: %s" msgstr "Problema de conexión SSL: %s" #: ../src/net.c:583 #, c-format msgid "SSL handshake took too long." msgstr "La conexión SSL demoró demasiado." #: ../src/net.c:605 ../src/net.c:1091 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "Conectado a %s (%s) puerto %s." #: ../src/net.c:608 ../src/net.c:1094 #, c-format msgid "Connected to host %s port %s, via proxy %s (%s) port %s." msgstr "Conectado a %s puerto %s, mediante proxy %s (%s) puerto %s." #: ../src/net.c:615 ../src/net.c:1067 ../src/net.c:1101 msgid " SSL enabled." msgstr "SSL habilitado." #: ../src/net.c:770 #, c-format msgid "Disconnected from host %s." msgstr "Desconectado de %s." #: ../src/net.c:838 ../src/net.c:846 #, c-format msgid "Disconnected from host %s: %s." msgstr "Desconectado de %s: %s." #: ../src/net.c:857 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "Desconectado de %s: error #%d." #: ../src/net.c:1055 #, c-format msgid "Connected to host %s (%s) port %s, MCCP version %d enabled." msgstr "Desconectado de %s (%s) puerto %s, versión de MCCP %d habilitada." #: ../src/net.c:1059 #, c-format msgid "" "Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d " "enabled." msgstr "" "Conectado a %s puerto %s, mediante proxy %s (%s) puerto %s, versión de MCCP " "%d " #: ../src/net.c:1177 ../src/we_logging.c:121 msgid "Not connected." msgstr "No conectado." #. success #: ../src/proxy.c:57 msgid "general failure" msgstr "Falla general" #: ../src/proxy.c:58 msgid "connection not allowed by ruleset" msgstr "Conexión no permitida por reglas habilitadas" #: ../src/proxy.c:59 msgid "network unreachable" msgstr "Red no existente" #: ../src/proxy.c:60 msgid "host unreachable" msgstr "No se puede encontrar el servidor " #: ../src/proxy.c:61 msgid "connection refused by destination host" msgstr "Conexión rechazada por destino" #: ../src/proxy.c:62 msgid "TTL expired" msgstr "TTL expirado" #: ../src/proxy.c:63 msgid "command not supported / protocol error" msgstr "Comando no soportado / error de protocolo" #: ../src/proxy.c:64 msgid "address type not supported" msgstr "Tipo de dirección no soportado" #: ../src/proxy.c:239 ../src/proxy.c:661 #, c-format msgid "Connected to proxy server %s port %s, sending request..." msgstr "Conectado al servidor proxy %s en el puerto %s, enviando pedido..." #: ../src/proxy.c:294 ../src/proxy.c:423 ../src/proxy.c:468 ../src/proxy.c:542 #: ../src/proxy.c:708 msgid "Error while reading from proxy host." msgstr "Error al leer del servidor proxy. " #: ../src/proxy.c:315 msgid "request rejected or failed" msgstr "Pedido rechazado o fallido" #: ../src/proxy.c:319 msgid "request failed because identd could not be reached" msgstr "Pedido fallido debido a que identd no pudo ser encontrado" #: ../src/proxy.c:323 msgid "" "request failed because client's identd could not confirm the user ID string " "in the request" msgstr "" "Pedido fallido debido a que el identd del cliente no pudo confirmar el ID de " "usuario en el pedido" #: ../src/proxy.c:327 ../src/proxy.c:568 ../src/proxy.c:724 #, c-format msgid "Proxy request failed: %s." msgstr "Pedido de proxy fallido: %s." #: ../src/proxy.c:344 #, c-format msgid "Connected to proxy server %s port %s, negotiating authentication..." msgstr "" "Conectado al puerto %s del servidor proxy %s, negociando autenticación..." #: ../src/proxy.c:438 msgid "No acceptable proxy authentication methods." msgstr "No existen métidos de autenticación de proxy aceptables." #: ../src/proxy.c:486 msgid "Proxy authentication failed." msgstr "" #. Should never happen #: ../src/proxy.c:529 msgid "Unrecognized response from proxy host." msgstr "" #: ../src/proxy.c:563 msgid "unknown reason code" msgstr "Código de razón desconocida" #: ../src/proxy.c:584 #, c-format msgid "Sending proxy authentication credentials..." msgstr "" #: ../src/proxy.c:623 #, c-format msgid "Sending connection request..." msgstr "Enviando pedido de conexión..." #: ../src/mainwindow.c:162 ../src/mainwindow.c:608 ../src/mainwindow.c:874 #: ../src/worldgui.c:1132 ../src/worldselector.c:186 ../src/worldeditor.c:178 #: ../src/we_general.c:334 ../src/we_generic_guied.c:81 ../src/we_triggers.c:83 #: ../src/we_triggers.c:553 ../src/we_triggers.c:744 ../src/we_aliases.c:76 #: ../src/we_aliases.c:455 ../src/we_macros.c:79 ../src/we_macros.c:420 #: ../src/we_timers.c:76 ../src/we_timers.c:458 ../src/we_hooks.c:87 #: ../src/we_hooks.c:620 ../src/we_vars.c:76 ../src/we_vars.c:362 #: ../src/prefs.c:106 ../src/triggers.c:277 ../src/multilinesend.c:92 #: ../src/cmdhistory.c:209 ../src/cmdhistory.c:439 #, c-format msgid "Error loading UI from XML file: %s" msgstr "" #: ../src/mainwindow.c:668 ../src/mainwindow.c:669 msgid "Not connected" msgstr "No conectado(a)" #: ../src/mainwindow.c:810 msgid ": Not yet active" msgstr ": Todavía inactivo" #: ../src/mainwindow.c:815 msgid ": Expired" msgstr ": Expirado" #: ../src/mainwindow.c:829 ../src/kildclient.ui:1898 #: ../src/dlgStatistics.ui:114 ../src/dlgStatistics.ui:327 msgid "None" msgstr "Ninguno(a)" #: ../src/worldgui.c:229 msgid "_Find:" msgstr "_Encontrar:" #: ../src/worldgui.c:243 ../src/wndmain.ui:216 ../src/wndmain.ui:272 #: ../src/dlgCmdHistory.ui:195 msgid "Find n_ext" msgstr "Encontrar si_guiente" #: ../src/worldgui.c:270 msgid "Click to clear the command input area." msgstr "" #: ../src/worldgui.c:376 msgid "No world" msgstr "No hay mundo" #: ../src/worldgui.c:425 msgid "KildClient ready" msgstr "KildClient listo" #: ../src/worldgui.c:435 msgid "0 lines" msgstr "0 líneas" #: ../src/worldgui.c:895 msgid "Are you sure you want to close this world?" msgstr "¿Está seguro que quiere cerrar este mundo?" #: ../src/worldgui.c:896 msgid "Really close?" msgstr "¿Realmente cerrar?" #: ../src/worldgui.c:898 msgid "Keep _open" msgstr "Mantener _abierto" #: ../src/worldgui.c:899 ../src/worldselector.c:799 ../src/worldselector.c:805 #: ../src/wndmain.ui:82 ../src/dlgPreferences.ui:155 #: ../src/dlgTestTriggers.ui:41 ../src/dlgCmdHistory.ui:125 msgid "_Close" msgstr "_Cerrar" #: ../src/worldgui.c:1064 #, c-format msgid "Error setting spell checker: %s\n" msgstr "Error configurando corrector ortográfico: %s\n" #: ../src/worldgui.c:1318 msgid "Click to open link; right-click for more options." msgstr "Dar clic para abrir vínculo; clic de la derecha para más opciones." #: ../src/worldgui.c:1484 msgid "Not found" msgstr "No encontrado(a)" #: ../src/ansitextview.c:429 #, c-format msgid "%d line" msgid_plural "%d lines" msgstr[0] "%d línea" msgstr[1] "%d líneas" #: ../src/worldselector.c:135 ../src/worldselector.c:677 #, c-format msgid "Could not load world from file '%s': %s" msgstr "No se pudo cargar mundo de archivo '%s': %s" #: ../src/worldselector.c:487 #, c-format msgid "Could not open world '%s': %s\n" msgstr "No se pudo abrir mundo '%s': %s\n" #: ../src/worldselector.c:530 #, c-format msgid "Invalid argument '%s'\n" msgstr "Argumento inválido '%s'\n" #: ../src/worldselector.c:793 msgid "Disconnected" msgstr "Desconectado(a)" #: ../src/worldselector.c:796 ../src/worldselector.c:803 ../src/wndmain.ui:58 msgid "_Reconnect" msgstr "_Reconectar" #: ../src/worldselector.c:797 ../src/worldselector.c:804 msgid "Connect to _another world" msgstr "Conectar a otro _mundo" #: ../src/worldselector.c:798 msgid "_Offline" msgstr "_Desconectado(a)" #: ../src/worlds.c:772 msgid "Unnamed world" msgstr "Mundo sin nombre" #: ../src/worlds.c:829 ../src/worlds.c:2346 ../src/we_generic_guied.c:311 #: ../src/prefs.c:431 #, c-format msgid "Could not open file '%s': %s" msgstr "No se pudo abrir archivo '%s': %s" #: ../src/worlds.c:892 #, c-format msgid "Invalid top-level element '%s'" msgstr "" #: ../src/worlds.c:1695 #, c-format msgid "Internal error: element '%s' ends when in START mode" msgstr "" #: ../src/worlds.c:1964 #, c-format msgid "Invalid key code '%s'" msgstr "" #: ../src/worlds.c:1983 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "" #: ../src/worlds.c:1996 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "" #: ../src/worlds.c:2503 #, c-format msgid "Disconnected from world %s" msgstr "" #: ../src/worldeditor.c:239 msgid "General" msgstr "General" #: ../src/worldeditor.c:247 ../src/worldeditor.c:251 msgid "Display" msgstr "" #: ../src/worldeditor.c:248 msgid "Here you can set options to configure the appearance of KildClient." msgstr "" #: ../src/worldeditor.c:259 msgid "Main window" msgstr "Ventana principal" #: ../src/worldeditor.c:267 msgid "Colors" msgstr "Colores" #: ../src/worldeditor.c:275 msgid "Status bar" msgstr "Barra de estado" #: ../src/worldeditor.c:283 msgid "Input" msgstr "Ingreso" #: ../src/worldeditor.c:291 msgid "Logging" msgstr "" #: ../src/worldeditor.c:297 ../src/worldeditor.c:301 msgid "Automation" msgstr "Automatización" #: ../src/worldeditor.c:298 msgid "" "Here you can set options to configure the automation features of KildClient, " "such as triggers, aliases, plugins, etc." msgstr "" #: ../src/worldeditor.c:309 msgid "Scripting" msgstr "Scripting" #: ../src/worldeditor.c:317 msgid "Plugins" msgstr "" #: ../src/worldeditor.c:328 msgid "Triggers" msgstr "Triggers" #: ../src/worldeditor.c:339 msgid "Aliases" msgstr "Aliases" #: ../src/worldeditor.c:350 msgid "Macros" msgstr "Macros" #: ../src/worldeditor.c:361 msgid "Timers" msgstr "Temporizadores" #: ../src/worldeditor.c:372 msgid "Hooks" msgstr "Hooks" #: ../src/worldeditor.c:383 msgid "Variables" msgstr "Variables" #: ../src/worldeditor.c:392 msgid "Protocols" msgstr "Protocolos" #: ../src/worldeditor.c:400 msgid "Advanced" msgstr "Avanzado" #: ../src/we_general.c:73 msgid "Character" msgstr "Caracter" #: ../src/we_general.c:81 msgid "Password" msgstr "Contraseña" #: ../src/we_general.c:373 msgid "You must specify the name." msgstr "Se tiene que especificar el nombre." #: ../src/we_general.c:380 msgid "You must specify the password." msgstr "Se tiene que especificar la contraseña." #: ../src/we_general.c:418 msgid "character" msgstr "caracter" #: ../src/we_logging.c:110 ../src/log.c:104 #, c-format msgid "Logging to file %s." msgstr "" #: ../src/we_logging.c:116 msgid "Logging is disabled." msgstr "" #: ../src/we_logging.c:209 msgid "Logging not started" msgstr "" #: ../src/we_logging.c:238 msgid "Select log file" msgstr "" #: ../src/we_logging.c:241 ../src/we_plugins.c:574 ../src/we_generic_guied.c:97 #: ../src/we_generic_guied.c:364 ../src/kildclient.ui:64 #: ../src/kildclient.ui:342 ../src/kildclient.ui:559 ../src/kildclient.ui:682 #: ../src/kildclient.ui:865 ../src/kildclient.ui:1069 ../src/kildclient.ui:1369 #: ../src/kildclient.ui:1943 ../src/dlgSelectWorld.ui:43 #: ../src/dlgEditWorld.ui:132 ../src/dlgMLSend.ui:54 #: ../src/dlgCmdHistory.ui:348 msgid "_Cancel" msgstr "_Cancelar" #: ../src/we_logging.c:243 ../src/kildclient.ui:78 ../src/kildclient.ui:356 #: ../src/kildclient.ui:573 ../src/kildclient.ui:696 ../src/kildclient.ui:879 #: ../src/kildclient.ui:1083 ../src/kildclient.ui:1383 #: ../src/kildclient.ui:1957 ../src/dlgStatistics.ui:40 #: ../src/dlgEditWorld.ui:146 ../src/dlgCmdHistory.ui:362 msgid "_OK" msgstr "_OK" #: ../src/we_plugins.c:124 ../src/we_plugins.c:336 ../src/we_triggers.c:225 #: ../src/we_aliases.c:206 ../src/we_macros.c:209 ../src/we_timers.c:206 #: ../src/we_hooks.c:341 ../src/perlscript.c:3429 msgid "Name" msgstr "Nombre" #: ../src/we_plugins.c:136 ../src/we_plugins.c:378 ../src/perlscript.c:3430 msgid "Description" msgstr "Descripción" #: ../src/we_plugins.c:148 ../src/we_plugins.c:364 msgid "Author" msgstr "Autor" #: ../src/we_plugins.c:161 msgid "File" msgstr "Archivo" #: ../src/we_plugins.c:205 ../src/we_plugins.c:457 msgid "Error loading plugin" msgstr "" #: ../src/we_plugins.c:322 ../src/we_triggers.c:211 ../src/we_aliases.c:192 #: ../src/we_macros.c:195 ../src/we_timers.c:192 ../src/we_hooks.c:327 msgid "Enabled" msgstr "Habilitado(a)" #: ../src/we_plugins.c:350 msgid "Version" msgstr "Versión" #: ../src/we_plugins.c:439 msgid "Always load this plugin at _startup" msgstr "" #: ../src/we_plugins.c:497 msgid "The help is displayed in main window." msgstr "" #: ../src/we_plugins.c:498 msgid "KildClient information" msgstr "Información de KildClient" #: ../src/we_plugins.c:499 msgid "_Do not display this message again" msgstr "_No mostrar este mensaje nuevamente" #: ../src/we_plugins.c:571 msgid "Load plugin" msgstr "" #: ../src/we_plugins.c:576 ../src/we_generic_guied.c:366 msgid "_Open" msgstr "_Abrir" #: ../src/we_generic_guied.c:94 msgid "Export" msgstr "Exportar" #: ../src/we_generic_guied.c:99 ../src/wndmain.ui:104 msgid "_Save" msgstr "_Guardar" #: ../src/we_generic_guied.c:361 msgid "Import" msgstr "Importar" #: ../src/we_generic_guied.c:393 #, c-format msgid "Could not import file '%s': %s" msgstr "" #: ../src/we_generic_guied.c:948 #, fuzzy, c-format msgid "Do you really want to delete the %1$s?" msgid_plural "Do you really want to delete %2$d %1$s?" msgstr[0] "¿Realmente quiere crear la variable momentáneamente?" msgstr[1] "¿Realmente quiere crear la variable momentáneamente?" #: ../src/we_generic_guied.c:952 ../src/we_vars.c:282 msgid "Confirm deletion" msgstr "Confirmar borrado" #: ../src/we_generic_guied.c:954 msgid "Do _not delete" msgstr "_No borrar" #: ../src/we_generic_guied.c:955 ../src/kildclient.ui:1736 #: ../src/wndmain.ui:194 ../src/dlgSelectWorld.ui:151 #: ../src/dlgEditWorld.ui:634 ../src/dlgEditWorld.ui:3290 msgid "_Delete" msgstr "_Borrar" #: ../src/we_triggers.c:130 msgid "_Test triggers" msgstr "" #: ../src/we_triggers.c:239 ../src/we_aliases.c:220 ../src/triggers.c:140 #: ../src/aliases.c:176 msgid "Pattern" msgstr "Patrón" #: ../src/we_triggers.c:257 ../src/we_aliases.c:238 msgid "Ig. case" msgstr "Ig. caso" #: ../src/we_triggers.c:271 ../src/we_macros.c:237 ../src/we_timers.c:246 #: ../src/we_hooks.c:355 ../src/triggers.c:141 ../src/macros.c:145 #: ../src/timers.c:202 msgid "Action" msgstr "Acción" #: ../src/we_triggers.c:289 msgid "Gag" msgstr "" #: ../src/we_triggers.c:307 msgid "Gag log" msgstr "" #: ../src/we_triggers.c:325 msgid "Keep exec" msgstr "" #: ../src/we_triggers.c:343 msgid "Rewriter" msgstr "" #: ../src/we_triggers.c:361 msgid "Style" msgstr "Estilo" #: ../src/we_triggers.c:375 ../src/we_aliases.c:284 ../src/we_macros.c:251 #: ../src/we_timers.c:278 ../src/we_hooks.c:369 msgid "Plugin" msgstr "" #: ../src/we_triggers.c:470 ../share/kildclient.pl:803 #: ../share/kildclient.pl:865 msgid "trigger" msgid_plural "triggers" msgstr[0] "" msgstr[1] "" #: ../src/we_triggers.c:635 ../src/we_aliases.c:516 msgid "You must specify the pattern." msgstr "Se tiene que especificar el patrón." #: ../src/we_triggers.c:643 msgid "" "You must specify the action, unless the trigger is a gag or changes the " "style." msgstr "" #: ../src/we_aliases.c:252 ../src/aliases.c:177 msgid "Substitution" msgstr "Substitución" #: ../src/we_aliases.c:270 msgid "Eval as Perl" msgstr "Evaluar como Perl" #: ../src/we_aliases.c:379 ../share/kildclient.pl:815 #: ../share/kildclient.pl:866 msgid "alias" msgid_plural "aliases" msgstr[0] "alias" msgstr[1] "aliases" #: ../src/we_aliases.c:523 msgid "You must specify the substitution." msgstr "Se tiene que especificar la substitución." #: ../src/we_macros.c:223 ../src/macros.c:144 msgid "Key" msgstr "Clave" #: ../src/we_macros.c:346 ../share/kildclient.pl:827 ../share/kildclient.pl:867 msgid "macro" msgid_plural "macros" msgstr[0] "macro" msgstr[1] "macros" #: ../src/we_macros.c:476 msgid "You must specify the key." msgstr "Se tiene que especificar la clave." #: ../src/we_macros.c:483 msgid "Invalid key code." msgstr "Código de clave inválido." #: ../src/we_macros.c:490 ../src/we_timers.c:523 ../src/we_hooks.c:671 msgid "You must specify the action." msgstr "Se tiene que especificar la acción." #: ../src/we_timers.c:219 msgid "Interval" msgstr "Intervalo" #: ../src/we_timers.c:232 msgid "Count" msgstr "Cuenta" #: ../src/we_timers.c:264 msgid "Temp" msgstr "Temp" #: ../src/we_timers.c:380 ../share/kildclient.pl:839 ../share/kildclient.pl:868 msgid "timer" msgid_plural "timers" msgstr[0] "temporizador" msgstr[1] "temporizadores" #: ../src/we_timers.c:516 msgid "The interval must be positive." msgstr "" #. The manually added combo for selecting which hook #: ../src/we_hooks.c:130 msgid "_Event:" msgstr "E_vento:" #: ../src/we_hooks.c:546 ../share/kildclient.pl:852 ../share/kildclient.pl:869 msgid "hook" msgid_plural "hooks" msgstr[0] "" msgstr[1] "" #: ../src/we_vars.c:278 #, fuzzy, c-format msgid "Do you really want to make the variable temporary?" msgid_plural "Do you really want to make %d variables temporary?" msgstr[0] "¿Realmente quiere crear la variable momentáneamente?" msgstr[1] "¿Realmente quiere crear la variable momentáneamente?" #: ../src/we_vars.c:284 msgid "Keep _permanent" msgstr "Mantener como _permanente" #: ../src/we_vars.c:285 msgid "Make _temporary" msgstr "Crear _momentáneamente" #: ../src/we_vars.c:389 msgid "You must specify a variable name." msgstr "Se tiene que especificar un nombre de variable." #: ../src/we_vars.c:395 #, c-format msgid "" "Only scalar ($), array (@) and hash (%%) variables can be made permanent." msgstr "" #: ../src/we_vars.c:408 #, c-format msgid "%s is already permanent." msgstr "%s ya es permanente." #: ../src/prefs.c:387 #, c-format msgid "Invalid window size specification in config file.\n" msgstr "" #: ../src/prefs.c:407 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "" #: ../src/prefs.c:501 #, c-format msgid "Could not create directory '%s': %s" msgstr "No se puede crear el directorio '%s': %s" #: ../src/parser.c:211 msgid "" "Warning: Trying to send a very long command line. Perhaps a recursive alias " "definition?" msgstr "" #: ../src/triggers.c:139 #, c-format msgid "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" msgstr "" #: ../src/triggers.c:161 ../src/triggers.c:162 ../src/triggers.c:163 #: ../src/triggers.c:164 ../src/triggers.c:165 ../src/triggers.c:166 #: ../src/triggers.c:167 ../src/aliases.c:197 ../src/aliases.c:198 #: ../src/aliases.c:199 ../src/macros.c:167 ../src/timers.c:225 #: ../src/timers.c:226 ../src/hooks.c:206 ../src/perlscript.c:3449 msgid "y" msgstr "Sí (y)" #: ../src/triggers.c:161 ../src/triggers.c:162 ../src/triggers.c:163 #: ../src/triggers.c:164 ../src/triggers.c:165 ../src/triggers.c:166 #: ../src/triggers.c:167 ../src/aliases.c:197 ../src/aliases.c:198 #: ../src/aliases.c:199 ../src/macros.c:167 ../src/timers.c:225 #: ../src/timers.c:226 ../src/hooks.c:206 ../src/perlscript.c:3449 msgid "n" msgstr "No (n)" #: ../src/triggers.c:361 ../src/kildclient.ui:1918 msgid "No" msgstr "No" #: ../src/triggers.c:361 ../src/kildclient.ui:1921 msgid "Yes" msgstr "Sí" #: ../src/aliases.c:175 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "" #: ../src/macros.c:143 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "" #: ../src/timers.c:194 msgid "Num Ena Temp Int " msgstr "" #: ../src/timers.c:198 msgid "Count " msgstr "Contar" #: ../src/permanentvariables.c:115 #, c-format msgid "" "Could not open file '%s': %s\n" "Variables were not saved." msgstr "" #: ../src/hooks.c:60 ../src/hooks.c:442 #, c-format msgid "hook: Invalid event '%s'\n" msgstr "hook: Evento inválido '%s'\n" #: ../src/hooks.c:76 ../src/hooks.c:225 ../share/kildclient.pl:885 msgid "No such hook" msgstr "" #: ../src/hooks.c:191 #, c-format msgid "Hooks for '%s':\n" msgstr "" #: ../src/hooks.c:192 msgid "Num Ena Action" msgstr "" #: ../src/hooks.c:230 #, c-format msgid "" "Hook number %d for event %s\n" " Name: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" #: ../src/hooks.c:236 ../src/perlscript.c:1769 ../src/perlscript.c:2272 #: ../src/perlscript.c:2582 ../src/perlscript.c:2870 msgid "Not set" msgstr "" #: ../src/hooks.c:238 ../src/perlscript.c:1772 ../src/perlscript.c:1773 #: ../src/perlscript.c:1774 ../src/perlscript.c:1775 ../src/perlscript.c:1776 #: ../src/perlscript.c:1777 ../src/perlscript.c:1778 ../src/perlscript.c:2275 #: ../src/perlscript.c:2276 ../src/perlscript.c:2277 ../src/perlscript.c:2585 #: ../src/perlscript.c:2874 ../src/perlscript.c:2875 ../src/perlscript.c:3487 msgid "yes" msgstr "sí" #: ../src/hooks.c:238 ../src/perlscript.c:1772 ../src/perlscript.c:1773 #: ../src/perlscript.c:1774 ../src/perlscript.c:1775 ../src/perlscript.c:1776 #: ../src/perlscript.c:1777 ../src/perlscript.c:1778 ../src/perlscript.c:2275 #: ../src/perlscript.c:2276 ../src/perlscript.c:2277 ../src/perlscript.c:2585 #: ../src/perlscript.c:2874 ../src/perlscript.c:2875 ../src/perlscript.c:3487 msgid "no" msgstr "no" #: ../src/log.c:121 msgid "File name not specified." msgstr "Nombre de archivo no especificado." #: ../src/log.c:187 #, c-format msgid "Could not open log file: %s." msgstr "No se pudo abrir el archivo de texto: %s." #: ../src/plugins.c:101 ../src/plugins.c:160 #, c-format msgid "Failed loading file %s: %s" msgstr "No se pudo cargar el archivo %s: %s" #: ../src/cmdhistory.c:273 msgid "No command selected." msgstr "No se seleccionó ningún comando." #: ../src/cmdhistory.c:277 msgid "More than one command selected." msgstr "Hay más de un comando seleccionado." #: ../src/cmdhistory.c:466 msgid "Enter some text to search for." msgstr "Ingresar parte del texto a buscar." #: ../src/cmdhistory.c:491 msgid "Use the Find button to find the first result." msgstr "Usar el botón Encontrar (\"Find\") para encontrar el primer resultado." #: ../src/cmdhistory.c:540 msgid "Command not found." msgstr "Comando no encontrado." #: ../src/util.c:180 msgid "KildClient error" msgstr "Error de KildClient" #: ../src/perlscript.c:509 ../src/perlscript.c:515 ../src/perlscript.c:522 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "" #: ../src/perlscript.c:706 ../src/perlscript.c:723 ../src/perlscript.c:785 #: ../src/perlscript.c:818 ../src/perlscript.c:1224 ../src/perlscript.c:1287 #: ../src/perlscript.c:1389 ../src/perlscript.c:1409 ../src/perlscript.c:1433 #: ../src/perlscript.c:1461 ../src/perlscript.c:1470 ../src/perlscript.c:2010 #: ../src/perlscript.c:2019 ../src/perlscript.c:2198 ../src/perlscript.c:2373 #: ../src/perlscript.c:2382 ../src/perlscript.c:2661 ../src/perlscript.c:2670 #: ../src/perlscript.c:2945 ../src/perlscript.c:2999 ../src/perlscript.c:3044 #: ../src/perlscript.c:3109 ../src/perlscript.c:3120 ../src/perlscript.c:3212 #: ../src/perlscript.c:3536 ../src/kcwin.c:96 #, c-format msgid "%s: Too few arguments" msgstr "%s: Demasiados argumentos." #: ../src/perlscript.c:751 #, c-format msgid "%s: Argument must be numeric" msgstr "%s: El argumento tiene que ser numérico" #: ../src/perlscript.c:799 ../src/perlscript.c:831 #, c-format msgid "%s: No such world" msgstr "%s: No existe tal mundo" #: ../src/perlscript.c:866 msgid "World saved." msgstr "Mundo guardado." #: ../src/perlscript.c:1120 ../src/perlscript.c:1135 ../src/perlscript.c:1145 #: ../src/perlscript.c:1345 ../share/kildclient.pl:1324 #, c-format, perl-format msgid "%s: This is an internal function, do not call directly." msgstr "%s: Esta es una función interna, no llamarla directamente." #: ../src/perlscript.c:1124 ../src/perlscript.c:1592 ../src/perlscript.c:2121 #: ../src/perlscript.c:2497 ../src/perlscript.c:2691 ../src/perlscript.c:3173 #, c-format msgid "%s: Wrong argument type" msgstr "%s: Tipo de argumento incorrecto" #: ../src/perlscript.c:1355 ../src/perlscript.c:1361 #, c-format msgid "Protocol %s not enabled." msgstr "Protocolo %s no habilitado." #: ../src/perlscript.c:1366 ../share/kildclient.pl:1166 msgid "Unknown protocol" msgstr "Protocolo desconocido" #: ../src/perlscript.c:1484 ../src/perlscript.c:1752 ../share/kildclient.pl:881 msgid "No such trigger" msgstr "" #: ../src/perlscript.c:1502 ../src/perlscript.c:2051 ../src/perlscript.c:2426 #: ../src/perlscript.c:3132 #, c-format msgid "%s: Too many string arguments" msgstr "" #: ../src/perlscript.c:1525 ../src/perlscript.c:2074 #, c-format msgid "%s: Pattern given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:1537 ../src/perlscript.c:2475 ../src/perlscript.c:3152 #, c-format msgid "%s: Action given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:1583 ../src/perlscript.c:2112 ../src/perlscript.c:2488 #: ../src/perlscript.c:3165 #, c-format msgid "%s: Wrong type of reference" msgstr "" #: ../src/perlscript.c:1603 #, c-format msgid "%s: Pattern not specified, not creating" msgstr "" #: ../src/perlscript.c:1612 #, c-format msgid "%s: Action not specified, and isn't gag, not creating" msgstr "" #: ../src/perlscript.c:1641 msgid "Trigger added." msgstr "" #: ../src/perlscript.c:1646 msgid "Trigger modified." msgstr "" #: ../src/perlscript.c:1671 #, c-format msgid "%s: Invalid target" msgstr "" #: ../src/perlscript.c:1681 #, c-format msgid "%s: Invalid fg color" msgstr "" #: ../src/perlscript.c:1691 #, c-format msgid "%s: Invalid bg color" msgstr "" #: ../src/perlscript.c:1701 #, c-format msgid "%s: Invalid underline style" msgstr "" #: ../src/perlscript.c:1757 #, 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:1781 #, 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:2033 ../src/perlscript.c:2259 ../share/kildclient.pl:882 msgid "No such alias" msgstr "Alias no existente" #: ../src/perlscript.c:2086 #, c-format msgid "%s: Substitution given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:2132 msgid "alias: Not creating alias without pattern" msgstr "" #: ../src/perlscript.c:2140 msgid "alias: Not creating alias without substitution" msgstr "" #: ../src/perlscript.c:2168 msgid "Alias added." msgstr "Alias agregado." #: ../src/perlscript.c:2173 msgid "Alias modified." msgstr "Alias modificado." #: ../src/perlscript.c:2264 #, 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:2344 msgid "Press a key to get its keycode." msgstr "Presione una tecla para ver su código de clave." #: ../src/perlscript.c:2396 ../src/perlscript.c:2570 ../share/kildclient.pl:883 msgid "No such macro" msgstr "Macro no existente" #: ../src/perlscript.c:2415 ../src/perlscript.c:2463 #, c-format msgid "%s: Invalid key code" msgstr "%s: Código de clave inválido" #: ../src/perlscript.c:2452 #, c-format msgid "%s: Keycode given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:2508 #, c-format msgid "%s: Keycode not specified, not creating" msgstr "" #: ../src/perlscript.c:2515 ../src/perlscript.c:2782 #, c-format msgid "%s: Action not specified, not creating" msgstr "" #: ../src/perlscript.c:2534 msgid "Macro added." msgstr "Macro agregado." #: ../src/perlscript.c:2539 msgid "Macro modified." msgstr "Macro modificado." #: ../src/perlscript.c:2576 #, c-format msgid "" "Macro number %d\n" " Name: %s\n" " Key code: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" #: ../src/perlscript.c:2685 ../src/perlscript.c:2857 ../share/kildclient.pl:884 msgid "No such timer" msgstr "Temporizador no existente" #: ../src/perlscript.c:2710 #, c-format msgid "%s: Interval must be numeric" msgstr "%s: Intervalo tiene que ser numérico" #: ../src/perlscript.c:2723 #, c-format msgid "%s: Count must be numeric" msgstr "%s: Contador tiene que ser numérico" #: ../src/perlscript.c:2754 #, c-format msgid "%s: Interval not specified, not creating" msgstr "%s: Intervalo no especificado, no creado" #: ../src/perlscript.c:2761 #, c-format msgid "%s: Cannot create timer with negative interval" msgstr "%s: No se puede crear temporizador con intervalo negativo" #: ../src/perlscript.c:2822 msgid "Timer added." msgstr "Temporizador agregado." #: ../src/perlscript.c:2827 msgid "Timer modified." msgstr "Temporizador modificado." #: ../src/perlscript.c:2862 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %.3f\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" #: ../src/perlscript.c:2953 #, c-format msgid "" "%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent" msgstr "" #: ../src/perlscript.c:2962 #, c-format msgid "%s: %s is already permanent" msgstr "" #: ../src/perlscript.c:2976 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "" #: ../src/perlscript.c:3018 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "" #: ../src/perlscript.c:3022 #, c-format msgid "%s: %s is not permanent" msgstr "" #: ../src/perlscript.c:3075 msgid "Permanent variables" msgstr "Variables permanentes" #: ../src/perlscript.c:3187 msgid "Hook defined." msgstr "Gancho definido." #: ../src/perlscript.c:3191 msgid "Hook modified." msgstr "Gancho modificado." #: ../src/perlscript.c:3296 msgid "Logging stopped." msgstr "" #: ../src/perlscript.c:3428 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "" #: ../src/perlscript.c:3471 msgid "No such plugin" msgstr "" #: ../src/perlscript.c:3476 #, 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.ui:48 msgid "Edit timer" msgstr "Editar temporizador" #: ../src/kildclient.ui:107 ../src/kildclient.ui:385 ../src/kildclient.ui:602 #: ../src/kildclient.ui:747 ../src/kildclient.ui:908 ../src/kildclient.ui:1112 #: ../src/dlgEditWorld.ui:229 ../src/dlgEditWorld.ui:2855 msgid "_Name:" msgstr "_Nombre:" #: ../src/kildclient.ui:120 msgid "Enter optionally a descriptive name for the timer" msgstr "" #: ../src/kildclient.ui:132 msgid "_Interval:" msgstr "_Intervalo:" #: ../src/kildclient.ui:149 msgid "Specify the interval, in seconds, between timer activations" msgstr "" #: ../src/kildclient.ui:165 msgid "seconds" msgstr "segundos" #: ../src/kildclient.ui:183 msgid "_Repeat count:" msgstr "" #: ../src/kildclient.ui:200 msgid "" "Specify how many times this timer should run before being disabled or deleted" msgstr "" #: ../src/kildclient.ui:215 msgid "(-1 to repeat indefinitely)" msgstr "" #: ../src/kildclient.ui:233 ../src/kildclient.ui:772 ../src/kildclient.ui:970 #: ../src/kildclient.ui:1173 msgid "_Action:" msgstr "_Acción:" #: ../src/kildclient.ui:246 msgid "Enter the action to be executed whenever the timer fires" msgstr "" #: ../src/kildclient.ui:256 msgid "" "_Temporary (will be deleted automatically when its repeat count reaches 0)" msgstr "" #: ../src/kildclient.ui:259 msgid "Check to have the timer deleted after its repeat count has reached 0" msgstr "" #: ../src/kildclient.ui:271 ../src/kildclient.ui:485 ../src/kildclient.ui:795 #: ../src/kildclient.ui:993 ../src/kildclient.ui:1297 msgid "_Enabled" msgstr "_Habilitado" #: ../src/kildclient.ui:274 msgid "Check to make the timer enabled; only enabled timers are run" msgstr "" #: ../src/kildclient.ui:287 ../src/kildclient.ui:501 ../src/kildclient.ui:811 #: ../src/kildclient.ui:1009 ../src/kildclient.ui:1313 msgid "Note:" msgstr "Nota:" #: ../src/kildclient.ui:299 ../src/kildclient.ui:513 ../src/kildclient.ui:823 #: ../src/kildclient.ui:1021 ../src/kildclient.ui:1325 msgid "" "This object belongs to a plugin. Changes made here will not be saved " "in the plugin." msgstr "" #: ../src/kildclient.ui:326 msgid "Edit alias" msgstr "Editar alias" #: ../src/kildclient.ui:398 msgid "Enter optionally a descriptive name for the alias" msgstr "" #: ../src/kildclient.ui:410 ../src/kildclient.ui:1136 msgid "_Pattern:" msgstr "_Patrón:" #: ../src/kildclient.ui:423 msgid "Enter the pattern to match against typed commands" msgstr "" #: ../src/kildclient.ui:433 ../src/kildclient.ui:1159 msgid "_Ignore case when matching" msgstr "" #: ../src/kildclient.ui:447 msgid "_Substitution:" msgstr "_Substitución:" #: ../src/kildclient.ui:460 msgid "Enter the substitution to be executed" msgstr "" #: ../src/kildclient.ui:470 msgid "E_val substitution as Perl statement" msgstr "" #: ../src/kildclient.ui:473 msgid "Check to have the substitution be executed in a s///e construction" msgstr "" #: ../src/kildclient.ui:488 msgid "Check to make the alias enabled; only enabled aliases are tried" msgstr "" #: ../src/kildclient.ui:543 msgid "Edit character information" msgstr "Editar información de caracter" #: ../src/kildclient.ui:615 msgid "Enter the character's name for automatic login" msgstr "" #: ../src/kildclient.ui:627 msgid "_Password:" msgstr "Contr_aseña:" #: ../src/kildclient.ui:640 msgid "Enter the character's password for automatic login" msgstr "" #: ../src/kildclient.ui:666 msgid "Edit hook" msgstr "Editar gancho" #: ../src/kildclient.ui:725 msgid "Event:" msgstr "Evento:" #: ../src/kildclient.ui:760 msgid "Enter optionally a descriptive name for the hook" msgstr "" #: ../src/kildclient.ui:785 msgid "Enter the action to be run when the event happens" msgstr "" #: ../src/kildclient.ui:798 msgid "Check to make the hook enabled; only enabled hooks are run" msgstr "" #: ../src/kildclient.ui:850 msgid "Edit macro" msgstr "Editar macro" #: ../src/kildclient.ui:921 msgid "Enter optionally a descriptive name for the macro" msgstr "" #: ../src/kildclient.ui:933 msgid "_Key:" msgstr "C_lave:" #: ../src/kildclient.ui:946 msgid "Press the key that will be used to run the macro" msgstr "" #: ../src/kildclient.ui:958 msgid "" "Press the key that will be used to activate the macro while the cursor is in " "the text box." msgstr "" #: ../src/kildclient.ui:983 msgid "Enter the action to be run when the key is pressed" msgstr "" #: ../src/kildclient.ui:996 msgid "Check to make the macro enabled; only enabled macros are run" msgstr "" #: ../src/kildclient.ui:1050 ../src/kildclient.ui:1927 msgid "Enter optionally a descriptive name for the trigger" msgstr "" #: ../src/kildclient.ui:1052 msgid "Edit trigger" msgstr "Editar temporizador" #: ../src/kildclient.ui:1149 msgid "Enter the pattern to match against received lines" msgstr "" #: ../src/kildclient.ui:1186 msgid "Enter the action that will be run when a match happens" msgstr "" #: ../src/kildclient.ui:1196 msgid "Omit (_gag) from output" msgstr "" #: ../src/kildclient.ui:1199 msgid "Check to make the matched line not be printed in the main output window" msgstr "" #: ../src/kildclient.ui:1211 msgid "Omit (gag) from _log file" msgstr "" #: ../src/kildclient.ui:1214 msgid "Check to make the matched line not be printed in the log file" msgstr "" #: ../src/kildclient.ui:1226 msgid "_Keep executing other triggers after this this one matches" msgstr "" #: ../src/kildclient.ui:1229 msgid "" "Check to make this trigger not prevent further triggers from being tried, if " "it matches" msgstr "" #: ../src/kildclient.ui:1241 msgid "_Rewriter trigger" msgstr "" #: ../src/kildclient.ui:1244 msgid "Check to make this trigger a rewriter trigger" msgstr "" #: ../src/kildclient.ui:1260 msgid "C_hange style" msgstr "Cambiar _estilo" #: ../src/kildclient.ui:1275 msgid "C_onfigure..." msgstr "Con_figurar..." #: ../src/kildclient.ui:1300 msgid "Check to make the trigger enabled; only enabled triggers are tried" msgstr "" #: ../src/kildclient.ui:1355 msgid "Permenent variable" msgstr "Variable Permanente" #: ../src/kildclient.ui:1411 msgid "_Name of variable to make permanent:" msgstr "" #: ../src/kildclient.ui:1425 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.ui:1467 msgid "_Triggers" msgstr "_Triggers" #: ../src/kildclient.ui:1480 msgid "_Aliases" msgstr "_Aliases" #: ../src/kildclient.ui:1493 msgid "_Macros" msgstr "_Macros" #: ../src/kildclient.ui:1506 msgid "T_imers" msgstr "Tempor_izadores" #: ../src/kildclient.ui:1519 msgid "_Permanent variables" msgstr "Variables _permanentes" #: ../src/kildclient.ui:1532 msgid "OnCo_nnect hooks" msgstr "Ganchos AlCo_nectar" #: ../src/kildclient.ui:1545 msgid "On_Disconnect hooks" msgstr "Ganchos Al_Desconectar" #: ../src/kildclient.ui:1558 msgid "On_ReceivedText hooks" msgstr "Ganchos Al_RecibirTexto" #: ../src/kildclient.ui:1571 msgid "On_SentCommand hooks" msgstr "Ganchos AlEnviarComando_s" #: ../src/kildclient.ui:1584 msgid "On_GetFocus hooks" msgstr "" #: ../src/kildclient.ui:1597 msgid "On_LoseFocus hooks" msgstr "" #: ../src/kildclient.ui:1610 msgid "OnClos_eConnected hooks" msgstr "" #: ../src/kildclient.ui:1623 msgid "OnSer_verData hooks" msgstr "" #: ../src/kildclient.ui:1648 msgid "Items to e_xport" msgstr "Artículos a e_xportar" #: ../src/kildclient.ui:1709 ../src/dlgSelectWorld.ui:125 #: ../src/dlgEditWorld.ui:604 msgid "_New" msgstr "_Nuevo" #: ../src/kildclient.ui:1722 ../src/wndmain.ui:158 ../src/dlgSelectWorld.ui:138 #: ../src/dlgEditWorld.ui:619 msgid "_Edit" msgstr "_Editar" #: ../src/kildclient.ui:1750 msgid "_Import" msgstr "_Importar" #: ../src/kildclient.ui:1763 msgid "E_xport" msgstr "E_xportar" #: ../src/kildclient.ui:1777 ../src/dlgEditWorld.ui:649 #: ../src/dlgEditWorld.ui:3305 msgid "_Up" msgstr "Hacia _arriba" #: ../src/kildclient.ui:1791 ../src/dlgEditWorld.ui:664 #: ../src/dlgEditWorld.ui:3320 msgid "Do_wn" msgstr "Hacia aba_jo" #: ../src/kildclient.ui:1830 ../src/kildclient.ui:1895 #: ../src/kildclient.ui:1915 msgid "Do not change" msgstr "No cambiar" #: ../src/kildclient.ui:1833 ../src/dlgPreferences.ui:42 msgid "Black" msgstr "Negro" #: ../src/kildclient.ui:1836 ../src/dlgPreferences.ui:45 msgid "Red" msgstr "Rojo" #: ../src/kildclient.ui:1839 ../src/dlgPreferences.ui:48 msgid "Green" msgstr "Verde" #: ../src/kildclient.ui:1842 ../src/dlgPreferences.ui:51 msgid "Yellow" msgstr "Amarillo" #: ../src/kildclient.ui:1845 ../src/dlgPreferences.ui:54 msgid "Blue" msgstr "Azul" #: ../src/kildclient.ui:1848 ../src/dlgPreferences.ui:57 msgid "Magenta" msgstr "Magenta" #: ../src/kildclient.ui:1851 ../src/dlgPreferences.ui:60 msgid "Cyan" msgstr "Cyan" #: ../src/kildclient.ui:1854 ../src/dlgPreferences.ui:63 msgid "White" msgstr "Blanco" #: ../src/kildclient.ui:1857 ../src/dlgPreferences.ui:66 msgid "Default" msgstr "" #: ../src/kildclient.ui:1860 ../src/dlgPreferences.ui:69 msgid "Black (bold)" msgstr "Negro (negrita)" #: ../src/kildclient.ui:1863 ../src/dlgPreferences.ui:72 msgid "Red (bold)" msgstr "Rojo (negrita)" #: ../src/kildclient.ui:1866 ../src/dlgPreferences.ui:75 msgid "Green (bold)" msgstr "Verde (negrita)" #: ../src/kildclient.ui:1869 ../src/dlgPreferences.ui:78 msgid "Yellow (bold)" msgstr "Amarillo (negrita)" #: ../src/kildclient.ui:1872 ../src/dlgPreferences.ui:81 msgid "Blue (bold)" msgstr "Azul (negrita)" #: ../src/kildclient.ui:1875 ../src/dlgPreferences.ui:84 msgid "Magenta (bold)" msgstr "Magenta (negrita)" #: ../src/kildclient.ui:1878 ../src/dlgPreferences.ui:87 msgid "Cyan (bold)" msgstr "Cyan (negrita)" #: ../src/kildclient.ui:1881 ../src/dlgPreferences.ui:90 msgid "White (bold)" msgstr "Blanco (negrita)" #: ../src/kildclient.ui:1884 ../src/dlgPreferences.ui:93 msgid "Default (bold)" msgstr "" #: ../src/kildclient.ui:1901 msgid "Single" msgstr "Simple" #: ../src/kildclient.ui:1904 msgid "Double" msgstr "Doble" #: ../src/kildclient.ui:1929 msgid "Change style" msgstr "Cambiar estilo" #: ../src/kildclient.ui:1987 msgid "Apply to:" msgstr "Aplicar a:" #: ../src/kildclient.ui:1998 msgid "_Foreground:" msgstr "A_delante:" #: ../src/kildclient.ui:2026 msgid "_Background:" msgstr "_Fondo:" #: ../src/kildclient.ui:2054 msgid "_Italic:" msgstr "_Itálica:" #: ../src/kildclient.ui:2082 msgid "_Striked-thru:" msgstr "" #: ../src/kildclient.ui:2110 msgid "_Underline:" msgstr "_Subrayar:" #: ../src/kildclient.ui:2141 msgid "The whole _line" msgstr "Toda la _línea" #: ../src/kildclient.ui:2155 msgid "The whole matched _text" msgstr "" #: ../src/kildclient.ui:2174 msgid "The _matched substring number" msgstr "" #: ../src/wndmain.ui:40 msgid "_World" msgstr "_Mundo" #: ../src/wndmain.ui:49 msgid "_Open..." msgstr "_Abrir..." #: ../src/wndmain.ui:66 msgid "_Disconnect" msgstr "_Desconectar" #: ../src/wndmain.ui:74 msgid "Connect to _another..." msgstr "Conectar a _otro..." #: ../src/wndmain.ui:95 msgid "_Edit..." msgstr "_Editar..." #: ../src/wndmain.ui:112 msgid "S_tatistics..." msgstr "Es_tadísticas..." #: ../src/wndmain.ui:125 ../src/wndmain.ui:245 msgid "_Previous" msgstr "_Anterior" #: ../src/wndmain.ui:133 ../src/wndmain.ui:254 msgid "_Next" msgstr "_Siguiente" #: ../src/wndmain.ui:167 msgid "Cu_t" msgstr "Cor_tar" #: ../src/wndmain.ui:176 msgid "_Copy" msgstr "_Copiar" #: ../src/wndmain.ui:185 msgid "_Paste" msgstr "_Pegar" #: ../src/wndmain.ui:207 ../src/dlgCmdHistory.ui:178 msgid "_Find" msgstr "_Encontrar" #: ../src/wndmain.ui:229 msgid "_Input" msgstr "_Ingreso" #: ../src/wndmain.ui:237 ../src/dlgEditWorld.ui:3101 ../src/dlgMLSend.ui:157 msgid "C_lear" msgstr "_Limpiar" #: ../src/wndmain.ui:263 msgid "Find p_revious" msgstr "Encontrar a_nterior" #: ../src/wndmain.ui:281 msgid "Command _history..." msgstr "_Historial de comandos..." #: ../src/wndmain.ui:295 msgid "_Multi-line send..." msgstr "_Enviar varias líneas..." #: ../src/wndmain.ui:309 msgid "_Test triggers..." msgstr "" #: ../src/wndmain.ui:321 msgid "_Preferences" msgstr "_Preferencias" #: ../src/wndmain.ui:330 msgid "Disable _triggers" msgstr "Deshabilitar _triggers" #: ../src/wndmain.ui:339 msgid "Disable _aliases" msgstr "Deshabilitar _aliases" #: ../src/wndmain.ui:348 msgid "Disable _macros" msgstr "Deshabilitar _macros" #: ../src/wndmain.ui:357 msgid "Disable t_imers" msgstr "Deshabilitar t_emporizadores" #: ../src/wndmain.ui:371 msgid "_Debug matches" msgstr "" #: ../src/wndmain.ui:384 msgid "_Preferences..." msgstr "_Preferencias..." #: ../src/wndmain.ui:392 msgid "Edit default _world..." msgstr "" #: ../src/wndmain.ui:404 msgid "_Display" msgstr "" #: ../src/wndmain.ui:413 msgid "_Split window" msgstr "" #: ../src/wndmain.ui:426 ../src/dlgEditWorld.ui:3198 msgid "_Help" msgstr "_Ayuda" #: ../src/wndmain.ui:434 msgid "_Manual" msgstr "_Manual" #: ../src/wndmain.ui:443 msgid "_About" msgstr "_Acerca de" #: ../src/dlgSelectWorld.ui:27 msgid "Connect to" msgstr "Conectar a" #: ../src/dlgSelectWorld.ui:56 msgid "C_onnect" msgstr "C_onectar" #: ../src/dlgSelectWorld.ui:78 msgid "_Select a saved world:" msgstr "_Seleccionar un mundo guardado:" #: ../src/dlgSelectWorld.ui:183 msgid "Or connect d_irectly:" msgstr "O conectar d_irectamente:" #: ../src/dlgSelectWorld.ui:206 ../src/dlgEditWorld.ui:242 msgid "_Host:" msgstr "" #: ../src/dlgSelectWorld.ui:219 ../src/dlgEditWorld.ui:255 msgid "_Port:" msgstr "_Puerto:" #: ../src/dlgPreferences.ui:104 ../src/dlgEditWorld.ui:101 msgid "No proxy" msgstr "Sin proxy" #: ../src/dlgPreferences.ui:107 ../src/dlgEditWorld.ui:104 msgid "SOCKS4" msgstr "SOCKS4" #: ../src/dlgPreferences.ui:110 ../src/dlgEditWorld.ui:107 msgid "SOCKS5" msgstr "SOCKS5" #: ../src/dlgPreferences.ui:113 ../src/dlgEditWorld.ui:110 msgid "HTTP" msgstr "HTTP" #: ../src/dlgPreferences.ui:124 msgid "Left" msgstr "Izquierda" #: ../src/dlgPreferences.ui:127 msgid "Right" msgstr "Derecha" #: ../src/dlgPreferences.ui:130 msgid "Top" msgstr "Arriba" #: ../src/dlgPreferences.ui:133 msgid "Bottom" msgstr "Abajo" #: ../src/dlgPreferences.ui:140 msgid "Preferences" msgstr "Preferencias" #: ../src/dlgPreferences.ui:188 msgid "Colors used by KildClient" msgstr "Colores usados por KildClient" #: ../src/dlgPreferences.ui:208 msgid "_Informative messages:" msgstr "Mensajes _informativos:" #: ../src/dlgPreferences.ui:239 msgid "Command _echo:" msgstr "" #: ../src/dlgPreferences.ui:278 msgid "Window configuration" msgstr "Configuración de Ventana" #: ../src/dlgPreferences.ui:298 msgid "_Tab position:" msgstr "" #: ../src/dlgPreferences.ui:329 msgid "_Hide tabs if only one world is open" msgstr "" #: ../src/dlgPreferences.ui:333 msgid "" "If this is checked, when there is only one open world no tabs will be shown" msgstr "" #: ../src/dlgPreferences.ui:346 msgid "_Flash window when new text is received" msgstr "" #: ../src/dlgPreferences.ui:371 msgid "Appearance" msgstr "Apariencia" #: ../src/dlgPreferences.ui:386 msgid "Sending delays" msgstr "Enviando demoras" #: ../src/dlgPreferences.ui:406 msgid "Enter the default parameters for sending multiple lines or commands:" msgstr "" #: ../src/dlgPreferences.ui:422 msgid "_Number of lines/commands to send at once:" msgstr "" #: ../src/dlgPreferences.ui:462 msgid "_Delay between each group of lines/commands:" msgstr "" #: ../src/dlgPreferences.ui:510 msgid "Sending" msgstr "Enviando" #: ../src/dlgPreferences.ui:527 msgid "Audio player" msgstr "" #: ../src/dlgPreferences.ui:547 #, c-format msgid "" "Enter the command to run an _audio player program. %s will be substituted by " "the file path:" msgstr "" #: ../src/dlgPreferences.ui:562 msgid "Specify the command used to play sound files." msgstr "" #: ../src/dlgPreferences.ui:587 msgid "External programs" msgstr "Programas externos" #: ../src/dlgPreferences.ui:603 ../src/dlgEditWorld.ui:331 msgid "Proxy" msgstr "Proxy" #: ../src/dlgPreferences.ui:627 ../src/dlgEditWorld.ui:355 msgid "Proxy _type:" msgstr "_Tipo de proxy:" #: ../src/dlgPreferences.ui:669 ../src/dlgEditWorld.ui:397 msgid "Server _address:" msgstr "_Dirección de servidor:" #: ../src/dlgPreferences.ui:682 ../src/dlgEditWorld.ui:453 msgid "_Username:" msgstr "_Nombre de usuario:" #: ../src/dlgPreferences.ui:715 ../src/dlgEditWorld.ui:420 msgid "Server _port:" msgstr "_Puerto de servidor:" #: ../src/dlgPreferences.ui:728 ../src/dlgEditWorld.ui:466 msgid "Pass_word:" msgstr "Contra_seña:" #: ../src/dlgPreferences.ui:781 msgid "Proxy" msgstr "Proxy" #: ../src/dlgStatistics.ui:27 msgid "Statistics" msgstr "Estadísticas" #: ../src/dlgStatistics.ui:70 ../src/dlgStatistics.ui:81 #: ../src/dlgStatistics.ui:223 ../src/dlgStatistics.ui:338 #: ../src/dlgStatistics.ui:445 ../src/dlgStatistics.ui:456 #: ../src/dlgStatistics.ui:467 ../src/dlgStatistics.ui:478 #: ../src/dlgStatistics.ui:489 ../src/dlgStatistics.ui:511 #: ../src/dlgStatistics.ui:544 ../src/dlgStatistics.ui:555 #: ../src/dlgStatistics.ui:577 ../src/dlgStatistics.ui:610 #: ../src/dlgStatistics.ui:621 msgid "N/A" msgstr "N/A" #: ../src/dlgStatistics.ui:92 msgid "Proxy port:" msgstr "Puerto de proxy:" #: ../src/dlgStatistics.ui:103 msgid "Proxy host:" msgstr "" #: ../src/dlgStatistics.ui:125 msgid "Proxy type:" msgstr "Tipo de proxy:" #: ../src/dlgStatistics.ui:136 msgid "World name:" msgstr "Nombre del mundo:" #: ../src/dlgStatistics.ui:147 msgid "Host:" msgstr "" #: ../src/dlgStatistics.ui:158 msgid "Port:" msgstr "Puerto:" #: ../src/dlgStatistics.ui:169 msgid "Connection time:" msgstr "Tiempo de conexión:" #: ../src/dlgStatistics.ui:180 msgid "Idle time:" msgstr "Tiempo inactivo(a):" #: ../src/dlgStatistics.ui:201 msgid "Compression used:" msgstr "Compresión usada:" #: ../src/dlgStatistics.ui:212 msgid "Bytes received (compressed):" msgstr "" #: ../src/dlgStatistics.ui:234 msgid "Bytes received (decompressed):" msgstr "" #: ../src/dlgStatistics.ui:245 msgid "Compression ratio:" msgstr "Rata de compresión:" #: ../src/dlgStatistics.ui:256 msgid "Lines received:" msgstr "Líneas recibidas:" #: ../src/dlgStatistics.ui:369 msgid "Key exchange:" msgstr "Clave intercambiada:" #: ../src/dlgStatistics.ui:380 msgid "SSL protocol used:" msgstr "Protocolo SSL usado:" #: ../src/dlgStatistics.ui:391 msgid "Compression algorithm:" msgstr "Algoritmo de compresión:" #: ../src/dlgStatistics.ui:402 msgid "Certificate type:" msgstr "Tipo de certificado:" #: ../src/dlgStatistics.ui:413 msgid "Cipher:" msgstr "Cifrado:" #: ../src/dlgStatistics.ui:424 msgid "MAC:" msgstr "MAC:" #: ../src/dlgStatistics.ui:500 msgid "Hostname:" msgstr "" #: ../src/dlgStatistics.ui:522 msgid "Valid since:" msgstr "Válido(a) desde:" #: ../src/dlgStatistics.ui:533 msgid "Expiration:" msgstr "Expiración:" #: ../src/dlgStatistics.ui:566 msgid "Fingerprint:" msgstr "" #: ../src/dlgStatistics.ui:588 msgid "Subject's DN:" msgstr "" #: ../src/dlgStatistics.ui:599 msgid "Issuer's DN:" msgstr "" #: ../src/dlgAbout.ui:30 msgid "A mud client with powerful features and support for Perl scripting" msgstr "" "Un cliente de MUD con poderosas cualidades y soporte para scripting de Perl" #: ../src/dlgAbout.ui:32 msgid "Visit https://www.kildclient.org" msgstr "Visítenos: https://www.kildclient.org" #: ../src/dlgEditWorld.ui:81 msgid "No auto-login" msgstr "" #: ../src/dlgEditWorld.ui:98 msgid "Use global settings" msgstr "" #: ../src/dlgEditWorld.ui:117 msgid "Edit world" msgstr "Editar mundo" #: ../src/dlgEditWorld.ui:207 msgid "Connection" msgstr "Conexión" #: ../src/dlgEditWorld.ui:268 msgid "Enter a descriptive name for the world" msgstr "Ingresar un nombre descriptivo para el mundo" #: ../src/dlgEditWorld.ui:281 msgid "Enter the host to connect to" msgstr "" #: ../src/dlgEditWorld.ui:294 msgid "Enter the port used when connecting" msgstr "Ingresar el puerto usado al conectar" #: ../src/dlgEditWorld.ui:306 msgid "Use _SSL" msgstr "Usar SS_L" #: ../src/dlgEditWorld.ui:505 msgid "Auto-login" msgstr "" #: ../src/dlgEditWorld.ui:529 msgid "Connection _style:" msgstr "_Estilo de conexión:" #: ../src/dlgEditWorld.ui:567 msgid "Ch_aracters in this mud:" msgstr "C_aracteres en este MUD:" #: ../src/dlgEditWorld.ui:705 ../src/dlgEditWorld.ui:1840 #: ../src/dlgEditWorld.ui:2502 msgid "Font" msgstr "Fuente" #: ../src/dlgEditWorld.ui:725 msgid "Select the font used in the _main screen:" msgstr "" #: ../src/dlgEditWorld.ui:741 msgid "Select the font used in the main output screen" msgstr "" #: ../src/dlgEditWorld.ui:753 msgid "Use _bold font for highlighted colors (instead of just highlighting)" msgstr "" #: ../src/dlgEditWorld.ui:757 msgid "" "Check if you want the highlighted ANSI colors to be displayed in bold also" msgstr "" #: ../src/dlgEditWorld.ui:779 msgid "Word wrap" msgstr "" #: ../src/dlgEditWorld.ui:798 msgid "_Wrap lines at word boundaries" msgstr "" #: ../src/dlgEditWorld.ui:802 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "" #: ../src/dlgEditWorld.ui:820 msgid "_Indent wrapped lines by" msgstr "" #: ../src/dlgEditWorld.ui:850 msgid "pixels" msgstr "pixeles" #: ../src/dlgEditWorld.ui:869 msgid "Wrap lines at full _screen width" msgstr "" #: ../src/dlgEditWorld.ui:889 msgid "Maximum line width in _characters:" msgstr "" #: ../src/dlgEditWorld.ui:937 msgid "Scrolling" msgstr "" #: ../src/dlgEditWorld.ui:956 msgid "Sc_roll on output" msgstr "" #: ../src/dlgEditWorld.ui:960 msgid "" "Check to have the main window scroll to the end whenever new output comes" msgstr "" #: ../src/dlgEditWorld.ui:978 msgid "_Lines to save in scrollback buffer:" msgstr "" #: ../src/dlgEditWorld.ui:991 msgid "" "Specify the number of lines of output that can be seen with by scrolling the " "window" msgstr "" #: ../src/dlgEditWorld.ui:1022 msgid "Tooltips" msgstr "" #: ../src/dlgEditWorld.ui:1041 msgid "Display _tooltips with the time when the line was received" msgstr "" #: ../src/dlgEditWorld.ui:1045 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.ui:1067 msgid "Name display" msgstr "" #: ../src/dlgEditWorld.ui:1086 msgid "I_dentify as 'World name'" msgstr "" #: ../src/dlgEditWorld.ui:1101 msgid "I_dentify as 'World name - Character'" msgstr "" #: ../src/dlgEditWorld.ui:1116 msgid "I_dentify as 'Character - World name'" msgstr "" #: ../src/dlgEditWorld.ui:1135 msgid "C_ustom: " msgstr "" #: ../src/dlgEditWorld.ui:1169 msgid "" "Use %Kw to represent the world's name, and %Kc to represent the auto-logon " "character name" msgstr "" "Usar %Kw para representar el nombre del mundo, y %Kc para representar el " "nombre del caracter a ser conectado automáticamente" #: ../src/dlgEditWorld.ui:1203 msgid "Ansi colors" msgstr "Colores Ansi" #: ../src/dlgEditWorld.ui:1313 msgid "Blac_k" msgstr "_Negro" #: ../src/dlgEditWorld.ui:1326 msgid "_Red" msgstr "_Rojo" #: ../src/dlgEditWorld.ui:1339 msgid "_Green" msgstr "_Verde" #: ../src/dlgEditWorld.ui:1352 msgid "_Yellow" msgstr "_Amarillo" #: ../src/dlgEditWorld.ui:1365 msgid "_Blue" msgstr "A_zul" #: ../src/dlgEditWorld.ui:1378 msgid "_Magenta" msgstr "_Magenta" #: ../src/dlgEditWorld.ui:1391 msgid "Cy_an" msgstr "C_yan" #: ../src/dlgEditWorld.ui:1404 msgid "_White" msgstr "_Blanco" #: ../src/dlgEditWorld.ui:1417 msgid "Blac_k (bold)" msgstr "_Negro (negrita)" #: ../src/dlgEditWorld.ui:1430 msgid "_Red (bold)" msgstr "_Rojo (negrita)" #: ../src/dlgEditWorld.ui:1443 msgid "_Green (bold)" msgstr "_Verde (negrita)" #: ../src/dlgEditWorld.ui:1456 msgid "_Yellow (bold)" msgstr "_Amarillo (negrita)" #: ../src/dlgEditWorld.ui:1469 msgid "_Blue (bold)" msgstr "A_zul (negrita)" #: ../src/dlgEditWorld.ui:1482 msgid "_Magenta (bold)" msgstr "_Magenta (negrita)" #: ../src/dlgEditWorld.ui:1495 msgid "Cy_an (bold)" msgstr "C_yan (negrita)" #: ../src/dlgEditWorld.ui:1508 msgid "_White (bold)" msgstr "_Blanco (negrita)" #: ../src/dlgEditWorld.ui:1647 msgid "Default colors" msgstr "Colores por defecto" #: ../src/dlgEditWorld.ui:1691 msgid "_Foreground" msgstr "A_delante" #: ../src/dlgEditWorld.ui:1704 msgid "Bold _foreground" msgstr "A_delante negrita" #: ../src/dlgEditWorld.ui:1728 msgid "Backgroun_d" msgstr "_Fondo" #: ../src/dlgEditWorld.ui:1752 msgid "Bold backgroun_d" msgstr "_Fondo negrita" #: ../src/dlgEditWorld.ui:1785 msgid "Revert to default colors" msgstr "Revertir a colores por defecto" #: ../src/dlgEditWorld.ui:1804 msgid "Re_vert to default colors" msgstr "R_evertir a colores por defecto" #: ../src/dlgEditWorld.ui:1808 msgid "Click to revert all colors to their built-in defaults" msgstr "" #: ../src/dlgEditWorld.ui:1860 msgid "_Select the font used in the status bar:" msgstr "_Seleccionar la fuente usada en la caja de entrada de comandos:" #: ../src/dlgEditWorld.ui:1895 msgid "Time display" msgstr "" #: ../src/dlgEditWorld.ui:1915 msgid "Co_nnected time:" msgstr "_Tiempo conectado(a):" #: ../src/dlgEditWorld.ui:1935 ../src/dlgEditWorld.ui:2017 msgid "Do not display" msgstr "No mostrar" #: ../src/dlgEditWorld.ui:1939 msgid "Select if you do not want the connection time to be displayed" msgstr "" #: ../src/dlgEditWorld.ui:1953 ../src/dlgEditWorld.ui:2035 msgid "Display as hours, minutes and seconds" msgstr "" #: ../src/dlgEditWorld.ui:1957 msgid "" "Select if you want the connection time to be displayed in hours, minutes and " "seconds" msgstr "" #: ../src/dlgEditWorld.ui:1971 ../src/dlgEditWorld.ui:2053 msgid "Display as seconds" msgstr "Mostrar como segundos" #: ../src/dlgEditWorld.ui:1975 msgid "Select if you want the connection time to be displayed in seconds" msgstr "" #: ../src/dlgEditWorld.ui:1998 msgid "_Idle time:" msgstr "Ti_empo inactivo(a):" #: ../src/dlgEditWorld.ui:2021 msgid "Select if you do not want the idle time to be displayed" msgstr "" #: ../src/dlgEditWorld.ui:2039 msgid "" "Select if you want the idle time to be displayed in hours, minutes and " "seconds" msgstr "" #: ../src/dlgEditWorld.ui:2057 msgid "Select if you want the idle time to be displayed in seconds" msgstr "" #: ../src/dlgEditWorld.ui:2071 msgid "Only _reset idle time counter when a command is entered directly" msgstr "" #: ../src/dlgEditWorld.ui:2075 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.ui:2115 msgid "Command entry" msgstr "" #: ../src/dlgEditWorld.ui:2134 msgid "_Keep last typed command in command entry box" msgstr "_Mantener último comando tipeado en la caja de entrada de comandos" #: ../src/dlgEditWorld.ui:2138 msgid "" "Check to have the last command kept in the command entry box, so that you " "can repeat commands only by pressing ENTER" msgstr "" "Seleccionar para mantener el último comando usado en la caja de ingreso de " "comandos, para que pueda repetirse comandos presionando la tecla Intro " "únicamente" #: ../src/dlgEditWorld.ui:2150 msgid "_Echo sent commands in main window" msgstr "_Enviar eco de comandos enviados en la pantalla principal" #: ../src/dlgEditWorld.ui:2154 msgid "Check to have the sent commands echoed in the main output window" msgstr "" #: ../src/dlgEditWorld.ui:2166 msgid "Store commands _between sessions" msgstr "_Guardar comandos entre sesiones" #: ../src/dlgEditWorld.ui:2170 msgid "Check to have the command history saved in a file between sessions" msgstr "" #: ../src/dlgEditWorld.ui:2182 msgid "Never _hide the typed text" msgstr "_Nunca ocultar texto tipeado" #: ../src/dlgEditWorld.ui:2186 msgid "" "Check this if the text you type is displayed as black dots in the input box." msgstr "" #: ../src/dlgEditWorld.ui:2203 msgid "_Number of commands to save in history:" msgstr "Núme_ro de comandos a guardar en historial:" #: ../src/dlgEditWorld.ui:2217 msgid "Specify the number of commands that are saved and can be later recalled" msgstr "" "Especificar el número de comandos a ser guardados para ser usados " "posteriormente" #: ../src/dlgEditWorld.ui:2244 msgid "Co_mmand separator:" msgstr "_Separador de comandos:" #: ../src/dlgEditWorld.ui:2257 msgid "Specify the separator for commands typed in the command entry box" msgstr "" "Especificar el separador de comandos tipeados en la caja de entrada de " "comandos" #: ../src/dlgEditWorld.ui:2278 msgid "Use single-_line input bar" msgstr "_Usar barra de ingreso simple" #: ../src/dlgEditWorld.ui:2300 msgid "Enable _auto-completion" msgstr "_Habilitar auto-completado" #: ../src/dlgEditWorld.ui:2304 msgid "Check to enable command auto-completion (based on previous commands)" msgstr "" "Seleccionar para habilitar auto-completado de comandos (basado en comandos " "previos)" #: ../src/dlgEditWorld.ui:2321 msgid "Acti_vate auto-completion only after" msgstr "Ac_tivar completado automático sólo luego de" #: ../src/dlgEditWorld.ui:2335 msgid "" "Specify the number of characters that must be typed for command completion " "to start" msgstr "" "Especificar el número de caracteres que deben ser tipeados para iniciar " "completado de comando" #: ../src/dlgEditWorld.ui:2351 msgid "characters have been entered" msgstr "caracteres han sido ingresados" #: ../src/dlgEditWorld.ui:2375 msgid "Use mul_ti-line input bar" msgstr "Usar _barra de ingreso múltiple" #: ../src/dlgEditWorld.ui:2402 msgid "N_umber of lines:" msgstr "Número de _líneas:" #: ../src/dlgEditWorld.ui:2437 msgid "S_pell check typed text" msgstr "Revisar ortografía del te_xto tipeado" #: ../src/dlgEditWorld.ui:2457 msgid "Lan_guage:" msgstr "_Idioma:" #: ../src/dlgEditWorld.ui:2522 msgid "Select the _font used in the command entry box:" msgstr "Seleccionar la _fuente usada en la caja de entrada de comandos" #: ../src/dlgEditWorld.ui:2557 msgid "Flood prevention" msgstr "Prevención de inundación" #: ../src/dlgEditWorld.ui:2580 msgid "_Do not allow the same command to be sent" msgstr "No _permitir el envío del mismo comando" #: ../src/dlgEditWorld.ui:2584 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.ui:2598 msgid "Specify the maximum number of equal commands that can be sent in a row" msgstr "" "Especificar el número máximo de comandos iguales que pueden ser enviados en " "una fila" #: ../src/dlgEditWorld.ui:2614 msgid "times in a _row" msgstr "_veces seguidas" #: ../src/dlgEditWorld.ui:2638 msgid "_Send this command:" msgstr "Enviar este coman_do:" #: ../src/dlgEditWorld.ui:2651 msgid "" "Enter a command to be sent whenever the specified maximum number of equal " "commands would be sent" msgstr "" #: ../src/dlgEditWorld.ui:2690 msgid "Logging status" msgstr "" #: ../src/dlgEditWorld.ui:2727 msgid "_Start" msgstr "_Iniciar" #: ../src/dlgEditWorld.ui:2742 msgid "_Stop" msgstr "" #: ../src/dlgEditWorld.ui:2768 msgid "_Include the last" msgstr "_Incluir el último" #: ../src/dlgEditWorld.ui:2772 msgid "Select to include lines from the main window in the log file." msgstr "" "Seleccionar para incluir líneas de la pantalla principal en el archivo de " "log." #: ../src/dlgEditWorld.ui:2785 msgid "Inform number of lines to include in the log." msgstr "Informar número de líneas a incluir en el log." #: ../src/dlgEditWorld.ui:2801 msgid "_lines of the scrollback buffer in the log" msgstr "" #: ../src/dlgEditWorld.ui:2829 ../src/dlgEditWorld.ui:3447 msgid "File" msgstr "Archivo" #: ../src/dlgEditWorld.ui:2879 msgid "S_elect" msgstr "" #: ../src/dlgEditWorld.ui:2903 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.ui:2925 msgid "Options" msgstr "Opciones" #: ../src/dlgEditWorld.ui:2944 msgid "A_utomatically start logging when connected" msgstr "Iniciar guardado de log a_utomáticamente al conectarse" #: ../src/dlgEditWorld.ui:2949 msgid "" "If this is selected, logging will be automatically started whenever you " "connect to the world." msgstr "" "Si está seleccionado, se creará un log automáticamente al conectarse al " "mundo." #: ../src/dlgEditWorld.ui:2961 msgid "Prefix lines with _date and/or time" msgstr "" #: ../src/dlgEditWorld.ui:2966 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.ui:2986 msgid "_Format:" msgstr "_Formato:" #: ../src/dlgEditWorld.ui:3000 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.ui:3011 msgid "_Revert to default" msgstr "Revertir a por _defecto" #: ../src/dlgEditWorld.ui:3053 msgid "Scripting" msgstr "" #: ../src/dlgEditWorld.ui:3078 msgid "_Perl file to load:" msgstr "_Archivo Perl a cargar:" #: ../src/dlgEditWorld.ui:3142 msgid "Plugins currently loaded" msgstr "Complementos cargados actualmente" #: ../src/dlgEditWorld.ui:3183 msgid "_Load" msgstr "_Cargar" #: ../src/dlgEditWorld.ui:3230 msgid "Plugins loaded on startup" msgstr "Complementos cargados al inicio" #: ../src/dlgEditWorld.ui:3275 msgid "_Add" msgstr "" #: ../src/dlgEditWorld.ui:3363 msgid "MCCP (for compression)" msgstr "MCCP (para compresión)" #: ../src/dlgEditWorld.ui:3382 msgid "_Enable if server proposes after connecting" msgstr "_Habilitar si el servidor propone luego de conectarse" #: ../src/dlgEditWorld.ui:3397 msgid "Enable if server proposes at _any time" msgstr "H_abilitar si el servidor propone en cualquier momento" #: ../src/dlgEditWorld.ui:3412 msgid "_Disable" msgstr "_Deshabilitar" #: ../src/dlgEditWorld.ui:3471 msgid "_File:" msgstr "_Archivo:" #: ../src/dlgEditWorld.ui:3506 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 "" "Puede dejar este campo en blanco y se generará un nombre de archivo " "automáticamente. Sólo editar este campo si sabe lo que está haciendo." #: ../src/dlgEditWorld.ui:3528 msgid "Character set" msgstr "Juego de caracteres" #: ../src/dlgEditWorld.ui:3552 msgid "C_haracter set:" msgstr "_Juego de caracteres:" #: ../src/dlgEditWorld.ui:3591 msgid "Graphical editors" msgstr "Editores gráficos" #: ../src/dlgEditWorld.ui:3610 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "Co_nfirmar antes de eliminar gatillos, aliases, etc." #: ../src/dlgEditWorld.ui:3614 ../src/dlgEditWorld.ui:3676 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 "" "Si no está seleccionado, los objetos como los gatillos, aliases, etc. serán " "eliminados directamente sin pedir confirmación al presionar el botón " "Eliminar (Delete)." #: ../src/dlgEditWorld.ui:3627 msgid "_Show items defined by plugins" msgstr "_Mostrar objetos definidos en los complementos" #: ../src/dlgEditWorld.ui:3631 msgid "" "If checked, triggers, aliases, macros and timers defined in plugins will " "appear in the corresponding World Editor sections." msgstr "" "Si está seleccionado, los gatillos, aliases, macros y temporizadores " "definidos en los complementos aparecerán en las secciones de Editor de " "Mundos." #: ../src/dlgEditWorld.ui:3653 msgid "TCP keep alive" msgstr "Mantener vivo TCP" #: ../src/dlgEditWorld.ui:3672 msgid "Enable TCP _keep alive packets" msgstr "_Habilitar paquetes de TCP para mantener vivo" #: ../src/dlgEditWorld.ui:3689 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "" "(Deberá volver a conectarse para que los cambios en esta configuración " "surtan efecto)" #: ../src/dlgEditWorld.ui:3709 msgid "Input" msgstr "Ingreso" #: ../src/dlgEditWorld.ui:3728 msgid "_Disable up and down arrow keys for history navigation" msgstr "" "_Deshabilitar las teclas de arriba y abajo para navegación del historial" #: ../src/dlgEditWorld.ui:3732 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 "" "Si está seleccionada, las teclas de cursor para arriba y para abajo no son " "usadas para navegar entre los comandos guardados. (Deberá usar Alt+Arriba y " "Alt+Abajo.)" #: ../src/dlgEditWorld.ui:3749 msgid "Character to run _Perl commands:" msgstr "" #: ../src/dlgEditWorld.ui:3785 msgid "" "Warning: Changing the character to run Perl commands from the default '/' is " "not recommended, because doing so might prevent plugins or other code from " "working, if they use '/' to run Perl commands." msgstr "" #: ../src/dlgTestTriggers.ui:27 msgid "Test triggers" msgstr "" #: ../src/dlgTestTriggers.ui:70 msgid "Enter _line to be matched against the triggers:" msgstr "Ingresar _línea a ser comparada con los gatillos:" #: ../src/dlgTestTriggers.ui:88 msgid "" "The text entered here will be matched against triggers as if it were a line " "coming from the MUD" msgstr "" "El texto ingresado aquí será comparado con los gatillos como si fuese una " "línea de comando del MUD" #: ../src/dlgTestTriggers.ui:99 ../src/dlgMLSend.ui:69 #: ../src/dlgCmdHistory.ui:91 msgid "_Send" msgstr "_Enviar" #: ../src/dlgTestTriggers.ui:103 msgid "Click the run the triggers against the line." msgstr "Dar clic para ejecutar los gatillos en la línea." #: ../src/dlgTestTriggers.ui:138 msgid "Number of triggers that matched:" msgstr "Número de gatillos encontrados:" #: ../src/dlgTestTriggers.ui:166 msgid "Commands that would be sent:" msgstr "Comandos que sería enviados:" #: ../src/dlgTestTriggers.ui:196 msgid "This is what would be printed in the main screen:" msgstr "Esto es lo que aparecería en la pantalla principal:" #: ../src/dlgTestTriggers.ui:208 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 "" "Esto es lo que aparecería en la pantalla principal. Si está vacío, la línea " "ha sido cortada. Puede ser diferente de la línea original debido a gatillos " "de re-escritura." #: ../src/dlgTestTriggers.ui:224 msgid "Would this line be included in the log file?" msgstr "¿Esta línea será incluída en el archivo de log?" #: ../src/dlgMLSend.ui:39 msgid "Multi-line send" msgstr "Envío de líneas múltiples" #: ../src/dlgMLSend.ui:95 msgid "Send this text _initially:" msgstr "Enviar este texto _inicialmente:" #: ../src/dlgMLSend.ui:115 ../src/dlgMLSend.ui:199 msgid "Enter some text to be sent to the World" msgstr "Ingresar texto a ser enviado al Mundo" #: ../src/dlgMLSend.ui:128 msgid "Then send the c_ontents of this file:" msgstr "Luego enviar el _contenido de este archivo:" #: ../src/dlgMLSend.ui:179 msgid "_Finally, send this text:" msgstr "_Finalmente, enviar este texto:" #: ../src/dlgMLSend.ui:222 msgid "Add this to the _beginning of each line:" msgstr "Agregar esto al _inicio de cada línea:" #: ../src/dlgMLSend.ui:238 msgid "Specify some text to be prepended to each sent line" msgstr "Especificar algún texto a ser agregado al inicio de cada línea enviada" #: ../src/dlgMLSend.ui:250 msgid "Add this to the _end of each line:" msgstr "Agregar esto al _final de cada línea:" #: ../src/dlgMLSend.ui:266 msgid "Specify some text to be appended to each sent line" msgstr "Especificar texto a ser agregado al final de cada línea enviada" #: ../src/dlgMLSend.ui:282 ../src/dlgCmdHistory.ui:253 msgid "_Delay" msgstr "_Demora" #: ../src/dlgMLSend.ui:295 msgid "Specify the delay between sending the group of lines" msgstr "Especificar la demora entre los grupos de líneas enviadas" #: ../src/dlgMLSend.ui:310 ../src/dlgCmdHistory.ui:282 msgid "seconds e_ach" msgstr "segundos ca_da uno(a)" #: ../src/dlgMLSend.ui:323 msgid "Specify how many lines are sent at once" msgstr "Especificar cuántas líneas serán enviadas a la vez" #: ../src/dlgMLSend.ui:337 msgid "line(s)" msgstr "línea(s)" #: ../src/dlgMLSend.ui:355 msgid "_Keep dialog open after sending" msgstr "_Mantener diálogo abierto luego de enviar" #: ../src/dlgCmdHistory.ui:39 msgid "Command history" msgstr "Historial de comandos" #: ../src/dlgCmdHistory.ui:56 msgid "_Recall" msgstr "_Recordar" #: ../src/dlgCmdHistory.ui:61 msgid "Put the selected command in the command entry box" msgstr "Colocar el comando seleccionado en la caja de entrada de comandos" #: ../src/dlgCmdHistory.ui:74 msgid "Reca_ll and close" msgstr "Record_ar y cerrar" #: ../src/dlgCmdHistory.ui:79 msgid "Put the selected command in the command entry box and close this dialog" msgstr "" "Colocar el comando seleccionado en la caja de entrada de comandos y cerrar " "este diálogo" #: ../src/dlgCmdHistory.ui:96 msgid "Send the selected command(s) to the mud" msgstr "Enviar el/los comando(s) al programa" #: ../src/dlgCmdHistory.ui:108 msgid "Se_nd and close" msgstr "E_nviar y cerrar" #: ../src/dlgCmdHistory.ui:113 msgid "Send the selected command(s) to the mud and close the dialog" msgstr "" "Enviar el/los comando(s) seleccionado(s) al programa y cerrar el diálogo" #: ../src/dlgCmdHistory.ui:183 msgid "Find a command containing a given search term" msgstr "Encontrar un comando conteniendo un término de búsqueda determinado" #: ../src/dlgCmdHistory.ui:200 msgid "Find the next command with the same match text" msgstr "Encontrar el siguiente comando con el mismo texto" #: ../src/dlgCmdHistory.ui:227 msgid "Newest commands are on the top" msgstr "Los comandos más recientes están al inicio" #: ../src/dlgCmdHistory.ui:266 msgid "Specify the delay between sending the group of commands" msgstr "Especificar la demora entre envío de grupo de comandos" #: ../src/dlgCmdHistory.ui:295 msgid "Specify how many commands are sent at once" msgstr "Especificar cuántos comandos serán enviados a la misma vez" #: ../src/dlgCmdHistory.ui:311 msgid "commands(s)" msgstr "comando(s)" #: ../src/dlgCmdHistory.ui:335 msgid "Find command" msgstr "Encontrar comando" #: ../src/dlgCmdHistory.ui:390 msgid "_Text to find:" msgstr "_Texto a encontrar:" #: ../src/dlgCmdHistory.ui:404 msgid "Enter the text to search for" msgstr "Ingresar texto a ser buscado" #: ../src/dlgCmdHistory.ui:421 msgid "Search direction:" msgstr "Dirección de búsqueda:" #: ../src/dlgCmdHistory.ui:437 msgid "_Downwards" msgstr "Hacia A_bajo" #: ../src/dlgCmdHistory.ui:452 msgid "_Upwards" msgstr "Hacia _Arriba" #: ../src/mnuPopupURL.ui:29 msgid "_Open link" msgstr "_Abrir vínculo" #: ../src/mnuPopupURL.ui:37 msgid "_Copy link address" msgstr "_Copiar dirección de vínculo" #: ../share/kildclient.pl:75 ../share/kildclient.pl:96 #: ../share/kildclient.pl:116 ../share/kildclient.pl:181 #: ../share/kildclient.pl:393 ../share/kildclient.pl:493 #: ../share/kildclient.pl:571 ../share/kildclient.pl:584 #: ../share/kildclient.pl:597 ../share/kildclient.pl:610 #: ../share/kildclient.pl:623 ../share/kildclient.pl:636 #: ../share/kildclient.pl:649 ../share/kildclient.pl:662 #: ../share/kildclient.pl:676 ../share/kildclient.pl:690 #: ../share/kildclient.pl:800 ../share/kildclient.pl:812 #: ../share/kildclient.pl:824 ../share/kildclient.pl:836 #: ../share/kildclient.pl:849 ../share/kildclient.pl:1098 #: ../share/kildclient.pl:1131 #, perl-format msgid "%s: Too few arguments." msgstr "%s: Muy pocos argumentos." #: ../share/kildclient.pl:297 ../share/kildclient.pl:315 #: ../share/kildclient.pl:333 ../share/kildclient.pl:351 #: ../share/kildclient.pl:369 #, perl-format msgid "%s: Wrong number of arguments." msgstr "%s: Número de argumentos incorrecto." #: ../share/kildclient.pl:488 msgid "Successfully moved." msgstr "Se movió exitosamente." #: ../share/kildclient.pl:871 #, perl-format msgid "One %1$s deleted" msgid_plural "%2$d %1$s deleted" msgstr[0] "Un(a) %s borrado(a)" msgstr[1] "Se borró %2$d %1$s" #: ../share/kildclient.pl:913 msgid "Could not open file." msgstr "No se pudo abrir el archivo." #: ../share/kildclient.pl:943 msgid "Unknown" msgstr "Desconocido(a)" #: ../share/kildclient.pl:950 msgid "Invalid plugin file." msgstr "Archivo de complemento inválido." #: ../share/kildclient.pl:981 msgid "Plugin already loaded. Try enabling it." msgstr "Complemento ya está cargado. Intente habilitarlo." #: ../share/kildclient.pl:983 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "La versión %s de este complemento ya está cargada." #: ../share/kildclient.pl:993 #, perl-format msgid "Error in plugin file: %s" msgstr "Error en archivo de complemento: %s" #: ../share/kildclient.pl:1005 msgid "Cannot load a plugin in another world." msgstr "No se puede cargar un complemento en otro mundo." #: ../share/kildclient.pl:1010 ../share/kildclient.pl:1030 msgid "Plugin not specified" msgstr "Complemento no especificado" #: ../share/kildclient.pl:1017 ../share/kildclient.pl:1048 msgid "Plugin not loaded." msgstr "Complemento no cargado." #: ../share/kildclient.pl:1020 #, perl-format msgid "Plugin '%s' loaded." msgstr "Complemento '%s' cargado." #: ../share/kildclient.pl:1036 #, perl-format msgid "Could not load plugin %s" msgstr "No se pudo cargar el complemento %s" #: ../share/kildclient.pl:1112 msgid "Plugin enabled." msgstr "Complemento habilitado." #: ../share/kildclient.pl:1145 msgid "Plugin disabled." msgstr "Complemento deshabilitado." #: ../share/kildclient.pl:1295 msgid "Cannot open help file." msgstr "No se puede abrir el archivo de ayuda." #: ../share/kildclient.pl:1318 msgid "Help topic not found." msgstr "Tema de ayuda no encontrado." kildclient-3.2.0/po/LINGUAS0000644000175000017500000000005613220232041012210 00000000000000#Set of available languages de eo es pt_BR sv kildclient-3.2.0/po/pt_BR.gmo0000644000175000017500000016573513220232041012715 00000000000000+:~: ;;/;H;d;5|;5;&;<.,<[<u<(<<<<< =6)='`==L=6='>;F>7>>>>"?"(?K?c?????? @ @@0@D@V@ k@@@@ @@ @@ AA5ASA gAtAA A AAABB)B?BSBcBBBB+B$B$C(+C"TCwC CCC D#(D LD WD*aD0D6DD D EE E'E -E:E ?EKE\EmEtEE EEE EE E&EF4FFF _F lF vF8FJFGLGDGB9Ht|HIH@;IB|IDI?J:DJJ<_K=KGK<"LB_L-LWL(MM,M&M1N59NoNNNNNNNNNO(O:O KOVOpO;O"OQO88PCqP8PPQ(Q/;Q#kQQ"QQQ'R .ROR6lRRR$RRS7S=SDSIS OS\S aSmSqSyS S,SSSSS TT,T%KTqTT:T%TTU U%UN4UeUUU9UN0V$VV VVV V V V W W,!WNWmW&WW/W`W&EX1lX0X1X1Y33Y'gYY6Y8Y1Z2PZ.Z2Z[ZDA[[{[1\1Q\#\%\\\"]&] ;]$\] ]] ]]]]]]]-] &^ 3^>^.M^ |^^^^^ ^^^C^u_ __F___` `%`%6`\` v``{aaKb]abbb-bb4c8cAc'Xc1ccccc2dAd Rd]d mdwd {dddd ddd ddd ee0eDe IeVeLfeeee ee"ef0f@fDfVf[fvff+f fff f f gg (g6gFgOg Tgbg qg{ggEh\h{hhh.h h i$i>iVigi{iiiii"i@jICjj%j jjjjkk(k/k'Ckkk|kkkkk l(l .l#:l^lZ~l0l m #m-m 3m@m ]m imum m1mGmn /n=nUngn knvnnnnnnnnn oo,o;o MoWogo=yo7oToADpNp;pq/!q)Qq.{qfq=r'Or<wrrrr+r!s 2s@s*Gs'rsMs2s3t-Ot7}t4t;tF&uSmuGuS vA]v v v vv vv v ww w$wBw%w x_,xxx%xjxEy1yZz pz}zz{{{,{>{#|!,|(N|'w|.||'|| }&}YD}}D}}~~-5~ c~ p~z~,~ ~~W   , H<i !ENgӁ'"E hsz= ς܂ ,KS6\ )"҃ " /5+>js{' ф ݄ $3 :Fai{ ƅ:-!O$Uz$'*GKT Ze ny  LJ ׇ   -?E(\ ̈ӈوJQ`r   ĉˉ*, G)U. &Պ !&*Q al ‹ŋZ̋2'Zu } ͌όӌh !:=T@/ӏ!;%a 2Ր"1GT9֑Z>K3E<A]z%&!!#!E;g ɔ۔#.Rm} ʕ' AN^,x !Ԗ #@PpJ-ӗ&((/%X ~Q'Y )06) /;BIZ`pu!К# 2<4M,ěܛ 'CVbQO\.{-LEG<KHПGaIp;2I)Ks4eZ+21Bd>(CZsץ ?)#iV:E;e,ɧ2%)%O+u%Ǩ.)"?@b#.ǩ/!&*Hsyª Ԫ7-AW kx"ѫ <&3Z p ~ Np WcGiS, 2 <"Il  4Ǯ!4: o2zd%382l33Ӱ5/=$mH6۱8=K16XKKs:&=a! -J0bĵ̵Եݵ !4<q/ ٶ!L5V#z..͸!-ҹTdgV Ȼ0ѻ8 CM,g:ϼ (M@ ŽϽս #-6HX\t˾lݾJQYk|(ٿ "-P,U , DQYhx s  /=]}"R?W&*28@^u)j+ 4`4a +  9/HDx &9O kv~  '$CK\DpG\KZ_NU9n-+uCx)= $EK;j64TFEI?+<k:@V$m{PO:M , >JRWgx(+T^s )e#1-a_#))"/L |90i H'&9C} ,!X*1B Q+^*= /Y -Nn!(  <'dlr  , 0 4 A/M%} , 2 -9 BL l v, ,"* MWl !C?(h)p ,! '/13a   $ 6@ F Q ]g{,$%J Zd kuQ ( 2 ? J U`hz#% 37H * /# 5 ALi U=Pjs  ~ [A=JVS;G+hCcFdp=f#NqZAA#ZV)*w`1^BX9GfKyB<@>81i6Rd3 _<#<(N1 'w>Sq'Ixi&yaroq}j/]mIe`{Ro[24KI8  +cHL~uQL9Qz 6tUt_j?}. z!\= 53*H:s(g;GfwrM%N~9[Dm^ @pW Dl,{ue"Umxk}vh7d0x"8zk@E$7-\J0-,W?"ZH ^Oc,l  Yt/b%nTBPT/X4sE`4(s!)_S k*2\]vy?!;$EPCLK5Y&b73T+5Q M v6P{i2gRYFaC-J|%':.p] M>n: ra$|ejOh&olDg.0)XnUOVu|bWF Target: %d Foreground: %d Background: %d Italics: %d Striked-thru: %d Underline: %d SSL enabled.%d line%d lines%s is already permanent.%s: %s is already permanent%s: %s is not permanent%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: Argument must be numeric%s: Cannot create timer with negative interval%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 key code%s: Invalid target%s: Invalid underline style%s: Keycode given twice, using the named attribute one%s: Keycode not specified, not creating%s: No such world%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent%s: Pattern given twice, using the named attribute one%s: Pattern not specified, not creating%s: Substitution given twice, using the named attribute one%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(-1 to repeat indefinitely)(You must reconnect for changes in this setting to take effect)0 lines: 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 displayTooltipsWindow 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 _startupAppearanceApply to:Are 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...AuthorAutomationBackgroun_dBlac_kBlac_k (bold)BlackBlack (bold)BlueBlue (bold)Bold _foregroundBold backgroun_dBottomBytes received (compressed):Bytes received (decompressed):C_hange styleC_haracter set:C_learC_onfigure...C_onnectC_ustom: Cannot load a plugin in another world.Cannot open help file.Certificate type:Ch_aracters in this mud:Change styleCharacterCharacter to run _Perl commands: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 defaultsCo_mmand separator:Co_nnected time:ColorsCommand _echo:Command _history...Command historyCommand not found.Commands that would be sent:Compression algorithm:Compression ratio:Compression used:Confirm deletionConnect toConnect to _another worldConnect to _another...Connected 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:Could 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 log file: %s.Could not open raw dump file %s: %s Could not open world '%s': %s Could not resolve host %s: %sCountCount Cu_tCy_anCy_an (bold)CyanCyan (bold)DIRDefaultDefault (bold)DescriptionDirectory to store settings and saved worldsDisable _aliasesDisable _macrosDisable _triggersDisable t_imersDisconnectedDisconnected 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 deleteDo not changeDo not displayDo you really want to delete the %1$s?Do you really want to delete %2$d %1$s?Do you really want to make the variable temporary?Do you really want to make %d variables temporary?Do_wnDoubleDumps 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 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 in plugin file: %sError loading UI from XML file: %sError loading pluginError setting spell checker: %s Error while reading from proxy host.Eval as PerlEvent:Expiration:ExportExternal programsFILEFailed loading file %s: %sFileFile name not specified.Find a command containing a given search termFind commandFind n_extFind p_reviousFind the next command with the same match textFingerprint:GagGag logGeneralGreenGreen (bold)HTTPHelp 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 number %d for event %s Name: %s Action: %s Enabled: %s HooksHooks for '%s': Host:Hostname:I_dentify as 'Character - World name'I_dentify as 'World name - Character'I_dentify 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.Ig. caseImportInform 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. Items to e_xportKeep _openKeep _permanentKeep execKeyKey exchange:KildClient errorKildClient informationKildClient readyLan_guage:LeftLines received:Load pluginLoggingLogging is disabled.Logging not startedLogging stopped.Logging to file %s.MAC:Macro added.Macro modified.Macro number %d Name: %s Key code: %s Action: %s Enabled: %s MacrosMagentaMagenta (bold)Main windowMake _temporaryMaximum line width in _characters:More than one command selected.Multi-line sendN/AN_umber of lines:NameNever _hide the typed textNewest commands are on the topNoNo acceptable proxy authentication methods.No auto-loginNo command selected.No proxyNo 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:Omit (_gag) from outputOmit (gag) from _log fileOnClos_eConnected hooksOnCo_nnect hooksOnSer_verData hooksOn_Disconnect hooksOn_GetFocus hooksOn_LoseFocus hooksOn_ReceivedText hooksOn_SentCommand hooksOne %1$s deleted%2$d %1$s deletedOnly _reset idle time counter when a command is entered directlyOnly scalar ($), array (@) and hash (%%) variables can be made permanent.Or connect d_irectly:Outputs version information and exitsPass_word:PasswordPatternPerforming SSL handshake...Permanent 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 macroProtocol %s not enabled.ProtocolsProxyProxy _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 dialogRe_vert to default colorsReally close?Really quit KildClient?Reca_ll and closeRedRed (bold)Resolving host %s...Resolving proxy host %s...RewriterRightSOCKS4SOCKS5SSL handshake failed: %sSSL handshake took too long.SSL protocol used:S_electS_pell check typed textS_tatistics...Sc_roll on outputScriptingSe_nd and closeSearch 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 command entry box:Select the font used in the _main screen:Select the font used in the main output screenSelect 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:SingleSpecify 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 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 boxStatisticsStatus barStore commands _between sessionsStyleSubstitutionSuccessfully moved.TTL expiredT_imersTempTest triggersThe _matched substring numberThe 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 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 c_ontents of this file:There is one open world. Do you really want to quit?There are %d open worlds. 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.Timer added.Timer modified.Timer number %d Name: %s Interval: %.3f Repeat count: %d Action: %s Enabled: %s Temporary: %s TimersTopTrigger 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. Unknown protocolUnnamed worldUnrecognized response from proxy host.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 global settingsUse mul_ti-line input barUse single-_line input barUse the Find button to find the first result.Valid since:VariablesVersionVersion %s of this plugin is already loaded.Visit https://www.kildclient.orgWarning: Changing the character to run Perl commands from the default '/' is not recommended, because doing so might prevent plugins or other code from working, if they use '/' to run Perl commands.Warning: Trying to send a very long command line. Perhaps a recursive alias definition?WhiteWhite (bold)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) YellowYellow (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.[WORLD...]_About_Action:_Add_Aliases_Ask for confirmation before deleting triggers, aliases, etc._Background:_Blue_Blue (bold)_Cancel_Close_Copy_Copy link address_Delay_Delay between each group of lines/commands:_Delete_Disable_Disable up and down arrow keys for history navigation_Disconnect_Display_Do not allow the same command to be sent_Do not display this message again_Don't quit_Downwards_Echo sent commands in main window_Edit_Edit..._Enable if server proposes after connecting_Enabled_Event:_File:_Finally, send this text:_Find_Find:_Flash window when new text is received_Foreground_Foreground:_Format:_Green_Green (bold)_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:_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_Macros_Magenta_Magenta (bold)_Manual_Multi-line send..._Name of variable to make permanent:_Name:_New_Next_Number of commands to save in history:_Number of lines/commands to send at once:_OK_Offline_Open_Open link_Open..._Password:_Paste_Pattern:_Perl file to load:_Permanent variables_Port:_Preferences_Preferences..._Previous_Quit_Recall_Reconnect_Red_Red (bold)_Repeat count:_Revert to default_Rewriter trigger_Save_Select a saved world:_Select the font used in the status bar:_Send_Send this command:_Show items defined by plugins_Split window_Start_Stop_Striked-thru:_Substitution:_Tab position:_Temporary (will be deleted automatically when its repeat count reaches 0)_Test triggers_Test triggers..._Text to find:_Triggers_Underline:_Up_Upwards_Username:_White_White (bold)_World_Wrap lines at word boundaries_Yellow_Yellow (bold)_lines of the scrollback buffer in the logaddress type not supportedaliasaliasesalias: Not creating alias without patternalias: Not creating alias without substitutioncharactercharacters have been enteredcommand not supported / protocol errorcommands(s)connection not allowed by rulesetconnection refused by destination hostgeneral failurehookhookshook: Invalid event '%s' host unreachableline(s)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 failedsecondsseconds e_achtimertimerstimes in a _rowtriggertriggersunknown reason codeyyesProject-Id-Version: KildClient 3.2.0 Report-Msgid-Bugs-To: eduardo@kalinowski.com.br PO-Revision-Date: 2017-12-24 09:17-0200 Last-Translator: Eduardo M Kalinowski Language-Team: Eduardo M Kalinowski Language: pt_BR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Alvo: %d Texto: %d Fundo: %d Itálico: %d Tachado: %d Sublinhado: %d SSL habilitado.%d linha%d linhas%s já é permanente.%s: %s já é permanente%s: %s não é permanente%s: Ação informada duas vezes, usando a do atributo nomeado%s: Ação não especificada e não é gag, cancelando criação%s: Ação não informada, cancelando criação%s: Argumento deve ser numérico.%s: Não é possível criar um timer com intervalo negativo%s: Contagem deve ser numérica%s: Intervalo deve ser numérico%s: Intervalo não informado, cancelando criação%s: 'bg' inválido%s: 'fg' inválido%s: Código de tecla inválido%s: 'target' inválido%s: Estilo de sublinhado inválido%s: código de tecla informado duas vezes, usando o do atributo nomeado%s: Código de tecla não informado, cancelando criação%s: Não existe tal mundo%s: Apenas variáveis escalares ($), arrays (@) e hashes (%%) podem ser feitas permanentes%s: Pattern informado duas vezes, usando o do atributo nomeado%s: Pattern não especificado, cancelando criação%s: Substituição informada duas vezes, usando a do atributo nomeado%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(-1 para repetir indefinidamente)(Você precisa reconectar para alterações fazerem efeito)0 linhas: 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 temposTooltipsConfiguração da janelaQuebra de linhasUm cliente de MUD com recursos poderosos e suporte para scripting com PerlIniciar log a_utomaticamente quando conectado_Ativar auto-compleção somente apósAçãoAdicionar isso ao c_omeço de cada linhaAdicionar isso ao fi_m 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ênciaAplicar a:Você 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_Fundo_Preto_Preto (negrito)PretoPreto (negrito)AzulAzul (negrito)_Texto em negrito_Fundo em negritoEm baixoBytes recebidos (comprimidos):Bytes recebidos (descomprimidos):Alterar _estiloCo_njunto de caracteres:_LimparCon_figurar...C_onectar_Personalizado: Nã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 estiloPersonagemCaractere para executar comandos _Perl: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 programaSe_parador de comandos:_Tempo conectado:CoresEco de _comandos:_Histórico de comandos...Histórico de comandosComando 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 mundo...Conectado 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 cone_xão:Tempo de conexão:Impossí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.Não foi possível abrir o arquivo de log: %s.Impossível abrir arquivo de dump bruto %s: %s Impossível abrir mundo '%s': %s Não foi possível encontrar o host %s: %sVezesVezes Cor_tarCia_noCia_no (negrito)CianoCiano (negrito)DIRPadrãoPadrão (negrito)DescriçãoDiretório para salvar a configuração e mundos salvosDesabilitar _aliasesDesabilitar _macrosDesabilitar _triggersDesabilitar t_imersDesconectadoDesconectado 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 segundos_Não excluirNão alterarNão exibirVocê realmente deseja apagar o %1$s?Você realmente deseja apagar %2$d %1$s?Você realmente deseja tornar a variável temporária?Você realmente deseja tornar %d variáveis temporárias?Para _baixoDuploEscreve 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 PerlEx_portarEditar 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 alive_Habilitar 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 _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 no arquivo de plugin: %sErro ao carregar interface do arquivo XML: %sErro ao carregar pluginErro 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.Procura por um comando contendo um determinado textoEncontrar comandoProcurar p_róximoProcurar _anteriorProcura pelo próximo comando com o mesmo textoFingerprint:GagGag logGeralVerdeVerde (negrito)HTTPTó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úmero %d para o evento %s Nome: %s Ação: %s Habilitado: %s HooksHooks para '%s': Host:Host:I_dentificar como 'Personagem - Nome do mundo'I_dentificar como 'Nome do mundo - Personagem'I_dentificar 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.Ig. caixaImportarInforme 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. Itens para e_xportarManter _abertoManter _permanenteCont execTeclaTroca de chave:Erro - KildClientInformação - KildClientKildClient prontoLín_gua:EsquerdaLinhas recebidas:Carregar pluginLogLog está desabilitado.Log não iniciado.Log desabilitado.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 MacrosMagentaMagenta (negrito)Janela principalTornar _temporária_Largura máxima da linha em caracteres:Mais de um comando selecionado.Enviar múltiplas linhasN/ANúmero de _linhas:NomeNunca _ocultar texto digitadoComandos mais novos estão no topoNãoNenhum método de autenticação aceitável.Sem login automáticoNenhum comando selecionado.Sem proxyNão existe tal aliasNão existe tal hookNão existe tal macroNão existe tal pluginNã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:Omitir (_gag) da tela de saídaOmitir (gag) do arquivo de _logHooks OnClos_eConnectHooks OnCo_nnectHooks OnSer_verDataHooks OnD_isconnectHooks On_GetFocusHooks On_LoseFocusHooks On_ReceivedTextHooks On_SentCommandUm %1$s apagado%2$d %1$s apagadosSó _resetar o contador de tempo inativo quando um comando é digitado diretamenteApenas variáveis escalares ($), arrays (@) e hashes (%%) podem ser feitas permanentes.Ou conecte d_iretamente:Mostra a informação da versão e sai_Senha:SenhaPadrãoIniciando negociação SSL...Variá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 macroProtocolo %s não habilitado.ProtocolosProxy_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 janela_Reverter às cores padrãoRealmente fechar?Realmente sair do KildClient?Recuper_ar e fecharVermelhoVermelho (negrito)Procurando host %s...Procurando host proxy %s...ReescritorDireitaSOCKS4SOCKS5Negociação SSL falhou: %sNegociação SSL demorou demais.Protocolo SSL usado:_Selecionar_Verificar ortografia do texto digitadoEs_tatísticas..._Rolar quando chega texto novoScriptsE_nviar e fecharDireçã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 caixa de entrada de comandos:Selecione a _fonte usada na janela principal:Selecione a fonte usada na janela principalSelecione 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:Po_rta do servidor:SimplesEspecifique 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 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 comandosEstatísticasBarra de status_Salvar comandos entre sessõesEstiloSubstituiçãoSucesso ao mover.TTL expirouT_imersTempTestar triggersA _parte númeroPor 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.Os triggers serão testados com o texto digitado aqui, como se fosse uma linha recebida do MUDToda a _linhaTodo o t_exto encontradoEntão enviar o conteúdo desse _arquivo:Há um mundo aberto. Você deseja realmente sair?Há %d mundos abertos. 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.Timer adicionado.Timer modificado.Timer número %d Nome: %s Intervalo: %.3f Número de vezes: %d Ação: %s Habilitado: %s Temporário: %s TimersEm cimaTrigger 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. Protocolo desconhecidoMundo sem nomeResposta do servidor proxy não foi reconhecida.Use %Kw para representar o nome do mundo, e %Kc para representar o nome do personagem usado no auto-logonUsar SS_LUsar fonte _negrito para cores destacadas (ao invés de apenas destacar)Usar configurações globais_Barra de entrada com múltiplas linhasBarra 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 https://www.kildclient.orgCuidado: Usar outro caractere usado para executar comandos Perl ao invés do padrão '/' não é recomendado, pois pode fazer com que plugins ou outros códigos parem de funcionar, se eles usam '/' para executar comandos Perl.Aviso: Tentando enviar uma linha muito longa. Talvez uma definição recursiva de alias?BrancoBranco (negrito)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) AmareloAmarelo (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.[MUNDO...]_Sobre_Ação:_Adicionar_AliasesPedir confirmação _antes de apagar triggers, aliases, etc._Fundo:A_zulA_zul (negrito)_Cancelar_Fechar_Copiar_Copiar endereço do linkA_guardar_Espera entre cada grupo de linhas/comandos:E_xcluir_Desabilitar_Desabilitar as setas para navegar no histórico_Desconectar_AparênciaNão permitir _que o mesmo comando seja enviado_Não mostrar esta mensagem novamente_Não sairPara _baixo_Ecoar comandos enviados na janela principal_Editar_Editar..._Habilitar se o servidor propuser após a conexão_HabilitadoE_vento:_Arquivo:_Finalmente, enviar esse texto:_Procurar_Procurar:Piscar _janela quando novo texto é recebido_Texto_Texto:_Formato:V_erdeV_erde (negrito)A_juda_Esconder abas se houver só um mundo aberto_Host:Tempo _inativo:_Ignorar maiúsculas e minúsculas_Importar_Incluir as últimas_Indentar linhas quebras por_Mensagens informativas:E_ntrada_Intervalo:_Itálico: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:Ca_rregar_Macros_Magenta_Magenta (negrito)_ManualEnviar _múltiplas linhas..._Nome da variável a ser tornada permanente:_Nome:_Novo_Próximo_Número de comandos para salvar no histórico:_Número de linhas/comandos para enviar de uma vez:_OK_Offline_Abrir_Abrir link_Abrir..._Senha:C_olar_Padrão:_Arquivo Perl para carregar:Variáveis _permanentes_Porta:_Preferências_Preferências...A_nteriorSa_irRe_cuperar_Reconectar_Vermelho_Vermelho (negrito)Número de _vezes:_Reverter ao padrãoTrigger _reescritor_Salvar_Selecione um mundo salvo:_Selecione a fonte usada na barra de status:_EnviarEnviar este coman_do:_Mostrar itens definidos por plugins_Dividir janelaCo_meçar_PararTa_chado:_Substituição:_Posição das abas:_Temporário (será deletado automaticamente quando o número de vezes atingir 0)_Testar triggers_Testar triggers..._Texto para procurar:_Triggers_Sublinhado:Para ci_maPara c_ima_Usuário:_Branco_Branco (negrito)_Mundo_Quebrar linhas entre palavras_Amarelo_Amarelo (negrito)_linhas do buffer de rolagem no logtipo de endereçamento não suportadoaliasaliasesalias: Cancelando criação de um alias sem patternalias: Cancelando criação de alias sem substituiçãopersonagemcaracteres terem sido digitadoscomando não suportado / erro de protocolocomando(s)conexão não permitida pelo conjunto de regrasconexão recusada pelo host destinofalha geralhookhookshook: Evento '%s' inválido host de destino inatingívellinha(s)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 falhousegundossegundos ca_datimertimersve_zes em seqüênciatriggertriggerscódigo de resposta desconhecidossimkildclient-3.2.0/po/sv.po0000644000175000017500000024212513220232041012160 00000000000000# KildClient messages in Swedish # Copyright (C) 2004-2017 Eduardo M Kalinowski, Niklas Grahn # This file is distributed under the same license as the KildClient package. # msgid "" msgstr "" "Project-Id-Version: KildClient 3.2.0\n" "Report-Msgid-Bugs-To: eduardo@kalinowski.com.br\n" "POT-Creation-Date: 2017-12-24 09:10-0200\n" "PO-Revision-Date: 2017-12-24 09:13-0200\n" "Last-Translator: Niklas Grahn \n" "Language-Team: Niklas Grahn \n" "Language: sv\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:63 msgid "Outputs version information and exits" msgstr "Matar ut versionsinformation och avslutar" #: ../src/main.c:65 msgid "Directory to store settings and saved worlds" msgstr "Katalog för att lagra inställningar och sparade världar i" #: ../src/main.c:65 msgid "DIR" msgstr "KAT" #: ../src/main.c:67 msgid "" "Dumps all data received from (after decompression, if appropriate) to the " "file" msgstr "" #: ../src/main.c:68 ../src/main.c:71 msgid "FILE" msgstr "FIL" #: ../src/main.c:70 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:101 msgid "[WORLD...]" msgstr "[VÄRLD...]" #: ../src/main.c:108 #, 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:113 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "Kunde inte öppna dumpfil %s: %s\n" #: ../src/main.c:120 #, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "Kunde inte öppna rå dumpfil %s: %s\n" #: ../src/main.c:240 #, c-format msgid "There is one open world. Do you really want to quit?" msgid_plural "There are %d open worlds. Do you really want to quit?" msgstr[0] "Det finns en öppen värld. Vill du verkligen avsluta?" msgstr[1] "Det finns %d öppna världar. Vill du verkligen avsluta?" #: ../src/main.c:244 msgid "Really quit KildClient?" msgstr "Vill du verkligen avsluta KildClient?" #: ../src/main.c:246 msgid "_Don't quit" msgstr "Avsluta _inte" #: ../src/main.c:247 ../src/wndmain.ui:146 msgid "_Quit" msgstr "_Avsluta" #: ../src/net.c:166 ../src/proxy.c:209 #, c-format msgid "Resolving proxy host %s..." msgstr "Slår upp proxyvärd %s..." #: ../src/net.c:169 #, c-format msgid "Resolving host %s..." msgstr "Slår upp värd %s..." #: ../src/net.c:262 ../src/proxy.c:193 #, c-format msgid "Could not resolve host %s: %s" msgstr "Kunde inte slå upp värd %s: %s" #: ../src/net.c:290 #, 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:293 #, 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:309 #, c-format msgid "Could not create socket: %s" msgstr "Kunde inte skapa sockel: %s" #: ../src/net.c:312 #, c-format msgid "Could not create socket: error #%d" msgstr "Kunde inte skapa sockel: fel #%d" #: ../src/net.c:332 #, 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:342 #, 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:398 #, c-format msgid "Unable to connect to host %s: %s." msgstr "Kunde inte ansluta till värd %s: %s." #: ../src/net.c:401 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "Kunde inte ansluta till proxyvärd %s: %s." #: ../src/net.c:443 ../src/net.c:461 #, c-format msgid "Unable to connect to host %s: error #%d." msgstr "Kunde inte ansluta till värd %s: fel #%d." #: ../src/net.c:446 ../src/net.c:464 #, 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:499 #, c-format msgid "Performing SSL handshake..." msgstr "" #. Fatal error #: ../src/net.c:542 #, c-format msgid "SSL handshake failed: %s" msgstr "" #: ../src/net.c:583 #, c-format msgid "SSL handshake took too long." msgstr "" #: ../src/net.c:605 ../src/net.c:1091 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "Ansluten till värd %s (%s) port %s." #: ../src/net.c:608 ../src/net.c:1094 #, 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:615 ../src/net.c:1067 ../src/net.c:1101 msgid " SSL enabled." msgstr " SSL avktiverat." #: ../src/net.c:770 #, c-format msgid "Disconnected from host %s." msgstr "Frånkopplad från värd %s." #: ../src/net.c:838 ../src/net.c:846 #, c-format msgid "Disconnected from host %s: %s." msgstr "Frånkopplad från värd %s: %s." #: ../src/net.c:857 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "Frånkopplad från värd %s: fel #%d." #: ../src/net.c:1055 #, 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:1059 #, 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:1177 ../src/we_logging.c:121 msgid "Not connected." msgstr "Inte ansluten." #. success #: ../src/proxy.c:57 msgid "general failure" msgstr "" #: ../src/proxy.c:58 msgid "connection not allowed by ruleset" msgstr "" #: ../src/proxy.c:59 msgid "network unreachable" msgstr "nätverk oåtkomligt" #: ../src/proxy.c:60 msgid "host unreachable" msgstr "värd oåtkomlig" #: ../src/proxy.c:61 msgid "connection refused by destination host" msgstr "anslutning vägrades av målvärd" #: ../src/proxy.c:62 msgid "TTL expired" msgstr "TTL har utgått" #: ../src/proxy.c:63 msgid "command not supported / protocol error" msgstr "kommando stöds inte / protokollfel" #: ../src/proxy.c:64 msgid "address type not supported" msgstr "adresstyp stöds inte" #: ../src/proxy.c:239 ../src/proxy.c:661 #, 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:294 ../src/proxy.c:423 ../src/proxy.c:468 ../src/proxy.c:542 #: ../src/proxy.c:708 msgid "Error while reading from proxy host." msgstr "" #: ../src/proxy.c:315 msgid "request rejected or failed" msgstr "begäran nekades eller misslyckades" #: ../src/proxy.c:319 msgid "request failed because identd could not be reached" msgstr "" #: ../src/proxy.c:323 msgid "" "request failed because client's identd could not confirm the user ID string " "in the request" msgstr "" #: ../src/proxy.c:327 ../src/proxy.c:568 ../src/proxy.c:724 #, c-format msgid "Proxy request failed: %s." msgstr "Proxybegäran misslyckades: %s." #: ../src/proxy.c:344 #, 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:438 msgid "No acceptable proxy authentication methods." msgstr "Inga acceptabla metoder för proxyautentisering." #: ../src/proxy.c:486 msgid "Proxy authentication failed." msgstr "Proxyautentisering misslyckades." #. Should never happen #: ../src/proxy.c:529 msgid "Unrecognized response from proxy host." msgstr "Okänt svar från proxyvärd." #: ../src/proxy.c:563 msgid "unknown reason code" msgstr "" #: ../src/proxy.c:584 #, c-format msgid "Sending proxy authentication credentials..." msgstr "Skickar referenser för proxyautentisering..." #: ../src/proxy.c:623 #, c-format msgid "Sending connection request..." msgstr "Skickar anslutningsbegäran..." #: ../src/mainwindow.c:162 ../src/mainwindow.c:608 ../src/mainwindow.c:874 #: ../src/worldgui.c:1132 ../src/worldselector.c:186 ../src/worldeditor.c:178 #: ../src/we_general.c:334 ../src/we_generic_guied.c:81 ../src/we_triggers.c:83 #: ../src/we_triggers.c:553 ../src/we_triggers.c:744 ../src/we_aliases.c:76 #: ../src/we_aliases.c:455 ../src/we_macros.c:79 ../src/we_macros.c:420 #: ../src/we_timers.c:76 ../src/we_timers.c:458 ../src/we_hooks.c:87 #: ../src/we_hooks.c:620 ../src/we_vars.c:76 ../src/we_vars.c:362 #: ../src/prefs.c:106 ../src/triggers.c:277 ../src/multilinesend.c:92 #: ../src/cmdhistory.c:209 ../src/cmdhistory.c:439 #, fuzzy, c-format msgid "Error loading UI from XML file: %s" msgstr "Fel i filen för insticksmodul: %s" #: ../src/mainwindow.c:668 ../src/mainwindow.c:669 msgid "Not connected" msgstr "Inte ansluten" #: ../src/mainwindow.c:810 msgid ": Not yet active" msgstr ": Inte ännu aktiv" #: ../src/mainwindow.c:815 msgid ": Expired" msgstr ": Utgått" #: ../src/mainwindow.c:829 ../src/kildclient.ui:1898 #: ../src/dlgStatistics.ui:114 ../src/dlgStatistics.ui:327 msgid "None" msgstr "Ingen" #: ../src/worldgui.c:229 msgid "_Find:" msgstr "_Sök:" #: ../src/worldgui.c:243 ../src/wndmain.ui:216 ../src/wndmain.ui:272 #: ../src/dlgCmdHistory.ui:195 msgid "Find n_ext" msgstr "Sök n_ästa" #: ../src/worldgui.c:270 msgid "Click to clear the command input area." msgstr "Klicka för att tömma kommandoinmatningsrutan." #: ../src/worldgui.c:376 msgid "No world" msgstr "Ingen värld" #: ../src/worldgui.c:425 msgid "KildClient ready" msgstr "KildClient redo" #: ../src/worldgui.c:435 msgid "0 lines" msgstr "0 rader" #: ../src/worldgui.c:895 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:896 msgid "Really close?" msgstr "Vill du verkligen stänga?" #: ../src/worldgui.c:898 msgid "Keep _open" msgstr "Behåll _öppen" #: ../src/worldgui.c:899 ../src/worldselector.c:799 ../src/worldselector.c:805 #: ../src/wndmain.ui:82 ../src/dlgPreferences.ui:155 #: ../src/dlgTestTriggers.ui:41 ../src/dlgCmdHistory.ui:125 msgid "_Close" msgstr "S_täng" #: ../src/worldgui.c:1064 #, c-format msgid "Error setting spell checker: %s\n" msgstr "Fel uppstod vid inställning av stavningskontrollerare: %s\n" #: ../src/worldgui.c:1318 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:1484 msgid "Not found" msgstr "Hittades inte" #: ../src/ansitextview.c:429 #, c-format msgid "%d line" msgid_plural "%d lines" msgstr[0] "%d rad" msgstr[1] "%d rader" #: ../src/worldselector.c:135 ../src/worldselector.c:677 #, 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:487 #, c-format msgid "Could not open world '%s': %s\n" msgstr "Kunde inte öppna värld '%s': %s\n" #: ../src/worldselector.c:530 #, fuzzy, c-format msgid "Invalid argument '%s'\n" msgstr "Ogiltigt attribut '%s' för element '%s'" #: ../src/worldselector.c:793 msgid "Disconnected" msgstr "Frånkopplad" #: ../src/worldselector.c:796 ../src/worldselector.c:803 ../src/wndmain.ui:58 msgid "_Reconnect" msgstr "_Återanslut" #: ../src/worldselector.c:797 ../src/worldselector.c:804 msgid "Connect to _another world" msgstr "Anslut till en _annan värld" #: ../src/worldselector.c:798 msgid "_Offline" msgstr "_Frånkopplad" #: ../src/worlds.c:772 msgid "Unnamed world" msgstr "Namnlös värld" #: ../src/worlds.c:829 ../src/worlds.c:2346 ../src/we_generic_guied.c:311 #: ../src/prefs.c:431 #, c-format msgid "Could not open file '%s': %s" msgstr "Kunde inte öppna fil '%s': %s" #: ../src/worlds.c:892 #, fuzzy, c-format msgid "Invalid top-level element '%s'" msgstr "Ogiltigt attribut '%s' för element '%s'" #: ../src/worlds.c:1695 #, 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:1964 #, c-format msgid "Invalid key code '%s'" msgstr "" #: ../src/worlds.c:1983 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "Element '%s' är inte tillåtet inuti element '%s'" #: ../src/worlds.c:1996 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "Ogiltigt attribut '%s' för element '%s'" #: ../src/worlds.c:2503 #, c-format msgid "Disconnected from world %s" msgstr "Frånkopplad från värld %s" #: ../src/worldeditor.c:239 msgid "General" msgstr "Allmänt" #: ../src/worldeditor.c:247 ../src/worldeditor.c:251 msgid "Display" msgstr "Skärm" #: ../src/worldeditor.c:248 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:259 msgid "Main window" msgstr "Huvudfönster" #: ../src/worldeditor.c:267 msgid "Colors" msgstr "Färger" #: ../src/worldeditor.c:275 msgid "Status bar" msgstr "Statusmätare" #: ../src/worldeditor.c:283 msgid "Input" msgstr "Inmatning" #: ../src/worldeditor.c:291 msgid "Logging" msgstr "Loggning" #: ../src/worldeditor.c:297 ../src/worldeditor.c:301 msgid "Automation" msgstr "Automatisering" #: ../src/worldeditor.c:298 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:309 msgid "Scripting" msgstr "Skriptning" #: ../src/worldeditor.c:317 msgid "Plugins" msgstr "Insticksmoduler" #: ../src/worldeditor.c:328 msgid "Triggers" msgstr "" #: ../src/worldeditor.c:339 msgid "Aliases" msgstr "Alias" #: ../src/worldeditor.c:350 msgid "Macros" msgstr "Makrotar" #: ../src/worldeditor.c:361 msgid "Timers" msgstr "Tidur" #: ../src/worldeditor.c:372 msgid "Hooks" msgstr "" #: ../src/worldeditor.c:383 msgid "Variables" msgstr "Variabler" #: ../src/worldeditor.c:392 msgid "Protocols" msgstr "Protokoll" #: ../src/worldeditor.c:400 msgid "Advanced" msgstr "Avancerat" #: ../src/we_general.c:73 msgid "Character" msgstr "Karaktär" #: ../src/we_general.c:81 msgid "Password" msgstr "Lösenord" #: ../src/we_general.c:373 msgid "You must specify the name." msgstr "Du måste ange namnet." #: ../src/we_general.c:380 msgid "You must specify the password." msgstr "Du måste ange lösenordet." #: ../src/we_general.c:418 msgid "character" msgstr "karaktär" #: ../src/we_logging.c:110 ../src/log.c:104 #, c-format msgid "Logging to file %s." msgstr "Loggar till filen %s." #: ../src/we_logging.c:116 msgid "Logging is disabled." msgstr "Loggning är inaktiverad." #: ../src/we_logging.c:209 msgid "Logging not started" msgstr "Loggning har inte startat" #: ../src/we_logging.c:238 msgid "Select log file" msgstr "Markera loggfil" #: ../src/we_logging.c:241 ../src/we_plugins.c:574 ../src/we_generic_guied.c:97 #: ../src/we_generic_guied.c:364 ../src/kildclient.ui:64 #: ../src/kildclient.ui:342 ../src/kildclient.ui:559 ../src/kildclient.ui:682 #: ../src/kildclient.ui:865 ../src/kildclient.ui:1069 ../src/kildclient.ui:1369 #: ../src/kildclient.ui:1943 ../src/dlgSelectWorld.ui:43 #: ../src/dlgEditWorld.ui:132 ../src/dlgMLSend.ui:54 #: ../src/dlgCmdHistory.ui:348 msgid "_Cancel" msgstr "_Avbryt" #: ../src/we_logging.c:243 ../src/kildclient.ui:78 ../src/kildclient.ui:356 #: ../src/kildclient.ui:573 ../src/kildclient.ui:696 ../src/kildclient.ui:879 #: ../src/kildclient.ui:1083 ../src/kildclient.ui:1383 #: ../src/kildclient.ui:1957 ../src/dlgStatistics.ui:40 #: ../src/dlgEditWorld.ui:146 ../src/dlgCmdHistory.ui:362 msgid "_OK" msgstr "_OK" #: ../src/we_plugins.c:124 ../src/we_plugins.c:336 ../src/we_triggers.c:225 #: ../src/we_aliases.c:206 ../src/we_macros.c:209 ../src/we_timers.c:206 #: ../src/we_hooks.c:341 ../src/perlscript.c:3429 msgid "Name" msgstr "Namn" #: ../src/we_plugins.c:136 ../src/we_plugins.c:378 ../src/perlscript.c:3430 msgid "Description" msgstr "Beskrivning" #: ../src/we_plugins.c:148 ../src/we_plugins.c:364 msgid "Author" msgstr "Upphovsman" #: ../src/we_plugins.c:161 msgid "File" msgstr "Fil" #: ../src/we_plugins.c:205 ../src/we_plugins.c:457 msgid "Error loading plugin" msgstr "Fel vid inläsning av insticksmodul" #: ../src/we_plugins.c:322 ../src/we_triggers.c:211 ../src/we_aliases.c:192 #: ../src/we_macros.c:195 ../src/we_timers.c:192 ../src/we_hooks.c:327 msgid "Enabled" msgstr "Aktiverat(d)" #: ../src/we_plugins.c:350 msgid "Version" msgstr "Version" #: ../src/we_plugins.c:439 msgid "Always load this plugin at _startup" msgstr "Läs alltid in denna insticksmodul vid _uppstart" #: ../src/we_plugins.c:497 msgid "The help is displayed in main window." msgstr "Hjälpen visas i huvudfönstret." #: ../src/we_plugins.c:498 msgid "KildClient information" msgstr "KildClient-information" #: ../src/we_plugins.c:499 msgid "_Do not display this message again" msgstr "_Visa inte detta meddelande igen" #: ../src/we_plugins.c:571 msgid "Load plugin" msgstr "Läs in insticksmodul" #: ../src/we_plugins.c:576 ../src/we_generic_guied.c:366 msgid "_Open" msgstr "_Öppna" #: ../src/we_generic_guied.c:94 msgid "Export" msgstr "Exportera" #: ../src/we_generic_guied.c:99 ../src/wndmain.ui:104 msgid "_Save" msgstr "_Spara" #: ../src/we_generic_guied.c:361 msgid "Import" msgstr "Importera" #: ../src/we_generic_guied.c:393 #, c-format msgid "Could not import file '%s': %s" msgstr "Kunde inte importera fil '%s': %s" #: ../src/we_generic_guied.c:948 #, c-format msgid "Do you really want to delete the %1$s?" msgid_plural "Do you really want to delete %2$d %1$s?" msgstr[0] "Vill du verkligen ta bort filen %1$s?" msgstr[1] "Vill du verkligen ta bort %2$d %1$s?" #: ../src/we_generic_guied.c:952 ../src/we_vars.c:282 msgid "Confirm deletion" msgstr "Bekräfta borttagelse" #: ../src/we_generic_guied.c:954 msgid "Do _not delete" msgstr "Ta _inte bort" #: ../src/we_generic_guied.c:955 ../src/kildclient.ui:1736 #: ../src/wndmain.ui:194 ../src/dlgSelectWorld.ui:151 #: ../src/dlgEditWorld.ui:634 ../src/dlgEditWorld.ui:3290 msgid "_Delete" msgstr "_Ta bort" #: ../src/we_triggers.c:130 msgid "_Test triggers" msgstr "" #: ../src/we_triggers.c:239 ../src/we_aliases.c:220 ../src/triggers.c:140 #: ../src/aliases.c:176 msgid "Pattern" msgstr "Mönster" #: ../src/we_triggers.c:257 ../src/we_aliases.c:238 msgid "Ig. case" msgstr "" #: ../src/we_triggers.c:271 ../src/we_macros.c:237 ../src/we_timers.c:246 #: ../src/we_hooks.c:355 ../src/triggers.c:141 ../src/macros.c:145 #: ../src/timers.c:202 msgid "Action" msgstr "Åtgärd" #: ../src/we_triggers.c:289 msgid "Gag" msgstr "" #: ../src/we_triggers.c:307 msgid "Gag log" msgstr "" #: ../src/we_triggers.c:325 msgid "Keep exec" msgstr "" #: ../src/we_triggers.c:343 msgid "Rewriter" msgstr "" #: ../src/we_triggers.c:361 msgid "Style" msgstr "Stil" #: ../src/we_triggers.c:375 ../src/we_aliases.c:284 ../src/we_macros.c:251 #: ../src/we_timers.c:278 ../src/we_hooks.c:369 msgid "Plugin" msgstr "Insticksmodul" #: ../src/we_triggers.c:470 ../share/kildclient.pl:803 #: ../share/kildclient.pl:865 msgid "trigger" msgid_plural "triggers" msgstr[0] "" msgstr[1] "" #: ../src/we_triggers.c:635 ../src/we_aliases.c:516 msgid "You must specify the pattern." msgstr "Du måste ange mönstret." #: ../src/we_triggers.c:643 msgid "" "You must specify the action, unless the trigger is a gag or changes the " "style." msgstr "" #: ../src/we_aliases.c:252 ../src/aliases.c:177 msgid "Substitution" msgstr "" #: ../src/we_aliases.c:270 msgid "Eval as Perl" msgstr "Eval som Perl" #: ../src/we_aliases.c:379 ../share/kildclient.pl:815 #: ../share/kildclient.pl:866 msgid "alias" msgid_plural "aliases" msgstr[0] "alias" msgstr[1] "alias" #: ../src/we_aliases.c:523 msgid "You must specify the substitution." msgstr "" #: ../src/we_macros.c:223 ../src/macros.c:144 msgid "Key" msgstr "Tangent" #: ../src/we_macros.c:346 ../share/kildclient.pl:827 ../share/kildclient.pl:867 msgid "macro" msgid_plural "macros" msgstr[0] "makro" msgstr[1] "makrotar" #: ../src/we_macros.c:476 msgid "You must specify the key." msgstr "Du måste ange tangenten." #: ../src/we_macros.c:483 msgid "Invalid key code." msgstr "" #: ../src/we_macros.c:490 ../src/we_timers.c:523 ../src/we_hooks.c:671 msgid "You must specify the action." msgstr "Du måste ange åtgärden." #: ../src/we_timers.c:219 msgid "Interval" msgstr "Intervall" #: ../src/we_timers.c:232 msgid "Count" msgstr "Antal" #: ../src/we_timers.c:264 msgid "Temp" msgstr "" #: ../src/we_timers.c:380 ../share/kildclient.pl:839 ../share/kildclient.pl:868 msgid "timer" msgid_plural "timers" msgstr[0] "tidur" msgstr[1] "tidur" #: ../src/we_timers.c:516 msgid "The interval must be positive." msgstr "Intervallet måste vara positivt." #. The manually added combo for selecting which hook #: ../src/we_hooks.c:130 msgid "_Event:" msgstr "_Händelse:" #: ../src/we_hooks.c:546 ../share/kildclient.pl:852 ../share/kildclient.pl:869 msgid "hook" msgid_plural "hooks" msgstr[0] "" msgstr[1] "" #: ../src/we_vars.c:278 #, c-format msgid "Do you really want to make the variable temporary?" msgid_plural "Do you really want to make %d variables temporary?" msgstr[0] "Vill du verkligen göra variabeln temporär?" msgstr[1] "Vill du verkligen göra %d variabler temporära?" #: ../src/we_vars.c:284 msgid "Keep _permanent" msgstr "Behåll _permanent" #: ../src/we_vars.c:285 msgid "Make _temporary" msgstr "Gör _temporär" #: ../src/we_vars.c:389 msgid "You must specify a variable name." msgstr "Du måste ange ett namn på variabeln." #: ../src/we_vars.c:395 #, c-format msgid "" "Only scalar ($), array (@) and hash (%%) variables can be made permanent." msgstr "" #: ../src/we_vars.c:408 #, c-format msgid "%s is already permanent." msgstr "%s är redan permanent." #: ../src/prefs.c:387 #, c-format msgid "Invalid window size specification in config file.\n" msgstr "Ogiltig angivelse för fönsterstorlek i konfigurationsfil.\n" #: ../src/prefs.c:407 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "Okänd katalog '%s' i konfigurationsfil.\n" #: ../src/prefs.c:501 #, c-format msgid "Could not create directory '%s': %s" msgstr "Kunde inte skapa katalog '%s': %s" #: ../src/parser.c:211 msgid "" "Warning: Trying to send a very long command line. Perhaps a recursive alias " "definition?" msgstr "" #: ../src/triggers.c:139 #, 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:161 ../src/triggers.c:162 ../src/triggers.c:163 #: ../src/triggers.c:164 ../src/triggers.c:165 ../src/triggers.c:166 #: ../src/triggers.c:167 ../src/aliases.c:197 ../src/aliases.c:198 #: ../src/aliases.c:199 ../src/macros.c:167 ../src/timers.c:225 #: ../src/timers.c:226 ../src/hooks.c:206 ../src/perlscript.c:3449 msgid "y" msgstr "j" #: ../src/triggers.c:161 ../src/triggers.c:162 ../src/triggers.c:163 #: ../src/triggers.c:164 ../src/triggers.c:165 ../src/triggers.c:166 #: ../src/triggers.c:167 ../src/aliases.c:197 ../src/aliases.c:198 #: ../src/aliases.c:199 ../src/macros.c:167 ../src/timers.c:225 #: ../src/timers.c:226 ../src/hooks.c:206 ../src/perlscript.c:3449 msgid "n" msgstr "n" #: ../src/triggers.c:361 ../src/kildclient.ui:1918 msgid "No" msgstr "Nej" #: ../src/triggers.c:361 ../src/kildclient.ui:1921 msgid "Yes" msgstr "Ja" #: ../src/aliases.c:175 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "Num Eval Ena IgC %-*.*s %-*.*s\n" #: ../src/macros.c:143 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "Num Ena %-*.*s %-*.*s\n" #: ../src/timers.c:194 msgid "Num Ena Temp Int " msgstr "" #: ../src/timers.c:198 msgid "Count " msgstr "Antal" #: ../src/permanentvariables.c:115 #, 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:60 ../src/hooks.c:442 #, c-format msgid "hook: Invalid event '%s'\n" msgstr "" #: ../src/hooks.c:76 ../src/hooks.c:225 ../share/kildclient.pl:885 msgid "No such hook" msgstr "" #: ../src/hooks.c:191 #, c-format msgid "Hooks for '%s':\n" msgstr "Hooks for '%s':\n" #: ../src/hooks.c:192 msgid "Num Ena Action" msgstr "" #: ../src/hooks.c:230 #, 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:236 ../src/perlscript.c:1769 ../src/perlscript.c:2272 #: ../src/perlscript.c:2582 ../src/perlscript.c:2870 msgid "Not set" msgstr "Inte inställt" #: ../src/hooks.c:238 ../src/perlscript.c:1772 ../src/perlscript.c:1773 #: ../src/perlscript.c:1774 ../src/perlscript.c:1775 ../src/perlscript.c:1776 #: ../src/perlscript.c:1777 ../src/perlscript.c:1778 ../src/perlscript.c:2275 #: ../src/perlscript.c:2276 ../src/perlscript.c:2277 ../src/perlscript.c:2585 #: ../src/perlscript.c:2874 ../src/perlscript.c:2875 ../src/perlscript.c:3487 msgid "yes" msgstr "ja" #: ../src/hooks.c:238 ../src/perlscript.c:1772 ../src/perlscript.c:1773 #: ../src/perlscript.c:1774 ../src/perlscript.c:1775 ../src/perlscript.c:1776 #: ../src/perlscript.c:1777 ../src/perlscript.c:1778 ../src/perlscript.c:2275 #: ../src/perlscript.c:2276 ../src/perlscript.c:2277 ../src/perlscript.c:2585 #: ../src/perlscript.c:2874 ../src/perlscript.c:2875 ../src/perlscript.c:3487 msgid "no" msgstr "nej" #: ../src/log.c:121 msgid "File name not specified." msgstr "Filnamnet är inte angivet." #: ../src/log.c:187 #, c-format msgid "Could not open log file: %s." msgstr "Kunde inte öppna loggfil: %s." #: ../src/plugins.c:101 ../src/plugins.c:160 #, c-format msgid "Failed loading file %s: %s" msgstr "Misslyckades med att läsa in fil %s: %s" #: ../src/cmdhistory.c:273 msgid "No command selected." msgstr "Inget kommando markerat." #: ../src/cmdhistory.c:277 msgid "More than one command selected." msgstr "Fler än ett kommando markerat." #: ../src/cmdhistory.c:466 msgid "Enter some text to search for." msgstr "Skriv in lite text att söka efter." #: ../src/cmdhistory.c:491 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:540 msgid "Command not found." msgstr "Kommando hittades inte." #: ../src/util.c:180 msgid "KildClient error" msgstr "KildClient-fel" #: ../src/perlscript.c:509 ../src/perlscript.c:515 ../src/perlscript.c:522 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "" #: ../src/perlscript.c:706 ../src/perlscript.c:723 ../src/perlscript.c:785 #: ../src/perlscript.c:818 ../src/perlscript.c:1224 ../src/perlscript.c:1287 #: ../src/perlscript.c:1389 ../src/perlscript.c:1409 ../src/perlscript.c:1433 #: ../src/perlscript.c:1461 ../src/perlscript.c:1470 ../src/perlscript.c:2010 #: ../src/perlscript.c:2019 ../src/perlscript.c:2198 ../src/perlscript.c:2373 #: ../src/perlscript.c:2382 ../src/perlscript.c:2661 ../src/perlscript.c:2670 #: ../src/perlscript.c:2945 ../src/perlscript.c:2999 ../src/perlscript.c:3044 #: ../src/perlscript.c:3109 ../src/perlscript.c:3120 ../src/perlscript.c:3212 #: ../src/perlscript.c:3536 ../src/kcwin.c:96 #, c-format msgid "%s: Too few arguments" msgstr "%s: För få argument" #: ../src/perlscript.c:751 #, c-format msgid "%s: Argument must be numeric" msgstr "%s: Argumentet måste vara numeriskt" #: ../src/perlscript.c:799 ../src/perlscript.c:831 #, c-format msgid "%s: No such world" msgstr "%s: Ingen sådan värld" #: ../src/perlscript.c:866 msgid "World saved." msgstr "Värld sparad." #: ../src/perlscript.c:1120 ../src/perlscript.c:1135 ../src/perlscript.c:1145 #: ../src/perlscript.c:1345 ../share/kildclient.pl:1324 #, c-format, perl-format msgid "%s: This is an internal function, do not call directly." msgstr "" #: ../src/perlscript.c:1124 ../src/perlscript.c:1592 ../src/perlscript.c:2121 #: ../src/perlscript.c:2497 ../src/perlscript.c:2691 ../src/perlscript.c:3173 #, c-format msgid "%s: Wrong argument type" msgstr "%s: Fel argumentstyp" #: ../src/perlscript.c:1355 ../src/perlscript.c:1361 #, fuzzy, c-format msgid "Protocol %s not enabled." msgstr "Insticksmodul aktiverad." #: ../src/perlscript.c:1366 ../share/kildclient.pl:1166 #, fuzzy msgid "Unknown protocol" msgstr "Okänd" #: ../src/perlscript.c:1484 ../src/perlscript.c:1752 ../share/kildclient.pl:881 msgid "No such trigger" msgstr "Inget sådant tidur" #: ../src/perlscript.c:1502 ../src/perlscript.c:2051 ../src/perlscript.c:2426 #: ../src/perlscript.c:3132 #, c-format msgid "%s: Too many string arguments" msgstr "" #: ../src/perlscript.c:1525 ../src/perlscript.c:2074 #, c-format msgid "%s: Pattern given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:1537 ../src/perlscript.c:2475 ../src/perlscript.c:3152 #, c-format msgid "%s: Action given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:1583 ../src/perlscript.c:2112 ../src/perlscript.c:2488 #: ../src/perlscript.c:3165 #, c-format msgid "%s: Wrong type of reference" msgstr "%s: Fel referenstyp" #: ../src/perlscript.c:1603 #, c-format msgid "%s: Pattern not specified, not creating" msgstr "%s: Mönstret är inte angivet, skapar inte" #: ../src/perlscript.c:1612 #, c-format msgid "%s: Action not specified, and isn't gag, not creating" msgstr "" #: ../src/perlscript.c:1641 msgid "Trigger added." msgstr "" #: ../src/perlscript.c:1646 msgid "Trigger modified." msgstr "" #: ../src/perlscript.c:1671 #, c-format msgid "%s: Invalid target" msgstr "%s: Ogiltigt mål" #: ../src/perlscript.c:1681 #, c-format msgid "%s: Invalid fg color" msgstr "%s: Ogiltig förgrundsfärg" #: ../src/perlscript.c:1691 #, c-format msgid "%s: Invalid bg color" msgstr "%s: Ogiltig bakgrundsfärg" #: ../src/perlscript.c:1701 #, c-format msgid "%s: Invalid underline style" msgstr "%s: Ogiltig understreckstil" #: ../src/perlscript.c:1757 #, 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:1781 #, 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:2033 ../src/perlscript.c:2259 ../share/kildclient.pl:882 msgid "No such alias" msgstr "Inget sådant alias" #: ../src/perlscript.c:2086 #, c-format msgid "%s: Substitution given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:2132 msgid "alias: Not creating alias without pattern" msgstr "alias: Skapar inte alias utan mönster" #: ../src/perlscript.c:2140 msgid "alias: Not creating alias without substitution" msgstr "" #: ../src/perlscript.c:2168 msgid "Alias added." msgstr "Alias tillagt." #: ../src/perlscript.c:2173 msgid "Alias modified." msgstr "Alias modifierat." #: ../src/perlscript.c:2264 #, 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:2344 msgid "Press a key to get its keycode." msgstr "" #: ../src/perlscript.c:2396 ../src/perlscript.c:2570 ../share/kildclient.pl:883 msgid "No such macro" msgstr "Inget sådant makro" #: ../src/perlscript.c:2415 ../src/perlscript.c:2463 #, c-format msgid "%s: Invalid key code" msgstr "" #: ../src/perlscript.c:2452 #, c-format msgid "%s: Keycode given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:2508 #, c-format msgid "%s: Keycode not specified, not creating" msgstr "" #: ../src/perlscript.c:2515 ../src/perlscript.c:2782 #, c-format msgid "%s: Action not specified, not creating" msgstr "%s: Åtgärden är inte angiven, skapar inte" #: ../src/perlscript.c:2534 msgid "Macro added." msgstr "Makro tillagt." #: ../src/perlscript.c:2539 msgid "Macro modified." msgstr "Makro modifierat." #: ../src/perlscript.c:2576 #, 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:2685 ../src/perlscript.c:2857 ../share/kildclient.pl:884 msgid "No such timer" msgstr "Inget sådant tidur" #: ../src/perlscript.c:2710 #, c-format msgid "%s: Interval must be numeric" msgstr "%s: Intervall måste vara numeriskt" #: ../src/perlscript.c:2723 #, c-format msgid "%s: Count must be numeric" msgstr "%s: Antal måste vara numeriskt" #: ../src/perlscript.c:2754 #, c-format msgid "%s: Interval not specified, not creating" msgstr "%s: Intervallet är inte angivet, skapar inte" #: ../src/perlscript.c:2761 #, c-format msgid "%s: Cannot create timer with negative interval" msgstr "" #: ../src/perlscript.c:2822 msgid "Timer added." msgstr "Tidur tillaggt." #: ../src/perlscript.c:2827 msgid "Timer modified." msgstr "Tidur modifierat." #: ../src/perlscript.c:2862 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %.3f\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" "Tidursnummer %d\n" " Namn: %s\n" " Intervall: %.3f\n" " Antal upprepningar: %d\n" " Åtgärd: %s\n" " Aktiverat: %s\n" " Temporärt: %s\n" #: ../src/perlscript.c:2953 #, c-format msgid "" "%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent" msgstr "" #: ../src/perlscript.c:2962 #, c-format msgid "%s: %s is already permanent" msgstr "%s: %s är redan permanent" #: ../src/perlscript.c:2976 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "%s: Variabel '%s' gjord permanent.\n" #: ../src/perlscript.c:3018 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "%s: Variabel '%s' gjord temporär.\n" #: ../src/perlscript.c:3022 #, c-format msgid "%s: %s is not permanent" msgstr "%s: %s är inte permanent" #: ../src/perlscript.c:3075 msgid "Permanent variables" msgstr "Permanenta variabler" #: ../src/perlscript.c:3187 msgid "Hook defined." msgstr "" #: ../src/perlscript.c:3191 msgid "Hook modified." msgstr "" #: ../src/perlscript.c:3296 msgid "Logging stopped." msgstr "Loggning stoppad." #: ../src/perlscript.c:3428 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "Num Ena %-*.*s Version %-*.*s\n" #: ../src/perlscript.c:3471 msgid "No such plugin" msgstr "Ingen sådan insticksmodul" #: ../src/perlscript.c:3476 #, 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.ui:48 msgid "Edit timer" msgstr "Redigera tidur" #: ../src/kildclient.ui:107 ../src/kildclient.ui:385 ../src/kildclient.ui:602 #: ../src/kildclient.ui:747 ../src/kildclient.ui:908 ../src/kildclient.ui:1112 #: ../src/dlgEditWorld.ui:229 ../src/dlgEditWorld.ui:2855 msgid "_Name:" msgstr "_Namn:" #: ../src/kildclient.ui:120 msgid "Enter optionally a descriptive name for the timer" msgstr "Skriv in, om du vill, ett beskrivande namn för tiduret" #: ../src/kildclient.ui:132 msgid "_Interval:" msgstr "_Intervall:" #: ../src/kildclient.ui:149 msgid "Specify the interval, in seconds, between timer activations" msgstr "Ange intervallet, i sekunder, mellan tidursaktiveringar" #: ../src/kildclient.ui:165 msgid "seconds" msgstr "sekund(er)" #: ../src/kildclient.ui:183 msgid "_Repeat count:" msgstr "Antal _upprepningar:" #: ../src/kildclient.ui:200 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.ui:215 msgid "(-1 to repeat indefinitely)" msgstr "" #: ../src/kildclient.ui:233 ../src/kildclient.ui:772 ../src/kildclient.ui:970 #: ../src/kildclient.ui:1173 msgid "_Action:" msgstr "_Åtgärd:" #: ../src/kildclient.ui:246 msgid "Enter the action to be executed whenever the timer fires" msgstr "" #: ../src/kildclient.ui:256 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.ui:259 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.ui:271 ../src/kildclient.ui:485 ../src/kildclient.ui:795 #: ../src/kildclient.ui:993 ../src/kildclient.ui:1297 msgid "_Enabled" msgstr "A_ktiverat(d)" #: ../src/kildclient.ui:274 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.ui:287 ../src/kildclient.ui:501 ../src/kildclient.ui:811 #: ../src/kildclient.ui:1009 ../src/kildclient.ui:1313 msgid "Note:" msgstr "Observera:" #: ../src/kildclient.ui:299 ../src/kildclient.ui:513 ../src/kildclient.ui:823 #: ../src/kildclient.ui:1021 ../src/kildclient.ui:1325 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.ui:326 msgid "Edit alias" msgstr "Redigera alias" #: ../src/kildclient.ui:398 msgid "Enter optionally a descriptive name for the alias" msgstr "Skriv in, om du vill, ett beskrivande namn för alias" #: ../src/kildclient.ui:410 ../src/kildclient.ui:1136 msgid "_Pattern:" msgstr "_Mönster:" #: ../src/kildclient.ui:423 msgid "Enter the pattern to match against typed commands" msgstr "" #: ../src/kildclient.ui:433 ../src/kildclient.ui:1159 msgid "_Ignore case when matching" msgstr "" #: ../src/kildclient.ui:447 msgid "_Substitution:" msgstr "" #: ../src/kildclient.ui:460 msgid "Enter the substitution to be executed" msgstr "" #: ../src/kildclient.ui:470 msgid "E_val substitution as Perl statement" msgstr "" #: ../src/kildclient.ui:473 msgid "Check to have the substitution be executed in a s///e construction" msgstr "" #: ../src/kildclient.ui:488 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.ui:543 msgid "Edit character information" msgstr "Redigera karaktärsinformation" #: ../src/kildclient.ui:615 msgid "Enter the character's name for automatic login" msgstr "Skriv in karaktärens namn för automatisk inloggning" #: ../src/kildclient.ui:627 msgid "_Password:" msgstr "_Lösenord:" #: ../src/kildclient.ui:640 msgid "Enter the character's password for automatic login" msgstr "Skriv in karaktärens lösenord för automatisk inloggning" #: ../src/kildclient.ui:666 msgid "Edit hook" msgstr "" #: ../src/kildclient.ui:725 msgid "Event:" msgstr "Händelse:" #: ../src/kildclient.ui:760 msgid "Enter optionally a descriptive name for the hook" msgstr "" #: ../src/kildclient.ui:785 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.ui:798 msgid "Check to make the hook enabled; only enabled hooks are run" msgstr "" #: ../src/kildclient.ui:850 msgid "Edit macro" msgstr "Redigera makro" #: ../src/kildclient.ui:921 msgid "Enter optionally a descriptive name for the macro" msgstr "Skriv in, om du vill, ett beskrivande namn för makrot" #: ../src/kildclient.ui:933 msgid "_Key:" msgstr "_Tangent:" #: ../src/kildclient.ui:946 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.ui:958 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.ui:983 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.ui:996 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.ui:1050 ../src/kildclient.ui:1927 msgid "Enter optionally a descriptive name for the trigger" msgstr "" #: ../src/kildclient.ui:1052 msgid "Edit trigger" msgstr "" #: ../src/kildclient.ui:1149 msgid "Enter the pattern to match against received lines" msgstr "" #: ../src/kildclient.ui:1186 msgid "Enter the action that will be run when a match happens" msgstr "" #: ../src/kildclient.ui:1196 msgid "Omit (_gag) from output" msgstr "" #: ../src/kildclient.ui:1199 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.ui:1211 msgid "Omit (gag) from _log file" msgstr "" #: ../src/kildclient.ui:1214 msgid "Check to make the matched line not be printed in the log file" msgstr "" #: ../src/kildclient.ui:1226 msgid "_Keep executing other triggers after this this one matches" msgstr "" #: ../src/kildclient.ui:1229 msgid "" "Check to make this trigger not prevent further triggers from being tried, if " "it matches" msgstr "" #: ../src/kildclient.ui:1241 msgid "_Rewriter trigger" msgstr "" #: ../src/kildclient.ui:1244 msgid "Check to make this trigger a rewriter trigger" msgstr "" #: ../src/kildclient.ui:1260 msgid "C_hange style" msgstr "B_yt stil" #: ../src/kildclient.ui:1275 msgid "C_onfigure..." msgstr "K_onfigurera..." #: ../src/kildclient.ui:1300 msgid "Check to make the trigger enabled; only enabled triggers are tried" msgstr "" #: ../src/kildclient.ui:1355 msgid "Permenent variable" msgstr "Permanent variabel" #: ../src/kildclient.ui:1411 msgid "_Name of variable to make permanent:" msgstr "_Variabelns namn som ska göras permanent:" #: ../src/kildclient.ui:1425 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.ui:1467 msgid "_Triggers" msgstr "" #: ../src/kildclient.ui:1480 msgid "_Aliases" msgstr "_Alias" #: ../src/kildclient.ui:1493 msgid "_Macros" msgstr "_Makrotar" #: ../src/kildclient.ui:1506 msgid "T_imers" msgstr "T_idur" #: ../src/kildclient.ui:1519 msgid "_Permanent variables" msgstr "_Permanenta variabler" #: ../src/kildclient.ui:1532 msgid "OnCo_nnect hooks" msgstr "" #: ../src/kildclient.ui:1545 msgid "On_Disconnect hooks" msgstr "" #: ../src/kildclient.ui:1558 msgid "On_ReceivedText hooks" msgstr "" #: ../src/kildclient.ui:1571 msgid "On_SentCommand hooks" msgstr "" #: ../src/kildclient.ui:1584 msgid "On_GetFocus hooks" msgstr "" #: ../src/kildclient.ui:1597 msgid "On_LoseFocus hooks" msgstr "" #: ../src/kildclient.ui:1610 msgid "OnClos_eConnected hooks" msgstr "" #: ../src/kildclient.ui:1623 msgid "OnSer_verData hooks" msgstr "" #: ../src/kildclient.ui:1648 msgid "Items to e_xport" msgstr "Objekt att e_xportera" #: ../src/kildclient.ui:1709 ../src/dlgSelectWorld.ui:125 #: ../src/dlgEditWorld.ui:604 msgid "_New" msgstr "_Ny" #: ../src/kildclient.ui:1722 ../src/wndmain.ui:158 ../src/dlgSelectWorld.ui:138 #: ../src/dlgEditWorld.ui:619 msgid "_Edit" msgstr "_Redigera" #: ../src/kildclient.ui:1750 msgid "_Import" msgstr "_Importera" #: ../src/kildclient.ui:1763 msgid "E_xport" msgstr "E_xportera" #: ../src/kildclient.ui:1777 ../src/dlgEditWorld.ui:649 #: ../src/dlgEditWorld.ui:3305 msgid "_Up" msgstr "" #: ../src/kildclient.ui:1791 ../src/dlgEditWorld.ui:664 #: ../src/dlgEditWorld.ui:3320 msgid "Do_wn" msgstr "" #: ../src/kildclient.ui:1830 ../src/kildclient.ui:1895 #: ../src/kildclient.ui:1915 msgid "Do not change" msgstr "Ändra inte" #: ../src/kildclient.ui:1833 ../src/dlgPreferences.ui:42 msgid "Black" msgstr "Svart" #: ../src/kildclient.ui:1836 ../src/dlgPreferences.ui:45 msgid "Red" msgstr "Röd" #: ../src/kildclient.ui:1839 ../src/dlgPreferences.ui:48 msgid "Green" msgstr "Grön" #: ../src/kildclient.ui:1842 ../src/dlgPreferences.ui:51 msgid "Yellow" msgstr "Gul" #: ../src/kildclient.ui:1845 ../src/dlgPreferences.ui:54 msgid "Blue" msgstr "Blå" #: ../src/kildclient.ui:1848 ../src/dlgPreferences.ui:57 msgid "Magenta" msgstr "Magenta" #: ../src/kildclient.ui:1851 ../src/dlgPreferences.ui:60 msgid "Cyan" msgstr "Cyan" #: ../src/kildclient.ui:1854 ../src/dlgPreferences.ui:63 msgid "White" msgstr "Vit" #: ../src/kildclient.ui:1857 ../src/dlgPreferences.ui:66 msgid "Default" msgstr "Standard" #: ../src/kildclient.ui:1860 ../src/dlgPreferences.ui:69 msgid "Black (bold)" msgstr "Svart (fet)" #: ../src/kildclient.ui:1863 ../src/dlgPreferences.ui:72 msgid "Red (bold)" msgstr "Röd (fet)" #: ../src/kildclient.ui:1866 ../src/dlgPreferences.ui:75 msgid "Green (bold)" msgstr "Grön (fet)" #: ../src/kildclient.ui:1869 ../src/dlgPreferences.ui:78 msgid "Yellow (bold)" msgstr "Gul (fet)" #: ../src/kildclient.ui:1872 ../src/dlgPreferences.ui:81 msgid "Blue (bold)" msgstr "Blå (fet)" #: ../src/kildclient.ui:1875 ../src/dlgPreferences.ui:84 msgid "Magenta (bold)" msgstr "Magenta (fet)" #: ../src/kildclient.ui:1878 ../src/dlgPreferences.ui:87 msgid "Cyan (bold)" msgstr "Cyan (fet)" #: ../src/kildclient.ui:1881 ../src/dlgPreferences.ui:90 msgid "White (bold)" msgstr "Vit (fet)" #: ../src/kildclient.ui:1884 ../src/dlgPreferences.ui:93 msgid "Default (bold)" msgstr "Standard (fet)" #: ../src/kildclient.ui:1901 msgid "Single" msgstr "Enskild" #: ../src/kildclient.ui:1904 msgid "Double" msgstr "Båda" #: ../src/kildclient.ui:1929 msgid "Change style" msgstr "Byt stil" #: ../src/kildclient.ui:1987 msgid "Apply to:" msgstr "Tillämpa på:" #: ../src/kildclient.ui:1998 msgid "_Foreground:" msgstr "_Förgrund:" #: ../src/kildclient.ui:2026 msgid "_Background:" msgstr "_Bakgrund:" #: ../src/kildclient.ui:2054 msgid "_Italic:" msgstr "_Kursiv:" #: ../src/kildclient.ui:2082 msgid "_Striked-thru:" msgstr "_Genomstrykt:" #: ../src/kildclient.ui:2110 msgid "_Underline:" msgstr "_Understreck:" #: ../src/kildclient.ui:2141 msgid "The whole _line" msgstr "Hela _raden" #: ../src/kildclient.ui:2155 msgid "The whole matched _text" msgstr "" #: ../src/kildclient.ui:2174 msgid "The _matched substring number" msgstr "" #: ../src/wndmain.ui:40 msgid "_World" msgstr "_Värld" #: ../src/wndmain.ui:49 msgid "_Open..." msgstr "_Öppna..." #: ../src/wndmain.ui:66 msgid "_Disconnect" msgstr "_Frånkoppla" #: ../src/wndmain.ui:74 msgid "Connect to _another..." msgstr "Anslut till _en annan..." #: ../src/wndmain.ui:95 msgid "_Edit..." msgstr "_Redigera..." #: ../src/wndmain.ui:112 msgid "S_tatistics..." msgstr "S_tatistik..." #: ../src/wndmain.ui:125 ../src/wndmain.ui:245 msgid "_Previous" msgstr "_Föregående" #: ../src/wndmain.ui:133 ../src/wndmain.ui:254 msgid "_Next" msgstr "_Nästa" #: ../src/wndmain.ui:167 msgid "Cu_t" msgstr "Klipp _ut" #: ../src/wndmain.ui:176 msgid "_Copy" msgstr "_Kopiera" #: ../src/wndmain.ui:185 msgid "_Paste" msgstr "Klistra _in" #: ../src/wndmain.ui:207 ../src/dlgCmdHistory.ui:178 msgid "_Find" msgstr "_Sök" #: ../src/wndmain.ui:229 msgid "_Input" msgstr "_Inmatning" #: ../src/wndmain.ui:237 ../src/dlgEditWorld.ui:3101 ../src/dlgMLSend.ui:157 msgid "C_lear" msgstr "_Töm" #: ../src/wndmain.ui:263 msgid "Find p_revious" msgstr "Sök _föregående" #: ../src/wndmain.ui:281 msgid "Command _history..." msgstr "Kommando_historia" #: ../src/wndmain.ui:295 msgid "_Multi-line send..." msgstr "" #: ../src/wndmain.ui:309 msgid "_Test triggers..." msgstr "" #: ../src/wndmain.ui:321 msgid "_Preferences" msgstr "_Inställningar" #: ../src/wndmain.ui:330 msgid "Disable _triggers" msgstr "" #: ../src/wndmain.ui:339 msgid "Disable _aliases" msgstr "Inaktivera _alias" #: ../src/wndmain.ui:348 msgid "Disable _macros" msgstr "Inaktivera _makrotar" #: ../src/wndmain.ui:357 msgid "Disable t_imers" msgstr "Inaktivera t_idur" #: ../src/wndmain.ui:371 msgid "_Debug matches" msgstr "" #: ../src/wndmain.ui:384 msgid "_Preferences..." msgstr "_Inställningar..." #: ../src/wndmain.ui:392 msgid "Edit default _world..." msgstr "Redigera standard_värld..." #: ../src/wndmain.ui:404 msgid "_Display" msgstr "_Skärm" #: ../src/wndmain.ui:413 msgid "_Split window" msgstr "" #: ../src/wndmain.ui:426 ../src/dlgEditWorld.ui:3198 msgid "_Help" msgstr "_Hjälp" #: ../src/wndmain.ui:434 msgid "_Manual" msgstr "_Handbok" #: ../src/wndmain.ui:443 msgid "_About" msgstr "_Om" #: ../src/dlgSelectWorld.ui:27 msgid "Connect to" msgstr "Anslut till" #: ../src/dlgSelectWorld.ui:56 #, fuzzy msgid "C_onnect" msgstr "_Återanslut" #: ../src/dlgSelectWorld.ui:78 msgid "_Select a saved world:" msgstr "_Markera en sparad värld:" #: ../src/dlgSelectWorld.ui:183 msgid "Or connect d_irectly:" msgstr "Eller anslut d_irekt:" #: ../src/dlgSelectWorld.ui:206 ../src/dlgEditWorld.ui:242 msgid "_Host:" msgstr "_Värd:" #: ../src/dlgSelectWorld.ui:219 ../src/dlgEditWorld.ui:255 msgid "_Port:" msgstr "_Port:" #: ../src/dlgPreferences.ui:104 ../src/dlgEditWorld.ui:101 msgid "No proxy" msgstr "Ingen proxy" #: ../src/dlgPreferences.ui:107 ../src/dlgEditWorld.ui:104 msgid "SOCKS4" msgstr "" #: ../src/dlgPreferences.ui:110 ../src/dlgEditWorld.ui:107 msgid "SOCKS5" msgstr "" #: ../src/dlgPreferences.ui:113 ../src/dlgEditWorld.ui:110 msgid "HTTP" msgstr "" #: ../src/dlgPreferences.ui:124 msgid "Left" msgstr "Vänster" #: ../src/dlgPreferences.ui:127 msgid "Right" msgstr "Höger" #: ../src/dlgPreferences.ui:130 msgid "Top" msgstr "Överkant" #: ../src/dlgPreferences.ui:133 msgid "Bottom" msgstr "Nederkant" #: ../src/dlgPreferences.ui:140 msgid "Preferences" msgstr "Inställningar" #: ../src/dlgPreferences.ui:188 msgid "Colors used by KildClient" msgstr "Färger som används av KildClient" #: ../src/dlgPreferences.ui:208 msgid "_Informative messages:" msgstr "_Informativa meddelanden:" #: ../src/dlgPreferences.ui:239 msgid "Command _echo:" msgstr "" #: ../src/dlgPreferences.ui:278 msgid "Window configuration" msgstr "Fönsterkonfiguration" #: ../src/dlgPreferences.ui:298 msgid "_Tab position:" msgstr "_Flikposition" #: ../src/dlgPreferences.ui:329 msgid "_Hide tabs if only one world is open" msgstr "_Dölj flikar om bara en värld är öppen" #: ../src/dlgPreferences.ui:333 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.ui:346 msgid "_Flash window when new text is received" msgstr "_Låt fönstret blinka när ny text mottages" #: ../src/dlgPreferences.ui:371 msgid "Appearance" msgstr "Utseende" #: ../src/dlgPreferences.ui:386 msgid "Sending delays" msgstr "Sändningsfördröjningar" #: ../src/dlgPreferences.ui:406 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.ui:422 msgid "_Number of lines/commands to send at once:" msgstr "_Antal rader/kommandon som ska skickas på en gång:" #: ../src/dlgPreferences.ui:462 msgid "_Delay between each group of lines/commands:" msgstr "_Fördröjning mellan varje grupp av rader/kommandon:" #: ../src/dlgPreferences.ui:510 msgid "Sending" msgstr "Skickar" #: ../src/dlgPreferences.ui:527 msgid "Audio player" msgstr "Ljuduppspelare" #: ../src/dlgPreferences.ui:547 #, c-format 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.ui:562 msgid "Specify the command used to play sound files." msgstr "Ange kommandot som ska användas för att spela upp ljudfiler." #: ../src/dlgPreferences.ui:587 msgid "External programs" msgstr "Externa program" #: ../src/dlgPreferences.ui:603 ../src/dlgEditWorld.ui:331 msgid "Proxy" msgstr "Proxy" #: ../src/dlgPreferences.ui:627 ../src/dlgEditWorld.ui:355 msgid "Proxy _type:" msgstr "_Proxytyp:" #: ../src/dlgPreferences.ui:669 ../src/dlgEditWorld.ui:397 msgid "Server _address:" msgstr "_Serveradress:" #: ../src/dlgPreferences.ui:682 ../src/dlgEditWorld.ui:453 msgid "_Username:" msgstr "A_nvändarnamn:" #: ../src/dlgPreferences.ui:715 ../src/dlgEditWorld.ui:420 msgid "Server _port:" msgstr "Server_port:" #: ../src/dlgPreferences.ui:728 ../src/dlgEditWorld.ui:466 msgid "Pass_word:" msgstr "Lös_enord:" #: ../src/dlgPreferences.ui:781 msgid "Proxy" msgstr "Proxy" #: ../src/dlgStatistics.ui:27 msgid "Statistics" msgstr "Statistik" #: ../src/dlgStatistics.ui:70 ../src/dlgStatistics.ui:81 #: ../src/dlgStatistics.ui:223 ../src/dlgStatistics.ui:338 #: ../src/dlgStatistics.ui:445 ../src/dlgStatistics.ui:456 #: ../src/dlgStatistics.ui:467 ../src/dlgStatistics.ui:478 #: ../src/dlgStatistics.ui:489 ../src/dlgStatistics.ui:511 #: ../src/dlgStatistics.ui:544 ../src/dlgStatistics.ui:555 #: ../src/dlgStatistics.ui:577 ../src/dlgStatistics.ui:610 #: ../src/dlgStatistics.ui:621 msgid "N/A" msgstr "Inte tillgängligt" #: ../src/dlgStatistics.ui:92 msgid "Proxy port:" msgstr "Proxyport:" #: ../src/dlgStatistics.ui:103 msgid "Proxy host:" msgstr "Proxyvärd:" #: ../src/dlgStatistics.ui:125 msgid "Proxy type:" msgstr "Proxytyp:" #: ../src/dlgStatistics.ui:136 msgid "World name:" msgstr "Namn på värld:" #: ../src/dlgStatistics.ui:147 msgid "Host:" msgstr "Värd:" #: ../src/dlgStatistics.ui:158 msgid "Port:" msgstr "Port:" #: ../src/dlgStatistics.ui:169 msgid "Connection time:" msgstr "Anslutningstid:" #: ../src/dlgStatistics.ui:180 msgid "Idle time:" msgstr "Passiv tid:" #: ../src/dlgStatistics.ui:201 msgid "Compression used:" msgstr "Använd komprimering:" #: ../src/dlgStatistics.ui:212 msgid "Bytes received (compressed):" msgstr "Antal mottagna byte (komprimerade):" #: ../src/dlgStatistics.ui:234 msgid "Bytes received (decompressed):" msgstr "Antal mottagna byte (okomprimerade):" #: ../src/dlgStatistics.ui:245 msgid "Compression ratio:" msgstr "Komprimeringsförhållande:" #: ../src/dlgStatistics.ui:256 msgid "Lines received:" msgstr "Antal mottagna rader:" #: ../src/dlgStatistics.ui:369 msgid "Key exchange:" msgstr "" #: ../src/dlgStatistics.ui:380 msgid "SSL protocol used:" msgstr "SSL-protokoll använt:" #: ../src/dlgStatistics.ui:391 msgid "Compression algorithm:" msgstr "Komprimeringsalgoritm:" #: ../src/dlgStatistics.ui:402 msgid "Certificate type:" msgstr "" #: ../src/dlgStatistics.ui:413 msgid "Cipher:" msgstr "" #: ../src/dlgStatistics.ui:424 msgid "MAC:" msgstr "MAC:" #: ../src/dlgStatistics.ui:500 msgid "Hostname:" msgstr "Värdnamn:" #: ../src/dlgStatistics.ui:522 msgid "Valid since:" msgstr "Giltigt sedan:" #: ../src/dlgStatistics.ui:533 msgid "Expiration:" msgstr "Utlöper:" #: ../src/dlgStatistics.ui:566 msgid "Fingerprint:" msgstr "Fingeravtryck:" #: ../src/dlgStatistics.ui:588 msgid "Subject's DN:" msgstr "" #: ../src/dlgStatistics.ui:599 msgid "Issuer's DN:" msgstr "" #: ../src/dlgAbout.ui:30 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.ui:32 msgid "Visit https://www.kildclient.org" msgstr "Besök https://www.kildclient.org" #: ../src/dlgEditWorld.ui:81 msgid "No auto-login" msgstr "Ingen automatisk inloggning" #: ../src/dlgEditWorld.ui:98 msgid "Use global settings" msgstr "Använd allmänna inställningar" #: ../src/dlgEditWorld.ui:117 msgid "Edit world" msgstr "Redigera värld" #: ../src/dlgEditWorld.ui:207 msgid "Connection" msgstr "Anslutning" #: ../src/dlgEditWorld.ui:268 msgid "Enter a descriptive name for the world" msgstr "Skriv in ett beskrivande namn för världen" #: ../src/dlgEditWorld.ui:281 msgid "Enter the host to connect to" msgstr "Skriv in värden att ansluta till" #: ../src/dlgEditWorld.ui:294 msgid "Enter the port used when connecting" msgstr "Skriv in porten som ska användas vid anslutning" #: ../src/dlgEditWorld.ui:306 msgid "Use _SSL" msgstr "Använd SS_L" #: ../src/dlgEditWorld.ui:505 msgid "Auto-login" msgstr "Automatisk inloggning" #: ../src/dlgEditWorld.ui:529 msgid "Connection _style:" msgstr "Ansl_utningsstil:" #: ../src/dlgEditWorld.ui:567 msgid "Ch_aracters in this mud:" msgstr "_Karaktärer i denna mud:" #: ../src/dlgEditWorld.ui:705 ../src/dlgEditWorld.ui:1840 #: ../src/dlgEditWorld.ui:2502 msgid "Font" msgstr "Typsnitt" #: ../src/dlgEditWorld.ui:725 msgid "Select the font used in the _main screen:" msgstr "Markera typsnittet som ska användas i huvud_fönstret:" #: ../src/dlgEditWorld.ui:741 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.ui:753 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.ui:757 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.ui:779 msgid "Word wrap" msgstr "Radbrytning" #: ../src/dlgEditWorld.ui:798 msgid "_Wrap lines at word boundaries" msgstr "" #: ../src/dlgEditWorld.ui:802 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "" #: ../src/dlgEditWorld.ui:820 msgid "_Indent wrapped lines by" msgstr "" #: ../src/dlgEditWorld.ui:850 msgid "pixels" msgstr "" #: ../src/dlgEditWorld.ui:869 msgid "Wrap lines at full _screen width" msgstr "" #: ../src/dlgEditWorld.ui:889 msgid "Maximum line width in _characters:" msgstr "" #: ../src/dlgEditWorld.ui:937 msgid "Scrolling" msgstr "Rullning" #: ../src/dlgEditWorld.ui:956 msgid "Sc_roll on output" msgstr "Rulla vid _utmatning" #: ../src/dlgEditWorld.ui:960 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.ui:978 msgid "_Lines to save in scrollback buffer:" msgstr "_Rader att spara i rullningsbuffert:" #: ../src/dlgEditWorld.ui:991 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.ui:1022 msgid "Tooltips" msgstr "" #: ../src/dlgEditWorld.ui:1041 msgid "Display _tooltips with the time when the line was received" msgstr "" #: ../src/dlgEditWorld.ui:1045 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.ui:1067 msgid "Name display" msgstr "Tidsangivelse" #: ../src/dlgEditWorld.ui:1086 msgid "I_dentify as 'World name'" msgstr "" #: ../src/dlgEditWorld.ui:1101 msgid "I_dentify as 'World name - Character'" msgstr "" #: ../src/dlgEditWorld.ui:1116 msgid "I_dentify as 'Character - World name'" msgstr "" #: ../src/dlgEditWorld.ui:1135 msgid "C_ustom: " msgstr "" #: ../src/dlgEditWorld.ui:1169 msgid "" "Use %Kw to represent the world's name, and %Kc to represent the auto-logon " "character name" msgstr "" #: ../src/dlgEditWorld.ui:1203 msgid "Ansi colors" msgstr "Ansifärger" #: ../src/dlgEditWorld.ui:1313 msgid "Blac_k" msgstr "_Svart" #: ../src/dlgEditWorld.ui:1326 msgid "_Red" msgstr "_Röd" #: ../src/dlgEditWorld.ui:1339 msgid "_Green" msgstr "_Grön" #: ../src/dlgEditWorld.ui:1352 msgid "_Yellow" msgstr "G_ul" #: ../src/dlgEditWorld.ui:1365 msgid "_Blue" msgstr "_Blå" #: ../src/dlgEditWorld.ui:1378 msgid "_Magenta" msgstr "_Magenta" #: ../src/dlgEditWorld.ui:1391 msgid "Cy_an" msgstr "_Cyan" #: ../src/dlgEditWorld.ui:1404 msgid "_White" msgstr "_Vit" #: ../src/dlgEditWorld.ui:1417 msgid "Blac_k (bold)" msgstr "_Svart (fet)" #: ../src/dlgEditWorld.ui:1430 msgid "_Red (bold)" msgstr "_Röd (fet)" #: ../src/dlgEditWorld.ui:1443 msgid "_Green (bold)" msgstr "_Grön (fet)" #: ../src/dlgEditWorld.ui:1456 msgid "_Yellow (bold)" msgstr "G_ul (fet)" #: ../src/dlgEditWorld.ui:1469 msgid "_Blue (bold)" msgstr "_Blå (fet)" #: ../src/dlgEditWorld.ui:1482 msgid "_Magenta (bold)" msgstr "_Magenta (fet)" #: ../src/dlgEditWorld.ui:1495 msgid "Cy_an (bold)" msgstr "_Cyan (fet)" #: ../src/dlgEditWorld.ui:1508 msgid "_White (bold)" msgstr "_Vit (fet)" #: ../src/dlgEditWorld.ui:1647 msgid "Default colors" msgstr "Standardfärger" #: ../src/dlgEditWorld.ui:1691 msgid "_Foreground" msgstr "_Förgrund" #: ../src/dlgEditWorld.ui:1704 msgid "Bold _foreground" msgstr "Fet _förgrund" #: ../src/dlgEditWorld.ui:1728 msgid "Backgroun_d" msgstr "Ba_kgrund" #: ../src/dlgEditWorld.ui:1752 msgid "Bold backgroun_d" msgstr "Fet ba_kgrund" #: ../src/dlgEditWorld.ui:1785 msgid "Revert to default colors" msgstr "Återgå till standardfärger" #: ../src/dlgEditWorld.ui:1804 msgid "Re_vert to default colors" msgstr "Åt_erställ till standardfärger" #: ../src/dlgEditWorld.ui:1808 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.ui:1860 msgid "_Select the font used in the status bar:" msgstr "_Markera typsnittet som ska användas i statusmätaren:" #: ../src/dlgEditWorld.ui:1895 msgid "Time display" msgstr "Tidsangivelse" #: ../src/dlgEditWorld.ui:1915 msgid "Co_nnected time:" msgstr "A_nsluten tid:" #: ../src/dlgEditWorld.ui:1935 ../src/dlgEditWorld.ui:2017 msgid "Do not display" msgstr "Visa inte" #: ../src/dlgEditWorld.ui:1939 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.ui:1953 ../src/dlgEditWorld.ui:2035 msgid "Display as hours, minutes and seconds" msgstr "Visa som timmar, minuter och sekunder" #: ../src/dlgEditWorld.ui:1957 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.ui:1971 ../src/dlgEditWorld.ui:2053 msgid "Display as seconds" msgstr "Visa som sekunder" #: ../src/dlgEditWorld.ui:1975 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.ui:1998 msgid "_Idle time:" msgstr "_Tid passiv:" #: ../src/dlgEditWorld.ui:2021 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.ui:2039 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.ui:2057 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.ui:2071 msgid "Only _reset idle time counter when a command is entered directly" msgstr "" "Åt_erställ räknaren för passiv tid bara när ett kommando skrivs in direkt" #: ../src/dlgEditWorld.ui:2075 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.ui:2115 msgid "Command entry" msgstr "Kommandoinmatning" #: ../src/dlgEditWorld.ui:2134 msgid "_Keep last typed command in command entry box" msgstr "_Behåll senast skrivna kommando i kommandoinmatningsrutan" #: ../src/dlgEditWorld.ui:2138 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.ui:2150 msgid "_Echo sent commands in main window" msgstr "" #: ../src/dlgEditWorld.ui:2154 msgid "Check to have the sent commands echoed in the main output window" msgstr "" #: ../src/dlgEditWorld.ui:2166 msgid "Store commands _between sessions" msgstr "_Lagra kommandon mellan sessioner" #: ../src/dlgEditWorld.ui:2170 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.ui:2182 msgid "Never _hide the typed text" msgstr "Dölj _aldrig den skrivna texten" #: ../src/dlgEditWorld.ui:2186 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.ui:2203 msgid "_Number of commands to save in history:" msgstr "_Antal kommandon att spara i historiken:" #: ../src/dlgEditWorld.ui:2217 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.ui:2244 msgid "Co_mmand separator:" msgstr "K_ommandoseparator:" #: ../src/dlgEditWorld.ui:2257 msgid "Specify the separator for commands typed in the command entry box" msgstr "" #: ../src/dlgEditWorld.ui:2278 msgid "Use single-_line input bar" msgstr "" #: ../src/dlgEditWorld.ui:2300 msgid "Enable _auto-completion" msgstr "Aktivera _automatisk komplettering" #: ../src/dlgEditWorld.ui:2304 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.ui:2321 msgid "Acti_vate auto-completion only after" msgstr "A_ktivera bara automatisk komplettering efter att" #: ../src/dlgEditWorld.ui:2335 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.ui:2351 msgid "characters have been entered" msgstr "tecken har skrivits in" #: ../src/dlgEditWorld.ui:2375 msgid "Use mul_ti-line input bar" msgstr "" #: ../src/dlgEditWorld.ui:2402 msgid "N_umber of lines:" msgstr "A_ntal rader:" #: ../src/dlgEditWorld.ui:2437 msgid "S_pell check typed text" msgstr "S_tavninskontrollera skriven text" #: ../src/dlgEditWorld.ui:2457 msgid "Lan_guage:" msgstr "Språk:" #: ../src/dlgEditWorld.ui:2522 msgid "Select the _font used in the command entry box:" msgstr "Markera typsnittet som ska användas i kommando_inmatningsrutan:" #: ../src/dlgEditWorld.ui:2557 msgid "Flood prevention" msgstr "Förhindra massutskick" #: ../src/dlgEditWorld.ui:2580 msgid "_Do not allow the same command to be sent" msgstr "Tillåt inte att _samma kommando skickas" #: ../src/dlgEditWorld.ui:2584 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.ui:2598 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.ui:2614 msgid "times in a _row" msgstr "_gånger i rad" #: ../src/dlgEditWorld.ui:2638 msgid "_Send this command:" msgstr "Ski_cka detta kommando:" #: ../src/dlgEditWorld.ui:2651 msgid "" "Enter a command to be sent whenever the specified maximum number of equal " "commands would be sent" msgstr "" #: ../src/dlgEditWorld.ui:2690 msgid "Logging status" msgstr "Loggningstatus" #: ../src/dlgEditWorld.ui:2727 msgid "_Start" msgstr "_Starta" #: ../src/dlgEditWorld.ui:2742 msgid "_Stop" msgstr "" #: ../src/dlgEditWorld.ui:2768 msgid "_Include the last" msgstr "" #: ../src/dlgEditWorld.ui:2772 msgid "Select to include lines from the main window in the log file." msgstr "" #: ../src/dlgEditWorld.ui:2785 #, fuzzy msgid "Inform number of lines to include in the log." msgstr "Skulle denna rad inkluderas i loggfilen?" #: ../src/dlgEditWorld.ui:2801 #, fuzzy msgid "_lines of the scrollback buffer in the log" msgstr "_Rader att spara i rullningsbuffert:" #: ../src/dlgEditWorld.ui:2829 ../src/dlgEditWorld.ui:3447 msgid "File" msgstr "Fil" #: ../src/dlgEditWorld.ui:2879 msgid "S_elect" msgstr "" #: ../src/dlgEditWorld.ui:2903 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.ui:2925 msgid "Options" msgstr "Alternativ" #: ../src/dlgEditWorld.ui:2944 msgid "A_utomatically start logging when connected" msgstr "S_tarta loggning automatiskt vid anslutning" #: ../src/dlgEditWorld.ui:2949 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.ui:2961 msgid "Prefix lines with _date and/or time" msgstr "" #: ../src/dlgEditWorld.ui:2966 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.ui:2986 msgid "_Format:" msgstr "_Format:" #: ../src/dlgEditWorld.ui:3000 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.ui:3011 msgid "_Revert to default" msgstr "Återgå till _standard" #: ../src/dlgEditWorld.ui:3053 msgid "Scripting" msgstr "Skriptning" #: ../src/dlgEditWorld.ui:3078 msgid "_Perl file to load:" msgstr "_Perlfil att läsa in:" #: ../src/dlgEditWorld.ui:3142 msgid "Plugins currently loaded" msgstr "" #: ../src/dlgEditWorld.ui:3183 msgid "_Load" msgstr "" #: ../src/dlgEditWorld.ui:3230 msgid "Plugins loaded on startup" msgstr "" #: ../src/dlgEditWorld.ui:3275 msgid "_Add" msgstr "" #: ../src/dlgEditWorld.ui:3363 msgid "MCCP (for compression)" msgstr "MCCP (för komprimering)" #: ../src/dlgEditWorld.ui:3382 msgid "_Enable if server proposes after connecting" msgstr "" #: ../src/dlgEditWorld.ui:3397 msgid "Enable if server proposes at _any time" msgstr "" #: ../src/dlgEditWorld.ui:3412 msgid "_Disable" msgstr "_Inaktivera" #: ../src/dlgEditWorld.ui:3471 msgid "_File:" msgstr "_Fil:" #: ../src/dlgEditWorld.ui:3506 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.ui:3528 msgid "Character set" msgstr "Teckenkodning" #: ../src/dlgEditWorld.ui:3552 msgid "C_haracter set:" msgstr "Tecken_kodning:" #: ../src/dlgEditWorld.ui:3591 msgid "Graphical editors" msgstr "Grafiska redigerare" #: ../src/dlgEditWorld.ui:3610 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "" #: ../src/dlgEditWorld.ui:3614 ../src/dlgEditWorld.ui:3676 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.ui:3627 msgid "_Show items defined by plugins" msgstr "" #: ../src/dlgEditWorld.ui:3631 msgid "" "If checked, triggers, aliases, macros and timers defined in plugins will " "appear in the corresponding World Editor sections." msgstr "" #: ../src/dlgEditWorld.ui:3653 msgid "TCP keep alive" msgstr "" #: ../src/dlgEditWorld.ui:3672 msgid "Enable TCP _keep alive packets" msgstr "" #: ../src/dlgEditWorld.ui:3689 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "" #: ../src/dlgEditWorld.ui:3709 msgid "Input" msgstr "Inmatning" #: ../src/dlgEditWorld.ui:3728 msgid "_Disable up and down arrow keys for history navigation" msgstr "" #: ../src/dlgEditWorld.ui:3732 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/dlgEditWorld.ui:3749 msgid "Character to run _Perl commands:" msgstr "" #: ../src/dlgEditWorld.ui:3785 msgid "" "Warning: Changing the character to run Perl commands from the default '/' is " "not recommended, because doing so might prevent plugins or other code from " "working, if they use '/' to run Perl commands." msgstr "" #: ../src/dlgTestTriggers.ui:27 msgid "Test triggers" msgstr "" #: ../src/dlgTestTriggers.ui:70 msgid "Enter _line to be matched against the triggers:" msgstr "" #: ../src/dlgTestTriggers.ui:88 msgid "" "The text entered here will be matched against triggers as if it were a line " "coming from the MUD" msgstr "" #: ../src/dlgTestTriggers.ui:99 ../src/dlgMLSend.ui:69 #: ../src/dlgCmdHistory.ui:91 msgid "_Send" msgstr "_Skicka" #: ../src/dlgTestTriggers.ui:103 msgid "Click the run the triggers against the line." msgstr "" #: ../src/dlgTestTriggers.ui:138 msgid "Number of triggers that matched:" msgstr "" #: ../src/dlgTestTriggers.ui:166 msgid "Commands that would be sent:" msgstr "Kommandon som skulle bli skickade:" #: ../src/dlgTestTriggers.ui:196 msgid "This is what would be printed in the main screen:" msgstr "Detta är vad som skulle skrivas ut i huvudfönstret:" #: ../src/dlgTestTriggers.ui:208 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.ui:224 msgid "Would this line be included in the log file?" msgstr "Skulle denna rad inkluderas i loggfilen?" #: ../src/dlgMLSend.ui:39 msgid "Multi-line send" msgstr "" #: ../src/dlgMLSend.ui:95 msgid "Send this text _initially:" msgstr "Skicka _först denna text:" #: ../src/dlgMLSend.ui:115 ../src/dlgMLSend.ui:199 msgid "Enter some text to be sent to the World" msgstr "Skriv in lite text som ska skickas till Världen" #: ../src/dlgMLSend.ui:128 msgid "Then send the c_ontents of this file:" msgstr "Skicka sedan _innehållet i denna fil:" #: ../src/dlgMLSend.ui:179 msgid "_Finally, send this text:" msgstr "Skicka _till sist denna text:" #: ../src/dlgMLSend.ui:222 msgid "Add this to the _beginning of each line:" msgstr "Lägg till detta till _början av varje rad:" #: ../src/dlgMLSend.ui:238 msgid "Specify some text to be prepended to each sent line" msgstr "" #: ../src/dlgMLSend.ui:250 msgid "Add this to the _end of each line:" msgstr "Lägg till detta till _slutet av varje rad:" #: ../src/dlgMLSend.ui:266 msgid "Specify some text to be appended to each sent line" msgstr "" #: ../src/dlgMLSend.ui:282 ../src/dlgCmdHistory.ui:253 msgid "_Delay" msgstr "_Fördröj" #: ../src/dlgMLSend.ui:295 msgid "Specify the delay between sending the group of lines" msgstr "" #: ../src/dlgMLSend.ui:310 ../src/dlgCmdHistory.ui:282 msgid "seconds e_ach" msgstr "sekunder v_ar" #: ../src/dlgMLSend.ui:323 msgid "Specify how many lines are sent at once" msgstr "Ange hur många rader som ska skickas på en gång" #: ../src/dlgMLSend.ui:337 msgid "line(s)" msgstr ":a/e rad" #: ../src/dlgMLSend.ui:355 msgid "_Keep dialog open after sending" msgstr "_Behåll dialogrutan öppen efter sändning" #: ../src/dlgCmdHistory.ui:39 msgid "Command history" msgstr "Kommandohistoria" #: ../src/dlgCmdHistory.ui:56 msgid "_Recall" msgstr "_Återkalla" #: ../src/dlgCmdHistory.ui:61 msgid "Put the selected command in the command entry box" msgstr "Placera det valda kommandot i kommandoinmatningsrutan" #: ../src/dlgCmdHistory.ui:74 msgid "Reca_ll and close" msgstr "Åter_kalla och stäng" #: ../src/dlgCmdHistory.ui:79 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.ui:96 msgid "Send the selected command(s) to the mud" msgstr "Skicka det(de) valda kommandot(na) till muden " #: ../src/dlgCmdHistory.ui:108 msgid "Se_nd and close" msgstr "S_kicka och stäng" #: ../src/dlgCmdHistory.ui:113 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.ui:183 msgid "Find a command containing a given search term" msgstr "Sök ett kommando innehållandes en given sökterm" #: ../src/dlgCmdHistory.ui:200 msgid "Find the next command with the same match text" msgstr "" #: ../src/dlgCmdHistory.ui:227 msgid "Newest commands are on the top" msgstr "" #: ../src/dlgCmdHistory.ui:266 msgid "Specify the delay between sending the group of commands" msgstr "" #: ../src/dlgCmdHistory.ui:295 msgid "Specify how many commands are sent at once" msgstr "Ange hur många kommandon som ska skickas på en gång" #: ../src/dlgCmdHistory.ui:311 msgid "commands(s)" msgstr "kommando(n)" #: ../src/dlgCmdHistory.ui:335 msgid "Find command" msgstr "Sök kommando" #: ../src/dlgCmdHistory.ui:390 msgid "_Text to find:" msgstr "_Text att söka efter:" #: ../src/dlgCmdHistory.ui:404 msgid "Enter the text to search for" msgstr "Skriv in texten att söka efter" #: ../src/dlgCmdHistory.ui:421 msgid "Search direction:" msgstr "Sökväg:" #: ../src/dlgCmdHistory.ui:437 msgid "_Downwards" msgstr "_Nedåt" #: ../src/dlgCmdHistory.ui:452 msgid "_Upwards" msgstr "_Uppåt" #: ../src/mnuPopupURL.ui:29 msgid "_Open link" msgstr "_Öppna länk" #: ../src/mnuPopupURL.ui:37 msgid "_Copy link address" msgstr "_Kopiera länkadress" #: ../share/kildclient.pl:75 ../share/kildclient.pl:96 #: ../share/kildclient.pl:116 ../share/kildclient.pl:181 #: ../share/kildclient.pl:393 ../share/kildclient.pl:493 #: ../share/kildclient.pl:571 ../share/kildclient.pl:584 #: ../share/kildclient.pl:597 ../share/kildclient.pl:610 #: ../share/kildclient.pl:623 ../share/kildclient.pl:636 #: ../share/kildclient.pl:649 ../share/kildclient.pl:662 #: ../share/kildclient.pl:676 ../share/kildclient.pl:690 #: ../share/kildclient.pl:800 ../share/kildclient.pl:812 #: ../share/kildclient.pl:824 ../share/kildclient.pl:836 #: ../share/kildclient.pl:849 ../share/kildclient.pl:1098 #: ../share/kildclient.pl:1131 #, perl-format msgid "%s: Too few arguments." msgstr "%s: För få argument." #: ../share/kildclient.pl:297 ../share/kildclient.pl:315 #: ../share/kildclient.pl:333 ../share/kildclient.pl:351 #: ../share/kildclient.pl:369 #, perl-format msgid "%s: Wrong number of arguments." msgstr "%s: Fel antal argument." #: ../share/kildclient.pl:488 msgid "Successfully moved." msgstr "Flyttade framgångsrikt." #: ../share/kildclient.pl:871 #, perl-format msgid "One %1$s deleted" msgid_plural "%2$d %1$s deleted" msgstr[0] "En %s borttagen" msgstr[1] "%2$d %1$s borttagen" #: ../share/kildclient.pl:913 msgid "Could not open file." msgstr "Kunde inte öppna fil." #: ../share/kildclient.pl:943 msgid "Unknown" msgstr "Okänd" #: ../share/kildclient.pl:950 msgid "Invalid plugin file." msgstr "Ogiltig fil för insticksmodul." #: ../share/kildclient.pl:981 msgid "Plugin already loaded. Try enabling it." msgstr "Insticksmodul redan inläst. Försök aktivera den." #: ../share/kildclient.pl:983 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "Version %s av denna insticksmodul är redan inläst." #: ../share/kildclient.pl:993 #, perl-format msgid "Error in plugin file: %s" msgstr "Fel i filen för insticksmodul: %s" #: ../share/kildclient.pl:1005 msgid "Cannot load a plugin in another world." msgstr "Kan inte läsa in insticksmodul i en annan värld." #: ../share/kildclient.pl:1010 ../share/kildclient.pl:1030 msgid "Plugin not specified" msgstr "Insticksmodulen är inte angiven" #: ../share/kildclient.pl:1017 ../share/kildclient.pl:1048 msgid "Plugin not loaded." msgstr "Insticksmodul inte inläst." #: ../share/kildclient.pl:1020 #, perl-format msgid "Plugin '%s' loaded." msgstr "Insticksmodul '%s' inläst." #: ../share/kildclient.pl:1036 #, perl-format msgid "Could not load plugin %s" msgstr "Kunde inte läsa in insticksmodul %s" #: ../share/kildclient.pl:1112 msgid "Plugin enabled." msgstr "Insticksmodul aktiverad." #: ../share/kildclient.pl:1145 msgid "Plugin disabled." msgstr "Insticksmodul inaktiverad." #: ../share/kildclient.pl:1295 msgid "Cannot open help file." msgstr "Kan inte öppna hjälpfil." #: ../share/kildclient.pl:1318 msgid "Help topic not found." msgstr "Hjälprubrik hittades inte." kildclient-3.2.0/po/de.po0000644000175000017500000026137413220232041012127 00000000000000# Copyright (C) 2009-2017 Rene Kuettner , Eduardo M Kalinowski # This file is licensed under the same license as the KildClient package. # msgid "" msgstr "" "Project-Id-Version: KildClient 3.2.0\n" "Report-Msgid-Bugs-To: eduardo@kalinowski.com.br\n" "POT-Creation-Date: 2017-12-24 09:10-0200\n" "PO-Revision-Date: 2017-12-24 09:13-0200\n" "Last-Translator: Rene Kuettner \n" "Language-Team: German\n" "Language: de\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:63 msgid "Outputs version information and exits" msgstr "Zeigt Versionsinformationen an und beendet das Programm" #: ../src/main.c:65 msgid "Directory to store settings and saved worlds" msgstr "Verzeichnis, in dem die Einstellungen und Welten gespeichert werden" #: ../src/main.c:65 msgid "DIR" msgstr "Verzeichnis" #: ../src/main.c:67 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:68 ../src/main.c:71 msgid "FILE" msgstr "DATEI" #: ../src/main.c:70 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:101 msgid "[WORLD...]" msgstr "[WELT...]" #: ../src/main.c:108 #, 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:113 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "Kann Datendatei %s nicht öffnen: %s\n" #: ../src/main.c:120 #, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "Kann Rohdatendatei %s nicht öffnen: %s\n" #: ../src/main.c:240 #, c-format msgid "There is one open world. Do you really want to quit?" msgid_plural "There are %d open worlds. Do you really want to quit?" msgstr[0] "Eine Welt ist noch verbunden. Soll trotzdem beendet werden?" msgstr[1] "Es sind noch %d Welten verbunden. Soll trotzdem beendet werden?" #: ../src/main.c:244 msgid "Really quit KildClient?" msgstr "Soll KildClient wirklich beendet werden?" #: ../src/main.c:246 msgid "_Don't quit" msgstr "_Nicht beenden" #: ../src/main.c:247 ../src/wndmain.ui:146 msgid "_Quit" msgstr "_Beenden" #: ../src/net.c:166 ../src/proxy.c:209 #, c-format msgid "Resolving proxy host %s..." msgstr "Löse Proxy-Hostnamen %s auf..." #: ../src/net.c:169 #, c-format msgid "Resolving host %s..." msgstr "Löse Hostnamen %s auf..." #: ../src/net.c:262 ../src/proxy.c:193 #, c-format msgid "Could not resolve host %s: %s" msgstr "Kann Hostnamen %s nicht auflösen: %s" #: ../src/net.c:290 #, 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:293 #, 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:309 #, c-format msgid "Could not create socket: %s" msgstr "Kann Socket nicht erzeugen: %s" #: ../src/net.c:312 #, c-format msgid "Could not create socket: error #%d" msgstr "Kann Socket nicht erzeugen: Fehler #%d" #: ../src/net.c:332 #, 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:342 #, 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:398 #, c-format msgid "Unable to connect to host %s: %s." msgstr "Kann nicht mit %s verbinden: %s" #: ../src/net.c:401 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "Kann nicht mit Proxy %s verbinden: %s" #: ../src/net.c:443 ../src/net.c:461 #, c-format msgid "Unable to connect to host %s: error #%d." msgstr "Kann nicht mit %s verbinden: Fehler #%d." #: ../src/net.c:446 ../src/net.c:464 #, c-format msgid "Unable to connect to proxy host %s: error #%d." msgstr "Kann nicht mit Proxy %s verbinden: Fehler #%d." #: ../src/net.c:499 #, c-format msgid "Performing SSL handshake..." msgstr "SSL-Handshake wird ausgeführt..." #. Fatal error #: ../src/net.c:542 #, c-format msgid "SSL handshake failed: %s" msgstr "SSL-Handshake schlug fehl: %s" #: ../src/net.c:583 #, c-format msgid "SSL handshake took too long." msgstr "" #: ../src/net.c:605 ../src/net.c:1091 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "Verbunden mit %s (%s) an Port %s." #: ../src/net.c:608 ../src/net.c:1094 #, 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:615 ../src/net.c:1067 ../src/net.c:1101 msgid " SSL enabled." msgstr "SSL eingeschaltet." #: ../src/net.c:770 #, c-format msgid "Disconnected from host %s." msgstr "Verbindung mit %s wurde getrennt." #: ../src/net.c:838 ../src/net.c:846 #, c-format msgid "Disconnected from host %s: %s." msgstr "Verbindung mit %s wurde getrennt: %s." #: ../src/net.c:857 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "Verbindung mit %s wurde getrennt: Fehler #%d." #: ../src/net.c:1055 #, 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:1059 #, 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:1177 ../src/we_logging.c:121 msgid "Not connected." msgstr "Nicht verbunden." #. success #: ../src/proxy.c:57 msgid "general failure" msgstr "Allgemeiner Fehler" #: ../src/proxy.c:58 msgid "connection not allowed by ruleset" msgstr "Die Regeln verbieten die Verbindung" #: ../src/proxy.c:59 msgid "network unreachable" msgstr "Netzwerk nicht erreichbar" #: ../src/proxy.c:60 msgid "host unreachable" msgstr "Gegenstelle nicht erreichbar" #: ../src/proxy.c:61 msgid "connection refused by destination host" msgstr "Verbindung wurde von der Gegenstelle abgelehnt" #: ../src/proxy.c:62 msgid "TTL expired" msgstr "TTL abgelaufen" #: ../src/proxy.c:63 msgid "command not supported / protocol error" msgstr "Befehl wird nicht unterstützt / Protokollfehler" #: ../src/proxy.c:64 msgid "address type not supported" msgstr "Addresstyp wird nicht unterstützt" #: ../src/proxy.c:239 ../src/proxy.c:661 #, 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:294 ../src/proxy.c:423 ../src/proxy.c:468 ../src/proxy.c:542 #: ../src/proxy.c:708 msgid "Error while reading from proxy host." msgstr "Fehler beim Lesen vom Proxyserver." #: ../src/proxy.c:315 msgid "request rejected or failed" msgstr "Anfrage wurde abgelehnt oder schlug fehl" #: ../src/proxy.c:319 msgid "request failed because identd could not be reached" msgstr "Anfrage fehlgeschlagen, da der IDENT-Server nicht erreichbar war" #: ../src/proxy.c:323 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:327 ../src/proxy.c:568 ../src/proxy.c:724 #, c-format msgid "Proxy request failed: %s." msgstr "Proxy-Anfrage fehlgeschlagen: %s." #: ../src/proxy.c:344 #, 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:438 msgid "No acceptable proxy authentication methods." msgstr "" "Es sind keine akzeptablen Authentifizierungsmethoden beim Proxy verfügbar." #: ../src/proxy.c:486 msgid "Proxy authentication failed." msgstr "Die Authentifizierung am Proxy ist fehlgeschlagen." #. Should never happen #: ../src/proxy.c:529 msgid "Unrecognized response from proxy host." msgstr "Unverständliche Antwort vom Proxyserver." #: ../src/proxy.c:563 msgid "unknown reason code" msgstr "Unbekannter Grund." #: ../src/proxy.c:584 #, c-format msgid "Sending proxy authentication credentials..." msgstr "Sende Authentifizierungsdaten an den Proxyserver..." #: ../src/proxy.c:623 #, c-format msgid "Sending connection request..." msgstr "Sending Verbindungsanfrage..." #: ../src/mainwindow.c:162 ../src/mainwindow.c:608 ../src/mainwindow.c:874 #: ../src/worldgui.c:1132 ../src/worldselector.c:186 ../src/worldeditor.c:178 #: ../src/we_general.c:334 ../src/we_generic_guied.c:81 ../src/we_triggers.c:83 #: ../src/we_triggers.c:553 ../src/we_triggers.c:744 ../src/we_aliases.c:76 #: ../src/we_aliases.c:455 ../src/we_macros.c:79 ../src/we_macros.c:420 #: ../src/we_timers.c:76 ../src/we_timers.c:458 ../src/we_hooks.c:87 #: ../src/we_hooks.c:620 ../src/we_vars.c:76 ../src/we_vars.c:362 #: ../src/prefs.c:106 ../src/triggers.c:277 ../src/multilinesend.c:92 #: ../src/cmdhistory.c:209 ../src/cmdhistory.c:439 #, c-format msgid "Error loading UI from XML file: %s" msgstr "" #: ../src/mainwindow.c:668 ../src/mainwindow.c:669 msgid "Not connected" msgstr "Nicht verbunden" #: ../src/mainwindow.c:810 msgid ": Not yet active" msgstr ": Noch nicht aktiv" #: ../src/mainwindow.c:815 msgid ": Expired" msgstr ": Abgelaufen" #: ../src/mainwindow.c:829 ../src/kildclient.ui:1898 #: ../src/dlgStatistics.ui:114 ../src/dlgStatistics.ui:327 msgid "None" msgstr "Keine" #: ../src/worldgui.c:229 msgid "_Find:" msgstr "_Suchen:" #: ../src/worldgui.c:243 ../src/wndmain.ui:216 ../src/wndmain.ui:272 #: ../src/dlgCmdHistory.ui:195 msgid "Find n_ext" msgstr "_Weitersuchen" #: ../src/worldgui.c:270 msgid "Click to clear the command input area." msgstr "Klicken um die Befehlseingabe zu löschen." #: ../src/worldgui.c:376 msgid "No world" msgstr "Keine Welt" #: ../src/worldgui.c:425 msgid "KildClient ready" msgstr "KildClient bereit" #: ../src/worldgui.c:435 msgid "0 lines" msgstr "0 Zeilen" #: ../src/worldgui.c:895 msgid "Are you sure you want to close this world?" msgstr "Soll diese Welt wirklich geschlossen werden?" #: ../src/worldgui.c:896 msgid "Really close?" msgstr "Wirklich schließen?" #: ../src/worldgui.c:898 msgid "Keep _open" msgstr "_Offen halten" #: ../src/worldgui.c:899 ../src/worldselector.c:799 ../src/worldselector.c:805 #: ../src/wndmain.ui:82 ../src/dlgPreferences.ui:155 #: ../src/dlgTestTriggers.ui:41 ../src/dlgCmdHistory.ui:125 msgid "_Close" msgstr "S_chließen" #: ../src/worldgui.c:1064 #, c-format msgid "Error setting spell checker: %s\n" msgstr "Fehler beim Setzen der Rechtschreibkorrektur: %s\n" #: ../src/worldgui.c:1318 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:1484 msgid "Not found" msgstr "Nicht gefunden" #: ../src/ansitextview.c:429 #, c-format msgid "%d line" msgid_plural "%d lines" msgstr[0] "%d Zeile" msgstr[1] "%d Zeilen" #: ../src/worldselector.c:135 ../src/worldselector.c:677 #, c-format msgid "Could not load world from file '%s': %s" msgstr "Kann Weltdatei '%s' nicht laden: %s" #: ../src/worldselector.c:487 #, c-format msgid "Could not open world '%s': %s\n" msgstr "Kann Welt '%s' nicht öffnen: %s\n" #: ../src/worldselector.c:530 #, c-format msgid "Invalid argument '%s'\n" msgstr "Ungültiges Argument '%s'\n" #: ../src/worldselector.c:793 msgid "Disconnected" msgstr "Verbindung getrennt" #: ../src/worldselector.c:796 ../src/worldselector.c:803 ../src/wndmain.ui:58 msgid "_Reconnect" msgstr "_Erneut verbinden" #: ../src/worldselector.c:797 ../src/worldselector.c:804 msgid "Connect to _another world" msgstr "Mit einer _anderen Welt verbinden" #: ../src/worldselector.c:798 msgid "_Offline" msgstr "_Offline bleiben" #: ../src/worlds.c:772 msgid "Unnamed world" msgstr "Namenlose Welt" #: ../src/worlds.c:829 ../src/worlds.c:2346 ../src/we_generic_guied.c:311 #: ../src/prefs.c:431 #, c-format msgid "Could not open file '%s': %s" msgstr "Kann Datei '%s' nicht öffnen: %s" #: ../src/worlds.c:892 #, fuzzy, c-format msgid "Invalid top-level element '%s'" msgstr "Ungültiges Attribut '%s' für das Element '%s'" #: ../src/worlds.c:1695 #, 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:1964 #, c-format msgid "Invalid key code '%s'" msgstr "Schlüsselwert '%s' ist ungültig" #: ../src/worlds.c:1983 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "Element '%s' ist innerhalb des Elements '%s' nicht erlaubt" #: ../src/worlds.c:1996 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "Ungültiges Attribut '%s' für das Element '%s'" #: ../src/worlds.c:2503 #, c-format msgid "Disconnected from world %s" msgstr "Verbindung zur Welt %s getrennt" #: ../src/worldeditor.c:239 msgid "General" msgstr "Allgemein" #: ../src/worldeditor.c:247 ../src/worldeditor.c:251 msgid "Display" msgstr "Anzeige" #: ../src/worldeditor.c:248 msgid "Here you can set options to configure the appearance of KildClient." msgstr "Hier kann das Erscheinungsbild von KildClient angepasst werden." #: ../src/worldeditor.c:259 msgid "Main window" msgstr "Hauptfenster" #: ../src/worldeditor.c:267 msgid "Colors" msgstr "Farben" #: ../src/worldeditor.c:275 msgid "Status bar" msgstr "Statuszeile" #: ../src/worldeditor.c:283 msgid "Input" msgstr "Eingabe" #: ../src/worldeditor.c:291 msgid "Logging" msgstr "Protokollierung" #: ../src/worldeditor.c:297 ../src/worldeditor.c:301 msgid "Automation" msgstr "Automatisierung" #: ../src/worldeditor.c:298 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:309 msgid "Scripting" msgstr "Skripte" #: ../src/worldeditor.c:317 msgid "Plugins" msgstr "Plugins" #: ../src/worldeditor.c:328 msgid "Triggers" msgstr "Trigger" #: ../src/worldeditor.c:339 msgid "Aliases" msgstr "Aliase" #: ../src/worldeditor.c:350 msgid "Macros" msgstr "Makros" #: ../src/worldeditor.c:361 msgid "Timers" msgstr "Timer" #: ../src/worldeditor.c:372 msgid "Hooks" msgstr "Hooks" #: ../src/worldeditor.c:383 msgid "Variables" msgstr "Variablen" #: ../src/worldeditor.c:392 msgid "Protocols" msgstr "Netzwerk" #: ../src/worldeditor.c:400 msgid "Advanced" msgstr "Erweitert" #: ../src/we_general.c:73 msgid "Character" msgstr "Charakter" #: ../src/we_general.c:81 msgid "Password" msgstr "Passwort" #: ../src/we_general.c:373 msgid "You must specify the name." msgstr "Ein Name muss angegeben werden." #: ../src/we_general.c:380 msgid "You must specify the password." msgstr "Ein Passwort muss angegeben werden.." #: ../src/we_general.c:418 msgid "character" msgstr "Charakter" #: ../src/we_logging.c:110 ../src/log.c:104 #, c-format msgid "Logging to file %s." msgstr "Protokolliere in Datei %s." #: ../src/we_logging.c:116 msgid "Logging is disabled." msgstr "Die Protokollierung ist ausgeschaltet." #: ../src/we_logging.c:209 msgid "Logging not started" msgstr "Die Protokollierung ist nicht gestartet." #: ../src/we_logging.c:238 msgid "Select log file" msgstr "Auswahl der Protokolldatei" #: ../src/we_logging.c:241 ../src/we_plugins.c:574 ../src/we_generic_guied.c:97 #: ../src/we_generic_guied.c:364 ../src/kildclient.ui:64 #: ../src/kildclient.ui:342 ../src/kildclient.ui:559 ../src/kildclient.ui:682 #: ../src/kildclient.ui:865 ../src/kildclient.ui:1069 ../src/kildclient.ui:1369 #: ../src/kildclient.ui:1943 ../src/dlgSelectWorld.ui:43 #: ../src/dlgEditWorld.ui:132 ../src/dlgMLSend.ui:54 #: ../src/dlgCmdHistory.ui:348 msgid "_Cancel" msgstr "_Abbrechen" #: ../src/we_logging.c:243 ../src/kildclient.ui:78 ../src/kildclient.ui:356 #: ../src/kildclient.ui:573 ../src/kildclient.ui:696 ../src/kildclient.ui:879 #: ../src/kildclient.ui:1083 ../src/kildclient.ui:1383 #: ../src/kildclient.ui:1957 ../src/dlgStatistics.ui:40 #: ../src/dlgEditWorld.ui:146 ../src/dlgCmdHistory.ui:362 msgid "_OK" msgstr "_OK" #: ../src/we_plugins.c:124 ../src/we_plugins.c:336 ../src/we_triggers.c:225 #: ../src/we_aliases.c:206 ../src/we_macros.c:209 ../src/we_timers.c:206 #: ../src/we_hooks.c:341 ../src/perlscript.c:3429 msgid "Name" msgstr "Name" #: ../src/we_plugins.c:136 ../src/we_plugins.c:378 ../src/perlscript.c:3430 msgid "Description" msgstr "Beschreibung" #: ../src/we_plugins.c:148 ../src/we_plugins.c:364 msgid "Author" msgstr "Autor" #: ../src/we_plugins.c:161 msgid "File" msgstr "Datei" #: ../src/we_plugins.c:205 ../src/we_plugins.c:457 msgid "Error loading plugin" msgstr "Fehler beim Laden eines Plugins" #: ../src/we_plugins.c:322 ../src/we_triggers.c:211 ../src/we_aliases.c:192 #: ../src/we_macros.c:195 ../src/we_timers.c:192 ../src/we_hooks.c:327 msgid "Enabled" msgstr "Aktiviert" #: ../src/we_plugins.c:350 msgid "Version" msgstr "Version" #: ../src/we_plugins.c:439 msgid "Always load this plugin at _startup" msgstr "Dieses Plugin beim Programmstart _laden" #: ../src/we_plugins.c:497 msgid "The help is displayed in main window." msgstr "Die Hilfe wird im Hauptfenster angezeigt." #: ../src/we_plugins.c:498 msgid "KildClient information" msgstr "Information - KildClient" #: ../src/we_plugins.c:499 msgid "_Do not display this message again" msgstr "Diese Meldung _nicht noch einmal anzeigen" #: ../src/we_plugins.c:571 msgid "Load plugin" msgstr "Plugin laden" #: ../src/we_plugins.c:576 ../src/we_generic_guied.c:366 msgid "_Open" msgstr "Ö_ffnen" #: ../src/we_generic_guied.c:94 msgid "Export" msgstr "Exportieren" #: ../src/we_generic_guied.c:99 ../src/wndmain.ui:104 msgid "_Save" msgstr "_Speichern" #: ../src/we_generic_guied.c:361 msgid "Import" msgstr "Importieren" #: ../src/we_generic_guied.c:393 #, c-format msgid "Could not import file '%s': %s" msgstr "Kann Datei '%s' nicht importieren: %s" #: ../src/we_generic_guied.c:948 #, c-format msgid "Do you really want to delete the %1$s?" msgid_plural "Do you really want to delete %2$d %1$s?" msgstr[0] "Soll %1$s wirklich gelöscht werden?" msgstr[1] "Sollen %2$d %1$s wirklich gelöscht werden?" #: ../src/we_generic_guied.c:952 ../src/we_vars.c:282 msgid "Confirm deletion" msgstr "Löschvorgang bestätigen" #: ../src/we_generic_guied.c:954 msgid "Do _not delete" msgstr "_Nicht löschen" #: ../src/we_generic_guied.c:955 ../src/kildclient.ui:1736 #: ../src/wndmain.ui:194 ../src/dlgSelectWorld.ui:151 #: ../src/dlgEditWorld.ui:634 ../src/dlgEditWorld.ui:3290 msgid "_Delete" msgstr "_Löschen" #: ../src/we_triggers.c:130 msgid "_Test triggers" msgstr "_Trigger testen" #: ../src/we_triggers.c:239 ../src/we_aliases.c:220 ../src/triggers.c:140 #: ../src/aliases.c:176 msgid "Pattern" msgstr "Muster" #: ../src/we_triggers.c:257 ../src/we_aliases.c:238 msgid "Ig. case" msgstr "Ig. Fall" #: ../src/we_triggers.c:271 ../src/we_macros.c:237 ../src/we_timers.c:246 #: ../src/we_hooks.c:355 ../src/triggers.c:141 ../src/macros.c:145 #: ../src/timers.c:202 msgid "Action" msgstr "Aktion" #: ../src/we_triggers.c:289 msgid "Gag" msgstr "Gag" #: ../src/we_triggers.c:307 msgid "Gag log" msgstr "Gag Protokoll" #: ../src/we_triggers.c:325 msgid "Keep exec" msgstr "_Ausführung beibehalten" #: ../src/we_triggers.c:343 msgid "Rewriter" msgstr "Rewriter" #: ../src/we_triggers.c:361 msgid "Style" msgstr "Stil" #: ../src/we_triggers.c:375 ../src/we_aliases.c:284 ../src/we_macros.c:251 #: ../src/we_timers.c:278 ../src/we_hooks.c:369 msgid "Plugin" msgstr "Plugin" #: ../src/we_triggers.c:470 ../share/kildclient.pl:803 #: ../share/kildclient.pl:865 msgid "trigger" msgid_plural "triggers" msgstr[0] "Trigger" msgstr[1] "Trigger" #: ../src/we_triggers.c:635 ../src/we_aliases.c:516 msgid "You must specify the pattern." msgstr "Das Muster muss angegeben werden." #: ../src/we_triggers.c:643 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:252 ../src/aliases.c:177 msgid "Substitution" msgstr "Ersetzen" #: ../src/we_aliases.c:270 msgid "Eval as Perl" msgstr "Als Perl-Code auführen" #: ../src/we_aliases.c:379 ../share/kildclient.pl:815 #: ../share/kildclient.pl:866 msgid "alias" msgid_plural "aliases" msgstr[0] "Alias" msgstr[1] "Aliase" #: ../src/we_aliases.c:523 msgid "You must specify the substitution." msgstr "Die Ersetzung muss angegeben werden." #: ../src/we_macros.c:223 ../src/macros.c:144 msgid "Key" msgstr "Schlüssel" #: ../src/we_macros.c:346 ../share/kildclient.pl:827 ../share/kildclient.pl:867 msgid "macro" msgid_plural "macros" msgstr[0] "Makro" msgstr[1] "Makros" #: ../src/we_macros.c:476 msgid "You must specify the key." msgstr "Der Schlüssel muss angegeben werden." #: ../src/we_macros.c:483 msgid "Invalid key code." msgstr "Ungültiger Schlüsselcode." #: ../src/we_macros.c:490 ../src/we_timers.c:523 ../src/we_hooks.c:671 msgid "You must specify the action." msgstr "Die Aktion muss angegeben werden." #: ../src/we_timers.c:219 msgid "Interval" msgstr "Interval" #: ../src/we_timers.c:232 msgid "Count" msgstr "Anzahl" #: ../src/we_timers.c:264 msgid "Temp" msgstr "Temporär" #: ../src/we_timers.c:380 ../share/kildclient.pl:839 ../share/kildclient.pl:868 msgid "timer" msgid_plural "timers" msgstr[0] "Timer" msgstr[1] "Timer" #: ../src/we_timers.c:516 msgid "The interval must be positive." msgstr "Der Interval muss positiv sein." #. The manually added combo for selecting which hook #: ../src/we_hooks.c:130 msgid "_Event:" msgstr "E_reignis:" #: ../src/we_hooks.c:546 ../share/kildclient.pl:852 ../share/kildclient.pl:869 msgid "hook" msgid_plural "hooks" msgstr[0] "Hook" msgstr[1] "Hooks" #: ../src/we_vars.c:278 #, c-format msgid "Do you really want to make the variable temporary?" msgid_plural "Do you really want to make %d variables temporary?" msgstr[0] "Soll die Variable wirklich zu einer temporären umgewandelt werden?" msgstr[1] "Sollen %d Variablen wirklich in temporäre umgewandelt werden?" #: ../src/we_vars.c:284 msgid "Keep _permanent" msgstr "_Permanent behalten" #: ../src/we_vars.c:285 msgid "Make _temporary" msgstr "In _temporäre Variable umwandeln" #: ../src/we_vars.c:389 msgid "You must specify a variable name." msgstr "Ein Variablenname muss angegeben werden." #: ../src/we_vars.c:395 #, 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:408 #, c-format msgid "%s is already permanent." msgstr "%s ist bereits permanent." #: ../src/prefs.c:387 #, c-format msgid "Invalid window size specification in config file.\n" msgstr "Ungültige Fenstergröße in der Konfigurationsdatei.\n" #: ../src/prefs.c:407 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "Unbekannte Direktive '%s' in der Konfigurationsdatei.\n" #: ../src/prefs.c:501 #, c-format msgid "Could not create directory '%s': %s" msgstr "Kann Verzeichnis '%s' nicht erstellen: %s" #: ../src/parser.c:211 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:139 #, c-format msgid "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" msgstr "" #: ../src/triggers.c:161 ../src/triggers.c:162 ../src/triggers.c:163 #: ../src/triggers.c:164 ../src/triggers.c:165 ../src/triggers.c:166 #: ../src/triggers.c:167 ../src/aliases.c:197 ../src/aliases.c:198 #: ../src/aliases.c:199 ../src/macros.c:167 ../src/timers.c:225 #: ../src/timers.c:226 ../src/hooks.c:206 ../src/perlscript.c:3449 msgid "y" msgstr "j" #: ../src/triggers.c:161 ../src/triggers.c:162 ../src/triggers.c:163 #: ../src/triggers.c:164 ../src/triggers.c:165 ../src/triggers.c:166 #: ../src/triggers.c:167 ../src/aliases.c:197 ../src/aliases.c:198 #: ../src/aliases.c:199 ../src/macros.c:167 ../src/timers.c:225 #: ../src/timers.c:226 ../src/hooks.c:206 ../src/perlscript.c:3449 msgid "n" msgstr "n" #: ../src/triggers.c:361 ../src/kildclient.ui:1918 msgid "No" msgstr "Nein" #: ../src/triggers.c:361 ../src/kildclient.ui:1921 msgid "Yes" msgstr "Ja" #: ../src/aliases.c:175 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "" #: ../src/macros.c:143 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "" #: ../src/timers.c:194 msgid "Num Ena Temp Int " msgstr "" #: ../src/timers.c:198 msgid "Count " msgstr "Zähler " #: ../src/permanentvariables.c:115 #, 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:60 ../src/hooks.c:442 #, c-format msgid "hook: Invalid event '%s'\n" msgstr "hook: Ungültiges Ereignis '%s'\n" #: ../src/hooks.c:76 ../src/hooks.c:225 ../share/kildclient.pl:885 msgid "No such hook" msgstr "Kein solcher Hook gefunden" #: ../src/hooks.c:191 #, c-format msgid "Hooks for '%s':\n" msgstr "Hooks für '%s':\n" #: ../src/hooks.c:192 msgid "Num Ena Action" msgstr "" #: ../src/hooks.c:230 #, 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:236 ../src/perlscript.c:1769 ../src/perlscript.c:2272 #: ../src/perlscript.c:2582 ../src/perlscript.c:2870 msgid "Not set" msgstr "Nicht definiert" #: ../src/hooks.c:238 ../src/perlscript.c:1772 ../src/perlscript.c:1773 #: ../src/perlscript.c:1774 ../src/perlscript.c:1775 ../src/perlscript.c:1776 #: ../src/perlscript.c:1777 ../src/perlscript.c:1778 ../src/perlscript.c:2275 #: ../src/perlscript.c:2276 ../src/perlscript.c:2277 ../src/perlscript.c:2585 #: ../src/perlscript.c:2874 ../src/perlscript.c:2875 ../src/perlscript.c:3487 msgid "yes" msgstr "Ja" #: ../src/hooks.c:238 ../src/perlscript.c:1772 ../src/perlscript.c:1773 #: ../src/perlscript.c:1774 ../src/perlscript.c:1775 ../src/perlscript.c:1776 #: ../src/perlscript.c:1777 ../src/perlscript.c:1778 ../src/perlscript.c:2275 #: ../src/perlscript.c:2276 ../src/perlscript.c:2277 ../src/perlscript.c:2585 #: ../src/perlscript.c:2874 ../src/perlscript.c:2875 ../src/perlscript.c:3487 msgid "no" msgstr "Nein" #: ../src/log.c:121 msgid "File name not specified." msgstr "Dateiname nicht angegeben." #: ../src/log.c:187 #, c-format msgid "Could not open log file: %s." msgstr "Kann Protokolldatei nicht öffnen: %s." #: ../src/plugins.c:101 ../src/plugins.c:160 #, c-format msgid "Failed loading file %s: %s" msgstr "Fehler beim Laden der Datei %s: %s" #: ../src/cmdhistory.c:273 msgid "No command selected." msgstr "Es ist kein Befehl ausgewählt." #: ../src/cmdhistory.c:277 msgid "More than one command selected." msgstr "Es ist mehr als ein Befehl ausgewählt." #: ../src/cmdhistory.c:466 msgid "Enter some text to search for." msgstr "Geben Sie den Text ein, nach dem gesucht werden soll." #: ../src/cmdhistory.c:491 msgid "Use the Find button to find the first result." msgstr "Verwenden Sie den Suchknopf, um das erste Vorkommen zu suchen." #: ../src/cmdhistory.c:540 msgid "Command not found." msgstr "Befehl nicht gefunden." #: ../src/util.c:180 msgid "KildClient error" msgstr "Fehler - KildClient" #: ../src/perlscript.c:509 ../src/perlscript.c:515 ../src/perlscript.c:522 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "Ungültiger Funktionsaufruf: Syntax ist $world->FUNKTION" #: ../src/perlscript.c:706 ../src/perlscript.c:723 ../src/perlscript.c:785 #: ../src/perlscript.c:818 ../src/perlscript.c:1224 ../src/perlscript.c:1287 #: ../src/perlscript.c:1389 ../src/perlscript.c:1409 ../src/perlscript.c:1433 #: ../src/perlscript.c:1461 ../src/perlscript.c:1470 ../src/perlscript.c:2010 #: ../src/perlscript.c:2019 ../src/perlscript.c:2198 ../src/perlscript.c:2373 #: ../src/perlscript.c:2382 ../src/perlscript.c:2661 ../src/perlscript.c:2670 #: ../src/perlscript.c:2945 ../src/perlscript.c:2999 ../src/perlscript.c:3044 #: ../src/perlscript.c:3109 ../src/perlscript.c:3120 ../src/perlscript.c:3212 #: ../src/perlscript.c:3536 ../src/kcwin.c:96 #, c-format msgid "%s: Too few arguments" msgstr "%s: Zu wenig Argumente" #: ../src/perlscript.c:751 #, c-format msgid "%s: Argument must be numeric" msgstr "%s: Das Argument muss numerisch sein" #: ../src/perlscript.c:799 ../src/perlscript.c:831 #, c-format msgid "%s: No such world" msgstr "%s: Keine solche Welt gefunden" #: ../src/perlscript.c:866 msgid "World saved." msgstr "Welt gesichert." #: ../src/perlscript.c:1120 ../src/perlscript.c:1135 ../src/perlscript.c:1145 #: ../src/perlscript.c:1345 ../share/kildclient.pl:1324 #, c-format, perl-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:1124 ../src/perlscript.c:1592 ../src/perlscript.c:2121 #: ../src/perlscript.c:2497 ../src/perlscript.c:2691 ../src/perlscript.c:3173 #, c-format msgid "%s: Wrong argument type" msgstr "%s: Falscher Argumenttyp" #: ../src/perlscript.c:1355 ../src/perlscript.c:1361 #, c-format msgid "Protocol %s not enabled." msgstr "Protokoll %s nicht eingeschaltet." #: ../src/perlscript.c:1366 ../share/kildclient.pl:1166 msgid "Unknown protocol" msgstr "Unbekannter Protokoll." #: ../src/perlscript.c:1484 ../src/perlscript.c:1752 ../share/kildclient.pl:881 msgid "No such trigger" msgstr "Kein solcher Trigger gefunden" #: ../src/perlscript.c:1502 ../src/perlscript.c:2051 ../src/perlscript.c:2426 #: ../src/perlscript.c:3132 #, c-format msgid "%s: Too many string arguments" msgstr "%s: Zu viele String-Argumente" #: ../src/perlscript.c:1525 ../src/perlscript.c:2074 #, 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:1537 ../src/perlscript.c:2475 ../src/perlscript.c:3152 #, 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:1583 ../src/perlscript.c:2112 ../src/perlscript.c:2488 #: ../src/perlscript.c:3165 #, c-format msgid "%s: Wrong type of reference" msgstr "%s: Falscher Referenztyp" #: ../src/perlscript.c:1603 #, c-format msgid "%s: Pattern not specified, not creating" msgstr "%s: Muster ist nicht definiert. Erzeuge nichts." #: ../src/perlscript.c:1612 #, 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:1641 msgid "Trigger added." msgstr "Trigger hinzugefügt." #: ../src/perlscript.c:1646 msgid "Trigger modified." msgstr "Triger wurde verändert." #: ../src/perlscript.c:1671 #, c-format msgid "%s: Invalid target" msgstr "%s: Ungültiges Ziel" #: ../src/perlscript.c:1681 #, c-format msgid "%s: Invalid fg color" msgstr "%s: Ungültige Vordergrundfarbe" #: ../src/perlscript.c:1691 #, c-format msgid "%s: Invalid bg color" msgstr "%s: Ungültige Hintergrundfarbe" #: ../src/perlscript.c:1701 #, c-format msgid "%s: Invalid underline style" msgstr "%s: Ungültiger Stil für Unterstreichungen" #: ../src/perlscript.c:1757 #, 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:1781 #, 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:2033 ../src/perlscript.c:2259 ../share/kildclient.pl:882 msgid "No such alias" msgstr "Kein solcher Alias gefunden" #: ../src/perlscript.c:2086 #, c-format msgid "%s: Substitution given twice, using the named attribute one" msgstr "%s: Ersetzung zweimal mit dem Attribut eins angegeben" #: ../src/perlscript.c:2132 msgid "alias: Not creating alias without pattern" msgstr "alias: Alias wird ohne Muster nicht erzeugt" #: ../src/perlscript.c:2140 msgid "alias: Not creating alias without substitution" msgstr "alias: Alias wird ohne Ersetzung nicht erzeugt" #: ../src/perlscript.c:2168 msgid "Alias added." msgstr "Alias hinzugefügt" #: ../src/perlscript.c:2173 msgid "Alias modified." msgstr "Alias geändert." #: ../src/perlscript.c:2264 #, 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:2344 msgid "Press a key to get its keycode." msgstr "Drücken Sie eine Taste um deren Tastencode zu erhalten." #: ../src/perlscript.c:2396 ../src/perlscript.c:2570 ../share/kildclient.pl:883 msgid "No such macro" msgstr "Kein solches Makro gefunden" #: ../src/perlscript.c:2415 ../src/perlscript.c:2463 #, c-format msgid "%s: Invalid key code" msgstr "%s: Ungültiger Tastencode" #: ../src/perlscript.c:2452 #, 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:2508 #, c-format msgid "%s: Keycode not specified, not creating" msgstr "%s: Tastencode nicht angegeben. Wird nicht erzeugt." #: ../src/perlscript.c:2515 ../src/perlscript.c:2782 #, c-format msgid "%s: Action not specified, not creating" msgstr "%s: Aktion nicht angegeben. Wird nicht erzeugt." #: ../src/perlscript.c:2534 msgid "Macro added." msgstr "Makro hinzugefügt." #: ../src/perlscript.c:2539 msgid "Macro modified." msgstr "Makro geändert." #: ../src/perlscript.c:2576 #, 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:2685 ../src/perlscript.c:2857 ../share/kildclient.pl:884 msgid "No such timer" msgstr "Kein solcher Timer gefunden" #: ../src/perlscript.c:2710 #, c-format msgid "%s: Interval must be numeric" msgstr "%s: Interval muss numerisch sein" #: ../src/perlscript.c:2723 #, c-format msgid "%s: Count must be numeric" msgstr "%s: Anzahl muss numerisch sein" #: ../src/perlscript.c:2754 #, c-format msgid "%s: Interval not specified, not creating" msgstr "%s: Interval nicht angegeben. Wird nicht erzeugt." #: ../src/perlscript.c:2761 #, c-format msgid "%s: Cannot create timer with negative interval" msgstr "%s: Interval muss positiv sein." #: ../src/perlscript.c:2822 msgid "Timer added." msgstr "Timer hinzugefügt." #: ../src/perlscript.c:2827 msgid "Timer modified." msgstr "Timer geändert." #: ../src/perlscript.c:2862 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %.3f\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" "Timer Nummer %d\n" " Name: %s\n" " Interval: %.3f\n" " Wiederholungen: %d\n" " Aktion: %s\n" " Aktiv: %s\n" " Temporär: %s\n" #: ../src/perlscript.c:2953 #, 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:2962 #, c-format msgid "%s: %s is already permanent" msgstr "%s: %s ist schon permanent" #: ../src/perlscript.c:2976 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "%s: Variable '%s' in permanente Variable umgewandelt.\n" #: ../src/perlscript.c:3018 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "%s: Variable '%s' in permanente Variable umgewandelt.\n" #: ../src/perlscript.c:3022 #, c-format msgid "%s: %s is not permanent" msgstr "%s: %s ist nicht permanent" #: ../src/perlscript.c:3075 msgid "Permanent variables" msgstr "Permanente Variablen" #: ../src/perlscript.c:3187 msgid "Hook defined." msgstr "Hook definiert." #: ../src/perlscript.c:3191 msgid "Hook modified." msgstr "Hook geändert." #: ../src/perlscript.c:3296 msgid "Logging stopped." msgstr "Protokollierung gestoppt." #: ../src/perlscript.c:3428 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "" #: ../src/perlscript.c:3471 msgid "No such plugin" msgstr "Kein solches Plugin gefunden" #: ../src/perlscript.c:3476 #, 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.ui:48 msgid "Edit timer" msgstr "Timer bearbeiten" #: ../src/kildclient.ui:107 ../src/kildclient.ui:385 ../src/kildclient.ui:602 #: ../src/kildclient.ui:747 ../src/kildclient.ui:908 ../src/kildclient.ui:1112 #: ../src/dlgEditWorld.ui:229 ../src/dlgEditWorld.ui:2855 msgid "_Name:" msgstr "_Name:" #: ../src/kildclient.ui:120 msgid "Enter optionally a descriptive name for the timer" msgstr "Geben Sie optional einen beschreibenden Namen für den Timer ein" #: ../src/kildclient.ui:132 msgid "_Interval:" msgstr "_Interval:" #: ../src/kildclient.ui:149 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.ui:165 msgid "seconds" msgstr "Sekunden" #: ../src/kildclient.ui:183 msgid "_Repeat count:" msgstr "_Wiederholungen:" #: ../src/kildclient.ui:200 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.ui:215 msgid "(-1 to repeat indefinitely)" msgstr "(-1 für unbegrenzt viele Wiederholungen)" #: ../src/kildclient.ui:233 ../src/kildclient.ui:772 ../src/kildclient.ui:970 #: ../src/kildclient.ui:1173 msgid "_Action:" msgstr "A_ktion:" #: ../src/kildclient.ui:246 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.ui:256 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.ui:259 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.ui:271 ../src/kildclient.ui:485 ../src/kildclient.ui:795 #: ../src/kildclient.ui:993 ../src/kildclient.ui:1297 msgid "_Enabled" msgstr "Akti_v" #: ../src/kildclient.ui:274 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.ui:287 ../src/kildclient.ui:501 ../src/kildclient.ui:811 #: ../src/kildclient.ui:1009 ../src/kildclient.ui:1313 msgid "Note:" msgstr "Hinweis:" #: ../src/kildclient.ui:299 ../src/kildclient.ui:513 ../src/kildclient.ui:823 #: ../src/kildclient.ui:1021 ../src/kildclient.ui:1325 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.ui:326 msgid "Edit alias" msgstr "Alias bearbeiten" #: ../src/kildclient.ui:398 msgid "Enter optionally a descriptive name for the alias" msgstr "Geben Sie optional einen beschreibenden Namen für das Alias ein" #: ../src/kildclient.ui:410 ../src/kildclient.ui:1136 msgid "_Pattern:" msgstr "_Muster:" #: ../src/kildclient.ui:423 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.ui:433 ../src/kildclient.ui:1159 msgid "_Ignore case when matching" msgstr "Groß-/Kleinschreibung beim Mustervergleich _ignorieren" #: ../src/kildclient.ui:447 msgid "_Substitution:" msgstr "_Ersetzung:" #: ../src/kildclient.ui:460 msgid "Enter the substitution to be executed" msgstr "Geben Sie die auszuführende Ersetzung ein" #: ../src/kildclient.ui:470 msgid "E_val substitution as Perl statement" msgstr "Ersetzung als _Perl-Code evaluieren" #: ../src/kildclient.ui:473 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.ui:488 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.ui:543 msgid "Edit character information" msgstr "Charakter-Informationen bearbeiten" #: ../src/kildclient.ui:615 msgid "Enter the character's name for automatic login" msgstr "Geben Sie den Namen des Charakters für das automatische Login an" #: ../src/kildclient.ui:627 msgid "_Password:" msgstr "Pas_swort:" #: ../src/kildclient.ui:640 msgid "Enter the character's password for automatic login" msgstr "Geben Sie das Passwort des Charakters für das automatische Login an" #: ../src/kildclient.ui:666 msgid "Edit hook" msgstr "Hook bearbeiten" #: ../src/kildclient.ui:725 msgid "Event:" msgstr "Ereignis:" #: ../src/kildclient.ui:760 msgid "Enter optionally a descriptive name for the hook" msgstr "Geben Sie optional einen beschreibenden Namen für den Hook an" #: ../src/kildclient.ui:785 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.ui:798 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.ui:850 msgid "Edit macro" msgstr "Makro bearbeiten" #: ../src/kildclient.ui:921 msgid "Enter optionally a descriptive name for the macro" msgstr "Geben Sie optional einen beschreibenden Namen für das Makro an" #: ../src/kildclient.ui:933 msgid "_Key:" msgstr "_Taste:" #: ../src/kildclient.ui:946 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.ui:958 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.ui:983 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.ui:996 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.ui:1050 ../src/kildclient.ui:1927 msgid "Enter optionally a descriptive name for the trigger" msgstr "Geben Sie optional einen beschreibenden Namen für den Trigger ein" #: ../src/kildclient.ui:1052 msgid "Edit trigger" msgstr "Trigger bearbeiten" #: ../src/kildclient.ui:1149 msgid "Enter the pattern to match against received lines" msgstr "Geben Sie das Muster ein, das gegen empfangene Zeilen geprüft wird" #: ../src/kildclient.ui:1186 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.ui:1196 msgid "Omit (_gag) from output" msgstr "Passende Zeilen _nicht ausgeben" #: ../src/kildclient.ui:1199 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.ui:1211 msgid "Omit (gag) from _log file" msgstr "Passende Zeilen nicht ins _Protokoll schreiben" #: ../src/kildclient.ui:1214 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.ui:1226 msgid "_Keep executing other triggers after this this one matches" msgstr "Auch bei Auslösung _weitere Trigger ausführen" #: ../src/kildclient.ui:1229 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.ui:1241 msgid "_Rewriter trigger" msgstr "_Rewriter Trigger" #: ../src/kildclient.ui:1244 msgid "Check to make this trigger a rewriter trigger" msgstr "Wählen, wenn dieser Trigger ein Rewriter-Trigger sein soll" #: ../src/kildclient.ui:1260 msgid "C_hange style" msgstr "_Stil ändern" #: ../src/kildclient.ui:1275 msgid "C_onfigure..." msgstr "_Einstellen..." #: ../src/kildclient.ui:1300 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.ui:1355 msgid "Permenent variable" msgstr "Permanente Variable" #: ../src/kildclient.ui:1411 msgid "_Name of variable to make permanent:" msgstr "_Name der permanenten Variable:" #: ../src/kildclient.ui:1425 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.ui:1467 msgid "_Triggers" msgstr "_Trigger" #: ../src/kildclient.ui:1480 msgid "_Aliases" msgstr "_Aliase" #: ../src/kildclient.ui:1493 msgid "_Macros" msgstr "_Makros" #: ../src/kildclient.ui:1506 msgid "T_imers" msgstr "T_imer" #: ../src/kildclient.ui:1519 msgid "_Permanent variables" msgstr "_Permanente Variablen" #: ../src/kildclient.ui:1532 msgid "OnCo_nnect hooks" msgstr "" #: ../src/kildclient.ui:1545 msgid "On_Disconnect hooks" msgstr "" #: ../src/kildclient.ui:1558 msgid "On_ReceivedText hooks" msgstr "" #: ../src/kildclient.ui:1571 msgid "On_SentCommand hooks" msgstr "" #: ../src/kildclient.ui:1584 msgid "On_GetFocus hooks" msgstr "" #: ../src/kildclient.ui:1597 msgid "On_LoseFocus hooks" msgstr "" #: ../src/kildclient.ui:1610 msgid "OnClos_eConnected hooks" msgstr "" #: ../src/kildclient.ui:1623 msgid "OnSer_verData hooks" msgstr "" #: ../src/kildclient.ui:1648 msgid "Items to e_xport" msgstr "Zu e_xportierende Elemente" #: ../src/kildclient.ui:1709 ../src/dlgSelectWorld.ui:125 #: ../src/dlgEditWorld.ui:604 msgid "_New" msgstr "_Neu" #: ../src/kildclient.ui:1722 ../src/wndmain.ui:158 ../src/dlgSelectWorld.ui:138 #: ../src/dlgEditWorld.ui:619 msgid "_Edit" msgstr "_Bearbeiten" #: ../src/kildclient.ui:1750 msgid "_Import" msgstr "_Importieren" #: ../src/kildclient.ui:1763 msgid "E_xport" msgstr "_Exportieren" #: ../src/kildclient.ui:1777 ../src/dlgEditWorld.ui:649 #: ../src/dlgEditWorld.ui:3305 msgid "_Up" msgstr "Au_fwärts" #: ../src/kildclient.ui:1791 ../src/dlgEditWorld.ui:664 #: ../src/dlgEditWorld.ui:3320 msgid "Do_wn" msgstr "Ab_wärts" #: ../src/kildclient.ui:1830 ../src/kildclient.ui:1895 #: ../src/kildclient.ui:1915 msgid "Do not change" msgstr "Nicht ändern" #: ../src/kildclient.ui:1833 ../src/dlgPreferences.ui:42 msgid "Black" msgstr "Schwarz" #: ../src/kildclient.ui:1836 ../src/dlgPreferences.ui:45 msgid "Red" msgstr "Rot" #: ../src/kildclient.ui:1839 ../src/dlgPreferences.ui:48 msgid "Green" msgstr "Grün" #: ../src/kildclient.ui:1842 ../src/dlgPreferences.ui:51 msgid "Yellow" msgstr "Gelb" #: ../src/kildclient.ui:1845 ../src/dlgPreferences.ui:54 msgid "Blue" msgstr "Blau" #: ../src/kildclient.ui:1848 ../src/dlgPreferences.ui:57 msgid "Magenta" msgstr "Magenta" #: ../src/kildclient.ui:1851 ../src/dlgPreferences.ui:60 msgid "Cyan" msgstr "Zyan" #: ../src/kildclient.ui:1854 ../src/dlgPreferences.ui:63 msgid "White" msgstr "Weiß" #: ../src/kildclient.ui:1857 ../src/dlgPreferences.ui:66 msgid "Default" msgstr "Standard" #: ../src/kildclient.ui:1860 ../src/dlgPreferences.ui:69 msgid "Black (bold)" msgstr "Schwarz (fett)" #: ../src/kildclient.ui:1863 ../src/dlgPreferences.ui:72 msgid "Red (bold)" msgstr "Rot (fett)" #: ../src/kildclient.ui:1866 ../src/dlgPreferences.ui:75 msgid "Green (bold)" msgstr "Grün (fett)" #: ../src/kildclient.ui:1869 ../src/dlgPreferences.ui:78 msgid "Yellow (bold)" msgstr "Gelb (fett)" #: ../src/kildclient.ui:1872 ../src/dlgPreferences.ui:81 msgid "Blue (bold)" msgstr "Blau (fett)" #: ../src/kildclient.ui:1875 ../src/dlgPreferences.ui:84 msgid "Magenta (bold)" msgstr "Magenta (fett)" #: ../src/kildclient.ui:1878 ../src/dlgPreferences.ui:87 msgid "Cyan (bold)" msgstr "Zyan (fett)" #: ../src/kildclient.ui:1881 ../src/dlgPreferences.ui:90 msgid "White (bold)" msgstr "Weiß (fett)" #: ../src/kildclient.ui:1884 ../src/dlgPreferences.ui:93 msgid "Default (bold)" msgstr "Standard (fett)" #: ../src/kildclient.ui:1901 msgid "Single" msgstr "Einfach" #: ../src/kildclient.ui:1904 msgid "Double" msgstr "Doppelt" #: ../src/kildclient.ui:1929 msgid "Change style" msgstr "Stil ändern" #: ../src/kildclient.ui:1987 msgid "Apply to:" msgstr "Anwenden auf:" #: ../src/kildclient.ui:1998 msgid "_Foreground:" msgstr "_Vordergrund:" #: ../src/kildclient.ui:2026 msgid "_Background:" msgstr "_Hintergrund:" #: ../src/kildclient.ui:2054 msgid "_Italic:" msgstr "_Kursiv:" #: ../src/kildclient.ui:2082 msgid "_Striked-thru:" msgstr "_Durchgestrichen:" #: ../src/kildclient.ui:2110 msgid "_Underline:" msgstr "_Unterstreichen:" #: ../src/kildclient.ui:2141 msgid "The whole _line" msgstr "Ganze _Zeilen" #: ../src/kildclient.ui:2155 msgid "The whole matched _text" msgstr "Ganzer zutreffender _Text" #: ../src/kildclient.ui:2174 msgid "The _matched substring number" msgstr "Zutreffender Teil _Nummer" #: ../src/wndmain.ui:40 msgid "_World" msgstr "_Welt" #: ../src/wndmain.ui:49 msgid "_Open..." msgstr "Ö_ffnen..." #: ../src/wndmain.ui:66 msgid "_Disconnect" msgstr "Verbindung _trennen" #: ../src/wndmain.ui:74 msgid "Connect to _another..." msgstr "Zu _anderer Welt verbinden..." #: ../src/wndmain.ui:95 msgid "_Edit..." msgstr "_Bearbeiten..." #: ../src/wndmain.ui:112 msgid "S_tatistics..." msgstr "Statisti_ken..." #: ../src/wndmain.ui:125 ../src/wndmain.ui:245 msgid "_Previous" msgstr "_Vorherige" #: ../src/wndmain.ui:133 ../src/wndmain.ui:254 msgid "_Next" msgstr "_Nächste" #: ../src/wndmain.ui:167 msgid "Cu_t" msgstr "_Ausschneiden" #: ../src/wndmain.ui:176 msgid "_Copy" msgstr "_Kopieren" #: ../src/wndmain.ui:185 msgid "_Paste" msgstr "E_infügen" #: ../src/wndmain.ui:207 ../src/dlgCmdHistory.ui:178 msgid "_Find" msgstr "_Suchen" #: ../src/wndmain.ui:229 msgid "_Input" msgstr "_Eingabe" #: ../src/wndmain.ui:237 ../src/dlgEditWorld.ui:3101 ../src/dlgMLSend.ui:157 msgid "C_lear" msgstr "_Zurücksetzen" #: ../src/wndmain.ui:263 msgid "Find p_revious" msgstr "V_orherige suchen" #: ../src/wndmain.ui:281 msgid "Command _history..." msgstr "Befehls_historie..." #: ../src/wndmain.ui:295 msgid "_Multi-line send..." msgstr "_Mehrzeiliges senden..." #: ../src/wndmain.ui:309 msgid "_Test triggers..." msgstr "Trigger _testen..." #: ../src/wndmain.ui:321 msgid "_Preferences" msgstr "Ein_stellungen" #: ../src/wndmain.ui:330 msgid "Disable _triggers" msgstr "_Trigger deaktivieren" #: ../src/wndmain.ui:339 msgid "Disable _aliases" msgstr "_Aliase deaktivieren" #: ../src/wndmain.ui:348 msgid "Disable _macros" msgstr "_Makros deaktivieren" #: ../src/wndmain.ui:357 msgid "Disable t_imers" msgstr "T_imers deaktivieren" #: ../src/wndmain.ui:371 msgid "_Debug matches" msgstr "" #: ../src/wndmain.ui:384 msgid "_Preferences..." msgstr "Ein_stellungen..." #: ../src/wndmain.ui:392 msgid "Edit default _world..." msgstr "Voreingestellte _Welt bearbeiten..." #: ../src/wndmain.ui:404 msgid "_Display" msgstr "_Anzeige" #: ../src/wndmain.ui:413 msgid "_Split window" msgstr "" #: ../src/wndmain.ui:426 ../src/dlgEditWorld.ui:3198 msgid "_Help" msgstr "_Hilfe" #: ../src/wndmain.ui:434 msgid "_Manual" msgstr "_Handbuch" #: ../src/wndmain.ui:443 msgid "_About" msgstr "Ü_ber" #: ../src/dlgSelectWorld.ui:27 msgid "Connect to" msgstr "Verbinde zu" #: ../src/dlgSelectWorld.ui:56 msgid "C_onnect" msgstr "_Verbinden" #: ../src/dlgSelectWorld.ui:78 msgid "_Select a saved world:" msgstr "_Eine bekannte Welt wählen:" #: ../src/dlgSelectWorld.ui:183 msgid "Or connect d_irectly:" msgstr "_Direkt verbinden:" #: ../src/dlgSelectWorld.ui:206 ../src/dlgEditWorld.ui:242 msgid "_Host:" msgstr "_Server:" #: ../src/dlgSelectWorld.ui:219 ../src/dlgEditWorld.ui:255 msgid "_Port:" msgstr "_Port:" #: ../src/dlgPreferences.ui:104 ../src/dlgEditWorld.ui:101 msgid "No proxy" msgstr "Keinen Proxyserver verwenden" #: ../src/dlgPreferences.ui:107 ../src/dlgEditWorld.ui:104 msgid "SOCKS4" msgstr "SOCKS4" #: ../src/dlgPreferences.ui:110 ../src/dlgEditWorld.ui:107 msgid "SOCKS5" msgstr "SOCKS5" #: ../src/dlgPreferences.ui:113 ../src/dlgEditWorld.ui:110 msgid "HTTP" msgstr "HTTP" #: ../src/dlgPreferences.ui:124 msgid "Left" msgstr "Links" #: ../src/dlgPreferences.ui:127 msgid "Right" msgstr "Rechts" #: ../src/dlgPreferences.ui:130 msgid "Top" msgstr "Oben" #: ../src/dlgPreferences.ui:133 msgid "Bottom" msgstr "Unten" #: ../src/dlgPreferences.ui:140 msgid "Preferences" msgstr "Einstellungen" #: ../src/dlgPreferences.ui:188 msgid "Colors used by KildClient" msgstr "Farben, die von KildClient verwendet werden" #: ../src/dlgPreferences.ui:208 msgid "_Informative messages:" msgstr "_Informative Meldungen:" #: ../src/dlgPreferences.ui:239 msgid "Command _echo:" msgstr "Befehls-_Echo:" #: ../src/dlgPreferences.ui:278 msgid "Window configuration" msgstr "Fensterkonfiguration" #: ../src/dlgPreferences.ui:298 msgid "_Tab position:" msgstr "_Tab-Position:" #: ../src/dlgPreferences.ui:329 msgid "_Hide tabs if only one world is open" msgstr "_Verstecke Tabs, wenn nur eine Welt geöffnet ist" #: ../src/dlgPreferences.ui:333 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.ui:346 msgid "_Flash window when new text is received" msgstr "Fenster _Blinken lassen, wenn neuer Text empfangen wurde" #: ../src/dlgPreferences.ui:371 msgid "Appearance" msgstr "Erscheinungsbild" #: ../src/dlgPreferences.ui:386 msgid "Sending delays" msgstr "Sendeverzögerungen" #: ../src/dlgPreferences.ui:406 msgid "Enter the default parameters for sending multiple lines or commands:" msgstr "Standardeinstellungen für das Senden mehrerer Zeilen oder Kommandos:" #: ../src/dlgPreferences.ui:422 msgid "_Number of lines/commands to send at once:" msgstr "_Anzahl an Zeilen/Kommandos, die auf einmal gesendet werden können:" #: ../src/dlgPreferences.ui:462 msgid "_Delay between each group of lines/commands:" msgstr "_Verzögerung in Sekunden zwischen dem Senden:" #: ../src/dlgPreferences.ui:510 msgid "Sending" msgstr "Senden" #: ../src/dlgPreferences.ui:527 msgid "Audio player" msgstr "" #: ../src/dlgPreferences.ui:547 #, c-format 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.ui:562 msgid "Specify the command used to play sound files." msgstr "" "Geben Sie den Befehl an, mit dem Klangdateien abgespielt werden können." #: ../src/dlgPreferences.ui:587 msgid "External programs" msgstr "Externe Programme" #: ../src/dlgPreferences.ui:603 ../src/dlgEditWorld.ui:331 msgid "Proxy" msgstr "Proxy" #: ../src/dlgPreferences.ui:627 ../src/dlgEditWorld.ui:355 msgid "Proxy _type:" msgstr "Proxyserver_typ:" #: ../src/dlgPreferences.ui:669 ../src/dlgEditWorld.ui:397 msgid "Server _address:" msgstr "Server_adresse:" #: ../src/dlgPreferences.ui:682 ../src/dlgEditWorld.ui:453 msgid "_Username:" msgstr "_Benutzername:" #: ../src/dlgPreferences.ui:715 ../src/dlgEditWorld.ui:420 msgid "Server _port:" msgstr "Server_port:" #: ../src/dlgPreferences.ui:728 ../src/dlgEditWorld.ui:466 msgid "Pass_word:" msgstr "Pass_wort:" #: ../src/dlgPreferences.ui:781 msgid "Proxy" msgstr "Proxyserver" #: ../src/dlgStatistics.ui:27 msgid "Statistics" msgstr "Statistiken" #: ../src/dlgStatistics.ui:70 ../src/dlgStatistics.ui:81 #: ../src/dlgStatistics.ui:223 ../src/dlgStatistics.ui:338 #: ../src/dlgStatistics.ui:445 ../src/dlgStatistics.ui:456 #: ../src/dlgStatistics.ui:467 ../src/dlgStatistics.ui:478 #: ../src/dlgStatistics.ui:489 ../src/dlgStatistics.ui:511 #: ../src/dlgStatistics.ui:544 ../src/dlgStatistics.ui:555 #: ../src/dlgStatistics.ui:577 ../src/dlgStatistics.ui:610 #: ../src/dlgStatistics.ui:621 msgid "N/A" msgstr "k/A" #: ../src/dlgStatistics.ui:92 msgid "Proxy port:" msgstr "Proxy-Port:" #: ../src/dlgStatistics.ui:103 msgid "Proxy host:" msgstr "Proxyserver:" #: ../src/dlgStatistics.ui:125 msgid "Proxy type:" msgstr "Typ des Proxyservers:" #: ../src/dlgStatistics.ui:136 msgid "World name:" msgstr "Weltname:" #: ../src/dlgStatistics.ui:147 msgid "Host:" msgstr "Server:" #: ../src/dlgStatistics.ui:158 msgid "Port:" msgstr "Port:" #: ../src/dlgStatistics.ui:169 msgid "Connection time:" msgstr "Verbindungszeit:" #: ../src/dlgStatistics.ui:180 msgid "Idle time:" msgstr "Untätigkeitszeit:" #: ../src/dlgStatistics.ui:201 msgid "Compression used:" msgstr "Verwendete Kompression:" #: ../src/dlgStatistics.ui:212 msgid "Bytes received (compressed):" msgstr "Empfangene Bytes (komprimiert):" #: ../src/dlgStatistics.ui:234 msgid "Bytes received (decompressed):" msgstr "Empfangene Bytes (unkomprimiert):" #: ../src/dlgStatistics.ui:245 msgid "Compression ratio:" msgstr "Kompressionsrate:" #: ../src/dlgStatistics.ui:256 msgid "Lines received:" msgstr "Empfangene Zeilen:" #: ../src/dlgStatistics.ui:369 msgid "Key exchange:" msgstr "Schlüsselaustausch:" #: ../src/dlgStatistics.ui:380 msgid "SSL protocol used:" msgstr "Verwendetes SSL Protokoll:" #: ../src/dlgStatistics.ui:391 msgid "Compression algorithm:" msgstr "Kompressionsalgorithmus:" #: ../src/dlgStatistics.ui:402 msgid "Certificate type:" msgstr "Typ des Zertifikats:" #: ../src/dlgStatistics.ui:413 msgid "Cipher:" msgstr "Chiffre:" #: ../src/dlgStatistics.ui:424 msgid "MAC:" msgstr "MAC:" #: ../src/dlgStatistics.ui:500 msgid "Hostname:" msgstr "Hostname:" #: ../src/dlgStatistics.ui:522 msgid "Valid since:" msgstr "Gültig seit:" #: ../src/dlgStatistics.ui:533 msgid "Expiration:" msgstr "Läuft ab:" #: ../src/dlgStatistics.ui:566 msgid "Fingerprint:" msgstr "Fingerabdruck:" #: ../src/dlgStatistics.ui:588 msgid "Subject's DN:" msgstr "Dienst DN:" #: ../src/dlgStatistics.ui:599 msgid "Issuer's DN:" msgstr "Aussteller DN:" #: ../src/dlgAbout.ui:30 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.ui:32 msgid "Visit https://www.kildclient.org" msgstr "Besuchen Sie https://www.kildclient.org" #: ../src/dlgEditWorld.ui:81 msgid "No auto-login" msgstr "Keine automatische Anmeldung" #: ../src/dlgEditWorld.ui:98 msgid "Use global settings" msgstr "Systemeinstellungen verwenden" #: ../src/dlgEditWorld.ui:117 msgid "Edit world" msgstr "Welt bearbeiten" #: ../src/dlgEditWorld.ui:207 msgid "Connection" msgstr "Verbindung" #: ../src/dlgEditWorld.ui:268 msgid "Enter a descriptive name for the world" msgstr "Geben Sie einen beschreibenden Namen der Welt an" #: ../src/dlgEditWorld.ui:281 msgid "Enter the host to connect to" msgstr "Server zu dem die Verbindung hergestellt werden soll" #: ../src/dlgEditWorld.ui:294 msgid "Enter the port used when connecting" msgstr "Port zu dem am Server verbunden werden soll" #: ../src/dlgEditWorld.ui:306 msgid "Use _SSL" msgstr "SS_L-Verschlüsselung verwenden" #: ../src/dlgEditWorld.ui:505 msgid "Auto-login" msgstr "Automatische Anmeldung" #: ../src/dlgEditWorld.ui:529 msgid "Connection _style:" msgstr "Art der _Verbindung:" #: ../src/dlgEditWorld.ui:567 msgid "Ch_aracters in this mud:" msgstr "_Charaktere in diesem MUD:" #: ../src/dlgEditWorld.ui:705 ../src/dlgEditWorld.ui:1840 #: ../src/dlgEditWorld.ui:2502 msgid "Font" msgstr "Schrift" #: ../src/dlgEditWorld.ui:725 msgid "Select the font used in the _main screen:" msgstr "Wähle eine _Schriftart für das Hauptfenster:" #: ../src/dlgEditWorld.ui:741 msgid "Select the font used in the main output screen" msgstr "Wähle eine Schrift für die Hauptausgabe" #: ../src/dlgEditWorld.ui:753 msgid "Use _bold font for highlighted colors (instead of just highlighting)" msgstr "" "_Fettschrift für leuchtende Farben verwenden (statt einfacher Aufhellung)" #: ../src/dlgEditWorld.ui:757 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.ui:779 msgid "Word wrap" msgstr "Zeilenumbruch" #: ../src/dlgEditWorld.ui:798 msgid "_Wrap lines at word boundaries" msgstr "Zeilen am _Wortende umbrechen" #: ../src/dlgEditWorld.ui:802 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "Zeilen am Wortende umbrechen" #: ../src/dlgEditWorld.ui:820 msgid "_Indent wrapped lines by" msgstr "" #: ../src/dlgEditWorld.ui:850 msgid "pixels" msgstr "" #: ../src/dlgEditWorld.ui:869 msgid "Wrap lines at full _screen width" msgstr "" #: ../src/dlgEditWorld.ui:889 msgid "Maximum line width in _characters:" msgstr "" #: ../src/dlgEditWorld.ui:937 msgid "Scrolling" msgstr "Bildlauf" #: ../src/dlgEditWorld.ui:956 msgid "Sc_roll on output" msgstr "Beim _Empfang automatisch scrollen" #: ../src/dlgEditWorld.ui:960 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.ui:978 msgid "_Lines to save in scrollback buffer:" msgstr "_Zeilenanzahl, die im Puffer gespeichert werden soll:" #: ../src/dlgEditWorld.ui:991 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.ui:1022 msgid "Tooltips" msgstr "" #: ../src/dlgEditWorld.ui:1041 msgid "Display _tooltips with the time when the line was received" msgstr "" #: ../src/dlgEditWorld.ui:1045 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.ui:1067 msgid "Name display" msgstr "Namensanzeige" #: ../src/dlgEditWorld.ui:1086 msgid "I_dentify as 'World name'" msgstr "I_dentifizieren als 'Weltname'" #: ../src/dlgEditWorld.ui:1101 msgid "I_dentify as 'World name - Character'" msgstr "I_dentifizieren als 'Weltname - Charakter'" #: ../src/dlgEditWorld.ui:1116 msgid "I_dentify as 'Character - World name'" msgstr "I_dentifizieren als 'Charakter - Weltname'" #: ../src/dlgEditWorld.ui:1135 msgid "C_ustom: " msgstr "_Benutzerdefiniert: " #: ../src/dlgEditWorld.ui:1169 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.ui:1203 msgid "Ansi colors" msgstr "ANSI Farben" #: ../src/dlgEditWorld.ui:1313 msgid "Blac_k" msgstr "_Schwarz" #: ../src/dlgEditWorld.ui:1326 msgid "_Red" msgstr "_Rot" #: ../src/dlgEditWorld.ui:1339 msgid "_Green" msgstr "_Grün" #: ../src/dlgEditWorld.ui:1352 msgid "_Yellow" msgstr "G_elb" #: ../src/dlgEditWorld.ui:1365 msgid "_Blue" msgstr "_Blau" #: ../src/dlgEditWorld.ui:1378 msgid "_Magenta" msgstr "_Magenta" #: ../src/dlgEditWorld.ui:1391 msgid "Cy_an" msgstr "_Zyan" #: ../src/dlgEditWorld.ui:1404 msgid "_White" msgstr "_Weiß" #: ../src/dlgEditWorld.ui:1417 msgid "Blac_k (bold)" msgstr "_Schwarz (fett)" #: ../src/dlgEditWorld.ui:1430 msgid "_Red (bold)" msgstr "_Rot (fett)" #: ../src/dlgEditWorld.ui:1443 msgid "_Green (bold)" msgstr "_Grün (fett)" #: ../src/dlgEditWorld.ui:1456 msgid "_Yellow (bold)" msgstr "G_elb (fett)" #: ../src/dlgEditWorld.ui:1469 msgid "_Blue (bold)" msgstr "_Blau (fett)" #: ../src/dlgEditWorld.ui:1482 msgid "_Magenta (bold)" msgstr "_Magenta (fett)" #: ../src/dlgEditWorld.ui:1495 msgid "Cy_an (bold)" msgstr "_Zyan (fett)" #: ../src/dlgEditWorld.ui:1508 msgid "_White (bold)" msgstr "_Weiß (fett)" #: ../src/dlgEditWorld.ui:1647 msgid "Default colors" msgstr "Standardfarben" #: ../src/dlgEditWorld.ui:1691 msgid "_Foreground" msgstr "_Vordergrund" #: ../src/dlgEditWorld.ui:1704 msgid "Bold _foreground" msgstr "Fetter _Vordergrund" #: ../src/dlgEditWorld.ui:1728 msgid "Backgroun_d" msgstr "_Hintergrund" #: ../src/dlgEditWorld.ui:1752 msgid "Bold backgroun_d" msgstr "Fetter _Hintergrund" #: ../src/dlgEditWorld.ui:1785 msgid "Revert to default colors" msgstr "Standardfarben zurücksetzen" #: ../src/dlgEditWorld.ui:1804 msgid "Re_vert to default colors" msgstr "A_uf Standardfarben zurücksetzen" #: ../src/dlgEditWorld.ui:1808 msgid "Click to revert all colors to their built-in defaults" msgstr "All Farben auf die eingebauten Standardeinstellungen zurücksetzen" #: ../src/dlgEditWorld.ui:1860 msgid "_Select the font used in the status bar:" msgstr "_Wähle eine Schriftart für die Statuszeile:" #: ../src/dlgEditWorld.ui:1895 msgid "Time display" msgstr "Zeitanzeige" #: ../src/dlgEditWorld.ui:1915 msgid "Co_nnected time:" msgstr "_Verbindungszeit:" #: ../src/dlgEditWorld.ui:1935 ../src/dlgEditWorld.ui:2017 msgid "Do not display" msgstr "Nicht anzeigen" #: ../src/dlgEditWorld.ui:1939 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.ui:1953 ../src/dlgEditWorld.ui:2035 msgid "Display as hours, minutes and seconds" msgstr "Zeige Stunden, Minuten und Sekunden" #: ../src/dlgEditWorld.ui:1957 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.ui:1971 ../src/dlgEditWorld.ui:2053 msgid "Display as seconds" msgstr "In Sekunden anzeigen" #: ../src/dlgEditWorld.ui:1975 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.ui:1998 msgid "_Idle time:" msgstr "_Untätigkeitszeit:" #: ../src/dlgEditWorld.ui:2021 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.ui:2039 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.ui:2057 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.ui:2071 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.ui:2075 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.ui:2115 msgid "Command entry" msgstr "Befehlseingabe" #: ../src/dlgEditWorld.ui:2134 msgid "_Keep last typed command in command entry box" msgstr "_Letzten Befehl in der Befehlseingabe belassen" #: ../src/dlgEditWorld.ui:2138 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.ui:2150 msgid "_Echo sent commands in main window" msgstr "Befehlse_cho (gesendete Befehle in der Hauptausgabe wiedergeben)" #: ../src/dlgEditWorld.ui:2154 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.ui:2166 msgid "Store commands _between sessions" msgstr "Befehls_historie beim Beenden in einer Datei ablegen" #: ../src/dlgEditWorld.ui:2170 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.ui:2182 msgid "Never _hide the typed text" msgstr "Eingaben _niemals verstecken (auch nicht bei Passworten)" #: ../src/dlgEditWorld.ui:2186 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.ui:2203 msgid "_Number of commands to save in history:" msgstr "_Anzahl an Befehlen, die in der Historie gespeichert werden sollen:" #: ../src/dlgEditWorld.ui:2217 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.ui:2244 msgid "Co_mmand separator:" msgstr "_Trennzeichen für Befehle:" #: ../src/dlgEditWorld.ui:2257 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.ui:2278 msgid "Use single-_line input bar" msgstr "_Einzeilige Befehlseingabe verwenden" #: ../src/dlgEditWorld.ui:2300 msgid "Enable _auto-completion" msgstr "_Befehls-Autovervollständigung aktivieren" #: ../src/dlgEditWorld.ui:2304 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.ui:2321 msgid "Acti_vate auto-completion only after" msgstr "A_utovervollständigung benötigt mindestens" #: ../src/dlgEditWorld.ui:2335 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.ui:2351 msgid "characters have been entered" msgstr "eingegebene Zeichen" #: ../src/dlgEditWorld.ui:2375 msgid "Use mul_ti-line input bar" msgstr "_Mehrzeilige Befehlseingabe verwenden" #: ../src/dlgEditWorld.ui:2402 msgid "N_umber of lines:" msgstr "Anzahl an _Zeilen:" #: ../src/dlgEditWorld.ui:2437 msgid "S_pell check typed text" msgstr "_Reichtschreibprüfung aktivieren" #: ../src/dlgEditWorld.ui:2457 msgid "Lan_guage:" msgstr "S_prache:" #: ../src/dlgEditWorld.ui:2522 msgid "Select the _font used in the command entry box:" msgstr "_Schriftart, die in der Befehlseingabe verwendet werden soll:" #: ../src/dlgEditWorld.ui:2557 msgid "Flood prevention" msgstr "Überlaufschutz" #: ../src/dlgEditWorld.ui:2580 msgid "_Do not allow the same command to be sent" msgstr "_Verbiete das Senden ab" #: ../src/dlgEditWorld.ui:2584 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.ui:2598 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.ui:2614 msgid "times in a _row" msgstr "_gleichen Befehlen pro Zeile" #: ../src/dlgEditWorld.ui:2638 msgid "_Send this command:" msgstr "Sen_de diesen Befehl:" #: ../src/dlgEditWorld.ui:2651 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.ui:2690 msgid "Logging status" msgstr "Protokollierung" #: ../src/dlgEditWorld.ui:2727 msgid "_Start" msgstr "_Start" #: ../src/dlgEditWorld.ui:2742 msgid "_Stop" msgstr "_Stoppen" #: ../src/dlgEditWorld.ui:2768 msgid "_Include the last" msgstr "_Protokolliere die letzten" #: ../src/dlgEditWorld.ui:2772 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.ui:2785 msgid "Inform number of lines to include in the log." msgstr "Anzahl an Zeilen, die das Protokoll umfassen darf." #: ../src/dlgEditWorld.ui:2801 msgid "_lines of the scrollback buffer in the log" msgstr "_Zeilen des Ausgabepuffers" #: ../src/dlgEditWorld.ui:2829 ../src/dlgEditWorld.ui:3447 msgid "File" msgstr "Datei" #: ../src/dlgEditWorld.ui:2879 msgid "S_elect" msgstr "_Wahlen" #: ../src/dlgEditWorld.ui:2903 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.ui:2925 msgid "Options" msgstr "Optionen" #: ../src/dlgEditWorld.ui:2944 msgid "A_utomatically start logging when connected" msgstr "Protokollierung beim Herstellen einer Verbindung _automatisch starten" #: ../src/dlgEditWorld.ui:2949 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.ui:2961 msgid "Prefix lines with _date and/or time" msgstr "_Datum und Zeit Protokolleinträgen voranstellen" #: ../src/dlgEditWorld.ui:2966 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.ui:2986 msgid "_Format:" msgstr "_Format:" #: ../src/dlgEditWorld.ui:3000 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.ui:3011 msgid "_Revert to default" msgstr "A_uf Standard zurücksetzen" #: ../src/dlgEditWorld.ui:3053 msgid "Scripting" msgstr "Skripte" #: ../src/dlgEditWorld.ui:3078 msgid "_Perl file to load:" msgstr "_Perl Skript, das geladen werden soll:" #: ../src/dlgEditWorld.ui:3142 msgid "Plugins currently loaded" msgstr "Geladene Plugins" #: ../src/dlgEditWorld.ui:3183 msgid "_Load" msgstr "_Laden" #: ../src/dlgEditWorld.ui:3230 msgid "Plugins loaded on startup" msgstr "Plugins geladen beim Programmstart" #: ../src/dlgEditWorld.ui:3275 msgid "_Add" msgstr "Hi_nzufügen" #: ../src/dlgEditWorld.ui:3363 msgid "MCCP (for compression)" msgstr "MCCP (für Kompression)" #: ../src/dlgEditWorld.ui:3382 msgid "_Enable if server proposes after connecting" msgstr "A_ktivieren, wenn der Server es direkt nach dem Verbinden anbietet" #: ../src/dlgEditWorld.ui:3397 msgid "Enable if server proposes at _any time" msgstr "_Zu jeder Zeit aktivieren, wenn der Server es anbietet" #: ../src/dlgEditWorld.ui:3412 msgid "_Disable" msgstr "_Deaktivieren" #: ../src/dlgEditWorld.ui:3471 msgid "_File:" msgstr "_Datei:" #: ../src/dlgEditWorld.ui:3506 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.ui:3528 msgid "Character set" msgstr "Zeichensatz" #: ../src/dlgEditWorld.ui:3552 msgid "C_haracter set:" msgstr "_Zeichensatz:" #: ../src/dlgEditWorld.ui:3591 msgid "Graphical editors" msgstr "" #: ../src/dlgEditWorld.ui:3610 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "_Nachfragen, wenn Objekte wie Trigger oder Alias gelöscht werden" #: ../src/dlgEditWorld.ui:3614 ../src/dlgEditWorld.ui:3676 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.ui:3627 msgid "_Show items defined by plugins" msgstr "Z_eige in Plugins definierte Objekte" #: ../src/dlgEditWorld.ui:3631 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.ui:3653 msgid "TCP keep alive" msgstr "" #: ../src/dlgEditWorld.ui:3672 msgid "Enable TCP _keep alive packets" msgstr "" #: ../src/dlgEditWorld.ui:3689 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "" #: ../src/dlgEditWorld.ui:3709 msgid "Input" msgstr "Eingabe" #: ../src/dlgEditWorld.ui:3728 msgid "_Disable up and down arrow keys for history navigation" msgstr "" #: ../src/dlgEditWorld.ui:3732 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/dlgEditWorld.ui:3749 msgid "Character to run _Perl commands:" msgstr "" #: ../src/dlgEditWorld.ui:3785 msgid "" "Warning: Changing the character to run Perl commands from the default '/' is " "not recommended, because doing so might prevent plugins or other code from " "working, if they use '/' to run Perl commands." msgstr "" #: ../src/dlgTestTriggers.ui:27 msgid "Test triggers" msgstr "Trigger testen" #: ../src/dlgTestTriggers.ui:70 msgid "Enter _line to be matched against the triggers:" msgstr "_Zeile auf die die Trigger angewendet werden sollen:" #: ../src/dlgTestTriggers.ui:88 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.ui:99 ../src/dlgMLSend.ui:69 #: ../src/dlgCmdHistory.ui:91 msgid "_Send" msgstr "S_enden" #: ../src/dlgTestTriggers.ui:103 msgid "Click the run the triggers against the line." msgstr "Klicken um die Trigger auf die Zeile anzuwenden." #: ../src/dlgTestTriggers.ui:138 msgid "Number of triggers that matched:" msgstr "Anzahl der Trigger, die ausgelöst wurden:" #: ../src/dlgTestTriggers.ui:166 msgid "Commands that would be sent:" msgstr "Befehle die gesendet worden wären:" #: ../src/dlgTestTriggers.ui:196 msgid "This is what would be printed in the main screen:" msgstr "Diese Ausgabe wäre im Hauptfenster erschienen:" #: ../src/dlgTestTriggers.ui:208 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.ui:224 msgid "Would this line be included in the log file?" msgstr "Wäre diese Zeile im Protokoll erschienen?" #: ../src/dlgMLSend.ui:39 msgid "Multi-line send" msgstr "Mehrzeilig senden" #: ../src/dlgMLSend.ui:95 msgid "Send this text _initially:" msgstr "Sende diesen Text _zuerst:" #: ../src/dlgMLSend.ui:115 ../src/dlgMLSend.ui:199 msgid "Enter some text to be sent to the World" msgstr "Geben Sie den Text ein, der an die Welt gesendet wird" #: ../src/dlgMLSend.ui:128 msgid "Then send the c_ontents of this file:" msgstr "Dann sende den Inhalt dieser _Datei:" #: ../src/dlgMLSend.ui:179 msgid "_Finally, send this text:" msgstr "Sende _schließlich diesen Text:" #: ../src/dlgMLSend.ui:222 msgid "Add this to the _beginning of each line:" msgstr "_Füge dies am Anfang jeder Zeile an:" #: ../src/dlgMLSend.ui:238 msgid "Specify some text to be prepended to each sent line" msgstr "Text, der an jede gesendete Zeile angehangen wird" #: ../src/dlgMLSend.ui:250 msgid "Add this to the _end of each line:" msgstr "Füge dies am _Ende jeder Zeile an:" #: ../src/dlgMLSend.ui:266 msgid "Specify some text to be appended to each sent line" msgstr "Text, der an jede gesendete Zeile angehangen wird" #: ../src/dlgMLSend.ui:282 ../src/dlgCmdHistory.ui:253 msgid "_Delay" msgstr "_Verzögerung" #: ../src/dlgMLSend.ui:295 msgid "Specify the delay between sending the group of lines" msgstr "Verzögerung beim Senden mehrerer Zeilen" #: ../src/dlgMLSend.ui:310 ../src/dlgCmdHistory.ui:282 msgid "seconds e_ach" msgstr "Se_kunden alle" #: ../src/dlgMLSend.ui:323 msgid "Specify how many lines are sent at once" msgstr "Anzahl der Zeilen, die auf einmal gesendet werden" #: ../src/dlgMLSend.ui:337 msgid "line(s)" msgstr "Zeile(n)" #: ../src/dlgMLSend.ui:355 msgid "_Keep dialog open after sending" msgstr "Dialog nach dem Senden _geöffnet lassen" #: ../src/dlgCmdHistory.ui:39 msgid "Command history" msgstr "Befehlshistorie" #: ../src/dlgCmdHistory.ui:56 msgid "_Recall" msgstr "Erneut _aufrufen" #: ../src/dlgCmdHistory.ui:61 msgid "Put the selected command in the command entry box" msgstr "Ausgewählten Befehl in die Befehlseingabe schreiben" #: ../src/dlgCmdHistory.ui:74 msgid "Reca_ll and close" msgstr "Erneut auf_rufen und schließen" #: ../src/dlgCmdHistory.ui:79 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.ui:96 msgid "Send the selected command(s) to the mud" msgstr "Sende den/die gewählte(n) Befehl(e) zum MUD" #: ../src/dlgCmdHistory.ui:108 msgid "Se_nd and close" msgstr "Se_nden und schließen" #: ../src/dlgCmdHistory.ui:113 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.ui:183 msgid "Find a command containing a given search term" msgstr "Suche einen Befehl mit einem gegebenen Suchbegriff" #: ../src/dlgCmdHistory.ui:200 msgid "Find the next command with the same match text" msgstr "Weiteren Befehl mit diesem Suchbegriff suchen" #: ../src/dlgCmdHistory.ui:227 msgid "Newest commands are on the top" msgstr "Der neueste Befehl ist oben" #: ../src/dlgCmdHistory.ui:266 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.ui:295 msgid "Specify how many commands are sent at once" msgstr "Geben Sie an, wieviele Befehle auf einen Schlag gesendet werden dürfen" #: ../src/dlgCmdHistory.ui:311 msgid "commands(s)" msgstr "Befehl(e)" #: ../src/dlgCmdHistory.ui:335 msgid "Find command" msgstr "Befehl suchen" #: ../src/dlgCmdHistory.ui:390 msgid "_Text to find:" msgstr "Zu suchender _Text:" #: ../src/dlgCmdHistory.ui:404 msgid "Enter the text to search for" msgstr "Geben Sie den Text ein, der gesucht werden soll" #: ../src/dlgCmdHistory.ui:421 msgid "Search direction:" msgstr "Suchrichtung:" #: ../src/dlgCmdHistory.ui:437 msgid "_Downwards" msgstr "A_bwärts" #: ../src/dlgCmdHistory.ui:452 msgid "_Upwards" msgstr "Au_fwärts" #: ../src/mnuPopupURL.ui:29 msgid "_Open link" msgstr "Link ö_ffnen" #: ../src/mnuPopupURL.ui:37 msgid "_Copy link address" msgstr "Linkadresse _kopieren" #: ../share/kildclient.pl:75 ../share/kildclient.pl:96 #: ../share/kildclient.pl:116 ../share/kildclient.pl:181 #: ../share/kildclient.pl:393 ../share/kildclient.pl:493 #: ../share/kildclient.pl:571 ../share/kildclient.pl:584 #: ../share/kildclient.pl:597 ../share/kildclient.pl:610 #: ../share/kildclient.pl:623 ../share/kildclient.pl:636 #: ../share/kildclient.pl:649 ../share/kildclient.pl:662 #: ../share/kildclient.pl:676 ../share/kildclient.pl:690 #: ../share/kildclient.pl:800 ../share/kildclient.pl:812 #: ../share/kildclient.pl:824 ../share/kildclient.pl:836 #: ../share/kildclient.pl:849 ../share/kildclient.pl:1098 #: ../share/kildclient.pl:1131 #, perl-format msgid "%s: Too few arguments." msgstr "%s: Zu wenig Argumente." #: ../share/kildclient.pl:297 ../share/kildclient.pl:315 #: ../share/kildclient.pl:333 ../share/kildclient.pl:351 #: ../share/kildclient.pl:369 #, perl-format msgid "%s: Wrong number of arguments." msgstr "%s: Falsche Anzahl an Argumenten." #: ../share/kildclient.pl:488 msgid "Successfully moved." msgstr "Erfolgreich verschoben." #: ../share/kildclient.pl:871 #, perl-format msgid "One %1$s deleted" msgid_plural "%2$d %1$s deleted" msgstr[0] "Ein %s gelöscht" msgstr[1] "%2$d %1$s gelöscht" #: ../share/kildclient.pl:913 msgid "Could not open file." msgstr "Kann Datei nicht öffnen." #: ../share/kildclient.pl:943 msgid "Unknown" msgstr "Unbekannt" #: ../share/kildclient.pl:950 msgid "Invalid plugin file." msgstr "Ungültige Plugin-Datei." #: ../share/kildclient.pl:981 msgid "Plugin already loaded. Try enabling it." msgstr "Plugin ist bereits geladen. Versuchen Sie es zu aktivieren." #: ../share/kildclient.pl:983 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "Version %s dieses Plugins bereits geladen." #: ../share/kildclient.pl:993 #, perl-format msgid "Error in plugin file: %s" msgstr "Fehler in der Plugin-Datei: %s" #: ../share/kildclient.pl:1005 msgid "Cannot load a plugin in another world." msgstr "Kann kein Plugin in einer anderen Welt laden." #: ../share/kildclient.pl:1010 ../share/kildclient.pl:1030 msgid "Plugin not specified" msgstr "Kein Plugin angegeben." #: ../share/kildclient.pl:1017 ../share/kildclient.pl:1048 msgid "Plugin not loaded." msgstr "Plugin ist nicht geladen." #: ../share/kildclient.pl:1020 #, perl-format msgid "Plugin '%s' loaded." msgstr "Plugin '%s' geladen." #: ../share/kildclient.pl:1036 #, perl-format msgid "Could not load plugin %s" msgstr "Kann Plugin %s nicht laden" #: ../share/kildclient.pl:1112 msgid "Plugin enabled." msgstr "Plugin aktiviert." #: ../share/kildclient.pl:1145 msgid "Plugin disabled." msgstr "Plugin deaktiviert." #: ../share/kildclient.pl:1295 msgid "Cannot open help file." msgstr "Kann Hilfe-Datei nicht öffnen." #: ../share/kildclient.pl:1318 msgid "Help topic not found." msgstr "Hilfethema nicht gefunden." kildclient-3.2.0/po/POTFILES.in0000644000175000017500000000212613220232041012740 00000000000000# List of files with marked strings src/main.c src/net.c src/telnet.c src/proxy.c src/mainwindow.c src/worldgui.c src/mainthread_operations.c src/process_line_thread.c src/ansiparse_thread.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_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/util.c src/perlscript.c src/kcircularqueue.c src/kcwin.c src/simocombobox.c src/kildclient.ui src/wndmain.ui src/dlgSelectWorld.ui src/dlgPreferences.ui src/dlgStatistics.ui src/dlgAbout.ui src/dlgEditWorld.ui src/dlgTestTriggers.ui src/dlgMLSend.ui src/dlgCmdHistory.ui src/mnuPopupURL.ui src/kildclient.h src/ansi.h src/perlscript.h share/kildclient.pl kildclient-3.2.0/po/Makefile.in.in0000644000175000017500000001750413220232041013643 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 = mkdir -p 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: $(AM_V_GEN) 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) \ --msgid-bugs-address='eduardo@kalinowski.com.br' \ --add-comments --keyword=_ --keyword=N_ \ --keyword=C_:1c,2 \ --keyword=NC_:1c,2 \ --keyword=g_dcgettext:2 \ --keyword=g_dngettext:2,3 \ --keyword=g_dpgettext2:2c,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 \ $(POTFILES) \ && 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 $(MKINSTALLDIRS) $(DESTDIR)$(datadir); \ 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; \ $(MKINSTALLDIRS) $$dir; \ 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 \ $(MKINSTALLDIRS) $(DESTDIR)$(gettextsrcdir); \ $(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: $(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-3.2.0/po/eo.po0000644000175000017500000025577613220232041012153 00000000000000# KildClient messages in Esperanto # Copyright (C) 2004-2017 Eduardo M Kalinowski # This file is distributed under the same license as the KildClient package. # msgid "" msgstr "" "Project-Id-Version: KildClient 3.2.0\n" "Report-Msgid-Bugs-To: eduardo@kalinowski.com.br\n" "POT-Creation-Date: 2017-12-24 09:10-0200\n" "PO-Revision-Date: 2017-12-24 09:25-0200\n" "Last-Translator: Eduardo M Kalinowski \n" "Language-Team: Eduardo M Kalinowski \n" "Language: eo\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:63 msgid "Outputs version information and exits" msgstr "Monstras eldoninformadon kaj eliras" #: ../src/main.c:65 msgid "Directory to store settings and saved worlds" msgstr "Dosierujo por konservi la konfiguron kaj konservitajn mondojn" #: ../src/main.c:65 msgid "DIR" msgstr "DOSIERUJO" #: ../src/main.c:67 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:68 ../src/main.c:71 msgid "FILE" msgstr "DOSIERO" #: ../src/main.c:70 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:101 msgid "[WORLD...]" msgstr "[MONDO...]" #: ../src/main.c:108 #, 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:113 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "Ne eblas malfermi ŝutdosieron %s: %s\n" #: ../src/main.c:120 #, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "Ne eblas malfermi kruddataŝutdosieron %s: %s\n" #: ../src/main.c:240 #, c-format msgid "There is one open world. Do you really want to quit?" msgid_plural "There are %d open worlds. Do you really want to quit?" msgstr[0] "Estas unu malfermata mondo. Ĉu vi vere volas eliri?" msgstr[1] "Estas %d malfermataj mondoj. Ĉu vi vere volas eliri?" #: ../src/main.c:244 msgid "Really quit KildClient?" msgstr "Vere eliri KildClient?" #: ../src/main.c:246 msgid "_Don't quit" msgstr "_Ne eliri" #: ../src/main.c:247 ../src/wndmain.ui:146 msgid "_Quit" msgstr "E_liri" #: ../src/net.c:166 ../src/proxy.c:209 #, c-format msgid "Resolving proxy host %s..." msgstr "Serĉante prokurservilon %s..." #: ../src/net.c:169 #, c-format msgid "Resolving host %s..." msgstr "Serĉante retnodon %s..." #: ../src/net.c:262 ../src/proxy.c:193 #, c-format msgid "Could not resolve host %s: %s" msgstr "Ne eblas trovi retnodon %s: %s" #: ../src/net.c:290 #, c-format msgid "Attempting to connect to host %s (%s) port %s..." msgstr "Provante koneti al retnodo %s (%s) pordo %s..." #: ../src/net.c:293 #, 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:309 #, c-format msgid "Could not create socket: %s" msgstr "Ne eblas krei kontaktoskatolon: %s" #: ../src/net.c:312 #, c-format msgid "Could not create socket: error #%d" msgstr "Ne eblas krei kontaktoskatolon: eraro #%d" #: ../src/net.c:332 #, 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:342 #, 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:398 #, c-format msgid "Unable to connect to host %s: %s." msgstr "Ne eblas konekti al retnodo %s: %s" #: ../src/net.c:401 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "Ne eblas konekti al prokurservilon %s: %s" #: ../src/net.c:443 ../src/net.c:461 #, c-format msgid "Unable to connect to host %s: error #%d." msgstr "Ne eblas konekti al retnodo %s: eraro #%d." #: ../src/net.c:446 ../src/net.c:464 #, c-format msgid "Unable to connect to proxy host %s: error #%d." msgstr "Ne eblas konekti al prokurservilon %s: eraro #%d." #: ../src/net.c:499 #, c-format msgid "Performing SSL handshake..." msgstr "Iniciante SSL negociadon..." #. Fatal error #: ../src/net.c:542 #, c-format msgid "SSL handshake failed: %s" msgstr "SSL negociado ne funkciis: %s" #: ../src/net.c:583 #, c-format msgid "SSL handshake took too long." msgstr "SSL negociado daŭris tre longe." #: ../src/net.c:605 ../src/net.c:1091 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "Konektata al retnodo %s (%s) pordo %s." #: ../src/net.c:608 ../src/net.c:1094 #, 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:615 ../src/net.c:1067 ../src/net.c:1101 msgid " SSL enabled." msgstr "SSL ebligita." #: ../src/net.c:770 #, c-format msgid "Disconnected from host %s." msgstr "Malkonektita el retnodo %s." #: ../src/net.c:838 ../src/net.c:846 #, c-format msgid "Disconnected from host %s: %s." msgstr "Malkonektita el retnodo %s: %s." #: ../src/net.c:857 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "Malkonektita el retnodo %s: eraro #%d." #: ../src/net.c:1055 #, 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:1059 #, 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:1177 ../src/we_logging.c:121 msgid "Not connected." msgstr "Ne konektata." #. success #: ../src/proxy.c:57 msgid "general failure" msgstr "ĝenerala malfunkciado" #: ../src/proxy.c:58 msgid "connection not allowed by ruleset" msgstr "konekto ne permesita de la regularo" #: ../src/proxy.c:59 msgid "network unreachable" msgstr "reto ne atingebla" #: ../src/proxy.c:60 msgid "host unreachable" msgstr "retnodo ne atingebla" #: ../src/proxy.c:61 msgid "connection refused by destination host" msgstr "konekto rifuzita de la destina retnodo" #: ../src/proxy.c:62 msgid "TTL expired" msgstr "TTL finiĝita" #: ../src/proxy.c:63 msgid "command not supported / protocol error" msgstr "komando ne subtenata / protokoleraro" #: ../src/proxy.c:64 msgid "address type not supported" msgstr "adrestipo ne subtenata" #: ../src/proxy.c:239 ../src/proxy.c:661 #, c-format msgid "Connected to proxy server %s port %s, sending request..." msgstr "Konektata al prokurservilo %s pordo %s, sendante konektpeton...." #: ../src/proxy.c:294 ../src/proxy.c:423 ../src/proxy.c:468 ../src/proxy.c:542 #: ../src/proxy.c:708 msgid "Error while reading from proxy host." msgstr "Eraru dum legado el la prokurservilo." #: ../src/proxy.c:315 msgid "request rejected or failed" msgstr "konektpeto malakceptita aŭ malsukcesita" #: ../src/proxy.c:319 msgid "request failed because identd could not be reached" msgstr "konkektpeto malsukcesis ĉar identd ne povis esti atingita" #: ../src/proxy.c:323 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:327 ../src/proxy.c:568 ../src/proxy.c:724 #, c-format msgid "Proxy request failed: %s." msgstr "Prokura konektpeto malsukcesis: %s." #: ../src/proxy.c:344 #, 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:438 msgid "No acceptable proxy authentication methods." msgstr "Neniŭ akceptebla aŭtentokontrolmetodo por prokurservilo." #: ../src/proxy.c:486 msgid "Proxy authentication failed." msgstr "Prokurservila aŭtentokontrolo malsukcesis." #. Should never happen #: ../src/proxy.c:529 msgid "Unrecognized response from proxy host." msgstr "Malrekonebla respondo el prokurservilo." #: ../src/proxy.c:563 msgid "unknown reason code" msgstr "malkonata kodo." #: ../src/proxy.c:584 #, c-format msgid "Sending proxy authentication credentials..." msgstr "Sendante aŭtentokontrolajn akreditaĵojn al prokurservilo..." #: ../src/proxy.c:623 #, c-format msgid "Sending connection request..." msgstr "Sendante konketpeton..." #: ../src/mainwindow.c:162 ../src/mainwindow.c:608 ../src/mainwindow.c:874 #: ../src/worldgui.c:1132 ../src/worldselector.c:186 ../src/worldeditor.c:178 #: ../src/we_general.c:334 ../src/we_generic_guied.c:81 ../src/we_triggers.c:83 #: ../src/we_triggers.c:553 ../src/we_triggers.c:744 ../src/we_aliases.c:76 #: ../src/we_aliases.c:455 ../src/we_macros.c:79 ../src/we_macros.c:420 #: ../src/we_timers.c:76 ../src/we_timers.c:458 ../src/we_hooks.c:87 #: ../src/we_hooks.c:620 ../src/we_vars.c:76 ../src/we_vars.c:362 #: ../src/prefs.c:106 ../src/triggers.c:277 ../src/multilinesend.c:92 #: ../src/cmdhistory.c:209 ../src/cmdhistory.c:439 #, c-format msgid "Error loading UI from XML file: %s" msgstr "Eraro dum ŝarĝo de interfaco el XMLdosiero: %s" #: ../src/mainwindow.c:668 ../src/mainwindow.c:669 msgid "Not connected" msgstr "Ne konektata" #: ../src/mainwindow.c:810 msgid ": Not yet active" msgstr ": Ne ankoraŭ aktiva" #: ../src/mainwindow.c:815 msgid ": Expired" msgstr ": Finiĝita" #: ../src/mainwindow.c:829 ../src/kildclient.ui:1898 #: ../src/dlgStatistics.ui:114 ../src/dlgStatistics.ui:327 msgid "None" msgstr "Neniu" #: ../src/worldgui.c:229 msgid "_Find:" msgstr "_Trovi:" #: ../src/worldgui.c:243 ../src/wndmain.ui:216 ../src/wndmain.ui:272 #: ../src/dlgCmdHistory.ui:195 msgid "Find n_ext" msgstr "Trovi p_roksiman" #: ../src/worldgui.c:270 msgid "Click to clear the command input area." msgstr "Klaku por forigi la tekston en la komandskatolo." #: ../src/worldgui.c:376 msgid "No world" msgstr "Neniu mondo" #: ../src/worldgui.c:425 msgid "KildClient ready" msgstr "KildClient preta" #: ../src/worldgui.c:435 msgid "0 lines" msgstr "0 linioj" #: ../src/worldgui.c:895 msgid "Are you sure you want to close this world?" msgstr "Ĉu vi vere volas fermi ĉi tiun mondon?" #: ../src/worldgui.c:896 msgid "Really close?" msgstr "Vere fermi?" #: ../src/worldgui.c:898 msgid "Keep _open" msgstr "Teni _malfermata" #: ../src/worldgui.c:899 ../src/worldselector.c:799 ../src/worldselector.c:805 #: ../src/wndmain.ui:82 ../src/dlgPreferences.ui:155 #: ../src/dlgTestTriggers.ui:41 ../src/dlgCmdHistory.ui:125 msgid "_Close" msgstr "_Fermi" #: ../src/worldgui.c:1064 #, c-format msgid "Error setting spell checker: %s\n" msgstr "Eraro en konfigurado de literumilo: %s\n" #: ../src/worldgui.c:1318 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:1484 msgid "Not found" msgstr "Ne trovata" #: ../src/ansitextview.c:429 #, c-format msgid "%d line" msgid_plural "%d lines" msgstr[0] "%d linio" msgstr[1] "%d linioj" #: ../src/worldselector.c:135 ../src/worldselector.c:677 #, c-format msgid "Could not load world from file '%s': %s" msgstr "Ne eblas ŝarĝi mondon el dosiero '%s': %s" #: ../src/worldselector.c:487 #, c-format msgid "Could not open world '%s': %s\n" msgstr "Ne eblas malfermi mondon '%s': %s\n" #: ../src/worldselector.c:530 #, c-format msgid "Invalid argument '%s'\n" msgstr "Argumento '%s' ne estas valida\n" #: ../src/worldselector.c:793 msgid "Disconnected" msgstr "Malkonektata" #: ../src/worldselector.c:796 ../src/worldselector.c:803 ../src/wndmain.ui:58 msgid "_Reconnect" msgstr "_Rekonekti" #: ../src/worldselector.c:797 ../src/worldselector.c:804 msgid "Connect to _another world" msgstr "Konekti al _alia mondo" #: ../src/worldselector.c:798 msgid "_Offline" msgstr "_Senkonekte" #: ../src/worlds.c:772 msgid "Unnamed world" msgstr "Mondo ne nomiĝata" #: ../src/worlds.c:829 ../src/worlds.c:2346 ../src/we_generic_guied.c:311 #: ../src/prefs.c:431 #, c-format msgid "Could not open file '%s': %s" msgstr "Ne eblas malfermi dosieron '%s': %s" #: ../src/worlds.c:892 #, c-format msgid "Invalid top-level element '%s'" msgstr "Elemento '%s' invalida" #: ../src/worlds.c:1695 #, 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:1964 #, c-format msgid "Invalid key code '%s'" msgstr "Klavkodo '%s' invalida" #: ../src/worlds.c:1983 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "Elemento '%s' ne permisata ene elemento '%s'" #: ../src/worlds.c:1996 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "Atributo '%s' ne estas valida por elemento '%s'" #: ../src/worlds.c:2503 #, c-format msgid "Disconnected from world %s" msgstr "Malkonektita el mondo %s" #: ../src/worldeditor.c:239 msgid "General" msgstr "Ĝenerala" #: ../src/worldeditor.c:247 ../src/worldeditor.c:251 msgid "Display" msgstr "Apero" #: ../src/worldeditor.c:248 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:259 msgid "Main window" msgstr "Ĉeffenestro" #: ../src/worldeditor.c:267 msgid "Colors" msgstr "Koloroj" #: ../src/worldeditor.c:275 msgid "Status bar" msgstr "Stata breto" #: ../src/worldeditor.c:283 msgid "Input" msgstr "Enigo" #: ../src/worldeditor.c:291 msgid "Logging" msgstr "Registrado" #: ../src/worldeditor.c:297 ../src/worldeditor.c:301 msgid "Automation" msgstr "Aŭtomatizo" #: ../src/worldeditor.c:298 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:309 msgid "Scripting" msgstr "Skriptdosiero" #: ../src/worldeditor.c:317 msgid "Plugins" msgstr "Plugins" #: ../src/worldeditor.c:328 msgid "Triggers" msgstr "Triggers" #: ../src/worldeditor.c:339 msgid "Aliases" msgstr "Aliases" #: ../src/worldeditor.c:350 msgid "Macros" msgstr "Macros" #: ../src/worldeditor.c:361 msgid "Timers" msgstr "Timers" #: ../src/worldeditor.c:372 msgid "Hooks" msgstr "Hokoj" #: ../src/worldeditor.c:383 msgid "Variables" msgstr "Variabloj" #: ../src/worldeditor.c:392 msgid "Protocols" msgstr "Protokoloj" #: ../src/worldeditor.c:400 msgid "Advanced" msgstr "Avancita" #: ../src/we_general.c:73 msgid "Character" msgstr "Rolulo" #: ../src/we_general.c:81 msgid "Password" msgstr "Pasvorto" #: ../src/we_general.c:373 msgid "You must specify the name." msgstr "Vi devas informi la nomon." #: ../src/we_general.c:380 msgid "You must specify the password." msgstr "Vi devas informi la passvorton.." #: ../src/we_general.c:418 msgid "character" msgstr "rolulo" #: ../src/we_logging.c:110 ../src/log.c:104 #, c-format msgid "Logging to file %s." msgstr "Registrado aktiva al dosiero %s." #: ../src/we_logging.c:116 msgid "Logging is disabled." msgstr "Registrado malaktiva." #: ../src/we_logging.c:209 msgid "Logging not started" msgstr "Registrado ne komencata." #: ../src/we_logging.c:238 msgid "Select log file" msgstr "Elektu Registradodosieron" #: ../src/we_logging.c:241 ../src/we_plugins.c:574 ../src/we_generic_guied.c:97 #: ../src/we_generic_guied.c:364 ../src/kildclient.ui:64 #: ../src/kildclient.ui:342 ../src/kildclient.ui:559 ../src/kildclient.ui:682 #: ../src/kildclient.ui:865 ../src/kildclient.ui:1069 ../src/kildclient.ui:1369 #: ../src/kildclient.ui:1943 ../src/dlgSelectWorld.ui:43 #: ../src/dlgEditWorld.ui:132 ../src/dlgMLSend.ui:54 #: ../src/dlgCmdHistory.ui:348 msgid "_Cancel" msgstr "_Resignu" #: ../src/we_logging.c:243 ../src/kildclient.ui:78 ../src/kildclient.ui:356 #: ../src/kildclient.ui:573 ../src/kildclient.ui:696 ../src/kildclient.ui:879 #: ../src/kildclient.ui:1083 ../src/kildclient.ui:1383 #: ../src/kildclient.ui:1957 ../src/dlgStatistics.ui:40 #: ../src/dlgEditWorld.ui:146 ../src/dlgCmdHistory.ui:362 msgid "_OK" msgstr "_OK" #: ../src/we_plugins.c:124 ../src/we_plugins.c:336 ../src/we_triggers.c:225 #: ../src/we_aliases.c:206 ../src/we_macros.c:209 ../src/we_timers.c:206 #: ../src/we_hooks.c:341 ../src/perlscript.c:3429 msgid "Name" msgstr "Nomo" #: ../src/we_plugins.c:136 ../src/we_plugins.c:378 ../src/perlscript.c:3430 msgid "Description" msgstr "Priskribo" #: ../src/we_plugins.c:148 ../src/we_plugins.c:364 msgid "Author" msgstr "Aŭtoro" #: ../src/we_plugins.c:161 msgid "File" msgstr "Dosiero" #: ../src/we_plugins.c:205 ../src/we_plugins.c:457 msgid "Error loading plugin" msgstr "Eraro dum ŝargado de plugin" #: ../src/we_plugins.c:322 ../src/we_triggers.c:211 ../src/we_aliases.c:192 #: ../src/we_macros.c:195 ../src/we_timers.c:192 ../src/we_hooks.c:327 msgid "Enabled" msgstr "Ebligata" #: ../src/we_plugins.c:350 msgid "Version" msgstr "Eldono" #: ../src/we_plugins.c:439 msgid "Always load this plugin at _startup" msgstr "Ĉiam ŝargi ĉi tiun plugin en _startigo" #: ../src/we_plugins.c:497 msgid "The help is displayed in main window." msgstr "La aiuto estas en la ĉeffenestro." #: ../src/we_plugins.c:498 msgid "KildClient information" msgstr "Informo - KildClient" #: ../src/we_plugins.c:499 msgid "_Do not display this message again" msgstr "_Ne montri ĉi tiun mesaĝon denove" #: ../src/we_plugins.c:571 msgid "Load plugin" msgstr "Ŝargi plugin" #: ../src/we_plugins.c:576 ../src/we_generic_guied.c:366 msgid "_Open" msgstr "_Malfermi" #: ../src/we_generic_guied.c:94 msgid "Export" msgstr "Eksporti" #: ../src/we_generic_guied.c:99 ../src/wndmain.ui:104 msgid "_Save" msgstr "Kon_servi" #: ../src/we_generic_guied.c:361 msgid "Import" msgstr "Importi" #: ../src/we_generic_guied.c:393 #, c-format msgid "Could not import file '%s': %s" msgstr "Ne eblas importi dosieron '%s': %s" #: ../src/we_generic_guied.c:948 #, c-format msgid "Do you really want to delete the %1$s?" msgid_plural "Do you really want to delete %2$d %1$s?" msgstr[0] "Ĉu vi vere volas forigi la %1$s-n?" msgstr[1] "Ĉu vi vere volas forigi %2$d %1$s-jn?" #: ../src/we_generic_guied.c:952 ../src/we_vars.c:282 msgid "Confirm deletion" msgstr "Konfirmado de forigo" #: ../src/we_generic_guied.c:954 msgid "Do _not delete" msgstr "_Ne forigi" #: ../src/we_generic_guied.c:955 ../src/kildclient.ui:1736 #: ../src/wndmain.ui:194 ../src/dlgSelectWorld.ui:151 #: ../src/dlgEditWorld.ui:634 ../src/dlgEditWorld.ui:3290 msgid "_Delete" msgstr "_Forigi" #: ../src/we_triggers.c:130 msgid "_Test triggers" msgstr "_Testi trigger-jn" #: ../src/we_triggers.c:239 ../src/we_aliases.c:220 ../src/triggers.c:140 #: ../src/aliases.c:176 msgid "Pattern" msgstr "Ŝablono" #: ../src/we_triggers.c:257 ../src/we_aliases.c:238 msgid "Ig. case" msgstr "Ig. usk." #: ../src/we_triggers.c:271 ../src/we_macros.c:237 ../src/we_timers.c:246 #: ../src/we_hooks.c:355 ../src/triggers.c:141 ../src/macros.c:145 #: ../src/timers.c:202 msgid "Action" msgstr "Ago" #: ../src/we_triggers.c:289 msgid "Gag" msgstr "Gag" #: ../src/we_triggers.c:307 msgid "Gag log" msgstr "Gag log" #: ../src/we_triggers.c:325 msgid "Keep exec" msgstr "_Daŭri ezek" #: ../src/we_triggers.c:343 msgid "Rewriter" msgstr "Reskribisto" #: ../src/we_triggers.c:361 msgid "Style" msgstr "Stilo" #: ../src/we_triggers.c:375 ../src/we_aliases.c:284 ../src/we_macros.c:251 #: ../src/we_timers.c:278 ../src/we_hooks.c:369 msgid "Plugin" msgstr "Plugin" #: ../src/we_triggers.c:470 ../share/kildclient.pl:803 #: ../share/kildclient.pl:865 msgid "trigger" msgid_plural "triggers" msgstr[0] "trigger" msgstr[1] "triggers" #: ../src/we_triggers.c:635 ../src/we_aliases.c:516 msgid "You must specify the pattern." msgstr "Vi devas informi la ŝablonon." #: ../src/we_triggers.c:643 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:252 ../src/aliases.c:177 msgid "Substitution" msgstr "Anstataŭo" #: ../src/we_aliases.c:270 msgid "Eval as Perl" msgstr "Komp Perl" #: ../src/we_aliases.c:379 ../share/kildclient.pl:815 #: ../share/kildclient.pl:866 msgid "alias" msgid_plural "aliases" msgstr[0] "alias" msgstr[1] "aliases" #: ../src/we_aliases.c:523 msgid "You must specify the substitution." msgstr "Vi devas informi la anstataŭon." #: ../src/we_macros.c:223 ../src/macros.c:144 msgid "Key" msgstr "Klavo" #: ../src/we_macros.c:346 ../share/kildclient.pl:827 ../share/kildclient.pl:867 msgid "macro" msgid_plural "macros" msgstr[0] "macro" msgstr[1] "macros" #: ../src/we_macros.c:476 msgid "You must specify the key." msgstr "Vi devas informi la klavon." #: ../src/we_macros.c:483 msgid "Invalid key code." msgstr "Invalida klavkodo." #: ../src/we_macros.c:490 ../src/we_timers.c:523 ../src/we_hooks.c:671 msgid "You must specify the action." msgstr "Vi devas informi la agon." #: ../src/we_timers.c:219 msgid "Interval" msgstr "Intervalo" #: ../src/we_timers.c:232 msgid "Count" msgstr "Fojoj" #: ../src/we_timers.c:264 msgid "Temp" msgstr "Nedaŭra" #: ../src/we_timers.c:380 ../share/kildclient.pl:839 ../share/kildclient.pl:868 msgid "timer" msgid_plural "timers" msgstr[0] "timer" msgstr[1] "timers" #: ../src/we_timers.c:516 msgid "The interval must be positive." msgstr "La intervalo devas esti pozitiva." #. The manually added combo for selecting which hook #: ../src/we_hooks.c:130 msgid "_Event:" msgstr "E_vento:" #: ../src/we_hooks.c:546 ../share/kildclient.pl:852 ../share/kildclient.pl:869 msgid "hook" msgid_plural "hooks" msgstr[0] "hoko" msgstr[1] "hokoj" #: ../src/we_vars.c:278 #, c-format msgid "Do you really want to make the variable temporary?" msgid_plural "Do you really want to make %d variables temporary?" msgstr[0] "Ĉu vi vere volas igi ĉi tiun variablon maldaŭra?" msgstr[1] "Ĉu vi vere volas igi %d variablojn maldaŭraj?" #: ../src/we_vars.c:284 msgid "Keep _permanent" msgstr "Teni _daŭra" #: ../src/we_vars.c:285 msgid "Make _temporary" msgstr "Igi _maldaŭra" #: ../src/we_vars.c:389 msgid "You must specify a variable name." msgstr "Vi devas informi variablnomon." #: ../src/we_vars.c:395 #, 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:408 #, c-format msgid "%s is already permanent." msgstr "%s jam estas daŭra." #: ../src/prefs.c:387 #, 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:407 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "Ne konata direktivo '%s' en konfigurdosiero.\n" #: ../src/prefs.c:501 #, c-format msgid "Could not create directory '%s': %s" msgstr "Ne eblas krei dosierujon '%s': %s" #: ../src/parser.c:211 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:139 #, c-format msgid "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" msgstr "" #: ../src/triggers.c:161 ../src/triggers.c:162 ../src/triggers.c:163 #: ../src/triggers.c:164 ../src/triggers.c:165 ../src/triggers.c:166 #: ../src/triggers.c:167 ../src/aliases.c:197 ../src/aliases.c:198 #: ../src/aliases.c:199 ../src/macros.c:167 ../src/timers.c:225 #: ../src/timers.c:226 ../src/hooks.c:206 ../src/perlscript.c:3449 msgid "y" msgstr "j" #: ../src/triggers.c:161 ../src/triggers.c:162 ../src/triggers.c:163 #: ../src/triggers.c:164 ../src/triggers.c:165 ../src/triggers.c:166 #: ../src/triggers.c:167 ../src/aliases.c:197 ../src/aliases.c:198 #: ../src/aliases.c:199 ../src/macros.c:167 ../src/timers.c:225 #: ../src/timers.c:226 ../src/hooks.c:206 ../src/perlscript.c:3449 msgid "n" msgstr "n" #: ../src/triggers.c:361 ../src/kildclient.ui:1918 msgid "No" msgstr "Ne" #: ../src/triggers.c:361 ../src/kildclient.ui:1921 msgid "Yes" msgstr "Jes" #: ../src/aliases.c:175 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "" #: ../src/macros.c:143 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "" #: ../src/timers.c:194 msgid "Num Ena Temp Int " msgstr "" #: ../src/timers.c:198 msgid "Count " msgstr "Fojoj " #: ../src/permanentvariables.c:115 #, 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:60 ../src/hooks.c:442 #, c-format msgid "hook: Invalid event '%s'\n" msgstr "hook: Evento '%s' ne estas valida\n" #: ../src/hooks.c:76 ../src/hooks.c:225 ../share/kildclient.pl:885 msgid "No such hook" msgstr "Ne ekzistas tiu hoko." #: ../src/hooks.c:191 #, c-format msgid "Hooks for '%s':\n" msgstr "Hokoj por '%s':\n" #: ../src/hooks.c:192 msgid "Num Ena Action" msgstr "" #: ../src/hooks.c:230 #, 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:236 ../src/perlscript.c:1769 ../src/perlscript.c:2272 #: ../src/perlscript.c:2582 ../src/perlscript.c:2870 msgid "Not set" msgstr "Ne difinita" #: ../src/hooks.c:238 ../src/perlscript.c:1772 ../src/perlscript.c:1773 #: ../src/perlscript.c:1774 ../src/perlscript.c:1775 ../src/perlscript.c:1776 #: ../src/perlscript.c:1777 ../src/perlscript.c:1778 ../src/perlscript.c:2275 #: ../src/perlscript.c:2276 ../src/perlscript.c:2277 ../src/perlscript.c:2585 #: ../src/perlscript.c:2874 ../src/perlscript.c:2875 ../src/perlscript.c:3487 msgid "yes" msgstr "jes" #: ../src/hooks.c:238 ../src/perlscript.c:1772 ../src/perlscript.c:1773 #: ../src/perlscript.c:1774 ../src/perlscript.c:1775 ../src/perlscript.c:1776 #: ../src/perlscript.c:1777 ../src/perlscript.c:1778 ../src/perlscript.c:2275 #: ../src/perlscript.c:2276 ../src/perlscript.c:2277 ../src/perlscript.c:2585 #: ../src/perlscript.c:2874 ../src/perlscript.c:2875 ../src/perlscript.c:3487 msgid "no" msgstr "ne" #: ../src/log.c:121 msgid "File name not specified." msgstr "Plugindosiero ne informata." #: ../src/log.c:187 #, c-format msgid "Could not open log file: %s." msgstr "Ne eblas malfermi registraddosieron: %s." #: ../src/plugins.c:101 ../src/plugins.c:160 #, c-format msgid "Failed loading file %s: %s" msgstr "Ne eblas malfermi dosieron %s: %s" #: ../src/cmdhistory.c:273 msgid "No command selected." msgstr "Neniu komando selektata." #: ../src/cmdhistory.c:277 msgid "More than one command selected." msgstr "Plu ol unu komando selektata." #: ../src/cmdhistory.c:466 msgid "Enter some text to search for." msgstr "Tajpu tekston por trovi." #: ../src/cmdhistory.c:491 msgid "Use the Find button to find the first result." msgstr "Uzu la Trovi butonon por trovi la unuan rezultaton." #: ../src/cmdhistory.c:540 msgid "Command not found." msgstr "Komando ne trovata." #: ../src/util.c:180 msgid "KildClient error" msgstr "Eraro - KildClient" #: ../src/perlscript.c:509 ../src/perlscript.c:515 ../src/perlscript.c:522 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "Malvalida funkciovoko: la sintakso estas $world->FUNKCIO" #: ../src/perlscript.c:706 ../src/perlscript.c:723 ../src/perlscript.c:785 #: ../src/perlscript.c:818 ../src/perlscript.c:1224 ../src/perlscript.c:1287 #: ../src/perlscript.c:1389 ../src/perlscript.c:1409 ../src/perlscript.c:1433 #: ../src/perlscript.c:1461 ../src/perlscript.c:1470 ../src/perlscript.c:2010 #: ../src/perlscript.c:2019 ../src/perlscript.c:2198 ../src/perlscript.c:2373 #: ../src/perlscript.c:2382 ../src/perlscript.c:2661 ../src/perlscript.c:2670 #: ../src/perlscript.c:2945 ../src/perlscript.c:2999 ../src/perlscript.c:3044 #: ../src/perlscript.c:3109 ../src/perlscript.c:3120 ../src/perlscript.c:3212 #: ../src/perlscript.c:3536 ../src/kcwin.c:96 #, c-format msgid "%s: Too few arguments" msgstr "%s: Mankas argumentoj" #: ../src/perlscript.c:751 #, c-format msgid "%s: Argument must be numeric" msgstr "%s: Argumento devas esti numera" #: ../src/perlscript.c:799 ../src/perlscript.c:831 #, c-format msgid "%s: No such world" msgstr "%s: Ne ekzistas tiu mondo" #: ../src/perlscript.c:866 msgid "World saved." msgstr "Mondo konservita." #: ../src/perlscript.c:1120 ../src/perlscript.c:1135 ../src/perlscript.c:1145 #: ../src/perlscript.c:1345 ../share/kildclient.pl:1324 #, c-format, perl-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:1124 ../src/perlscript.c:1592 ../src/perlscript.c:2121 #: ../src/perlscript.c:2497 ../src/perlscript.c:2691 ../src/perlscript.c:3173 #, c-format msgid "%s: Wrong argument type" msgstr "%s: Invalida speco de argumento" #: ../src/perlscript.c:1355 ../src/perlscript.c:1361 #, c-format msgid "Protocol %s not enabled." msgstr "Protokolo %s ne estas ebligata." #: ../src/perlscript.c:1366 ../share/kildclient.pl:1166 msgid "Unknown protocol" msgstr "Malkonata protokolo." #: ../src/perlscript.c:1484 ../src/perlscript.c:1752 ../share/kildclient.pl:881 msgid "No such trigger" msgstr "Ne ekzistas tiu trigger" #: ../src/perlscript.c:1502 ../src/perlscript.c:2051 ../src/perlscript.c:2426 #: ../src/perlscript.c:3132 #, c-format msgid "%s: Too many string arguments" msgstr "%s: Troaj ĉenaj argumentoj" #: ../src/perlscript.c:1525 ../src/perlscript.c:2074 #, 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:1537 ../src/perlscript.c:2475 ../src/perlscript.c:3152 #, 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:1583 ../src/perlscript.c:2112 ../src/perlscript.c:2488 #: ../src/perlscript.c:3165 #, c-format msgid "%s: Wrong type of reference" msgstr "%s: Invalida speco de referenco" #: ../src/perlscript.c:1603 #, c-format msgid "%s: Pattern not specified, not creating" msgstr "%s: Ŝablono ne informita, ne kreita" #: ../src/perlscript.c:1612 #, 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:1641 msgid "Trigger added." msgstr "Trigger adiciita." #: ../src/perlscript.c:1646 msgid "Trigger modified." msgstr "Triger ŝanĝita." #: ../src/perlscript.c:1671 #, c-format msgid "%s: Invalid target" msgstr "%s: Invalida 'target'" #: ../src/perlscript.c:1681 #, c-format msgid "%s: Invalid fg color" msgstr "%s: Invalida 'fg'" #: ../src/perlscript.c:1691 #, c-format msgid "%s: Invalid bg color" msgstr "%s: Invalida 'bg'" #: ../src/perlscript.c:1701 #, c-format msgid "%s: Invalid underline style" msgstr "%s: Invalida substrektstilo" #: ../src/perlscript.c:1757 #, 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:1781 #, 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:2033 ../src/perlscript.c:2259 ../share/kildclient.pl:882 msgid "No such alias" msgstr "Ne ekzistas tiu alias." #: ../src/perlscript.c:2086 #, 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:2132 msgid "alias: Not creating alias without pattern" msgstr "alias: Ne kreita alias sen ŝablono" #: ../src/perlscript.c:2140 msgid "alias: Not creating alias without substitution" msgstr "alias: Ne kreita alias sen anstataŭo" #: ../src/perlscript.c:2168 msgid "Alias added." msgstr "Alias adiciita" #: ../src/perlscript.c:2173 msgid "Alias modified." msgstr "Alias ŝanĝita." #: ../src/perlscript.c:2264 #, 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:2344 msgid "Press a key to get its keycode." msgstr "Prenu klavo por scii sian klavkodo." #: ../src/perlscript.c:2396 ../src/perlscript.c:2570 ../share/kildclient.pl:883 msgid "No such macro" msgstr "Ne ekzistas tiu macro." #: ../src/perlscript.c:2415 ../src/perlscript.c:2463 #, c-format msgid "%s: Invalid key code" msgstr "%s: Invalida klavkodo" #: ../src/perlscript.c:2452 #, 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:2508 #, c-format msgid "%s: Keycode not specified, not creating" msgstr "%s: Klavkodo ne informita, ne kreita" #: ../src/perlscript.c:2515 ../src/perlscript.c:2782 #, c-format msgid "%s: Action not specified, not creating" msgstr "%s: Agado ne informita, ne kreita" #: ../src/perlscript.c:2534 msgid "Macro added." msgstr "Macro adiciita." #: ../src/perlscript.c:2539 msgid "Macro modified." msgstr "Macro ŝanĝita." #: ../src/perlscript.c:2576 #, 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:2685 ../src/perlscript.c:2857 ../share/kildclient.pl:884 msgid "No such timer" msgstr "Ne ekzistas tiu timer." #: ../src/perlscript.c:2710 #, c-format msgid "%s: Interval must be numeric" msgstr "%s: Intervalo devas esti numera" #: ../src/perlscript.c:2723 #, c-format msgid "%s: Count must be numeric" msgstr "%s: Nombro devas esti numera" #: ../src/perlscript.c:2754 #, c-format msgid "%s: Interval not specified, not creating" msgstr "%s: Intervalo ne informita, ne kreita" #: ../src/perlscript.c:2761 #, c-format msgid "%s: Cannot create timer with negative interval" msgstr "%s: Invervalo devas esti pozitiva" #: ../src/perlscript.c:2822 msgid "Timer added." msgstr "Timer adiciita." #: ../src/perlscript.c:2827 msgid "Timer modified." msgstr "Timer ŝanĝita." #: ../src/perlscript.c:2862 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %.3f\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" "Timer numero %d\n" " Nomo: %s\n" " Intervalo: %.3f\\n\n" " Nombro de fojoj: %d\n" " Ago: %s\n" " Ebligata: %s\n" " Nedaŭra: %s\n" #: ../src/perlscript.c:2953 #, 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:2962 #, c-format msgid "%s: %s is already permanent" msgstr "%s: %s jam estas daŭra" #: ../src/perlscript.c:2976 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "%s: Variablo '%s' iĝis daŭra.\n" #: ../src/perlscript.c:3018 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "%s: Variablo '%s' iĝis maldaŭra.\n" #: ../src/perlscript.c:3022 #, c-format msgid "%s: %s is not permanent" msgstr "%s: %s ne estas daŭra" #: ../src/perlscript.c:3075 msgid "Permanent variables" msgstr "Daŭraj variabloj" #: ../src/perlscript.c:3187 msgid "Hook defined." msgstr "Hoko difinita." #: ../src/perlscript.c:3191 msgid "Hook modified." msgstr "Hoko ŝanĝita." #: ../src/perlscript.c:3296 msgid "Logging stopped." msgstr "Registrado haltigita." #: ../src/perlscript.c:3428 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "" #: ../src/perlscript.c:3471 msgid "No such plugin" msgstr "Ne ekzistas tiu plugin." #: ../src/perlscript.c:3476 #, 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.ui:48 msgid "Edit timer" msgstr "Redakti timer" #: ../src/kildclient.ui:107 ../src/kildclient.ui:385 ../src/kildclient.ui:602 #: ../src/kildclient.ui:747 ../src/kildclient.ui:908 ../src/kildclient.ui:1112 #: ../src/dlgEditWorld.ui:229 ../src/dlgEditWorld.ui:2855 msgid "_Name:" msgstr "_Nomo:" #: ../src/kildclient.ui:120 msgid "Enter optionally a descriptive name for the timer" msgstr "Informu, se vi volas, priskriban nomon por la timer" #: ../src/kildclient.ui:132 msgid "_Interval:" msgstr "_Intervalo:" #: ../src/kildclient.ui:149 msgid "Specify the interval, in seconds, between timer activations" msgstr "Informu la intervalon, en sekundoj, inter aktivadoj de ĉi tiu timer" #: ../src/kildclient.ui:165 msgid "seconds" msgstr "sekundoj" #: ../src/kildclient.ui:183 msgid "_Repeat count:" msgstr "Nombro de _fojoj:" #: ../src/kildclient.ui:200 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 aŭ " "forigita" #: ../src/kildclient.ui:215 msgid "(-1 to repeat indefinitely)" msgstr "(-1 por repeti indefine)" #: ../src/kildclient.ui:233 ../src/kildclient.ui:772 ../src/kildclient.ui:970 #: ../src/kildclient.ui:1173 msgid "_Action:" msgstr "_Ago:" #: ../src/kildclient.ui:246 msgid "Enter the action to be executed whenever the timer fires" msgstr "Informu agon kiun estos rulata kiam timer aktiviĝas" #: ../src/kildclient.ui:256 msgid "" "_Temporary (will be deleted automatically when its repeat count reaches 0)" msgstr "Ne_daŭra (estos forigita aŭtomate kiam lia nombro de fojoj atingas 0)" #: ../src/kildclient.ui:259 msgid "Check to have the timer deleted after its repeat count has reached 0" msgstr "" "Marku se vi volas que la timer estu forigita kiam la lia nombro de fojoj " "antigas 0" #: ../src/kildclient.ui:271 ../src/kildclient.ui:485 ../src/kildclient.ui:795 #: ../src/kildclient.ui:993 ../src/kildclient.ui:1297 msgid "_Enabled" msgstr "_Ebligata" #: ../src/kildclient.ui:274 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.ui:287 ../src/kildclient.ui:501 ../src/kildclient.ui:811 #: ../src/kildclient.ui:1009 ../src/kildclient.ui:1313 msgid "Note:" msgstr "Notu:" #: ../src/kildclient.ui:299 ../src/kildclient.ui:513 ../src/kildclient.ui:823 #: ../src/kildclient.ui:1021 ../src/kildclient.ui:1325 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.ui:326 msgid "Edit alias" msgstr "Redakti alias" #: ../src/kildclient.ui:398 msgid "Enter optionally a descriptive name for the alias" msgstr "Informu, se vi volas, priskriban nomon por la alias" #: ../src/kildclient.ui:410 ../src/kildclient.ui:1136 msgid "_Pattern:" msgstr "Ŝa_blono:" #: ../src/kildclient.ui:423 msgid "Enter the pattern to match against typed commands" msgstr "Informu la ŝablono por provi kongrui kun tajpataj komandoj" #: ../src/kildclient.ui:433 ../src/kildclient.ui:1159 msgid "_Ignore case when matching" msgstr "_Ignori usklecon" #: ../src/kildclient.ui:447 msgid "_Substitution:" msgstr "_Anstataŭo:" #: ../src/kildclient.ui:460 msgid "Enter the substitution to be executed" msgstr "Informu anstataŭon por ruli" #: ../src/kildclient.ui:470 msgid "E_val substitution as Perl statement" msgstr "_Komputi anstataŭon kiel Perl komando" #: ../src/kildclient.ui:473 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.ui:488 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.ui:543 msgid "Edit character information" msgstr "Redakti informon de rolulo" #: ../src/kildclient.ui:615 msgid "Enter the character's name for automatic login" msgstr "Informu la nomon de la rolulo por automata saluto" #: ../src/kildclient.ui:627 msgid "_Password:" msgstr "Pas_vorto:" #: ../src/kildclient.ui:640 msgid "Enter the character's password for automatic login" msgstr "Informu la pasvorton de la rolulo por automata saluto" #: ../src/kildclient.ui:666 msgid "Edit hook" msgstr "Redakti hoko" #: ../src/kildclient.ui:725 msgid "Event:" msgstr "Evento:" #: ../src/kildclient.ui:760 msgid "Enter optionally a descriptive name for the hook" msgstr "Informu, se vi volas, priskriban nomon por la hoko" #: ../src/kildclient.ui:785 msgid "Enter the action to be run when the event happens" msgstr "Informu agon kiun estos rulata kiam evento okazos" #: ../src/kildclient.ui:798 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.ui:850 msgid "Edit macro" msgstr "Redakti macro" #: ../src/kildclient.ui:921 msgid "Enter optionally a descriptive name for the macro" msgstr "Informu, se vi volas, priskriban nomon por la macro" #: ../src/kildclient.ui:933 msgid "_Key:" msgstr "_Klavo:" #: ../src/kildclient.ui:946 msgid "Press the key that will be used to run the macro" msgstr "Tajpu klavon kiu estos usata por ruli la macron" #: ../src/kildclient.ui:958 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.ui:983 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.ui:996 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.ui:1050 ../src/kildclient.ui:1927 msgid "Enter optionally a descriptive name for the trigger" msgstr "Informu, se vi volas, priskriban nomon por la trigger" #: ../src/kildclient.ui:1052 msgid "Edit trigger" msgstr "Redakti trigger" #: ../src/kildclient.ui:1149 msgid "Enter the pattern to match against received lines" msgstr "Informu ŝablonon por provi kongrui kun ricevataj linioj" #: ../src/kildclient.ui:1186 msgid "Enter the action that will be run when a match happens" msgstr "Informu agon kiun estos rulata kiam linioj kongruas ŝablonon" #: ../src/kildclient.ui:1196 msgid "Omit (_gag) from output" msgstr "Ne montri (_gag) en ĉeffenestro" #: ../src/kildclient.ui:1199 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.ui:1211 msgid "Omit (gag) from _log file" msgstr "Ne skri_bi (gag) en registraddosiero" #: ../src/kildclient.ui:1214 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.ui:1226 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.ui:1229 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.ui:1241 msgid "_Rewriter trigger" msgstr "Res_kribista trigger" #: ../src/kildclient.ui:1244 msgid "Check to make this trigger a rewriter trigger" msgstr "Marku por ke la trigger estu reskribista trigger" #: ../src/kildclient.ui:1260 msgid "C_hange style" msgstr "Ŝanĝi s_tilon" #: ../src/kildclient.ui:1275 msgid "C_onfigure..." msgstr "Kon_figuri..." #: ../src/kildclient.ui:1300 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.ui:1355 msgid "Permenent variable" msgstr "Daŭra variablo" #: ../src/kildclient.ui:1411 msgid "_Name of variable to make permanent:" msgstr "_Nomo de variablo por iĝi daŭra:" #: ../src/kildclient.ui:1425 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.ui:1467 msgid "_Triggers" msgstr "_Triggers" #: ../src/kildclient.ui:1480 msgid "_Aliases" msgstr "_Aliases" #: ../src/kildclient.ui:1493 msgid "_Macros" msgstr "_Macros" #: ../src/kildclient.ui:1506 msgid "T_imers" msgstr "T_imers" #: ../src/kildclient.ui:1519 msgid "_Permanent variables" msgstr "Daŭraj varia_bloj" #: ../src/kildclient.ui:1532 msgid "OnCo_nnect hooks" msgstr "OnCo_nnect hokoj" #: ../src/kildclient.ui:1545 msgid "On_Disconnect hooks" msgstr "On_Disconnect hokoj" #: ../src/kildclient.ui:1558 msgid "On_ReceivedText hooks" msgstr "On_ReceivedText hokoj" #: ../src/kildclient.ui:1571 msgid "On_SentCommand hooks" msgstr "On_SentCommand hokoj" #: ../src/kildclient.ui:1584 msgid "On_GetFocus hooks" msgstr "On_GetFocus hokoj" #: ../src/kildclient.ui:1597 msgid "On_LoseFocus hooks" msgstr "On_LoseFocus hokoj" #: ../src/kildclient.ui:1610 msgid "OnClos_eConnected hooks" msgstr "OnClos_eConnected hokoj" #: ../src/kildclient.ui:1623 msgid "OnSer_verData hooks" msgstr "OnSer_verData hokoj" #: ../src/kildclient.ui:1648 msgid "Items to e_xport" msgstr "Eroj por e_ksporti" #: ../src/kildclient.ui:1709 ../src/dlgSelectWorld.ui:125 #: ../src/dlgEditWorld.ui:604 msgid "_New" msgstr "_Nova" #: ../src/kildclient.ui:1722 ../src/wndmain.ui:158 ../src/dlgSelectWorld.ui:138 #: ../src/dlgEditWorld.ui:619 msgid "_Edit" msgstr "R_edakti" #: ../src/kildclient.ui:1750 msgid "_Import" msgstr "_Importi" #: ../src/kildclient.ui:1763 msgid "E_xport" msgstr "E_ksporti" #: ../src/kildclient.ui:1777 ../src/dlgEditWorld.ui:649 #: ../src/dlgEditWorld.ui:3305 msgid "_Up" msgstr "_Supren" #: ../src/kildclient.ui:1791 ../src/dlgEditWorld.ui:664 #: ../src/dlgEditWorld.ui:3320 msgid "Do_wn" msgstr "_Malsupren" #: ../src/kildclient.ui:1830 ../src/kildclient.ui:1895 #: ../src/kildclient.ui:1915 msgid "Do not change" msgstr "Ne ŝanĝi" #: ../src/kildclient.ui:1833 ../src/dlgPreferences.ui:42 msgid "Black" msgstr "Nigra" #: ../src/kildclient.ui:1836 ../src/dlgPreferences.ui:45 msgid "Red" msgstr "Ruĝa" #: ../src/kildclient.ui:1839 ../src/dlgPreferences.ui:48 msgid "Green" msgstr "Verda" #: ../src/kildclient.ui:1842 ../src/dlgPreferences.ui:51 msgid "Yellow" msgstr "Flava" #: ../src/kildclient.ui:1845 ../src/dlgPreferences.ui:54 msgid "Blue" msgstr "Blua" #: ../src/kildclient.ui:1848 ../src/dlgPreferences.ui:57 msgid "Magenta" msgstr "Malva" #: ../src/kildclient.ui:1851 ../src/dlgPreferences.ui:60 msgid "Cyan" msgstr "Cejana" #: ../src/kildclient.ui:1854 ../src/dlgPreferences.ui:63 msgid "White" msgstr "Blanka" #: ../src/kildclient.ui:1857 ../src/dlgPreferences.ui:66 msgid "Default" msgstr "Defaŭta" #: ../src/kildclient.ui:1860 ../src/dlgPreferences.ui:69 msgid "Black (bold)" msgstr "Nigra (grasa)" #: ../src/kildclient.ui:1863 ../src/dlgPreferences.ui:72 msgid "Red (bold)" msgstr "Ruĝa (grasa)" #: ../src/kildclient.ui:1866 ../src/dlgPreferences.ui:75 msgid "Green (bold)" msgstr "Verda (grasa)" #: ../src/kildclient.ui:1869 ../src/dlgPreferences.ui:78 msgid "Yellow (bold)" msgstr "Flava (grasa)" #: ../src/kildclient.ui:1872 ../src/dlgPreferences.ui:81 msgid "Blue (bold)" msgstr "Blua (grasa)" #: ../src/kildclient.ui:1875 ../src/dlgPreferences.ui:84 msgid "Magenta (bold)" msgstr "Malva (grasa)" #: ../src/kildclient.ui:1878 ../src/dlgPreferences.ui:87 msgid "Cyan (bold)" msgstr "Cejana (grasa)" #: ../src/kildclient.ui:1881 ../src/dlgPreferences.ui:90 msgid "White (bold)" msgstr "Blanka (grasa)" #: ../src/kildclient.ui:1884 ../src/dlgPreferences.ui:93 msgid "Default (bold)" msgstr "Defaŭlta (grasa)" #: ../src/kildclient.ui:1901 msgid "Single" msgstr "Unuobla" #: ../src/kildclient.ui:1904 msgid "Double" msgstr "Duobla" #: ../src/kildclient.ui:1929 msgid "Change style" msgstr "Ŝanĝi stilon" #: ../src/kildclient.ui:1987 msgid "Apply to:" msgstr "Apliki al:" #: ../src/kildclient.ui:1998 msgid "_Foreground:" msgstr "_Malfono:" #: ../src/kildclient.ui:2026 msgid "_Background:" msgstr "_Fono:" #: ../src/kildclient.ui:2054 msgid "_Italic:" msgstr "_Kursivo:" #: ../src/kildclient.ui:2082 msgid "_Striked-thru:" msgstr "Tr_astrekto:" #: ../src/kildclient.ui:2110 msgid "_Underline:" msgstr "_Substrekto:" #: ../src/kildclient.ui:2141 msgid "The whole _line" msgstr "La tutan _linion" #: ../src/kildclient.ui:2155 msgid "The whole matched _text" msgstr "La tutan kongruitan _tekston" #: ../src/kildclient.ui:2174 msgid "The _matched substring number" msgstr "La _parton numero" #: ../src/wndmain.ui:40 msgid "_World" msgstr "_Mondo" #: ../src/wndmain.ui:49 msgid "_Open..." msgstr "_Malfermi..." #: ../src/wndmain.ui:66 msgid "_Disconnect" msgstr "Mal_konekti" #: ../src/wndmain.ui:74 msgid "Connect to _another..." msgstr "Konekti al _alia mondo..." #: ../src/wndmain.ui:95 msgid "_Edit..." msgstr "R_edakti..." #: ../src/wndmain.ui:112 msgid "S_tatistics..." msgstr "S_tatistikoj..." #: ../src/wndmain.ui:125 ../src/wndmain.ui:245 msgid "_Previous" msgstr "_Antaŭa" #: ../src/wndmain.ui:133 ../src/wndmain.ui:254 msgid "_Next" msgstr "_Proksima" #: ../src/wndmain.ui:167 msgid "Cu_t" msgstr "El_tondi" #: ../src/wndmain.ui:176 msgid "_Copy" msgstr "_Kopii" #: ../src/wndmain.ui:185 msgid "_Paste" msgstr "_Enmeti" #: ../src/wndmain.ui:207 ../src/dlgCmdHistory.ui:178 msgid "_Find" msgstr "_Trovi" #: ../src/wndmain.ui:229 msgid "_Input" msgstr "_Enigo" #: ../src/wndmain.ui:237 ../src/dlgEditWorld.ui:3101 ../src/dlgMLSend.ui:157 msgid "C_lear" msgstr "P_urigi" #: ../src/wndmain.ui:263 msgid "Find p_revious" msgstr "Trovi a_ntaŭa" #: ../src/wndmain.ui:281 msgid "Command _history..." msgstr "Komand_historio..." #: ../src/wndmain.ui:295 msgid "_Multi-line send..." msgstr "_Sendi plurajn liniojn..." #: ../src/wndmain.ui:309 msgid "_Test triggers..." msgstr "_Testi trigger-jn..." #: ../src/wndmain.ui:321 msgid "_Preferences" msgstr "_Preferoj" #: ../src/wndmain.ui:330 msgid "Disable _triggers" msgstr "Malebligi _triggers" #: ../src/wndmain.ui:339 msgid "Disable _aliases" msgstr "Malebligi _aliases" #: ../src/wndmain.ui:348 msgid "Disable _macros" msgstr "Malebligi _macros" #: ../src/wndmain.ui:357 msgid "Disable t_imers" msgstr "Malebligi t_imers" #: ../src/wndmain.ui:371 msgid "_Debug matches" msgstr "" #: ../src/wndmain.ui:384 msgid "_Preferences..." msgstr "_Preferoj..." #: ../src/wndmain.ui:392 msgid "Edit default _world..." msgstr "Redakti defaŭltan _mondon..." #: ../src/wndmain.ui:404 msgid "_Display" msgstr "_Apero" #: ../src/wndmain.ui:413 msgid "_Split window" msgstr "Dividi fene_stron" #: ../src/wndmain.ui:426 ../src/dlgEditWorld.ui:3198 msgid "_Help" msgstr "_Helpo" #: ../src/wndmain.ui:434 msgid "_Manual" msgstr "_Manlibro" #: ../src/wndmain.ui:443 msgid "_About" msgstr "_Koncerne" #: ../src/dlgSelectWorld.ui:27 msgid "Connect to" msgstr "Konekti al" #: ../src/dlgSelectWorld.ui:56 msgid "C_onnect" msgstr "_Konekti" #: ../src/dlgSelectWorld.ui:78 msgid "_Select a saved world:" msgstr "Elektu konservitan _mondon:" #: ../src/dlgSelectWorld.ui:183 msgid "Or connect d_irectly:" msgstr "Aŭ konektu rek_te:" #: ../src/dlgSelectWorld.ui:206 ../src/dlgEditWorld.ui:242 msgid "_Host:" msgstr "R_etnodo:" #: ../src/dlgSelectWorld.ui:219 ../src/dlgEditWorld.ui:255 msgid "_Port:" msgstr "_Pordo:" #: ../src/dlgPreferences.ui:104 ../src/dlgEditWorld.ui:101 msgid "No proxy" msgstr "Sen prokurservilo" #: ../src/dlgPreferences.ui:107 ../src/dlgEditWorld.ui:104 msgid "SOCKS4" msgstr "SOCKS4" #: ../src/dlgPreferences.ui:110 ../src/dlgEditWorld.ui:107 msgid "SOCKS5" msgstr "SOCKS5" #: ../src/dlgPreferences.ui:113 ../src/dlgEditWorld.ui:110 msgid "HTTP" msgstr "HTTP" #: ../src/dlgPreferences.ui:124 msgid "Left" msgstr "Maldesktre" #: ../src/dlgPreferences.ui:127 msgid "Right" msgstr "Dekstre" #: ../src/dlgPreferences.ui:130 msgid "Top" msgstr "Supre" #: ../src/dlgPreferences.ui:133 msgid "Bottom" msgstr "Malsupre" #: ../src/dlgPreferences.ui:140 msgid "Preferences" msgstr "Preferoj" #: ../src/dlgPreferences.ui:188 msgid "Colors used by KildClient" msgstr "Koloroj uzataj de KildClient" #: ../src/dlgPreferences.ui:208 msgid "_Informative messages:" msgstr "_Informaj mesaĝoj:" #: ../src/dlgPreferences.ui:239 msgid "Command _echo:" msgstr "Eĥo de _komandoj:" #: ../src/dlgPreferences.ui:278 msgid "Window configuration" msgstr "Konfiguro de la fenestro" #: ../src/dlgPreferences.ui:298 msgid "_Tab position:" msgstr "_Pozicio de la langetoj:" #: ../src/dlgPreferences.ui:329 msgid "_Hide tabs if only one world is open" msgstr "K_aŝi langetojn se nur unu mondo estas malferma" #: ../src/dlgPreferences.ui:333 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.ui:346 msgid "_Flash window when new text is received" msgstr "_Ekbrili fenestron kiam nova teksto alvenas" #: ../src/dlgPreferences.ui:371 msgid "Appearance" msgstr "Apero" #: ../src/dlgPreferences.ui:386 msgid "Sending delays" msgstr "Malfruigo inter sendadoj" #: ../src/dlgPreferences.ui:406 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.ui:422 msgid "_Number of lines/commands to send at once:" msgstr "_Nombro de linioj/komandoj por sendi samtempe:" #: ../src/dlgPreferences.ui:462 msgid "_Delay between each group of lines/commands:" msgstr "_Tempo por atendi inter la sendado de ĉiu grupo de linioj/komandoj:" #: ../src/dlgPreferences.ui:510 msgid "Sending" msgstr "Sendado" #: ../src/dlgPreferences.ui:527 msgid "Audio player" msgstr "Audludilo" #: ../src/dlgPreferences.ui:547 #, c-format 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.ui:562 msgid "Specify the command used to play sound files." msgstr "Informu komandon por ludi auddosierojn." #: ../src/dlgPreferences.ui:587 msgid "External programs" msgstr "Eksteraj programoj" #: ../src/dlgPreferences.ui:603 ../src/dlgEditWorld.ui:331 msgid "Proxy" msgstr "Prokurservilo" #: ../src/dlgPreferences.ui:627 ../src/dlgEditWorld.ui:355 msgid "Proxy _type:" msgstr "_Tipo de prokurservilo:" #: ../src/dlgPreferences.ui:669 ../src/dlgEditWorld.ui:397 msgid "Server _address:" msgstr "Servil_adreso:" #: ../src/dlgPreferences.ui:682 ../src/dlgEditWorld.ui:453 msgid "_Username:" msgstr "Salut_nomo:" #: ../src/dlgPreferences.ui:715 ../src/dlgEditWorld.ui:420 msgid "Server _port:" msgstr "Servil_pordo:" #: ../src/dlgPreferences.ui:728 ../src/dlgEditWorld.ui:466 msgid "Pass_word:" msgstr "Pas_vorto:" #: ../src/dlgPreferences.ui:781 msgid "Proxy" msgstr "Prokurservilo" #: ../src/dlgStatistics.ui:27 msgid "Statistics" msgstr "Statistikoj" #: ../src/dlgStatistics.ui:70 ../src/dlgStatistics.ui:81 #: ../src/dlgStatistics.ui:223 ../src/dlgStatistics.ui:338 #: ../src/dlgStatistics.ui:445 ../src/dlgStatistics.ui:456 #: ../src/dlgStatistics.ui:467 ../src/dlgStatistics.ui:478 #: ../src/dlgStatistics.ui:489 ../src/dlgStatistics.ui:511 #: ../src/dlgStatistics.ui:544 ../src/dlgStatistics.ui:555 #: ../src/dlgStatistics.ui:577 ../src/dlgStatistics.ui:610 #: ../src/dlgStatistics.ui:621 msgid "N/A" msgstr "N/A" #: ../src/dlgStatistics.ui:92 msgid "Proxy port:" msgstr "Prokurservila pordo:" #: ../src/dlgStatistics.ui:103 msgid "Proxy host:" msgstr "Prokurservilo:" #: ../src/dlgStatistics.ui:125 msgid "Proxy type:" msgstr "Tipo de prokurservilo:" #: ../src/dlgStatistics.ui:136 msgid "World name:" msgstr "Nomo de la mondo:" #: ../src/dlgStatistics.ui:147 msgid "Host:" msgstr "Retnodo:" #: ../src/dlgStatistics.ui:158 msgid "Port:" msgstr "Pordo:" #: ../src/dlgStatistics.ui:169 msgid "Connection time:" msgstr "Konektadtempo:" #: ../src/dlgStatistics.ui:180 msgid "Idle time:" msgstr "Inativa tempo:" #: ../src/dlgStatistics.ui:201 msgid "Compression used:" msgstr "Kompaktigilo uzata:" #: ../src/dlgStatistics.ui:212 msgid "Bytes received (compressed):" msgstr "Riĉevitaj bajtoj (kompaktigitaj):" #: ../src/dlgStatistics.ui:234 msgid "Bytes received (decompressed):" msgstr "Riĉevitaj bajtoj (nekompaktigitaj):" #: ../src/dlgStatistics.ui:245 msgid "Compression ratio:" msgstr "Kompatigkvociento:" #: ../src/dlgStatistics.ui:256 msgid "Lines received:" msgstr "Linioj riĉevitaj:" #: ../src/dlgStatistics.ui:369 msgid "Key exchange:" msgstr "Ŝlosilointerŝanĝo:" #: ../src/dlgStatistics.ui:380 msgid "SSL protocol used:" msgstr "SSL protokolo uzata:" #: ../src/dlgStatistics.ui:391 msgid "Compression algorithm:" msgstr "Kompatigalgoritmo:" #: ../src/dlgStatistics.ui:402 msgid "Certificate type:" msgstr "Tipo de atesto:" #: ../src/dlgStatistics.ui:413 msgid "Cipher:" msgstr "Cifero:" #: ../src/dlgStatistics.ui:424 msgid "MAC:" msgstr "MAC:" #: ../src/dlgStatistics.ui:500 msgid "Hostname:" msgstr "Retnodo:" #: ../src/dlgStatistics.ui:522 msgid "Valid since:" msgstr "Valida de:" #: ../src/dlgStatistics.ui:533 msgid "Expiration:" msgstr "Finiĝas:" #: ../src/dlgStatistics.ui:566 msgid "Fingerprint:" msgstr "Fingropremaĵo:" #: ../src/dlgStatistics.ui:588 msgid "Subject's DN:" msgstr "" #: ../src/dlgStatistics.ui:599 msgid "Issuer's DN:" msgstr "" #: ../src/dlgAbout.ui:30 msgid "A mud client with powerful features and support for Perl scripting" msgstr "MUDkliento kun potencajn eblojn kaj subtenon de Perl skriptoj" #: ../src/dlgAbout.ui:32 msgid "Visit https://www.kildclient.org" msgstr "Vizitu https://www.kildclient.org" #: ../src/dlgEditWorld.ui:81 msgid "No auto-login" msgstr "Sen aŭtomata saluto" #: ../src/dlgEditWorld.ui:98 msgid "Use global settings" msgstr "Uzi defaŭltan konfiguron" #: ../src/dlgEditWorld.ui:117 msgid "Edit world" msgstr "Redakti mondon" #: ../src/dlgEditWorld.ui:207 msgid "Connection" msgstr "Konekto" #: ../src/dlgEditWorld.ui:268 msgid "Enter a descriptive name for the world" msgstr "Informu priskriban nomon por la mondo" #: ../src/dlgEditWorld.ui:281 msgid "Enter the host to connect to" msgstr "Informu la retnodon al kiu konekti" #: ../src/dlgEditWorld.ui:294 msgid "Enter the port used when connecting" msgstr "Informu la pordon por konekti" #: ../src/dlgEditWorld.ui:306 msgid "Use _SSL" msgstr "Uzi SS_L" #: ../src/dlgEditWorld.ui:505 msgid "Auto-login" msgstr "Aŭtomata saluto" #: ../src/dlgEditWorld.ui:529 msgid "Connection _style:" msgstr "Stilo de la _konekto:" #: ../src/dlgEditWorld.ui:567 msgid "Ch_aracters in this mud:" msgstr "R_oluloj en ĉi tiu mud:" #: ../src/dlgEditWorld.ui:705 ../src/dlgEditWorld.ui:1840 #: ../src/dlgEditWorld.ui:2502 msgid "Font" msgstr "Tiparo" #: ../src/dlgEditWorld.ui:725 msgid "Select the font used in the _main screen:" msgstr "_Elektu la tiparon de la ĉeffenestro:" #: ../src/dlgEditWorld.ui:741 msgid "Select the font used in the main output screen" msgstr "Elektu la tiparon de la ĉeffenestro" #: ../src/dlgEditWorld.ui:753 msgid "Use _bold font for highlighted colors (instead of just highlighting)" msgstr "Uzi _grasan tiparon por emfazitaj koloroj (anstataŭ nur emfazi)" #: ../src/dlgEditWorld.ui:757 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.ui:779 msgid "Word wrap" msgstr "Linirompado" #: ../src/dlgEditWorld.ui:798 msgid "_Wrap lines at word boundaries" msgstr "R_ompi la liniojn inter vortoj" #: ../src/dlgEditWorld.ui:802 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "Marku por rompi la liniojn inter vortoj" #: ../src/dlgEditWorld.ui:820 msgid "_Indent wrapped lines by" msgstr "Al_inei rompitajn liniojn je" #: ../src/dlgEditWorld.ui:850 msgid "pixels" msgstr "rastrumero" #: ../src/dlgEditWorld.ui:869 msgid "Wrap lines at full _screen width" msgstr "Rompi liniojn je la _tutan larĝeco de la ecrano" #: ../src/dlgEditWorld.ui:889 msgid "Maximum line width in _characters:" msgstr "Maksimuma larĝeco de linioj en _signoj:" #: ../src/dlgEditWorld.ui:937 msgid "Scrolling" msgstr "Rolumo" #: ../src/dlgEditWorld.ui:956 msgid "Sc_roll on output" msgstr "Rolumi kiam alvenas _novan tekston" #: ../src/dlgEditWorld.ui:960 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.ui:978 msgid "_Lines to save in scrollback buffer:" msgstr "_Linioj por konservi en rolumadbufro" #: ../src/dlgEditWorld.ui:991 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.ui:1022 msgid "Tooltips" msgstr "Ŝpruchelpiloj" #: ../src/dlgEditWorld.ui:1041 msgid "Display _tooltips with the time when the line was received" msgstr "_Montri ŝpruchelpilojn kun la horo en kiu la linioj estis riĉevitaj" #: ../src/dlgEditWorld.ui:1045 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.ui:1067 msgid "Name display" msgstr "Montrado de nomo" #: ../src/dlgEditWorld.ui:1086 msgid "I_dentify as 'World name'" msgstr "I_dentigi kiel 'Mondnomo'" #: ../src/dlgEditWorld.ui:1101 msgid "I_dentify as 'World name - Character'" msgstr "I_dentigi kiel 'Mondnome - Rolulo'" #: ../src/dlgEditWorld.ui:1116 msgid "I_dentify as 'Character - World name'" msgstr "I_dentigi kiel 'Rolulo - Mondnomo'" #: ../src/dlgEditWorld.ui:1135 msgid "C_ustom: " msgstr "_Alia: " #: ../src/dlgEditWorld.ui:1169 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.ui:1203 msgid "Ansi colors" msgstr "Ansi koloroj" #: ../src/dlgEditWorld.ui:1313 msgid "Blac_k" msgstr "_Nigra" #: ../src/dlgEditWorld.ui:1326 msgid "_Red" msgstr "R_uĝa" #: ../src/dlgEditWorld.ui:1339 msgid "_Green" msgstr "V_erda" #: ../src/dlgEditWorld.ui:1352 msgid "_Yellow" msgstr "Fla_va" #: ../src/dlgEditWorld.ui:1365 msgid "_Blue" msgstr "_Blua" #: ../src/dlgEditWorld.ui:1378 msgid "_Magenta" msgstr "_Malva" #: ../src/dlgEditWorld.ui:1391 msgid "Cy_an" msgstr "_Cejana" #: ../src/dlgEditWorld.ui:1404 msgid "_White" msgstr "Bl_anka" #: ../src/dlgEditWorld.ui:1417 msgid "Blac_k (bold)" msgstr "_Nigra (grasa)" #: ../src/dlgEditWorld.ui:1430 msgid "_Red (bold)" msgstr "R_uĝa (grasa)" #: ../src/dlgEditWorld.ui:1443 msgid "_Green (bold)" msgstr "V_erda (grasa)" #: ../src/dlgEditWorld.ui:1456 msgid "_Yellow (bold)" msgstr "Fla_va (grasa)" #: ../src/dlgEditWorld.ui:1469 msgid "_Blue (bold)" msgstr "_Blua (grasa)" #: ../src/dlgEditWorld.ui:1482 msgid "_Magenta (bold)" msgstr "_Malva (grasa)" #: ../src/dlgEditWorld.ui:1495 msgid "Cy_an (bold)" msgstr "_Cejana (grasa)" #: ../src/dlgEditWorld.ui:1508 msgid "_White (bold)" msgstr "Bl_anka (grasa)" #: ../src/dlgEditWorld.ui:1647 msgid "Default colors" msgstr "Defaŭtaj koloroj" #: ../src/dlgEditWorld.ui:1691 msgid "_Foreground" msgstr "Ma_lfono" #: ../src/dlgEditWorld.ui:1704 msgid "Bold _foreground" msgstr "Grasa mal_fono" #: ../src/dlgEditWorld.ui:1728 msgid "Backgroun_d" msgstr "_Fono" #: ../src/dlgEditWorld.ui:1752 msgid "Bold backgroun_d" msgstr "Grasa _fono" #: ../src/dlgEditWorld.ui:1785 msgid "Revert to default colors" msgstr "Uzi la defaŭltajn kolorojn" #: ../src/dlgEditWorld.ui:1804 msgid "Re_vert to default colors" msgstr "U_zi la defaŭltajn kolorojn" #: ../src/dlgEditWorld.ui:1808 msgid "Click to revert all colors to their built-in defaults" msgstr "Klaku por uzi la defaŭltajn kolorojn" #: ../src/dlgEditWorld.ui:1860 msgid "_Select the font used in the status bar:" msgstr "_Elektu la tiparon de la stata breto:" #: ../src/dlgEditWorld.ui:1895 msgid "Time display" msgstr "Montrado de tempo" #: ../src/dlgEditWorld.ui:1915 msgid "Co_nnected time:" msgstr "_Tempo konektata:" #: ../src/dlgEditWorld.ui:1935 ../src/dlgEditWorld.ui:2017 msgid "Do not display" msgstr "Ne montri" #: ../src/dlgEditWorld.ui:1939 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.ui:1953 ../src/dlgEditWorld.ui:2035 msgid "Display as hours, minutes and seconds" msgstr "Montri kiel horoj, minutoj kaj sekundoj" #: ../src/dlgEditWorld.ui:1957 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.ui:1971 ../src/dlgEditWorld.ui:2053 msgid "Display as seconds" msgstr "Montri kiel sekundoj" #: ../src/dlgEditWorld.ui:1975 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.ui:1998 msgid "_Idle time:" msgstr "_Inativa tempo:" #: ../src/dlgEditWorld.ui:2021 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.ui:2039 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.ui:2057 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.ui:2071 msgid "Only _reset idle time counter when a command is entered directly" msgstr "_Nur zerigi inaktivatemponombrilon kiam komando estas rekte tajpata" #: ../src/dlgEditWorld.ui:2075 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.ui:2115 msgid "Command entry" msgstr "Eniro de komandoj" #: ../src/dlgEditWorld.ui:2134 msgid "_Keep last typed command in command entry box" msgstr "Re_teni la lastan tajpitan komandon en komandskatolo" #: ../src/dlgEditWorld.ui:2138 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.ui:2150 msgid "_Echo sent commands in main window" msgstr "_Eĥi senditajn komandojn en la ĉeffenestro" #: ../src/dlgEditWorld.ui:2154 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.ui:2166 msgid "Store commands _between sessions" msgstr "_Konservi komandojn inter sesioj" #: ../src/dlgEditWorld.ui:2170 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.ui:2182 msgid "Never _hide the typed text" msgstr "_Neniam kaŝi tajpatan tekston" #: ../src/dlgEditWorld.ui:2186 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.ui:2203 msgid "_Number of commands to save in history:" msgstr "Nombro de komandoj por konservi en _historio:" #: ../src/dlgEditWorld.ui:2217 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.ui:2244 msgid "Co_mmand separator:" msgstr "Eĥo _de komandoj:" #: ../src/dlgEditWorld.ui:2257 msgid "Specify the separator for commands typed in the command entry box" msgstr "Elektu la disigilon por komandoj tajpataj en la komandskatolo" #: ../src/dlgEditWorld.ui:2278 msgid "Use single-_line input bar" msgstr "_Unulinia komandskatolo" #: ../src/dlgEditWorld.ui:2300 msgid "Enable _auto-completion" msgstr "Ebligi _aŭtomata kompletado" #: ../src/dlgEditWorld.ui:2304 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.ui:2321 msgid "Acti_vate auto-completion only after" msgstr "Akti_vigi aŭtomata kompletado nur post" #: ../src/dlgEditWorld.ui:2335 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.ui:2351 msgid "characters have been entered" msgstr "signoj estis tajpitaj" #: ../src/dlgEditWorld.ui:2375 msgid "Use mul_ti-line input bar" msgstr "_Plurlinia komandskatolo" #: ../src/dlgEditWorld.ui:2402 msgid "N_umber of lines:" msgstr "Nom_bro de linioj:" #: ../src/dlgEditWorld.ui:2437 msgid "S_pell check typed text" msgstr "_Literumi tajpatan tekston" #: ../src/dlgEditWorld.ui:2457 msgid "Lan_guage:" msgstr "Lin_gvo:" #: ../src/dlgEditWorld.ui:2522 msgid "Select the _font used in the command entry box:" msgstr "Elekt_u la tiparon de la komandskatolo:" #: ../src/dlgEditWorld.ui:2557 msgid "Flood prevention" msgstr "Evito de inundo" #: ../src/dlgEditWorld.ui:2580 msgid "_Do not allow the same command to be sent" msgstr "Ne permesi la _sama komando esti sendata" #: ../src/dlgEditWorld.ui:2584 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.ui:2598 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.ui:2614 msgid "times in a _row" msgstr "_fojoj sinsekve" #: ../src/dlgEditWorld.ui:2638 msgid "_Send this command:" msgstr "Send_i tiun komandon:" #: ../src/dlgEditWorld.ui:2651 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.ui:2690 msgid "Logging status" msgstr "Registrado" #: ../src/dlgEditWorld.ui:2727 msgid "_Start" msgstr "Ŝ_argi" #: ../src/dlgEditWorld.ui:2742 msgid "_Stop" msgstr "Fer_mi" #: ../src/dlgEditWorld.ui:2768 msgid "_Include the last" msgstr "_Skribi la lastajn" #: ../src/dlgEditWorld.ui:2772 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.ui:2785 msgid "Inform number of lines to include in the log." msgstr "Informu nombro de linioj por skribi en la en la registraddosiero." #: ../src/dlgEditWorld.ui:2801 msgid "_lines of the scrollback buffer in the log" msgstr "_linionj el la rolumadbufro en la registraddosiero" #: ../src/dlgEditWorld.ui:2829 ../src/dlgEditWorld.ui:3447 msgid "File" msgstr "Dosiero" #: ../src/dlgEditWorld.ui:2879 msgid "S_elect" msgstr "_Elekti" #: ../src/dlgEditWorld.ui:2903 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.ui:2925 msgid "Options" msgstr "Opcioj" #: ../src/dlgEditWorld.ui:2944 msgid "A_utomatically start logging when connected" msgstr "Aŭ_tomate komenci registradon post konektado." #: ../src/dlgEditWorld.ui:2949 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.ui:2961 msgid "Prefix lines with _date and/or time" msgstr "Antaŭinserti en la linioj la _daton kaj/aŭ la horon" #: ../src/dlgEditWorld.ui:2966 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.ui:2986 msgid "_Format:" msgstr "_Formo:" #: ../src/dlgEditWorld.ui:3000 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.ui:3011 msgid "_Revert to default" msgstr "_Uzi la defaŭlton" #: ../src/dlgEditWorld.ui:3053 msgid "Scripting" msgstr "Skriptdosiero" #: ../src/dlgEditWorld.ui:3078 msgid "_Perl file to load:" msgstr "_Perl dosiero por ŝarĝi:" #: ../src/dlgEditWorld.ui:3142 msgid "Plugins currently loaded" msgstr "Ŝarĝataj plugins" #: ../src/dlgEditWorld.ui:3183 msgid "_Load" msgstr "Ŝarĝ_i" #: ../src/dlgEditWorld.ui:3230 msgid "Plugins loaded on startup" msgstr "Plugins ŝarĝataj ĉe la startigo" #: ../src/dlgEditWorld.ui:3275 msgid "_Add" msgstr "_Aldoni" #: ../src/dlgEditWorld.ui:3363 msgid "MCCP (for compression)" msgstr "MCCP (por kompaktigo)" #: ../src/dlgEditWorld.ui:3382 msgid "_Enable if server proposes after connecting" msgstr "_Ebligi se la servilo proponas post konekto" #: ../src/dlgEditWorld.ui:3397 msgid "Enable if server proposes at _any time" msgstr "E_bligi se la servilo proponas ĉiam" #: ../src/dlgEditWorld.ui:3412 msgid "_Disable" msgstr "_Malebligi" #: ../src/dlgEditWorld.ui:3471 msgid "_File:" msgstr "_Dosiero:" #: ../src/dlgEditWorld.ui:3506 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.ui:3528 msgid "Character set" msgstr "Signaro" #: ../src/dlgEditWorld.ui:3552 msgid "C_haracter set:" msgstr "_Signaro:" #: ../src/dlgEditWorld.ui:3591 msgid "Graphical editors" msgstr "Grafikaj redaktiloj" #: ../src/dlgEditWorld.ui:3610 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "_Peti konfirmon antaŭ forigo de triggers, aliases, ktp." #: ../src/dlgEditWorld.ui:3614 ../src/dlgEditWorld.ui:3676 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.ui:3627 msgid "_Show items defined by plugins" msgstr "_Montri objektojn difinitaj de plugins" #: ../src/dlgEditWorld.ui:3631 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.ui:3653 msgid "TCP keep alive" msgstr "" #: ../src/dlgEditWorld.ui:3672 msgid "Enable TCP _keep alive packets" msgstr "" #: ../src/dlgEditWorld.ui:3689 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.ui:3709 msgid "Input" msgstr "Enigo" #: ../src/dlgEditWorld.ui:3728 msgid "_Disable up and down arrow keys for history navigation" msgstr "M_alakativi savoklavojn por navigi komandhistorion" #: ../src/dlgEditWorld.ui:3732 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/dlgEditWorld.ui:3749 msgid "Character to run _Perl commands:" msgstr "Signo por ruli _Perl-ajn komandojn:" #: ../src/dlgEditWorld.ui:3785 msgid "" "Warning: Changing the character to run Perl commands from the default '/' is " "not recommended, because doing so might prevent plugins or other code from " "working, if they use '/' to run Perl commands." msgstr "" "Averto: Ne estas rekomendata ŝanĝi la defaŭtan signon '/', ĉar plugins " "kaj altraj kodoj povas ĉesi funkcii se ili uzas '/' por ruli Perl-ajn " "komandojn." #: ../src/dlgTestTriggers.ui:27 msgid "Test triggers" msgstr "Testi trigger-jn" #: ../src/dlgTestTriggers.ui:70 msgid "Enter _line to be matched against the triggers:" msgstr "Informu _linion por provi kongrui kon la trigger-j:" #: ../src/dlgTestTriggers.ui:88 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.ui:99 ../src/dlgMLSend.ui:69 #: ../src/dlgCmdHistory.ui:91 msgid "_Send" msgstr "_Sendi" #: ../src/dlgTestTriggers.ui:103 msgid "Click the run the triggers against the line." msgstr "Klaku por provi kongrui triggers kun la linio." #: ../src/dlgTestTriggers.ui:138 msgid "Number of triggers that matched:" msgstr "Nombro de triggers kiu kongrui:" #: ../src/dlgTestTriggers.ui:166 msgid "Commands that would be sent:" msgstr "Komandoj kiu estus sendota:" #: ../src/dlgTestTriggers.ui:196 msgid "This is what would be printed in the main screen:" msgstr "Ĉi tiu estus montrata en la ĉeffenestro:" #: ../src/dlgTestTriggers.ui:208 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.ui:224 msgid "Would this line be included in the log file?" msgstr "Ĉu tiu linio estus skribata en la registraddosiero?" #: ../src/dlgMLSend.ui:39 msgid "Multi-line send" msgstr "Sendi plurajn liniojn" #: ../src/dlgMLSend.ui:95 msgid "Send this text _initially:" msgstr "Sendi tiun tekson _iniciale:" #: ../src/dlgMLSend.ui:115 ../src/dlgMLSend.ui:199 msgid "Enter some text to be sent to the World" msgstr "Tajpu tekston por sendi al la Mondo" #: ../src/dlgMLSend.ui:128 msgid "Then send the c_ontents of this file:" msgstr "Post tio sendi la enhavon de tiu _dosiero:" #: ../src/dlgMLSend.ui:179 msgid "_Finally, send this text:" msgstr "_Fine, sendi tiun tekston:" #: ../src/dlgMLSend.ui:222 msgid "Add this to the _beginning of each line:" msgstr "Aldoni tion al la _komenco de ĉiu linio:" #: ../src/dlgMLSend.ui:238 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.ui:250 msgid "Add this to the _end of each line:" msgstr "Aldoni tion al la fi_no de ĉiu linio:" #: ../src/dlgMLSend.ui:266 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.ui:282 ../src/dlgCmdHistory.ui:253 msgid "_Delay" msgstr "_Atendi" #: ../src/dlgMLSend.ui:295 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.ui:310 ../src/dlgCmdHistory.ui:282 msgid "seconds e_ach" msgstr "s_ekundoj ĉiu" #: ../src/dlgMLSend.ui:323 msgid "Specify how many lines are sent at once" msgstr "Informu kiom da linioj estas sendata samtempe" #: ../src/dlgMLSend.ui:337 msgid "line(s)" msgstr "linio(j)" #: ../src/dlgMLSend.ui:355 msgid "_Keep dialog open after sending" msgstr "_Teni fenestro malferma post sendi" #: ../src/dlgCmdHistory.ui:39 msgid "Command history" msgstr "Komandhistorio" #: ../src/dlgCmdHistory.ui:56 msgid "_Recall" msgstr "" #: ../src/dlgCmdHistory.ui:61 msgid "Put the selected command in the command entry box" msgstr "Meti la selektatan komandon en komandskatolo" #: ../src/dlgCmdHistory.ui:74 msgid "Reca_ll and close" msgstr "" #: ../src/dlgCmdHistory.ui:79 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.ui:96 msgid "Send the selected command(s) to the mud" msgstr "Sendi la selektata(j)n komando(j)n al al mud" #: ../src/dlgCmdHistory.ui:108 msgid "Se_nd and close" msgstr "Se_ndi & fermi" #: ../src/dlgCmdHistory.ui:113 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.ui:183 msgid "Find a command containing a given search term" msgstr "Trovi komandon enhavantan specifikatan tekson." #: ../src/dlgCmdHistory.ui:200 msgid "Find the next command with the same match text" msgstr "Trovi la proksiman komandon enhavantan la saman tekson." #: ../src/dlgCmdHistory.ui:227 msgid "Newest commands are on the top" msgstr "Plej novaj komandoj estas supre" #: ../src/dlgCmdHistory.ui:266 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.ui:295 msgid "Specify how many commands are sent at once" msgstr "Informu kiom da komandoj estas sendata samtempe" #: ../src/dlgCmdHistory.ui:311 msgid "commands(s)" msgstr "komando(j)" #: ../src/dlgCmdHistory.ui:335 msgid "Find command" msgstr "Trovi komandon" #: ../src/dlgCmdHistory.ui:390 msgid "_Text to find:" msgstr "_Teksto por trovi:" #: ../src/dlgCmdHistory.ui:404 msgid "Enter the text to search for" msgstr "Informu la tekson por trovi" #: ../src/dlgCmdHistory.ui:421 msgid "Search direction:" msgstr "Direkto de serĉado:" #: ../src/dlgCmdHistory.ui:437 msgid "_Downwards" msgstr "_Malsupren" #: ../src/dlgCmdHistory.ui:452 msgid "_Upwards" msgstr "_Supren" #: ../src/mnuPopupURL.ui:29 msgid "_Open link" msgstr "_Malfermi ligilon" #: ../src/mnuPopupURL.ui:37 msgid "_Copy link address" msgstr "_Kopii ligiladreson" #: ../share/kildclient.pl:75 ../share/kildclient.pl:96 #: ../share/kildclient.pl:116 ../share/kildclient.pl:181 #: ../share/kildclient.pl:393 ../share/kildclient.pl:493 #: ../share/kildclient.pl:571 ../share/kildclient.pl:584 #: ../share/kildclient.pl:597 ../share/kildclient.pl:610 #: ../share/kildclient.pl:623 ../share/kildclient.pl:636 #: ../share/kildclient.pl:649 ../share/kildclient.pl:662 #: ../share/kildclient.pl:676 ../share/kildclient.pl:690 #: ../share/kildclient.pl:800 ../share/kildclient.pl:812 #: ../share/kildclient.pl:824 ../share/kildclient.pl:836 #: ../share/kildclient.pl:849 ../share/kildclient.pl:1098 #: ../share/kildclient.pl:1131 #, perl-format msgid "%s: Too few arguments." msgstr "%s: Mankas argumentoj." #: ../share/kildclient.pl:297 ../share/kildclient.pl:315 #: ../share/kildclient.pl:333 ../share/kildclient.pl:351 #: ../share/kildclient.pl:369 #, perl-format msgid "%s: Wrong number of arguments." msgstr "%s: Malĝusta nombro de argumentoj." #: ../share/kildclient.pl:488 msgid "Successfully moved." msgstr "Sukcese movis." #: ../share/kildclient.pl:871 #, perl-format msgid "One %1$s deleted" msgid_plural "%2$d %1$s deleted" msgstr[0] "Unu %s forigita" msgstr[1] "%2$d %1$s forigitaj" #: ../share/kildclient.pl:913 msgid "Could not open file." msgstr "Ne eblas malfermi dosieron." #: ../share/kildclient.pl:943 msgid "Unknown" msgstr "Ne konata" #: ../share/kildclient.pl:950 msgid "Invalid plugin file." msgstr "Plugindosiero ne valida." #: ../share/kildclient.pl:981 msgid "Plugin already loaded. Try enabling it." msgstr "Plugin jam ŝarĝita. Provu ebligi ĝin." #: ../share/kildclient.pl:983 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "Eldono %s de tiu plugin jam estas ŝarĝita." #: ../share/kildclient.pl:993 #, perl-format msgid "Error in plugin file: %s" msgstr "Eraro en plugindosiero: %s" #: ../share/kildclient.pl:1005 msgid "Cannot load a plugin in another world." msgstr "Ne eblas ŝarĝi plugin en alia mondo." #: ../share/kildclient.pl:1010 ../share/kildclient.pl:1030 msgid "Plugin not specified" msgstr "Plugin ne informata." #: ../share/kildclient.pl:1017 ../share/kildclient.pl:1048 msgid "Plugin not loaded." msgstr "Plugin ne ŝarĝita." #: ../share/kildclient.pl:1020 #, perl-format msgid "Plugin '%s' loaded." msgstr "Plugin '%s' ŝarĝita." #: ../share/kildclient.pl:1036 #, perl-format msgid "Could not load plugin %s" msgstr "Ne eblas ŝarĝi plugin %s" #: ../share/kildclient.pl:1112 msgid "Plugin enabled." msgstr "Plugin ebligita." #: ../share/kildclient.pl:1145 msgid "Plugin disabled." msgstr "Plugin malebligita." #: ../share/kildclient.pl:1295 msgid "Cannot open help file." msgstr "Ne eblas malfermi helpdosieron." #: ../share/kildclient.pl:1318 msgid "Help topic not found." msgstr "Helptemo ne trovata." kildclient-3.2.0/po/eo.gmo0000644000175000017500000016136013220232041012300 00000000000000L+9~9 P:^:o:::5:5:&(;O;.l;;;(;;<%<:<M<6i<'<<L<6'='^=;=7==>'>"E>"h>>>>>?>:? B?L?]?p??? ???? @@ -@9@ R@_@u@@ @@@ @ AA1ABASAiA}AAABA+A$)BNB(UB"~BB BBBJC#RC vC C*C0C6CD %D 0DX'rXX6X8X1)Y2[Y.Y2Y[YDLZZ{Z1*[1\[#[%[[["\1\ F\$g\ \\ \\\\\\\-] 1] >]I].X] ]]]]] ]]]C]u^ ^^F^^^ _ _%_%A_g_ __{``K a]laaa-ab4bCbLb'cb1bbbbb2cLc ]chc xcc cccc ccc ccdd*d;dOd TdadLqdddd dd"de;eKeOeaefeee+e eee e f f$f 3fAfQfZf _fmf |fff Pgqggggggghh/h"Dh@ghIhh%i .i9iBiJifiziii'iiiijkjjj j#jjZj0>kok kk kk k kk k1lG2lzl lll llllmmmm/mLm_mgmmm mmm=m7 nTBnAnNn;(odo/to)o.ofo=dp'p<pq"q*q+Hqtq qq*q'qMq2;r3nr-r7r4s;=sFysSsGtS\tAt t t u)u /u7$vI>$>@c6ې $#Ei#͑;" +7L`q#Ւ #1 LYk )Փ"7 LZzɔ=ܔ.'Iq)u&ƕϕޕ) (ɖ.5!W _kqx   ȗ"ї$ )3 ;IR&Zʘ٘#'P,}ZP`>o>`8;؛RFgABÝ>9EEJŞ0XA.'0VG%Ϡ"5HWk ֡?&RbyIܢH&@oƣ+գ2!4"V)y"Ƥ+& #4>X(.ܥ" .MSZck{  =#7 IVr&ҧEا'F [ f qJ{cƨ *5A<?~&  6 C Q_o,~$Ȫ3X*%32ݫ33D5x#Ҭ=4)1^:1˭5J3P~"Ϯl8_;ԯ+0Fw'%  !"DL.h7Ʊ $ *8=FRy"J2}""ɳXUW`Ah6 /8Az@Է( 9 FSYo  ϸ ݸ -NScLtȹ ι ܹ(!?UYlq:.E[r Ż ˻ ػ ؼ $>Vg{ʽ#߽CFG# ƾѾھ!((?h|b")52#hR/ / :H+`#,Ib     .Odl" 87%U]AT@J'&$jC,I?\d=| /-S=?B'D<BDN `XIM=Q   *"!v*jX*k*QX^p"*)1 2-<j'c@'h3 ,!0RE5<K]4o0= '+K8T o 85< BPY`g{D 2 (!#J n x, +  )0+8d mw0 1E L X"b>4$&/7> MW"q -. " 4 AL T_z   !%=cj& GCUj }  27 N#\%$ #&> U"`  _:0(k A"tJ$Apg7,:kHexRDBx0^@ctB G /5}7>;xc9s)y"|QM qZ =L)UpwX Q&V4 b6(*o`G8ud&i "I[z'~HXDIEK^:]p$Cd?<rX.lU#_TG~,\n2(;{|:Wa'LV&!yK1Th7f(Bj6D}_\Ji;wYY%`zv+%l+2 g 4@$r9bO| =j3F m*EeZ_-q\2!T9q>.S5YKm %0m N~!{a]vSS?[M] F/-+<8d-n .<w#CzW[ZsI8eaJ*1Ch^o,O=4Ar Hk}WR0)th>'15#u?NlPuRf3o3bVUscLPPy`E j/OnkMv6 QF@Nig{f Target: %d Foreground: %d Background: %d Italics: %d Striked-thru: %d Underline: %d SSL enabled.%d line%d lines%s is already permanent.%s: %s is already permanent%s: %s is not permanent%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: Argument must be numeric%s: Cannot create timer with negative interval%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 key code%s: Invalid target%s: Invalid underline style%s: Keycode given twice, using the named attribute one%s: Keycode not specified, not creating%s: No such world%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent%s: Pattern given twice, using the named attribute one%s: Pattern not specified, not creating%s: Substitution given twice, using the named attribute one%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(-1 to repeat indefinitely)(You must reconnect for changes in this setting to take effect)0 lines: 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 displayTooltipsWindow 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 _startupAppearanceApply to:Are 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...AuthorAutomationBackgroun_dBlac_kBlac_k (bold)BlackBlack (bold)BlueBlue (bold)Bold _foregroundBold backgroun_dBottomBytes received (compressed):Bytes received (decompressed):C_hange styleC_haracter set:C_learC_onfigure...C_onnectC_ustom: Cannot load a plugin in another world.Cannot open help file.Certificate type:Ch_aracters in this mud:Change styleCharacterCharacter to run _Perl commands: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 defaultsCo_mmand separator:Co_nnected time:ColorsCommand _echo:Command _history...Command historyCommand not found.Commands that would be sent:Compression algorithm:Compression ratio:Compression used:Confirm deletionConnect toConnect to _another worldConnect to _another...Connected 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:Could 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 log file: %s.Could not open raw dump file %s: %s Could not open world '%s': %s Could not resolve host %s: %sCountCount Cu_tCy_anCy_an (bold)CyanCyan (bold)DIRDefaultDefault (bold)DescriptionDirectory to store settings and saved worldsDisable _aliasesDisable _macrosDisable _triggersDisable t_imersDisconnectedDisconnected 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 deleteDo not changeDo not displayDo you really want to delete the %1$s?Do you really want to delete %2$d %1$s?Do you really want to make the variable temporary?Do you really want to make %d variables temporary?Do_wnDoubleDumps 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 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 in plugin file: %sError loading UI from XML file: %sError loading pluginError setting spell checker: %s Error while reading from proxy host.Eval as PerlEvent:Expiration:ExportExternal programsFILEFailed loading file %s: %sFileFile name not specified.Find a command containing a given search termFind commandFind n_extFind p_reviousFind the next command with the same match textFingerprint:GagGag logGeneralGreenGreen (bold)HTTPHelp 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 number %d for event %s Name: %s Action: %s Enabled: %s HooksHooks for '%s': Host:Hostname:I_dentify as 'Character - World name'I_dentify as 'World name - Character'I_dentify 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.Ig. caseImportInform 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. Items to e_xportKeep _openKeep _permanentKeep execKeyKey exchange:KildClient errorKildClient informationKildClient readyLan_guage:LeftLines received:Load pluginLoggingLogging is disabled.Logging not startedLogging stopped.Logging to file %s.MAC:Macro added.Macro modified.Macro number %d Name: %s Key code: %s Action: %s Enabled: %s MacrosMagentaMagenta (bold)Main windowMake _temporaryMaximum line width in _characters:More than one command selected.Multi-line sendN/AN_umber of lines:NameNever _hide the typed textNewest commands are on the topNoNo acceptable proxy authentication methods.No auto-loginNo command selected.No proxyNo 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:Omit (_gag) from outputOmit (gag) from _log fileOnClos_eConnected hooksOnCo_nnect hooksOnSer_verData hooksOn_Disconnect hooksOn_GetFocus hooksOn_LoseFocus hooksOn_ReceivedText hooksOn_SentCommand hooksOne %1$s deleted%2$d %1$s deletedOnly _reset idle time counter when a command is entered directlyOnly scalar ($), array (@) and hash (%%) variables can be made permanent.Or connect d_irectly:Outputs version information and exitsPass_word:PasswordPatternPerforming SSL handshake...Permanent 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 macroProtocol %s not enabled.ProtocolsProxyProxy _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 dialogRe_vert to default colorsReally close?Really quit KildClient?RedRed (bold)Resolving host %s...Resolving proxy host %s...RewriterRightSOCKS4SOCKS5SSL handshake failed: %sSSL handshake took too long.SSL protocol used:S_electS_pell check typed textS_tatistics...Sc_roll on outputScriptingSe_nd and closeSearch 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 command entry box:Select the font used in the _main screen:Select the font used in the main output screenSelect 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:SingleSpecify 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 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 boxStatisticsStatus barStore commands _between sessionsStyleSubstitutionSuccessfully moved.TTL expiredT_imersTempTest triggersThe _matched substring numberThe 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 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 c_ontents of this file:There is one open world. Do you really want to quit?There are %d open worlds. 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.Timer added.Timer modified.Timer number %d Name: %s Interval: %.3f Repeat count: %d Action: %s Enabled: %s Temporary: %s TimersTopTrigger 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. Unknown protocolUnnamed worldUnrecognized response from proxy host.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 global settingsUse mul_ti-line input barUse single-_line input barUse the Find button to find the first result.Valid since:VariablesVersionVersion %s of this plugin is already loaded.Visit https://www.kildclient.orgWarning: Changing the character to run Perl commands from the default '/' is not recommended, because doing so might prevent plugins or other code from working, if they use '/' to run Perl commands.Warning: Trying to send a very long command line. Perhaps a recursive alias definition?WhiteWhite (bold)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) YellowYellow (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.[WORLD...]_About_Action:_Add_Aliases_Ask for confirmation before deleting triggers, aliases, etc._Background:_Blue_Blue (bold)_Cancel_Close_Copy_Copy link address_Delay_Delay between each group of lines/commands:_Delete_Disable_Disable up and down arrow keys for history navigation_Disconnect_Display_Do not allow the same command to be sent_Do not display this message again_Don't quit_Downwards_Echo sent commands in main window_Edit_Edit..._Enable if server proposes after connecting_Enabled_Event:_File:_Finally, send this text:_Find_Find:_Flash window when new text is received_Foreground_Foreground:_Format:_Green_Green (bold)_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:_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_Macros_Magenta_Magenta (bold)_Manual_Multi-line send..._Name of variable to make permanent:_Name:_New_Next_Number of commands to save in history:_Number of lines/commands to send at once:_OK_Offline_Open_Open link_Open..._Password:_Paste_Pattern:_Perl file to load:_Permanent variables_Port:_Preferences_Preferences..._Previous_Quit_Reconnect_Red_Red (bold)_Repeat count:_Revert to default_Rewriter trigger_Save_Select a saved world:_Select the font used in the status bar:_Send_Send this command:_Show items defined by plugins_Split window_Start_Stop_Striked-thru:_Substitution:_Tab position:_Temporary (will be deleted automatically when its repeat count reaches 0)_Test triggers_Test triggers..._Text to find:_Triggers_Underline:_Up_Upwards_Username:_White_White (bold)_World_Wrap lines at word boundaries_Yellow_Yellow (bold)_lines of the scrollback buffer in the logaddress type not supportedaliasaliasesalias: Not creating alias without patternalias: Not creating alias without substitutioncharactercharacters have been enteredcommand not supported / protocol errorcommands(s)connection not allowed by rulesetconnection refused by destination hostgeneral failurehookhookshook: Invalid event '%s' host unreachableline(s)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 failedsecondsseconds e_achtimertimerstimes in a _rowtriggertriggersunknown reason codeyyesProject-Id-Version: KildClient 3.2.0 Report-Msgid-Bugs-To: eduardo@kalinowski.com.br PO-Revision-Date: 2017-12-24 09:25-0200 Last-Translator: Eduardo M Kalinowski Language-Team: Eduardo M Kalinowski Language: eo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Celo: %d Fono: %d Malfono: %d Kursivo: %d Trastrekto: %d Substrekto: %d SSL ebligita.%d linio%d linioj%s jam estas daŭra.%s: %s jam estas daŭra%s: %s ne estas daŭra%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: Argumento devas esti numera%s: Invervalo devas esti pozitiva%s: Nombro devas esti numera%s: Intervalo devas esti numera%s: Intervalo ne informita, ne kreita%s: Invalida 'bg'%s: Invalida 'fg'%s: Invalida klavkodo%s: Invalida 'target'%s: Invalida substrektstilo%s: Klavkodo informita dufoje, uzante la de la nomata atributo%s: Klavkodo ne informita, ne kreita%s: Ne ekzistas tiu mondo%s: Nur skalara ($), array (@) kaj hash (%%) variabloj povas iĝi daŭraj%s: Ŝablono informita dufoje, uzante la de la nomata atributo%s: Ŝablono ne informita, ne kreita%s: Anstataŭo informita dufoje, uzante la de la nomata atributo%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(-1 por repeti indefine)(Vi devas rekonekti por aktivigi ŝanĝo en ĉi tiu opicio)0 linioj: 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ŜpruchelpilojKonfiguro 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 _startigoAperoApliki al:Ĉ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_Fono_Nigra_Nigra (grasa)NigraNigra (grasa)BluaBlua (grasa)Grasa mal_fonoGrasa _fonoMalsupreRiĉevitaj bajtoj (kompaktigitaj):Riĉevitaj bajtoj (nekompaktigitaj):Ŝanĝi s_tilon_Signaro:P_urigiKon_figuri..._Konekti_Alia: Ne eblas ŝarĝi plugin en alia mondo.Ne eblas malfermi helpdosieron.Tipo de atesto:R_oluloj en ĉi tiu mud:Ŝanĝi stilonRoluloSigno por ruli _Perl-ajn komandojn: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 forigita 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 kolorojnEĥo _de komandoj:_Tempo konektata:KolorojEĥo de _komandoj:Komand_historio...KomandhistorioKomando ne trovata.Komandoj kiu estus sendota:Kompatigalgoritmo:Kompatigkvociento:Kompaktigilo uzata:Konfirmado de forigoKonekti alKonekti al _alia mondoKonekti al _alia mondo...Konektata 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:Ne 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 registraddosieron: %s.Ne eblas malfermi kruddataŝutdosieron %s: %s Ne eblas malfermi mondon '%s': %s Ne eblas trovi retnodon %s: %sFojojFojoj El_tondi_Cejana_Cejana (grasa)CejanaCejana (grasa)DOSIERUJODefaŭtaDefaŭlta (grasa)PriskriboDosierujo por konservi la konfiguron kaj konservitajn mondojnMalebligi _aliasesMalebligi _macrosMalebligi _triggersMalebligi t_imersMalkonektataMalkonektita el retnodo %s.Malkonektita el retnodo %s: %s.Malkonektita el retnodo %s: eraro #%d.Malkonektita el mondo %sApero_Montri ŝpruchelpilojn kun la horo en kiu la linioj estis riĉevitajMontri kiel horoj, minutoj kaj sekundojMontri kiel sekundoj_Ne forigiNe ŝanĝiNe montriĈu vi vere volas forigi la %1$s-n?Ĉu vi vere volas forigi %2$d %1$s-jn?Ĉu vi vere volas igi ĉi tiun variablon maldaŭra?Ĉu vi vere volas igi %d variablojn maldaŭraj?_MalsuprenDuoblaŜ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 komandoE_ksportiRedakti 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 _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 en plugindosiero: %sEraro dum ŝarĝo de interfaco el XMLdosiero: %sEraro dum ŝargado de pluginEraro 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 komandon enhavantan specifikatan tekson.Trovi komandonTrovi p_roksimanTrovi a_ntaŭaTrovi la proksiman komandon enhavantan la saman tekson.Fingropremaĵo:GagGag logĜeneralaVerdaVerda (grasa)HTTPHelptemo 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 numero %d por evento %s Nomo: %s Ago: %s Ebligata: %s HokojHokoj por '%s': Retnodo:Retnodo:I_dentigi kiel 'Rolulo - Mondnomo'I_dentigi kiel 'Mondnome - Rolulo'I_dentigi 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.Ig. usk.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. Eroj por e_ksportiTeni _malfermataTeni _daŭra_Daŭri ezekKlavoŜlosilointerŝanĝo:Eraro - KildClientInformo - KildClientKildClient pretaLin_gvo:MaldesktreLinioj riĉevitaj:Ŝargi pluginRegistradoRegistrado malaktiva.Registrado ne komencata.Registrado haltigita.Registrado aktiva al dosiero %s.MAC:Macro adiciita.Macro ŝanĝita.Macro numero %d Nomo: %s Klavkodo: %s Ago: %s Ebligata: %s MacrosMalvaMalva (grasa)ĈeffenestroIgi _maldaŭraMaksimuma larĝeco de linioj en _signoj:Plu ol unu komando selektata.Sendi plurajn liniojnN/ANom_bro de linioj:Nomo_Neniam kaŝi tajpatan tekstonPlej novaj komandoj estas supreNeNeniŭ akceptebla aŭtentokontrolmetodo por prokurservilo.Sen aŭtomata salutoNeniu komando selektata.Sen prokurserviloNe ekzistas tiu alias.Ne ekzistas tiu hoko.Ne ekzistas tiu macro.Ne ekzistas tiu plugin.Ne ekzistas tiu timer.Ne ekzistas tiu 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:Ne montri (_gag) en ĉeffenestroNe skri_bi (gag) en registraddosieroOnClos_eConnected hokojOnCo_nnect hokojOnSer_verData hokojOn_Disconnect hokojOn_GetFocus hokojOn_LoseFocus hokojOn_ReceivedText hokojOn_SentCommand hokojUnu %s forigita%2$d %1$s forigitaj_Nur zerigi inaktivatemponombrilon kiam komando estas rekte tajpataNur skalara ($), array (@) kaj hash (%%) variabloj povas iĝi daŭraj.Aŭ konektu rek_te:Monstras eldoninformadon kaj elirasPas_vorto:PasvortoŜablonoIniciante SSL negociadon...Daŭ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 macronProtokolo %s ne estas ebligata.ProtokolojProkurservilo_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 fenestronU_zi la defaŭltajn kolorojnVere fermi?Vere eliri KildClient?RuĝaRuĝa (grasa)Serĉante retnodon %s...Serĉante prokurservilon %s...ReskribistoDekstreSOCKS4SOCKS5SSL negociado ne funkciis: %sSSL negociado daŭris tre longe.SSL protokolo uzata:_Elekti_Literumi tajpatan tekstonS_tatistikoj...Rolumi kiam alvenas _novan tekstonSkriptdosieroSe_ndi & fermiDirekto 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 RegistradodosieronElekt_u la tiparon de la komandskatolo:_Elektu la tiparon de la ĉeffenestro:Elektu la tiparon de la ĉeffenestroElektu ĉ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...Servil_adreso:Servil_pordo:UnuoblaInformu kiom da komandoj estas sendata samtempeInformu kiom da linioj estas sendata samtempeInformu kiom da fojoj ĉi tiu timer devas ruli antaŭ esti malebligita aŭ forigitaTajpu tekson por esti aneksata al la fino de ĉiu sendata linioTajpu tekson por esti aneksata al la komenco de ĉiu sendata linioInformu 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 komandskatoloStatistikojStata breto_Konservi komandojn inter sesiojStiloAnstataŭoSukcese movis.TTL finiĝitaT_imersNedaŭraTesti trigger-jnLa _parton numeroLa 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 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 unu malfermata mondo. Ĉu vi vere volas eliri?Estas %d malfermataj mondoj. Ĉ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.Timer adiciita.Timer ŝanĝita.Timer numero %d Nomo: %s Intervalo: %.3f\n Nombro de fojoj: %d Ago: %s Ebligata: %s Nedaŭra: %s TimersSupreTrigger 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. Malkonata protokolo.Mondo ne nomiĝataMalrekonebla respondo el prokurservilo.Uzu %Kw por reprezenti la mondnomon kaj %Kc por reprezenti la rolulon uzita en la aŭtomata saluto.Uzi SS_LUzi _grasan tiparon por emfazitaj koloroj (anstataŭ nur emfazi)Uzi defaŭltan konfiguron_Plurlinia komandskatolo_Unulinia komandskatoloUzu la Trovi butonon por trovi la unuan rezultaton.Valida de:VariablojEldonoEldono %s de tiu plugin jam estas ŝarĝita.Vizitu https://www.kildclient.orgAverto: Ne estas rekomendata ŝanĝi la defaŭtan signon '/', ĉar plugins kaj altraj kodoj povas ĉesi funkcii se ili uzas '/' por ruli Perl-ajn komandojn.Averto: provante sendi tre grandan linion. Eble rekursia aliasdefino?BlankaBlanka (grasa)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) FlavaFlava (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.[MONDO...]_Koncerne_Ago:_Aldoni_Aliases_Peti konfirmon antaŭ forigo de triggers, aliases, ktp._Fono:_Blua_Blua (grasa)_Resignu_Fermi_Kopii_Kopii ligiladreson_Atendi_Tempo por atendi inter la sendado de ĉiu grupo de linioj/komandoj:_Forigi_MalebligiM_alakativi savoklavojn por navigi komandhistorionMal_konekti_AperoNe permesi la _sama komando esti sendata_Ne montri ĉi tiun mesaĝon denove_Ne eliri_Malsupren_Eĥi senditajn komandojn en la ĉeffenestroR_edaktiR_edakti..._Ebligi se la servilo proponas post konekto_EbligataE_vento:_Dosiero:_Fine, sendi tiun tekston:_Trovi_Trovi:_Ekbrili fenestron kiam nova teksto alvenasMa_lfono_Malfono:_Formo:V_erdaV_erda (grasa)_HelpoK_aŝi langetojn se nur unu mondo estas malfermaR_etnodo:_Inativa tempo:_Ignori usklecon_Importi_Skribi la lastajnAl_inei rompitajn liniojn je_Informaj mesaĝoj:_Enigo_Intervalo:_Kursivo:_Teni fenestro malferma post sendi_Daŭri la ezekutadon de aliaj trigger-oj eĉ se ĉi tiu rulasRe_teni la lastan tajpitan komandon en komandskatolo_Klavo:_Linioj por konservi en rolumadbufroŜarĝ_i_Macros_Malva_Malva (grasa)_Manlibro_Sendi plurajn liniojn..._Nomo de variablo por iĝi daŭra:_Nomo:_Nova_ProksimaNombro de komandoj por konservi en _historio:_Nombro de linioj/komandoj por sendi samtempe:_OK_Senkonekte_Malfermi_Malfermi ligilon_Malfermi...Pas_vorto:_EnmetiŜa_blono:_Perl dosiero por ŝarĝi:Daŭraj varia_bloj_Pordo:_Preferoj_Preferoj..._AntaŭaE_liri_RekonektiR_uĝaR_uĝa (grasa)Nombro de _fojoj:_Uzi la defaŭltonRes_kribista triggerKon_serviElektu konservitan _mondon:_Elektu la tiparon de la stata breto:_SendiSend_i tiun komandon:_Montri objektojn difinitaj de pluginsDividi fene_stronŜ_argiFer_miTr_astrekto:_Anstataŭo:_Pozicio de la langetoj:Ne_daŭra (estos forigita aŭtomate kiam lia nombro de fojoj atingas 0)_Testi trigger-jn_Testi trigger-jn..._Teksto por trovi:_Triggers_Substrekto:_Supren_SuprenSalut_nomo:Bl_ankaBl_anka (grasa)_MondoR_ompi la liniojn inter vortojFla_vaFla_va (grasa)_linionj el la rolumadbufro en la registraddosieroadrestipo ne subtenataaliasaliasesalias: Ne kreita alias sen ŝablonoalias: Ne kreita alias sen anstataŭorolulosignoj estis tajpitajkomando ne subtenata / protokolerarokomando(j)konekto ne permesita de la regularokonekto rifuzita de la destina retnodoĝenerala malfunkciadohokohokojhook: Evento '%s' ne estas valida retnodo ne atingeblalinio(j)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ŭ malsukcesitasekundojs_ekundoj ĉiutimertimers_fojoj sinsekvetriggertriggersmalkonata kodo.jjeskildclient-3.2.0/po/es.gmo0000644000175000017500000010456413220232041012307 00000000000000Dl( ((((.( )')(D)m))7))))*?0*p* x**** *** ++ (+4+ M+Z+ x+++ + ++,,.,BJ,+,$,,(,"-1- :-G-W- _- j-*t-0-6-. . .%. ,.:. @.M. R.^.o.. ... ..&..// ,/ 9/DC/t//,0120d0x000000001 1 11<1V1;m1"1Q182CW28222(2/!3#Q3u3"33'334'4D4c44444 44 44 4,4455'5 75D5_5%~555 555595N*6y6 66 6 6 6 6 666&7=7/E7&u7'77#78$8 =8$^8 88 8888888-8 (9 59@9.O9~99 999 999 99{g::]v;;;-;<<!<8<J<_< p<{<< <<<< <<<< <==='= 6=B=R=r=======+=>> $> 2> @>N>W> \>j> y> >>>>>">?%-? S?^?g?o????'???@"@7@ =@I@i@ @@ @ @@ @1@GAKA eAsAAA AAAAAAA B&B9BQB `BjBzB/B=B'B<"C_CzCCC CC*C'C2D3LD7D4DFDS4EGEAE F F (FIF OF\F pF|FF_FF%FjGG1(H ZHgHwH~HH!H(H'H.H-I5I FIYTIIII-I J 'J1J,9J fJJ J J J,J<JK $K2K6K!KKKL0LOL"mL LLLL=L LL MMM!M'M:MAMIM6RM M)M"M M M"MN"N++NWN`NhNoNNN N NNN NN NNNNO O"O+O-KOyOOOOOOOOOO'OOP P PP #P.P 5P?PSPhP oP|P PPP PP PPPP(PQQ3QRQYQhQ wQ QQQ QQ QQQQQ Q R R&(R OR![R&}RRRRR RRR S SZS2oSSS S SSSTT TUUU(U9V$IV%nV(VVV;V0WKW eW%WWW X XX-XAX$\XXXX!X XXYY 4YAY(QY&zY Y%YYY ZK&Z7rZ.ZZ'Z& [0[9[I[[[ c[ n[,y[*[0[\\\\&\7\=\M\R\a\s\\\\\\ \0\&](]=]V]e]Sn]]a^1j^D^^^__1_G_^_|____ ___B`I`Ph`;`J`B@aaa&a-a(b,b%Kb#qb+b!bb)c *cKcfcmctc|ccccc c>cc d!d8dUdedyddd d d d ddHd^Ce e ee e eef f-)fWf6rf f2f,f%g"=g$`gg#g.g"gh*h 2h?hHh[h#chh"hEhh ii13ieimisiiiiiiiijkQkl!l0*l[l clmll!llllmm#m7mRmcm lmvmmmmmmmmm$m n=nAnVn]n,znn:n"n oo%o8o Ro _ojo zoo ooooo'p?p,Yp p pppppp2q:qUqmqqq q0qq rrr$r5rRrAarXrrs 0sQsdsisxssssss#ss&t6t HtRtct>|tOt$ uI0u zuuuuuu<u56v@lvHv7v:.wViw^wQxOqx xx xy yy -y:yJyeOyy+ymy_z4 {B{Y{r{{{ {'{&{-|/|>|T|}e| | |}E,}r} }}4}&}}} ~~3-~=a~~~~~/M$}"#($*7 b m x4Ȁ΀ ހ 'I5 (# ف 9* 25= s  ɂ ӂ ނ &:R [ g*rC7@ G,R Ä ʄԄ  +5 < FRXh?.6?O c m x † Ɇӆ )= g-r ·"  %,=@aH9:Jhp(U5[4>X1"WG.-Mh)CsK_LFI!T3;#c: 0zH\Dez%VptJI/{PcQ1'FnE8C~ Xikgg3&96AoBr_2p-^=l8 yxkR+e 4"iv DEKfx6*JvHO,\NtLAM>w ]?,&ZY q 'Y V B~{G^jmS%wqRf#]$y|.a(Oud;/d@h<Z` 7b9a}Nr:Sl@`7*2?5bmT< u|)no0jP}=sW+[!$UQ SSL enabled.%d line%d lines%s is already permanent.%s: Argument must be numeric%s: Cannot create timer with negative interval%s: Count must be numeric%s: Interval must be numeric%s: Interval not specified, not creating%s: Invalid key code%s: No such world%s: This is an internal function, do not call directly.%s: Too few arguments%s: Too few arguments.%s: Wrong argument type%s: Wrong number of arguments.(You must reconnect for changes in this setting to take effect)0 lines: Expired: Not yet activeAnsi colorsCharacter setColors used by KildClientConnectionDefault colorsFileFlood preventionFontGraphical editorsInputMCCP (for compression)Note:OptionsPlugins currently loadedPlugins loaded on startupProxyRevert to default colorsSending delaysTCP keep aliveWindow configurationA 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.AliasesAppearanceApply to:Are 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...AuthorAutomationBackgroun_dBlac_kBlac_k (bold)BlackBlack (bold)BlueBlue (bold)Bold _foregroundBold backgroun_dBottomC_hange styleC_haracter set:C_learC_onfigure...C_onnectCannot load a plugin in another world.Cannot open help file.Certificate type:Ch_aracters in this mud:Change styleCharacterCheck to enable command auto-completion (based on previous commands)Check to have the last command kept in the command entry box, so that you can repeat commands only by pressing ENTERCipher:Click the run the triggers against the line.Click to open link; right-click for more options.Co_mmand separator:Co_nnected time:ColorsCommand _history...Command historyCommand not found.Commands that would be sent:Compression algorithm:Compression ratio:Compression used:Confirm deletionConnect toConnect to _another worldConnect to _another...Connected 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:Could 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 load plugin %sCould not load world from file '%s': %sCould not open file '%s': %sCould not open file.Could not open log file: %s.Could not open world '%s': %s Could not resolve host %s: %sCountCount Cu_tCy_anCy_an (bold)CyanCyan (bold)DIRDescriptionDirectory to store settings and saved worldsDisable _aliasesDisable _macrosDisable _triggersDisable t_imersDisconnectedDisconnected from host %s.Disconnected from host %s: %s.Disconnected from host %s: error #%d.Display as secondsDo _not deleteDo not changeDo not displayDo_wnDoubleDumps all data received (possibly compressed) to the fileDumps all data received from (after decompression, if appropriate) to the fileE_xportEdit aliasEdit character informationEdit hookEdit macroEdit timerEdit triggerEdit worldEnable TCP _keep alive packetsEnable _auto-completionEnable if server proposes at _any timeEnabledEnter _line to be matched against the triggers:Enter a descriptive name for the worldEnter some text to be sent to the WorldEnter some text to search for.Enter the port used when connectingEnter the text to search forError 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 a command containing a given search termFind commandFind n_extFind p_reviousFind the next command with the same match textGeneralGreenGreen (bold)HTTPHelp topic not found.Hook defined.Hook modified.HooksIdle 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 selected, logging will be automatically started whenever you connect to the world.Ig. caseImportInform number of lines to include in the log.InputIntervalInvalid argument '%s' Invalid key code.Invalid plugin file.Items to e_xportKeep _openKeep _permanentKeyKey exchange:KildClient errorKildClient informationKildClient readyLan_guage:LeftLines received:MAC:Macro added.Macro modified.MacrosMagentaMagenta (bold)Main windowMake _temporaryMore than one command selected.Multi-line sendN/AN_umber of lines:NameNever _hide the typed textNewest commands are on the topNoNo acceptable proxy authentication methods.No command selected.No proxyNo such aliasNo such macroNo such timerNo worldNoneNot connectedNot connected.Not foundNumber of triggers that matched:OnCo_nnect hooksOn_Disconnect hooksOn_ReceivedText hooksOn_SentCommand hooksOne %1$s deleted%2$d %1$s deletedOr connect d_irectly:Outputs version information and exitsPass_word:PasswordPatternPerforming SSL handshake...Permanent variablesPermenent variablePlugin '%s' loaded.Plugin already loaded. Try enabling it.Plugin disabled.Plugin enabled.Plugin not loaded.Plugin not specifiedPort:PreferencesPress a key to get its keycode.Protocol %s not enabled.ProtocolsProxyProxy _type: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 dialogRe_vert to default colorsReally close?Really quit KildClient?Reca_ll and closeRedRed (bold)Resolving host %s...Resolving proxy host %s...RightSOCKS4SOCKS5SSL handshake failed: %sSSL handshake took too long.SSL protocol used:S_pell check typed textS_tatistics...ScriptingSe_nd and closeSearch direction:Select the _font used in the command entry box: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...Server _address:Server _port:SingleSpecify how many commands are sent at onceSpecify how many lines are sent at onceSpecify some text to be appended to each sent lineSpecify some text to be prepended to each sent lineSpecify the delay between sending the group of commandsSpecify the delay between sending the group of linesSpecify 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 separator for commands typed in the command entry boxStatisticsStatus barStore commands _between sessionsStyleSubstitutionSuccessfully moved.TTL expiredT_imersTempThe text entered here will be matched against triggers as if it were a line coming from the MUDThe whole _lineThen send the c_ontents of this file:There is one open world. Do you really want to quit?There are %d open worlds. 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:Timer added.Timer modified.TimersTopTriggersUnable 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 protocolUnnamed worldUse %Kw to represent the world's name, and %Kc to represent the auto-logon character nameUse _SSLUse mul_ti-line input barUse single-_line input barUse the Find button to find the first result.Valid since:VariablesVersionVersion %s of this plugin is already loaded.Visit https://www.kildclient.orgWhiteWhite (bold)World name:World saved.Would this line be included in the log file?Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br) YellowYellow (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 must specify the substitution.[WORLD...]_About_Action:_Aliases_Ask for confirmation before deleting triggers, aliases, etc._Background:_Blue_Blue (bold)_Cancel_Close_Copy_Copy link address_Delay_Delete_Disable_Disable up and down arrow keys for history navigation_Disconnect_Do not allow the same command to be sent_Do not display this message again_Don't quit_Downwards_Echo sent commands in main window_Edit_Edit..._Enable if server proposes after connecting_Enabled_Event:_File:_Finally, send this text:_Find_Find:_Foreground_Foreground:_Format:_Green_Green (bold)_Help_Idle time:_Import_Include the last_Informative messages:_Input_Interval:_Italic:_Keep dialog open after sending_Keep last typed command in command entry box_Key:_Load_Macros_Magenta_Magenta (bold)_Manual_Multi-line send..._Name:_New_Next_Number of commands to save in history:_OK_Offline_Open_Open link_Open..._Password:_Paste_Pattern:_Perl file to load:_Permanent variables_Port:_Preferences_Preferences..._Previous_Quit_Recall_Reconnect_Red_Red (bold)_Revert to default_Save_Select a saved world:_Select the font used in the status bar:_Send_Send this command:_Show items defined by plugins_Start_Substitution:_Text to find:_Triggers_Underline:_Up_Upwards_Username:_White_White (bold)_World_Yellow_Yellow (bold)address type not supportedaliasaliasescharactercharacters have been enteredcommand not supported / protocol errorcommands(s)connection not allowed by rulesetconnection refused by destination hostgeneral failurehook: Invalid event '%s' host unreachableline(s)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 failedsecondsseconds e_achtimertimerstimes in a _rowunknown reason codeyyesProject-Id-Version: KildClient 3.2.0 Report-Msgid-Bugs-To: eduardo@kalinowski.com.br PO-Revision-Date: 2017-12-24 09:13-0200 Last-Translator: Fernando Bobbio Language-Team: Eduardo M Kalinowski Language: es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Lokalize 1.4 SSL habilitado.%d línea%d líneas%s ya es permanente.%s: El argumento tiene que ser numérico%s: No se puede crear temporizador con intervalo negativo%s: Contador tiene que ser numérico%s: Intervalo tiene que ser numérico%s: Intervalo no especificado, no creado%s: Código de clave inválido%s: No existe tal mundo%s: Esta es una función interna, no llamarla directamente.%s: Demasiados argumentos.%s: Muy pocos argumentos.%s: Tipo de argumento incorrecto%s: Número de argumentos incorrecto.(Deberá volver a conectarse para que los cambios en esta configuración surtan efecto)0 líneas: Expirado: Todavía inactivoColores AnsiJuego de caracteresColores usados por KildClientConexiónColores por defectoArchivoPrevención de inundaciónFuenteEditores gráficosIngresoMCCP (para compresión)Nota:OpcionesComplementos cargados actualmenteComplementos cargados al inicioProxyRevertir a colores por defectoEnviando demorasMantener vivo TCPConfiguración de VentanaUn cliente de MUD con poderosas cualidades y soporte para scripting de PerlIniciar guardado de log a_utomáticamente al conectarseAc_tivar completado automático sólo luego deAcciónAgregar esto al _inicio de cada línea:Agregar esto al _final de cada línea:AvanzadoAlias agregado.Alias modificado.AliasesAparienciaAplicar a:¿Está seguro que quiere cerrar este mundo?Intentando conectar a %s (%s) puerto %s...Intentando conectar a proxy %s (%s) puerto %s...AutorAutomatización_Fondo_Negro_Negro (negrita)NegroNegro (negrita)AzulAzul (negrita)A_delante negrita_Fondo negritaAbajoCambiar _estilo_Juego de caracteres:_LimpiarCon_figurar...C_onectarNo se puede cargar un complemento en otro mundo.No se puede abrir el archivo de ayuda.Tipo de certificado:C_aracteres en este MUD:Cambiar estiloCaracterSeleccionar para habilitar auto-completado de comandos (basado en comandos previos)Seleccionar para mantener el último comando usado en la caja de ingreso de comandos, para que pueda repetirse comandos presionando la tecla Intro únicamenteCifrado:Dar clic para ejecutar los gatillos en la línea.Dar clic para abrir vínculo; clic de la derecha para más opciones._Separador de comandos:_Tiempo conectado(a):Colores_Historial de comandos...Historial de comandosComando no encontrado.Comandos que sería enviados:Algoritmo de compresión:Rata de compresión:Compresión usada:Confirmar borradoConectar aConectar a otro _mundoConectar a _otro...Desconectado de %s (%s) puerto %s, versión de MCCP %d habilitada.Conectado a %s (%s) puerto %s.Conectado a %s puerto %s, mediante proxy %s (%s) puerto %s, versión de MCCP %d Conectado a %s puerto %s, mediante proxy %s (%s) puerto %s.Conectado al puerto %s del servidor proxy %s, negociando autenticación...Conectado al servidor proxy %s en el puerto %s, enviando pedido..._Estilo de conexión:Tiempo de conexión:No se pudo conectar a %s puerto %s: %sNo se pudo conectar a %s puerto %s: error #%dNo se puede crear el directorio '%s': %sNo se pudo crear conexión: %sNo se pudo crear conexión: error #%dNo se pudo cargar el complemento %sNo se pudo cargar mundo de archivo '%s': %sNo se pudo abrir archivo '%s': %sNo se pudo abrir el archivo.No se pudo abrir el archivo de texto: %s.No se pudo abrir mundo '%s': %s No se pudo resolver %s: %sCuentaContarCor_tarC_yanC_yan (negrita)CyanCyan (negrita)DIRDescripciónDirectorio donde se guardan configuraciones y mundos guardadosDeshabilitar _aliasesDeshabilitar _macrosDeshabilitar _triggersDeshabilitar t_emporizadoresDesconectado(a)Desconectado de %s.Desconectado de %s: %s.Desconectado de %s: error #%d.Mostrar como segundos_No borrarNo cambiarNo mostrarHacia aba_joDobleIngresa toda la información recibida (posiblemente compresa) al archivoIngresa toda la información recibida de (luego de descompresión, si es necesario) al archivoE_xportarEditar aliasEditar información de caracterEditar ganchoEditar macroEditar temporizadorEditar temporizadorEditar mundo_Habilitar paquetes de TCP para mantener vivo_Habilitar auto-completadoH_abilitar si el servidor propone en cualquier momentoHabilitado(a)Ingresar _línea a ser comparada con los gatillos:Ingresar un nombre descriptivo para el mundoIngresar texto a ser enviado al MundoIngresar parte del texto a buscar.Ingresar el puerto usado al conectarIngresar texto a ser buscadoError en archivo de complemento: %sError configurando corrector ortográfico: %s Error al leer del servidor proxy. Evaluar como PerlEvento:Expiración:ExportarProgramas externosARCHIVONo se pudo cargar el archivo %s: %sArchivoNombre de archivo no especificado.Encontrar un comando conteniendo un término de búsqueda determinadoEncontrar comandoEncontrar si_guienteEncontrar a_nteriorEncontrar el siguiente comando con el mismo textoGeneralVerdeVerde (negrita)HTTPTema de ayuda no encontrado.Gancho definido.Gancho modificado.HooksTiempo inactivo(a):Si está seleccionada, las teclas de cursor para arriba y para abajo no son usadas para navegar entre los comandos guardados. (Deberá usar Alt+Arriba y Alt+Abajo.)Si está seleccionado, los gatillos, aliases, macros y temporizadores definidos en los complementos aparecerán en las secciones de Editor de Mundos.Si no está seleccionado, los objetos como los gatillos, aliases, etc. serán eliminados directamente sin pedir confirmación al presionar el botón Eliminar (Delete).Si está seleccionado, se creará un log automáticamente al conectarse al mundo.Ig. casoImportarInformar número de líneas a incluir en el log.IngresoIntervaloArgumento inválido '%s' Código de clave inválido.Archivo de complemento inválido.Artículos a e_xportarMantener _abiertoMantener como _permanenteClaveClave intercambiada:Error de KildClientInformación de KildClientKildClient listo_Idioma:IzquierdaLíneas recibidas:MAC:Macro agregado.Macro modificado.MacrosMagentaMagenta (negrita)Ventana principalCrear _momentáneamenteHay más de un comando seleccionado.Envío de líneas múltiplesN/ANúmero de _líneas:Nombre_Nunca ocultar texto tipeadoLos comandos más recientes están al inicioNoNo existen métidos de autenticación de proxy aceptables.No se seleccionó ningún comando.Sin proxyAlias no existenteMacro no existenteTemporizador no existenteNo hay mundoNinguno(a)No conectado(a)No conectado.No encontrado(a)Número de gatillos encontrados:Ganchos AlCo_nectarGanchos Al_DesconectarGanchos Al_RecibirTextoGanchos AlEnviarComando_sUn(a) %s borrado(a)Se borró %2$d %1$sO conectar d_irectamente:Muestra información de la versión y cierraContra_seña:ContraseñaPatrónIniciando conexión SSL...Variables permanentesVariable PermanenteComplemento '%s' cargado.Complemento ya está cargado. Intente habilitarlo.Complemento deshabilitado.Complemento habilitado.Complemento no cargado.Complemento no especificadoPuerto:PreferenciasPresione una tecla para ver su código de clave.Protocolo %s no habilitado.ProtocolosProxy_Tipo de proxy:Puerto de proxy:Pedido de proxy fallido: %s.Tipo de proxy:Colocar el comando seleccionado en la caja de entrada de comandosColocar el comando seleccionado en la caja de entrada de comandos y cerrar este diálogoR_evertir a colores por defecto¿Realmente cerrar?¿Realmente salir de KildClient?Record_ar y cerrarRojoRojo (negrita)Resolviendo %s...Resolviendo proxy %s...DerechaSOCKS4SOCKS5Problema de conexión SSL: %sLa conexión SSL demoró demasiado.Protocolo SSL usado:Revisar ortografía del te_xto tipeadoEs_tadísticas...ScriptingE_nviar y cerrarDirección de búsqueda:Seleccionar la _fuente usada en la caja de entrada de comandosSeleccionar para incluir líneas de la pantalla principal en el archivo de log.Enviar el/los comando(s) al programaEnviar el/los comando(s) seleccionado(s) al programa y cerrar el diálogoEnviar este texto _inicialmente:EnviandoEnviando pedido de conexión..._Dirección de servidor:_Puerto de servidor:SimpleEspecificar cuántos comandos serán enviados a la misma vezEspecificar cuántas líneas serán enviadas a la vezEspecificar texto a ser agregado al final de cada línea enviadaEspecificar algún texto a ser agregado al inicio de cada línea enviadaEspecificar la demora entre envío de grupo de comandosEspecificar la demora entre los grupos de líneas enviadasEspecificar el número máximo de comandos iguales que pueden ser enviados en una filaEspecificar el número de caracteres que deben ser tipeados para iniciar completado de comandoEspecificar el número de comandos a ser guardados para ser usados posteriormenteEspecificar el separador de comandos tipeados en la caja de entrada de comandosEstadísticasBarra de estado_Guardar comandos entre sesionesEstiloSubstituciónSe movió exitosamente.TTL expiradoTempor_izadoresTempEl texto ingresado aquí será comparado con los gatillos como si fuese una línea de comando del MUDToda la _líneaLuego enviar el _contenido de este archivo:Hay un mundo abierto. ¿Realmente quiere desconectar?Hay %d mundos abiertos. ¿Realmente quiere desconectar?Esto es lo que aparecería en la pantalla principal. Si está vacío, la línea ha sido cortada. Puede ser diferente de la línea original debido a gatillos de re-escritura.Esto es lo que aparecería en la pantalla principal:Temporizador agregado.Temporizador modificado.TemporizadoresArribaTriggersProblemas de conexión a %s: %s.Problemas de conexión a %s: error #%d.Problemas de conexión a proxy %s: %s.Problemas de conexión a proxy %s: error #%d.Desconocido(a)Protocolo desconocidoMundo sin nombreUsar %Kw para representar el nombre del mundo, y %Kc para representar el nombre del caracter a ser conectado automáticamenteUsar SS_LUsar _barra de ingreso múltiple_Usar barra de ingreso simpleUsar el botón Encontrar ("Find") para encontrar el primer resultado.Válido(a) desde:VariablesVersiónLa versión %s de este complemento ya está cargada.Visítenos: https://www.kildclient.orgBlancoBlanco (negrita)Nombre del mundo:Mundo guardado.¿Esta línea será incluída en el archivo de log?Escrito por Eduardo M Kalinowski (eduardo@kalinowski.com.br) AmarilloAmarillo (negrita)SíPuede dejar este campo en blanco y se generará un nombre de archivo automáticamente. Sólo editar este campo si sabe lo que está haciendo.Se tiene que especificar un nombre de variable.Se tiene que especificar la acción.Se tiene que especificar la clave.Se tiene que especificar el nombre.Se tiene que especificar la contraseña.Se tiene que especificar el patrón.Se tiene que especificar la substitución.[MUNDO...]_Acerca de_Acción:_AliasesCo_nfirmar antes de eliminar gatillos, aliases, etc._Fondo:A_zulA_zul (negrita)_Cancelar_Cerrar_Copiar_Copiar dirección de vínculo_Demora_Borrar_Deshabilitar_Deshabilitar las teclas de arriba y abajo para navegación del historial_DesconectarNo _permitir el envío del mismo comando_No mostrar este mensaje nuevamente_No salirHacia A_bajo_Enviar eco de comandos enviados en la pantalla principal_Editar_Editar..._Habilitar si el servidor propone luego de conectarse_HabilitadoE_vento:_Archivo:_Finalmente, enviar este texto:_Encontrar_Encontrar:A_delanteA_delante:_Formato:_Verde_Verde (negrita)_AyudaTi_empo inactivo(a):_Importar_Incluir el últimoMensajes _informativos:_Ingreso_Intervalo:_Itálica:_Mantener diálogo abierto luego de enviar_Mantener último comando tipeado en la caja de entrada de comandosC_lave:_Cargar_Macros_Magenta_Magenta (negrita)_Manual_Enviar varias líneas..._Nombre:_Nuevo_SiguienteNúme_ro de comandos a guardar en historial:_OK_Desconectado(a)_Abrir_Abrir vínculo_Abrir...Contr_aseña:_Pegar_Patrón:_Archivo Perl a cargar:Variables _permanentes_Puerto:_Preferencias_Preferencias..._Anterior_Salir_Recordar_Reconectar_Rojo_Rojo (negrita)Revertir a por _defecto_Guardar_Seleccionar un mundo guardado:_Seleccionar la fuente usada en la caja de entrada de comandos:_EnviarEnviar este coman_do:_Mostrar objetos definidos en los complementos_Iniciar_Substitución:_Texto a encontrar:_Triggers_Subrayar:Hacia _arribaHacia _Arriba_Nombre de usuario:_Blanco_Blanco (negrita)_Mundo_Amarillo_Amarillo (negrita)Tipo de dirección no soportadoaliasaliasescaractercaracteres han sido ingresadosComando no soportado / error de protocolocomando(s)Conexión no permitida por reglas habilitadasConexión rechazada por destinoFalla generalhook: Evento inválido '%s' No se puede encontrar el servidor línea(s)macromacrosNo (n)Red no existentenopixelesPedido fallido debido a que el identd del cliente no pudo confirmar el ID de usuario en el pedidoPedido fallido debido a que identd no pudo ser encontradoPedido rechazado o fallidosegundossegundos ca_da uno(a)temporizadortemporizadores_veces seguidasCódigo de razón desconocidaSí (y)síkildclient-3.2.0/po/ChangeLog0000644000175000017500000000006713220232041012737 00000000000000Please see the ChangeLog file in the parent directory. kildclient-3.2.0/po/kildclient.pot0000644000175000017500000020324713220232041014040 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: eduardo@kalinowski.com.br\n" "POT-Creation-Date: 2017-12-25 11:11-0200\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" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: ../src/main.c:63 msgid "Outputs version information and exits" msgstr "" #: ../src/main.c:65 msgid "Directory to store settings and saved worlds" msgstr "" #: ../src/main.c:65 msgid "DIR" msgstr "" #: ../src/main.c:67 msgid "" "Dumps all data received from (after decompression, if appropriate) to the " "file" msgstr "" #: ../src/main.c:68 ../src/main.c:71 msgid "FILE" msgstr "" #: ../src/main.c:70 msgid "Dumps all data received (possibly compressed) to the file" msgstr "" #. Parse command-line options #: ../src/main.c:101 msgid "[WORLD...]" msgstr "" #: ../src/main.c:108 #, c-format msgid "Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br)\n" msgstr "" #: ../src/main.c:113 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "" #: ../src/main.c:120 #, c-format msgid "Could not open raw dump file %s: %s\n" msgstr "" #: ../src/main.c:241 #, c-format msgid "There is one open world. Do you really want to quit?" msgid_plural "There are %d open worlds. Do you really want to quit?" msgstr[0] "" msgstr[1] "" #: ../src/main.c:245 msgid "Really quit KildClient?" msgstr "" #: ../src/main.c:247 msgid "_Don't quit" msgstr "" #: ../src/main.c:248 ../src/wndmain.ui:146 msgid "_Quit" msgstr "" #: ../src/net.c:166 ../src/proxy.c:209 #, c-format msgid "Resolving proxy host %s..." msgstr "" #: ../src/net.c:169 #, c-format msgid "Resolving host %s..." msgstr "" #: ../src/net.c:262 ../src/proxy.c:193 #, c-format msgid "Could not resolve host %s: %s" msgstr "" #: ../src/net.c:290 #, c-format msgid "Attempting to connect to host %s (%s) port %s..." msgstr "" #: ../src/net.c:293 #, c-format msgid "Attempting to connect to proxy host %s (%s) port %s..." msgstr "" #: ../src/net.c:309 #, c-format msgid "Could not create socket: %s" msgstr "" #: ../src/net.c:312 #, c-format msgid "Could not create socket: error #%d" msgstr "" #: ../src/net.c:332 #, c-format msgid "Could not connect to host %s port %s: %s" msgstr "" #: ../src/net.c:342 #, c-format msgid "Could not connect to host %s port %s: error #%d" msgstr "" #: ../src/net.c:398 #, c-format msgid "Unable to connect to host %s: %s." msgstr "" #: ../src/net.c:401 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "" #: ../src/net.c:443 ../src/net.c:461 #, c-format msgid "Unable to connect to host %s: error #%d." msgstr "" #: ../src/net.c:446 ../src/net.c:464 #, c-format msgid "Unable to connect to proxy host %s: error #%d." msgstr "" #: ../src/net.c:499 #, c-format msgid "Performing SSL handshake..." msgstr "" #. Fatal error #: ../src/net.c:542 #, c-format msgid "SSL handshake failed: %s" msgstr "" #: ../src/net.c:583 #, c-format msgid "SSL handshake took too long." msgstr "" #: ../src/net.c:605 ../src/net.c:1091 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "" #: ../src/net.c:608 ../src/net.c:1094 #, c-format msgid "Connected to host %s port %s, via proxy %s (%s) port %s." msgstr "" #: ../src/net.c:615 ../src/net.c:1067 ../src/net.c:1101 msgid " SSL enabled." msgstr "" #: ../src/net.c:770 #, c-format msgid "Disconnected from host %s." msgstr "" #: ../src/net.c:838 ../src/net.c:846 #, c-format msgid "Disconnected from host %s: %s." msgstr "" #: ../src/net.c:857 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "" #: ../src/net.c:1055 #, c-format msgid "Connected to host %s (%s) port %s, MCCP version %d enabled." msgstr "" #: ../src/net.c:1059 #, c-format msgid "" "Connected to host %s port %s, via proxy %s (%s) port %s, MCCP version %d " "enabled." msgstr "" #: ../src/net.c:1177 ../src/we_logging.c:121 msgid "Not connected." msgstr "" #. success #: ../src/proxy.c:57 msgid "general failure" msgstr "" #: ../src/proxy.c:58 msgid "connection not allowed by ruleset" msgstr "" #: ../src/proxy.c:59 msgid "network unreachable" msgstr "" #: ../src/proxy.c:60 msgid "host unreachable" msgstr "" #: ../src/proxy.c:61 msgid "connection refused by destination host" msgstr "" #: ../src/proxy.c:62 msgid "TTL expired" msgstr "" #: ../src/proxy.c:63 msgid "command not supported / protocol error" msgstr "" #: ../src/proxy.c:64 msgid "address type not supported" msgstr "" #: ../src/proxy.c:239 ../src/proxy.c:661 #, c-format msgid "Connected to proxy server %s port %s, sending request..." msgstr "" #: ../src/proxy.c:294 ../src/proxy.c:423 ../src/proxy.c:468 ../src/proxy.c:542 #: ../src/proxy.c:708 msgid "Error while reading from proxy host." msgstr "" #: ../src/proxy.c:315 msgid "request rejected or failed" msgstr "" #: ../src/proxy.c:319 msgid "request failed because identd could not be reached" msgstr "" #: ../src/proxy.c:323 msgid "" "request failed because client's identd could not confirm the user ID string " "in the request" msgstr "" #: ../src/proxy.c:327 ../src/proxy.c:568 ../src/proxy.c:724 #, c-format msgid "Proxy request failed: %s." msgstr "" #: ../src/proxy.c:344 #, c-format msgid "Connected to proxy server %s port %s, negotiating authentication..." msgstr "" #: ../src/proxy.c:438 msgid "No acceptable proxy authentication methods." msgstr "" #: ../src/proxy.c:486 msgid "Proxy authentication failed." msgstr "" #. Should never happen #: ../src/proxy.c:529 msgid "Unrecognized response from proxy host." msgstr "" #: ../src/proxy.c:563 msgid "unknown reason code" msgstr "" #: ../src/proxy.c:584 #, c-format msgid "Sending proxy authentication credentials..." msgstr "" #: ../src/proxy.c:623 #, c-format msgid "Sending connection request..." msgstr "" #: ../src/mainwindow.c:162 ../src/mainwindow.c:631 ../src/mainwindow.c:897 #: ../src/worldgui.c:1128 ../src/worldselector.c:186 ../src/worldeditor.c:178 #: ../src/we_general.c:334 ../src/we_generic_guied.c:81 ../src/we_triggers.c:83 #: ../src/we_triggers.c:553 ../src/we_triggers.c:744 ../src/we_aliases.c:76 #: ../src/we_aliases.c:455 ../src/we_macros.c:79 ../src/we_macros.c:420 #: ../src/we_timers.c:76 ../src/we_timers.c:458 ../src/we_hooks.c:87 #: ../src/we_hooks.c:620 ../src/we_vars.c:76 ../src/we_vars.c:362 #: ../src/prefs.c:106 ../src/triggers.c:277 ../src/multilinesend.c:92 #: ../src/cmdhistory.c:209 ../src/cmdhistory.c:439 #, c-format msgid "Error loading UI from XML file: %s" msgstr "" #: ../src/mainwindow.c:691 ../src/mainwindow.c:692 msgid "Not connected" msgstr "" #: ../src/mainwindow.c:833 msgid ": Not yet active" msgstr "" #: ../src/mainwindow.c:838 msgid ": Expired" msgstr "" #: ../src/mainwindow.c:852 ../src/kildclient.ui:1898 #: ../src/dlgStatistics.ui:114 ../src/dlgStatistics.ui:327 msgid "None" msgstr "" #: ../src/worldgui.c:229 msgid "_Find:" msgstr "" #: ../src/worldgui.c:243 ../src/wndmain.ui:216 ../src/wndmain.ui:272 #: ../src/dlgCmdHistory.ui:195 msgid "Find n_ext" msgstr "" #: ../src/worldgui.c:270 msgid "Click to clear the command input area." msgstr "" #: ../src/worldgui.c:376 msgid "No world" msgstr "" #: ../src/worldgui.c:425 msgid "KildClient ready" msgstr "" #: ../src/worldgui.c:435 msgid "0 lines" msgstr "" #: ../src/worldgui.c:895 msgid "Are you sure you want to close this world?" msgstr "" #: ../src/worldgui.c:896 msgid "Really close?" msgstr "" #: ../src/worldgui.c:898 msgid "Keep _open" msgstr "" #: ../src/worldgui.c:899 ../src/worldselector.c:799 ../src/worldselector.c:805 #: ../src/wndmain.ui:82 ../src/dlgPreferences.ui:155 #: ../src/dlgTestTriggers.ui:41 ../src/dlgCmdHistory.ui:125 msgid "_Close" msgstr "" #: ../src/worldgui.c:1060 #, c-format msgid "Error setting spell checker: %s\n" msgstr "" #: ../src/worldgui.c:1312 msgid "Click to open link; right-click for more options." msgstr "" #: ../src/worldgui.c:1478 msgid "Not found" msgstr "" #: ../src/ansitextview.c:429 #, c-format msgid "%d line" msgid_plural "%d lines" msgstr[0] "" msgstr[1] "" #: ../src/worldselector.c:135 ../src/worldselector.c:677 #, c-format msgid "Could not load world from file '%s': %s" msgstr "" #: ../src/worldselector.c:487 #, c-format msgid "Could not open world '%s': %s\n" msgstr "" #: ../src/worldselector.c:530 #, c-format msgid "Invalid argument '%s'\n" msgstr "" #: ../src/worldselector.c:793 msgid "Disconnected" msgstr "" #: ../src/worldselector.c:796 ../src/worldselector.c:803 ../src/wndmain.ui:58 msgid "_Reconnect" msgstr "" #: ../src/worldselector.c:797 ../src/worldselector.c:804 msgid "Connect to _another world" msgstr "" #: ../src/worldselector.c:798 msgid "_Offline" msgstr "" #: ../src/worlds.c:772 msgid "Unnamed world" msgstr "" #: ../src/worlds.c:829 ../src/worlds.c:2346 ../src/we_generic_guied.c:311 #: ../src/prefs.c:431 #, c-format msgid "Could not open file '%s': %s" msgstr "" #: ../src/worlds.c:892 #, c-format msgid "Invalid top-level element '%s'" msgstr "" #: ../src/worlds.c:1695 #, c-format msgid "Internal error: element '%s' ends when in START mode" msgstr "" #: ../src/worlds.c:1964 #, c-format msgid "Invalid key code '%s'" msgstr "" #: ../src/worlds.c:1983 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "" #: ../src/worlds.c:1996 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "" #: ../src/worlds.c:2503 #, c-format msgid "Disconnected from world %s" msgstr "" #: ../src/worldeditor.c:239 msgid "General" msgstr "" #: ../src/worldeditor.c:247 ../src/worldeditor.c:251 msgid "Display" msgstr "" #: ../src/worldeditor.c:248 msgid "Here you can set options to configure the appearance of KildClient." msgstr "" #: ../src/worldeditor.c:259 msgid "Main window" msgstr "" #: ../src/worldeditor.c:267 msgid "Colors" msgstr "" #: ../src/worldeditor.c:275 msgid "Status bar" msgstr "" #: ../src/worldeditor.c:283 msgid "Input" msgstr "" #: ../src/worldeditor.c:291 msgid "Logging" msgstr "" #: ../src/worldeditor.c:297 ../src/worldeditor.c:301 msgid "Automation" msgstr "" #: ../src/worldeditor.c:298 msgid "" "Here you can set options to configure the automation features of KildClient, " "such as triggers, aliases, plugins, etc." msgstr "" #: ../src/worldeditor.c:309 msgid "Scripting" msgstr "" #: ../src/worldeditor.c:317 msgid "Plugins" msgstr "" #: ../src/worldeditor.c:328 msgid "Triggers" msgstr "" #: ../src/worldeditor.c:339 msgid "Aliases" msgstr "" #: ../src/worldeditor.c:350 msgid "Macros" msgstr "" #: ../src/worldeditor.c:361 msgid "Timers" msgstr "" #: ../src/worldeditor.c:372 msgid "Hooks" msgstr "" #: ../src/worldeditor.c:383 msgid "Variables" msgstr "" #: ../src/worldeditor.c:392 msgid "Protocols" msgstr "" #: ../src/worldeditor.c:400 msgid "Advanced" msgstr "" #: ../src/we_general.c:73 msgid "Character" msgstr "" #: ../src/we_general.c:81 msgid "Password" msgstr "" #: ../src/we_general.c:373 msgid "You must specify the name." msgstr "" #: ../src/we_general.c:380 msgid "You must specify the password." msgstr "" #: ../src/we_general.c:418 msgid "character" msgstr "" #: ../src/we_logging.c:110 ../src/log.c:104 #, c-format msgid "Logging to file %s." msgstr "" #: ../src/we_logging.c:116 msgid "Logging is disabled." msgstr "" #: ../src/we_logging.c:209 msgid "Logging not started" msgstr "" #: ../src/we_logging.c:238 msgid "Select log file" msgstr "" #: ../src/we_logging.c:241 ../src/we_plugins.c:574 ../src/we_generic_guied.c:97 #: ../src/we_generic_guied.c:364 ../src/kildclient.ui:64 #: ../src/kildclient.ui:342 ../src/kildclient.ui:559 ../src/kildclient.ui:682 #: ../src/kildclient.ui:865 ../src/kildclient.ui:1069 ../src/kildclient.ui:1369 #: ../src/kildclient.ui:1943 ../src/dlgSelectWorld.ui:43 #: ../src/dlgEditWorld.ui:132 ../src/dlgMLSend.ui:54 #: ../src/dlgCmdHistory.ui:348 msgid "_Cancel" msgstr "" #: ../src/we_logging.c:243 ../src/kildclient.ui:78 ../src/kildclient.ui:356 #: ../src/kildclient.ui:573 ../src/kildclient.ui:696 ../src/kildclient.ui:879 #: ../src/kildclient.ui:1083 ../src/kildclient.ui:1383 #: ../src/kildclient.ui:1957 ../src/dlgStatistics.ui:40 #: ../src/dlgEditWorld.ui:146 ../src/dlgCmdHistory.ui:362 msgid "_OK" msgstr "" #: ../src/we_plugins.c:124 ../src/we_plugins.c:336 ../src/we_triggers.c:225 #: ../src/we_aliases.c:206 ../src/we_macros.c:209 ../src/we_timers.c:206 #: ../src/we_hooks.c:341 ../src/perlscript.c:3429 msgid "Name" msgstr "" #: ../src/we_plugins.c:136 ../src/we_plugins.c:378 ../src/perlscript.c:3430 msgid "Description" msgstr "" #: ../src/we_plugins.c:148 ../src/we_plugins.c:364 msgid "Author" msgstr "" #: ../src/we_plugins.c:161 msgid "File" msgstr "" #: ../src/we_plugins.c:205 ../src/we_plugins.c:457 msgid "Error loading plugin" msgstr "" #: ../src/we_plugins.c:322 ../src/we_triggers.c:211 ../src/we_aliases.c:192 #: ../src/we_macros.c:195 ../src/we_timers.c:192 ../src/we_hooks.c:327 msgid "Enabled" msgstr "" #: ../src/we_plugins.c:350 msgid "Version" msgstr "" #: ../src/we_plugins.c:439 msgid "Always load this plugin at _startup" msgstr "" #: ../src/we_plugins.c:497 msgid "The help is displayed in main window." msgstr "" #: ../src/we_plugins.c:498 msgid "KildClient information" msgstr "" #: ../src/we_plugins.c:499 msgid "_Do not display this message again" msgstr "" #: ../src/we_plugins.c:571 msgid "Load plugin" msgstr "" #: ../src/we_plugins.c:576 ../src/we_generic_guied.c:366 msgid "_Open" msgstr "" #: ../src/we_generic_guied.c:94 msgid "Export" msgstr "" #: ../src/we_generic_guied.c:99 ../src/wndmain.ui:104 msgid "_Save" msgstr "" #: ../src/we_generic_guied.c:361 msgid "Import" msgstr "" #: ../src/we_generic_guied.c:393 #, c-format msgid "Could not import file '%s': %s" msgstr "" #: ../src/we_generic_guied.c:948 #, c-format msgid "Do you really want to delete the %1$s?" msgid_plural "Do you really want to delete %2$d %1$s?" msgstr[0] "" msgstr[1] "" #: ../src/we_generic_guied.c:952 ../src/we_vars.c:282 msgid "Confirm deletion" msgstr "" #: ../src/we_generic_guied.c:954 msgid "Do _not delete" msgstr "" #: ../src/we_generic_guied.c:955 ../src/kildclient.ui:1736 #: ../src/wndmain.ui:194 ../src/dlgSelectWorld.ui:151 #: ../src/dlgEditWorld.ui:634 ../src/dlgEditWorld.ui:3290 msgid "_Delete" msgstr "" #: ../src/we_triggers.c:130 msgid "_Test triggers" msgstr "" #: ../src/we_triggers.c:239 ../src/we_aliases.c:220 ../src/triggers.c:140 #: ../src/aliases.c:176 msgid "Pattern" msgstr "" #: ../src/we_triggers.c:257 ../src/we_aliases.c:238 msgid "Ig. case" msgstr "" #: ../src/we_triggers.c:271 ../src/we_macros.c:237 ../src/we_timers.c:246 #: ../src/we_hooks.c:355 ../src/triggers.c:141 ../src/macros.c:145 #: ../src/timers.c:202 msgid "Action" msgstr "" #: ../src/we_triggers.c:289 msgid "Gag" msgstr "" #: ../src/we_triggers.c:307 msgid "Gag log" msgstr "" #: ../src/we_triggers.c:325 msgid "Keep exec" msgstr "" #: ../src/we_triggers.c:343 msgid "Rewriter" msgstr "" #: ../src/we_triggers.c:361 msgid "Style" msgstr "" #: ../src/we_triggers.c:375 ../src/we_aliases.c:284 ../src/we_macros.c:251 #: ../src/we_timers.c:278 ../src/we_hooks.c:369 msgid "Plugin" msgstr "" #: ../src/we_triggers.c:470 ../share/kildclient.pl:803 #: ../share/kildclient.pl:865 msgid "trigger" msgid_plural "triggers" msgstr[0] "" msgstr[1] "" #: ../src/we_triggers.c:635 ../src/we_aliases.c:516 msgid "You must specify the pattern." msgstr "" #: ../src/we_triggers.c:643 msgid "" "You must specify the action, unless the trigger is a gag or changes the " "style." msgstr "" #: ../src/we_aliases.c:252 ../src/aliases.c:177 msgid "Substitution" msgstr "" #: ../src/we_aliases.c:270 msgid "Eval as Perl" msgstr "" #: ../src/we_aliases.c:379 ../share/kildclient.pl:815 #: ../share/kildclient.pl:866 msgid "alias" msgid_plural "aliases" msgstr[0] "" msgstr[1] "" #: ../src/we_aliases.c:523 msgid "You must specify the substitution." msgstr "" #: ../src/we_macros.c:223 ../src/macros.c:144 msgid "Key" msgstr "" #: ../src/we_macros.c:346 ../share/kildclient.pl:827 ../share/kildclient.pl:867 msgid "macro" msgid_plural "macros" msgstr[0] "" msgstr[1] "" #: ../src/we_macros.c:476 msgid "You must specify the key." msgstr "" #: ../src/we_macros.c:483 msgid "Invalid key code." msgstr "" #: ../src/we_macros.c:490 ../src/we_timers.c:523 ../src/we_hooks.c:671 msgid "You must specify the action." msgstr "" #: ../src/we_timers.c:219 msgid "Interval" msgstr "" #: ../src/we_timers.c:232 msgid "Count" msgstr "" #: ../src/we_timers.c:264 msgid "Temp" msgstr "" #: ../src/we_timers.c:380 ../share/kildclient.pl:839 ../share/kildclient.pl:868 msgid "timer" msgid_plural "timers" msgstr[0] "" msgstr[1] "" #: ../src/we_timers.c:516 msgid "The interval must be positive." msgstr "" #. The manually added combo for selecting which hook #: ../src/we_hooks.c:130 msgid "_Event:" msgstr "" #: ../src/we_hooks.c:546 ../share/kildclient.pl:852 ../share/kildclient.pl:869 msgid "hook" msgid_plural "hooks" msgstr[0] "" msgstr[1] "" #: ../src/we_vars.c:278 #, c-format msgid "Do you really want to make the variable temporary?" msgid_plural "Do you really want to make %d variables temporary?" msgstr[0] "" msgstr[1] "" #: ../src/we_vars.c:284 msgid "Keep _permanent" msgstr "" #: ../src/we_vars.c:285 msgid "Make _temporary" msgstr "" #: ../src/we_vars.c:389 msgid "You must specify a variable name." msgstr "" #: ../src/we_vars.c:395 #, c-format msgid "" "Only scalar ($), array (@) and hash (%%) variables can be made permanent." msgstr "" #: ../src/we_vars.c:408 #, c-format msgid "%s is already permanent." msgstr "" #: ../src/prefs.c:387 #, c-format msgid "Invalid window size specification in config file.\n" msgstr "" #: ../src/prefs.c:407 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "" #: ../src/prefs.c:501 #, c-format msgid "Could not create directory '%s': %s" msgstr "" #: ../src/parser.c:211 msgid "" "Warning: Trying to send a very long command line. Perhaps a recursive alias " "definition?" msgstr "" #: ../src/triggers.c:139 #, c-format msgid "Num Gag GLo Ena KeE ReW IgC Sty %-*.*s %-*.*s\n" msgstr "" #: ../src/triggers.c:161 ../src/triggers.c:162 ../src/triggers.c:163 #: ../src/triggers.c:164 ../src/triggers.c:165 ../src/triggers.c:166 #: ../src/triggers.c:167 ../src/aliases.c:197 ../src/aliases.c:198 #: ../src/aliases.c:199 ../src/macros.c:167 ../src/timers.c:225 #: ../src/timers.c:226 ../src/hooks.c:206 ../src/perlscript.c:3449 msgid "y" msgstr "" #: ../src/triggers.c:161 ../src/triggers.c:162 ../src/triggers.c:163 #: ../src/triggers.c:164 ../src/triggers.c:165 ../src/triggers.c:166 #: ../src/triggers.c:167 ../src/aliases.c:197 ../src/aliases.c:198 #: ../src/aliases.c:199 ../src/macros.c:167 ../src/timers.c:225 #: ../src/timers.c:226 ../src/hooks.c:206 ../src/perlscript.c:3449 msgid "n" msgstr "" #: ../src/triggers.c:361 ../src/kildclient.ui:1918 msgid "No" msgstr "" #: ../src/triggers.c:361 ../src/kildclient.ui:1921 msgid "Yes" msgstr "" #: ../src/aliases.c:175 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "" #: ../src/macros.c:143 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "" #: ../src/timers.c:194 msgid "Num Ena Temp Int " msgstr "" #: ../src/timers.c:198 msgid "Count " msgstr "" #: ../src/permanentvariables.c:115 #, c-format msgid "" "Could not open file '%s': %s\n" "Variables were not saved." msgstr "" #: ../src/hooks.c:60 ../src/hooks.c:442 #, c-format msgid "hook: Invalid event '%s'\n" msgstr "" #: ../src/hooks.c:76 ../src/hooks.c:225 ../share/kildclient.pl:885 msgid "No such hook" msgstr "" #: ../src/hooks.c:191 #, c-format msgid "Hooks for '%s':\n" msgstr "" #: ../src/hooks.c:192 msgid "Num Ena Action" msgstr "" #: ../src/hooks.c:230 #, c-format msgid "" "Hook number %d for event %s\n" " Name: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" #: ../src/hooks.c:236 ../src/perlscript.c:1769 ../src/perlscript.c:2272 #: ../src/perlscript.c:2582 ../src/perlscript.c:2870 msgid "Not set" msgstr "" #: ../src/hooks.c:238 ../src/perlscript.c:1772 ../src/perlscript.c:1773 #: ../src/perlscript.c:1774 ../src/perlscript.c:1775 ../src/perlscript.c:1776 #: ../src/perlscript.c:1777 ../src/perlscript.c:1778 ../src/perlscript.c:2275 #: ../src/perlscript.c:2276 ../src/perlscript.c:2277 ../src/perlscript.c:2585 #: ../src/perlscript.c:2874 ../src/perlscript.c:2875 ../src/perlscript.c:3487 msgid "yes" msgstr "" #: ../src/hooks.c:238 ../src/perlscript.c:1772 ../src/perlscript.c:1773 #: ../src/perlscript.c:1774 ../src/perlscript.c:1775 ../src/perlscript.c:1776 #: ../src/perlscript.c:1777 ../src/perlscript.c:1778 ../src/perlscript.c:2275 #: ../src/perlscript.c:2276 ../src/perlscript.c:2277 ../src/perlscript.c:2585 #: ../src/perlscript.c:2874 ../src/perlscript.c:2875 ../src/perlscript.c:3487 msgid "no" msgstr "" #: ../src/log.c:121 msgid "File name not specified." msgstr "" #: ../src/log.c:187 #, c-format msgid "Could not open log file: %s." msgstr "" #: ../src/plugins.c:101 ../src/plugins.c:160 #, c-format msgid "Failed loading file %s: %s" msgstr "" #: ../src/cmdhistory.c:273 msgid "No command selected." msgstr "" #: ../src/cmdhistory.c:277 msgid "More than one command selected." msgstr "" #: ../src/cmdhistory.c:466 msgid "Enter some text to search for." msgstr "" #: ../src/cmdhistory.c:491 msgid "Use the Find button to find the first result." msgstr "" #: ../src/cmdhistory.c:540 msgid "Command not found." msgstr "" #: ../src/util.c:180 msgid "KildClient error" msgstr "" #: ../src/perlscript.c:509 ../src/perlscript.c:515 ../src/perlscript.c:522 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "" #: ../src/perlscript.c:706 ../src/perlscript.c:723 ../src/perlscript.c:785 #: ../src/perlscript.c:818 ../src/perlscript.c:1224 ../src/perlscript.c:1287 #: ../src/perlscript.c:1389 ../src/perlscript.c:1409 ../src/perlscript.c:1433 #: ../src/perlscript.c:1461 ../src/perlscript.c:1470 ../src/perlscript.c:2010 #: ../src/perlscript.c:2019 ../src/perlscript.c:2198 ../src/perlscript.c:2373 #: ../src/perlscript.c:2382 ../src/perlscript.c:2661 ../src/perlscript.c:2670 #: ../src/perlscript.c:2945 ../src/perlscript.c:2999 ../src/perlscript.c:3044 #: ../src/perlscript.c:3109 ../src/perlscript.c:3120 ../src/perlscript.c:3212 #: ../src/perlscript.c:3536 ../src/kcwin.c:96 #, c-format msgid "%s: Too few arguments" msgstr "" #: ../src/perlscript.c:751 #, c-format msgid "%s: Argument must be numeric" msgstr "" #: ../src/perlscript.c:799 ../src/perlscript.c:831 #, c-format msgid "%s: No such world" msgstr "" #: ../src/perlscript.c:866 msgid "World saved." msgstr "" #: ../src/perlscript.c:1120 ../src/perlscript.c:1135 ../src/perlscript.c:1145 #: ../src/perlscript.c:1345 ../share/kildclient.pl:1324 #, c-format, perl-format msgid "%s: This is an internal function, do not call directly." msgstr "" #: ../src/perlscript.c:1124 ../src/perlscript.c:1592 ../src/perlscript.c:2121 #: ../src/perlscript.c:2497 ../src/perlscript.c:2691 ../src/perlscript.c:3173 #, c-format msgid "%s: Wrong argument type" msgstr "" #: ../src/perlscript.c:1355 ../src/perlscript.c:1361 #, c-format msgid "Protocol %s not enabled." msgstr "" #: ../src/perlscript.c:1366 ../share/kildclient.pl:1166 msgid "Unknown protocol" msgstr "" #: ../src/perlscript.c:1484 ../src/perlscript.c:1752 ../share/kildclient.pl:881 msgid "No such trigger" msgstr "" #: ../src/perlscript.c:1502 ../src/perlscript.c:2051 ../src/perlscript.c:2426 #: ../src/perlscript.c:3132 #, c-format msgid "%s: Too many string arguments" msgstr "" #: ../src/perlscript.c:1525 ../src/perlscript.c:2074 #, c-format msgid "%s: Pattern given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:1537 ../src/perlscript.c:2475 ../src/perlscript.c:3152 #, c-format msgid "%s: Action given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:1583 ../src/perlscript.c:2112 ../src/perlscript.c:2488 #: ../src/perlscript.c:3165 #, c-format msgid "%s: Wrong type of reference" msgstr "" #: ../src/perlscript.c:1603 #, c-format msgid "%s: Pattern not specified, not creating" msgstr "" #: ../src/perlscript.c:1612 #, c-format msgid "%s: Action not specified, and isn't gag, not creating" msgstr "" #: ../src/perlscript.c:1641 msgid "Trigger added." msgstr "" #: ../src/perlscript.c:1646 msgid "Trigger modified." msgstr "" #: ../src/perlscript.c:1671 #, c-format msgid "%s: Invalid target" msgstr "" #: ../src/perlscript.c:1681 #, c-format msgid "%s: Invalid fg color" msgstr "" #: ../src/perlscript.c:1691 #, c-format msgid "%s: Invalid bg color" msgstr "" #: ../src/perlscript.c:1701 #, c-format msgid "%s: Invalid underline style" msgstr "" #: ../src/perlscript.c:1757 #, 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:1781 #, 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:2033 ../src/perlscript.c:2259 ../share/kildclient.pl:882 msgid "No such alias" msgstr "" #: ../src/perlscript.c:2086 #, c-format msgid "%s: Substitution given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:2132 msgid "alias: Not creating alias without pattern" msgstr "" #: ../src/perlscript.c:2140 msgid "alias: Not creating alias without substitution" msgstr "" #: ../src/perlscript.c:2168 msgid "Alias added." msgstr "" #: ../src/perlscript.c:2173 msgid "Alias modified." msgstr "" #: ../src/perlscript.c:2264 #, 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:2344 msgid "Press a key to get its keycode." msgstr "" #: ../src/perlscript.c:2396 ../src/perlscript.c:2570 ../share/kildclient.pl:883 msgid "No such macro" msgstr "" #: ../src/perlscript.c:2415 ../src/perlscript.c:2463 #, c-format msgid "%s: Invalid key code" msgstr "" #: ../src/perlscript.c:2452 #, c-format msgid "%s: Keycode given twice, using the named attribute one" msgstr "" #: ../src/perlscript.c:2508 #, c-format msgid "%s: Keycode not specified, not creating" msgstr "" #: ../src/perlscript.c:2515 ../src/perlscript.c:2782 #, c-format msgid "%s: Action not specified, not creating" msgstr "" #: ../src/perlscript.c:2534 msgid "Macro added." msgstr "" #: ../src/perlscript.c:2539 msgid "Macro modified." msgstr "" #: ../src/perlscript.c:2576 #, c-format msgid "" "Macro number %d\n" " Name: %s\n" " Key code: %s\n" " Action: %s\n" " Enabled: %s\n" msgstr "" #: ../src/perlscript.c:2685 ../src/perlscript.c:2857 ../share/kildclient.pl:884 msgid "No such timer" msgstr "" #: ../src/perlscript.c:2710 #, c-format msgid "%s: Interval must be numeric" msgstr "" #: ../src/perlscript.c:2723 #, c-format msgid "%s: Count must be numeric" msgstr "" #: ../src/perlscript.c:2754 #, c-format msgid "%s: Interval not specified, not creating" msgstr "" #: ../src/perlscript.c:2761 #, c-format msgid "%s: Cannot create timer with negative interval" msgstr "" #: ../src/perlscript.c:2822 msgid "Timer added." msgstr "" #: ../src/perlscript.c:2827 msgid "Timer modified." msgstr "" #: ../src/perlscript.c:2862 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %.3f\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" #: ../src/perlscript.c:2953 #, c-format msgid "" "%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent" msgstr "" #: ../src/perlscript.c:2962 #, c-format msgid "%s: %s is already permanent" msgstr "" #: ../src/perlscript.c:2976 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "" #: ../src/perlscript.c:3018 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "" #: ../src/perlscript.c:3022 #, c-format msgid "%s: %s is not permanent" msgstr "" #: ../src/perlscript.c:3075 msgid "Permanent variables" msgstr "" #: ../src/perlscript.c:3187 msgid "Hook defined." msgstr "" #: ../src/perlscript.c:3191 msgid "Hook modified." msgstr "" #: ../src/perlscript.c:3296 msgid "Logging stopped." msgstr "" #: ../src/perlscript.c:3428 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "" #: ../src/perlscript.c:3471 msgid "No such plugin" msgstr "" #: ../src/perlscript.c:3476 #, 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.ui:48 msgid "Edit timer" msgstr "" #: ../src/kildclient.ui:107 ../src/kildclient.ui:385 ../src/kildclient.ui:602 #: ../src/kildclient.ui:747 ../src/kildclient.ui:908 ../src/kildclient.ui:1112 #: ../src/dlgEditWorld.ui:229 ../src/dlgEditWorld.ui:2855 msgid "_Name:" msgstr "" #: ../src/kildclient.ui:120 msgid "Enter optionally a descriptive name for the timer" msgstr "" #: ../src/kildclient.ui:132 msgid "_Interval:" msgstr "" #: ../src/kildclient.ui:149 msgid "Specify the interval, in seconds, between timer activations" msgstr "" #: ../src/kildclient.ui:165 msgid "seconds" msgstr "" #: ../src/kildclient.ui:183 msgid "_Repeat count:" msgstr "" #: ../src/kildclient.ui:200 msgid "" "Specify how many times this timer should run before being disabled or deleted" msgstr "" #: ../src/kildclient.ui:215 msgid "(-1 to repeat indefinitely)" msgstr "" #: ../src/kildclient.ui:233 ../src/kildclient.ui:772 ../src/kildclient.ui:970 #: ../src/kildclient.ui:1173 msgid "_Action:" msgstr "" #: ../src/kildclient.ui:246 msgid "Enter the action to be executed whenever the timer fires" msgstr "" #: ../src/kildclient.ui:256 msgid "" "_Temporary (will be deleted automatically when its repeat count reaches 0)" msgstr "" #: ../src/kildclient.ui:259 msgid "Check to have the timer deleted after its repeat count has reached 0" msgstr "" #: ../src/kildclient.ui:271 ../src/kildclient.ui:485 ../src/kildclient.ui:795 #: ../src/kildclient.ui:993 ../src/kildclient.ui:1297 msgid "_Enabled" msgstr "" #: ../src/kildclient.ui:274 msgid "Check to make the timer enabled; only enabled timers are run" msgstr "" #: ../src/kildclient.ui:287 ../src/kildclient.ui:501 ../src/kildclient.ui:811 #: ../src/kildclient.ui:1009 ../src/kildclient.ui:1313 msgid "Note:" msgstr "" #: ../src/kildclient.ui:299 ../src/kildclient.ui:513 ../src/kildclient.ui:823 #: ../src/kildclient.ui:1021 ../src/kildclient.ui:1325 msgid "" "This object belongs to a plugin. Changes made here will not be saved " "in the plugin." msgstr "" #: ../src/kildclient.ui:326 msgid "Edit alias" msgstr "" #: ../src/kildclient.ui:398 msgid "Enter optionally a descriptive name for the alias" msgstr "" #: ../src/kildclient.ui:410 ../src/kildclient.ui:1136 msgid "_Pattern:" msgstr "" #: ../src/kildclient.ui:423 msgid "Enter the pattern to match against typed commands" msgstr "" #: ../src/kildclient.ui:433 ../src/kildclient.ui:1159 msgid "_Ignore case when matching" msgstr "" #: ../src/kildclient.ui:447 msgid "_Substitution:" msgstr "" #: ../src/kildclient.ui:460 msgid "Enter the substitution to be executed" msgstr "" #: ../src/kildclient.ui:470 msgid "E_val substitution as Perl statement" msgstr "" #: ../src/kildclient.ui:473 msgid "Check to have the substitution be executed in a s///e construction" msgstr "" #: ../src/kildclient.ui:488 msgid "Check to make the alias enabled; only enabled aliases are tried" msgstr "" #: ../src/kildclient.ui:543 msgid "Edit character information" msgstr "" #: ../src/kildclient.ui:615 msgid "Enter the character's name for automatic login" msgstr "" #: ../src/kildclient.ui:627 msgid "_Password:" msgstr "" #: ../src/kildclient.ui:640 msgid "Enter the character's password for automatic login" msgstr "" #: ../src/kildclient.ui:666 msgid "Edit hook" msgstr "" #: ../src/kildclient.ui:725 msgid "Event:" msgstr "" #: ../src/kildclient.ui:760 msgid "Enter optionally a descriptive name for the hook" msgstr "" #: ../src/kildclient.ui:785 msgid "Enter the action to be run when the event happens" msgstr "" #: ../src/kildclient.ui:798 msgid "Check to make the hook enabled; only enabled hooks are run" msgstr "" #: ../src/kildclient.ui:850 msgid "Edit macro" msgstr "" #: ../src/kildclient.ui:921 msgid "Enter optionally a descriptive name for the macro" msgstr "" #: ../src/kildclient.ui:933 msgid "_Key:" msgstr "" #: ../src/kildclient.ui:946 msgid "Press the key that will be used to run the macro" msgstr "" #: ../src/kildclient.ui:958 msgid "" "Press the key that will be used to activate the macro while the cursor is in " "the text box." msgstr "" #: ../src/kildclient.ui:983 msgid "Enter the action to be run when the key is pressed" msgstr "" #: ../src/kildclient.ui:996 msgid "Check to make the macro enabled; only enabled macros are run" msgstr "" #: ../src/kildclient.ui:1050 ../src/kildclient.ui:1927 msgid "Enter optionally a descriptive name for the trigger" msgstr "" #: ../src/kildclient.ui:1052 msgid "Edit trigger" msgstr "" #: ../src/kildclient.ui:1149 msgid "Enter the pattern to match against received lines" msgstr "" #: ../src/kildclient.ui:1186 msgid "Enter the action that will be run when a match happens" msgstr "" #: ../src/kildclient.ui:1196 msgid "Omit (_gag) from output" msgstr "" #: ../src/kildclient.ui:1199 msgid "Check to make the matched line not be printed in the main output window" msgstr "" #: ../src/kildclient.ui:1211 msgid "Omit (gag) from _log file" msgstr "" #: ../src/kildclient.ui:1214 msgid "Check to make the matched line not be printed in the log file" msgstr "" #: ../src/kildclient.ui:1226 msgid "_Keep executing other triggers after this this one matches" msgstr "" #: ../src/kildclient.ui:1229 msgid "" "Check to make this trigger not prevent further triggers from being tried, if " "it matches" msgstr "" #: ../src/kildclient.ui:1241 msgid "_Rewriter trigger" msgstr "" #: ../src/kildclient.ui:1244 msgid "Check to make this trigger a rewriter trigger" msgstr "" #: ../src/kildclient.ui:1260 msgid "C_hange style" msgstr "" #: ../src/kildclient.ui:1275 msgid "C_onfigure..." msgstr "" #: ../src/kildclient.ui:1300 msgid "Check to make the trigger enabled; only enabled triggers are tried" msgstr "" #: ../src/kildclient.ui:1355 msgid "Permenent variable" msgstr "" #: ../src/kildclient.ui:1411 msgid "_Name of variable to make permanent:" msgstr "" #: ../src/kildclient.ui:1425 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.ui:1467 msgid "_Triggers" msgstr "" #: ../src/kildclient.ui:1480 msgid "_Aliases" msgstr "" #: ../src/kildclient.ui:1493 msgid "_Macros" msgstr "" #: ../src/kildclient.ui:1506 msgid "T_imers" msgstr "" #: ../src/kildclient.ui:1519 msgid "_Permanent variables" msgstr "" #: ../src/kildclient.ui:1532 msgid "OnCo_nnect hooks" msgstr "" #: ../src/kildclient.ui:1545 msgid "On_Disconnect hooks" msgstr "" #: ../src/kildclient.ui:1558 msgid "On_ReceivedText hooks" msgstr "" #: ../src/kildclient.ui:1571 msgid "On_SentCommand hooks" msgstr "" #: ../src/kildclient.ui:1584 msgid "On_GetFocus hooks" msgstr "" #: ../src/kildclient.ui:1597 msgid "On_LoseFocus hooks" msgstr "" #: ../src/kildclient.ui:1610 msgid "OnClos_eConnected hooks" msgstr "" #: ../src/kildclient.ui:1623 msgid "OnSer_verData hooks" msgstr "" #: ../src/kildclient.ui:1648 msgid "Items to e_xport" msgstr "" #: ../src/kildclient.ui:1709 ../src/dlgSelectWorld.ui:125 #: ../src/dlgEditWorld.ui:604 msgid "_New" msgstr "" #: ../src/kildclient.ui:1722 ../src/wndmain.ui:158 ../src/dlgSelectWorld.ui:138 #: ../src/dlgEditWorld.ui:619 msgid "_Edit" msgstr "" #: ../src/kildclient.ui:1750 msgid "_Import" msgstr "" #: ../src/kildclient.ui:1763 msgid "E_xport" msgstr "" #: ../src/kildclient.ui:1777 ../src/dlgEditWorld.ui:649 #: ../src/dlgEditWorld.ui:3305 msgid "_Up" msgstr "" #: ../src/kildclient.ui:1791 ../src/dlgEditWorld.ui:664 #: ../src/dlgEditWorld.ui:3320 msgid "Do_wn" msgstr "" #: ../src/kildclient.ui:1830 ../src/kildclient.ui:1895 #: ../src/kildclient.ui:1915 msgid "Do not change" msgstr "" #: ../src/kildclient.ui:1833 ../src/dlgPreferences.ui:42 msgid "Black" msgstr "" #: ../src/kildclient.ui:1836 ../src/dlgPreferences.ui:45 msgid "Red" msgstr "" #: ../src/kildclient.ui:1839 ../src/dlgPreferences.ui:48 msgid "Green" msgstr "" #: ../src/kildclient.ui:1842 ../src/dlgPreferences.ui:51 msgid "Yellow" msgstr "" #: ../src/kildclient.ui:1845 ../src/dlgPreferences.ui:54 msgid "Blue" msgstr "" #: ../src/kildclient.ui:1848 ../src/dlgPreferences.ui:57 msgid "Magenta" msgstr "" #: ../src/kildclient.ui:1851 ../src/dlgPreferences.ui:60 msgid "Cyan" msgstr "" #: ../src/kildclient.ui:1854 ../src/dlgPreferences.ui:63 msgid "White" msgstr "" #: ../src/kildclient.ui:1857 ../src/dlgPreferences.ui:66 msgid "Default" msgstr "" #: ../src/kildclient.ui:1860 ../src/dlgPreferences.ui:69 msgid "Black (bold)" msgstr "" #: ../src/kildclient.ui:1863 ../src/dlgPreferences.ui:72 msgid "Red (bold)" msgstr "" #: ../src/kildclient.ui:1866 ../src/dlgPreferences.ui:75 msgid "Green (bold)" msgstr "" #: ../src/kildclient.ui:1869 ../src/dlgPreferences.ui:78 msgid "Yellow (bold)" msgstr "" #: ../src/kildclient.ui:1872 ../src/dlgPreferences.ui:81 msgid "Blue (bold)" msgstr "" #: ../src/kildclient.ui:1875 ../src/dlgPreferences.ui:84 msgid "Magenta (bold)" msgstr "" #: ../src/kildclient.ui:1878 ../src/dlgPreferences.ui:87 msgid "Cyan (bold)" msgstr "" #: ../src/kildclient.ui:1881 ../src/dlgPreferences.ui:90 msgid "White (bold)" msgstr "" #: ../src/kildclient.ui:1884 ../src/dlgPreferences.ui:93 msgid "Default (bold)" msgstr "" #: ../src/kildclient.ui:1901 msgid "Single" msgstr "" #: ../src/kildclient.ui:1904 msgid "Double" msgstr "" #: ../src/kildclient.ui:1929 msgid "Change style" msgstr "" #: ../src/kildclient.ui:1987 msgid "Apply to:" msgstr "" #: ../src/kildclient.ui:1998 msgid "_Foreground:" msgstr "" #: ../src/kildclient.ui:2026 msgid "_Background:" msgstr "" #: ../src/kildclient.ui:2054 msgid "_Italic:" msgstr "" #: ../src/kildclient.ui:2082 msgid "_Striked-thru:" msgstr "" #: ../src/kildclient.ui:2110 msgid "_Underline:" msgstr "" #: ../src/kildclient.ui:2141 msgid "The whole _line" msgstr "" #: ../src/kildclient.ui:2155 msgid "The whole matched _text" msgstr "" #: ../src/kildclient.ui:2174 msgid "The _matched substring number" msgstr "" #: ../src/wndmain.ui:40 msgid "_World" msgstr "" #: ../src/wndmain.ui:49 msgid "_Open..." msgstr "" #: ../src/wndmain.ui:66 msgid "_Disconnect" msgstr "" #: ../src/wndmain.ui:74 msgid "Connect to _another..." msgstr "" #: ../src/wndmain.ui:95 msgid "_Edit..." msgstr "" #: ../src/wndmain.ui:112 msgid "S_tatistics..." msgstr "" #: ../src/wndmain.ui:125 ../src/wndmain.ui:245 msgid "_Previous" msgstr "" #: ../src/wndmain.ui:133 ../src/wndmain.ui:254 msgid "_Next" msgstr "" #: ../src/wndmain.ui:167 msgid "Cu_t" msgstr "" #: ../src/wndmain.ui:176 msgid "_Copy" msgstr "" #: ../src/wndmain.ui:185 msgid "_Paste" msgstr "" #: ../src/wndmain.ui:207 ../src/dlgCmdHistory.ui:178 msgid "_Find" msgstr "" #: ../src/wndmain.ui:229 msgid "_Input" msgstr "" #: ../src/wndmain.ui:237 ../src/dlgEditWorld.ui:3101 ../src/dlgMLSend.ui:157 msgid "C_lear" msgstr "" #: ../src/wndmain.ui:263 msgid "Find p_revious" msgstr "" #: ../src/wndmain.ui:281 msgid "Command _history..." msgstr "" #: ../src/wndmain.ui:295 msgid "_Multi-line send..." msgstr "" #: ../src/wndmain.ui:309 msgid "_Test triggers..." msgstr "" #: ../src/wndmain.ui:321 msgid "_Preferences" msgstr "" #: ../src/wndmain.ui:330 msgid "Disable _triggers" msgstr "" #: ../src/wndmain.ui:339 msgid "Disable _aliases" msgstr "" #: ../src/wndmain.ui:348 msgid "Disable _macros" msgstr "" #: ../src/wndmain.ui:357 msgid "Disable t_imers" msgstr "" #: ../src/wndmain.ui:371 msgid "_Debug matches" msgstr "" #: ../src/wndmain.ui:384 msgid "_Preferences..." msgstr "" #: ../src/wndmain.ui:392 msgid "Edit default _world..." msgstr "" #: ../src/wndmain.ui:404 msgid "_Display" msgstr "" #: ../src/wndmain.ui:413 msgid "_Split window" msgstr "" #: ../src/wndmain.ui:426 ../src/dlgEditWorld.ui:3198 msgid "_Help" msgstr "" #: ../src/wndmain.ui:434 msgid "_Manual" msgstr "" #: ../src/wndmain.ui:443 msgid "_About" msgstr "" #: ../src/dlgSelectWorld.ui:27 msgid "Connect to" msgstr "" #: ../src/dlgSelectWorld.ui:56 msgid "C_onnect" msgstr "" #: ../src/dlgSelectWorld.ui:78 msgid "_Select a saved world:" msgstr "" #: ../src/dlgSelectWorld.ui:183 msgid "Or connect d_irectly:" msgstr "" #: ../src/dlgSelectWorld.ui:206 ../src/dlgEditWorld.ui:242 msgid "_Host:" msgstr "" #: ../src/dlgSelectWorld.ui:219 ../src/dlgEditWorld.ui:255 msgid "_Port:" msgstr "" #: ../src/dlgPreferences.ui:104 ../src/dlgEditWorld.ui:101 msgid "No proxy" msgstr "" #: ../src/dlgPreferences.ui:107 ../src/dlgEditWorld.ui:104 msgid "SOCKS4" msgstr "" #: ../src/dlgPreferences.ui:110 ../src/dlgEditWorld.ui:107 msgid "SOCKS5" msgstr "" #: ../src/dlgPreferences.ui:113 ../src/dlgEditWorld.ui:110 msgid "HTTP" msgstr "" #: ../src/dlgPreferences.ui:124 msgid "Left" msgstr "" #: ../src/dlgPreferences.ui:127 msgid "Right" msgstr "" #: ../src/dlgPreferences.ui:130 msgid "Top" msgstr "" #: ../src/dlgPreferences.ui:133 msgid "Bottom" msgstr "" #: ../src/dlgPreferences.ui:140 msgid "Preferences" msgstr "" #: ../src/dlgPreferences.ui:188 msgid "Colors used by KildClient" msgstr "" #: ../src/dlgPreferences.ui:208 msgid "_Informative messages:" msgstr "" #: ../src/dlgPreferences.ui:239 msgid "Command _echo:" msgstr "" #: ../src/dlgPreferences.ui:278 msgid "Window configuration" msgstr "" #: ../src/dlgPreferences.ui:298 msgid "_Tab position:" msgstr "" #: ../src/dlgPreferences.ui:329 msgid "_Hide tabs if only one world is open" msgstr "" #: ../src/dlgPreferences.ui:333 msgid "" "If this is checked, when there is only one open world no tabs will be shown" msgstr "" #: ../src/dlgPreferences.ui:346 msgid "_Flash window when new text is received" msgstr "" #: ../src/dlgPreferences.ui:371 msgid "Appearance" msgstr "" #: ../src/dlgPreferences.ui:386 msgid "Sending delays" msgstr "" #: ../src/dlgPreferences.ui:406 msgid "Enter the default parameters for sending multiple lines or commands:" msgstr "" #: ../src/dlgPreferences.ui:422 msgid "_Number of lines/commands to send at once:" msgstr "" #: ../src/dlgPreferences.ui:462 msgid "_Delay between each group of lines/commands:" msgstr "" #: ../src/dlgPreferences.ui:510 msgid "Sending" msgstr "" #: ../src/dlgPreferences.ui:527 msgid "Audio player" msgstr "" #: ../src/dlgPreferences.ui:547 #, c-format msgid "" "Enter the command to run an _audio player program. %s will be substituted by " "the file path:" msgstr "" #: ../src/dlgPreferences.ui:562 msgid "Specify the command used to play sound files." msgstr "" #: ../src/dlgPreferences.ui:587 msgid "External programs" msgstr "" #: ../src/dlgPreferences.ui:603 ../src/dlgEditWorld.ui:331 msgid "Proxy" msgstr "" #: ../src/dlgPreferences.ui:627 ../src/dlgEditWorld.ui:355 msgid "Proxy _type:" msgstr "" #: ../src/dlgPreferences.ui:669 ../src/dlgEditWorld.ui:397 msgid "Server _address:" msgstr "" #: ../src/dlgPreferences.ui:682 ../src/dlgEditWorld.ui:453 msgid "_Username:" msgstr "" #: ../src/dlgPreferences.ui:715 ../src/dlgEditWorld.ui:420 msgid "Server _port:" msgstr "" #: ../src/dlgPreferences.ui:728 ../src/dlgEditWorld.ui:466 msgid "Pass_word:" msgstr "" #: ../src/dlgPreferences.ui:781 msgid "Proxy" msgstr "" #: ../src/dlgStatistics.ui:27 msgid "Statistics" msgstr "" #: ../src/dlgStatistics.ui:70 ../src/dlgStatistics.ui:81 #: ../src/dlgStatistics.ui:223 ../src/dlgStatistics.ui:338 #: ../src/dlgStatistics.ui:445 ../src/dlgStatistics.ui:456 #: ../src/dlgStatistics.ui:467 ../src/dlgStatistics.ui:478 #: ../src/dlgStatistics.ui:489 ../src/dlgStatistics.ui:511 #: ../src/dlgStatistics.ui:544 ../src/dlgStatistics.ui:555 #: ../src/dlgStatistics.ui:577 ../src/dlgStatistics.ui:610 #: ../src/dlgStatistics.ui:621 msgid "N/A" msgstr "" #: ../src/dlgStatistics.ui:92 msgid "Proxy port:" msgstr "" #: ../src/dlgStatistics.ui:103 msgid "Proxy host:" msgstr "" #: ../src/dlgStatistics.ui:125 msgid "Proxy type:" msgstr "" #: ../src/dlgStatistics.ui:136 msgid "World name:" msgstr "" #: ../src/dlgStatistics.ui:147 msgid "Host:" msgstr "" #: ../src/dlgStatistics.ui:158 msgid "Port:" msgstr "" #: ../src/dlgStatistics.ui:169 msgid "Connection time:" msgstr "" #: ../src/dlgStatistics.ui:180 msgid "Idle time:" msgstr "" #: ../src/dlgStatistics.ui:201 msgid "Compression used:" msgstr "" #: ../src/dlgStatistics.ui:212 msgid "Bytes received (compressed):" msgstr "" #: ../src/dlgStatistics.ui:234 msgid "Bytes received (decompressed):" msgstr "" #: ../src/dlgStatistics.ui:245 msgid "Compression ratio:" msgstr "" #: ../src/dlgStatistics.ui:256 msgid "Lines received:" msgstr "" #: ../src/dlgStatistics.ui:369 msgid "Key exchange:" msgstr "" #: ../src/dlgStatistics.ui:380 msgid "SSL protocol used:" msgstr "" #: ../src/dlgStatistics.ui:391 msgid "Compression algorithm:" msgstr "" #: ../src/dlgStatistics.ui:402 msgid "Certificate type:" msgstr "" #: ../src/dlgStatistics.ui:413 msgid "Cipher:" msgstr "" #: ../src/dlgStatistics.ui:424 msgid "MAC:" msgstr "" #: ../src/dlgStatistics.ui:500 msgid "Hostname:" msgstr "" #: ../src/dlgStatistics.ui:522 msgid "Valid since:" msgstr "" #: ../src/dlgStatistics.ui:533 msgid "Expiration:" msgstr "" #: ../src/dlgStatistics.ui:566 msgid "Fingerprint:" msgstr "" #: ../src/dlgStatistics.ui:588 msgid "Subject's DN:" msgstr "" #: ../src/dlgStatistics.ui:599 msgid "Issuer's DN:" msgstr "" #: ../src/dlgAbout.ui:30 msgid "A mud client with powerful features and support for Perl scripting" msgstr "" #: ../src/dlgAbout.ui:32 msgid "Visit https://www.kildclient.org" msgstr "" #: ../src/dlgEditWorld.ui:81 msgid "No auto-login" msgstr "" #: ../src/dlgEditWorld.ui:98 msgid "Use global settings" msgstr "" #: ../src/dlgEditWorld.ui:117 msgid "Edit world" msgstr "" #: ../src/dlgEditWorld.ui:207 msgid "Connection" msgstr "" #: ../src/dlgEditWorld.ui:268 msgid "Enter a descriptive name for the world" msgstr "" #: ../src/dlgEditWorld.ui:281 msgid "Enter the host to connect to" msgstr "" #: ../src/dlgEditWorld.ui:294 msgid "Enter the port used when connecting" msgstr "" #: ../src/dlgEditWorld.ui:306 msgid "Use _SSL" msgstr "" #: ../src/dlgEditWorld.ui:505 msgid "Auto-login" msgstr "" #: ../src/dlgEditWorld.ui:529 msgid "Connection _style:" msgstr "" #: ../src/dlgEditWorld.ui:567 msgid "Ch_aracters in this mud:" msgstr "" #: ../src/dlgEditWorld.ui:705 ../src/dlgEditWorld.ui:1840 #: ../src/dlgEditWorld.ui:2502 msgid "Font" msgstr "" #: ../src/dlgEditWorld.ui:725 msgid "Select the font used in the _main screen:" msgstr "" #: ../src/dlgEditWorld.ui:741 msgid "Select the font used in the main output screen" msgstr "" #: ../src/dlgEditWorld.ui:753 msgid "Use _bold font for highlighted colors (instead of just highlighting)" msgstr "" #: ../src/dlgEditWorld.ui:757 msgid "" "Check if you want the highlighted ANSI colors to be displayed in bold also" msgstr "" #: ../src/dlgEditWorld.ui:779 msgid "Word wrap" msgstr "" #: ../src/dlgEditWorld.ui:798 msgid "_Wrap lines at word boundaries" msgstr "" #: ../src/dlgEditWorld.ui:802 msgid "Check if you want lines to be wrapped at word boundaries" msgstr "" #: ../src/dlgEditWorld.ui:820 msgid "_Indent wrapped lines by" msgstr "" #: ../src/dlgEditWorld.ui:850 msgid "pixels" msgstr "" #: ../src/dlgEditWorld.ui:869 msgid "Wrap lines at full _screen width" msgstr "" #: ../src/dlgEditWorld.ui:889 msgid "Maximum line width in _characters:" msgstr "" #: ../src/dlgEditWorld.ui:937 msgid "Scrolling" msgstr "" #: ../src/dlgEditWorld.ui:956 msgid "Sc_roll on output" msgstr "" #: ../src/dlgEditWorld.ui:960 msgid "" "Check to have the main window scroll to the end whenever new output comes" msgstr "" #: ../src/dlgEditWorld.ui:978 msgid "_Lines to save in scrollback buffer:" msgstr "" #: ../src/dlgEditWorld.ui:991 msgid "" "Specify the number of lines of output that can be seen with by scrolling the " "window" msgstr "" #: ../src/dlgEditWorld.ui:1022 msgid "Tooltips" msgstr "" #: ../src/dlgEditWorld.ui:1041 msgid "Display _tooltips with the time when the line was received" msgstr "" #: ../src/dlgEditWorld.ui:1045 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.ui:1067 msgid "Name display" msgstr "" #: ../src/dlgEditWorld.ui:1086 msgid "I_dentify as 'World name'" msgstr "" #: ../src/dlgEditWorld.ui:1101 msgid "I_dentify as 'World name - Character'" msgstr "" #: ../src/dlgEditWorld.ui:1116 msgid "I_dentify as 'Character - World name'" msgstr "" #: ../src/dlgEditWorld.ui:1135 msgid "C_ustom: " msgstr "" #: ../src/dlgEditWorld.ui:1169 msgid "" "Use %Kw to represent the world's name, and %Kc to represent the auto-logon " "character name" msgstr "" #: ../src/dlgEditWorld.ui:1203 msgid "Ansi colors" msgstr "" #: ../src/dlgEditWorld.ui:1313 msgid "Blac_k" msgstr "" #: ../src/dlgEditWorld.ui:1326 msgid "_Red" msgstr "" #: ../src/dlgEditWorld.ui:1339 msgid "_Green" msgstr "" #: ../src/dlgEditWorld.ui:1352 msgid "_Yellow" msgstr "" #: ../src/dlgEditWorld.ui:1365 msgid "_Blue" msgstr "" #: ../src/dlgEditWorld.ui:1378 msgid "_Magenta" msgstr "" #: ../src/dlgEditWorld.ui:1391 msgid "Cy_an" msgstr "" #: ../src/dlgEditWorld.ui:1404 msgid "_White" msgstr "" #: ../src/dlgEditWorld.ui:1417 msgid "Blac_k (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1430 msgid "_Red (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1443 msgid "_Green (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1456 msgid "_Yellow (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1469 msgid "_Blue (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1482 msgid "_Magenta (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1495 msgid "Cy_an (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1508 msgid "_White (bold)" msgstr "" #: ../src/dlgEditWorld.ui:1647 msgid "Default colors" msgstr "" #: ../src/dlgEditWorld.ui:1691 msgid "_Foreground" msgstr "" #: ../src/dlgEditWorld.ui:1704 msgid "Bold _foreground" msgstr "" #: ../src/dlgEditWorld.ui:1728 msgid "Backgroun_d" msgstr "" #: ../src/dlgEditWorld.ui:1752 msgid "Bold backgroun_d" msgstr "" #: ../src/dlgEditWorld.ui:1785 msgid "Revert to default colors" msgstr "" #: ../src/dlgEditWorld.ui:1804 msgid "Re_vert to default colors" msgstr "" #: ../src/dlgEditWorld.ui:1808 msgid "Click to revert all colors to their built-in defaults" msgstr "" #: ../src/dlgEditWorld.ui:1860 msgid "_Select the font used in the status bar:" msgstr "" #: ../src/dlgEditWorld.ui:1895 msgid "Time display" msgstr "" #: ../src/dlgEditWorld.ui:1915 msgid "Co_nnected time:" msgstr "" #: ../src/dlgEditWorld.ui:1935 ../src/dlgEditWorld.ui:2017 msgid "Do not display" msgstr "" #: ../src/dlgEditWorld.ui:1939 msgid "Select if you do not want the connection time to be displayed" msgstr "" #: ../src/dlgEditWorld.ui:1953 ../src/dlgEditWorld.ui:2035 msgid "Display as hours, minutes and seconds" msgstr "" #: ../src/dlgEditWorld.ui:1957 msgid "" "Select if you want the connection time to be displayed in hours, minutes and " "seconds" msgstr "" #: ../src/dlgEditWorld.ui:1971 ../src/dlgEditWorld.ui:2053 msgid "Display as seconds" msgstr "" #: ../src/dlgEditWorld.ui:1975 msgid "Select if you want the connection time to be displayed in seconds" msgstr "" #: ../src/dlgEditWorld.ui:1998 msgid "_Idle time:" msgstr "" #: ../src/dlgEditWorld.ui:2021 msgid "Select if you do not want the idle time to be displayed" msgstr "" #: ../src/dlgEditWorld.ui:2039 msgid "" "Select if you want the idle time to be displayed in hours, minutes and " "seconds" msgstr "" #: ../src/dlgEditWorld.ui:2057 msgid "Select if you want the idle time to be displayed in seconds" msgstr "" #: ../src/dlgEditWorld.ui:2071 msgid "Only _reset idle time counter when a command is entered directly" msgstr "" #: ../src/dlgEditWorld.ui:2075 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.ui:2115 msgid "Command entry" msgstr "" #: ../src/dlgEditWorld.ui:2134 msgid "_Keep last typed command in command entry box" msgstr "" #: ../src/dlgEditWorld.ui:2138 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.ui:2150 msgid "_Echo sent commands in main window" msgstr "" #: ../src/dlgEditWorld.ui:2154 msgid "Check to have the sent commands echoed in the main output window" msgstr "" #: ../src/dlgEditWorld.ui:2166 msgid "Store commands _between sessions" msgstr "" #: ../src/dlgEditWorld.ui:2170 msgid "Check to have the command history saved in a file between sessions" msgstr "" #: ../src/dlgEditWorld.ui:2182 msgid "Never _hide the typed text" msgstr "" #: ../src/dlgEditWorld.ui:2186 msgid "" "Check this if the text you type is displayed as black dots in the input box." msgstr "" #: ../src/dlgEditWorld.ui:2203 msgid "_Number of commands to save in history:" msgstr "" #: ../src/dlgEditWorld.ui:2217 msgid "Specify the number of commands that are saved and can be later recalled" msgstr "" #: ../src/dlgEditWorld.ui:2244 msgid "Co_mmand separator:" msgstr "" #: ../src/dlgEditWorld.ui:2257 msgid "Specify the separator for commands typed in the command entry box" msgstr "" #: ../src/dlgEditWorld.ui:2278 msgid "Use single-_line input bar" msgstr "" #: ../src/dlgEditWorld.ui:2300 msgid "Enable _auto-completion" msgstr "" #: ../src/dlgEditWorld.ui:2304 msgid "Check to enable command auto-completion (based on previous commands)" msgstr "" #: ../src/dlgEditWorld.ui:2321 msgid "Acti_vate auto-completion only after" msgstr "" #: ../src/dlgEditWorld.ui:2335 msgid "" "Specify the number of characters that must be typed for command completion " "to start" msgstr "" #: ../src/dlgEditWorld.ui:2351 msgid "characters have been entered" msgstr "" #: ../src/dlgEditWorld.ui:2375 msgid "Use mul_ti-line input bar" msgstr "" #: ../src/dlgEditWorld.ui:2402 msgid "N_umber of lines:" msgstr "" #: ../src/dlgEditWorld.ui:2437 msgid "S_pell check typed text" msgstr "" #: ../src/dlgEditWorld.ui:2457 msgid "Lan_guage:" msgstr "" #: ../src/dlgEditWorld.ui:2522 msgid "Select the _font used in the command entry box:" msgstr "" #: ../src/dlgEditWorld.ui:2557 msgid "Flood prevention" msgstr "" #: ../src/dlgEditWorld.ui:2580 msgid "_Do not allow the same command to be sent" msgstr "" #: ../src/dlgEditWorld.ui:2584 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.ui:2598 msgid "Specify the maximum number of equal commands that can be sent in a row" msgstr "" #: ../src/dlgEditWorld.ui:2614 msgid "times in a _row" msgstr "" #: ../src/dlgEditWorld.ui:2638 msgid "_Send this command:" msgstr "" #: ../src/dlgEditWorld.ui:2651 msgid "" "Enter a command to be sent whenever the specified maximum number of equal " "commands would be sent" msgstr "" #: ../src/dlgEditWorld.ui:2690 msgid "Logging status" msgstr "" #: ../src/dlgEditWorld.ui:2727 msgid "_Start" msgstr "" #: ../src/dlgEditWorld.ui:2742 msgid "_Stop" msgstr "" #: ../src/dlgEditWorld.ui:2768 msgid "_Include the last" msgstr "" #: ../src/dlgEditWorld.ui:2772 msgid "Select to include lines from the main window in the log file." msgstr "" #: ../src/dlgEditWorld.ui:2785 msgid "Inform number of lines to include in the log." msgstr "" #: ../src/dlgEditWorld.ui:2801 msgid "_lines of the scrollback buffer in the log" msgstr "" #: ../src/dlgEditWorld.ui:2829 ../src/dlgEditWorld.ui:3447 msgid "File" msgstr "" #: ../src/dlgEditWorld.ui:2879 msgid "S_elect" msgstr "" #: ../src/dlgEditWorld.ui:2903 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.ui:2925 msgid "Options" msgstr "" #: ../src/dlgEditWorld.ui:2944 msgid "A_utomatically start logging when connected" msgstr "" #: ../src/dlgEditWorld.ui:2949 msgid "" "If this is selected, logging will be automatically started whenever you " "connect to the world." msgstr "" #: ../src/dlgEditWorld.ui:2961 msgid "Prefix lines with _date and/or time" msgstr "" #: ../src/dlgEditWorld.ui:2966 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.ui:2986 msgid "_Format:" msgstr "" #: ../src/dlgEditWorld.ui:3000 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.ui:3011 msgid "_Revert to default" msgstr "" #: ../src/dlgEditWorld.ui:3053 msgid "Scripting" msgstr "" #: ../src/dlgEditWorld.ui:3078 msgid "_Perl file to load:" msgstr "" #: ../src/dlgEditWorld.ui:3142 msgid "Plugins currently loaded" msgstr "" #: ../src/dlgEditWorld.ui:3183 msgid "_Load" msgstr "" #: ../src/dlgEditWorld.ui:3230 msgid "Plugins loaded on startup" msgstr "" #: ../src/dlgEditWorld.ui:3275 msgid "_Add" msgstr "" #: ../src/dlgEditWorld.ui:3363 msgid "MCCP (for compression)" msgstr "" #: ../src/dlgEditWorld.ui:3382 msgid "_Enable if server proposes after connecting" msgstr "" #: ../src/dlgEditWorld.ui:3397 msgid "Enable if server proposes at _any time" msgstr "" #: ../src/dlgEditWorld.ui:3412 msgid "_Disable" msgstr "" #: ../src/dlgEditWorld.ui:3471 msgid "_File:" msgstr "" #: ../src/dlgEditWorld.ui:3506 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.ui:3528 msgid "Character set" msgstr "" #: ../src/dlgEditWorld.ui:3552 msgid "C_haracter set:" msgstr "" #: ../src/dlgEditWorld.ui:3591 msgid "Graphical editors" msgstr "" #: ../src/dlgEditWorld.ui:3610 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "" #: ../src/dlgEditWorld.ui:3614 ../src/dlgEditWorld.ui:3676 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.ui:3627 msgid "_Show items defined by plugins" msgstr "" #: ../src/dlgEditWorld.ui:3631 msgid "" "If checked, triggers, aliases, macros and timers defined in plugins will " "appear in the corresponding World Editor sections." msgstr "" #: ../src/dlgEditWorld.ui:3653 msgid "TCP keep alive" msgstr "" #: ../src/dlgEditWorld.ui:3672 msgid "Enable TCP _keep alive packets" msgstr "" #: ../src/dlgEditWorld.ui:3689 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "" #: ../src/dlgEditWorld.ui:3709 msgid "Input" msgstr "" #: ../src/dlgEditWorld.ui:3728 msgid "_Disable up and down arrow keys for history navigation" msgstr "" #: ../src/dlgEditWorld.ui:3732 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/dlgEditWorld.ui:3749 msgid "Character to run _Perl commands:" msgstr "" #: ../src/dlgEditWorld.ui:3785 msgid "" "Warning: Changing the character to run Perl commands from the default '/' is " "not recommended, because doing so might prevent plugins or other code from " "working, if they use '/' to run Perl commands." msgstr "" #: ../src/dlgTestTriggers.ui:27 msgid "Test triggers" msgstr "" #: ../src/dlgTestTriggers.ui:70 msgid "Enter _line to be matched against the triggers:" msgstr "" #: ../src/dlgTestTriggers.ui:88 msgid "" "The text entered here will be matched against triggers as if it were a line " "coming from the MUD" msgstr "" #: ../src/dlgTestTriggers.ui:99 ../src/dlgMLSend.ui:69 #: ../src/dlgCmdHistory.ui:91 msgid "_Send" msgstr "" #: ../src/dlgTestTriggers.ui:103 msgid "Click the run the triggers against the line." msgstr "" #: ../src/dlgTestTriggers.ui:138 msgid "Number of triggers that matched:" msgstr "" #: ../src/dlgTestTriggers.ui:166 msgid "Commands that would be sent:" msgstr "" #: ../src/dlgTestTriggers.ui:196 msgid "This is what would be printed in the main screen:" msgstr "" #: ../src/dlgTestTriggers.ui:208 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.ui:224 msgid "Would this line be included in the log file?" msgstr "" #: ../src/dlgMLSend.ui:39 msgid "Multi-line send" msgstr "" #: ../src/dlgMLSend.ui:95 msgid "Send this text _initially:" msgstr "" #: ../src/dlgMLSend.ui:115 ../src/dlgMLSend.ui:199 msgid "Enter some text to be sent to the World" msgstr "" #: ../src/dlgMLSend.ui:128 msgid "Then send the c_ontents of this file:" msgstr "" #: ../src/dlgMLSend.ui:179 msgid "_Finally, send this text:" msgstr "" #: ../src/dlgMLSend.ui:222 msgid "Add this to the _beginning of each line:" msgstr "" #: ../src/dlgMLSend.ui:238 msgid "Specify some text to be prepended to each sent line" msgstr "" #: ../src/dlgMLSend.ui:250 msgid "Add this to the _end of each line:" msgstr "" #: ../src/dlgMLSend.ui:266 msgid "Specify some text to be appended to each sent line" msgstr "" #: ../src/dlgMLSend.ui:282 ../src/dlgCmdHistory.ui:253 msgid "_Delay" msgstr "" #: ../src/dlgMLSend.ui:295 msgid "Specify the delay between sending the group of lines" msgstr "" #: ../src/dlgMLSend.ui:310 ../src/dlgCmdHistory.ui:282 msgid "seconds e_ach" msgstr "" #: ../src/dlgMLSend.ui:323 msgid "Specify how many lines are sent at once" msgstr "" #: ../src/dlgMLSend.ui:337 msgid "line(s)" msgstr "" #: ../src/dlgMLSend.ui:355 msgid "_Keep dialog open after sending" msgstr "" #: ../src/dlgCmdHistory.ui:39 msgid "Command history" msgstr "" #: ../src/dlgCmdHistory.ui:56 msgid "_Recall" msgstr "" #: ../src/dlgCmdHistory.ui:61 msgid "Put the selected command in the command entry box" msgstr "" #: ../src/dlgCmdHistory.ui:74 msgid "Reca_ll and close" msgstr "" #: ../src/dlgCmdHistory.ui:79 msgid "Put the selected command in the command entry box and close this dialog" msgstr "" #: ../src/dlgCmdHistory.ui:96 msgid "Send the selected command(s) to the mud" msgstr "" #: ../src/dlgCmdHistory.ui:108 msgid "Se_nd and close" msgstr "" #: ../src/dlgCmdHistory.ui:113 msgid "Send the selected command(s) to the mud and close the dialog" msgstr "" #: ../src/dlgCmdHistory.ui:183 msgid "Find a command containing a given search term" msgstr "" #: ../src/dlgCmdHistory.ui:200 msgid "Find the next command with the same match text" msgstr "" #: ../src/dlgCmdHistory.ui:227 msgid "Newest commands are on the top" msgstr "" #: ../src/dlgCmdHistory.ui:266 msgid "Specify the delay between sending the group of commands" msgstr "" #: ../src/dlgCmdHistory.ui:295 msgid "Specify how many commands are sent at once" msgstr "" #: ../src/dlgCmdHistory.ui:311 msgid "commands(s)" msgstr "" #: ../src/dlgCmdHistory.ui:335 msgid "Find command" msgstr "" #: ../src/dlgCmdHistory.ui:390 msgid "_Text to find:" msgstr "" #: ../src/dlgCmdHistory.ui:404 msgid "Enter the text to search for" msgstr "" #: ../src/dlgCmdHistory.ui:421 msgid "Search direction:" msgstr "" #: ../src/dlgCmdHistory.ui:437 msgid "_Downwards" msgstr "" #: ../src/dlgCmdHistory.ui:452 msgid "_Upwards" msgstr "" #: ../src/mnuPopupURL.ui:29 msgid "_Open link" msgstr "" #: ../src/mnuPopupURL.ui:37 msgid "_Copy link address" msgstr "" #: ../share/kildclient.pl:75 ../share/kildclient.pl:96 #: ../share/kildclient.pl:116 ../share/kildclient.pl:181 #: ../share/kildclient.pl:393 ../share/kildclient.pl:493 #: ../share/kildclient.pl:571 ../share/kildclient.pl:584 #: ../share/kildclient.pl:597 ../share/kildclient.pl:610 #: ../share/kildclient.pl:623 ../share/kildclient.pl:636 #: ../share/kildclient.pl:649 ../share/kildclient.pl:662 #: ../share/kildclient.pl:676 ../share/kildclient.pl:690 #: ../share/kildclient.pl:800 ../share/kildclient.pl:812 #: ../share/kildclient.pl:824 ../share/kildclient.pl:836 #: ../share/kildclient.pl:849 ../share/kildclient.pl:1098 #: ../share/kildclient.pl:1131 #, perl-format msgid "%s: Too few arguments." msgstr "" #: ../share/kildclient.pl:297 ../share/kildclient.pl:315 #: ../share/kildclient.pl:333 ../share/kildclient.pl:351 #: ../share/kildclient.pl:369 #, perl-format msgid "%s: Wrong number of arguments." msgstr "" #: ../share/kildclient.pl:488 msgid "Successfully moved." msgstr "" #: ../share/kildclient.pl:871 #, perl-format msgid "One %1$s deleted" msgid_plural "%2$d %1$s deleted" msgstr[0] "" msgstr[1] "" #: ../share/kildclient.pl:913 msgid "Could not open file." msgstr "" #: ../share/kildclient.pl:943 msgid "Unknown" msgstr "" #: ../share/kildclient.pl:950 msgid "Invalid plugin file." msgstr "" #: ../share/kildclient.pl:981 msgid "Plugin already loaded. Try enabling it." msgstr "" #: ../share/kildclient.pl:983 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "" #: ../share/kildclient.pl:993 #, perl-format msgid "Error in plugin file: %s" msgstr "" #: ../share/kildclient.pl:1005 msgid "Cannot load a plugin in another world." msgstr "" #: ../share/kildclient.pl:1010 ../share/kildclient.pl:1030 msgid "Plugin not specified" msgstr "" #: ../share/kildclient.pl:1017 ../share/kildclient.pl:1048 msgid "Plugin not loaded." msgstr "" #: ../share/kildclient.pl:1020 #, perl-format msgid "Plugin '%s' loaded." msgstr "" #: ../share/kildclient.pl:1036 #, perl-format msgid "Could not load plugin %s" msgstr "" #: ../share/kildclient.pl:1112 msgid "Plugin enabled." msgstr "" #: ../share/kildclient.pl:1145 msgid "Plugin disabled." msgstr "" #: ../share/kildclient.pl:1295 msgid "Cannot open help file." msgstr "" #: ../share/kildclient.pl:1318 msgid "Help topic not found." msgstr "" kildclient-3.2.0/po/de.gmo0000644000175000017500000016155413220232041012272 00000000000000)8~8 88888595:9&p99.999(:C:X:m:::6:':;L";6o;';;;7 <B<X<o<"<"<<< =&=B= J=T=e=x== ==== = > !> ->:>P>n> >>> > >> ??.?D?X?t?B?+?$?@( @"I@l@ u@@@A#A AA LA*VA0A6AA A AB BB "B/B 4B@BQBbBiBB BBB BB B&BC)C;C TC aC8kCJCLCDV.qV2V[VD/WtW{W1 X1?X#qX%XXXX Y$'Y LYYY `YlYsYYYYY-Y Y Y Z.Z GZTZXZ`ZhZ nZ{ZZCZuZ P[^[Fm[[[[ [%[%\'\ A\{L\\K[]]]^^-^C^4I^~^^'^1^^_ _25_ h_u_ __ __ ____ _`` `"`*`?`S`d`x` }``L```` aa!aAaQaUagalaaa+a aaa b b b*b 9bGbWb`b ebsb bbb Vcwcc"c@cI dWd%md dddddddd' e5eFeVeiek~eee e#f(fZHf0ff ff f g 'g 3g?g Yg1egGgg ghh1h 5h@hUhphyhhhhhhhhh hii=&i7diTiAiN3j;jj/j)j.(kfWk=k'k<$lal|ll+ll ll*l'mMGm2m3m-m7*n4bn;nFnSoGnoSoA p Lp Wp bpp p pp ppp ppp%qq_qGrWr%orjrs1sZs +t8tHttttttu!u( v'2v.Zvv'vv v&vYvYwDbwwww-w x +x5x,=x jxWxx x x y,y<}'E} m} y}}} }}$}} }}}~~.~ 5~@~I~:i~-~~$~~ $,$@elq'w*    !6 =J Zdj r} €Ȁ(߀"AHN]lJ{ƁՁ   $ +9@_g*v )ʂ. #-&J q!}&ƃ փ !#7Z:2Ȅ ';=XA+>Qk<<އ/$Kp 1Ј"B]+r<3ۉM.8|/5Nj66%!>`)y ̌ߌ2CYk Íڍ.)F p#}ێ >E^,я%؏# ",?PG'Nv ,>‘EGM ]js Ӓْ!  )7F U`-uÓؓ  g'AdєE6|^ FjO^N`LNИUKuIM ;Yb0*ߛB BMŜԜ#3L^v !;ܝ!V:;D͞:Mb*s2)џ&%Ag#%!̠C2&L(s!%    &2; KCXƢܢ!%'-M{#ǣܣ P Z ݤJT:# "ѥ#(9J]:m*6Ӧ 4I0ͧ@>??~@B5B5xN]T[TADG]E40}eCG'+o*/ƭ15"g îծ"ۮ2 R `n- ϯٯ ߯? kLȰQذ*0B J*T*ɱܱsUwNƳ ϳ2۳Xox/8ô!:6S µֵ #< NX^ q~&(޶,X= !' !489rK߸9UpŹ $!4*V.$лGJ=7 Ӽ޼!%9@;UѽpYa g0u8a߾?A! 2ɿ !74MQ!( 4T Xc}!".QY pC~?XC[ZE@=[.)RCE,H!3?s G1a1t1HH!(jOc9Gu9[1 4   !+:T)Gkg ${ /_w,(%. 06:q)SJ5%$> ( 6@*H'sc  *,AW {()aR!%$!A$c  A   % 1; Q._ ) @ _kBz  8 B O]f m{17 1I R](f/.5,3;D T^v CD59J S a m x& ( -9Jf x-$! 3?GN  !'E KX"s +. 0 M#W.{  8[=@( 'DTgiC6_bU{lN2SAng`<5,vfR4b[kX],dw Ff@%V9I1$( +>?O|fC`$_h<11J|Q]Z)eWs# ,TRL#\@Hg!8aFioG%:`z~.: c2- O9s*3 VpkIJKA PTct/lQ6(/EG{r4ocBX[D^s>>O}Itm R9Py@Yi=Wrj!tNpx0 KxL8d?*\&=a xV/h|Hm;-~5o^M0Q^qne(B3:uU$Z "&ZS'z!Mzk=yAE[S 4'76;)y;5 v})_qTN&7-+*}DaYqbueL"w{d]rYU i3mnj27C0 JgXj#.'.DuF MGh"v\?K~8P<lH% pBW+Ew Target: %d Foreground: %d Background: %d Italics: %d Striked-thru: %d Underline: %d SSL enabled.%d line%d lines%s is already permanent.%s: %s is already permanent%s: %s is not permanent%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: Argument must be numeric%s: Cannot create timer with negative interval%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 key code%s: Invalid target%s: Invalid underline style%s: Keycode given twice, using the named attribute one%s: Keycode not specified, not creating%s: No such world%s: Only scalar ($), array (@) and hash (%%) variables can be made permanent%s: Pattern given twice, using the named attribute one%s: Pattern not specified, not creating%s: Substitution given twice, using the named attribute one%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(-1 to repeat indefinitely)0 lines: Expired: Not yet activeAnsi colorsAuto-loginCharacter setColors used by KildClientCommand entryConnectionDefault colorsFileFlood preventionFontInputLogging statusMCCP (for compression)Name displayNote:OptionsPlugins currently loadedPlugins loaded on startupProxyRevert to default colorsScriptingScrollingSending delaysTime displayWindow 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 _startupAppearanceApply to:Are 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...AuthorAutomationBackgroun_dBlac_kBlac_k (bold)BlackBlack (bold)BlueBlue (bold)Bold _foregroundBold backgroun_dBottomBytes received (compressed):Bytes received (decompressed):C_hange styleC_haracter set:C_learC_onfigure...C_onnectC_ustom: Cannot load a plugin in another world.Cannot open help file.Certificate type:Ch_aracters in this mud:Change styleCharacterCheck 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 defaultsCo_mmand separator:Co_nnected time:ColorsCommand _echo:Command _history...Command historyCommand not found.Commands that would be sent:Compression algorithm:Compression ratio:Compression used:Confirm deletionConnect toConnect to _another worldConnect to _another...Connected 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:Could 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 log file: %s.Could not open raw dump file %s: %s Could not open world '%s': %s Could not resolve host %s: %sCountCount Cu_tCy_anCy_an (bold)CyanCyan (bold)DIRDefaultDefault (bold)DescriptionDirectory to store settings and saved worldsDisable _aliasesDisable _macrosDisable _triggersDisable t_imersDisconnectedDisconnected 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 deleteDo not changeDo not displayDo you really want to delete the %1$s?Do you really want to delete %2$d %1$s?Do you really want to make the variable temporary?Do you really want to make %d variables temporary?Do_wnDoubleDumps 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 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 in plugin file: %sError loading pluginError setting spell checker: %s Error while reading from proxy host.Eval as PerlEvent:Expiration:ExportExternal programsFILEFailed loading file %s: %sFileFile name not specified.Find a command containing a given search termFind commandFind n_extFind p_reviousFind the next command with the same match textFingerprint:GagGag logGeneralGreenGreen (bold)HTTPHelp 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 number %d for event %s Name: %s Action: %s Enabled: %s HooksHooks for '%s': Host:Hostname:I_dentify as 'Character - World name'I_dentify as 'World name - Character'I_dentify 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.Ig. caseImportInform 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:Items to e_xportKeep _openKeep _permanentKeep execKeyKey exchange:KildClient errorKildClient informationKildClient readyLan_guage:LeftLines received:Load pluginLoggingLogging is disabled.Logging not startedLogging stopped.Logging to file %s.MAC:Macro added.Macro modified.Macro number %d Name: %s Key code: %s Action: %s Enabled: %s MacrosMagentaMagenta (bold)Main windowMake _temporaryMore than one command selected.Multi-line sendN/AN_umber of lines:NameNever _hide the typed textNewest commands are on the topNoNo acceptable proxy authentication methods.No auto-loginNo command selected.No proxyNo 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:Omit (_gag) from outputOmit (gag) from _log fileOne %1$s deleted%2$d %1$s deletedOnly _reset idle time counter when a command is entered directlyOnly scalar ($), array (@) and hash (%%) variables can be made permanent.Or connect d_irectly:Outputs version information and exitsPass_word:PasswordPatternPerforming SSL handshake...Permanent 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 macroProtocol %s not enabled.ProtocolsProxyProxy _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 dialogRe_vert to default colorsReally close?Really quit KildClient?Reca_ll and closeRedRed (bold)Resolving host %s...Resolving proxy host %s...RewriterRightSOCKS4SOCKS5SSL handshake failed: %sSSL protocol used:S_electS_pell check typed textS_tatistics...Sc_roll on outputScriptingSe_nd and closeSearch 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 command entry box:Select the font used in the _main screen:Select the font used in the main output screenSelect 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:SingleSpecify 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 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 boxStatisticsStatus barStore commands _between sessionsStyleSubject's DN:SubstitutionSuccessfully moved.TTL expiredT_imersTempTest triggersThe _matched substring numberThe 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 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 c_ontents of this file:There is one open world. Do you really want to quit?There are %d open worlds. 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.Timer added.Timer modified.Timer number %d Name: %s Interval: %.3f Repeat count: %d Action: %s Enabled: %s Temporary: %s TimersTopTrigger 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. Unknown protocolUnnamed worldUnrecognized response from proxy host.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 global settingsUse mul_ti-line input barUse single-_line input barUse the Find button to find the first result.Valid since:VariablesVersionVersion %s of this plugin is already loaded.Visit https://www.kildclient.orgWarning: Trying to send a very long command line. Perhaps a recursive alias definition?WhiteWhite (bold)World name:World saved.Would this line be included in the log file?Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br) YellowYellow (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.[WORLD...]_About_Action:_Add_Aliases_Ask for confirmation before deleting triggers, aliases, etc._Background:_Blue_Blue (bold)_Cancel_Close_Copy_Copy link address_Delay_Delay between each group of lines/commands:_Delete_Disable_Disconnect_Display_Do not allow the same command to be sent_Do not display this message again_Don't quit_Downwards_Echo sent commands in main window_Edit_Edit..._Enable if server proposes after connecting_Enabled_Event:_File:_Finally, send this text:_Find_Find:_Flash window when new text is received_Foreground_Foreground:_Format:_Green_Green (bold)_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:_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_Macros_Magenta_Magenta (bold)_Manual_Multi-line send..._Name of variable to make permanent:_Name:_New_Next_Number of commands to save in history:_Number of lines/commands to send at once:_OK_Offline_Open_Open link_Open..._Password:_Paste_Pattern:_Perl file to load:_Permanent variables_Port:_Preferences_Preferences..._Previous_Quit_Recall_Reconnect_Red_Red (bold)_Repeat count:_Revert to default_Rewriter trigger_Save_Select a saved world:_Select the font used in the status bar:_Send_Send this command:_Show items defined by plugins_Start_Stop_Striked-thru:_Substitution:_Tab position:_Temporary (will be deleted automatically when its repeat count reaches 0)_Test triggers_Test triggers..._Text to find:_Triggers_Underline:_Up_Upwards_Username:_White_White (bold)_World_Wrap lines at word boundaries_Yellow_Yellow (bold)_lines of the scrollback buffer in the logaddress type not supportedaliasaliasesalias: Not creating alias without patternalias: Not creating alias without substitutioncharactercharacters have been enteredcommand not supported / protocol errorcommands(s)connection not allowed by rulesetconnection refused by destination hostgeneral failurehookhookshook: Invalid event '%s' host unreachableline(s)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 failedsecondsseconds e_achtimertimerstimes in a _rowtriggertriggersunknown reason codeyyesProject-Id-Version: KildClient 3.2.0 Report-Msgid-Bugs-To: eduardo@kalinowski.com.br PO-Revision-Date: 2017-12-24 09:13-0200 Last-Translator: Rene Kuettner Language-Team: German Language: de 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 Zeile%d Zeilen%s ist bereits permanent.%s: %s ist schon permanent%s: %s ist nicht permanent%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: Das Argument muss numerisch sein%s: Interval muss positiv sein.%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ültiger Tastencode%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: Keine solche Welt gefunden%s: Nur Skalar ($), Array (@) und Hash (%%) -Variablen können permanent sein%s: Das Muster wurde zweimal mit Attribut eins angegeben%s: Muster ist nicht definiert. Erzeuge nichts.%s: Ersetzung zweimal mit dem Attribut eins angegeben%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(-1 für unbegrenzt viele Wiederholungen)0 Zeilen: Abgelaufen: Noch nicht aktivANSI FarbenAutomatische AnmeldungZeichensatzFarben, die von KildClient verwendet werdenBefehlseingabeVerbindungStandardfarbenDateiÜberlaufschutzSchriftEingabeProtokollierungMCCP (für Kompression)NamensanzeigeHinweis:OptionenGeladene PluginsPlugins geladen beim ProgrammstartProxyStandardfarben zurücksetzenSkripteBildlaufSendeverzögerungenZeitanzeigeFensterkonfigurationZeilenumbruchEin mächtiger MUD-Client mit Unterstützung für Perl SkripteProtokollierung beim Herstellen einer Verbindung _automatisch startenA_utovervollstä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 _ladenErscheinungsbildAnwenden auf:Soll 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_Hintergrund_Schwarz_Schwarz (fett)SchwarzSchwarz (fett)BlauBlau (fett)Fetter _VordergrundFetter _HintergrundUntenEmpfangene Bytes (komprimiert):Empfangene Bytes (unkomprimiert):_Stil ändern_Zeichensatz:_Zurücksetzen_Einstellen..._Verbinden_Benutzerdefiniert: Kann kein Plugin in einer anderen Welt laden.Kann Hilfe-Datei nicht öffnen.Typ des Zertifikats:_Charaktere in diesem MUD:Stil ändernCharakterZeilen 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ücksetzen_Trennzeichen für Befehle:_Verbindungszeit:FarbenBefehls-_Echo:Befehls_historie...BefehlshistorieBefehl nicht gefunden.Befehle die gesendet worden wären:Kompressionsalgorithmus:Kompressionsrate:Verwendete Kompression:Löschvorgang bestätigenVerbinde zuMit einer _anderen Welt verbindenZu _anderer Welt verbinden...Verbunden 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:Kann 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 Protokolldatei nicht öffnen: %s.Kann Rohdatendatei %s nicht öffnen: %s Kann Welt '%s' nicht öffnen: %s Kann Hostnamen %s nicht auflösen: %sAnzahlZähler _Ausschneiden_Zyan_Zyan (fett)ZyanZyan (fett)VerzeichnisStandardStandard (fett)BeschreibungVerzeichnis, in dem die Einstellungen und Welten gespeichert werden_Aliase deaktivieren_Makros deaktivieren_Trigger deaktivierenT_imers 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 anzeigen_Nicht löschenNicht ändernNicht anzeigenSoll %1$s wirklich gelöscht werden?Sollen %2$d %1$s wirklich gelöscht werden?Soll die Variable wirklich zu einer temporären umgewandelt werden?Sollen %d Variablen wirklich in temporäre umgewandelt werden?Ab_wärtsDoppeltSchreibt alle empfangenen Daten (wenn möglich dekomprimiert) in die DateiSchreibt alle empfangenen Daten (gegebenenfalls nach der Dekompression) in die DateiErsetzung als _Perl-Code evaluieren_ExportierenAlias bearbeitenCharakter-Informationen bearbeitenVoreingestellte _Welt bearbeiten...Hook bearbeitenMakro bearbeitenTimer bearbeitenTrigger bearbeitenWelt bearbeitenElement '%s' ist innerhalb des Elements '%s' nicht erlaubt_Befehls-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 anBefehl, 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 in der Plugin-Datei: %sFehler beim Laden eines PluginsFehler 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 einen Befehl mit einem gegebenen SuchbegriffBefehl suchen_WeitersuchenV_orherige suchenWeiteren Befehl mit diesem Suchbegriff suchenFingerabdruck:GagGag ProtokollAllgemeinGrünGrün (fett)HTTPHilfethema 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 Nummer %d für das Ereignis %s Name: %s Aktion: %s Aktiv: %s HooksHooks für '%s': Server:Hostname:I_dentifizieren als 'Charakter - Weltname'I_dentifizieren als 'Weltname - Charakter'I_dentifizieren 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.Ig. FallImportierenAnzahl 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:Zu e_xportierende Elemente_Offen halten_Permanent behalten_Ausführung beibehaltenSchlüsselSchlüsselaustausch:Fehler - KildClientInformation - KildClientKildClient bereitS_prache:LinksEmpfangene Zeilen:Plugin ladenProtokollierungDie Protokollierung ist ausgeschaltet.Die Protokollierung ist nicht gestartet.Protokollierung gestoppt.Protokolliere in Datei %s.MAC:Makro hinzugefügt.Makro geändert.Makro Nummer %d Name: %s Tastencode: %s Aktion: %s Aktiv: %s MakrosMagentaMagenta (fett)HauptfensterIn _temporäre Variable umwandelnEs ist mehr als ein Befehl ausgewählt.Mehrzeilig sendenk/AAnzahl an _Zeilen:NameEingaben _niemals verstecken (auch nicht bei Passworten)Der neueste Befehl ist obenNeinEs sind keine akzeptablen Authentifizierungsmethoden beim Proxy verfügbar.Keine automatische AnmeldungEs ist kein Befehl ausgewählt.Keinen Proxyserver verwendenKein solcher Alias gefundenKein solcher Hook gefundenKein solches Makro gefundenKein solches Plugin gefundenKein solcher Timer gefundenKein solcher Trigger gefundenKeine 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:Passende Zeilen _nicht ausgebenPassende Zeilen nicht ins _Protokoll schreibenEin %s gelöscht%2$d %1$s gelöschtUntätigkeitszeit nur bei direkter Eingabe eines Befehls _zurücksetzenNur Skalar ($), Array (@) und Hash (%%) -Variablen können permanent sein._Direkt verbinden:Zeigt Versionsinformationen an und beendet das ProgrammPass_wort:PasswortMusterSSL-Handshake wird ausgeführt...Permanente 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:Einstellungen_Datum 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 sollProtokoll %s nicht eingeschaltet.NetzwerkProxyserverProxyserver_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ßenA_uf Standardfarben zurücksetzenWirklich schließen?Soll KildClient wirklich beendet werden?Erneut auf_rufen und schließenRotRot (fett)Löse Hostnamen %s auf...Löse Proxy-Hostnamen %s auf...RewriterRechtsSOCKS4SOCKS5SSL-Handshake schlug fehl: %sVerwendetes SSL Protokoll:_Wahlen_Reichtschreibprüfung aktivierenStatisti_ken...Beim _Empfang automatisch scrollenSkripteSe_nden und schließenSuchrichtung: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 Protokolldatei_Schriftart, die in der Befehlseingabe verwendet werden soll:Wähle eine _Schriftart für das Hauptfenster:Wähle eine Schrift für die HauptausgabeWä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...Server_adresse:Server_port:EinfachGeben 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 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 sollStatistikenStatuszeileBefehls_historie beim Beenden in einer Datei ablegenStilDienst DN:ErsetzenErfolgreich verschoben.TTL abgelaufenT_imerTemporärTrigger testenZutreffender Teil _NummerStandardmäß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.Die 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:Eine Welt ist noch verbunden. Soll trotzdem beendet werden?Es sind noch %d Welten 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.Timer hinzugefügt.Timer geändert.Timer Nummer %d Name: %s Interval: %.3f Wiederholungen: %d Aktion: %s Aktiv: %s Temporär: %s TimerObenTrigger 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. Unbekannter Protokoll.Namenlose WeltUnverständliche Antwort vom Proxyserver.Verwenden Sie %Kw um den Weltnamen und %Kc um den Charakternamen zu repräsentierenSS_L-Verschlüsselung verwenden_Fettschrift für leuchtende Farben verwenden (statt einfacher Aufhellung)Systemeinstellungen verwenden_Mehrzeilige Befehlseingabe verwenden_Einzeilige Befehlseingabe verwendenVerwenden Sie den Suchknopf, um das erste Vorkommen zu suchen.Gültig seit:VariablenVersionVersion %s dieses Plugins bereits geladen.Besuchen Sie https://www.kildclient.orgWarnung: Es soll eine sehr lange Kommandozeile gesendet werden. Wurde ein Alias rekursiv definiert?WeißWeiß (fett)Weltname:Welt gesichert.Wäre diese Zeile im Protokoll erschienen?Geschrieben von Eduardo M Kalinowski (eduardo@kalinowski.com.br) GelbGelb (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.[WELT...]Ü_berA_ktion:Hi_nzufügen_Aliase_Nachfragen, wenn Objekte wie Trigger oder Alias gelöscht werden_Hintergrund:_Blau_Blau (fett)_AbbrechenS_chließen_KopierenLinkadresse _kopieren_Verzögerung_Verzögerung in Sekunden zwischen dem Senden:_Löschen_DeaktivierenVerbindung _trennen_Anzeige_Verbiete das Senden abDiese Meldung _nicht noch einmal anzeigen_Nicht beendenA_bwärtsBefehlse_cho (gesendete Befehle in der Hauptausgabe wiedergeben)_Bearbeiten_Bearbeiten...A_ktivieren, wenn der Server es direkt nach dem Verbinden anbietetAkti_vE_reignis:_Datei:Sende _schließlich diesen Text:_Suchen_Suchen:Fenster _Blinken lassen, wenn neuer Text empfangen wurde_Vordergrund_Vordergrund:_Format:_Grün_Grün (fett)_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:Dialog 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_Makros_Magenta_Magenta (fett)_Handbuch_Mehrzeiliges senden..._Name der permanenten Variable:_Name:_Neu_Nächste_Anzahl an Befehlen, die in der Historie gespeichert werden sollen:_Anzahl an Zeilen/Kommandos, die auf einmal gesendet werden können:_OK_Offline bleibenÖ_ffnenLink ö_ffnenÖ_ffnen...Pas_swort:E_infügen_Muster:_Perl Skript, das geladen werden soll:_Permanente Variablen_Port:Ein_stellungenEin_stellungen..._Vorherige_BeendenErneut _aufrufen_Erneut verbinden_Rot_Rot (fett)_Wiederholungen:A_uf Standard zurücksetzen_Rewriter Trigger_Speichern_Eine bekannte Welt wählen:_Wähle eine Schriftart für die Statuszeile:S_endenSen_de diesen Befehl:Z_eige in Plugins definierte Objekte_Start_Stoppen_Durchgestrichen:_Ersetzung:_Tab-Position:_Temporär (wird gelöscht, sobald der Wiederholungszähler 0 erreicht)_Trigger testenTrigger _testen...Zu suchender _Text:_Trigger_Unterstreichen:Au_fwärtsAu_fwärts_Benutzername:_Weiß_Weiß (fett)_WeltZeilen am _Wortende umbrechenG_elbG_elb (fett)_Zeilen des AusgabepuffersAddresstyp wird nicht unterstütztAliasAliasealias: Alias wird ohne Muster nicht erzeugtalias: Alias wird ohne Ersetzung nicht erzeugtCharaktereingegebene ZeichenBefehl wird nicht unterstützt / ProtokollfehlerBefehl(e)Die Regeln verbieten die VerbindungVerbindung wurde von der Gegenstelle abgelehntAllgemeiner FehlerHookHookshook: Ungültiges Ereignis '%s' Gegenstelle nicht erreichbarZeile(n)MakroMakrosnNetzwerk 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 fehlSekundenSe_kunden alleTimerTimer_gleichen Befehlen pro ZeileTriggerTriggerUnbekannter Grund.jJakildclient-3.2.0/po/sv.gmo0000644000175000017500000012116213220232041012321 00000000000000!,~, H-V-g---&---.(/.X.m....'../"/";/^/v/// ///// 0 "0C0X0j0 00 00 000 1 1+1 :1G1g1x11111B1+#2$O2t2({2"22 222p3#x3 3 3*3036 4D4 K4 V4b4 i4w4 }44 444444 555 %5&35Z5q5 5 5J5L5D96B~6t6I67D7?7<8GB8<8&8185 9V9j9{9999999:: #:.:H:;_:":Q:8;CI;8;;;(;/<#C<g<"<<<'< ='=6D={==$===>>>!> '>4> 9>E>I>Q> `>,l>>>> >>>%?7?R?%Z??? ??N?e@t@9{@@ @@@ @ A A,AHA`A&hA1A1A1A'%BMB1lB2B.B2C[3CDCC#CD2DKD `D DD DDDDDDD-D &E 3E>E MEZEbE hEuECEuEFEFFF F FKF]GbGiG4oGG'GG2GH .H9HIHMH^HuH HHH HHHHHHI IIL*IwI~II IIIIIIIJ+ J 6JDJYJ bJ pJ~J JJJJ JJ JJJJK.>K"mK@KK%K LL!L)L=LPLWL'kLLLLLkLHMPM VMZbM0M MM M N (N 4N@N ZN1fNGNN NO O2O 6OAOVOqOwOOOO OOO=O7-PTePAPNP;KQQ/Q)Q.Q' R<HRRRR+RR SS*S'CSMkS-S;SF#TSjTGTSU ZU eU pUUU UU%UUV%Vj:V1VZV 2W?WOWWWW!X(X'Y.7YfY'nY Y&YYDYZ--Z [Z hZrZ,zZ ZZ Z Z Z,Z<![^[ e[s[w[![\<\V\q\\ \\\\ \\ \\\]]],!]N]V] _]k])t]"] ] ]]]]]]]^^'&^ N^ Z^g^p^ w^^$^^ ^^^^ ^^^-_K_$Q_v_~___$____'_*_)`-`6` <`G` P`[` b`l``` `` ``` `` ```aa(,aUa[aoavaaJaa aa bb b#b*b2bAb \b)jb bb&b b&bc&c .c;c=cQcTcoc wc ccccc|Zeeeef+f,Ef$rff#f-f g$g@gRgng+ggg#g#h'hnr/r@rOsnssssss"sst*t@t Vtbtt?t$tUt:SuEu9uv v,0v1]v!vv v!v$w-5w!cww7www%x"8x [x|xx xx xx xxxx x<xy+y@y Ry_y |y%yyy%y z z -z 9zJCz]zz=z 0{;{J{i{{{{2{"{ |+|5B|6x|7|0|#}<<};y}5}:}~&~L~!~0E"e#;    %()RV2r Ӏ MgJDU \ gQscł ) 3.= l(v<"5=Lcs{ӄ)Q; ʅ  105f φ  %3 BP_v.#NW)m ˈ ވ3<Wp r 06bE>   # /: Z5dQ!%)Of kv!Ō   (425gN:O';w@Î7C<.B -4b q~62T>E7;TDMB Ւ ߒ!-= D!e &o5*o`Д %*Җ*/(X)_ Qė ;7s 4!ɘ  (<B &:Uo Ț ̚ך ޚ   )54j s ( ޛ %+IO,V  *  $ /;+D:p $ ڝ*07;(C4l  ɞ Ԟ $+; N\ e q~ ğ7ߟ7 ? MT[ Ǡՠݠ   +&7 ^h# !ѡ# 9 D R^mo(rRa5.!T R( @2bvEZfCB F <q_Jcm4!Nz_NO-fX;&92d}~ Lk*E[YpA}l~G=t?")w4JPK)#V:BDb8rg?/Q z5S K66"  C#Ud 03\yIT=o9`gWxa&7h,{Fu[VjPuS8i-I/H'|+ pe]Uknnl^A%x>$DtY| c%y+v'`e.s1mX Qwi0 7OH:sho ^3<LMG]j1q,$@M\>;Z*W { Target: %d Foreground: %d Background: %d Italics: %d Striked-thru: %d Underline: %d SSL enabled.%d line%d lines%s is already permanent.%s: %s is already permanent%s: %s is not permanent%s: Action not specified, not creating%s: Argument must be numeric%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: No such world%s: Pattern not specified, not creating%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 reference0 lines: 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 displayWindow 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 _startupAppearanceApply to:Are 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...AuthorAutomationBackgroun_dBlac_kBlac_k (bold)BlackBlack (bold)BlueBlue (bold)Bold _foregroundBold backgroun_dBottomBytes received (compressed):Bytes received (decompressed):C_hange styleC_haracter set:C_learC_onfigure...Cannot load a plugin in another world.Cannot open help file.Ch_aracters in this mud:Change styleCharacterCheck 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 defaultsCo_mmand separator:Co_nnected time:ColorsCommand _history...Command historyCommand not found.Commands that would be sent:Compression algorithm:Compression ratio:Compression used:Confirm deletionConnect toConnect to _another worldConnect to _another...Connected 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:Could 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 log file: %s.Could not open raw dump file %s: %s Could not open world '%s': %s Could not resolve host %s: %sCountCount Cu_tCy_anCy_an (bold)CyanCyan (bold)DIRDefaultDefault (bold)DescriptionDirectory to store settings and saved worldsDisable _aliasesDisable _macrosDisable t_imersDisconnectedDisconnected 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 deleteDo not changeDo not displayDo you really want to delete the %1$s?Do you really want to delete %2$d %1$s?Do you really want to make the variable temporary?Do you really want to make %d variables temporary?DoubleDumps 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 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 in plugin file: %sError loading pluginError setting spell checker: %s Eval as PerlEvent:Expiration:ExportExternal programsFILEFailed loading file %s: %sFileFile name not specified.Find a command containing a given search termFind commandFind n_extFind p_reviousFingerprint:GeneralGreenGreen (bold)Help 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. Items to e_xportKeep _openKeep _permanentKeyKildClient errorKildClient informationKildClient readyLan_guage:LeftLines received:Load pluginLoggingLogging is disabled.Logging not startedLogging stopped.Logging to file %s.MAC:Macro added.Macro modified.Macro number %d Name: %s Key code: %s Action: %s Enabled: %s MacrosMagentaMagenta (bold)Main windowMake _temporaryMore than one command selected.N/AN_umber of lines:NameNever _hide the typed textNoNo acceptable proxy authentication methods.No auto-loginNo command selected.No proxyNo such aliasNo such macroNo such pluginNo such timerNo such triggerNo 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 One %1$s deleted%2$d %1$s deletedOnly _reset idle time counter when a command is entered directlyOr connect d_irectly:Outputs version information and exitsPass_word:PasswordPatternPermanent 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 dialogRe_vert to default colorsReally close?Really quit KildClient?Reca_ll and closeRedRed (bold)Resolving host %s...Resolving proxy host %s...RightSSL protocol used:S_pell check typed textS_tatistics...Sc_roll on outputScriptingSe_nd and closeSearch 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 command entry box:Select the font used in the _main screen:Select the font used in the main output screenSend 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:SingleSpecify 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 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 windowStatisticsStatus barStore commands _between sessionsStyleSuccessfully moved.TTL expiredT_imersThe help is displayed in main window.The interval must be positive.The whole _lineThen send the c_ontents of this file:There is one open world. Do you really want to quit?There are %d open worlds. 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.Timer added.Timer modified.Timer number %d Name: %s Interval: %.3f Repeat count: %d Action: %s Enabled: %s Temporary: %s TimersTopTrigger 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 _SSLUse _bold font for highlighted colors (instead of just highlighting)Use global settingsUse the Find button to find the first result.Valid since:VariablesVersionVersion %s of this plugin is already loaded.Visit https://www.kildclient.orgWhiteWhite (bold)World name:World saved.Would this line be included in the log file?Written by Eduardo M Kalinowski (eduardo@kalinowski.com.br) YellowYellow (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.[WORLD...]_About_Action:_Aliases_Background:_Blue_Blue (bold)_Cancel_Close_Copy_Copy link address_Delay_Delay between each group of lines/commands:_Delete_Disable_Disconnect_Display_Do not allow the same command to be sent_Do not display this message again_Don't quit_Downwards_Edit_Edit..._Enabled_Event:_File:_Finally, send this text:_Find_Find:_Flash window when new text is received_Foreground_Foreground:_Format:_Green_Green (bold)_Help_Hide tabs if only one world is open_Host:_Idle time:_Import_Informative messages:_Input_Interval:_Italic:_Keep dialog open after sending_Keep last typed command in command entry box_Key:_Lines to save in scrollback buffer:_Macros_Magenta_Magenta (bold)_Manual_Name of variable to make permanent:_Name:_New_Next_Number of commands to save in history:_Number of lines/commands to send at once:_OK_Offline_Open_Open link_Open..._Password:_Paste_Pattern:_Perl file to load:_Permanent variables_Port:_Preferences_Preferences..._Previous_Quit_Recall_Reconnect_Red_Red (bold)_Repeat count:_Revert to default_Save_Select a saved world:_Select the font used in the status bar:_Send_Send this command:_Start_Striked-thru:_Tab position:_Temporary (will be deleted automatically when its repeat count reaches 0)_Text to find:_Underline:_Upwards_Username:_White_White (bold)_World_Yellow_Yellow (bold)address type not supportedaliasaliasesalias: Not creating alias without patterncharactercharacters have been enteredcommand not supported / protocol errorcommands(s)connection refused by destination hosthost unreachableline(s)macromacrosnnetwork unreachablenorequest rejected or failedsecondsseconds e_achtimertimerstimes in a _rowyyesProject-Id-Version: KildClient 3.2.0 Report-Msgid-Bugs-To: eduardo@kalinowski.com.br PO-Revision-Date: 2017-12-24 09:13-0200 Last-Translator: Niklas Grahn Language-Team: Niklas Grahn Language: sv 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 rad%d rader%s är redan permanent.%s: %s är redan permanent%s: %s är inte permanent%s: Åtgärden är inte angiven, skapar inte%s: Argumentet måste vara numeriskt%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: Ingen sådan värld%s: Mönstret är inte angivet, skapar inte%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 referenstyp0 rader: 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öjningarTidsangivelseFö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 _uppstartUtseendeTillämpa på:Ä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...UpphovsmanAutomatiseringBa_kgrund_Svart_Svart (fet)SvartSvart (fet)BlåBlå (fet)Fet _förgrundFet ba_kgrundNederkantAntal mottagna byte (komprimerade):Antal mottagna byte (okomprimerade):B_yt stilTecken_kodning:_TömK_onfigurera...Kan inte läsa in insticksmodul i en annan värld.Kan inte öppna hjälpfil._Karaktärer i denna mud:Byt stilKaraktärMarkera 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ärdenK_ommandoseparator:A_nsluten tid:FärgerKommando_historiaKommandohistoriaKommando hittades inte.Kommandon som skulle bli skickade:Komprimeringsalgoritm:Komprimeringsförhållande:Använd komprimering:Bekräfta borttagelseAnslut tillAnslut till en _annan världAnslut till _en annan...Ansluten 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...Ansl_utningsstil:Anslutningstid:Kunde 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 loggfil: %s.Kunde inte öppna rå dumpfil %s: %s Kunde inte öppna värld '%s': %s Kunde inte slå upp värd %s: %sAntalAntalKlipp _ut_Cyan_Cyan (fet)CyanCyan (fet)KATStandardStandard (fet)BeskrivningKatalog för att lagra inställningar och sparade världar iInaktivera _aliasInaktivera _makrotarInaktivera t_idurFrå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 sekunderTa _inte bortÄndra inteVisa inteVill du verkligen ta bort filen %1$s?Vill du verkligen ta bort %2$d %1$s?Vill du verkligen göra variabeln temporär?Vill du verkligen göra %d variabler temporära?BådaDumpar 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 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 i filen för insticksmodul: %sFel vid inläsning av insticksmodulFel 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 ett kommando innehållandes en given söktermSök kommandoSök n_ästaSök _föregåendeFingeravtryck:AllmäntGrönGrön (fet)Hjä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. Objekt att e_xporteraBehåll _öppenBehåll _permanentTangentKildClient-felKildClient-informationKildClient redoSpråk:VänsterAntal mottagna rader:Läs in insticksmodulLoggningLoggning är inaktiverad.Loggning har inte startatLoggning stoppad.Loggar till filen %s.MAC:Makro tillagt.Makro modifierat.Makronummer %d Namn: %s Key code: %s Åtgärd: %s Aktiverat: %s MakrotarMagentaMagenta (fet)HuvudfönsterGör _temporärFler än ett kommando markerat.Inte tillgängligtA_ntal rader:NamnDölj _aldrig den skrivna textenNejInga acceptabla metoder för proxyautentisering.Ingen automatisk inloggningInget kommando markerat.Ingen proxyInget sådant aliasInget sådant makroIngen sådan insticksmodulInget sådant tidurInget 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 En %s borttagen%2$d %1$s borttagenÅt_erställ räknaren för passiv tid bara när ett kommando skrivs in direktEller anslut d_irekt:Matar ut versionsinformation och avslutarLös_enord:LösenordMönsterPermanenta 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 makrotProtokollProxy_Proxytyp: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 dialogrutaÅt_erställ till standardfärgerVill du verkligen stänga?Vill du verkligen avsluta KildClient?Åter_kalla och stängRödRöd (fet)Slår upp värd %s...Slår upp proxyvärd %s...HögerSSL-protokoll använt:S_tavninskontrollera skriven textS_tatistik...Rulla vid _utmatningSkriptningS_kicka och stängSö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 kommando_inmatningsrutan:Markera typsnittet som ska användas i huvud_fönstret:Markera typsnittet som ska användas i huvudskärmen för utmatningSkicka 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..._Serveradress:Server_port:EnskildAnge 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 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önstretStatistikStatusmätare_Lagra kommandon mellan sessionerStilFlyttade framgångsrikt.TTL har utgåttT_idurHjälpen visas i huvudfönstret.Intervallet måste vara positivt.Hela _radenSkicka sedan _innehållet i denna fil:Det finns en öppen värld. Vill du verkligen avsluta?Det finns %d öppna världar. 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.Tidur tillaggt.Tidur modifierat.Tidursnummer %d Namn: %s Intervall: %.3f Antal upprepningar: %d Åtgärd: %s Aktiverat: %s Temporärt: %s TidurÖverkantTrigger 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 SS_LAnvänd _fet typsnitt för markerade färger (istället för bara färgmarkering)Använd allmänna inställningarAnvä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 https://www.kildclient.orgVitVit (fet)Namn på värld:Värld sparad.Skulle denna rad inkluderas i loggfilen?Skrivet av Eduardo M Kalinowski (eduardo@kalinowski.com.br) GulGul (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.[VÄRLD...]_Om_Åtgärd:_Alias_Bakgrund:_Blå_Blå (fet)_AvbrytS_täng_Kopiera_Kopiera länkadress_Fördröj_Fördröjning mellan varje grupp av rader/kommandon:_Ta bort_Inaktivera_Frånkoppla_SkärmTillåt inte att _samma kommando skickas_Visa inte detta meddelande igenAvsluta _inte_Nedåt_Redigera_Redigera...A_ktiverat(d)_Händelse:_Fil:Skicka _till sist denna text:_Sök_Sök:_Låt fönstret blinka när ny text mottages_Förgrund_Förgrund:_Format:_Grön_Grön (fet)_Hjälp_Dölj flikar om bara en värld är öppen_Värd:_Tid passiv:_Importera_Informativa meddelanden:_Inmatning_Intervall:_Kursiv:_Behåll dialogrutan öppen efter sändning_Behåll senast skrivna kommando i kommandoinmatningsrutan_Tangent:_Rader att spara i rullningsbuffert:_Makrotar_Magenta_Magenta (fet)_Handbok_Variabelns namn som ska göras permanent:_Namn:_Ny_Nästa_Antal kommandon att spara i historiken:_Antal rader/kommandon som ska skickas på en gång:_OK_Frånkopplad_Öppna_Öppna länk_Öppna..._Lösenord:Klistra _in_Mönster:_Perlfil att läsa in:_Permanenta variabler_Port:_Inställningar_Inställningar..._Föregående_Avsluta_Återkalla_Återanslut_Röd_Röd (fet)Antal _upprepningar:Återgå till _standard_Spara_Markera en sparad värld:_Markera typsnittet som ska användas i statusmätaren:_SkickaSki_cka detta kommando:_Starta_Genomstrykt:_Flikposition_Temporärt (kommer att tas bort automatiskt när dess antal upprepningar når noll)_Text att söka efter:_Understreck:_UppåtA_nvändarnamn:_Vit_Vit (fet)_VärldG_ulG_ul (fet)adresstyp stöds intealiasaliasalias: Skapar inte alias utan mönsterkaraktärtecken har skrivits inkommando stöds inte / protokollfelkommando(n)anslutning vägrades av målvärdvärd oåtkomlig:a/e radmakromakrotarnnätverk oåtkomligtnejbegäran nekades eller misslyckadessekund(er)sekunder v_artidurtidur_gånger i radjjakildclient-3.2.0/po/pt_BR.po0000644000175000017500000026160513220232041012542 00000000000000# KildClient messages in Portuguese (Brazilian) # Copyright (C) 2004-2017 Eduardo M Kalinowski # This file is distributed under the same license as the KildClient package. # msgid "" msgstr "" "Project-Id-Version: KildClient 3.2.0\n" "Report-Msgid-Bugs-To: eduardo@kalinowski.com.br\n" "POT-Creation-Date: 2017-12-24 09:10-0200\n" "PO-Revision-Date: 2017-12-24 09:17-0200\n" "Last-Translator: Eduardo M Kalinowski \n" "Language-Team: Eduardo M Kalinowski \n" "Language: pt_BR\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:63 msgid "Outputs version information and exits" msgstr "Mostra a informação da versão e sai" #: ../src/main.c:65 msgid "Directory to store settings and saved worlds" msgstr "Diretório para salvar a configuração e mundos salvos" #: ../src/main.c:65 msgid "DIR" msgstr "DIR" #: ../src/main.c:67 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:68 ../src/main.c:71 msgid "FILE" msgstr "ARQUIVO" #: ../src/main.c:70 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:101 msgid "[WORLD...]" msgstr "[MUNDO...]" #: ../src/main.c:108 #, 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:113 #, c-format msgid "Could not open dump file %s: %s\n" msgstr "Impossível abrir arquivo de dump %s: %s\n" #: ../src/main.c:120 #, 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:240 #, c-format msgid "There is one open world. Do you really want to quit?" msgid_plural "There are %d open worlds. Do you really want to quit?" msgstr[0] "Há um mundo aberto. Você deseja realmente sair?" msgstr[1] "Há %d mundos abertos. Você deseja realmente sair?" #: ../src/main.c:244 msgid "Really quit KildClient?" msgstr "Realmente sair do KildClient?" #: ../src/main.c:246 msgid "_Don't quit" msgstr "_Não sair" #: ../src/main.c:247 ../src/wndmain.ui:146 msgid "_Quit" msgstr "Sa_ir" #: ../src/net.c:166 ../src/proxy.c:209 #, c-format msgid "Resolving proxy host %s..." msgstr "Procurando host proxy %s..." #: ../src/net.c:169 #, c-format msgid "Resolving host %s..." msgstr "Procurando host %s..." #: ../src/net.c:262 ../src/proxy.c:193 #, c-format msgid "Could not resolve host %s: %s" msgstr "Não foi possível encontrar o host %s: %s" #: ../src/net.c:290 #, 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:293 #, 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:309 #, c-format msgid "Could not create socket: %s" msgstr "Não foi possível criar o socket: %s" #: ../src/net.c:312 #, c-format msgid "Could not create socket: error #%d" msgstr "Não foi possível criar o socket: erro #%d" #: ../src/net.c:332 #, 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:342 #, 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:398 #, c-format msgid "Unable to connect to host %s: %s." msgstr "Impossível conectar ao host %s: %s" #: ../src/net.c:401 #, c-format msgid "Unable to connect to proxy host %s: %s." msgstr "Impossível conectar ao host proxy %s: %s" #: ../src/net.c:443 ../src/net.c:461 #, c-format msgid "Unable to connect to host %s: error #%d." msgstr "Impossível conectar ao host %s: erro #%d" #: ../src/net.c:446 ../src/net.c:464 #, 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:499 #, c-format msgid "Performing SSL handshake..." msgstr "Iniciando negociação SSL..." #. Fatal error #: ../src/net.c:542 #, c-format msgid "SSL handshake failed: %s" msgstr "Negociação SSL falhou: %s" #: ../src/net.c:583 #, c-format msgid "SSL handshake took too long." msgstr "Negociação SSL demorou demais." #: ../src/net.c:605 ../src/net.c:1091 #, c-format msgid "Connected to host %s (%s) port %s." msgstr "Conectado ao host %s (%s) porta %s." #: ../src/net.c:608 ../src/net.c:1094 #, 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:615 ../src/net.c:1067 ../src/net.c:1101 msgid " SSL enabled." msgstr "SSL habilitado." #: ../src/net.c:770 #, c-format msgid "Disconnected from host %s." msgstr "Desconectado do host %s." #: ../src/net.c:838 ../src/net.c:846 #, c-format msgid "Disconnected from host %s: %s." msgstr "Desconectado do host %s: %s." #: ../src/net.c:857 #, c-format msgid "Disconnected from host %s: error #%d." msgstr "Desconectado do host %s: erro #%d." #: ../src/net.c:1055 #, 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:1059 #, 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:1177 ../src/we_logging.c:121 msgid "Not connected." msgstr "Não conectado." #. success #: ../src/proxy.c:57 msgid "general failure" msgstr "falha geral" #: ../src/proxy.c:58 msgid "connection not allowed by ruleset" msgstr "conexão não permitida pelo conjunto de regras" #: ../src/proxy.c:59 msgid "network unreachable" msgstr "rede inatingível" #: ../src/proxy.c:60 msgid "host unreachable" msgstr "host de destino inatingível" #: ../src/proxy.c:61 msgid "connection refused by destination host" msgstr "conexão recusada pelo host destino" #: ../src/proxy.c:62 msgid "TTL expired" msgstr "TTL expirou" #: ../src/proxy.c:63 msgid "command not supported / protocol error" msgstr "comando não suportado / erro de protocolo" #: ../src/proxy.c:64 msgid "address type not supported" msgstr "tipo de endereçamento não suportado" #: ../src/proxy.c:239 ../src/proxy.c:661 #, 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:294 ../src/proxy.c:423 ../src/proxy.c:468 ../src/proxy.c:542 #: ../src/proxy.c:708 msgid "Error while reading from proxy host." msgstr "Erro ao ler do servidor proxy." #: ../src/proxy.c:315 msgid "request rejected or failed" msgstr "pedido recusado ou falhou" #: ../src/proxy.c:319 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:323 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:327 ../src/proxy.c:568 ../src/proxy.c:724 #, c-format msgid "Proxy request failed: %s." msgstr "Pedido ao proxy falhou: %s." #: ../src/proxy.c:344 #, 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:438 msgid "No acceptable proxy authentication methods." msgstr "Nenhum método de autenticação aceitável." #: ../src/proxy.c:486 msgid "Proxy authentication failed." msgstr "Autenticação com o servidor proxy falhou." #. Should never happen #: ../src/proxy.c:529 msgid "Unrecognized response from proxy host." msgstr "Resposta do servidor proxy não foi reconhecida." #: ../src/proxy.c:563 msgid "unknown reason code" msgstr "código de resposta desconhecido" #: ../src/proxy.c:584 #, c-format msgid "Sending proxy authentication credentials..." msgstr "Enviando credenciais de autenticação ao servidor proxy..." #: ../src/proxy.c:623 #, c-format msgid "Sending connection request..." msgstr "Enviando pedido de conexão..." #: ../src/mainwindow.c:162 ../src/mainwindow.c:608 ../src/mainwindow.c:874 #: ../src/worldgui.c:1132 ../src/worldselector.c:186 ../src/worldeditor.c:178 #: ../src/we_general.c:334 ../src/we_generic_guied.c:81 ../src/we_triggers.c:83 #: ../src/we_triggers.c:553 ../src/we_triggers.c:744 ../src/we_aliases.c:76 #: ../src/we_aliases.c:455 ../src/we_macros.c:79 ../src/we_macros.c:420 #: ../src/we_timers.c:76 ../src/we_timers.c:458 ../src/we_hooks.c:87 #: ../src/we_hooks.c:620 ../src/we_vars.c:76 ../src/we_vars.c:362 #: ../src/prefs.c:106 ../src/triggers.c:277 ../src/multilinesend.c:92 #: ../src/cmdhistory.c:209 ../src/cmdhistory.c:439 #, c-format msgid "Error loading UI from XML file: %s" msgstr "Erro ao carregar interface do arquivo XML: %s" #: ../src/mainwindow.c:668 ../src/mainwindow.c:669 msgid "Not connected" msgstr "Não conectado" #: ../src/mainwindow.c:810 msgid ": Not yet active" msgstr ": Não ativo ainda" #: ../src/mainwindow.c:815 msgid ": Expired" msgstr ": Expirou" #: ../src/mainwindow.c:829 ../src/kildclient.ui:1898 #: ../src/dlgStatistics.ui:114 ../src/dlgStatistics.ui:327 msgid "None" msgstr "Nenhuma" #: ../src/worldgui.c:229 msgid "_Find:" msgstr "_Procurar:" #: ../src/worldgui.c:243 ../src/wndmain.ui:216 ../src/wndmain.ui:272 #: ../src/dlgCmdHistory.ui:195 msgid "Find n_ext" msgstr "Procurar p_róximo" #: ../src/worldgui.c:270 msgid "Click to clear the command input area." msgstr "Clique para limpar a área de entrada de comandos." #: ../src/worldgui.c:376 msgid "No world" msgstr "Nenhum mundo" #: ../src/worldgui.c:425 msgid "KildClient ready" msgstr "KildClient pronto" #: ../src/worldgui.c:435 msgid "0 lines" msgstr "0 linhas" #: ../src/worldgui.c:895 msgid "Are you sure you want to close this world?" msgstr "Você realmente deseja fechar este mundo?" #: ../src/worldgui.c:896 msgid "Really close?" msgstr "Realmente fechar?" #: ../src/worldgui.c:898 msgid "Keep _open" msgstr "Manter _aberto" #: ../src/worldgui.c:899 ../src/worldselector.c:799 ../src/worldselector.c:805 #: ../src/wndmain.ui:82 ../src/dlgPreferences.ui:155 #: ../src/dlgTestTriggers.ui:41 ../src/dlgCmdHistory.ui:125 msgid "_Close" msgstr "_Fechar" #: ../src/worldgui.c:1064 #, c-format msgid "Error setting spell checker: %s\n" msgstr "Erro ao configurar verificador ortográfico: %s\n" #: ../src/worldgui.c:1318 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:1484 msgid "Not found" msgstr "Não encontrado" #: ../src/ansitextview.c:429 #, c-format msgid "%d line" msgid_plural "%d lines" msgstr[0] "%d linha" msgstr[1] "%d linhas" #: ../src/worldselector.c:135 ../src/worldselector.c:677 #, c-format msgid "Could not load world from file '%s': %s" msgstr "Impossível carregar mundo do arquivo '%s': %s" #: ../src/worldselector.c:487 #, c-format msgid "Could not open world '%s': %s\n" msgstr "Impossível abrir mundo '%s': %s\n" #: ../src/worldselector.c:530 #, c-format msgid "Invalid argument '%s'\n" msgstr "Argumento '%s' inválido\n" #: ../src/worldselector.c:793 msgid "Disconnected" msgstr "Desconectado" #: ../src/worldselector.c:796 ../src/worldselector.c:803 ../src/wndmain.ui:58 msgid "_Reconnect" msgstr "_Reconectar" #: ../src/worldselector.c:797 ../src/worldselector.c:804 msgid "Connect to _another world" msgstr "Conectar a outro _mundo" #: ../src/worldselector.c:798 msgid "_Offline" msgstr "_Offline" #: ../src/worlds.c:772 msgid "Unnamed world" msgstr "Mundo sem nome" #: ../src/worlds.c:829 ../src/worlds.c:2346 ../src/we_generic_guied.c:311 #: ../src/prefs.c:431 #, c-format msgid "Could not open file '%s': %s" msgstr "Impossível abrir arquivo '%s': %s" #: ../src/worlds.c:892 #, c-format msgid "Invalid top-level element '%s'" msgstr "Elemento '%s' inválido" #: ../src/worlds.c:1695 #, 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:1964 #, c-format msgid "Invalid key code '%s'" msgstr "Código de tecla '%s' inválido" #: ../src/worlds.c:1983 #, c-format msgid "Element '%s' not allowed inside element '%s'" msgstr "Elemento '%s' não permitido dentro do elemento '%s'" #: ../src/worlds.c:1996 #, c-format msgid "Invalid attribute '%s' for element '%s'" msgstr "Atributo '%s' inválido para o elemento '%s'" #: ../src/worlds.c:2503 #, c-format msgid "Disconnected from world %s" msgstr "Desconectado do mundo %s." #: ../src/worldeditor.c:239 msgid "General" msgstr "Geral" #: ../src/worldeditor.c:247 ../src/worldeditor.c:251 msgid "Display" msgstr "Aparência" #: ../src/worldeditor.c:248 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:259 msgid "Main window" msgstr "Janela principal" #: ../src/worldeditor.c:267 msgid "Colors" msgstr "Cores" #: ../src/worldeditor.c:275 msgid "Status bar" msgstr "Barra de status" #: ../src/worldeditor.c:283 msgid "Input" msgstr "Entrada" #: ../src/worldeditor.c:291 msgid "Logging" msgstr "Log" #: ../src/worldeditor.c:297 ../src/worldeditor.c:301 msgid "Automation" msgstr "Automação" #: ../src/worldeditor.c:298 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:309 msgid "Scripting" msgstr "Scripts" #: ../src/worldeditor.c:317 msgid "Plugins" msgstr "Plugins" #: ../src/worldeditor.c:328 msgid "Triggers" msgstr "Triggers" #: ../src/worldeditor.c:339 msgid "Aliases" msgstr "Aliases" #: ../src/worldeditor.c:350 msgid "Macros" msgstr "Macros" #: ../src/worldeditor.c:361 msgid "Timers" msgstr "Timers" #: ../src/worldeditor.c:372 msgid "Hooks" msgstr "Hooks" #: ../src/worldeditor.c:383 msgid "Variables" msgstr "Variáveis" #: ../src/worldeditor.c:392 msgid "Protocols" msgstr "Protocolos" #: ../src/worldeditor.c:400 msgid "Advanced" msgstr "Avançado" #: ../src/we_general.c:73 msgid "Character" msgstr "Personagem" #: ../src/we_general.c:81 msgid "Password" msgstr "Senha" #: ../src/we_general.c:373 msgid "You must specify the name." msgstr "Você deve especificar o nome." #: ../src/we_general.c:380 msgid "You must specify the password." msgstr "Você deve especificar a senha." #: ../src/we_general.c:418 msgid "character" msgstr "personagem" #: ../src/we_logging.c:110 ../src/log.c:104 #, c-format msgid "Logging to file %s." msgstr "Logando para o arquivo %s." #: ../src/we_logging.c:116 msgid "Logging is disabled." msgstr "Log está desabilitado." #: ../src/we_logging.c:209 msgid "Logging not started" msgstr "Log não iniciado." #: ../src/we_logging.c:238 msgid "Select log file" msgstr "Selecione arquivo de log" #: ../src/we_logging.c:241 ../src/we_plugins.c:574 ../src/we_generic_guied.c:97 #: ../src/we_generic_guied.c:364 ../src/kildclient.ui:64 #: ../src/kildclient.ui:342 ../src/kildclient.ui:559 ../src/kildclient.ui:682 #: ../src/kildclient.ui:865 ../src/kildclient.ui:1069 ../src/kildclient.ui:1369 #: ../src/kildclient.ui:1943 ../src/dlgSelectWorld.ui:43 #: ../src/dlgEditWorld.ui:132 ../src/dlgMLSend.ui:54 #: ../src/dlgCmdHistory.ui:348 msgid "_Cancel" msgstr "_Cancelar" #: ../src/we_logging.c:243 ../src/kildclient.ui:78 ../src/kildclient.ui:356 #: ../src/kildclient.ui:573 ../src/kildclient.ui:696 ../src/kildclient.ui:879 #: ../src/kildclient.ui:1083 ../src/kildclient.ui:1383 #: ../src/kildclient.ui:1957 ../src/dlgStatistics.ui:40 #: ../src/dlgEditWorld.ui:146 ../src/dlgCmdHistory.ui:362 msgid "_OK" msgstr "_OK" #: ../src/we_plugins.c:124 ../src/we_plugins.c:336 ../src/we_triggers.c:225 #: ../src/we_aliases.c:206 ../src/we_macros.c:209 ../src/we_timers.c:206 #: ../src/we_hooks.c:341 ../src/perlscript.c:3429 msgid "Name" msgstr "Nome" #: ../src/we_plugins.c:136 ../src/we_plugins.c:378 ../src/perlscript.c:3430 msgid "Description" msgstr "Descrição" #: ../src/we_plugins.c:148 ../src/we_plugins.c:364 msgid "Author" msgstr "Autor" #: ../src/we_plugins.c:161 msgid "File" msgstr "Arquivo" #: ../src/we_plugins.c:205 ../src/we_plugins.c:457 msgid "Error loading plugin" msgstr "Erro ao carregar plugin" #: ../src/we_plugins.c:322 ../src/we_triggers.c:211 ../src/we_aliases.c:192 #: ../src/we_macros.c:195 ../src/we_timers.c:192 ../src/we_hooks.c:327 msgid "Enabled" msgstr "Habilitado" #: ../src/we_plugins.c:350 msgid "Version" msgstr "Versão" #: ../src/we_plugins.c:439 msgid "Always load this plugin at _startup" msgstr "_Sempre carregar esse plugin ao iniciar" #: ../src/we_plugins.c:497 msgid "The help is displayed in main window." msgstr "A ajuda foi exibida na janela principal." #: ../src/we_plugins.c:498 msgid "KildClient information" msgstr "Informação - KildClient" #: ../src/we_plugins.c:499 msgid "_Do not display this message again" msgstr "_Não mostrar esta mensagem novamente" #: ../src/we_plugins.c:571 msgid "Load plugin" msgstr "Carregar plugin" #: ../src/we_plugins.c:576 ../src/we_generic_guied.c:366 msgid "_Open" msgstr "_Abrir" #: ../src/we_generic_guied.c:94 msgid "Export" msgstr "Exportar" #: ../src/we_generic_guied.c:99 ../src/wndmain.ui:104 msgid "_Save" msgstr "_Salvar" #: ../src/we_generic_guied.c:361 msgid "Import" msgstr "Importar" #: ../src/we_generic_guied.c:393 #, c-format msgid "Could not import file '%s': %s" msgstr "Impossível importar arquivo '%s': %s" #: ../src/we_generic_guied.c:948 #, c-format msgid "Do you really want to delete the %1$s?" msgid_plural "Do you really want to delete %2$d %1$s?" msgstr[0] "Você realmente deseja apagar o %1$s?" msgstr[1] "Você realmente deseja apagar %2$d %1$s?" #: ../src/we_generic_guied.c:952 ../src/we_vars.c:282 msgid "Confirm deletion" msgstr "Confirmar deleção" #: ../src/we_generic_guied.c:954 msgid "Do _not delete" msgstr "_Não excluir" #: ../src/we_generic_guied.c:955 ../src/kildclient.ui:1736 #: ../src/wndmain.ui:194 ../src/dlgSelectWorld.ui:151 #: ../src/dlgEditWorld.ui:634 ../src/dlgEditWorld.ui:3290 msgid "_Delete" msgstr "E_xcluir" #: ../src/we_triggers.c:130 msgid "_Test triggers" msgstr "_Testar triggers" #: ../src/we_triggers.c:239 ../src/we_aliases.c:220 ../src/triggers.c:140 #: ../src/aliases.c:176 msgid "Pattern" msgstr "Padrão" #: ../src/we_triggers.c:257 ../src/we_aliases.c:238 msgid "Ig. case" msgstr "Ig. caixa" #: ../src/we_triggers.c:271 ../src/we_macros.c:237 ../src/we_timers.c:246 #: ../src/we_hooks.c:355 ../src/triggers.c:141 ../src/macros.c:145 #: ../src/timers.c:202 msgid "Action" msgstr "Ação" #: ../src/we_triggers.c:289 msgid "Gag" msgstr "Gag" #: ../src/we_triggers.c:307 msgid "Gag log" msgstr "Gag log" #: ../src/we_triggers.c:325 msgid "Keep exec" msgstr "Cont exec" #: ../src/we_triggers.c:343 msgid "Rewriter" msgstr "Reescritor" #: ../src/we_triggers.c:361 msgid "Style" msgstr "Estilo" #: ../src/we_triggers.c:375 ../src/we_aliases.c:284 ../src/we_macros.c:251 #: ../src/we_timers.c:278 ../src/we_hooks.c:369 msgid "Plugin" msgstr "Plugin" #: ../src/we_triggers.c:470 ../share/kildclient.pl:803 #: ../share/kildclient.pl:865 msgid "trigger" msgid_plural "triggers" msgstr[0] "trigger" msgstr[1] "triggers" #: ../src/we_triggers.c:635 ../src/we_aliases.c:516 msgid "You must specify the pattern." msgstr "Você deve especificar o padrão." #: ../src/we_triggers.c:643 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:252 ../src/aliases.c:177 msgid "Substitution" msgstr "Substituição" #: ../src/we_aliases.c:270 msgid "Eval as Perl" msgstr "Avaliar como Perl" #: ../src/we_aliases.c:379 ../share/kildclient.pl:815 #: ../share/kildclient.pl:866 msgid "alias" msgid_plural "aliases" msgstr[0] "alias" msgstr[1] "aliases" #: ../src/we_aliases.c:523 msgid "You must specify the substitution." msgstr "Você deve especificar a substituição." #: ../src/we_macros.c:223 ../src/macros.c:144 msgid "Key" msgstr "Tecla" #: ../src/we_macros.c:346 ../share/kildclient.pl:827 ../share/kildclient.pl:867 msgid "macro" msgid_plural "macros" msgstr[0] "macro" msgstr[1] "macros" #: ../src/we_macros.c:476 msgid "You must specify the key." msgstr "Você deve especificar a tecla." #: ../src/we_macros.c:483 msgid "Invalid key code." msgstr "Código de tecla inválido." #: ../src/we_macros.c:490 ../src/we_timers.c:523 ../src/we_hooks.c:671 msgid "You must specify the action." msgstr "Você deve especificar a ação." #: ../src/we_timers.c:219 msgid "Interval" msgstr "Intervalo" #: ../src/we_timers.c:232 msgid "Count" msgstr "Vezes" #: ../src/we_timers.c:264 msgid "Temp" msgstr "Temp" #: ../src/we_timers.c:380 ../share/kildclient.pl:839 ../share/kildclient.pl:868 msgid "timer" msgid_plural "timers" msgstr[0] "timer" msgstr[1] "timers" #: ../src/we_timers.c:516 msgid "The interval must be positive." msgstr "O intervalo deve ser positivo." #. The manually added combo for selecting which hook #: ../src/we_hooks.c:130 msgid "_Event:" msgstr "E_vento:" #: ../src/we_hooks.c:546 ../share/kildclient.pl:852 ../share/kildclient.pl:869 msgid "hook" msgid_plural "hooks" msgstr[0] "hook" msgstr[1] "hooks" #: ../src/we_vars.c:278 #, c-format msgid "Do you really want to make the variable temporary?" msgid_plural "Do you really want to make %d variables temporary?" msgstr[0] "Você realmente deseja tornar a variável temporária?" msgstr[1] "Você realmente deseja tornar %d variáveis temporárias?" #: ../src/we_vars.c:284 msgid "Keep _permanent" msgstr "Manter _permanente" #: ../src/we_vars.c:285 msgid "Make _temporary" msgstr "Tornar _temporária" #: ../src/we_vars.c:389 msgid "You must specify a variable name." msgstr "Você deve especificar o nome de uma variável." #: ../src/we_vars.c:395 #, 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:408 #, c-format msgid "%s is already permanent." msgstr "%s já é permanente." #: ../src/prefs.c:387 #, 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:407 #, c-format msgid "Unknown directive '%s' in config file.\n" msgstr "Diretiva '%s' desconhecida no arquivo de configuração.\n" #: ../src/prefs.c:501 #, c-format msgid "Could not create directory '%s': %s" msgstr "Impossível criar diretório '%s': %s" #: ../src/parser.c:211 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:139 #, 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:161 ../src/triggers.c:162 ../src/triggers.c:163 #: ../src/triggers.c:164 ../src/triggers.c:165 ../src/triggers.c:166 #: ../src/triggers.c:167 ../src/aliases.c:197 ../src/aliases.c:198 #: ../src/aliases.c:199 ../src/macros.c:167 ../src/timers.c:225 #: ../src/timers.c:226 ../src/hooks.c:206 ../src/perlscript.c:3449 msgid "y" msgstr "s" #: ../src/triggers.c:161 ../src/triggers.c:162 ../src/triggers.c:163 #: ../src/triggers.c:164 ../src/triggers.c:165 ../src/triggers.c:166 #: ../src/triggers.c:167 ../src/aliases.c:197 ../src/aliases.c:198 #: ../src/aliases.c:199 ../src/macros.c:167 ../src/timers.c:225 #: ../src/timers.c:226 ../src/hooks.c:206 ../src/perlscript.c:3449 msgid "n" msgstr "n" #: ../src/triggers.c:361 ../src/kildclient.ui:1918 msgid "No" msgstr "Não" #: ../src/triggers.c:361 ../src/kildclient.ui:1921 msgid "Yes" msgstr "Sim" #: ../src/aliases.c:175 #, c-format msgid "Num Eval Ena IgC %-*.*s %-*.*s\n" msgstr "Núm Aval Hab IgC %-*.*s %-*.*s\n" #: ../src/macros.c:143 #, c-format msgid "Num Ena %-*.*s %-*.*s\n" msgstr "Núm Hab %-*.*s %-*.*s\n" #: ../src/timers.c:194 msgid "Num Ena Temp Int " msgstr "Num Hab Temp Int" #: ../src/timers.c:198 msgid "Count " msgstr "Vezes " #: ../src/permanentvariables.c:115 #, 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:60 ../src/hooks.c:442 #, c-format msgid "hook: Invalid event '%s'\n" msgstr "hook: Evento '%s' inválido\n" #: ../src/hooks.c:76 ../src/hooks.c:225 ../share/kildclient.pl:885 msgid "No such hook" msgstr "Não existe tal hook" #: ../src/hooks.c:191 #, c-format msgid "Hooks for '%s':\n" msgstr "Hooks para '%s':\n" #: ../src/hooks.c:192 msgid "Num Ena Action" msgstr "Num Hab Ação" #: ../src/hooks.c:230 #, 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:236 ../src/perlscript.c:1769 ../src/perlscript.c:2272 #: ../src/perlscript.c:2582 ../src/perlscript.c:2870 msgid "Not set" msgstr "Não definido" #: ../src/hooks.c:238 ../src/perlscript.c:1772 ../src/perlscript.c:1773 #: ../src/perlscript.c:1774 ../src/perlscript.c:1775 ../src/perlscript.c:1776 #: ../src/perlscript.c:1777 ../src/perlscript.c:1778 ../src/perlscript.c:2275 #: ../src/perlscript.c:2276 ../src/perlscript.c:2277 ../src/perlscript.c:2585 #: ../src/perlscript.c:2874 ../src/perlscript.c:2875 ../src/perlscript.c:3487 msgid "yes" msgstr "sim" #: ../src/hooks.c:238 ../src/perlscript.c:1772 ../src/perlscript.c:1773 #: ../src/perlscript.c:1774 ../src/perlscript.c:1775 ../src/perlscript.c:1776 #: ../src/perlscript.c:1777 ../src/perlscript.c:1778 ../src/perlscript.c:2275 #: ../src/perlscript.c:2276 ../src/perlscript.c:2277 ../src/perlscript.c:2585 #: ../src/perlscript.c:2874 ../src/perlscript.c:2875 ../src/perlscript.c:3487 msgid "no" msgstr "não" #: ../src/log.c:121 msgid "File name not specified." msgstr "Arquivo não especificado." #: ../src/log.c:187 #, c-format msgid "Could not open log file: %s." msgstr "Não foi possível abrir o arquivo de log: %s." #: ../src/plugins.c:101 ../src/plugins.c:160 #, c-format msgid "Failed loading file %s: %s" msgstr "Impossível abrir arquivo %s: %s" #: ../src/cmdhistory.c:273 msgid "No command selected." msgstr "Nenhum comando selecionado." #: ../src/cmdhistory.c:277 msgid "More than one command selected." msgstr "Mais de um comando selecionado." #: ../src/cmdhistory.c:466 msgid "Enter some text to search for." msgstr "Entre com algum texto para procurar." #: ../src/cmdhistory.c:491 msgid "Use the Find button to find the first result." msgstr "Use o botão Procurar para procurar o primeiro resultado." #: ../src/cmdhistory.c:540 msgid "Command not found." msgstr "Comando não encontrado." #: ../src/util.c:180 msgid "KildClient error" msgstr "Erro - KildClient" #: ../src/perlscript.c:509 ../src/perlscript.c:515 ../src/perlscript.c:522 msgid "Invalid function call: syntax is $world->FUNCTION" msgstr "Chamada de função inválida: sintaxe é $world->FUNÇÃO" #: ../src/perlscript.c:706 ../src/perlscript.c:723 ../src/perlscript.c:785 #: ../src/perlscript.c:818 ../src/perlscript.c:1224 ../src/perlscript.c:1287 #: ../src/perlscript.c:1389 ../src/perlscript.c:1409 ../src/perlscript.c:1433 #: ../src/perlscript.c:1461 ../src/perlscript.c:1470 ../src/perlscript.c:2010 #: ../src/perlscript.c:2019 ../src/perlscript.c:2198 ../src/perlscript.c:2373 #: ../src/perlscript.c:2382 ../src/perlscript.c:2661 ../src/perlscript.c:2670 #: ../src/perlscript.c:2945 ../src/perlscript.c:2999 ../src/perlscript.c:3044 #: ../src/perlscript.c:3109 ../src/perlscript.c:3120 ../src/perlscript.c:3212 #: ../src/perlscript.c:3536 ../src/kcwin.c:96 #, c-format msgid "%s: Too few arguments" msgstr "%s: Muito poucos argumentos" #: ../src/perlscript.c:751 #, c-format msgid "%s: Argument must be numeric" msgstr "%s: Argumento deve ser numérico." #: ../src/perlscript.c:799 ../src/perlscript.c:831 #, c-format msgid "%s: No such world" msgstr "%s: Não existe tal mundo" #: ../src/perlscript.c:866 msgid "World saved." msgstr "Mundo salvo." #: ../src/perlscript.c:1120 ../src/perlscript.c:1135 ../src/perlscript.c:1145 #: ../src/perlscript.c:1345 ../share/kildclient.pl:1324 #, c-format, perl-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:1124 ../src/perlscript.c:1592 ../src/perlscript.c:2121 #: ../src/perlscript.c:2497 ../src/perlscript.c:2691 ../src/perlscript.c:3173 #, c-format msgid "%s: Wrong argument type" msgstr "%s: Tipo de argumento errado" #: ../src/perlscript.c:1355 ../src/perlscript.c:1361 #, c-format msgid "Protocol %s not enabled." msgstr "Protocolo %s não habilitado." #: ../src/perlscript.c:1366 ../share/kildclient.pl:1166 msgid "Unknown protocol" msgstr "Protocolo desconhecido" #: ../src/perlscript.c:1484 ../src/perlscript.c:1752 ../share/kildclient.pl:881 msgid "No such trigger" msgstr "Não existe tal trigger" #: ../src/perlscript.c:1502 ../src/perlscript.c:2051 ../src/perlscript.c:2426 #: ../src/perlscript.c:3132 #, c-format msgid "%s: Too many string arguments" msgstr "%s: Argumentos string demais" #: ../src/perlscript.c:1525 ../src/perlscript.c:2074 #, c-format msgid "%s: Pattern given twice, using the named attribute one" msgstr "%s: Pattern informado duas vezes, usando o do atributo nomeado" #: ../src/perlscript.c:1537 ../src/perlscript.c:2475 ../src/perlscript.c:3152 #, c-format msgid "%s: Action given twice, using the named attribute one" msgstr "%s: Ação informada duas vezes, usando a do atributo nomeado" #: ../src/perlscript.c:1583 ../src/perlscript.c:2112 ../src/perlscript.c:2488 #: ../src/perlscript.c:3165 #, c-format msgid "%s: Wrong type of reference" msgstr "%s: Tipo de referência inválido" #: ../src/perlscript.c:1603 #, c-format msgid "%s: Pattern not specified, not creating" msgstr "%s: Pattern não especificado, cancelando criação" #: ../src/perlscript.c:1612 #, c-format msgid "%s: Action not specified, and isn't gag, not creating" msgstr "%s: Ação não especificada e não é gag, cancelando criação" #: ../src/perlscript.c:1641 msgid "Trigger added." msgstr "Trigger adicionado." #: ../src/perlscript.c:1646 msgid "Trigger modified." msgstr "Trigger modificado." #: ../src/perlscript.c:1671 #, c-format msgid "%s: Invalid target" msgstr "%s: 'target' inválido" #: ../src/perlscript.c:1681 #, c-format msgid "%s: Invalid fg color" msgstr "%s: 'fg' inválido" #: ../src/perlscript.c:1691 #, c-format msgid "%s: Invalid bg color" msgstr "%s: 'bg' inválido" #: ../src/perlscript.c:1701 #, c-format msgid "%s: Invalid underline style" msgstr "%s: Estilo de sublinhado inválido" #: ../src/perlscript.c:1757 #, 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:1781 #, 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:2033 ../src/perlscript.c:2259 ../share/kildclient.pl:882 msgid "No such alias" msgstr "Não existe tal alias" #: ../src/perlscript.c:2086 #, c-format msgid "%s: Substitution given twice, using the named attribute one" msgstr "%s: Substituição informada duas vezes, usando a do atributo nomeado" #: ../src/perlscript.c:2132 msgid "alias: Not creating alias without pattern" msgstr "alias: Cancelando criação de um alias sem pattern" #: ../src/perlscript.c:2140 msgid "alias: Not creating alias without substitution" msgstr "alias: Cancelando criação de alias sem substituição" #: ../src/perlscript.c:2168 msgid "Alias added." msgstr "Alias adicionado." #: ../src/perlscript.c:2173 msgid "Alias modified." msgstr "Alias modificado." #: ../src/perlscript.c:2264 #, 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:2344 msgid "Press a key to get its keycode." msgstr "Pressione uma tecla para obter seu código de tecla." #: ../src/perlscript.c:2396 ../src/perlscript.c:2570 ../share/kildclient.pl:883 msgid "No such macro" msgstr "Não existe tal macro" #: ../src/perlscript.c:2415 ../src/perlscript.c:2463 #, c-format msgid "%s: Invalid key code" msgstr "%s: Código de tecla inválido" #: ../src/perlscript.c:2452 #, c-format msgid "%s: Keycode given twice, using the named attribute one" msgstr "%s: código de tecla informado duas vezes, usando o do atributo nomeado" #: ../src/perlscript.c:2508 #, c-format msgid "%s: Keycode not specified, not creating" msgstr "%s: Código de tecla não informado, cancelando criação" #: ../src/perlscript.c:2515 ../src/perlscript.c:2782 #, c-format msgid "%s: Action not specified, not creating" msgstr "%s: Ação não informada, cancelando criação" #: ../src/perlscript.c:2534 msgid "Macro added." msgstr "Macro adicionado." #: ../src/perlscript.c:2539 msgid "Macro modified." msgstr "Macro modificado." #: ../src/perlscript.c:2576 #, 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:2685 ../src/perlscript.c:2857 ../share/kildclient.pl:884 msgid "No such timer" msgstr "Não existe tal timer" #: ../src/perlscript.c:2710 #, c-format msgid "%s: Interval must be numeric" msgstr "%s: Intervalo deve ser numérico" #: ../src/perlscript.c:2723 #, c-format msgid "%s: Count must be numeric" msgstr "%s: Contagem deve ser numérica" #: ../src/perlscript.c:2754 #, c-format msgid "%s: Interval not specified, not creating" msgstr "%s: Intervalo não informado, cancelando criação" #: ../src/perlscript.c:2761 #, c-format msgid "%s: Cannot create timer with negative interval" msgstr "%s: Não é possível criar um timer com intervalo negativo" #: ../src/perlscript.c:2822 msgid "Timer added." msgstr "Timer adicionado." #: ../src/perlscript.c:2827 msgid "Timer modified." msgstr "Timer modificado." #: ../src/perlscript.c:2862 #, c-format msgid "" "Timer number %d\n" " Name: %s\n" " Interval: %.3f\n" " Repeat count: %d\n" " Action: %s\n" " Enabled: %s\n" " Temporary: %s\n" msgstr "" "Timer número %d\n" " Nome: %s\n" " Intervalo: %.3f\n" " Número de vezes: %d\n" " Ação: %s\n" " Habilitado: %s\n" " Temporário: %s\n" #: ../src/perlscript.c:2953 #, 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:2962 #, c-format msgid "%s: %s is already permanent" msgstr "%s: %s já é permanente" #: ../src/perlscript.c:2976 #, c-format msgid "%s: Variable '%s' made permanent.\n" msgstr "%s: Variável '%s' feita permanente.\n" #: ../src/perlscript.c:3018 #, c-format msgid "%s: Variable '%s' made temporary.\n" msgstr "%s: Variável '%s' feita temporária.\n" #: ../src/perlscript.c:3022 #, c-format msgid "%s: %s is not permanent" msgstr "%s: %s não é permanente" #: ../src/perlscript.c:3075 msgid "Permanent variables" msgstr "Variáveis permanentes" #: ../src/perlscript.c:3187 msgid "Hook defined." msgstr "Hook definido." #: ../src/perlscript.c:3191 msgid "Hook modified." msgstr "Hook modificado." #: ../src/perlscript.c:3296 msgid "Logging stopped." msgstr "Log desabilitado." #: ../src/perlscript.c:3428 #, c-format msgid "Num Ena %-*.*s Version %-*.*s\n" msgstr "Núm Hab %-*.*s Versão %-*.*s\n" #: ../src/perlscript.c:3471 msgid "No such plugin" msgstr "Não existe tal plugin" #: ../src/perlscript.c:3476 #, 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.ui:48 msgid "Edit timer" msgstr "Editar timer" #: ../src/kildclient.ui:107 ../src/kildclient.ui:385 ../src/kildclient.ui:602 #: ../src/kildclient.ui:747 ../src/kildclient.ui:908 ../src/kildclient.ui:1112 #: ../src/dlgEditWorld.ui:229 ../src/dlgEditWorld.ui:2855 msgid "_Name:" msgstr "_Nome:" #: ../src/kildclient.ui:120 msgid "Enter optionally a descriptive name for the timer" msgstr "Entre opcionalmente um nome descritivo para o timer" #: ../src/kildclient.ui:132 msgid "_Interval:" msgstr "_Intervalo:" #: ../src/kildclient.ui:149 msgid "Specify the interval, in seconds, between timer activations" msgstr "Especifique o intervalo, em segundos, entre ativações do timer" #: ../src/kildclient.ui:165 msgid "seconds" msgstr "segundos" #: ../src/kildclient.ui:183 msgid "_Repeat count:" msgstr "Número de _vezes:" #: ../src/kildclient.ui:200 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.ui:215 msgid "(-1 to repeat indefinitely)" msgstr "(-1 para repetir indefinidamente)" #: ../src/kildclient.ui:233 ../src/kildclient.ui:772 ../src/kildclient.ui:970 #: ../src/kildclient.ui:1173 msgid "_Action:" msgstr "_Ação:" #: ../src/kildclient.ui:246 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.ui:256 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.ui:259 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.ui:271 ../src/kildclient.ui:485 ../src/kildclient.ui:795 #: ../src/kildclient.ui:993 ../src/kildclient.ui:1297 msgid "_Enabled" msgstr "_Habilitado" #: ../src/kildclient.ui:274 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.ui:287 ../src/kildclient.ui:501 ../src/kildclient.ui:811 #: ../src/kildclient.ui:1009 ../src/kildclient.ui:1313 msgid "Note:" msgstr "Nota:" #: ../src/kildclient.ui:299 ../src/kildclient.ui:513 ../src/kildclient.ui:823 #: ../src/kildclient.ui:1021 ../src/kildclient.ui:1325 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.ui:326 msgid "Edit alias" msgstr "Editar alias" #: ../src/kildclient.ui:398 msgid "Enter optionally a descriptive name for the alias" msgstr "Entre opcionalmente um nome descritivo para o alias" #: ../src/kildclient.ui:410 ../src/kildclient.ui:1136 msgid "_Pattern:" msgstr "_Padrão:" #: ../src/kildclient.ui:423 msgid "Enter the pattern to match against typed commands" msgstr "Entre o padrão para ser comparado com os commandos digitados" #: ../src/kildclient.ui:433 ../src/kildclient.ui:1159 msgid "_Ignore case when matching" msgstr "_Ignorar maiúsculas e minúsculas" #: ../src/kildclient.ui:447 msgid "_Substitution:" msgstr "_Substituição:" #: ../src/kildclient.ui:460 msgid "Enter the substitution to be executed" msgstr "Entre a substuição a ser feita" #: ../src/kildclient.ui:470 msgid "E_val substitution as Perl statement" msgstr "A_valiar substituição como um comando Perl" #: ../src/kildclient.ui:473 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.ui:488 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.ui:543 msgid "Edit character information" msgstr "Editar informações do personagem" #: ../src/kildclient.ui:615 msgid "Enter the character's name for automatic login" msgstr "Entre o nome do personagem para login automático" #: ../src/kildclient.ui:627 msgid "_Password:" msgstr "_Senha:" #: ../src/kildclient.ui:640 msgid "Enter the character's password for automatic login" msgstr "Entre a senha do seu personagem para login automático" #: ../src/kildclient.ui:666 msgid "Edit hook" msgstr "Editar hook" #: ../src/kildclient.ui:725 msgid "Event:" msgstr "Evento:" #: ../src/kildclient.ui:760 msgid "Enter optionally a descriptive name for the hook" msgstr "Entre opcionalmente um nome descritivo para o hook" #: ../src/kildclient.ui:785 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.ui:798 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.ui:850 msgid "Edit macro" msgstr "Editar macro" #: ../src/kildclient.ui:921 msgid "Enter optionally a descriptive name for the macro" msgstr "Entre opcionalmente um nome descritivo para o macro" #: ../src/kildclient.ui:933 msgid "_Key:" msgstr "_Tecla:" #: ../src/kildclient.ui:946 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.ui:958 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.ui:983 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.ui:996 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.ui:1050 ../src/kildclient.ui:1927 msgid "Enter optionally a descriptive name for the trigger" msgstr "Entre opcionalmente um nome descritivo para o trigger" #: ../src/kildclient.ui:1052 msgid "Edit trigger" msgstr "Editar trigger" #: ../src/kildclient.ui:1149 msgid "Enter the pattern to match against received lines" msgstr "Entre o padrão para ser comparado com as linhas recebidas" #: ../src/kildclient.ui:1186 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.ui:1196 msgid "Omit (_gag) from output" msgstr "Omitir (_gag) da tela de saída" #: ../src/kildclient.ui:1199 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.ui:1211 msgid "Omit (gag) from _log file" msgstr "Omitir (gag) do arquivo de _log" #: ../src/kildclient.ui:1214 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.ui:1226 msgid "_Keep executing other triggers after this this one matches" msgstr "C_ontinuar executando outros triggers depois de esser ser executado" #: ../src/kildclient.ui:1229 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.ui:1241 msgid "_Rewriter trigger" msgstr "Trigger _reescritor" #: ../src/kildclient.ui:1244 msgid "Check to make this trigger a rewriter trigger" msgstr "Marque para que o trigger seja um trigger reescritor" #: ../src/kildclient.ui:1260 msgid "C_hange style" msgstr "Alterar _estilo" #: ../src/kildclient.ui:1275 msgid "C_onfigure..." msgstr "Con_figurar..." #: ../src/kildclient.ui:1300 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.ui:1355 msgid "Permenent variable" msgstr "Variável permanente" #: ../src/kildclient.ui:1411 msgid "_Name of variable to make permanent:" msgstr "_Nome da variável a ser tornada permanente:" #: ../src/kildclient.ui:1425 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.ui:1467 msgid "_Triggers" msgstr "_Triggers" #: ../src/kildclient.ui:1480 msgid "_Aliases" msgstr "_Aliases" #: ../src/kildclient.ui:1493 msgid "_Macros" msgstr "_Macros" #: ../src/kildclient.ui:1506 msgid "T_imers" msgstr "T_imers" #: ../src/kildclient.ui:1519 msgid "_Permanent variables" msgstr "Variáveis _permanentes" #: ../src/kildclient.ui:1532 msgid "OnCo_nnect hooks" msgstr "Hooks OnCo_nnect" #: ../src/kildclient.ui:1545 msgid "On_Disconnect hooks" msgstr "Hooks OnD_isconnect" #: ../src/kildclient.ui:1558 msgid "On_ReceivedText hooks" msgstr "Hooks On_ReceivedText" #: ../src/kildclient.ui:1571 msgid "On_SentCommand hooks" msgstr "Hooks On_SentCommand" #: ../src/kildclient.ui:1584 msgid "On_GetFocus hooks" msgstr "Hooks On_GetFocus" #: ../src/kildclient.ui:1597 msgid "On_LoseFocus hooks" msgstr "Hooks On_LoseFocus" #: ../src/kildclient.ui:1610 msgid "OnClos_eConnected hooks" msgstr "Hooks OnClos_eConnect" #: ../src/kildclient.ui:1623 msgid "OnSer_verData hooks" msgstr "Hooks OnSer_verData" #: ../src/kildclient.ui:1648 msgid "Items to e_xport" msgstr "Itens para e_xportar" #: ../src/kildclient.ui:1709 ../src/dlgSelectWorld.ui:125 #: ../src/dlgEditWorld.ui:604 msgid "_New" msgstr "_Novo" #: ../src/kildclient.ui:1722 ../src/wndmain.ui:158 ../src/dlgSelectWorld.ui:138 #: ../src/dlgEditWorld.ui:619 msgid "_Edit" msgstr "_Editar" #: ../src/kildclient.ui:1750 msgid "_Import" msgstr "_Importar" #: ../src/kildclient.ui:1763 msgid "E_xport" msgstr "Ex_portar" #: ../src/kildclient.ui:1777 ../src/dlgEditWorld.ui:649 #: ../src/dlgEditWorld.ui:3305 msgid "_Up" msgstr "Para ci_ma" #: ../src/kildclient.ui:1791 ../src/dlgEditWorld.ui:664 #: ../src/dlgEditWorld.ui:3320 msgid "Do_wn" msgstr "Para _baixo" #: ../src/kildclient.ui:1830 ../src/kildclient.ui:1895 #: ../src/kildclient.ui:1915 msgid "Do not change" msgstr "Não alterar" #: ../src/kildclient.ui:1833 ../src/dlgPreferences.ui:42 msgid "Black" msgstr "Preto" #: ../src/kildclient.ui:1836 ../src/dlgPreferences.ui:45 msgid "Red" msgstr "Vermelho" #: ../src/kildclient.ui:1839 ../src/dlgPreferences.ui:48 msgid "Green" msgstr "Verde" #: ../src/kildclient.ui:1842 ../src/dlgPreferences.ui:51 msgid "Yellow" msgstr "Amarelo" #: ../src/kildclient.ui:1845 ../src/dlgPreferences.ui:54 msgid "Blue" msgstr "Azul" #: ../src/kildclient.ui:1848 ../src/dlgPreferences.ui:57 msgid "Magenta" msgstr "Magenta" #: ../src/kildclient.ui:1851 ../src/dlgPreferences.ui:60 msgid "Cyan" msgstr "Ciano" #: ../src/kildclient.ui:1854 ../src/dlgPreferences.ui:63 msgid "White" msgstr "Branco" #: ../src/kildclient.ui:1857 ../src/dlgPreferences.ui:66 msgid "Default" msgstr "Padrão" #: ../src/kildclient.ui:1860 ../src/dlgPreferences.ui:69 msgid "Black (bold)" msgstr "Preto (negrito)" #: ../src/kildclient.ui:1863 ../src/dlgPreferences.ui:72 msgid "Red (bold)" msgstr "Vermelho (negrito)" #: ../src/kildclient.ui:1866 ../src/dlgPreferences.ui:75 msgid "Green (bold)" msgstr "Verde (negrito)" #: ../src/kildclient.ui:1869 ../src/dlgPreferences.ui:78 msgid "Yellow (bold)" msgstr "Amarelo (negrito)" #: ../src/kildclient.ui:1872 ../src/dlgPreferences.ui:81 msgid "Blue (bold)" msgstr "Azul (negrito)" #: ../src/kildclient.ui:1875 ../src/dlgPreferences.ui:84 msgid "Magenta (bold)" msgstr "Magenta (negrito)" #: ../src/kildclient.ui:1878 ../src/dlgPreferences.ui:87 msgid "Cyan (bold)" msgstr "Ciano (negrito)" #: ../src/kildclient.ui:1881 ../src/dlgPreferences.ui:90 msgid "White (bold)" msgstr "Branco (negrito)" #: ../src/kildclient.ui:1884 ../src/dlgPreferences.ui:93 msgid "Default (bold)" msgstr "Padrão (negrito)" #: ../src/kildclient.ui:1901 msgid "Single" msgstr "Simples" #: ../src/kildclient.ui:1904 msgid "Double" msgstr "Duplo" #: ../src/kildclient.ui:1929 msgid "Change style" msgstr "Alterar estilo" #: ../src/kildclient.ui:1987 msgid "Apply to:" msgstr "Aplicar a:" #: ../src/kildclient.ui:1998 msgid "_Foreground:" msgstr "_Texto:" #: ../src/kildclient.ui:2026 msgid "_Background:" msgstr "_Fundo:" #: ../src/kildclient.ui:2054 msgid "_Italic:" msgstr "_Itálico:" #: ../src/kildclient.ui:2082 msgid "_Striked-thru:" msgstr "Ta_chado:" #: ../src/kildclient.ui:2110 msgid "_Underline:" msgstr "_Sublinhado:" #: ../src/kildclient.ui:2141 msgid "The whole _line" msgstr "Toda a _linha" #: ../src/kildclient.ui:2155 msgid "The whole matched _text" msgstr "Todo o t_exto encontrado" #: ../src/kildclient.ui:2174 msgid "The _matched substring number" msgstr "A _parte número" #: ../src/wndmain.ui:40 msgid "_World" msgstr "_Mundo" #: ../src/wndmain.ui:49 msgid "_Open..." msgstr "_Abrir..." #: ../src/wndmain.ui:66 msgid "_Disconnect" msgstr "_Desconectar" #: ../src/wndmain.ui:74 msgid "Connect to _another..." msgstr "Conectar a _outro mundo..." #: ../src/wndmain.ui:95 msgid "_Edit..." msgstr "_Editar..." #: ../src/wndmain.ui:112 msgid "S_tatistics..." msgstr "Es_tatísticas..." #: ../src/wndmain.ui:125 ../src/wndmain.ui:245 msgid "_Previous" msgstr "A_nterior" #: ../src/wndmain.ui:133 ../src/wndmain.ui:254 msgid "_Next" msgstr "_Próximo" #: ../src/wndmain.ui:167 msgid "Cu_t" msgstr "Cor_tar" #: ../src/wndmain.ui:176 msgid "_Copy" msgstr "_Copiar" #: ../src/wndmain.ui:185 msgid "_Paste" msgstr "C_olar" #: ../src/wndmain.ui:207 ../src/dlgCmdHistory.ui:178 msgid "_Find" msgstr "_Procurar" #: ../src/wndmain.ui:229 msgid "_Input" msgstr "E_ntrada" #: ../src/wndmain.ui:237 ../src/dlgEditWorld.ui:3101 ../src/dlgMLSend.ui:157 msgid "C_lear" msgstr "_Limpar" #: ../src/wndmain.ui:263 msgid "Find p_revious" msgstr "Procurar _anterior" #: ../src/wndmain.ui:281 msgid "Command _history..." msgstr "_Histórico de comandos..." #: ../src/wndmain.ui:295 msgid "_Multi-line send..." msgstr "Enviar _múltiplas linhas..." #: ../src/wndmain.ui:309 msgid "_Test triggers..." msgstr "_Testar triggers..." #: ../src/wndmain.ui:321 msgid "_Preferences" msgstr "_Preferências" #: ../src/wndmain.ui:330 msgid "Disable _triggers" msgstr "Desabilitar _triggers" #: ../src/wndmain.ui:339 msgid "Disable _aliases" msgstr "Desabilitar _aliases" #: ../src/wndmain.ui:348 msgid "Disable _macros" msgstr "Desabilitar _macros" #: ../src/wndmain.ui:357 msgid "Disable t_imers" msgstr "Desabilitar t_imers" #: ../src/wndmain.ui:371 msgid "_Debug matches" msgstr "" #: ../src/wndmain.ui:384 msgid "_Preferences..." msgstr "_Preferências..." #: ../src/wndmain.ui:392 msgid "Edit default _world..." msgstr "Editar _mundo padrão..." #: ../src/wndmain.ui:404 msgid "_Display" msgstr "_Aparência" #: ../src/wndmain.ui:413 msgid "_Split window" msgstr "_Dividir janela" #: ../src/wndmain.ui:426 ../src/dlgEditWorld.ui:3198 msgid "_Help" msgstr "A_juda" #: ../src/wndmain.ui:434 msgid "_Manual" msgstr "_Manual" #: ../src/wndmain.ui:443 msgid "_About" msgstr "_Sobre" #: ../src/dlgSelectWorld.ui:27 msgid "Connect to" msgstr "Conectar a" #: ../src/dlgSelectWorld.ui:56 msgid "C_onnect" msgstr "C_onectar" #: ../src/dlgSelectWorld.ui:78 msgid "_Select a saved world:" msgstr "_Selecione um mundo salvo:" #: ../src/dlgSelectWorld.ui:183 msgid "Or connect d_irectly:" msgstr "Ou conecte d_iretamente:" #: ../src/dlgSelectWorld.ui:206 ../src/dlgEditWorld.ui:242 msgid "_Host:" msgstr "_Host:" #: ../src/dlgSelectWorld.ui:219 ../src/dlgEditWorld.ui:255 msgid "_Port:" msgstr "_Porta:" #: ../src/dlgPreferences.ui:104 ../src/dlgEditWorld.ui:101 msgid "No proxy" msgstr "Sem proxy" #: ../src/dlgPreferences.ui:107 ../src/dlgEditWorld.ui:104 msgid "SOCKS4" msgstr "SOCKS4" #: ../src/dlgPreferences.ui:110 ../src/dlgEditWorld.ui:107 msgid "SOCKS5" msgstr "SOCKS5" #: ../src/dlgPreferences.ui:113 ../src/dlgEditWorld.ui:110 msgid "HTTP" msgstr "HTTP" #: ../src/dlgPreferences.ui:124 msgid "Left" msgstr "Esquerda" #: ../src/dlgPreferences.ui:127 msgid "Right" msgstr "Direita" #: ../src/dlgPreferences.ui:130 msgid "Top" msgstr "Em cima" #: ../src/dlgPreferences.ui:133 msgid "Bottom" msgstr "Em baixo" #: ../src/dlgPreferences.ui:140 msgid "Preferences" msgstr "Preferências" #: ../src/dlgPreferences.ui:188 msgid "Colors used by KildClient" msgstr "Cores usadas pelo KildClient" #: ../src/dlgPreferences.ui:208 msgid "_Informative messages:" msgstr "_Mensagens informativas:" #: ../src/dlgPreferences.ui:239 msgid "Command _echo:" msgstr "Eco de _comandos:" #: ../src/dlgPreferences.ui:278 msgid "Window configuration" msgstr "Configuração da janela" #: ../src/dlgPreferences.ui:298 msgid "_Tab position:" msgstr "_Posição das abas:" #: ../src/dlgPreferences.ui:329 msgid "_Hide tabs if only one world is open" msgstr "_Esconder abas se houver só um mundo aberto" #: ../src/dlgPreferences.ui:333 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.ui:346 msgid "_Flash window when new text is received" msgstr "Piscar _janela quando novo texto é recebido" #: ../src/dlgPreferences.ui:371 msgid "Appearance" msgstr "Aparência" #: ../src/dlgPreferences.ui:386 msgid "Sending delays" msgstr "Espera entre envios" #: ../src/dlgPreferences.ui:406 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.ui:422 msgid "_Number of lines/commands to send at once:" msgstr "_Número de linhas/comandos para enviar de uma vez:" #: ../src/dlgPreferences.ui:462 msgid "_Delay between each group of lines/commands:" msgstr "_Espera entre cada grupo de linhas/comandos:" #: ../src/dlgPreferences.ui:510 msgid "Sending" msgstr "Envio" #: ../src/dlgPreferences.ui:527 msgid "Audio player" msgstr "Reprodutor de áudio" #: ../src/dlgPreferences.ui:547 #, c-format 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.ui:562 msgid "Specify the command used to play sound files." msgstr "Especifique o comando usado para reproduzir arquivos de áudio." #: ../src/dlgPreferences.ui:587 msgid "External programs" msgstr "Programas externos" #: ../src/dlgPreferences.ui:603 ../src/dlgEditWorld.ui:331 msgid "Proxy" msgstr "Proxy" #: ../src/dlgPreferences.ui:627 ../src/dlgEditWorld.ui:355 msgid "Proxy _type:" msgstr "_Tipo do proxy:" #: ../src/dlgPreferences.ui:669 ../src/dlgEditWorld.ui:397 msgid "Server _address:" msgstr "_Endereço do servidor:" #: ../src/dlgPreferences.ui:682 ../src/dlgEditWorld.ui:453 msgid "_Username:" msgstr "_Usuário:" #: ../src/dlgPreferences.ui:715 ../src/dlgEditWorld.ui:420 msgid "Server _port:" msgstr "Po_rta do servidor:" #: ../src/dlgPreferences.ui:728 ../src/dlgEditWorld.ui:466 msgid "Pass_word:" msgstr "_Senha:" #: ../src/dlgPreferences.ui:781 msgid "Proxy" msgstr "Proxy" #: ../src/dlgStatistics.ui:27 msgid "Statistics" msgstr "Estatísticas" #: ../src/dlgStatistics.ui:70 ../src/dlgStatistics.ui:81 #: ../src/dlgStatistics.ui:223 ../src/dlgStatistics.ui:338 #: ../src/dlgStatistics.ui:445 ../src/dlgStatistics.ui:456 #: ../src/dlgStatistics.ui:467 ../src/dlgStatistics.ui:478 #: ../src/dlgStatistics.ui:489 ../src/dlgStatistics.ui:511 #: ../src/dlgStatistics.ui:544 ../src/dlgStatistics.ui:555 #: ../src/dlgStatistics.ui:577 ../src/dlgStatistics.ui:610 #: ../src/dlgStatistics.ui:621 msgid "N/A" msgstr "N/A" #: ../src/dlgStatistics.ui:92 msgid "Proxy port:" msgstr "Porta do proxy:" #: ../src/dlgStatistics.ui:103 msgid "Proxy host:" msgstr "Host proxy:" #: ../src/dlgStatistics.ui:125 msgid "Proxy type:" msgstr "Tipo do proxy:" #: ../src/dlgStatistics.ui:136 msgid "World name:" msgstr "Nome do mundo:" #: ../src/dlgStatistics.ui:147 msgid "Host:" msgstr "Host:" #: ../src/dlgStatistics.ui:158 msgid "Port:" msgstr "Porta:" #: ../src/dlgStatistics.ui:169 msgid "Connection time:" msgstr "Tempo de conexão:" #: ../src/dlgStatistics.ui:180 msgid "Idle time:" msgstr "Tempo inativo:" #: ../src/dlgStatistics.ui:201 msgid "Compression used:" msgstr "Compressão utilizada:" #: ../src/dlgStatistics.ui:212 msgid "Bytes received (compressed):" msgstr "Bytes recebidos (comprimidos):" #: ../src/dlgStatistics.ui:234 msgid "Bytes received (decompressed):" msgstr "Bytes recebidos (descomprimidos):" #: ../src/dlgStatistics.ui:245 msgid "Compression ratio:" msgstr "Taxa de compressão:" #: ../src/dlgStatistics.ui:256 msgid "Lines received:" msgstr "Linhas recebidas:" #: ../src/dlgStatistics.ui:369 msgid "Key exchange:" msgstr "Troca de chave:" #: ../src/dlgStatistics.ui:380 msgid "SSL protocol used:" msgstr "Protocolo SSL usado:" #: ../src/dlgStatistics.ui:391 msgid "Compression algorithm:" msgstr "Algoritmo de compressão:" #: ../src/dlgStatistics.ui:402 msgid "Certificate type:" msgstr "Tipo de certificado:" #: ../src/dlgStatistics.ui:413 msgid "Cipher:" msgstr "Algoritmo criptográfico:" #: ../src/dlgStatistics.ui:424 msgid "MAC:" msgstr "MAC:" #: ../src/dlgStatistics.ui:500 msgid "Hostname:" msgstr "Host:" #: ../src/dlgStatistics.ui:522 msgid "Valid since:" msgstr "Válido desde:" #: ../src/dlgStatistics.ui:533 msgid "Expiration:" msgstr "Expira:" #: ../src/dlgStatistics.ui:566 msgid "Fingerprint:" msgstr "Fingerprint:" #: ../src/dlgStatistics.ui:588 msgid "Subject's DN:" msgstr "" #: ../src/dlgStatistics.ui:599 msgid "Issuer's DN:" msgstr "" #: ../src/dlgAbout.ui:30 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.ui:32 msgid "Visit https://www.kildclient.org" msgstr "Visite https://www.kildclient.org" #: ../src/dlgEditWorld.ui:81 msgid "No auto-login" msgstr "Sem login automático" #: ../src/dlgEditWorld.ui:98 msgid "Use global settings" msgstr "Usar configurações globais" #: ../src/dlgEditWorld.ui:117 msgid "Edit world" msgstr "Editar mundo" #: ../src/dlgEditWorld.ui:207 msgid "Connection" msgstr "Conexão" #: ../src/dlgEditWorld.ui:268 msgid "Enter a descriptive name for the world" msgstr "Entre um nome descritivo para o mundo" #: ../src/dlgEditWorld.ui:281 msgid "Enter the host to connect to" msgstr "Entre o host a se conectar" #: ../src/dlgEditWorld.ui:294 msgid "Enter the port used when connecting" msgstr "Entre a porta usada para conexão" #: ../src/dlgEditWorld.ui:306 msgid "Use _SSL" msgstr "Usar SS_L" #: ../src/dlgEditWorld.ui:505 msgid "Auto-login" msgstr "Login automático" #: ../src/dlgEditWorld.ui:529 msgid "Connection _style:" msgstr "Estilo de cone_xão:" #: ../src/dlgEditWorld.ui:567 msgid "Ch_aracters in this mud:" msgstr "Personagens neste _mud:" #: ../src/dlgEditWorld.ui:705 ../src/dlgEditWorld.ui:1840 #: ../src/dlgEditWorld.ui:2502 msgid "Font" msgstr "Fonte" #: ../src/dlgEditWorld.ui:725 msgid "Select the font used in the _main screen:" msgstr "Selecione a _fonte usada na janela principal:" #: ../src/dlgEditWorld.ui:741 msgid "Select the font used in the main output screen" msgstr "Selecione a fonte usada na janela principal" #: ../src/dlgEditWorld.ui:753 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.ui:757 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.ui:779 msgid "Word wrap" msgstr "Quebra de linhas" #: ../src/dlgEditWorld.ui:798 msgid "_Wrap lines at word boundaries" msgstr "_Quebrar linhas entre palavras" #: ../src/dlgEditWorld.ui:802 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.ui:820 msgid "_Indent wrapped lines by" msgstr "_Indentar linhas quebras por" #: ../src/dlgEditWorld.ui:850 msgid "pixels" msgstr "pixels" #: ../src/dlgEditWorld.ui:869 msgid "Wrap lines at full _screen width" msgstr "Quebrar linhas na largura _máxima da tela" #: ../src/dlgEditWorld.ui:889 msgid "Maximum line width in _characters:" msgstr "_Largura máxima da linha em caracteres:" #: ../src/dlgEditWorld.ui:937 msgid "Scrolling" msgstr "Rolagem" #: ../src/dlgEditWorld.ui:956 msgid "Sc_roll on output" msgstr "_Rolar quando chega texto novo" #: ../src/dlgEditWorld.ui:960 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.ui:978 msgid "_Lines to save in scrollback buffer:" msgstr "Linhas para salvar no _buffer de rolagem:" #: ../src/dlgEditWorld.ui:991 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.ui:1022 msgid "Tooltips" msgstr "Tooltips" #: ../src/dlgEditWorld.ui:1041 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.ui:1045 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.ui:1067 msgid "Name display" msgstr "Exibição do nome" #: ../src/dlgEditWorld.ui:1086 msgid "I_dentify as 'World name'" msgstr "I_dentificar como 'Nome do mundo'" #: ../src/dlgEditWorld.ui:1101 msgid "I_dentify as 'World name - Character'" msgstr "I_dentificar como 'Nome do mundo - Personagem'" #: ../src/dlgEditWorld.ui:1116 msgid "I_dentify as 'Character - World name'" msgstr "I_dentificar como 'Personagem - Nome do mundo'" #: ../src/dlgEditWorld.ui:1135 msgid "C_ustom: " msgstr "_Personalizado: " #: ../src/dlgEditWorld.ui:1169 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.ui:1203 msgid "Ansi colors" msgstr "Cores Ansi" #: ../src/dlgEditWorld.ui:1313 msgid "Blac_k" msgstr "_Preto" #: ../src/dlgEditWorld.ui:1326 msgid "_Red" msgstr "_Vermelho" #: ../src/dlgEditWorld.ui:1339 msgid "_Green" msgstr "V_erde" #: ../src/dlgEditWorld.ui:1352 msgid "_Yellow" msgstr "_Amarelo" #: ../src/dlgEditWorld.ui:1365 msgid "_Blue" msgstr "A_zul" #: ../src/dlgEditWorld.ui:1378 msgid "_Magenta" msgstr "_Magenta" #: ../src/dlgEditWorld.ui:1391 msgid "Cy_an" msgstr "Cia_no" #: ../src/dlgEditWorld.ui:1404 msgid "_White" msgstr "_Branco" #: ../src/dlgEditWorld.ui:1417 msgid "Blac_k (bold)" msgstr "_Preto (negrito)" #: ../src/dlgEditWorld.ui:1430 msgid "_Red (bold)" msgstr "_Vermelho (negrito)" #: ../src/dlgEditWorld.ui:1443 msgid "_Green (bold)" msgstr "V_erde (negrito)" #: ../src/dlgEditWorld.ui:1456 msgid "_Yellow (bold)" msgstr "_Amarelo (negrito)" #: ../src/dlgEditWorld.ui:1469 msgid "_Blue (bold)" msgstr "A_zul (negrito)" #: ../src/dlgEditWorld.ui:1482 msgid "_Magenta (bold)" msgstr "_Magenta (negrito)" #: ../src/dlgEditWorld.ui:1495 msgid "Cy_an (bold)" msgstr "Cia_no (negrito)" #: ../src/dlgEditWorld.ui:1508 msgid "_White (bold)" msgstr "_Branco (negrito)" #: ../src/dlgEditWorld.ui:1647 msgid "Default colors" msgstr "Cores padrão" #: ../src/dlgEditWorld.ui:1691 msgid "_Foreground" msgstr "_Texto" #: ../src/dlgEditWorld.ui:1704 msgid "Bold _foreground" msgstr "_Texto em negrito" #: ../src/dlgEditWorld.ui:1728 msgid "Backgroun_d" msgstr "_Fundo" #: ../src/dlgEditWorld.ui:1752 msgid "Bold backgroun_d" msgstr "_Fundo em negrito" #: ../src/dlgEditWorld.ui:1785 msgid "Revert to default colors" msgstr "Reverter às cores padrão" #: ../src/dlgEditWorld.ui:1804 msgid "Re_vert to default colors" msgstr "_Reverter às cores padrão" #: ../src/dlgEditWorld.ui:1808 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.ui:1860 msgid "_Select the font used in the status bar:" msgstr "_Selecione a fonte usada na barra de status:" #: ../src/dlgEditWorld.ui:1895 msgid "Time display" msgstr "Exibição dos tempos" #: ../src/dlgEditWorld.ui:1915 msgid "Co_nnected time:" msgstr "_Tempo conectado:" #: ../src/dlgEditWorld.ui:1935 ../src/dlgEditWorld.ui:2017 msgid "Do not display" msgstr "Não exibir" #: ../src/dlgEditWorld.ui:1939 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.ui:1953 ../src/dlgEditWorld.ui:2035 msgid "Display as hours, minutes and seconds" msgstr "Mostrar como horas, minutos e segundos" #: ../src/dlgEditWorld.ui:1957 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.ui:1971 ../src/dlgEditWorld.ui:2053 msgid "Display as seconds" msgstr "Mostrar como segundos" #: ../src/dlgEditWorld.ui:1975 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.ui:1998 msgid "_Idle time:" msgstr "Tempo _inativo:" #: ../src/dlgEditWorld.ui:2021 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.ui:2039 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.ui:2057 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.ui:2071 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.ui:2075 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.ui:2115 msgid "Command entry" msgstr "Entrada de comandos" #: ../src/dlgEditWorld.ui:2134 msgid "_Keep last typed command in command entry box" msgstr "_Manter último comando enviado na caixa de entrada de comandos" #: ../src/dlgEditWorld.ui:2138 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.ui:2150 msgid "_Echo sent commands in main window" msgstr "_Ecoar comandos enviados na janela principal" #: ../src/dlgEditWorld.ui:2154 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.ui:2166 msgid "Store commands _between sessions" msgstr "_Salvar comandos entre sessões" #: ../src/dlgEditWorld.ui:2170 msgid "Check to have the command history saved in a file between sessions" msgstr "Marque para salvar os comandos entre sessões." #: ../src/dlgEditWorld.ui:2182 msgid "Never _hide the typed text" msgstr "Nunca _ocultar texto digitado" #: ../src/dlgEditWorld.ui:2186 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.ui:2203 msgid "_Number of commands to save in history:" msgstr "_Número de comandos para salvar no histórico:" #: ../src/dlgEditWorld.ui:2217 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.ui:2244 msgid "Co_mmand separator:" msgstr "Se_parador de comandos:" #: ../src/dlgEditWorld.ui:2257 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.ui:2278 msgid "Use single-_line input bar" msgstr "Barra de entrada com _uma única linha" #: ../src/dlgEditWorld.ui:2300 msgid "Enable _auto-completion" msgstr "_Habilitar auto-compleção" #: ../src/dlgEditWorld.ui:2304 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.ui:2321 msgid "Acti_vate auto-completion only after" msgstr "_Ativar auto-compleção somente após" #: ../src/dlgEditWorld.ui:2335 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.ui:2351 msgid "characters have been entered" msgstr "caracteres terem sido digitados" #: ../src/dlgEditWorld.ui:2375 msgid "Use mul_ti-line input bar" msgstr "_Barra de entrada com múltiplas linhas" #: ../src/dlgEditWorld.ui:2402 msgid "N_umber of lines:" msgstr "Número de _linhas:" #: ../src/dlgEditWorld.ui:2437 msgid "S_pell check typed text" msgstr "_Verificar ortografia do texto digitado" #: ../src/dlgEditWorld.ui:2457 msgid "Lan_guage:" msgstr "Lín_gua:" #: ../src/dlgEditWorld.ui:2522 msgid "Select the _font used in the command entry box:" msgstr "Selecione a _fonte usada na caixa de entrada de comandos:" #: ../src/dlgEditWorld.ui:2557 msgid "Flood prevention" msgstr "Prevenção de flood" #: ../src/dlgEditWorld.ui:2580 msgid "_Do not allow the same command to be sent" msgstr "Não permitir _que o mesmo comando seja enviado" #: ../src/dlgEditWorld.ui:2584 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.ui:2598 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.ui:2614 msgid "times in a _row" msgstr "ve_zes em seqüência" #: ../src/dlgEditWorld.ui:2638 msgid "_Send this command:" msgstr "Enviar este coman_do:" #: ../src/dlgEditWorld.ui:2651 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.ui:2690 msgid "Logging status" msgstr "Estado do log" #: ../src/dlgEditWorld.ui:2727 msgid "_Start" msgstr "Co_meçar" #: ../src/dlgEditWorld.ui:2742 msgid "_Stop" msgstr "_Parar" #: ../src/dlgEditWorld.ui:2768 msgid "_Include the last" msgstr "_Incluir as últimas" #: ../src/dlgEditWorld.ui:2772 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.ui:2785 msgid "Inform number of lines to include in the log." msgstr "Informe o número de linhas para incluir no log." #: ../src/dlgEditWorld.ui:2801 msgid "_lines of the scrollback buffer in the log" msgstr "_linhas do buffer de rolagem no log" #: ../src/dlgEditWorld.ui:2829 ../src/dlgEditWorld.ui:3447 msgid "File" msgstr "Arquivo" #: ../src/dlgEditWorld.ui:2879 msgid "S_elect" msgstr "_Selecionar" #: ../src/dlgEditWorld.ui:2903 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.ui:2925 msgid "Options" msgstr "Opções" #: ../src/dlgEditWorld.ui:2944 msgid "A_utomatically start logging when connected" msgstr "Iniciar log a_utomaticamente quando conectado" #: ../src/dlgEditWorld.ui:2949 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.ui:2961 msgid "Prefix lines with _date and/or time" msgstr "Incluir _data e/ou hora" #: ../src/dlgEditWorld.ui:2966 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.ui:2986 msgid "_Format:" msgstr "_Formato:" #: ../src/dlgEditWorld.ui:3000 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.ui:3011 msgid "_Revert to default" msgstr "_Reverter ao padrão" #: ../src/dlgEditWorld.ui:3053 msgid "Scripting" msgstr "Scripts" #: ../src/dlgEditWorld.ui:3078 msgid "_Perl file to load:" msgstr "_Arquivo Perl para carregar:" #: ../src/dlgEditWorld.ui:3142 msgid "Plugins currently loaded" msgstr "Plugins carregados" #: ../src/dlgEditWorld.ui:3183 msgid "_Load" msgstr "Ca_rregar" #: ../src/dlgEditWorld.ui:3230 msgid "Plugins loaded on startup" msgstr "Plugins carregados na inicialização" #: ../src/dlgEditWorld.ui:3275 msgid "_Add" msgstr "_Adicionar" #: ../src/dlgEditWorld.ui:3363 msgid "MCCP (for compression)" msgstr "MCCP (para compressão)" #: ../src/dlgEditWorld.ui:3382 msgid "_Enable if server proposes after connecting" msgstr "_Habilitar se o servidor propuser após a conexão" #: ../src/dlgEditWorld.ui:3397 msgid "Enable if server proposes at _any time" msgstr "H_abilitar se o servidor propuser a qualquer momento" #: ../src/dlgEditWorld.ui:3412 msgid "_Disable" msgstr "_Desabilitar" #: ../src/dlgEditWorld.ui:3471 msgid "_File:" msgstr "_Arquivo:" #: ../src/dlgEditWorld.ui:3506 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.ui:3528 msgid "Character set" msgstr "Conjunto de caracteres" #: ../src/dlgEditWorld.ui:3552 msgid "C_haracter set:" msgstr "Co_njunto de caracteres:" #: ../src/dlgEditWorld.ui:3591 msgid "Graphical editors" msgstr "Editores gráficos" #: ../src/dlgEditWorld.ui:3610 msgid "_Ask for confirmation before deleting triggers, aliases, etc." msgstr "Pedir confirmação _antes de apagar triggers, aliases, etc." #: ../src/dlgEditWorld.ui:3614 ../src/dlgEditWorld.ui:3676 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.ui:3627 msgid "_Show items defined by plugins" msgstr "_Mostrar itens definidos por plugins" #: ../src/dlgEditWorld.ui:3631 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.ui:3653 msgid "TCP keep alive" msgstr "Keep alive TCP" #: ../src/dlgEditWorld.ui:3672 msgid "Enable TCP _keep alive packets" msgstr "Habilitar pacotes TCP _keep alive" #: ../src/dlgEditWorld.ui:3689 msgid "(You must reconnect for changes in this setting to take effect)" msgstr "(Você precisa reconectar para alterações fazerem efeito)" #: ../src/dlgEditWorld.ui:3709 msgid "Input" msgstr "Entrada" #: ../src/dlgEditWorld.ui:3728 msgid "_Disable up and down arrow keys for history navigation" msgstr "_Desabilitar as setas para navegar no histórico" #: ../src/dlgEditWorld.ui:3732 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/dlgEditWorld.ui:3749 msgid "Character to run _Perl commands:" msgstr "Caractere para executar comandos _Perl:" #: ../src/dlgEditWorld.ui:3785 msgid "" "Warning: Changing the character to run Perl commands from the default '/' is " "not recommended, because doing so might prevent plugins or other code from " "working, if they use '/' to run Perl commands." msgstr "" "Cuidado: Usar outro caractere usado para executar comandos Perl ao " "invés do padrão '/' não é recomendado, pois pode fazer com que plugins " "ou outros códigos parem de funcionar, se eles usam '/' para executar " "comandos Perl." #: ../src/dlgTestTriggers.ui:27 msgid "Test triggers" msgstr "Testar triggers" #: ../src/dlgTestTriggers.ui:70 msgid "Enter _line to be matched against the triggers:" msgstr "Entre a _linha para ser comparada com os triggers:" #: ../src/dlgTestTriggers.ui:88 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.ui:99 ../src/dlgMLSend.ui:69 #: ../src/dlgCmdHistory.ui:91 msgid "_Send" msgstr "_Enviar" #: ../src/dlgTestTriggers.ui:103 msgid "Click the run the triggers against the line." msgstr "Clique para testar os triggers com a linha." #: ../src/dlgTestTriggers.ui:138 msgid "Number of triggers that matched:" msgstr "Número de triggers disparados:" #: ../src/dlgTestTriggers.ui:166 msgid "Commands that would be sent:" msgstr "Comandos que seriam enviados:" #: ../src/dlgTestTriggers.ui:196 msgid "This is what would be printed in the main screen:" msgstr "Isso é o que seria mostrado na janela principal:" #: ../src/dlgTestTriggers.ui:208 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.ui:224 msgid "Would this line be included in the log file?" msgstr "Essa linha seria escrita no arquivo de log?" #: ../src/dlgMLSend.ui:39 msgid "Multi-line send" msgstr "Enviar múltiplas linhas" #: ../src/dlgMLSend.ui:95 msgid "Send this text _initially:" msgstr "Enviar esse texto _inicialmente:" #: ../src/dlgMLSend.ui:115 ../src/dlgMLSend.ui:199 msgid "Enter some text to be sent to the World" msgstr "Entre com algum texto para ser enviado ao Mundo" #: ../src/dlgMLSend.ui:128 msgid "Then send the c_ontents of this file:" msgstr "Então enviar o conteúdo desse _arquivo:" #: ../src/dlgMLSend.ui:179 msgid "_Finally, send this text:" msgstr "_Finalmente, enviar esse texto:" #: ../src/dlgMLSend.ui:222 msgid "Add this to the _beginning of each line:" msgstr "Adicionar isso ao c_omeço de cada linha" #: ../src/dlgMLSend.ui:238 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.ui:250 msgid "Add this to the _end of each line:" msgstr "Adicionar isso ao fi_m de cada linha:" #: ../src/dlgMLSend.ui:266 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.ui:282 ../src/dlgCmdHistory.ui:253 msgid "_Delay" msgstr "A_guardar" #: ../src/dlgMLSend.ui:295 msgid "Specify the delay between sending the group of lines" msgstr "Especifique a espera entre o envio de cada grupo de linhas" #: ../src/dlgMLSend.ui:310 ../src/dlgCmdHistory.ui:282 msgid "seconds e_ach" msgstr "segundos ca_da" #: ../src/dlgMLSend.ui:323 msgid "Specify how many lines are sent at once" msgstr "Especifique quantas linhas são mandadas de cada vez" #: ../src/dlgMLSend.ui:337 msgid "line(s)" msgstr "linha(s)" #: ../src/dlgMLSend.ui:355 msgid "_Keep dialog open after sending" msgstr "Manter _janela aberta após envio" #: ../src/dlgCmdHistory.ui:39 msgid "Command history" msgstr "Histórico de comandos" #: ../src/dlgCmdHistory.ui:56 msgid "_Recall" msgstr "Re_cuperar" #: ../src/dlgCmdHistory.ui:61 msgid "Put the selected command in the command entry box" msgstr "Colocar comando na caixa de entrada de comandos" #: ../src/dlgCmdHistory.ui:74 msgid "Reca_ll and close" msgstr "Recuper_ar e fechar" #: ../src/dlgCmdHistory.ui:79 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.ui:96 msgid "Send the selected command(s) to the mud" msgstr "Envia o(s) comando(s) selecionados ao mud" #: ../src/dlgCmdHistory.ui:108 msgid "Se_nd and close" msgstr "E_nviar e fechar" #: ../src/dlgCmdHistory.ui:113 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.ui:183 msgid "Find a command containing a given search term" msgstr "Procura por um comando contendo um determinado texto" #: ../src/dlgCmdHistory.ui:200 msgid "Find the next command with the same match text" msgstr "Procura pelo próximo comando com o mesmo texto" #: ../src/dlgCmdHistory.ui:227 msgid "Newest commands are on the top" msgstr "Comandos mais novos estão no topo" #: ../src/dlgCmdHistory.ui:266 msgid "Specify the delay between sending the group of commands" msgstr "Especifique a espera entre o envio de cada grupo de comandos" #: ../src/dlgCmdHistory.ui:295 msgid "Specify how many commands are sent at once" msgstr "Especifique quantos comandos são mandadas de cada vez" #: ../src/dlgCmdHistory.ui:311 msgid "commands(s)" msgstr "comando(s)" #: ../src/dlgCmdHistory.ui:335 msgid "Find command" msgstr "Encontrar comando" #: ../src/dlgCmdHistory.ui:390 msgid "_Text to find:" msgstr "_Texto para procurar:" #: ../src/dlgCmdHistory.ui:404 msgid "Enter the text to search for" msgstr "Entre o texto para procurar" #: ../src/dlgCmdHistory.ui:421 msgid "Search direction:" msgstr "Direção da busca:" #: ../src/dlgCmdHistory.ui:437 msgid "_Downwards" msgstr "Para _baixo" #: ../src/dlgCmdHistory.ui:452 msgid "_Upwards" msgstr "Para c_ima" #: ../src/mnuPopupURL.ui:29 msgid "_Open link" msgstr "_Abrir link" #: ../src/mnuPopupURL.ui:37 msgid "_Copy link address" msgstr "_Copiar endereço do link" #: ../share/kildclient.pl:75 ../share/kildclient.pl:96 #: ../share/kildclient.pl:116 ../share/kildclient.pl:181 #: ../share/kildclient.pl:393 ../share/kildclient.pl:493 #: ../share/kildclient.pl:571 ../share/kildclient.pl:584 #: ../share/kildclient.pl:597 ../share/kildclient.pl:610 #: ../share/kildclient.pl:623 ../share/kildclient.pl:636 #: ../share/kildclient.pl:649 ../share/kildclient.pl:662 #: ../share/kildclient.pl:676 ../share/kildclient.pl:690 #: ../share/kildclient.pl:800 ../share/kildclient.pl:812 #: ../share/kildclient.pl:824 ../share/kildclient.pl:836 #: ../share/kildclient.pl:849 ../share/kildclient.pl:1098 #: ../share/kildclient.pl:1131 #, perl-format msgid "%s: Too few arguments." msgstr "%s: Muito poucos argumentos." #: ../share/kildclient.pl:297 ../share/kildclient.pl:315 #: ../share/kildclient.pl:333 ../share/kildclient.pl:351 #: ../share/kildclient.pl:369 #, perl-format msgid "%s: Wrong number of arguments." msgstr "%s: Número errado de argumentos." #: ../share/kildclient.pl:488 msgid "Successfully moved." msgstr "Sucesso ao mover." #: ../share/kildclient.pl:871 #, perl-format msgid "One %1$s deleted" msgid_plural "%2$d %1$s deleted" msgstr[0] "Um %1$s apagado" msgstr[1] "%2$d %1$s apagados" #: ../share/kildclient.pl:913 msgid "Could not open file." msgstr "Não foi possível abrir o arquivo." #: ../share/kildclient.pl:943 msgid "Unknown" msgstr "Desconhecido" #: ../share/kildclient.pl:950 msgid "Invalid plugin file." msgstr "Arquivo de plugin inválido." #: ../share/kildclient.pl:981 msgid "Plugin already loaded. Try enabling it." msgstr "Plugin já carregado. Tente habilitá-lo." #: ../share/kildclient.pl:983 #, perl-format msgid "Version %s of this plugin is already loaded." msgstr "Versão %s desse plugin já está carregada." #: ../share/kildclient.pl:993 #, perl-format msgid "Error in plugin file: %s" msgstr "Erro no arquivo de plugin: %s" #: ../share/kildclient.pl:1005 msgid "Cannot load a plugin in another world." msgstr "Não é possível carregar um plugin em outro mundo." #: ../share/kildclient.pl:1010 ../share/kildclient.pl:1030 msgid "Plugin not specified" msgstr "Plugin não especificado." #: ../share/kildclient.pl:1017 ../share/kildclient.pl:1048 msgid "Plugin not loaded." msgstr "Plugin não carregado." #: ../share/kildclient.pl:1020 #, perl-format msgid "Plugin '%s' loaded." msgstr "Plugin '%s' carregado." #: ../share/kildclient.pl:1036 #, perl-format msgid "Could not load plugin %s" msgstr "Impossível carregar plugin %s" #: ../share/kildclient.pl:1112 msgid "Plugin enabled." msgstr "Plugin habilitado." #: ../share/kildclient.pl:1145 msgid "Plugin disabled." msgstr "Plugin desabilitado." #: ../share/kildclient.pl:1295 msgid "Cannot open help file." msgstr "Não foi possível abrir o arquivo de ajuda." #: ../share/kildclient.pl:1318 msgid "Help topic not found." msgstr "Tópico de ajuda não encontrado." kildclient-3.2.0/kildclient.desktop0000644000175000017500000000106412354344664014310 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) Keywords=connect;play;dungeon;mush; Keywords[eo]=konecti;ludi;dungeon;mush; Keywords[pt_BR]=conectar;jogar;dungeon;mush; kildclient-3.2.0/README0000644000175000017500000000467513217707461011463 00000000000000KildClient 3.2.0 ---------------- 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+ >= 3.22.0 - glib >= 2.32.0 - gvfs - gnutls >= 2.10.0 - gtkspell >= 3.0.0 - 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 also need the JSON Perl modules. 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. KildClient and gtk3-perl ------------------------ If you have the gtk3-perl bindings, you can use plugins that make use of the GTK+ library. It is not necessary to have gtk3-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 git ----------------- If you have a copy of KildClient that comes from the git 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. To prepare the help file, you'll need the XML::LibXML perl module. To prepare the manual, you'll need the xsltproc program and the DocBook 5 XSL stylesheets. Copyright --------- KildClient is Copyright 2004-2017 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-3.2.0/NEWS0000644000175000017500000011114113217677544011275 00000000000000Changes in version 3.2.0 ------------------------ - Bug fixed: triggers and aliases now work with non-ASCII characters (accented letters, other alphabets and writing systems). - Handling of non-ASCII characters (accented letters, other alphabets and writing systems) in Perl works much better now, as strings are properly marked as being in UTF-8. For example, $world->echonl(length("á")) now prints "1" instead of "2". - It is not necessary to specify a command to run a browser, the default browser (as selected by gvfs) is now used. - It is now possible (but not recommended) to select another character to be used to run Perl commands instead of the default '/'. Changes in version 3.1.0 ------------------------ - A list of available languages for spell checking is now displayed instead of having to manually enter the language code. - It's now possible to set a default file name for log files using the Preferences>Edit default world menu. - Added the $world->getinput() and $world->setinput() functions set retrieve and set the current input in the command entry box. - Bug fixed: the list of recent commands is now displayed again when the "down" button next to the input box is clicked. - Bug fixed: OnServerData hooks can now be exported just like other hooks. - Bug fixed: KildClient no longer crashes when an error happens during TLS negotiation. - Some strings that weren't displayed in the local language under Windows are now displayed properly translated. - The deprecated functions getwindowsize(), minimize() and path() have been removed. If your code still uses them, they'll have to be replaced by $window->getsize(), $window->minimize() and $world->path(), respectively. Changes in version 3.0.1 ------------------------ - Bug fixed: scroll to end working again with GTK+ 3.13 and later. Changes in version 3.0.0 ------------------------ - The code responsible for interpreting the lines received from the server and displaying them has been rewritten to take advantage of newer processors by doing things in parallel. That should make the program more responsive, especially when there are many triggers. - KildClient has been upgraded to use GTK+ 3. This should not affect your user experience, but plugins that use gtk2-perl for graphical interface need to be upgraded to use gtk3-perl. In most cases, just replacing s/Gtk2/Gtk3/ should be sufficient. But if the plugin used deprecated functions, bigger changes might be necessary. See the following link for more information on upgrading: https://metacpan.org/release/Gtk3/ - KildClient now supports the GMCP (also called ATCP2) and MSDP protocols for data transfer between the server and client. - KildClient now supports HTTP proxies. - Timers can now have sub-second intervals. The syntax is the same, but you can now use an interval of "0.5" to run the timer twice per second. - New functions have been created to enable/disable triggers, aliases, macros, timers and hooks without printing the "Trigger modified" message (or similar): silentenatrigger/silentdistrigger and similarly for the other objects. - New function $world->cmdseparator() to set and retrieve the command separator. - When opening log files, parent directories are created as necessary automatically. - New function getclientname() returns the name of the client ("KildClient"). - Bug fixed: KildClient no longer crashes when importing triggers or aliases from the World Selector. - Bug fixed: Some telnet commands (used to configure protocols for communication between KildClient and the server) could be ignored if immediately following a new line. Changes 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-3.2.0/config.sub0000755000175000017500000010752413215233062012550 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2017 Free Software Foundation, Inc. timestamp='2017-11-23' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # 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: # https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # 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 or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ kopensolaris*-gnu* | cloudabi*-eabi* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | ba \ | be32 | be64 \ | bfin \ | c4x | c8051 | clipper \ | d10v | d30v | dlx | dsp16xx \ | e2k | epiphany \ | fido | fr30 | frv | ft32 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa32r6 | mipsisa32r6el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64r6 | mipsisa64r6el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 | or1k | or1knd | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pru \ | pyramid \ | riscv32 | riscv64 \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | visium \ | wasm32 \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; leon|leon[3-9]) basic_machine=sparc-$basic_machine ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | ba-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | e2k-* | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ | ip2k-* | iq2000-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa32r6-* | mipsisa32r6el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64r6-* | mipsisa64r6el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | or1k*-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pru-* \ | pyramid-* \ | riscv32-* | riscv64-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | visium-* \ | wasm32-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; asmjs) basic_machine=asmjs-unknown ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2*) basic_machine=m68k-bull os=-sysv3 ;; e500v[12]) basic_machine=powerpc-unknown os=$os"spe" ;; e500v[12]-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` os=$os"spe" ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; leon-*|leon[3-9]-*) basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; moxiebox) basic_machine=moxie-unknown os=-moxiebox ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i686-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; nsx-tandem) basic_machine=nsx-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle) 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) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; wasm32) basic_machine=wasm32-unknown ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; x64) basic_machine=x86_64-pc ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases that might get confused # with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # Now accept the basic system types. # The portable systems comes first. # Each alternative MUST end in a * to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* | -cloudabi* | -sortix* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ | -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* | -glidix* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ | -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* \ | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -pikeos*) # Until real need of OS specific support for # particular features comes up, bare metal # configurations are quite functional. case $basic_machine in arm*) os=-eabi ;; *) os=-elf ;; esac ;; -nacl*) ;; -ios) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; pru-*) os=-elf ;; *-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-functions 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: kildclient-3.2.0/missing0000755000175000017500000001533013157351331012162 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2014 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: kildclient-3.2.0/depcomp0000755000175000017500000005601713157351331012147 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2016-01-11.22; # UTC # Copyright (C) 1999-2017 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: kildclient-3.2.0/COPYING0000644000175000017500000004325411715730227011627 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. 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 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. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. kildclient-3.2.0/aclocal.m40000644000175000017500000021020413217705330012417 00000000000000# generated automatically by aclocal 1.15.1 -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # 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 ]) dnl Checks for special options needed on Mac OS X. dnl Defines INTL_MACOSX_LIBS. dnl dnl Copied from intlmacosx.m4 in gettext, GPL. dnl Copyright (C) 2004-2013 Free Software Foundation, Inc. glib_DEFUN([glib_gt_INTL_MACOSX], [ dnl Check for API introduced in Mac OS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], [gt_cv_func_CFPreferencesCopyAppValue], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFPreferencesCopyAppValue(NULL, NULL)]])], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in Mac OS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_LINK_IFELSE( [AC_LANG_PROGRAM( [[#include ]], [[CFLocaleCopyCurrent();]])], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) # 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= glib_gt_INTL_MACOSX 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 $INTL_MACOSX_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]) ;; *-*-openbsd*) CATOBJEXT=.mo DATADIRNAME=share ;; *) 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 AU_DEFUN([GLIB_GNU_GETTEXT], [AC_REQUIRE([AC_PROG_CC])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 ], [[$0: This macro is deprecated. You should use upstream gettext instead.]]) # 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]) dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- dnl serial 11 (pkg-config-0.29) dnl dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl 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]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. 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 ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR # Copyright (C) 2002-2017 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.15' 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.15.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.15.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-2017 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], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) 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-2017 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+set}" != 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-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2017 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_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 enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]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 ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2017 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-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([acinclude.m4]) kildclient-3.2.0/acinclude.m40000644000175000017500000000132311715730227012754 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-3.2.0/kildclient.spec0000644000175000017500000002220613217705076013567 00000000000000Name: kildclient Version: 3.2.0 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: https://www.kildclient.org Source: https://download.sourceforge.net/%{name}/%{name}-%{version}.tar.gz BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildRequires: glib2-devel >= 2.32.0 BuildRequires: gtk3-devel >= 3.22.0 BuildRequires: gtkspell3-devel BuildRequires: gnutls-devel >= 2.10.0 BuildRequires: perl-devel >= 5.8.3 BuildRequires: perl-ExtUtils-Embed BuildRequires: zlib-devel BuildRequires: gettext >= 0.14.5 BuildRequires: desktop-file-utils Requires: gvfs Requires: perl-JSON %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 and HTTP proxy servers. KildClient supports the GMCP (also called ATCP2) and MSDP protocols for out-of-band communications between server and client. %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 e HTTP. O KildClient suporta os protocols GMCP (também chamado ATCP2) e MSDP para comunicação fora de banda entre cliente e servidor. %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}/man6/kildclient.* %{_datadir}/%{name} %{_datadir}/pixmaps/kildclient.png %{_datadir}/pixmaps/kildclient.xpm %{_datadir}/applications/fedora-kildclient.desktop %changelog * Sun Dec 24 2017 Eduardo M Kalinowski - 3.2.0-1 - gtk+3 >= 3.22.0 is now required. - gvfs is now required. * Sun Dec 04 2016 Eduardo M Kalinowski - 3.1.0-1 - New version: 3.1.0. - Changed homepage and download URLs to use https. - perl-gettext is no longer necessary. * Sun Dec 21 2014 Eduardo M Kalinowski - 3.0.1-1 - New version: 3.0.1. - Require gtk3-devel >= 3.12.0. * Tue Jul 8 2014 Eduardo M Kalinowski - 3.0.0-1 - New version: 3.0.0. - Updated homepage to the new URL. - Added required Perl modules. - glib >= 2.32.0 is now required. - gtk+3 >= 3.10.0 is now required. - gtkspell 3 is now required - gnutls-devel >= 2.10.0 is now required. * 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)